我有一个表a
,带有3个触发器,只要插入,更新或删除了a
中的一行,就会插入,更新或删除b
中的对应行。所有3个触发器都使用相同的触发功能p
。在if语句中加入PostgreSQL触发函数
CREATE OR REPLACE FUNCTION p()
RETURNS TRIGGER
AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
-- INSERT INTO b ...
RETURN NEW;
ELSIF (TG_OP = 'UPDATE') THEN
-- UPDATE b ...
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
-- DELETE FROM b ...
RETURN NEW;
ELSE
RETURN NULL;
END IF;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER i AFTER INSERT ON a FOR EACH ROW EXECUTE PROCEDURE p();
CREATE TRIGGER u AFTER UPDATE ON a FOR EACH ROW EXECUTE PROCEDURE p();
CREATE TRIGGER d AFTER DELETE ON a FOR EACH ROW EXECUTE PROCEDURE p();
a
还具有外键a1
成c
(与主键c1
),并且我想改变p
以这样一种方式,它进入IF
/ELSIF
分支还取决于柱c2
在c
:如果连接的列已更改,请输入INSERT
和UPDATE
分支;如果保持不变,请输入UPDATE
分支。事实上,这样的事情:
IF (TG_OP = 'INSERT') OR ((TG_OP = 'UPDATE') AND (oldC.c2 <> newC.c2)) THEN
-- ...
ELSIF (TG_OP = 'UPDATE') OR (oldC.c2 = newC.c2) THEN
-- ...
ELSIF (TG_OP = 'DELETE') OR ((TG_OP = 'UPDATE') AND (oldC.c2 <> newC.c2)) THEN
-- ...
ELSE
-- ...
END IF;
其中oldC
和newC
会导致加入类似以下(含约语法):
SELECT oldC.* FROM a, c AS oldC WHERE OLD.a1 = c.c1;
SELECT newC.* FROM a, c AS newC WHERE NEW.a1 = c.c1;
因此,需要有效使用哪两种连接外IF
声明,这将允许它参考oldC
和newC
(或类似的东西)。这是可能的,p
的修改版本看起来如何(使用正确的PostgreSQL语法)?
+1它是正确的假设,我将不得不放置/诺特尔触发的'C'支持第一种解释(”取决于c中的列c2:如果连接的列改变了“)? – Drux
@Drux:是的,为了监控'c.c2'中的变化,你需要'c'上的触发器。小心不要创建带有太多触发器的无限循环。有时,使用数据修改CTE的组合查询是一个很好的选择。 [实施例](http://stackoverflow.com/questions/20561254/insert-data-in-3-tables-at-a-time-using-postgres/20561627#20561627) –