哪个先执行?触发还是规则?

use*_*788 6 postgresql trigger database-design

使用 PostgreSQL。

有一个触发器,它在删除后做一些事情,并制定了一个规则,如果某些事情是真的,则停止删除。

我的问题是:该规则是否也会阻止触发器的发生?

触发器定义:

CREATE TRIGGER wypo AFTER INSERT ON "Wyp" FOR EACH ROW EXECUTE PROCEDURE funk_wyp();
Run Code Online (Sandbox Code Playgroud)

触发功能

CREATE OR REPLACE FUNCTION funk_wyp() RETURNS TRIGGER AS '
DECLARE
  dodatek real := (SELECT f.cena FROM filmy f WHERE f.ID = NEW.co);
BEGIN
    UPDATE "zyskiklient" 
       SET "ile" = ile + dodatek 
    WHERE kto = NEW.kto; 
    UPDATE "istotnoscklienta" 
       SET "poziom" = (SELECT poziom(NEW."kto")) 
    WHERE "kto" = NEW.kto;
RETURN NEW;
END; 
' LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

规则:

CREATE OR REPLACE RULE zasada_delete_konto 
  AS ON DELETE TO "konto" 
WHERE konto_zwrocone(OLD."ID") = FALSE 
DO INSTEAD NOTHING;
Run Code Online (Sandbox Code Playgroud)

Chr*_*ton 9

您可以将规则视为转换正在执行的命令,而触发器正在更改数据本身。(请注意,这是一个简化!花一些时间阅读文档CREATE TRIGGERCREATE RULE而不是相信一些随机的互联网人。)

因此,您可以定义当 PostgreSQL 看到某个命令时调用的规则,并将该命令转换为不会调用触发器的内容。

以这样定义的规则为例:

CREATE OR REPLACE RULE dont_insert AS
ON INSERT TO xyz.items
DO INSTEAD NOTHING;
Run Code Online (Sandbox Code Playgroud)

一个触发器定义如下:

CREATE TRIGGER insert_with_func BEFORE INSERT
ON xyz.items FOR EACH ROW
EXECUTE PROCEDURE xyz.row_update_func();
Run Code Online (Sandbox Code Playgroud)

尝试执行插入不会调用row_update_func(),即使触发器定义为BEFORE INSERT,因为规则正在修改命令本身;重新评估命令后,它不再执行任何操作,并且触发器不再适用。

显然,您的规则不需要用定义INSTEAD OF,在这种情况下,您的规则和触发器都可以适用。

具体到你的代码,很难说不知道 的定义konto_zwrocone,但它看起来不像,因为你的触发器和规则是为不同表上的不同操作定义的。