是否可以以这样的方式定义触发器,使得未插入要插入的行而不引发异常?我的用例是我想简化客户端库的异常处理:客户端库只会执行一个语句在表中插入一行,我希望可以使用以下语法或多或少地定义触发器:
CREATE TRIGGER control_tr AFTER INSERT ON tableFoo
FOR EACH ROW
EXECUTE PROCEDURE control_tr_fun();
CREATE OR REPLACE FUNCTION control_tr_fun() RETURNS TRIGGER AS $$
BEGIN
IF (NOT condition_is_met(NEW.a, NEW.b, NEW.c)) THEN
DO NOTHING INSTEAD OF INSERT // syntax I am hoping for instead of RAISE EXCEPTION
ELSE
RETURN NEW;
END IF;
END
$$ LANGUAGE plpgsql;
我很欣赏我可以要求客户端库调用PL / pgSQL函数或触发RAISE
异常并要求客户端库捕获异常(如果引发)并忽略它,但我正在寻找一种方法来尽可能透明地为客户实现这一点。
答案 0 :(得分:2)
如果您RETURN NULL
则不会发生任何事情,INSERT
将无声地失败。但您需要将触发器定义为BEFORE INSERT
,并将不 AFTER INSERT
定义为您的示例。
如果您RAISE EXCEPTION
,则整个交易将失败。
您也可以RAISE NOTICE
在不使交易失败的情况下将其捕获到客户端库中,但前提是它是最后一次生成的通知。你不能堆叠通知。