运行在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