Я получаю это для нормального ограничения [НЕ] ОТЛОЖЕННОЕ {НАЧАЛЬНО НЕМЕДЛЕННО / НАЧАЛЬНО ОТЛОЖЕННОЕ} изменение, когда ограничение проверяется: после каждой операции / после каждого оператора / после каждой транзакции. Также для отложенного триггера мы можем использовать «УСТАНОВИТЬ ОГРАНИЧЕНИЯ».

Но кажется, что «триггер не откладываемого ограничения» срабатывает в конце оператора для каждой строки точно так же, как и обычный «триггер уровня строки после события». Также для такого триггера мы не можем использовать SET CONSTRAINTS, потому что мы объявили его как NOT DEFERRABLE.

Например, в этом коде триггер копирует все, что видно, в таблицу с именем «copy_example».

CREATE TABLE example (
    ex INT);

CREATE TABLE copy_example (
    ex_copy INT);
    
CREATE FUNCTION save_copy()
RETURNS TRIGGER
LANGUAGE plpgsql
AS 
$$
BEGIN
    INSERT INTO copy_example (SELECT * FROM example);
    RETURN NEW;
END;
$$;

CREATE CONSTRAINT TRIGGER execute_copy
AFTER INSERT
ON example
NOT DEFERRABLE 
FOR EACH ROW
EXECUTE FUNCTION save_copy();

INSERT INTO example VALUES (1), (2);
SELECT * FROM copy_example; 

Код выводит таблицу со значениями (1, 2, 1, 2), а не (1, 1, 2), как это делал бы обычный триггер. Так зачем же определять не откладываемый триггер ограничения вместо обычного триггера? Есть ли разница в их поведении?

2
Up2Iso 16 Окт 2020 в 12:18

1 ответ

Лучший ответ

Нет, бессмысленно определять неотложный триггер ограничения.

Документация точно описывает поведение:

Если указан параметр CONSTRAINT, эта команда создает триггер ограничения . Это то же самое, что и обычный триггер, за исключением того, что время срабатывания триггера можно отрегулировать с помощью SET CONSTRAINTS. Триггеры ограничения должны быть триггерами AFTER ROW для простых таблиц (не сторонних таблиц). Они могут быть запущены либо в конце оператора, вызывающего инициирующее событие, либо в конце содержащей транзакции; в последнем случае они считаются отложенными. Незавершенное срабатывание отложенного триггера также может быть принудительно выполнено немедленно с помощью SET CONSTRAINTS. Ожидается, что триггеры ограничения вызовут исключение при нарушении реализуемых ими ограничений.

1
Laurenz Albe 16 Окт 2020 в 09:52