2016-07-10 18 views
0

Ich muss einen SQL Server-Trigger zum Sperren von Updates erstellen und löscht eine Tabelle Service.IF-Anweisungen in SQL Server-Trigger

Diese Aktion sollte nur an Service durchgeführt werden, in der die Spalte State s Beispieldaten "abgeschlossen" ist.

Es sollte Updates ermöglichen und löscht zu Service, in denen die Spalte State s Beispieldaten "aktiv" ist.

Dies ist, was ich ausprobiert habe, habe ich Probleme mit der else Operation (das ermöglicht Updates Service, in denen die Spalte State Beispieldaten "aktiv" ist).

CREATE TRIGGER [Triggername] 
ON dbo.Service 
FOR INSERT, UPDATE, DELETE 
AS 
    DECLARE @para varchar(10), 
      @results varchar(50) 

    SELECT @para = Status 
    FROM Service 

    IF (@para = 'completed') 
    BEGIN 
     SET @results = 'An invoiced service cannot be updated or deleted!'; 
     SELECT @results; 
    END 

BEGIN 
    RAISERROR ('An invoiced service cannot be updated or deleted', 16, 1) 
    ROLLBACK TRANSACTION 

    RETURN 
END 
+0

Wenn Sie Updates blockieren und löschen möchten - warum ist dann der Trigger auf 'INSERT'? Außerdem: Sie sehen niemals die 'Gelöschten' und' Eingefügten' Pseudo-Tabellen, die Ihnen sagen * was * Zeilen wurden aktualisiert (oder gelöscht) - so wird dies nicht funktionieren ...... –

+0

es zurückgibt Der Wert "Ein fakturierter Service kann nicht aktualisiert oder gelöscht werden!". aber ich bin nicht sicher, ob es die if Bedingung überprüft – Ayyub

Antwort

1

Also, wenn ich Sie richtig verstehe, jede UPDATE oder DELETE erlaubt sein sollte, wenn die State Spalte einen Wert von Active hat, aber in jedem anderen Fall gestoppt ??

Dann würde ich dies tun:

CREATE TRIGGER [Triggername] 
ON dbo.Service 
FOR UPDATE, DELETE 
AS 
BEGIN 
    -- if any row exists in the "Deleted" pseudo table of rows that WERE 
    -- in fact updated or deleted, that has a state that is *not* "Active" 
    -- then abort the operation 
    IF EXISTS (SELECT * FROM Deleted WHERE State <> 'Active') 
     ROLLBACK TRANSACTION 

    -- otherwise let the operation finish 
END 

Als Anmerkung: Sie nicht leicht Meldungen zurück von einem Trigger (mit SELECT @Results) - der Auslöser nur nicht leise durch die derzeit aktive Transaktion ein Rollback

+0

Was mache ich, wenn ich eine Ausgabe zurücksenden muss, die sagt "Ein fakturierter Service kann nicht aktualisiert werden oder gelöscht werden!" für abgeschlossene Dienstleistungen. – Ayyub

+0

Wenn ich diesen Code ausführen, wird der Fehler "Falsche Syntax in der Nähe von 'END' zurückgegeben." – Ayyub

+0

@Ayyub: wie ich versucht habe zu sagen: du * kann * nichts von einem Auslöser zurückgeben - keine Nachricht, keine Nummer - der Auslöser funktioniert einfach still im Hintergrund. Wenn Sie eine Nachricht wie diese benötigen, müssen Sie * vor * Löschen/Aktualisieren prüfen, ob diese Operation erlaubt ist (oder nicht). –