Eu tenho uma tabela que contém colunas de País, Cidade, Local, Descrição. Devido ao tamanho do campo de descrição, não é possível vincular os quatro campos em uma chave composta para evitar a duplicação. Tenho tentado evitar a duplicação por meio de um gatilho, mas não importa o que eu tente, ele reverte todas as inserções, incluindo inserções de dados exclusivos.
IF Exists ( Select a.*
From [dbo].[Table] a
JOIN Inserted b
on a.Country = b.Country
and a.City = b.City
and a.Location = b.Location
and ltrim(rtrim(a.Description)) = ltrim(rtrim(b.Description))
)
BEGIN
Raiserror ('The description that you are trying to load already exists.', 16, 1)
Rollback
END
Alguém tem alguma ideia do que há de errado com o exposto acima e quais alterações preciso fazer para que ele reverta apenas as inserções duplicadas?
Acho que a condição que você está verificando sempre será verdadeira, pois para cada consulta de inserção executada haverá uma entrada no
dbo.Table
einserted
também reverterá a transação.Do MSDN
Aconselho você a verificar a duplicata antes de inserir como
Mais leituras: http://msdn.microsoft.com/en-in/library/ms191300.aspx
Eu suspeito que você esteja usando um
AFTER INSERT
gatilho (se você não especificar outra coisa, os gatilhos são doAFTER
tipo, forneça o código completo para sua definição de gatilho para termos certeza), então isso é esperado: seu gatilho dispara após a inserção para que sempre veja a linha que você acabou de colocar.Em vez de
IF EXISTS ...
, você pode fazerIF (SELECT COUNT(*) ...) > 1
o que verificará se suas novas linhas trazem o total para mais de um.Você também pode usar um
INSTEAD OF INSERT
gatilho que pode ser um pouco mais eficiente (fazendo menos trabalho que você reverte posteriormente), embora eu duvide que a diferença seja significativa, a menos que você tenha uma carga de trabalho muito pesada de inserção nessa tabela com muitas duplicatas.Dois pontos colaterais: em
primeiro lugar, certifique-se de lidar
UPDATES
bem ou poderá obter duplicatas dessa maneira também.Em segundo lugar, certifique-se de que o que você está fazendo realmente vale a pena: tentar impor a integridade dos dados em campos de entrada de texto livre como "descrição" geralmente é uma causa perdida. Você pode ter duas entradas idênticas, exceto uma com espaço duplo ou erro de ortografia, e sua verificação não as identificará como equivalentes.