を使用して新しいテーブル内の既存の列の値を格納します構造は、どのように私は</strong>テーブルのこの</p> <p><strong>カスタマーのようなもので二つのテーブル</p> <ul> <li>顧客の両方のテーブルの</li> <li>CUSTOMERUPDATE</li> </ul> <p>構造を持っているトリガー
CustomerName | CustomerId
CUSTOMERUPDATEテーブルの構造
NewCustomerName | NewCustomerId | OldCustomerName
私はCustomer
テーブルに挿入されたいくつかの値を持っています。この表のデータを更新する必要があるときは、既存のデータと新しいデータを新しいテーブルCustomerUpdate
にトリガーする必要があります。このため
私はトリガーを作成したが、これは変更されているテーブルから選択し、
CREATE TRIGGER trgAfterUpdate
ON [dbo].Customer
FOR UPDATE
AS
SET NOCOUNT ON
declare @NewCustomerName nchar(20);
declare @NewCustomerId nchar(20);
declare @OldCustomerName nchar(20);
declare @audit_action varchar(100);
select @NewCustomerName = i.CustomerName from inserted i;
select @NewCustomerId = i.CustomerId from inserted i;
select @OldCustomerName = c.CustomerName
from Customer c
where CustomerId = @NewCustomerId;
if update(CustomerName)
set @audit_action='Updated Record -- After Update Trigger.';
if update(CustomerId)
set @audit_action='Updated Record -- After Update Trigger.';
insert into CustomerUpdate(NewCustomerName, NewCustomerId, OldCustomername)
values(@NewCustomerName, @NewCustomerId, @OldCustomerName);
PRINT 'AFTER UPDATE Trigger fired.'
GO
あなたのトリガがあり** MAJOR **という点で欠陥あなたはそれが呼び出されることになりますと仮定**一度行あたり** - その** **の場合はありません。文**で1回**を起動するので、 'UPDATE'文が25行に影響を与えると、トリガは一度**発生しますが、' Inserted'擬似表には25行が含まれます。あなたのコードがここで選択する25行のうちどれですか? 'select @NewCustomerName = i.CustomerName from i;挿入されていません - これは非決定的なものです**あなたは任意の行**を取得し、**あなたは**他のすべての行を無視します**。これを考慮に入れてトリガーを書き直す必要があります。 –
"古い"値が必要な場合は、削除された仮想テーブルを使用する必要があります。もちろん、監査テーブルでは、新しい値を含めるのは冗長です。それは常に次の監査行またはメイン表のいずれかに存在します。両方の値を格納するのに2倍の記憶域が必要です。 –