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
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
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 travailler bogue assuré
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
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é
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
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) ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager