Какой у вас опыт написания SQL-триггеров?

«Какой у вас опыт написания SQL-триггеров?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Практический пример: триггер для аудита изменений зарплаты.

CREATE TRIGGER audit_salary_change
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
    IF NEW.salary != OLD.salary THEN
        INSERT INTO salary_audit_log (
            employee_id,
            old_salary,
            new_salary,
            changed_at,
            changed_by
        )
        VALUES (
            OLD.id,
            OLD.salary,
            NEW.salary,
            NOW(),
            CURRENT_USER()
        );
    END IF;
END;

Ключевые аспекты и best practices:

  1. Типы триггеров: BEFORE (для валидации/модификации данных) и AFTER (для логирования/последующих действий).
  2. Область срабатывания: FOR EACH ROW (построчно) или FOR EACH STATEMENT (на операцию).
  3. Важные нюансы:
    • Избегайте сложной бизнес-логики и рекурсивных вызовов внутри триггеров.
    • Триггеры могут негативно влиять на производительность и прозрачность данных.
    • Всегда документируйте существующие триггеры, так как их логика неочевидна при чтении запросов.