Question

Je veux éviter un enregistrement spécifique d'être supprimé. Ce déclencheur fonctionne très bien pour cet enregistrement spécifique. Cependant, d'autres dossiers restent encore quand ils sont en cours de suppression. Pourquoi?

 ALTER TRIGGER [Globalization].[CountriesTracker] 
 ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
 BEGIN
SET NOCOUNT ON;
IF ((Select COUNT(*) from [Deleted]
     Where [Deleted].[CountryId] = '36bd1536-fb56-4ec4-957e-1b3afde16c56') = 1)
BEGIN       
    RAISERROR('You can not delete this specific record!', 0, 0)
    ROLLBACK TRANSACTION
    RETURN
END
END

Comment puis-je faire en sorte que les lignes qui ne correspondent pas à la condition ci-dessus sont supprimés comme prévu?

Était-ce utile?

La solution

Vous avez un déclencheur INSTEAD OF de sorte que vous avez besoin d'un réel SUPPRIMER en elle.

Je voudrais aussi considérer filtrer simplement la ligne protégée parce que:

  • Avez-vous besoin d'un jet d'erreur? Ou silencieusement ignorer?
  • Qu'en est-il de la ligne multi suppressions qui contiennent la ligne protégée: Abandonner l'ensemble, ou supprimer le reste

Quelque chose comme:

ALTER TRIGGER [Globalization].[CountriesTracker]  ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
SET NOCOUNT ON;

DELETE
   CT
FROM
   [Globalization].[Countries] C
   JOIN
   DELETED D ON C.CountryId = D.CountryId
WHERE
    [Deleted].[CountryId] <> '36bd1536-fb56-4ec4-957e-1b3afde16c56'
 GO

Autres conseils

Parce que c'est INSTEAD OF vous devez toujours effectuer l'opération de suppression pour le cas par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top