在Oracle PLSQL Trigger中创建主键(如逻辑)时进行编译

时间:2017-02-11 11:45:53

标签: oracle plsql triggers

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

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

了解工作流程的示例:

表结构(序列,Submitter_id,国家/地区,描述)

唯一主键:序列

如果Submitter_id ='SYSTEM',那么我们在Country上也需要一些虚拟主键。

表XYZ上的BEFORE INSERT或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;

提前致谢。

1 个答案:

答案 0 :(得分:1)

没有必要使用触发器。我只想创建一个功能独特的索引。

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