Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.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
Triggers 我如何加上一句;上次更新;SQL Server 2008 R2表中的列?_Triggers_Sql Server 2008 R2 - Fatal编程技术网

Triggers 我如何加上一句;上次更新;SQL Server 2008 R2表中的列?

Triggers 我如何加上一句;上次更新;SQL Server 2008 R2表中的列?,triggers,sql-server-2008-r2,Triggers,Sql Server 2008 R2,我的SQL Server 2008 R2数据库中有一个表,希望添加一个名为LastUpdate的列,该列将在每次更新行时自动更改。这样,我可以看到每一行上次更新的时间 SQLServer2008R2似乎没有像早期版本那样的数据类型来处理这个问题,所以我不确定最好的方法。我想知道如何使用触发器,但是当触发器更新行时会发生什么?这是否会再次触发触发器,等等?要知道上次更新了哪一行,您需要创建一个类型为DATETIME/DATETIME2的新列,并使用触发器对其进行更新。没有数据类型在每次更新行时自动

我的SQL Server 2008 R2数据库中有一个表,希望添加一个名为LastUpdate的列,该列将在每次更新行时自动更改。这样,我可以看到每一行上次更新的时间


SQLServer2008R2似乎没有像早期版本那样的数据类型来处理这个问题,所以我不确定最好的方法。我想知道如何使用触发器,但是当触发器更新行时会发生什么?这是否会再次触发触发器,等等?

要知道上次更新了哪一行,您需要创建一个类型为
DATETIME
/
DATETIME2
的新列,并使用触发器对其进行更新。没有数据类型在每次更新行时自动使用日期/时间信息更新自身

为了避免递归,可以在触发器内使用
UPDATE()
子句,例如

ALTER TRIGGER dbo.SetLastUpdatedBusiness 
ON dbo.Businesses 
AFTER UPDATE -- not insert!
AS
BEGIN
    IF NOT UPDATE(LastUpdated)
    BEGIN
        UPDATE t
            SET t.LastUpdated = CURRENT_TIMESTAMP -- not dbo.LastUpdated!
            FROM dbo.Businesses AS t -- not b!
            INNER JOIN inserted AS i 
            ON t.ID = i.ID;
    END
END
GO

不幸的是,这没那么容易

您可以向表中添加一个新的
DATETIME
(或
DATETIME2
)字段,并可以为其提供一个默认约束
GETDATE()
——该约束将在插入新行时设置值


不幸的是,除了在更新后创建一个
触发器之外,没有“开箱即用”的方法使其始终保持更新。触发器本身并不难编写,但您必须为shuold具有该功能的每个表编写它。…

您是否考虑使用时间戳?这与日期/时间无关,现在称为
rowversion
早期版本中是什么数据类型处理的?如果你想到的是
时间戳
行版本
,那你就错了-此列不包含日期/时间信息,不能用于确定“上次更新”…我想到的是时间戳/ROWVERSION,我认为这与我发布时的日期有关。从那以后我发现它从来都不是!此功能有两个请求,请投票并发表评论!我想说触发器是一种自动更新的方式。没有解决问题中无止境的触发器递归部分。@Will Den:是的,它是自动的-一旦你写了它并把它放在适当的位置上。我一直希望微软能推出类似于SQL Server自动更新的
timestamp/rowversion
列的东西,但它基于人类可读的日期/时间格式。还没有这样的运气(SQL Server“Denali”似乎也没有这样的运气:-()@Will Den和marc,请投票并发表评论!不是我!即使我有足够的分数,我也不会投票否决这两个答案,因为它们都非常有用。我将尝试一下,并将报告我的进展情况。再次尝试……只是尝试了一下,但没有效果。我有一个名为Business的表,其中有一个名为Last的DateTime字段已更新,这是我希望在每次行更改时都更新的触发器。我添加了以下触发器,但在更新其中一行时LastUpdate字段未更改。我做错了什么?再次感谢。在插入后在业务上创建触发器SetLastUpdatedBusiness,如同未更新一样(LastUpdated)begin update t set dbo.LastUpdated=CURRENT\u TIMESTAMP from businesss as b internal join inserted as i on b.ID=i.ID end GO您更新了什么列?您能否将触发器和update语句作为代码示例放在问题中,以使其可读?为什么您的列引用
dbo.LastUpdated
?这不是一列。您的里格在插入后说
…我想你的意思是更新后的
。你还需要别名匹配,你不能说
更新t
,然后将
业务称为b
-你需要更改其中一个。请查看更新后的示例。啊,谢谢Aaron。我在插入时创建了触发器(duh!)而不是更新。我猜错误的别名没有帮助!现在都正常了。