我有一个具有以下场景(简化)的 Oracle 数据库:
Projects Params
------------- -----------
PROJ_ID SCODE PARAM_ID PARAM_TYPE PROJ_ID PARAM_VALUE
1000 123 5000 4614 1000 '00'
1001 124 5001 4610 1000 'Micro'
1002 123 5002 4614 1001 '02'
5003 4614 1002 '01'
这意味着,3 个项目 - 项目 1000 有 2 个不同的参数,第二个和第三个项目各有一个参数。
现在我需要在项目表上编写一个触发器,它会自动在参数表中插入一个新行,其中参数的最高值为 +1,类型为“4614”,具有给定的 SCODE。
INSERT INTO Projects VALUES (1003,123)
...应该触发事件
INSERT INTO Parameters VALUES (5004,4614,1003,'02')
现在我有两种可能性,但都不起作用:
如果触发器声明为“BEFORE”,我无法在参数表中插入,因为外键约束向我显示一个错误,即 Project 1003 尚未创建。不可能在触发器内执行 Commit。
如果触发器被声明为“AFTER”,我得到一个错误
ORA-04091: table name is mutating, trigger/function may not see it
因为我正在访问现在触发的表。
这个问题必须有任何解决方案。任何帮助表示赞赏!
//编辑
我的触发器:
CREATE OR REPLACE TRIGGER PROJ_ARI_TRIGGER
AFTER INSERT
ON PROJECTS
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
v_param VARCHAR2(10);
BEGIN
v_param := get_next_param_val(:new.SCODE);
INSERT INTO Parameters(<<sequence>>,4614,:new.PROJ_ID,v_param);
END PROJ_ARI_TRIGGER;
函数 get_next_param_val 只是选择项目表并返回正确的参数值。