2010-09-06 7 views
2

Peu de questions en vrac se lier et de déclenchement (Oracle 10g)transfert groupé et déclencher

1) rameront niveau de déclenchement exécuter en cas de volume contraignant?
2) Si oui alors, y a-t-il une option pour réduire l'exécution seulement pour la liaison en masse?
3) Si non, existe-t-il un moyen d'exécuter le déclencheur de niveau ligne dans la liaison groupée?
4) Les performances seront-elles gênées dans le cas où le déclencheur de niveau de ligne s'exécute pour une liaison groupée?

Répondre

3

Les déclencheurs sont toujours activés et déclenchés lorsque des insertions de liaison groupée sont effectuées. Il n'y a rien intinsic vous pouvez faire pour arrêter cela, mais bien sûr, vous pouvez mettre votre propre logique dans le déclenchement et le code qui ne l'insertion en bloc comme la façon suivante ...

Dans une spécification de package:

create or replace package my_packags is 

    in_bulk_mode boolean default false; 

    ... -- rest of package spec 
end; 

Dans la gâchette:

begin 
    if NOT my_package.in_bulk_mode then 
     -- do the trigger stuff 
    end if; 
end; 

Dans le code d'appel:

my_package.in_bulk_mode := true; 
-- do the bulk insert 
my_package.in_bulk_mode := false; 
+0

Je veux dire la liaison en masse. –

+0

J'ai mis à jour ma réponse en conséquence. –

1

Les déclencheurs s'exécutent dans le moteur SQL. La liaison en masse affecte la manière dont la langue d'appel (pl/sql ou tout langage OCI) appelle le moteur SQL, en réduisant le nombre d'appels/d'instructions, mais ne doit pas ignorer les déclencheurs. Imaginez que vous utilisiez un déclencheur pour ajouter une validation, une journalisation ou toute autre contrainte à une base de données, mais qu'une application tierce la contournait simplement en utilisant une opération en bloc - ce serait une recette pour les problèmes de corruption et de sécurité).

Votre déclencheur de niveau d'instruction devrait tirer une fois.

Vous pouvez 'désactiver' votre déclencheur en le faisant vérifier une variable de session en mémoire avant de faire quoi que ce soit d'autre, et en le définissant explicitement avant une opération en bloc.

Les déclencheurs au niveau de la ligne continueraient à fonctionner par ligne, ce qui pourrait avoir beaucoup plus d'impact.

+0

Je ne connais qu'une seule façon d'éviter les déclencheurs activés au niveau des lignes ou des instructions; en utilisant SQL * Loader en mode direct-path. –