web-dev-qa-db-ja.com

SQLサーバートリガーのIF UPDATE()

ある場合:

_IF UPDATE (col1)
_

...テーブルのSQLサーバートリガーで、col1が変更または更新された場合にのみtrueを返しますか?

次のような定期的な更新クエリがあります

_UPDATE table-name 
   SET col1 = 'x', 
       col2 =  'y' 
 WHERE id = 999
_

今、私の懸念は、「col1」が以前に「x」だった場合、再度「x」に更新してIF UPDATE ("col1")トリガーがTrueを返すかどうかです。

私の保存クエリはすべての列に対して汎用的であるため、この問題に直面していますが、この条件を追加すると、変更されていなくてもTrueを返します...したがって、このような条件を追加したい場合はどうすればよいのか心配です?

30
Jason M

列が更新された場合はtrueを返します。更新は、クエリが列の値を設定したことを意味します。以前の値が新しい値と同じであったかどうかは、ほとんど無関係です。

UPDATE table SET col = col

それは更新です。

UPDATE table SET col = 99

colの値が既に99だった場合も更新されます。

46
Remus Rusanu

トリガー内では、役立つ2つの内部テーブルにアクセスできます。 「挿入」テーブルには、影響を受ける各行の新しいバージョンが含まれます。「削除」テーブルには、各行の元のバージョンが含まれます。これらの表の値を比較して、フィールド値が実際に変更されたかどうかを確認できます。

10
Ray

あなたがすることは、updated()を使用するのではなく、挿入されたテーブルと削除されたテーブルの異なる値をチェックすることです(nullを考慮することを忘れないでください)。または、不要な更新の実行を停止できます。

2
HLGEM

「実際の更新なし」のケースを短縮するには、最初にクエリが行に影響を与えたかどうかも確認する必要があります。

set nocount on; -- this must be the first statement!
if not exists (select 1 from inserted) and not exists (select 1 from deleted)
  return;
1
Oliver
cREATE TRIGGER boo  ON status2 FOR UPDATE AS 
IF UPDATE (id)
BEGIN
SELECT 'DETECT'; 
END;

UPDATE status2 SET name = 'K' WHERE name= 'T' --no action 
UPDATE status2 SET name = 'T' ,id= 8 WHERE name= 'K' --detect
1
zloctb
SET NOCOUNT ON;

    declare @countTemp int
    select @countTemp = Count (*) from (
    select City,PostCode,Street,CountryId,Address1 from Deleted
    union
    select City,PostCode,Street,CountryId,Address1 from Inserted
    ) tempTable

    IF ( @countTemp > 1 )

Begin

-- Your Code goes Here
End

-- if any of these  "City,PostCode,Street,CountryId,Address1" got updated then trigger

-- will  work in " IF ( @countTemp > 1 ) " Code)
0
Shyam Sharma