Question

J'ai quelques déclencheurs dans une base de données Sybase ASE qui sont déclenchés lors des mises à jour de deux tables: Docs et Trans.

Les déclencheurs sont définis comme indiqué ici:

Pour les documents:

 CREATE TRIGGER dbo.Index_Change_Docs
 ON dbo.docs
 FOR INSERT,UPDATE AS

 IF UPDATE(DOCTYPE) OR UPDATE(BATCH_NO) OR UPDATE(SCANDATE) OR           
 UPDATE(PERIOD_START_DATE) OR UPDATE(PERIOD_END_DATE) 
 OR UPDATE(DISPATCH_ID) OR UPDATE(DISPATCH_NAME) OR UPDATE(CHECKNUM) OR    
 UPDATE(CHECKAMT)
 BEGIN
    INSERT INTO 
    DOCID_SYNC (IS_DOC_ID, CRTN_DT, SYNC_STATUS_CDE) 
    SELECT Inserted.DOCID, GETDATE(), "N" FROM Inserted

 END

Pour les trans:

 CREATE TRIGGER dbo.Index_Change_Trans
 ON dbo.Trans
 FOR INSERT,UPDATE AS

 IF UPDATE(TRANSNUM) OR UPDATE(CONTRACT) OR UPDATE(FRANCHISE) OR UPDATE(SSN) OR      
 UPDATE(STATE_CODE) OR UPDATE(TRANSTYPE)
OR UPDATE(AGENCYNUM) OR UPDATE(LOCKBOXBATCHNUM) OR UPDATE(PRODUCTCODE) 
 BEGIN

    INSERT INTO 
    DOCID_SYNC (IS_DOC_ID, CRTN_DT, SYNC_STATUS_CDE)
    SELECT DOCID, GETDATE(), "N" FROM DOCS
    WHERE Transnum = (SELECT Inserted.TransNum from Inserted)
 END

Il semble que le comportement de ces déclencheurs soit différent, selon la façon dont les mises à jour de ces tables sont effectuées.

Dans un cas, ces tables sont mises à jour via deux procédures stockées (Insert_Docs_SP et Insert_Trans_SP). Lorsque cela se produit, chaque déclencheur est déclenché une fois (une fois pour Docs, un pour Trans) et tout fonctionne comme prévu.

Dans un autre cas, ces tables sont mises à jour dans une transaction Sybase avec deux mises à jour de base de données. Ici, la première mise à jour est effectuée via SQL en ligne dans l'application appelante (qui déclenche le déclencheur Trans.) La deuxième mise à jour est effectuée via une procédure stockée - Insert_Docs_SP, la même que dans l'autre cas - qui ne déclenche pas de déclencheur.

Était-ce utile?

La solution 2

J'ai trouvé la réponse - c'est dans l'ordre d'exécution.Je pensais que l'un des déclencheurs n'était pas déclenché - dans ce cas, le déclencheur Index_Change_Trans - mais en fait, il l'était.Cependant, je n'ai pas vu les résultats, car ce déclencheur repose sur des entrées dans la table Docs.

INSERT INTO 
DOCID_SYNC (IS_DOC_ID, CRTN_DT, SYNC_STATUS_CDE)
SELECT DOCID, GETDATE(), "N" FROM DOCS
WHERE Transnum = (SELECT Inserted.TransNum from Inserted)

Ainsi, dans les cas où la table Trans a été mise à jour avant la table Docs, l'exécution du déclencheur Trans n'afficherait pas de mise à jour dans la table Docid_Sync - car à ce stade, il n'y avait aucune entrée dans la table Docs avec le Transnum appropriévaleur.Dans ces cas, la table Docid_Sync n'a qu'une seule entrée, le résultat du déclencheur Docs.

Dans d'autres cas, la table Docs est mise à jour en premier, puis la table Trans.Dans ces cas, la table Docid_Sync a deux entrées: une suite au déclencheur Docs et une autre suite au déclencheur Trans.

Autres conseils

Dans vos deux déclencheurs, le déclencheur ne s'insère dans la table docid_sync que si certaines colonnes sont mises à jour.Êtes-vous sûr que la procédure stockée met à jour l'une des colonnes du déclencheur?Les déclencheurs ne sont pas non plus appelés s'il s'agit d'une mise à jour récursive à partir d'un appel de déclencheur, mais cela ne semble pas être le cas ici.

L'autre possibilité est si la transaction appelante a désactivé le déclencheur avec la commande set triggers off.Je commencerais par m'assurer que la procédure stockée met à jour l'une des colonnes des vérifications de déclenchement.

Une autre question: la même ligne est-elle mise à jour deux fois, dans la procédure SQL et stockée en ligne dans votre cas d'erreur, ou met-elle à jour deux lignes différentes?

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