2011-06-16 87 views
0

我在Sybase ASE數據庫中有兩個觸發器,它們在對兩個表進行更新時觸發:Docs和Trans。在什麼情況下不會調用Sybase觸發器?

觸發器的定義如下所示:

對於文檔:

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 

反式:

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 

看來這些觸發器的行爲是不同的,這取決於如何更新對那些表做出。

在一種情況下,這些表通過兩個存儲過程(Insert_Docs_SP和Insert_Trans_SP)進行更新。發生這種情況時,每次觸發器都會觸發一次(文檔一次,Trans一次),一切按預期工作。

在另一種情況下,這些表在具有兩個數據庫更新的Sybase事務中更新。這裏,第一次更新通過調用應用程序中的內聯SQL完成(它觸發Trans觸發器)。第二次更新通過存儲過程 - Insert_Docs_SP完成,與其他情況相同 - 不觸發觸發器。

也許有關於如何處理我不理解的交易的事情?

回答

0

我找到了答案 - 它是按執行順序排列的。我認爲其中一個觸發器並未被解僱 - 在這種情況下,是Index_Change_Trans觸發器 - 但實際上是這樣。但是,我沒有看到結果,因爲此觸發器依賴於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) 

因此,在跨桌子上的文件表之前更新的情況下,橫貫觸發的運行就不會顯示在Docid_Sync表的更新 - 因爲在這一點上有在文檔表中沒有條目與適當的Transnum值。在這些情況下,Docid_Sync表只有一個條目,即Docs觸發器的結果。

在其他情況下,先Docs表更新,然後是Trans表。在這些情況下,Docid_Sync表有兩個條目 - 一個作爲Docs觸發器的結果,另一個作爲Trans觸發器的結果。

0

在這兩個觸發器中,如果更新某些列,觸發器只會插入到docid_sync表中。您確定存儲過程正在更新觸發器中的某個列嗎?如果觸發器是來自觸發器調用的遞歸更新,則也不會調用觸發器,但在這裏似乎不是這種情況。

另一種可能性是,如果調用事務使用set triggers off命令禁用觸發器。我將開始確保存儲過程更新觸發器檢查中的某一列。

另一個問題:同一行更新兩次,內聯SQL和存儲過程在你的錯誤情況下,還是更新兩個不同的行?

+0

存儲過程正在更新觸發器中的列(我更新了上述與存儲過程相關的問題。)在這兩種情況下,存儲過程都插入新記錄。 – Timbuck 2011-06-16 20:13:38

+0

如果您有權訪問dev/test env't中的代碼,請嘗試運行SP並查看是否執行了觸發器。 – 2011-06-16 20:19:37

+0

單獨運行SP實際上是執行觸發器。 – Timbuck 2011-06-17 01:22:46