出现以下情况:将新行添加到表A时会触发插入触发器。 触发器现在需要修改此新行中的值(在表A中)并覆盖最初插入的内容。 同时,触发器还必须从同一行读取表A中的不同值(不同列)以在表B中插入内容。
这可以在一个触发器中工作吗?
如果我使用"触发后#34;,我可以读取要在表B中插入的值,但由于"表突变错误"我无法修改表A.
如果我在触发器"之前使用",我可以成功修改A中的值,但我想要为表B读取的值始终为NULL。
有什么建议吗? 在此先感谢:)
编辑:所以现在我终于在这里得到了代码,我尝试了两个触发器的方法,但我意识到它无法工作><
我到目前为止的代码(对不起德语单词。" benutzerkonto"表示" useraccount",btw):
create or replace trigger TRG_TEST_LOGIN_BENUTZERKTO
before insert on benutzerkonto
referencing new as new old as old
for each row
begin
/* with 1/3 probability, the user is set to be logged in */
if (dbms_random.value(0,3)) <= 1 then
:NEW.LOGGED_IN := 1;
dbms_output.put_line('The TEST_LOGIN_BENUTZERKTO Trigger fired');
end if;
end TRG_TEST_LOGIN_BENUTZERKTO;
/
create or replace trigger TRG_TEST_CREATE_SESSION
after update on benutzerkonto
referencing new as new old as old
for each row
declare
geraet smallint;
begin
dbms_output.put_line('The TRG_TEST_CREATE_SESSION Trigger fired');
/* Choses a random device (gerät) */
geraet := round(dbms_random.value(1001,1103),0);
/* A new session with the new "benutzerkonto" shall be added. */
INSERT INTO SESSION_LOGGING (BENUTZERNAME, GERAET_ID, ZEITSTEMPEL_LOGIN, ZEITSTEMPEL_LOGOUT) VALUES (:NEW.BENUTZERNAME, geraet, sysdate, NULL);
end TRG_TEST_CREATE_SESSION;
/
这应该做的是随机设置新添加的useraccounts以登录(用于测试目的)。这实际上有效,第一个触发器正确触发。
现在我希望当此触发器将LOGGED_IN部分更改为&#34; 1&#34;时,第二个触发器(更新触发器)也会触发,以在SESSION_LOGGING表中创建关联的行。
此触发器永远不会触发,因为说:new.LOGGED_IN = 1;显然不算作桌面上的更新。 但是,我不能使用UPDATE语句,因为甲骨文说我发生变异&#34;变异&#34;表&gt; _&gt;
那怎么能解决这个问题呢?
答案 0 :(得分:0)
如果您的Oracle比11.1更新,您可以创建复合触发器,请参见此处:Compound Triggers。
您在一个区块中有BEFORE (FOR EACH ROW)
和AFTER (FOR EACH ROW)
。
答案 1 :(得分:0)
而不是编写复合触发器,在该差异列上使用更新触发器之前/之后,这样当我们插入表a时它会在插入触发器之前自动调用。然后你说更新特定列然后在table_A上更新之前或之后使用(column_name)然后在表B中插入这些值。