【问题标题】:Oracle 12c AFTER INSERT OR UPDATE TRIGGER插入或更新触发器后的 Oracle 12c
【发布时间】:2019-07-28 02:21:44
【问题描述】:

我有一个跟随触发器,它会更新但会自动回滚,我找不到原因,请帮忙。

仅供参考:更新表 UDF_DATA 具有对 CCEX.CUSTOMER 触发表的外键引用。

CREATE OR REPLACE TRIGGER TR_CUSTOMER_PM
AFTER INSERT OR UPDATE ON CCEX.CUSTOMER FOR EACH ROW
DECLARE
  i_subscriber_id     Number :=3080;
  user_xcep EXCEPTION;
  PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
  pragma autonomous_transaction;
  i_syscode ccex.customer.cust_system_code%type;
BEGIN
  IF  :new.cust_account_number like 'TID%' THEN

    i_syscode:=  :new.cust_system_code;
    update udf_data set value = 'Term'
    where subscriber_id = i_subscriber_id
    and cust_system_code = i_syscode
    and entity_id = '1488_OTA'
    and udf_id = '3994_OTA'
    and name = 'Primary Manager';
  END IF;
EXCEPTION
  when others then
    raise user_xcep;
END;
/

【问题讨论】:

  • 我觉得是外键导致问题,但是有没有办法更新另一个表
  • 那很好,如果你理解了这个问题,你能回答这个吗?
  • 为什么要通过用未定义的用户异常替换异常来掩盖任何错误?如果我是你,我会完全删除那个异常处理程序。
  • 一个自治事务在调用事务的范围之外运行。这意味着在您的自主事务中,对 Customer 表的更改尚不可见。我假设这导致外键约束失败,因为外键仍然引用旧版本的数据。通常,在触发器中使用自治事务来执行除记录更改值的尝试之外的任何操作都是错误的。不幸的是,我不确定您真正想要解决的根本问题是什么,所以我不确定正确的解决方案是什么。

标签: sql oracle plsql oracle11g database-trigger


【解决方案1】:

由于触发器处于autonomous_transaction 模式,它应该关闭事务。

请在异常行之前添加commit

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2013-07-01
    • 2021-03-08
    • 2015-06-11
    相关资源
    最近更新 更多