Sintomas
Suponha que você tenta excluir dados de uma tabela e os dados estão sendo referenciados em outras tabelas no Microsoft SQL Server 2016 e 2017. Se explorar o plano de execução de consultas, pode vê-lo utilizar um operador de Verificação de Referência de Chave Externa. Nesta situação, poderá receber uma mensagem de erro seguinte mesmo que a linha a ser eliminada não seja referenciada noutras tabelas:
Msg 547, Nível 16, Estado 0, Número de Linha
A instrução DELETE estava em conflito com o constrangimento REFERENCE
Estado
A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".
Resolução
Este problema foi corrigido na seguinte atualização cumulativa para SQL Server:
Observação Este problema foi corrigido na Atualização Cumulativa 6 para SQL Server 2016 SP2.
Acerca das atualizações cumulativas para SQL Server:
Cada nova atualização cumulativa para SQL Server contém todos os hotfixes e todas as correções de segurança que foram incluídas com a atualização cumulativa anterior. Consulte as atualizações cumulativas mais recentes para SQL Server:
Solução
Para contornar esse problema, use um dos seguintes métodos:
- Utilize o nível de compatibilidade abaixo de 130 para executar esta consulta.
- Altere a estrutura do índice na tabela de referência.
Mais Informações
Iniciando o nível 130 de compatibilidade da configuração do escopo do banco de dados no SQL Server 2016, um plano de execução de consulta pode usar o operador Verificação de Referência de Chave Externa para verificar se uma linha em uma tabela é referenciada por alguma linha em outras tabelas por meio de restrições de integridade referencial. Este operador pode ser utilizado se uma tabela for referenciada por um grande número de tabelas com chave externa. Neste operador, SQL Server escolhe um índice em cada tabela de referência para efetuar essa verificação. Se uma tabela de referência tiver um índice com várias colunas de chave, algumas colunas no início não fazem parte da chave externa, mas algumas outras colunas fazem parte da chave externa. Isto poderá resultar numa verificação incorreta efetuada por SQL Server.
Por exemplo, considere o seguinte esquema:
create table tpk (PK int constraint cpk primary key clustered)
create table tfk (a int, fk int constraint, cfk foreign key references, tpk, index ia, clustered(a,fk))
Este esquema poderá originar este problema, mas se alterar a ordem das colunas no índice ia para (fk,a), tal não irá acontecer.
Referências
Saiba mais sobre a terminologia que a Microsoft utiliza para descrever as atualizações de software.