2016-04-01 3 views
0

私は列を制御するためのトリガーを作成しています。スクリプトは私が望むように動作しますが、私の問題はraiseerrorにあります。私はユーザーにエラーメッセージを表示せずにトリガーを動作させたい。ボックスメッセージなしのトリガー実行を中断する(tsql)

エラーメッセージを表示せずにraiseerrorに相当するものが分かっている人はいますか?

代わりに別のエラーメッセージが表示されるロールバックトランザクションを試みましたが、トリガーの実行を中断しなかったリターンを試しました。

これが私のトリガーです:

DECLARE @val varchar(9) 
SELECT @val= [DC_Piece] 
from INSERTED 
where INSERTED [DC_Domaine]=0 and INSERTED.[DC_IdCol]=6 

IF UPDATE([DC_Piece]) 
BEGIN 
IF NOT EXISTS(select [DO_PIECE] 
from DOCEN 
where @val= [DO_Piece] and [DO_Domaine]=0 and [DO_Type]=6) 
    RAISERROR('STOP',11,1) 
END 

私にあなたが行ごと(完全声明ごとに一度、それはと呼ばれることを考慮に入れて、あなたのトリガーを書き換える必要はありません

+1

を - それは* **ではありません* ケース。トリガは**文ごとに** **起動します。したがって、INSERTステートメントが25行を挿入すると、トリガは**一度**発生しますが、Insertedは25行を含みます。あなたのコードがここで選択する25行のうちどれですか? 'SELECT @ val = [DC_Piece] from INSERTED' - それは非決定論的です - あなたは*任意の*行を取得し、**あなたは**他のすべてを無視します!これを考慮に入れてトリガーを書き直す必要があります。 –

+0

よろしくお願いします。 – hollyx

+0

私の応答を参照してください –

答えて

1

を助けてください!)とInsertedDeleted疑似表には、考慮する必要がある複数の行を含めることができます。

したがって、このような何か試してください:あなたのトリガーが** MAJORは**あなたはそれが呼び出されることになりますと仮定しているように見えるという点で欠陥**一度行あたり**ました

CREATE TRIGGER trg_abort_insert 
ON dbo.YourTableNameHere 
AFTER UPDATE 
AS 
    -- check if any of the DC_Piece columns have been updated 
    IF EXISTS (SELECT * 
       FROM Inserted i 
       INNER JOIN Deleted d ON i.PrimaryKey = d.PrimaryKey -- link the two pseudo tables on primary key 
       WHERE i.DC_Piece <> d.DC_Piece -- DC_Piece has changed 
       AND i.DC_Domaine = 0 
       AND i.DC_IdCol = 6) 
     -- if your conditions are met --> just roll back the transaction 
     -- nothing will be stored, no message is shown to the user 
     ROLLBACK TRANSACTION     
END 
+0

あなたの応答をありがとう、私はこのエラーメッセージが表示されます:トランザクションがトリガーで終了し、バッチがabotedされました – hollyx

関連する問題