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

Firebird Discussion :

Problème avec les PS et Triggers


Sujet :

Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Par défaut Problème avec les PS et Triggers
    Bonjour tout le monde;
    Je n'ai pas compris ce qui se passe!
    J'ai un trigger MDF_VEHICULE et je veux le désactiver lors de l'exédution d'une procédure stocké P puis je le réactive à la fin.
    Dans le corps de P, j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DECLARE VARIABLE STMT VARCHAR(150);
    BEGIN
    STMT = 'ALTER TRIGGER MDF_VEHICULE INACTIVE'
    EXECUTE STATEMENT :STMT;
    ...
    STMT = 'ALTER TRIGGER MDF_VEHICULE ACTIVE'
    EXECUTE STATEMENT :STMT;
    mais ça ne marche pas, cad que le trigger s'exécute comme si la ligne de désactivation dans P n'existait pas.
    mais si j'exécute la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER TRIGGER MDF_VEHICULE INACTIVE
    il se désactive.
    J'ai essayé de déboguer la procédure stockée dans EMS et je trouve qu'à la ligne : EXECUTE STATEMENT :STMT;
    il déclenche une erreur me disant qu'il est impossible de préparer la query car le statement est vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Can't Prepare , because  query is emptySQL Code: 37
    IB Error Number: 0

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Par défaut
    Je l'ai trouvé après une nuit blanche
    Il suffit de faire suspend après l'exécution du statement; je ne sais pas pourquoi;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE VARIABLE STMT VARCHAR(150); 
    BEGIN 
    STMT = 'ALTER TRIGGER MDF_VEHICULE INACTIVE' ;
    EXECUTE STATEMENT :STMT;
    SUSPEND;

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Par défaut
    En réalité rien n'est résolut;
    Le "suspend" faisait le rôle de "exit" de la procédure stockée sans exécuter les lignes après.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Bonjour , essayez avec COMMIT plutôt que suspend ;

    perso , j'ai toujours utiliser la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Desactiver 
    UPDATE RDB$TRIGGERS T SET RDB$TRIGGER_INACTIVE = 1 WHERE  T.RDB$TRIGGER_NAME=NOM_PROCEDURE
    Reactiver
    UPDATE RDB$TRIGGERS T SET RDB$TRIGGER_INACTIVE = 0 WHERE T.RDB$TRIGGER_NAME=NOM_PROCEDURE
    je ne connaissais/me rappelais pas le ACTIVE/INACTIVE , chouette j'ai (ré-)appris quelque-chose , il faut dire que j'utilise rarement le activer/désactiver et dans ce cas c'est généralement pour tous les triggers non système !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE T.RDB$SYSTEM_FLAG = 0

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonjour,

    Il me semble que la méthode consistant à activer/désactiver des triggers de cette façon devrait être réservée à quelques cas particuliers, car elle ne peut être pratiquée que par le SYSDBA ou le propriétaire de la base. De plus elle n'est pas sans danger en environnement multi-utilisateurs.
    Quand c'est nécessaire, je préfère utiliser un variable d'environnement par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select rdb$set_context('USER_TRANSACTION','INACTIVE_TRIGGER','1') from rdb$database
    pour la positionner, puis
    select rdb$set_context('USER_TRANSACTION','INACTIVE_TRIGGER',null) from rdb$database
    pour la supprimer
    et dans les triggers concernés, tester l'existence de cette variable avant d'exécuter le code.
    L'utilisateur n'a ainsi pas besoin de droits particuliers et lui seul est concerné par cette modification dans l'exécution d'un trigger.

    André

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Par défaut
    Merci Sergio;
    Même ta méthode ne marche pas cad :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE RDB$TRIGGERS SET RDB$TRIGGER_INACTIVE = 1 WHERE  RDB$TRIGGER_NAME='MDF_VEHICULE';
    le trigger fonctionne comme si je n'est rien écris.
    Alors pour le commit à la place de suspend le commit est pour les transaction pas pour les procédures.
    pour André, je n'ai pas compris comment utiliser les variables, où est ce que je précise le nom du trigger à désactiver?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec les trigger delete
    Par mb10 dans le forum Administration
    Réponses: 3
    Dernier message: 25/01/2012, 16h46
  2. problème avec les triggers
    Par aldama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 19/02/2009, 12h04
  3. problème avec les triggers
    Par jakcam dans le forum Administration
    Réponses: 4
    Dernier message: 04/03/2008, 11h37
  4. Problème avec les délimiteurs dans un trigger
    Par Invité dans le forum DB2
    Réponses: 4
    Dernier message: 01/05/2006, 22h53
  5. []Problème avec les formulaires Outlook
    Par Invité dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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