我想在表上禁用DELETE语句。 我需要做的是设置一个字段值而不是删除相应的记录。
到目前为止,我已尝试过以下内容:
CREATE TRIGGER delete_trg
INSTEAD OF DELETE
ON schema.tbl
FOR EACH ROW
EXECUTE PROCEDURE schema.tbl_delete_fn();
我的schema.tbl_delete_fn()
功能如下:
CREATE OR REPLACE FUNCTION schema.tbl_delete_fn()
RETURNS trigger AS
BEGIN
NEW.deleted := true;
RETURN NEW;
END;
到目前为止,这似乎不起作用......任何想法?
答案 0 :(得分:4)
你想要一个BEFORE DELETE
触发器,其函数返回NULL
而行变量是OLD
,而不是NEW
。
CREATE TRIGGER delete_trg
BEFORE DELETE
ON schema.tbl
FOR EACH ROW
EXECUTE PROCEDURE schema.tbl_delete_fn();
CREATE OR REPLACE FUNCTION schema.tbl_delete_fn()
RETURNS trigger AS '
BEGIN
UPDATE schema.tbl SET deleted=true WHERE ctid=OLD.ctid;
RETURN NULL;
END; ' language plpgsql;
答案 1 :(得分:2)
或者...
CREATE RULE delete_rule
AS ON DELETE TO schema.tbl
DO INSTEAD NOTHING;
优点:更清晰,没有为访问的每一行调用代码,也不需要SP。
缺点:标准低于触发解决方案。