1

レコードのステータスが最後に記録されたステータスと異なる場合にのみ機能する更新トリガーを作成する必要があります。

だから私は今これを持っています:

    for UPDATE
AS 
begin try
INSERT INTO tblHistorySource(*)
select *
from [DELETED]
end try

しかし、tblHistorySource.statusがdelete.statusと等しくないかどうかを確認してから、データをコピーする必要があります....

4

3 に答える 3

4

一度に 1 つのレコードだけではなく、一連のデータで作業していることに注意する必要があります。

INSERT INTO tblHistorySource
SELECT *
FROM DELETED INNER JOIN
     INSERTED ON <<DELETED.PK = INSERTED.PK>>
WHERE DELETED.StatusValue <> INSERTED.StatusValue;

の実際の名前と同様に、結合条件<<DELETED.PK = INSERTED.PK>>をスキーマに適合させる必要がありますStatusValue

StatusValuenullable の場合(Alex に感謝)、代わりにこれを使用します。

WHERE DELETED.StatusValue <> INSERTED.StatusValue
   OR DELETED.StatusValue IS NULL AND INSERTED.StatusValue IS NOT NULL
   OR DELETED.StatusValue IS NOT NULL AND INSERTED.StatusValue IS NULL;

おそらくISNULL()ラッパーを使用して簡略化できますが、データ型を知る必要があります。

于 2011-07-22T17:57:45.433 に答える
1

追加するだけです:

IF ((SELECT Status FROM Delted) <> SELECT Status FROM Inserted))
BEGIN
...
END
于 2011-07-22T17:51:07.000 に答える
-2

次のようなことができます。

DECLARE @statusOldValue status_type
DECLARE @statusNewValue status_type

SELECT @statusOldValue = status FROM deleted

SELECT @statusNewValue= status FROM inserted

IF (@statusOldValue<>@statusNewValue) THEN
BEGIN
 -- Do what you want
END

複数のレジスタが同時に更新される状況が発生する可能性がある場合は、すべてのレジスタを処理するために、WHERE 句を SELECT ステートメントに配置し、それらを反復する必要があります。

于 2011-07-22T17:52:07.910 に答える