2010-07-23 3 views
3

Existe-t-il un moyen de le faire? J'ai trouvé ajouter,Retarder l'invocation du déclencheur après l'insertion d'un oracle

DBMS_LOCK.sleep() 

au début du code de déclenchement par googler, mais il bloque l'insert lui-même de se produire. Je voudrais insérer les données mais le déclencheur devrait être déclenché seulement après un délai arbitraire. Merci.

Répondre

7

Il serait utile que nous savions pourquoi vous voulez que ce retard, et ce que le déclencheur est censé faire après le retard. Cependant, une possibilité consiste à utiliser le package DBMS_JOB dans le déclencheur pour créer un travail qui s'exécute un peu après l'insertion. Par exemple:

create trigger trg 
after insert on tab 
for each row 
declare 
    jl_ob number; 
begin 
    dbms_job.submit 
    (job => l_job 
    , what => 'myproc(:new.id);' 
    , next_date => sysdate+1/24/60 -- One minute later 
    ); 
end; 

Sinon, le déclencheur pourrait insérer une ligne dans une table spéciale, et un DBMS_JOB qui fonctionne sur un calendrier par exemple toutes les 10 minutes peuvent traiter les lignes de la table qui ont plus de X minutes.

+0

en 10g et plus, vous utiliseriez DBMS_SCHEDULER. De plus, les invocations de DBMS_JOB/DBMS_SCHEDULER sont contrôlées par des transactions, de sorte que le travail ne sera pas planifié avant la fin de la transaction, ce qui n'est pas la même chose qu'une fois la ligne insérée. –

+0

Certes, je dois apprendre à dire DBMS_SCHEDULER à l'avenir! En ce qui concerne le contrôle des transactions, il est possible d'utiliser une transaction IFF autonome, peu importe que le travail s'exécute même si l'instruction de déclenchement est annulée. Je dirais que ça doit être l'un ou l'autre. –

+3

En fait, lors de la recherche avec DBMS_SCHEDULER, j'ai trouvé qu'il effectuait une validation implicite, ce qui signifie qu'il ne peut pas être utilisé dans une situation où vous voudriez qu'il fasse quelque chose qui est potentiellement annulé. Comme pour DBMS_JOB étant obsolète (ce qui est) Tom Kyte a dit cette année "Je ne peux rien dire d'autre que je serais très surpris de voir [DBMS_JOB] partir et je vais déposer un bug immédiatement quand et si jamais je reçois un bêta qui ne l'a pas ... "(http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:25405608521707). Je vais donc laisser ma réponse telle quelle. –

Questions connexes