Déclencher pour triggersr une erreur, empêcher la suppression et tenter une vérification

J'essaye de créer un triggersur qui fait trois choses: 1. Empêche la suppression des données sur une table particulière 2. Génère un message d'erreur pour l'user 3. Consigne datatables qui ont été essayées pour être supprimées avec l'information de session de SQL .

C'est le code que j'ai jusqu'à présent:

CREATE TRIGGER [dbo].[MyTable_prevent_delete_and_audit] ON [dbo].[MyTable] INSTEAD OF DELETE AS BEGIN DECLARE @SESSIONINFO nvarchar(200) SELECT @SESSIONINFO = (RTRIM(LTRIM(CAST(login_time as nvarchar(20)))) + ' ' + RTRIM(LTRIM(hostname)) + ' ' + RTRIM(LTRIM(program_name)) + ' ' + RTRIM(LTRIM(cmd)) + ' ' + RTRIM(LTRIM(loginame))) from sys.sysprocesses WHERE spid = @@SPID INSERT INTO [dbo].[MyTable_AUDIT] ([Field1],[Field1],[SESSIONINFO]) SELECT [Field1],[Field1],@SESSIONINFO FROM deleted RAISERROR ('Removing MyTable ensortinges prevented by sortinggger. Contact your administrator', 16, 1) END RETURN GO 

Le code ci-dessus est capable d'empêcher la suppression et d'augmenter l'erreur pour l'user. Cependant, rien n'est jamais entré dans la table d'audit. Si je commente la ligne RAISEERROR, le triggersur ajoute correctement les éléments à la table d'audit, mais bien sûr, datatables sont supprimées. Je pense que je dois manquer quelque chose de simple (n'est-ce pas supprimé si je fais une erreur?), Ou je ne comprends pas certains éléments du concept. S'il vous plaît montrez-moi l'erreur de mes manières! 🙂

Edit: Aaron Bertrand a la bonne réponse, je dois valider mes données d'audit avant d'élever l'erreur. Le RAISERROR reprend essentiellement tout, y compris l'audit:

 CREATE TRIGGER [dbo].[MyTable_prevent_delete_and_audit] ON [dbo].[MyTable] INSTEAD OF DELETE AS BEGIN DECLARE @SESSIONINFO nvarchar(200) SELECT @SESSIONINFO = (RTRIM(LTRIM(CAST(login_time as nvarchar(20)))) + ' ' + RTRIM(LTRIM(hostname)) + ' ' + RTRIM(LTRIM(program_name)) + ' ' + RTRIM(LTRIM(cmd)) + ' ' + RTRIM(LTRIM(loginame))) from sys.sysprocesses WHERE spid = @@SPID INSERT INTO [dbo].[MyTable_AUDIT] ([Field1],[Field1],[SESSIONINFO]) SELECT [Field1],[Field1],@SESSIONINFO FROM deleted COMMIT TRANSACTION; RAISERROR ('Removing MyTable ensortinges prevented by sortinggger. Contact your administrator', 16, 1) END RETURN GO 

Essayez de valider l' INSERT avant de triggersr l'erreur. Sinon, l'augmentation de l'erreur annule tout ce que le triggersur a fait et tout ce que l'instruction qui a appelé le triggersur a fait.

 INSERT INTO [dbo].[MyTable_AUDIT] ([Field1],[Field1],[SESSIONINFO]) SELECT [Field1],[Field1],@SESSIONINFO FROM deleted; COMMIT TRANSACTION; RAISERROR ('Removing MyTable ensortinges prevented by sortinggger. ...', 16, 1);