[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-sql-chto-takoe-trigger":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},866,"chto-takoe-trigger",25,"sql","SQL","🗃️","Что такое триггер?","Триггер (trigger) — хранимая процедура особого типа, которая автоматически выполняется сервером БД при определённом событии модификации данных (INSERT, UPDATE, DELETE) в заданной таблице. Пользователь не вызывает триггер явно — он срабатывает как реакция на событие.\n\n### Моменты срабатывания\n\n| Момент | Ключевое слово | Поведение |\n|--------|---------------|-----------|\n| До события | `BEFORE` | Может изменить вставляемые\u002Fобновляемые данные или отменить операцию |\n| После события | `AFTER` | Выполняется после записи изменений, может выполнять сопутствующую логику |\n| Вместо события | `INSTEAD OF` | Заменяет событие (используется для обновляемых представлений) |\n\n### Уровни срабатывания\n\n- `FOR EACH ROW` — триггер вызывается для каждой затронутой строки\n- `FOR EACH STATEMENT` — триггер вызывается один раз для всего оператора (независимо от количества строк)\n\n### Применение\n\n- Обеспечение целостности данных и реализация сложной бизнес-логики\n- Аудит изменений (автоматическая запись в таблицу истории)\n- Каскадные обновления связанных данных\n- Валидация данных, которую нельзя выразить через `CHECK`\n\nВсе изменения, произведённые триггером, выполняются в той же транзакции, что и вызвавшее его событие. При обнаружении ошибки или нарушении целостности данных вся транзакция может быть откачена.\n\n\u003Cdetails>\u003Csummary>Пример триггера для аудита\u003C\u002Fsummary>\n\n```sql\nCREATE OR REPLACE FUNCTION log_salary_changes()\nRETURNS TRIGGER AS $$\nBEGIN\n    INSERT INTO salary_audit (employee_id, old_salary, new_salary, changed_at)\n    VALUES (OLD.id, OLD.salary, NEW.salary, NOW());\n    RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n\nCREATE TRIGGER trg_salary_audit\nAFTER UPDATE OF salary ON employees\nFOR EACH ROW\nWHEN (OLD.salary IS DISTINCT FROM NEW.salary)\nEXECUTE FUNCTION log_salary_changes();\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** объясните, что триггер — это автоматическая реакция на DML-событие, упомяните `BEFORE`\u002F`AFTER` и уровни `ROW`\u002F`STATEMENT`. Частая ошибка — не знать, что триггер выполняется в той же транзакции и может её откатить.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое триггер? — Gymterview","Триггер (trigger) — хранимая процедура особого типа, которая автоматически выполняется сервером БД при определённом событии модификации данных (INSERT, UPDATE, ","Триггер (trigger) — хранимая процедура особого типа, которая автоматически выполняется сервером БД при определённом собы",[7,13],"Триггер (trigger) — хранимая процедура особого типа, которая автоматически выполняется сервером БД при определённом событии модификации данных (INSERT, UPDATE, DELETE) в заданной таблице. Пользователь не вызывает триггер явно — он срабатывает как реакция на событие.",true]