impedir que um registro específico seja excluído
-
26-09-2019 - |
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?
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