Appel d'1 procédure ds clause when du trigger

Résolu/Fermé
fidele - 29 janv. 2008 à 20:22
adilol Messages postés 14 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 13 décembre 2009 - 17 avril 2008 à 22:42
Bonjour,

j'ai développé un trigger sur Oracle (portant sur une table =>RCV_TRANSACTIONS).
Voir plus bas le détail du début de la déclaration du trigger.
Ce dernier est trop permissif et je souhaiterais inclure de nouvelles restrictions dans la clause when
du trigger.
Ces restrictions ne portent pas sur les colonnes de la table en question et doivent être calculées. Ces filtres ne sont ni disponibles directement dans les CUFs de la table.
Actuellement, ce calcul est réalisé dans le corps du trigger. C'est-à-dire que le contrôle est réalisé à posteriori dans le corps du trigger.

Le problème est que ce trigger se déclenche trop souvent et la solution est de filter en intégrant de nouvelles conditions autorisant l'exécution du trigger au même niveau que la condition "NEW.TRANSACTION_TYPE = 'DELIVER' " :

CREATE OR REPLACE TRIGGER XXWM_MADEIN_COO_HIST_AIR_TRG
AFTER INSERT ON RCV_TRANSACTIONS
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
WHEN ( NEW.TRANSACTION_TYPE = 'DELIVER'
AND XXWM_WMS_COMMON.Is_wms_organization( NEW.ORGANIZATION_ID ) = 'Y'
AND XXWM_WMS_COMMON.Is_rcv_item_is_wms( NEW.ORGANIZATION_ID , NEW.SHIPMENT_LINE_ID ) = 'Y'
)

Mon idée était d'appeler des procédures stockées (ou une sous-requête) avec en paramètre certaines valeurs des champs de la table en question.
Or, ceci ne semble pas marcher: j'obtiens l'erreur suivante: ORA-04076:invalid NEW or OLD specification.

Parmi vous, y aurait-il quelqu'un qui aurait réussi à réaliser ce type d'action ?
Sinon, merci beaucoup d'avance de me communiquer vos idées pour résoudre mon problème ...

5 réponses

phil_232 Messages postés 286 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 12 juin 2008 33
29 janv. 2008 à 22:38
à priori je dois dire que pour des raisons de performance il ne faut pas surcharger les triggers. t'as déjà mentionné qu'il est éxécuter assez souvent. n'y aurait il pas une autre solution ? on dit aussi que c'est une mauvaise pratique d'appeler des procedures externes (encore plus lent plus d'autres pbs), dans qq bdd c'est même pas possible. puis tu fais des calculs (à nouveau lent).
je dirais : prends un fauteuille et rélaxes d'abord, puis regardes l'ensemble et demande toi si le trigger est la seule soluce. souvent en peut les éviter.
-1
Merci Phil pour ta réponse.

Une autre solution, alternative, pourrait difficilement être mise en place dans la mesure où ce trigger est un objet existant qu'on veut améliorer et sur lequel repose d'autres fonctionnalités.
Mais pourquoi pas ?
Attention, cette solution, si elle existe, devrait conserver tous les avantages et le comportement du trigger ... à savoir suite à l'insertion d'une nouvelle transaction de type Réception, déclencher systématiquement et immédiatement un enrichissement de certaines informations de cette même transaction.

Quoiqu'il en soit, je ne renonce toujours pas à trouver une solution à mon problème.
D'autant plus que je n'ai toujours pas de réponse à ma question:

Peux-t-on dans la clause when d'un trigger faire appel à une sous-requête sql ou à une procédure stockée ?

Je rappelle l'origine de mon souci:
Restreindre le déclenchement du trigger en fonction d'informations non basées sur la table (objet du trigger) mais fortement corrélées à certains champs de ma table ... d'où mon recours à une fonction stockée.

Merci de m'aider à valider la faisabilité ou l'infaisabilité de la chose ... et à défaut de me proposer une solution alternative.
0
phil_232 Messages postés 286 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 12 juin 2008 33
30 janv. 2008 à 02:29
"Restreindre le déclenchement du trigger en fonction d'informations non basées sur la table (objet du trigger) mais fortement corrélées à certains champs de ma table"
qu'est ce qui t'empeche de lire dans ta table ?

SI Condition = VRAI ALORS BEGIN FAIT END

"la faisabilité ou l'infaisabilité de la chose"
faut pas crier comme ca
-1
????
je n'ai pas réussi justement à écrire cette condition ...
Mais, je t'en prie (je ne demande que ça!!!): montres moi comment écrire une condition basée sur un champ non basé. L'évaluation devra être par exemple de la forme suivante :
f(a)='Y'
avec f: une fonction, une sous-requête
et a: un champ de la table sur lequel porte le trigger ...
0
phil_232 Messages postés 286 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 12 juin 2008 33
30 janv. 2008 à 21:50
IF (SELECT blabla FROM blublu WHERE blibli) = MyValue THEN
BEGIN
    DoSomeStuff
END

je déjà oublié un peu PL/SQL mais en gros 
ça marche comme ça.

ou bien

DECLARE MyVar

MyVar := SELECT ...
-1
adilol Messages postés 14 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 13 décembre 2009 1
17 avril 2008 à 07:09
salut tt le monde,

svp,j ai un probleme urgent,je voulais ecrire un trigger qui fait ca:

- si la date de la commande est moins que 3 jour de la date de livraison,il doit afficher un message d erreur.

voici en bas, en detail ce qu il doit faire le trigger



Pour une commande standard (achat d’un bouquet standard), la cyberboutique
garantit la disponibilité en inventaire des items composant le
bouquet seulement si la commande a été passée au moins 3 jours avant la
date de livraison. Pour les commandes standards effectuées moins de 3
jours avant la date de livraison, c’est le client qui assume le risque. Il est
donc très important d’informer ces clients d’une éventuelle pénurie. L’état
de la commande sera alors « VINV »
-1
phil_232 Messages postés 286 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 12 juin 2008 33
17 avril 2008 à 21:34
d'accord, mais quel est ton pb ???
Hmmmm, tu veux qu'il affiche un message. Ceci est plutôt dangereux : à chaque INSERT / UPDATE / DELETE (selon le type de trigger) tu peux le recevoir. Ça peut être dérangeant si tu fais ça à partir d'un autre endroit, un autre programme, un "bulk insert"...

Comme j'ai déjà mentionnè au-dessus, il vaut mieux éviter les trigger et travailler avec des contraintes, par example. Genre de (si les deux dates se trouvent dans la même table)

Date_de_livraisons <= Date_de_commande

Sois-en sure : cela te sort un message d'erreur, mais le gérer (ce salaud) c'est ton boulot.
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
adilol Messages postés 14 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 13 décembre 2009 1
17 avril 2008 à 22:42
alors comment je ferai et si tu peux m aider la dessus comme m ecrire la requete ou la contrainte.

ou bien le trigger.

moi je veux que si la date de livraison est de moins de 3jrs de la date de commande,il me donne erreur ou bien il insert un etat de VINV
-1