Frage

Ich möchte von einem bestimmten Datensatz verhindern gelöscht werden. Dieser Trigger funktioniert gut für diesen bestimmten Datensatz. Aber auch andere Aufzeichnungen bleiben noch, wenn sie Wesen gelöscht. Warum?

 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

Wie kann ich sicherstellen, dass die Zeilen nicht die obige Bedingung passenden gelöscht werden als erwartet?

War es hilfreich?

Lösung

Sie haben einen INSTEAD OF-Trigger so benötigen Sie eine tatsächliche DELETE drin.

Ich würde auch prüfen, einfach Filtern die geschützte Zeile aus, weil:

  • Sie benötigen einen Fehler werfen? Oder leise ignorieren?
  • Was mehrreihige Löschungen, die die geschützten Zeile enthalten: Abbruch der gesamten oder den Rest löschen

So etwas wie:

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

Andere Tipps

Da dies STATT Sie müssen noch den Löschvorgang für den Standardfall auszuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top