2013-06-22 31 views
3

我有一个小问题,我正在尝试做什么。但我怀疑这是不可能的,只是想要一些其他的见解。TSQL-触发器,而不是更新列表中未包含UPDATE列

我有一个表,其中包含六列。其中两个与录制桌面更新“UpdateBy”和“UpdateDate”有关。当某人在表上应用更新时,更新日期被设置为系统时间,无论是否有人试图设置时间和日期(这里没有问题),但是当涉及到'UpdatedBy'时,我有一个问题。我试图在触发器内使用'插入'表,但执行语句时。

update PoolGroups 
set 
    PoolDescription = 'test 1 description' 
where 
    PoolName = 'test 2' 

不包含的“UpdatedBy”列“Inserted.UpdatedBy”字段包含的内容已经在不是在使用“更新”语句通过表中的任何条目。但是'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 

数据插入表中的数据在插入运行时的触发器中。

PoolName  PoolDescription  UpdatedBy UpdatedDate 
test 2   test 1 description test1  2013-06-22 14:39:55.930 

我希望刚好赶上当更新声明没有包含“UpdatedBy”字段,然后在用户名登录替换此。我的问题是,我不能解决如何检测该字段是否包含在针对此表运行的更新语句中,因为我预料插入的表在'UpdatedBy'字段中有空值没有在更新中指定。 是否有另一种方法可以确定它是否在更新中指定?

回答

2

我想我已经找到了我的答案。 使用'Update(columname)'函数我可以确定我有问题的字段是否已在更新语句中更新。 所以通过用case语句替换'coalesce'语句对我的问题进行排序。 新的触发代码。

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用户名表。

相关问题