la prevención de un registro específico contra el borrado
-
26-09-2019 - |
Pregunta
Quiero evitar que un registro específico no pueda borrarse. Este disparador funciona bien para ese registro específico. Sin embargo, otros registros siguen siendo cuando están siendo eliminados. ¿Por qué?
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
¿Cómo puedo estar seguro de que las filas que no coincidan con la condición anterior se eliminan como se espera?
Solución
Usted tiene un desencadenador INSTEAD OF por lo que necesita un DELETE real en ella.
También consideraría simplemente filtrando la fila protegida porque:
- ¿Necesita un error de tiro? O en silencio ignorar?
- ¿Qué pasa con las eliminaciones de filas múltiples que contienen la fila protegidas:? Abortar el conjunto, o eliminar el resto
Algo así como:
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
Otros consejos
Debido a que este es en lugar de usted todavía necesita para llevar a cabo la operación de eliminación para el caso por defecto.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow