Appel d'1 procédure ds clause when du trigger
Résolu
fidele
-
adilol Messages postés 14 Date d'inscription Statut Membre Dernière intervention -
adilol Messages postés 14 Date d'inscription Statut Membre Dernière intervention -
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 ...
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 ...
A voir également:
- Appel d'1 procédure ds clause when du trigger
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Appel privé - Guide
- Double appel - Guide
- My sims ds solution ✓ - Forum Jeux vidéo
- Comment reecouter un appel sur iphone - Forum Huawei
5 réponses
à 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.
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.
"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
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
????
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 ...
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 ...
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 ...
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 »
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 »
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.