2013-06-22 45 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用戶名錶。

相關問題