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)
您可以将规则视为转换正在执行的命令,而触发器正在更改数据本身。(请注意,这是一个简化!花一些时间阅读文档CREATE TRIGGER
,CREATE 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
,但它看起来不像,因为你的触发器和规则是为不同表上的不同操作定义的。
归档时间: |
|
查看次数: |
613 次 |
最近记录: |