2017-12-29 61 views
0

複数のトリガーを作成しようとしています。 1つのトリガは、同じフォームの(再表示された)フィールド 'Reprint'がCrystal Reportsによって更新されると、 'ysnAcknowledged'フィールドを更新します。 'ysnAcknowledged'フィールドがユーザーによって手動で更新されている場合(フォームチェックボックス)、2番目のトリガーは '再印刷'フィールドを更新する必要があります。私は最初のトリガを持っている、私の問題は、私は 'ysnAcknowledged'フィールドを更新する場合、それは私がそれをしたい前に、最初のトリガを効果的に逆転する私の2番目のトリガをトリップします。SQLトリガーを作成して前のトリガーを逆にする

第一トリガー:

CREATE TRIGGER SOPickListReprint 
ON dbo.SalesOrder 
AFTER UPDATE 
AS 

IF UPDATE(Reprint) 
UPDATE dbo.SalesOrder 
SET ysnAcknowledged = 1 

第二トリガー:

CREATE TRIGGER SOPickListUpdate 
ON dbo.SalesOrder 
AFTER UPDATE 
AS 

IF UPDATE(ysnAcknowledged) 
UPDATE dbo.SalesOrder 
SET Reprint = 0 
+0

はシングルトリガーでそれを行いますか? *(複数の行が変更される可能性があることに注意してください。このトリガは1つの行だけを変更して、テーブル内のすべての行を更新します)? – MatBailie

+0

トリガーはベンダー固有のものです** - 'mysql'、' postgresql'、 'sql-server'、' oracle'、 'db2'のどれを使うかを指定します。 –

+0

あなたは正しいです!これはMSSQLです。 –

答えて

0

私のソリューション:

CREATE TRIGGER SOPickListReprint 
ON dbo.SalesOrder 
AFTER UPDATE 
AS 

UPDATE dbo.SalesOrder 
SET ysnAcknowledged = CASE WHEN deleted.Reprint = 0 AND inserted.Reprint = 1 THEN 1 ELSE inserted.ysnAcknowledged END, 
Reprint = CASE WHEN deleted.ysnAcknowledged = 1 AND inserted.ysnAcknowledged = 0 THEN 0 ELSE inserted.Reprint END 
FROM SalesOrder 
INNER JOIN 
inserted 
    ON inserted.SalesOrderID = SalesOrder.SalesOrderID 
INNER JOIN 
deleted 
    ON deleted.SalesOrderID = SalesOrder.SalesOrderID 
+0

'WHERE'節がなければ、他のフィールドが変更された*行を不必要に*処理して書き直すことになります。 – MatBailie

+0

@ MatBailie、あなたは正しいです。私は今、それを修正します、ありがとう! –

1
CREATE TRIGGER SOPickListUpdate 
    ON dbo.SalesOrder 
    AFTER UPDATE 
AS 

-- Update only rows where Reprint changed or ysnAcknowledged changed 
-- > If ysnAcknowledged changed, force Reprint to 0, otherwise leave it as it is 
-- > If Reprint changed, force ysnAcknowledged to 1, otherwise leave it as it is 
UPDATE 
    SalesOrder 
SET 
    Reprint   = CASE WHEN inserted.ysnAcknowledged <> deleted.ysnAcknowledged THEN 1 ELSE inserted.Reprint END, 
    ysnAcknowledged = CASE WHEN inserted.Reprint   <> deleted.Reprint   THEN 0 ELSE inserted.ysnAcknowledged END 
FROM 
    SalesOrder 
INNER JOIN 
    inserted 
     ON inserted.<primary_key> = SalesOrder.<primary_key> 
INNER JOIN 
    deleted 
     ON deleted.<primary_key> = SalesOrder.<primary_key> 
WHERE 
     inserted.ysnAcknowledged <> deleted.ysnAcknowledged 
    OR inserted.Reprint   <> deleted.Reprint 
+0

@ MatBailie、私は1つのテーブルで作業しています。挿入と削除は定義されていません。私はこれがどのように機能するのか理解していません。 –

+0

'inserted'と' deleted'は、SQL Serverがトリガー内で使用するためのメタテーブルです。 SQL Serverトリガに関するマニュアルやチュートリアルを読むことを強くお勧めします。 https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql *( '[inserted]'はINSERTEDまたはUPDATEDの各行を含み、 '[deleted]'はすべての行を含みます行DELETEDまたはUPDATE; 'UPDATE'は' DELETE'とその後 'INSERT' ...と表示されます)* – MatBailie

+0

ありがとうございます!これは私がやったことです: –

関連する問題