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.
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.
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
Bonjour,
le code sqlmarche trés bien, merci beaucoup et je suis sur firebird 2.5!.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ALTER TRIGGER <nom du trigger> INACTIVE; ALTER TRIGGER <nom du trigger> ACTIVE;
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![]()
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 travaillerbogue assuré
bonjour,
le trigger est pour une table stock, que seul l'administrateur à accée 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é
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) ?
Partager