【问题标题】:TSQL- Trigger instead of UPDATE column not included in update statmentT SQL-触发器而不是更新语句中未包含的更新列
【发布时间】:2013-06-19 13:23:15
【问题描述】:

我对我正在尝试做的事情有一个小问题。但我怀疑这是不可能的,只是想要一些其他的见解。

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

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

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

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

我希望能捕捉到更新语句不包含“UpdatedBy”字段的情况,然后将其替换为登录的用户名。我的问题是我无法弄清楚如何检测该字段是否包含在针对该表运行的更新语句中,因为我预计插入的表在“UpdatedBy”字段中为空未在更新中指定。 有没有其他方法可以查明它是否在更新中指定?

【问题讨论】:

    标签: tsql triggers sql-server-2008-r2 sql-update updates


    【解决方案1】:

    我想我已经找到了答案。 通过使用“更新(列名)”函数,我可以确定我遇到问题的字段是否已在更新语句中更新。 因此,只需用 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 用户名。

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2013-05-13
      • 1970-01-01
      相关资源
      最近更新 更多