2016-04-01 10 views
0

Ich schreibe einen Trigger zum Steuern einer Spalte. Das Skript funktioniert wie ich will, aber mein Problem ist im Raisefehler. Ich möchte, dass der Auslöser funktioniert, ohne dem Benutzer die Fehlermeldung anzuzeigen.Eine Ausführung eines Triggers ohne Box-Nachricht unterbrechen (tsql)

Kann jemand wer weiß, was das Äquivalent von raiseerror ist, ohne die Fehlermeldung dem Benutzer zu zeigen?

Ich versuchte mit Rollback-Transaktion, die mir stattdessen eine andere Fehlermeldung, und ich versuchte mit Rückkehr, die die Ausführung des Triggers nicht unterbrochen.

Das ist mein Auslöser:

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 

Bitte helfen Sie mir

+1

Ihre Trigger hat ** MAJOR ** Fehler, dass Sie scheinen anzunehmen, es einmal aufgerufen werden, werden ** pro Zeile ** - das ist ** nicht * * der Fall. Der Trigger wird ** einmal pro Anweisung ** ausgelöst. Wenn also Ihre INSERT-Anweisungen 25 Zeilen einfügen, erhalten Sie den Trigger einmal ** ausgelöst, aber dann enthält "Insert" 25 Zeilen. Welche dieser 25 Zeilen wird Ihr Code hier auswählen? 'SELECT @ val = [DC_Piece] von INSERTED' - es ist nicht deterministisch - Sie erhalten * eine beliebige * Zeile, und Sie ** ignorieren ** alle anderen! Sie müssen Ihren Trigger neu schreiben, um dies zu berücksichtigen! –

+0

Okay, können Sie mir ein Beispiel geben pleaze – hollyx

+0

Siehe meine Antwort –

Antwort

1

Sie müssen vollständig den Trigger neu zu schreiben, zu berücksichtigen, dass es einmal pro Anweisung (NICHT pro Zeile aufgerufen wird, !) und die Pseudotabellen Inserted und Deleted können mehrere Zeilen enthalten, die Sie berücksichtigen sollten.

So versuchen, so etwas wie dieses:

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

Vielen Dank für Ihre Antwort, aber ich habe diese Fehlermeldung jetzt, die zeigt: Die Transaktion endete im Trigger, die Charge wurde abgerechnet – hollyx

Verwandte Themen