Pergunta

Quero impedir que um registro específico seja excluído. Esse gatilho funciona bem para esse registro específico. No entanto, outros registros ainda permanecem quando estão sendo excluídos. 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

Como posso garantir que as linhas não correspondam à condição acima estão sendo excluídas conforme o esperado?

Foi útil?

Solução

Você tem um em vez de gatilho para precisar de uma exclusão real.

Eu também consideraria simplesmente filtrar a linha protegida porque:

  • Você precisa de um erro de arremesso? Ou ignorar silenciosamente?
  • E quanto a exclusão de várias fileiras que contêm a linha protegida: abortar o todo ou excluir o restante?

Algo 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

Outras dicas

Porque isso é em vez de você ainda precisa executar a operação de exclusão para o caso padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top