Question

Dans DB2 pour le système IBM I Je crée ce déclencheur pour l'enregistrement sur MYLOGTABLE Chaque opération d'insertion faite sur MYCHECKEDTABLE:

SET SCHEMA MYSCHEMA;

CREATE TRIGGER MYTRIGGER AFTER INSERT ON MYCHECKEDTABLE
REFERENCING NEW AS ROWREF
FOR EACH ROW BEGIN ATOMIC
     INSERT INTO MYLOGTABLE -- after creation becomes MYSCHEMA.MYLOGTABLE
         (MMACOD, OPTYPE, OPDATE)
     VALUES (ROWREF.ID, 'I', CURRENT TIMESTAMP);
END;

Le SGBD stocke le corps de déclenchement avec MYSCHEMA.MYLOGTABLE codé en dur.

Imaginez maintenant que nous copiez l'intégralité du schéma comme un nouveau schéma NEWSCHEMA. Quand j'insère un disque dans NEWSCHEMA.MYCHECKEDTABLE Un enregistrement de journal sera ajouté à MYSCHEMA.MYLOGTABLE à la place de NEWSCHEMA.MYLOGTABLE, c'est-à-dire dans le schéma où vivent le déclencheur et sa table. C'est une cause de gros problèmes !! Aussi parce que de nombreux utilisateurs peuvent copier le schéma sans mon contrôle ...

Alors, Existe-t-il un moyen de spécifier, dans le corps de déclenchement, le schéma où vit le déclencheur? De cette façon, nous rédigerons l'enregistrement du journal dans le bon MYLOGTABLE. Quelque chose comme PARENT SCHEMA... ou y a-t-il un solution de contournement? Merci beaucoup!

Était-ce utile?

La solution 2

Malheureusement, j'ai réalisé que le schéma où vit un déclencheur ne peut pas être détecté du corps de Trigger de l'intérieur.

Mais il y a des solutions de contournement (grâce à @krmilligan aussi):

  • Enlever l'autorité de l'utilisateur pour exécuter CPYLIB et leur faire utiliser un utilitaire.
  • Créez un agent d'arrière-plan sur le système qui s'exécute péridiocalement à la recherche de déclencheurs qui ne sont pas synchronisés.
  • Pour le commandement CPYLIB Définissez la valeur par défaut pour TRG option pour *NO. De cette façon, les déclencheurs ne seront jamais copiés, sauf si l'utilisateur le spécifie explicitement.

Je choisis le dernier car c'est le plus simple, même s'il peut y avoir des contextes où la copie de déclenchement est requise. Dans de tels cas, je prendrais la première solution de contournement.

Autres conseils

Les déclencheurs externes définis dans un HLL ont accès à un tampon de déclenchement qui inclut le nom de la bibliothèque de la table qui a tiré le déclencheur. Cela pourrait être utilisé pour qualifier la référence au MYLOGTABLE.

Voir le chapitre 11.2 «Structure du programme de déclenchement» de l'IBM RedBook Procédures stockées, déclencheurs et fonctions définies par l'utilisateur sur la base de données universelle DB2 pour iSeries pour plus d'informations.

Vous pouvez également utiliser le CURRENT SCHEMA Registre spécial ou le GET DESCRIPTOR Déclaration pour savoir où se trouvent actuellement le déclencheur et / ou la table.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top