我在尝试做什么时遇到了一个小问题。但我怀疑这是不可能的,我只是想了解一些其他的见解。
我有一张表,里面有六列。其中两个与在表上记录更新有关,即"UpdateBy"one_answers"UpdateDate"。当有人对表应用更新时,无论是否有人试图设置时间和日期,更新日期都会设置为系统时间(这里没有问题),但当涉及到"UpdatedBy"时,我有问题。我曾尝试在触发器中使用"inserted"表,但在执行语句时使用。
update PoolGroups
set
PoolDescription = 'test 1 description'
where
PoolName = 'test 2'
不包含"UpdatedBy"列的任何条目。"Inserted.UpdatedBy"字段包含表中已存在的内容,而不是使用"Update"语句传入的内容。但是"Inserted.PoolDescription"包含更改后的文本,而不是原始文本。这是触发器。
CREATE TRIGGER TR_PoolGroups_Update
ON PoolGroups
instead of UPDATE
AS
BEGIN
UPDATE PoolGroups
SET
PoolDescription = i.PoolDescription
,UpdatedBy = coalesce(i.updatedby , (select SUSER_NAME()))
,UpdatedDate = getdate()
FROM
PoolGroups pg
INNER JOIN Inserted i
ON i.PoolName = pg.PoolName
END
GO
数据已在表PoolGroups中。
PoolName PoolDescription UpdatedBy UpdatedDate
test 2 test description test1 2013-06-22 14:39:55.930
运行insert时,触发器中Inserted表中的数据。
PoolName PoolDescription UpdatedBy UpdatedDate
test 2 test 1 description test1 2013-06-22 14:39:55.930
我只是想知道update语句何时不包含"UpdatedBy"字段,然后用登录的用户名替换它。我的问题是,我无法确定如何检测此字段是否包含在针对该表运行的更新语句中,因为我希望插入的表在"UpdatedBy"字段中有一个null,因为它没有在更新中指定。有没有其他方法可以确定它是否在更新中指定?
我想我已经找到了答案。通过使用"Update(columname)"函数,我可以确定我遇到问题的字段是否已在Update语句中更新。因此,通过将"合并"语句替换为case语句,解决了我的问题。新的触发器代码。
CREATE TRIGGER TR_PoolGroups_Update
ON PoolGroups
instead of UPDATE
AS
BEGIN
UPDATE PoolGroups
SET
PoolDescription = i.PoolDescription
,UpdatedBy = case when UPDATE(UpdatedBy)
then i.updatedby
else (select SUSER_NAME()) end
,UpdatedDate = getdate()
FROM
PoolGroups pg
INNER JOIN Inserted i
ON i.PoolName = pg.PoolName
END
go
现在,如果有人对表应用更新,他们不必指定"UpdatedBy",因为默认情况下,它现在将获取SQL用户名。