Sql 如何在使用更新后触发器对其他列进行更新后,将datecolumn中的特定行更新到今天的日期?
当在T-SQL中使用更新后触发器更新列CustomerProductID时,如何将日期列DateMod更新为今天的日期 一些背景信息:表已经包含产品列表键列Itemcode,一旦收到CustomerProductID,它会将特定行产品的列从NULL更改为整数值。此更新是将行产品的列DateMod更新为todays日期的触发器。 我使用的是SSMS 2008,下面的代码更改了整个日期列,而不是更新行的特定日期字段:Sql 如何在使用更新后触发器对其他列进行更新后,将datecolumn中的特定行更新到今天的日期?,sql,sql-server-2008,date,triggers,sql-update,Sql,Sql Server 2008,Date,Triggers,Sql Update,当在T-SQL中使用更新后触发器更新列CustomerProductID时,如何将日期列DateMod更新为今天的日期 一些背景信息:表已经包含产品列表键列Itemcode,一旦收到CustomerProductID,它会将特定行产品的列从NULL更改为整数值。此更新是将行产品的列DateMod更新为todays日期的触发器。 我使用的是SSMS 2008,下面的代码更改了整个日期列,而不是更新行的特定日期字段: CREATE TRIGGER trigger_name ON Table1
CREATE TRIGGER trigger_name
ON Table1
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF UPDATE (CustomerProductID) BEGIN
Update Table1
SET DateMod=GETDATE()
END
END
我读过一些使用old.value和new.value或使用where exists从插入/更新中选择的解决方案,但这是如何工作的?如果这两种方法都有效,那么在这种情况下,哪一种方法最有益?
非常感谢 我更喜欢在更新触发逻辑事件之前执行此操作。在更新后触发器中执行更新意味着无限循环,在某些数据库中是不允许的。但是SQLServer不支持这一点
在任何情况下,正确的语法是使用inserted连接回原始表:
CREATE TRIGGER trigger_name
ON Table1
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF UPDATE(CustomerProductID) BEGIN
Update t1
SET DateMod = GETDATE()
FROM Table1 t1 join
Inserted i
ON Table1.PrimaryKeyColumn = i.PrimaryKeyColumn
END
END
更改代码,使PrimaryKeyColumn成为正确的主键列。谢谢!只是想知道:我猜sql有一个临时的插入表,它也有一个更新的表吗?@J3FFK。有一个名为inserted and deleted的视图,可以在触发器中使用。更新同时使用这两种方法。这些显然是作为日志上的视图实现的,因此不能直接修改。只是尝试了实现,但MSSQL似乎只支持,或者在更新之后才支持。@J3FFK。这让我想起了这件事。取而代之的是这个复杂的系统来防止触发器无限期地级联。谢谢,我已经尝试过使用After update,它很有效。幸运的是,CustomerProductID只能更新一次,并且只存储在一个表中,因此我认为级联不会是问题。