CREATE Trigger, помогите Oracle - PullRequest
0 голосов
/ 17 июля 2010

Я пытаюсь создать триггер, который будет выполнять следующие действия.

После вставки в таблицу A запросить таблицу B на основе идентификатора (TableA.id = TableB.id) и вставить соответствующую информацию вTableA

У меня такое ощущение, что я далеко, поэтому любая помощь будет оценена

CREATE OR REPLACE TRIGGER myTrig
AFTER INSERT
ON TABLEA
BEGIN
  INSERT INTO TABLEA
  SELECT TABLEB.FIRST_NAME, TABLEB.LAST_NAME, SYSDATE
  FROM TABLEA JOIN TABLEB ON 
  TABLEA.STUDENT_ID=TABLEB.STUDENT_ID
  insert into TABLEA values (....);
END;

1 Ответ

2 голосов
/ 17 июля 2010

Это не будет работать.Просто подумай о том, что ты спрашиваешь.Требуется триггер, который срабатывает при вставке строки в таблицу A, чтобы вставить строку в таблицу A .Когда триггер прекратит срабатывать?

Oracle достаточно умен, чтобы вмешаться и предотвратить спуск курка в бесконечность:

SQL> create or replace trigger t69_after_ins
  2      after insert on t69
  3  begin
  4      insert into t69 values ('blah', 'blah', 99);
  5  end;
  6  /

Trigger created.

SQL>

Вот что происходит:

SQL> insert into t69 values ('this', 'that', 1)      
   2  /

insert into t69 values ('this', 'that', 1)
            *
ERROR at line 1:
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_I


SQL>

"Есть ли способ, которым я могу обновить TableA на основе информации из TableB, учитывая идентификатор, который находится в обеих таблицах?"

Если под словом "update" вы действительно имеете в виду UPDATEи, что очень важно, в зависимости от конкретной логики, которую вы хотите реализовать, тогда, возможно, да:

SQL> create or replace trigger t69_after_ins
  2      after insert on t69
  3  begin
  4      update t69
  5          set name = ( select name from t23
  6                       where t23.id = t69.id )
  7          where name is null;
  8  end;
  9  /

Trigger created.

SQL> insert into t69 (id, name) values (122, null)
  2  /

1 row created.

SQL> select name from t69
  2  where id = 122
  3  /

NAME
----------
MAISIE

SQL>

Однако это остается плохой идеей.Триггеры сложны для понимания и могут оказать негативное влияние на производительность нашего SQL.Поэтому я предлагаю вам попытаться найти способ встроить свою логику в основную часть вашего приложения, а не пытаться использовать триггер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...