PostgreSQL没有在触发器函数中插入保存点的功能,当有异常时(如异常NO_DATA_FOUND),整个事务将被回滚。但是,我只是想回滚到最后保存的点,而不是回滚整个事务。
还有其他替代方法,我可以在Postgresql的触发器函数中有多个Save点。
这是我的代码:
CREATE OR REPLACE FUNCTION func_ex() RETURNS trigger AS $func_ex$
DECLARE
var_name name;
BEGIN
INSERT INTO log_table (empid, empname) values (100, 'Name');
-- savepoint my_savepoint; "cannot have savepoints in triggers
Select empname INTO strict var_name from emp_table1 WHERE empid = 3232332;
EXCEPTION WHEN NO_DATA_FOUND THEN
RAISE Notice 'No data found';
RETURN NEW;
END;
return new
$func_ex$ LANGUAGE plpgsql;
-- End of Function
-- Creation of Trigger
CREATE TRIGGER insert_trigger1 AFTER update of empname
ON emp_table1 EXECUTE PROCEDURE func_ex();
答案 0 :(得分:1)
PostgreSQL没有在触发函数中插入保存点的功能
实际上,确实如此,它们只隐含在BEGIN ... EXCEPTION
块中。
您的代码看起来是正确的,并且不清楚您尝试实现的目标尚不清楚。
如果您想在触发器中使用多个保存点,请嵌套BEGIN ... EXCEPTION
块。您可以将RAISE
与自定义SQLSTATE
一起用于流量控制。
如果PL / PgSQL也支持显式命名保存点,那就太好了,但是根据我的经验,使用异常块效果很好。
答案 1 :(得分:0)
通过嵌套Begin .. Exception Blocks我可以在触发器函数中有多个保存点。