2008-10-29 4 views
9

Ich möchte einen Auslöser erstellen, um zu prüfen, was gegen Geschäftsregeln gelöscht wird, und die Löschung dann bei Bedarf abbrechen. Irgendwelche Ideen?Wie löse ich eine Löschung in SQL aus

Die Lösung verwendet den Trigger anstelle von Delete. Die Rollback-Transaktion hat das Löschen gestoppt. Ich hatte Angst, dass ich bei der Löschung ein Kaskadenproblem bekommen würde, aber das schien nicht zu passieren. Vielleicht kann sich ein Trigger nicht selbst auslösen.

+0

Es ist sehenswert, was andere Leute beitragen, bevor sie die Antwort bestimmen. Die Frage ist weniger als eine Stunde alt. –

Antwort

18

Verwenden Sie einen INSTEAD OF DELETE (siehe MSDN) Trigger und entscheiden Sie innerhalb des Triggers, was Sie wirklich tun möchten.

1

Der Auslöser kann die aktuelle Transaktion zurücksetzen, wodurch der Löschvorgang abgebrochen wird. Wie das obige Poster auch sagt, können Sie auch einen statt Trigger verwenden.

1

Laut MSDN-Dokumentation über INSTEAD OF DELETE Trigger:

The deleted table sent to a DELETE trigger contains an image of the rows as they existed before the DELETE statement was issued.

Wenn ich es richtig die DELETE verstehen tatsächlich ausgeführt wird. Was vermisse ich?

Wie auch immer, ich verstehe nicht, warum Sie die Datensätze löschen möchten und wenn die Geschäftsregeln nicht übergeben werden, dann diese Datensätze wiederherstellen. Ich würde schwören, dass es einfacher sein sollte zu testen, ob Sie die Geschäftsregeln vor dem Löschen der Datensätze bestehen.

Und ich hätte gesagt, eine Transaktion zu verwenden, habe ich noch nie zuvor über INSTEAD OF Auslöser gehört.

+0

Das Problem ist, dass die Anwendung den Benutzer erlaubt, etwas zu löschen, das ihnen zugewiesen wurde, aber da ich den Quellcode nicht habe, kann ich ihn nur auf DB-Ebene stoppen. Ich möchte nicht, dass Benutzer Aufgaben löschen, die ihnen zugewiesen wurden und die nicht abgeschlossen sind. –

7

Die Lösung verwendet den Trigger anstelle von Delete. Die Rollback-Transaktion hat das Löschen gestoppt. Ich hatte Angst, dass ich bei der Löschung ein Kaskadenproblem bekommen würde, aber das schien nicht zu passieren. Vielleicht kann sich ein Trigger nicht selbst auslösen. Wie auch immer, danke allen für deine Hilfe.

ALTER TRIGGER [dbo].[tr_ValidateDeleteForAssignedCalls] 
on [dbo].[CAL] 
    INSTEAD OF DELETE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @RecType VARCHAR(1) 
    DECLARE @UserID VARCHAR(8) 
    DECLARE @CreateBy VARCHAR(8) 
    DECLARE @RecID VARCHAR(20) 

    SELECT @RecType =(SELECT RecType FROM DELETED) 
    SELECT @UserID =(SELECT UserID FROM DELETED) 
    SELECT @CreateBy =(SELECT CreateBy FROM DELETED) 
    SELECT @RecID =(SELECT RecID FROM DELETED) 

    -- Check to see if the type is a Call and the item was created by a different user 
    IF @RECTYPE = 'C' and not (@[email protected]) 

    BEGIN 
     RAISERROR ('Cannot delete call.', 16, 1) 
     ROLLBACK TRAN 
     RETURN 
    END 

    -- Go ahead and do the update or some other business rules here 
    ELSE 
     Delete from CAL where RecID = @RecID  

END 
+1

Wenn Sie versuchen, mehr als einen Datensatz zu löschen, erhalten Sie den Fehler: _Subquery gab mehr als 1 Wert zurück. Dies ist nicht erlaubt, wenn die Unterabfrage =,! =, <, <= , >,> = oder wenn die Unterabfrage als Ausdruck verwendet wird. So müssen Sie die Berechtigungen auf andere Weise überprüfen (zB _select @C = count (1) von DELETED where) ..._) – inon