Предположим, у меня есть следующие таблицы:Trigger вызвано заявлением обновления внутри другого триггера
CREATE TABLE foo (
id_foo int NOT NULL,
import int NOT NULL,
CONSTRAINT foo_pk PRIMARY KEY(id_foo)
);
CREATE TABLE bar (
id_bar int NOT NULL,
id_foo int NOT NULL,
import int NOT NULL,
CONSTRAINT bar_pk PRIMARY KEY(id_bar)
);
ALTER TABLE bar ADD CONSTRAINT fk_bar FOREIGN KEY(id_foo) REFERENCES foo(id_foo);
Таким образом, столбец импорта таблицы Foo должна быть равна сумме столбца импорта в баре таблицы.
CREATE OR REPLACE FUNCTION foo_restriction() RETURNS TRIGGER AS
$$
BEGIN
IF (NEW.import != (SELECT COALESCE(SUM(import),0) FROM bar WHERE id_foo = NEW.id_foo)) THEN
RAISE EXCEPTION 'import column in foo must be equal in bar table.';
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
Но я хочу автоматически суммировать новое значение импорта в баре с ссылкой на foo.
CREATE OR REPLACE FUNCTION bar_insert() RETURNS TRIGGER AS
$$
BEGIN
UPDATE foo SET import = import + NEW.import WHERE id_foo = NEW.id_foo;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER TR_fooRestriction AFTER INSERT OR UPDATE ON foo FOR EACH ROW EXECUTE PROCEDURE foo_restriction();
CREATE TRIGGER TR_barInsert AFTER INSERT ON bar FOR EACH ROW EXECUTE PROCEDURE bar_insert();
Тогда следующее утверждение не должно работать:
INSERT INTO foo(id_foo, import) VALUES(1,25); --FAIL. Works ok.
Следующая инструкция вставить правильный кортеж для обув, при импорте = 0.
INSERT INTO foo(id_foo, import) VALUES(2,0); --OK.
Но, когда я пытаясь добавить новые значения в таблицу летучей мыши, база данных показывает, что «столбец импорта в foo должен быть равен в таблице бар».:
INSERT INTO bar(id_bar, id_foo, import) VALUES
(1,2,100),(2,2,160),(3,2,40);
Что происходит здесь? Оба триггера выполняются после каждой новой строки, поэтому ограничение в таблице foo не должно активироваться в последнем утверждении.
Как это сделать, чтобы исправить это?
Спасибо!
Итак, как я могу это исправить? –
Итак, прочитайте отредактированный ответ. – klin