【问题标题】:Compication while creating Primary Key like logic in Oracle PLSQL Trigger在 Oracle PL SQL 触发器中创建类似主键的逻辑时的复杂性
【发布时间】:2017-02-11 11:45:53
【问题描述】:

根据要求,我们面临一个独特的情况。我们想在表上创建一些虚拟主键,仅为特定的提交者 ID。注意:提交者 ID 是表中的列之一。

我们决定使用触发器来实现这个目标,但是对于插入它可以正常工作,但是在检查更新时它会给出以下错误: [ORA-04091: 表 XYZ 正在变异,触发器/函数可能看不到它]

了解工作流程的示例:

表结构(Sequence,Submitter_id,Country,Description)

唯一主键:序列

如果 Submitter_id = 'SYSTEM' 那么我们还需要 Country 的虚拟主键。

表 XYZ 上的 BEFORE INSERT OR UPDATE 触发器的当前代码在更新期间出错:

If (:NEW.Submitter_Id = 'SYSTEM') Then
    BEGIN
        SELECT  count(1) INTO counterVariable
         FROM XYZ
         WHERE Country = :NEW.Country
         And Submitter_Id = 'SYSTEM';
    EXCEPTION
        WHEN OTHERS THEN
        raise_application_error(-20005, 'Sample Error');
    END;

    If (counterVariable != 0)
    Then
       raise_application_error(-20005, 'Primary Key Violation error');
    End If;

End If;

提前致谢。

【问题讨论】:

标签: oracle plsql triggers


【解决方案1】:

没有必要用触发器来做。我只想创建一个功能唯一索引。

create unique index xyz_unq on xyz(decode(submitter_id, 'SYSTEM', country));

【讨论】:

  • 感谢您的回复。这是一个好主意,但在实际场景中,有 4 列而不是 1(国家)。
  • 我想它仍然可以通过索引来完成。只需使用 CASE 语句而不是 DECODE。
  • 哦,你说,“而不是国家……”那么就更简单了。使用四个 DECODE 为四列创建功能索引。
  • 它也适用于我的真实场景。在 xyz 上创建唯一索引 xyz_unq(decode(submitter_id, 'SYSTEM', country),decode(submitter_id, 'SYSTEM', B),decode(submitter_id, 'SYSTEM', C));
  • 谢谢它真的很有帮助:)
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 2016-05-08
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多