Oracle:在同一个触发器中更改并读取:新变量

时间:2014-07-20 12:43:11

标签: sql oracle

出现以下情况:将新行添加到表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;

那怎么能解决这个问题呢?

2 个答案:

答案 0 :(得分:0)

如果您的Oracle比11.1更新,您可以创建复合触发器,请参见此处:Compound Triggers。 您在一个区块中有BEFORE (FOR EACH ROW)AFTER (FOR EACH ROW)

答案 1 :(得分:0)

而不是编写复合触发器,在该差异列上使用更新触发器之前/之后,这样当我们插入表a时它会在插入触发器之前自动调用。然后你说更新特定列然后在table_A上更新之前或之后使用(column_name)然后在表B中插入这些值。