Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在使用更新后触发器对其他列进行更新后,将datecolumn中的特定行更新到今天的日期?_Sql_Sql Server 2008_Date_Triggers_Sql Update - Fatal编程技术网

Sql 如何在使用更新后触发器对其他列进行更新后,将datecolumn中的特定行更新到今天的日期?

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

当在T-SQL中使用更新后触发器更新列CustomerProductID时,如何将日期列DateMod更新为今天的日期

一些背景信息:表已经包含产品列表键列Itemcode,一旦收到CustomerProductID,它会将特定行产品的列从NULL更改为整数值。此更新是将行产品的列DateMod更新为todays日期的触发器。 我使用的是SSMS 2008,下面的代码更改了整个日期列,而不是更新行的特定日期字段:

 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只能更新一次,并且只存储在一个表中,因此我认为级联不会是问题。