2017-02-20 5 views
0

を変更したかどうかを判断私はこのトリガーSQLトリガー - フィールドは

ALTER TRIGGER [dbo].[tInsertTaskFromOpportunityReassignment] 
    ON [dbo].[OpportunityBase] 
    FOR UPDATE 
AS 
BEGIN 

IF UPDATE(owninguser) 
BEGIN 
-- do the task 
END 
END 

を持っている私はowninguserが実際に変更された場合は、タスクをやりたいです。それをどうやって決めることができますか?

おかげ

+0

'deleted'テーブルと' inserted'テーブルの間の 'owninguser'の値を比較する必要があります。ただし、行ごとではなく、文ごとにトリガされるわけではありません。つまり、複数の行を更新すると、トリガは1回だけ起動されます。 –

+0

AFAIK複数の更新された行に対しても機能します。 – McNets

+0

私は 'e'が不足していました。'トリガーは...であることに注意してください。 'とにかく、それは更新された複数の行のために働くが、更新されたすべての行が更新後に特定の列に異なる値を持つわけではない可能性もある。 –

答えて

0
ALTER TRIGGER [dbo].[tInsertTaskFromOpportunityReassignment] 
    ON [dbo].[OpportunityBase] 
    FOR UPDATE 
AS 
BEGIN 
DECLARE HasChanged int = 0; 

SELECT @HasChanged = 1 
FROM Inserted AS I 
INNER JOIN Deleted AS D 
ON I.PK = D.PK 
AND IsNull(I.owninguser,'~') <> IsNull(D.owninguser,'~') 

IF @HasChanged = 1 
BEGIN 
-- do the task 
END 
END 

は、主キーに2つのテーブルを結合、挿入、削除間のフィールドの値を比較します。

+1

これは、 'owninguser'カラムが変更された複数の行を含むupdate文に対してエラーを発生させます。 –

+0

@ZoharPeledは大きなポイントになります。この回答のコードは、UPDATE文が1行にしか影響しないことを前提としています。 – DMason

+0

複数行の更新でエラーが発生することはありません。少なくとも1つの行が更新されると、HasChangedの値が1に変更されます。 IFステートメントでは、HasChangedがtrueの場合、Inserted/Deletedテーブルを使用してさらにロジックに影響を与えることができます。 –

0
ALTER TRIGGER [dbo].[tInsertTaskFromOpportunityReassignment] 
    ON [dbo].[OpportunityBase] 
    FOR UPDATE 
AS 
BEGIN 
/* 
    I will assume that your [dbo].[OpportunityBase] table has a PRIMARY KEY 
    or UNIQUE column that is immutable to join the inserted and deleted 
    tables. In this example, [OpportunityBaseId] is that column. 

    The SELECT query returns a set of all records that had the value of [owninguser] 
    changed. What you would do from that point is up to you. 
*/ 
SELECT 
    i.[OpportunityBaseId], i.owninguser New_owninguser, d.owninguser Old_owninguser 
FROM inserted i 
JOIN deleted d 
    ON i.[OpportunityBaseId] = d.[OpportunityBaseId] 
    AND 
     (
      --owninguser value was changed. 
      i.[owninguser] <> d.[owninguser] OR 

      --owninguser changed from non-NULL to NULL. 
      (i.[owninguser] IS NULL AND d.[owninguser] IS NOT NULL) OR 

      --owninguser changed from NULL to non-NULL. 
      (i.[owninguser] IS NOT NULL AND d.[owninguser] IS NULL) 
     ) 
END 
GO