Составные триггеры в оракуле - PullRequest
1 голос
/ 05 января 2010

У меня есть составной триггер, и в операторе after у меня есть обновление для другой таблицы, которая также имеет составной триггер, как показано в приведенном ниже коде:

create or replace
trigger TRIGGER
for insert or update on TABLE
COMPOUND trigger

after STATEMENT is
begin
  update THEOTHERTABLE set VALUE = VALUE + 1 where COD = 1;
end after STATEMENT;
end;

Обновление просто, чтобы увидеть, работает ли. Я хочу, чтобы он запускал триггер на THEOTHERTABLE, но он срабатывает только в том случае, если триггер не сложный.

Это проблема с составными триггерами Oracle или просто функция, которую я не понимаю?

Ответы [ 3 ]

4 голосов
/ 05 января 2010

Я попытался воссоздать ваш сценарий, и, похоже, он мне подходит. Поэтому я думаю, что вы должны еще раз взглянуть на вашу реализацию. Ищите различия между тем, что вы кодировали, и тем, что следует здесь, и, возможно, именно в этом заключается ответ.

Вот мои триггеры

SQL> create or replace
  2  trigger t1_compound
  3  for insert or update on t1
  4  compound trigger
  5
  6      after statement is
  7      begin
  8          update t2 set t1_id = nvl(t1_id,0) + 1 where cod = 12;
  9      end after statement;
 10  end;
 11  /

Trigger created.

SQL>
SQL> create or replace
  2  trigger t2_compound
  3  for insert or update on t2
  4  compound trigger
  5
  6      after statement is
  7      begin
  8          update t3 set t2_id = nvl(t2_id,0) + 1 where cod = 12;
  9      end after statement;
 10  end;
 11  /

Trigger created.

SQL>

... вот данные испытаний ...

SQL> select id, cod from t1
  2  /

        ID        COD
---------- ----------
         1         12

SQL> select id, cod, t1_id from t2
  2  /

        ID        COD      T1_ID
---------- ---------- ----------
        11         12

SQL> select id, cod, t2_id from t3
  2  /

        ID        COD      T2_ID
---------- ---------- ----------
       111         12

SQL> 

... и вот что происходит, когда я выпускаю обновление для первой таблицы ...

SQL> update t1 set dt = sysdate
  2  where id = 1
  3  /

1 row updated.

SQL> select id, cod, t1_id from t2
  2  /

        ID        COD      T1_ID
---------- ---------- ----------
        11         12          1

SQL> select id, cod, t2_id from t3
  2  /

        ID        COD      T2_ID
---------- ---------- ----------
       111         12          1

SQL>
0 голосов
/ 05 января 2010

Это работает, если вы делаете это после компиляции триггера, но если вы попробуете его снова, даже с другими данными, он не обновит THEOTHERTABLE

0 голосов
/ 05 января 2010

я не думаю, что это должно работать ... было бы лучше, если бы вы создали процедуру для THEOTHERTABLE и вызвали эту процедуру из этого триггера.

...