[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-chto-takoe-triggery-v-postgresql":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},1051,"chto-takoe-triggery-v-postgresql",28,"postgresql","PostgreSQL","🐘","Что такое триггеры в PostgreSQL?","Триггер (trigger) — именованный объект базы данных, который автоматически выполняет функцию при наступлении определённого события (INSERT, UPDATE, DELETE, TRUNCATE) на таблице. Триггеры позволяют реализовать бизнес-логику на уровне БД.\n\n### Виды триггеров\n\n- `BEFORE` — выполняется до операции (может изменить данные или отменить операцию)\n- `AFTER` — выполняется после операции (данные уже изменены)\n- `INSTEAD OF` — заменяет операцию (только для представлений)\n- `FOR EACH ROW` — для каждой строки\n- `FOR EACH STATEMENT` — один раз на весь оператор\n\n### Пример: автообновление timestamp\n\n```sql\nCREATE OR REPLACE FUNCTION update_modified_timestamp()\nRETURNS TRIGGER AS $$\nBEGIN\n    NEW.updated_at = now();\n    RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n\nCREATE TRIGGER trg_accounts_updated\n    BEFORE UPDATE ON accounts\n    FOR EACH ROW\n    EXECUTE FUNCTION update_modified_timestamp();\n```\n\n\u003Cdetails>\u003Csummary>Пример: аудит изменений\u003C\u002Fsummary>\n\n```sql\nCREATE TABLE audit_log (\n    id bigserial PRIMARY KEY,\n    table_name text NOT NULL,\n    operation text NOT NULL,\n    old_data jsonb,\n    new_data jsonb,\n    changed_by text DEFAULT current_user,\n    changed_at timestamptz DEFAULT now()\n);\n\nCREATE OR REPLACE FUNCTION audit_trigger_func()\nRETURNS TRIGGER AS $$\nBEGIN\n    IF TG_OP = 'DELETE' THEN\n        INSERT INTO audit_log (table_name, operation, old_data)\n        VALUES (TG_TABLE_NAME, 'DELETE', to_jsonb(OLD));\n        RETURN OLD;\n    ELSIF TG_OP = 'UPDATE' THEN\n        INSERT INTO audit_log (table_name, operation, old_data, new_data)\n        VALUES (TG_TABLE_NAME, 'UPDATE', to_jsonb(OLD), to_jsonb(NEW));\n        RETURN NEW;\n    ELSIF TG_OP = 'INSERT' THEN\n        INSERT INTO audit_log (table_name, operation, new_data)\n        VALUES (TG_TABLE_NAME, 'INSERT', to_jsonb(NEW));\n        RETURN NEW;\n    END IF;\nEND;\n$$ LANGUAGE plpgsql;\n\nCREATE TRIGGER trg_accounts_audit\n    AFTER INSERT OR UPDATE OR DELETE ON accounts\n    FOR EACH ROW\n    EXECUTE FUNCTION audit_trigger_func();\n```\n\n\u003C\u002Fdetails>\n\n### Специальные переменные в триггерных функциях\n\n- `NEW` — новая строка (INSERT, UPDATE)\n- `OLD` — старая строка (UPDATE, DELETE)\n- `TG_OP` — тип операции ('INSERT', 'UPDATE', 'DELETE', 'TRUNCATE')\n- `TG_TABLE_NAME` — имя таблицы\n- `TG_WHEN` — 'BEFORE' или 'AFTER'\n\n### Условный триггер (PostgreSQL 9.0+)\n\n```sql\nCREATE TRIGGER trg_large_transactions\n    AFTER INSERT ON transactions\n    FOR EACH ROW\n    WHEN (NEW.amount > 1000000)\n    EXECUTE FUNCTION notify_compliance_department();\n```\n\n> **На собеседовании:** важно разделить BEFORE и AFTER: BEFORE может модифицировать NEW и даже отменить операцию (RETURN NULL), AFTER — нет. Условный триггер (WHEN) — продвинутый ответ, показывающий, что вы не используете IF внутри триггерной функции для простых условий.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое триггеры в PostgreSQL? — Gymterview","Триггер (trigger) — именованный объект базы данных, который автоматически выполняет функцию при наступлении определённого события (INSERT, UPDATE, DELETE, TRUNC","Триггер (trigger) — именованный объект базы данных, который автоматически выполняет функцию при наступлении определённог",[7,13],"Триггер (trigger) — именованный объект базы данных, который автоматически выполняет функцию при наступлении определённого события (INSERT, UPDATE, DELETE, TRUNCATE) на таблице. Триггеры позволяют реализовать бизнес-логику на уровне БД.",true]