SQL Server 2008 のテーブル用に作成された SQL トリガーがあります。「挿入された」テーブルに行が 1 つしかない場合にうまく機能します。複数の行がある場合に正しく動作するようにこのトリガーを変更するにはどうすればよいですか? ここではパフォーマンスが重要なので、カーソルや一時テーブルなどから離れたいと思います (可能であれば)。
基本的に、トリガーは「ClientID」または「TemplateID」フィールドが変更されたかどうかを確認します。それらがあり、OriginalClientID または OriginalTemplateID フィールドが null である場合は、それらにデータが入力されます (したがって、OriginalXXX フィールドを 1 回だけ設定するため、最初の値が何であったかを常に確認できます)。
CREATE TRIGGER [dbo].[trigSetOriginalValues]
ON [dbo].[Review]
FOR INSERT, UPDATE
AS
BEGIN
IF (NOT UPDATE(TemplateID) AND NOT UPDATE(ClientID)) return
DECLARE @TemplateID int
DECLARE @OriginalTemplateID int
DECLARE @ClientID int
DECLARE @OriginalClientID int
DECLARE @ReviewID int
SET @ReviewID = (SELECT ReviewID FROM inserted)
SET @ClientID = (SELECT ClientID FROM inserted)
SET @TemplateID = (SELECT TemplateID FROM inserted)
SET @OriginalTemplateID = (SELECT OriginalTemplateID FROM inserted);
SET @OriginalClientID = (SELECT OriginalClientID FROM inserted);
IF (@OriginalTemplateID IS NULL AND @TemplateID IS NOT NULL)
BEGIN
UPDATE [dbo].[Review] SET OriginalTemplateID = @TemplateID WHERE ReviewID=@ReviewID
END
IF (@OriginalClientID IS NULL AND @ClientID IS NOT NULL)
BEGIN
UPDATE [dbo].[Review] SET OriginalClientID = @ClientID WHERE ReviewID=@ReviewID
END
END