Ведем учет пользователей: от таблицы до аудита
Введение
Хранить пользователей в БД — это не просто привычка, а часть архитектуры. Централизованный учет помогает:
- обеспечить уникальность логинов,
- отследить изменения,
- стандартизировать работу с пользователями для всех приложений и скриптов.
Покажу, как грамотно реализовать это на Oracle SQL с проверкой, обработкой ошибок и аудитом.
Таблица users: структура и ограничения
Структура таблицы
Скрипт создания таблицы
CREATE TABLE users (
USERID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
LOGIN VARCHAR2(100) NOT NULL UNIQUE,
CREATED_AT DATE DEFAULT SYSDATE,
CONSTRAINT login_min_length CHECK (LENGTH(login) >= 3)
);
Функция получения id пользователя
CREATE OR REPLACE FUNCTION f_get_user_id(p_login IN VARCHAR2)
RETURN NUMBER IS
v_user_id NUMBER;
e_user_not_found EXCEPTION;
PRAGMA EXCEPTION_INIT(e_user_not_found, -20001);
BEGIN
-- Проверка на NULL
IF p_login IS NULL THEN
RAISE_APPLICATION_ERROR(-20002, 'Логин не может быть NULL');
END IF;
-- Проверка на минимальную длину
IF LENGTH(p_login) < 3 THEN
RAISE_APPLICATION_ERROR(-20003, 'Логин должен содержать минимум 3 символа');
END IF;
-- Поиск пользователя
BEGIN
SELECT userid INTO v_user_id FROM users WHERE login = p_login;
RETURN v_user_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE e_user_not_found;
WHEN TOO_MANY_ROWS THEN
RAISE_APPLICATION_ERROR(-20004, 'Найдено несколько пользователей с таким логином');
END;
EXCEPTION
WHEN e_user_not_found THEN
RAISE_APPLICATION_ERROR(-20001, 'Пользователь с логином ' || p_login || ' не найден');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000, 'Ошибка при получении ID пользователя: ' || SQLERRM);
END f_get_user_id;
Что делает:
- Проверяет вход: если NULL или пусто — выбрасывает исключение user_login_missing.
- Если логин не найден — ошибка user_not_found.
- Если найдено более одной записи (в теории) — ошибка user_login_not_unique.
Пример вызова функции:
BEGIN
DBMS_OUTPUT.PUT_LINE(f_get_user_id('admin'));
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Ошибка: ' || SQLERRM);
END;
Результат вызова функции f_get_user_id
Файлы и скрипты
Исходные файлы можно найти в (GIT).
Контакты
Написать автору | Telegram | Сайт автора