INSTEAD OF DELETE触发器(Postgresql)

时间:2013-08-13 16:54:34

标签: sql database function postgresql triggers

我想在表上禁用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;

到目前为止,这似乎不起作用......任何想法?

2 个答案:

答案 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。

缺点:标准低于触发解决方案。