2017-01-28 2 views
1

Ich lese Code für Trigger.SQL Server-Trigger, der das Löschen von Zeilen nicht zulässt

CREATE TRIGGER No_DeleteCustomers 
ON Customers 
INSTEAD OF DELETE 
AS 
    IF @@ROWCOUNT = 0 
     RETURN 

    RAISERROR('No deleting allowed', 11, 1) 

Aber ich bin verwirrt ... @@ROWCOUNT wird nicht verwendet, um die Anzahl der betroffenen Zeilen in der letzten Anweisung zeigen ... Wie verhindern, dass dies mich Zeilen aus der Tabelle zu löschen?

+0

Sie haben Recht, @@ ROWCOUNT wird verwendet, um die Anzahl der zurückgegebenen Zeilen zu überprüfen. Die IF-Anweisung im Trigger prüft, ob das Ergebnis null Datensätze hat, und führt dann die RAISERROR-Anweisung aus. Die RAISERROR-Anweisung beendet die Transaktion und gibt die Nachricht "Kein Löschen zulässig" zurück. Dies verhindert, dass Sie Zeilen löschen können. – MayowaO

+0

Ich bin neugierig, warum dieser Auslöser überhaupt existiert. Scheint, als wäre es vielleicht eine bessere Idee, Löschprivilegien auf dem Tisch zu verweigern. – Xedni

+3

@Xedni Obwohl Sie für die meisten Benutzer korrekt sind, können einigen Benutzern (wie sa) keine Privilegien verweigert werden. Ein solcher Trigger kann hilfreich sein, um das versehentliche Löschen von Zeilen durch Systemadministratoren zu verhindern der Trigger und dann löschen, aber das ist nicht wahrscheinlich, dass versehentlich geschehen würde ...) –

Antwort

0

Lasst uns das zu einem Zeitpunkt eine Zeile Code des Triggers gehen durch zu zeigen, wie dies funktioniert:

IF @@ROWCOUNT = 0     -- if the number of rows to be deleted is 0 then... 
    RETURN       -- return 
            -- if still running... 
RAISERROR('No deleting allowed', 11, 1) -- raise an error to the caller 

hoffe, das hilft!

Verwandte Themen