触发以静默方式抢占表中的插入

时间:2014-11-27 16:07:01

标签: postgresql plpgsql postgresql-9.1

是否可以以这样的方式定义触发器,使得未插入要插入的行而不引发异常?我的用例是我想简化客户端库的异常处理:客户端库只会执行一个语句在表中插入一行,我希望可以使用以下语法或多或少地定义触发器:

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异常并要求客户端库捕获异常(如果引发)并忽略它,但我正在寻找一种方法来尽可能透明地为客户实现这一点。

1 个答案:

答案 0 :(得分:2)

如果您RETURN NULL则不会发生任何事情,INSERT将无声地失败。但您需要将触发器定义为BEFORE INSERT,并将 AFTER INSERT定义为您的示例。

如果您RAISE EXCEPTION,则整个交易将失败。

您也可以RAISE NOTICE在不使交易失败的情况下将其捕获到客户端库中,但前提是它是最后一次生成的通知。你不能堆叠通知。