運行在SQL Server 2008 R2,這裏是我的UPDATE語句,這是在一個正在運行後INSERT觸發器:想不通爲什麼這個UPDATE語句運行
UPDATE cases.CASEMASTER
SET HOLDLETTERSUNTIL = '1/1/9999'
FROM cases.CASEMASTER C
JOIN INSERTED I
ON I.CASEID = C.ROWID
JOIN events.EVENTLIBRARY L
ON L.ROWID = I.DEFINITIONID
WHERE L.HOLDLETTERS = 1
AND C.HOLDLETTERSUNTIL < GETDATE()
的連接是正確的,並通過輸出窗口,我已確認where條件評估 - 按順序 - 爲FALSE和TRUE。
然而由於某種原因,我無法理解,這種說法實際上是在運行並試圖啓動UPDATE。由於第一個WHERE條件是FALSE,我不能爲我的生活算出爲什麼這是更新caseCASEMASTER中的任何行。但事實上我知道這是事實,因爲它正在觸發該桌上的觸發器。
我是否錯過了一些愚蠢的明顯盯着我的臉,那是繞過我的WHERE子句?
EVENTLIBRARY.HOLDLETTERS是一個INT字段,它可以是-1,0或1,用於指定在針對某個案例記錄特定事件時是否應該UNHOLD,NOTCHANGE或HOLD字母。
CASEMASTER.HOLDLETTERUNTIL是日期字段。
被插入的表格是EVENTMASTER,它定義了針對案例記錄的實際事件。
CASEMASTER> EVENTMASTER爲1-N
EVENTMASTER> EVENTLIBRARY爲N-1
而且,現在我真的很困惑!它觸發了第二個觸發器。但是第二個觸發器的INSERTED表中有ZERO行。所以看起來,Sql Server僅僅因爲觸發事件被觸發就觸發了一個觸發器,即使沒有實際的行被改變?這是新東西嗎?我總是假設如果沒有行被更改,那麼AFTER UPDATE觸發器將不會觸發。
它實際上更新與新值記錄哪些條件是錯誤的? –
你告訴我們沒有'events.EVENTLIBRARY.HOLDLETTERS = 1'的行,但查詢更新'cases.CASEMASTER'表中的一些行嗎? –
是的,我手動使用硬編碼值的單行插入測試它。而且我特別使用了一個EVENTID,其中HOLDLETTERS = 0,但它正在更新cases.CASEMASTER。我完全困惑不解。 – eidylon