5

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

到目前为止,这似乎不起作用......有什么想法吗?

4

2 回答 2

8

您需要一个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;
于 2013-08-13T17:18:28.373 回答
4

或者...

CREATE RULE delete_rule 
AS ON DELETE TO schema.tbl
DO INSTEAD NOTHING;

优点:更清晰,访问的每一行都不需要调用代码,也不需要 SP。

缺点:不如触发解决方案标准。

于 2013-08-13T17:39:02.140 回答