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

SQL Firebird Discussion :

Empêcher l’exécution d'un trigger


Sujet :

SQL Firebird

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2010
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2010
    Messages : 663
    Points : 197
    Points
    197
    Par défaut Empêcher l’exécution d'un trigger
    Bonjour à tous,

    ma question est toute simple j'ai un trigger "After insert, after update" pour une table et je voudrais avoir la possibilité de bloquer l’exécution du trigger dans quelques cas.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    11 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 11 009
    Points : 28 000
    Points
    28 000
    Billets dans le blog
    27
    Par défaut
    Bonjour,

    on pouvait très bien désactiver un (ou plusieurs triggers) avec Firebird 2.5
    Engine Code : 335545030 << c'est ça le GDSCODE
    Engine Message :
    UPDATE operation is not allowed for system table RDB$TRIGGERS
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE RDB$TRIGGERS T SET T.RDB$TRIGGER_INACTIVE=1 WHERE T.RDB$SYSTEM_FLAG=0  AND T.RDB$TRIGGER_NAME=<nom du trigger>
    -- attention à la casse sinon UPPER(T.RDB$TRIGGER_NAME)=UPPER(T.RDB$TRIGGERNAME) 
    -- tous UPDATE RDB$TRIGGERS T SET T.RDB$TRIGGER_INACTIVE=1 WHERE T.RDB$SYSTEM_FLAG=0

    Opération inverse
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE RDB$TRIGGERS T SET T.RDB$TRIGGER_INACTIVE=0 WHERE T.RDB$SYSTEM_FLAG=0  AND T.RDB$TRIGGER_NAME=<nom du trigger>

    avec Firebird 3 le seul moyen est de passer par
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TRIGGER <nom du trigger> INACTIVE;
    ALTER TRIGGER <nom du trigger> ACTIVE;

    Maintenant, c'est une opération que je qualifierai de dangereuse, un oubli ou une erreur de programme empêchant la réactivation mais surtout un environnement multi-utilisateur déstabiliseront la base de données

    Utilisez une variable de contexte de session que vous testerez dans le trigger sera beaucoup plus fiable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rdb$set_context('USER_TRANSACTION', 'UTILISETRIGGER', '1')
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER ...
    ...
    if (rdb$get_context('USER_TRANSACTION', 'UTILISETRIGGER') = '1') then exit; 
    ...
    END
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2010
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2010
    Messages : 663
    Points : 197
    Points
    197
    Par défaut
    Bonjour,

    le code sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TRIGGER <nom du trigger> INACTIVE;
    ALTER TRIGGER <nom du trigger> ACTIVE;
    marche trés bien, merci beaucoup et je suis sur firebird 2.5!.

    Pour les risques que vous avez signalé, je vous rassure que cette opération ne peut être faite que par l'administrateur et n'influence nullement le travaille des autres utilisateurs. merci encore

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    11 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 11 009
    Points : 28 000
    Points
    28 000
    Billets dans le blog
    27
    Par défaut
    Citation Envoyé par chekkal Voir le message
    Pour les risques que vous avez signalé, je vous rassure que cette opération ne peut être faite que par l'administrateur et n'influence nullement le travaille des autres utilisateurs
    Qu'elle soit faite par l'administrateur ne change rien à moins que celui-ci ne fasse un shutdown de la base pour travailler seul, dans un environnement multi-utilisateur désactiver un trigger est dangereux.
    C'est d'expérience que je vous indique ceci.

    Imaginez que vous utilisiez un trigger qui incrémente une séquence pour une clé primaire. En tant qu'administrateur vous décidez de le désactiver (par exemple au cours d'un import massif) sans toutefois empêcher les autres utilisateurs de travailler bogue assuré
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2010
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2010
    Messages : 663
    Points : 197
    Points
    197
    Par défaut
    bonjour,

    le trigger est pour une table stock, que seul l'administrateur à accée pour mise à jour.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    11 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 11 009
    Points : 28 000
    Points
    28 000
    Billets dans le blog
    27
    Par défaut
    Citation Envoyé par chekkal Voir le message
    le trigger est pour une table stock, que seul l'administrateur à accès pour mise à jour.
    D'un point de vue DBA je pense que ça craint, à moins que ce soit la table qui soit accessible seulement à un rôle administrateur. Un trigger, on n'a pas la possibilité de lui définir des ROLEs (contrairement aux procédures)
    Bref, ça plus des colonnes qui devraient être des colonnes calculées (colonne mon de cette discussion) revoir la structure de votre base est AMHA une priorité
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 4 995
    Points : 14 295
    Points
    14 295
    Billets dans le blog
    1
    Par défaut
    L'intérêt d'un trigger étant de se déclencher systématiquement, on ne l'interrompt que pour des cas très particuliers, par exemple un chargement en masse de données en l'absence de tout traitement concurrent.
    Du coup je m'interroge sur le besoin fonctionnel : pourquoi voulez-vous inhiber son fonctionnement, dans quel(s) cas ? Est-ce un besoin ponctuel (auquel cas pourquoi pas, à voir) ou récurrent (et dans ce cas, il y a certainement un problème de fond) ?

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

Discussions similaires

  1. Comment empécher l'exécution dans un trigger ?
    Par CinePhil dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 26/11/2010, 18h13
  2. Réponses: 10
    Dernier message: 30/01/2007, 10h29
  3. débutant: ne pas exécuter une insertion (trigger) ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/09/2006, 17h35
  4. Problème lors de l'exécution d'un trigger
    Par Madoka dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 30/06/2006, 09h33
  5. Réponses: 13
    Dernier message: 22/06/2006, 10h00

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