自动更新SQL Server中的列值

时间:2015-04-17 11:19:43

标签: sql sql-server sql-server-2008

我在SQL Server数据库中有一个表,其中包含一些列以及

CreatedBy (varchar)
CreatedOn (datetime)
UpdatedBy(varchar)
UpdatedOn(datetime)

作为标准列。当有一个新行添加到此表时(使用默认值方法),CreatedOnCreatedBy值会自动填充。

问题:SQL Server中是否存在任何开箱即用的解决方案,当行更新时,它可以篡改UpdatedOnUpdatedBy值?

4 个答案:

答案 0 :(得分:1)

您可以添加如下所示的触发器。如果同时更新多行,则此触发器有效。请注意,它假定您已在源表中添加了标识列。

CREATE TRIGGER [dbo].UpdateTrans ON [dbo].YourTable
   FOR UPDATE
AS
   SET NOCOUNT ON 
   UPDATE  yt
   SET    UpdatedBy = SUSER_SNAME() ,
          UpdatedDate = GETDATE()
   FROM   DELETED d
      INNER JOIN YourTable yt ON yt.YourTableId = d.YourTableId

答案 1 :(得分:1)

除了添加Alex K等人提到的触发器之外,您还可以添加RowVersion列。此数据类型以前称为TimeStamp,但遗憾的是该名称具有误导性。

这将为您提供 UpdatedOn smalldatetime时间戳,但不会提供UpdatedBy信息。

如果要将RowVersion colunm转换为Date&时间格式,你需要做一些工作;

1。创建一个表" UpdateTimeStamp"有三列

(CreatedDate Smalldatetime,NewRowVersion,OldRowVersion)是这样的:

Create Table dbo.UpdateTimeStamp( OldRowVersion binary(8), CreatedDate DateTime constraint DF_UpdateTimeStamp_TimeStamp Default getdate(), NewRowVersion ROWVERSION CONSTRAINT PKUpdateTimeStamp PRIMARY KEY CLUSTERED )

手动插入第一行 Insert into dbo.UpdateTimeStamp(OldRowVersion, CreatedDate) VALUES (0x0000000000000000, '2000-01-01')

2。创建SQL代理作业

每隔一分钟在表格中插入一行。

使第1步运行此代码:

Insert into dbo.UpdateTimeStamp(OldRowVersion) SELECT TOP (1) NewRowVersion FROM dbo.UpdateTimeStamp ORDER BY NewRowVersion DESC 将时间表设置为每1分钟运行一次。

3。加入

将UpdateTimeStamp表连接到表中,并使用以下连接克劳斯:

SELECT top 10000 mt.*, uts.CreatedDate AS ModifiedDate FROM dim.MyTable MT 
LEFT JOIN dbo.UpdateTimeStamp uts ON MT.DT1RowVersion > OldRowVersion AND MT.DT1RowVersion <= NewRowVersion
ORDER BY uts.CreatedDate

HIH。

答案 2 :(得分:0)

正如Alex K.在对OP的评论中提到的那样。这可以通过表上的触发器对象来处理。

类似的东西:

CREATE TRIGGER updateTable
ON table
AFTER UPDATE 
AS 
[YOUR UPDATE CODE HERE]
GO

答案 3 :(得分:0)

您可以使用triggers执行相同操作,下面是示例代码(未测试,只是伪)

CREATE TRIGGER [dbo].UpdateTrans 
ON [dbo].YourTable
FOR  UPDATE
AS 
      UPDATE YourTable 
      SET UpdatedBy= SYSTEM_USER
         , UpdatedDate = GETDATE()
     WHERE YourColumn IN (SELECT DISTINCT YourColumn FROM Inserted)

但是在仓库数据库上使用触发器并不明智,这里有一篇关于reasons to avoid Triggers

的文章

为了获得更好的效果,我建议您在更新任何行时同时更新UpdatedByUpdatedDate

您可以阅读有关触发器here的更多信息。