私がやろうとしていることには小さな問題があります。しかし、それは不可能だと思うので、他の洞察が欲しいだけです。
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」フィールドが含まれていないときにキャッチし、これをログインしているユーザー名に置き換えたいと思っていました。私の問題は、このテーブルに対して実行される更新ステートメントにこのフィールドが含まれているか含まれていないかを検出する方法がわからないことです。アップデートで指定されていませんでした。アップデートで指定されているかどうかを確認する別の方法はありますか?