我在SQL Server数据库中有一个表,其中包含一些列以及
CreatedBy (varchar)
CreatedOn (datetime)
UpdatedBy(varchar)
UpdatedOn(datetime)
作为标准列。当有一个新行添加到此表时(使用默认值方法),CreatedOn
和CreatedBy
值会自动填充。
问题:SQL Server中是否存在任何开箱即用的解决方案,当行更新时,它可以篡改UpdatedOn
和UpdatedBy
值?
答案 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&时间格式,你需要做一些工作;
(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')
每隔一分钟在表格中插入一行。
使第1步运行此代码:
Insert into dbo.UpdateTimeStamp(OldRowVersion) SELECT TOP (1) NewRowVersion FROM dbo.UpdateTimeStamp ORDER BY NewRowVersion DESC
将时间表设置为每1分钟运行一次。
将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
的文章为了获得更好的效果,我建议您在更新任何行时同时更新UpdatedBy
和UpdatedDate
。
您可以阅读有关触发器here的更多信息。