如何使用触发器根据日期更改列值?

喜怒无常

我正在尝试创建一个触发器,当记录到达“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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章