Приходилось ли реализовывать триггеры в базах данных?

«Приходилось ли реализовывать триггеры в базах данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Триггеры — это хранимые процедуры, автоматически выполняемые при наступлении событий (INSERT, UPDATE, DELETE) в таблице.

Основные сценарии использования:

  1. Аудит и логирование: Запись изменений в отдельную таблицу.
  2. Валидация данных: Проверка сложных бизнес-правил перед операцией.
  3. Поддержание целостности: Каскадные изменения в связанных таблицах.

Пример триггера в PostgreSQL для аудита:

CREATE TABLE audit_log (
    id SERIAL PRIMARY KEY,
    table_name VARCHAR(100),
    operation VARCHAR(10),
    old_data JSONB,
    new_data JSONB,
    changed_at TIMESTAMP DEFAULT NOW()
);

CREATE OR REPLACE FUNCTION log_user_changes()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO audit_log (table_name, operation, old_data, new_data)
    VALUES ('users', TG_OP, to_jsonb(OLD), to_jsonb(NEW));
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER users_audit_trigger
AFTER INSERT OR UPDATE OR DELETE ON users
FOR EACH ROW EXECUTE FUNCTION log_user_changes();

Лучшие практики:

  • Избегайте сложной логики: Триггеры должны быть простыми, иначе они замедляют операции.
  • Учитывайте рекурсию: Триггеры могут вызывать сами себя.
  • Тестирование: Тщательно тестируйте, так как ошибки в триггерах влияют на все связанные операции.

Альтернативы: Часть логики можно перенести в прикладной код для упрощения отладки и миграций.