【发布时间】:2019-05-14 21:35:28
【问题描述】:
Postgresql 10/11。
如果目标单元格值为null,我需要删除行而不是更新。
所以我创建了这个触发函数:
CREATE OR REPLACE FUNCTION delete_on_update_related_table() RETURNS trigger
AS $$
DECLARE
refColumnName text = TG_ARGV[0];
BEGIN
IF TG_NARGS <> 1 THEN
RAISE EXCEPTION 'Trigger function expects 1 parameters, but got %', TG_NARGS;
END IF;
EXECUTE 'DELETE FROM ' || TG_TABLE_NAME || ' WHERE $1 = ''$2'''
USING refColumnName, OLD.id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
还有一个BEFORE UPDATE 触发器:
CREATE TRIGGER proper_delete
BEFORE UPDATE OF def_id
ON public.definition_products
FOR EACH ROW
WHEN (NEW.def_id IS NULL)
EXECUTE PROCEDURE delete_on_update_related_table('def_id');
表格很简单:
id uuid primary key
def_id uuid not null
测试:
UPDATE definition_products SET
def_id = NULL
WHERE id = 'f47415e8-6b00-4c65-aeb8-cadc15ca5890';
-- rows affected 0
文档说:
在 可以返回 null 之前触发的行级触发器向触发器发出信号 经理跳过该行的其余操作(即, 后续触发器不会被触发,并且 INSERT/UPDATE/DELETE 会触发 此行不会出现)。
以前,我使用RULE 代替触发器。但是没有办法在同一规则中使用WHERE & RETURNING 子句。
您需要一个带有 RETURNING 子句的无条件 ON UPDATE DO INSTEAD 规则
那么,有什么办法吗?
【问题讨论】:
-
查询真的应该是 DELETE FROM definition_products where def_id = OLD.id 你有它吗?不应该是 id = OLD.id 吗?
标签: postgresql triggers plpgsql