3

私がやろうとしていることには小さな問題があります。しかし、それは不可能だと思うので、他の洞察が欲しいだけです。

6 つの列を含むテーブルがあります。そのうちの 2 つは、テーブルの更新の記録に関連しています。「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」フィールドが含まれていないときにキャッチし、これをログインしているユーザー名に置き換えたいと思っていました。私の問題は、このテーブルに対して実行される更新ステートメントにこのフィールドが含まれているか含まれていないかを検出する方法がわからないことです。アップデートで指定されていませんでした。アップデートで指定されているかどうかを確認する別の方法はありますか?

4

1 に答える 1

2

私は自分の答えを見つけたと思います。「Update(columname)」関数を使用すると、問題があったフィールドが update ステートメントで更新されているかどうかを判断できます。したがって、「合体」ステートメントをケースステートメントに置き換えるだけで、問題が解決されました。新しいトリガーコード。

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

誰かがテーブルに更新を適用する場合、デフォルトで SQL ユーザー名が取得されるため、'UpdatedBy' を指定する必要はありません。

于 2013-06-23T06:16:45.930 に答える