2010-07-17 4 views
0

J'essaie de créer un déclencheur qui va faire ce qui suit.CREATE Trigger aide Oracle

Après insertion dans le tableau A, requête Tableau B basée sur un identifiant (TableA.id = TableB.id) et insérer les informations correspondantes dans TableA

J'ai un sentiment que je suis loin si loin, si aucune aide serait apprécié

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; 

Répondre

2

Cela ne fonctionnera pas. Pense juste à ce que tu demandes. Vous voulez qu'un déclencheur se déclenche lorsqu'une ligne est insérée dans tableA à insérez une ligne dans la table A. Quand la détente cesserait-elle de tirer?

Oracle est assez intelligent pour intervenir et empêcher le déclenchement en spirale dans l'infini:

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> 

Voici ce qui se passe:

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> 

« Est-il possible que je peux mise à jour TableA basé sur l'information de TableB donné un identifiant qui figure dans les deux tables? "

Si par « mise à jour » vous réellement dire UPDATE et - crucialement - en fonction de la logique précise que vous souhaitez mettre en œuvre alors peut-être oui:

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> 

Cependant, cela reste une mauvaise idée. Les déclencheurs sont difficiles à comprendre et peuvent avoir un effet délétère sur la performance de notre SQL. Donc, je vous suggère de trouver un moyen de construire votre logique dans le corps principal de votre application, plutôt que d'essayer d'utiliser un déclencheur.

+0

OK, c'est logique. Est-il possible que je puisse mettre à jour TableA basé sur info de TableB donné un id qui est dans les deux tables? – relyt