我正在尝试创建一个触发器,当记录到达“EndDate”列中的指定结束日期时,该触发器将更改“RateID”列中的值。
ALTER TRIGGER tr_tblContractExtension_RateChange
ON [dbo].[AgreementExtensionHistory]
AFTER UPDATE, INSERT
AS
UPDATE AgreementExtensionHistory
SET RateID = 114
FROM Inserted i
WHERE i.EndDate = CURRENT_TIMESTAMP
GO
我再次希望在到达 enddate 列中的结束日期时 RateID 默认值为“114”。
非常确定您需要在更新中包含 AgreementExtensionHistory,否则它将更新整个表。
这样的事情很可能是你所追求的。
UPDATE aeh
SET RateID = 114
FROM Inserted i
join AgreementExtensionHistory aeh on aeh.YourKeyColumn = i.YourKeyColumn
--WHERE i.EndDate = CURRENT_TIMESTAMP
WHERE datediff(MILLISECOND, i.EndDate, Current_Timestamp) < 500 --within 1/2 second
是的,问题是您的触发器使用 current_timestamp 作为连接谓词。您的代码假设触发器中的时间值与插入的时间值相同。情况并非如此,因为插入和触发器是单独的对象。它们每个都有自己的 current_timestamp 值,并且永远不会相同。
这很容易用一个简单的表和触发器来证明。
create table TriggerTest(SomeCol varchar(10), SomeDate datetime not null default CURRENT_TIMESTAMP)
GO
create Trigger trTriggerTest on TriggerTest AFTER insert
AS
select *
, CURRENT_TIMESTAMP
from inserted
GO
insert TriggerTest(SomeCol) select 'test'
——编辑——大声笑。经过一些更多的测试,似乎有时日期值是相同的,而其他时候并没有使这更加脆弱。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句