IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

TRIGGER : empêcher exécution simultanée


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 34
    Points : 21
    Points
    21
    Par défaut TRIGGER : empêcher exécution simultanée
    Bonjour


    je voulais savoir comment empecher mon trigger de se lancer une 2e fois si la 1ere execution n'est pas terminée.

    je voudrais donc que le 2eme firing du trigger saute. et que les données devant etre processées lors du 2e firing soient processées au 3e cycle du trigger

  2. #2
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Une solution possible est d'utiliser un variable globale (ou un mutex) comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if MonPackage.MaVariableEstInactive
    then MonPackage.SetVariableActive puis "code actuel" puis MonPackage.SetVariableInactive
    end if

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Vous est en train très probablement de faire une mauvaise utilisation des triggers.
    D’une manière générale vous pouvez sérialiser les traitements via des verrous.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 34
    Points : 21
    Points
    21
    Par défaut
    un programme exterieur vient toutes les 5 minutes inserer des ligne dans ma table

    j'ai un trigger qui se decleche sur le after insert.

    le code du trigger peut prendre plus de 5 minutes a s'executer donc j'ai peur qu'au 2eme insert du programme dans ma table le trigger se relance...

    je préférais qu'il attende.

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Déclencher des traitements lourdes via un trigger ne me semble pas la meilleur idée.
    Questions :
    1. Le lancement du traitement se fait en direct par le trigger ou via dbms_job/dbms_scheduler ?
    2. Le programme extérieur garde la session ouverte pendant le laps de temps indiqué (5 minutes) ou se connecte, insert, se déconnecte etc.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 34
    Points : 21
    Points
    21
    Par défaut
    le trigger se passe sur l'after insert de la table donc pas de scheduler


    et le programme exterieur fait un insert puis se deconnect de suite...

    a l'heure actuelle

    le programme exterieure insert dans une table, et une tache windows lance un fichier batch qui se connect a ma db et qui lance une procedure.

    l'idée est de mettre cette procédure directement dans le trigger

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Il va y avoir un petit soucis. La transaction n'est finie qu'après l'exécution des triggers, meme les after-insert. Ca va donc ralentir le process qui insère une seule ligne.

    Ce sera plus un job, une queue, alert, pipe ou je ne sais quoi.

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Donc l'application externe se connecte exécuté l'insert ce qui déclenche le trigger qui exécute la procédure qui prends plus de 5 minutes et seulement après elle se déconnecte. Sauf le fait d'ouvrir une outre connexion cette application ne sera pas capable d'envoyer une autre requête toute les 5 minutes.

  9. #9
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Bonjour,
    Bonjour,

    Il faut utiliser une queue, qui va elle gère la sérialisation des triggers. cela peut être fait du côté applicatif, ou un job qui une scrute un table de travail. genre à chaque modif j'enregistre ce les données dans un table temporaire, j'enregistre dans une autre ce que je dois faire, et le job scrute à la fin de sa tâche. C'est un peu réinventer la roue mais faisable.

    Olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 34
    Points : 21
    Points
    21
    Par défaut
    Ok merci

    pour vos reponses.

Discussions similaires

  1. Cron et exécutions simultanées
    Par CsJoe dans le forum Administration système
    Réponses: 7
    Dernier message: 03/09/2009, 17h30
  2. Exécution simultanée de deux callback avec pause
    Par laurent.bras dans le forum MATLAB
    Réponses: 11
    Dernier message: 13/10/2008, 14h28
  3. Une seule exécution simultanée
    Par vertical dans le forum Général Python
    Réponses: 6
    Dernier message: 21/05/2006, 14h56
  4. Exécuter simultanément plusieurs fonctions
    Par benj63 dans le forum C++Builder
    Réponses: 5
    Dernier message: 05/10/2005, 16h42
  5. Réponses: 2
    Dernier message: 29/09/2004, 09h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo