PostgreSQL 没有在触发器函数中插入保存点的功能,当出现异常时(如异常 NO_DATA_FOUND),整个事务将回滚。但是我不想回滚整个事务,只想回滚到最后保存的点。
是否有任何其他替代方法可以让我在 Postgresql 的触发器函数中拥有多个保存点。
这是我的代码:
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();
最佳答案
PostgreSQL do not have feature to insert Save Points in the trigger functions
实际上,它们只是隐含在 BEGIN ... EXCEPTION
block 中。
您的代码看起来是正确的,但不清楚您要实现的目标还没有实现。
如果你想在触发器中有多个保存点,嵌套 BEGIN ... EXCEPTION
block 。您可以将 RAISE
与自定义 SQLSTATE
一起用于流控制。
如果 PL/PgSQL 也支持显式命名保存点就好了,但根据我的经验,使用异常 block 效果很好。
关于postgresql - 事务——Oracle 与 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26890682/