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?

¿Fue útil?

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
scroll top