postgresql - 事务——Oracle 与 PostgreSQL

标签 postgresql triggers

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/

相关文章:

sql - 在更新表 A 后触发更新表 A 中的特定列

java - 无法通过 hibernate 执行触发器

sql - 前 10% 的 sum() Postgres

ruby-on-rails - gem 公寓 : One of the following schema(s) is invalid

sql - 在 postgresql 中查找一场比赛的总停留时间

mysql - 使用更新增加列或创建更新触发器 - mysql

oracle - 在 Oracle 中执行触发器以将旧值复制到镜像表

php - 将 php 对象存储到 postgresql 数据库的最佳格式

sql - 在 PostgreSQL 中查找所有范围集的所有交集

mysql - 如果所有子列具有相同的数据,如何使用触发器mysql更新父列