Versão curta
P: Existe um bug como kb4503379 no SQL 2019 v15.0.2095.3.
R: Sim, parece. Instale a v15.0.4236.7 e o problema desaparece.
Versão longa original
Eu entendo as chaves estrangeiras e a integridade referencial, mas estou enfrentando um problema como esse bug , onde DELETEs podem falhar quando deveriam ter sucesso. No entanto, isso foi para o SQL 2016 e 2017 e estou em 2019. Existem bugs semelhantes no SQL 2019? Estou usando o SQL 2019 Developer Edition v15.0.2095.3. ( Spoiler: atualização corrigiu )
Meu problema é que estou atingindo esse erro, mas não há dados na tabela causando o conflito . Se eu soltar outras tabelas , o problema desaparece, assim como no bug mencionado acima.
Msg 547, Level 16, State 0, Line 11
The DELETE statement conflicted with the REFERENCE constraint "FK_p0010_vtr_OutputDistriktsbolag_Reference". The conflict occurred in database "Tenant_XXXX", table "planData.p0010_vtr_OutputDistriktsbolag", column 'ReferenceId'.
Eu sei, parece que não estou procurando corretamente, mas realmente não há dados que devam causar a violação de restrição.
Existem duas tabelas principais de interesse dbo.Reference
(tabela pai) e planData.p0010_vtr_OutputDistriktsbolag
(tabela filha). Quando executo este SQL recebo o erro:
begin tran
-- delete the referencing data (several thousand rows)
delete from planData.p0010_vtr_OutputDistriktsbolag
where ReferenceId = 14
-- check it's not there. This returns 0 rows.
select * from planData.p0010_vtr_OutputDistriktsbolag
where ReferenceId = 14
-- But this fails with FK error!?
delete from dbo.Reference
where ReferenceId = 14
As definições de tabela estão mais abaixo, mas dbo.Reference
tem uma chave primária de identidade ReferenceId
e planData.p0010_vtr_OutputDistriktsbolag
tem uma chave estrangeira de sua ReferenceId
coluna para dbo.Reference.ReferenceId
. Até agora nada de estranho.
No entanto, há um total de 404 tabelas semelhantes às planData.p0010_vtr_OutputDistriktsbolag
que também fazem referência ao dbo.Reference.ReferenceId
. Se eu descartar todos eles, exceto planData.p0010_vtr_OutputDistriktsbolag e, em seguida, executar as instruções acima, NÃO OCORRE ERRO! Isso me faz pensar que é um problema como kb4503379 .
Alguns outros pontos:
- Não há outra atividade no banco de dados, isso está sendo executado em um banco de dados de desenvolvimento na minha máquina dev.
- ambas as tabelas são tabelas temporais com versão do sistema com tabelas de histórico geradas pelo servidor. Tentei remover SYSTEM_VERSIONING e isso não pareceu fazer diferença.
- Eu tentei definir o nível de compatibilidade para 130 e isso não pareceu fazer diferença
- Não sei como ver o plano de consulta do meu DELETE que falha, então não consigo verificar se o mesmo problema desse bug do SQL está acontecendo agora. Alguma dica?
- Eu executei um DBCC CHECKDB e ALTER TABLE x REBUILD nas duas tabelas, sem alteração no resultado.
- Como você pode ver, uma tabela está no esquema dbo e a outra no planData.
- Verifiquei novamente se não há outras tabelas com nomes de aparência muito semelhante e nenhuma outra chave estrangeira com nomes de aparência muito semelhante, portanto, não é apenas um problema de confusão de nomes. Ou não um que eu possa ver.
Devo obter atualizações do SQL Server por meio de atualizações do Windows, mas vejo que não estou na versão mais recente, então tentarei corrigir isso agora.
Os scripts de criação de tabela estão abaixo:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Reference](
[ReferenceId] [int] IDENTITY(1,1) NOT NULL,
[PlanId] [int] NOT NULL,
[Name] [nvarchar](100) NOT NULL,
[Description] [nvarchar](max) NULL,
[EditUserId] [nvarchar](100) NOT NULL,
[SysStartTime] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL,
[SysEndTime] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL,
CONSTRAINT [PK_Reference] PRIMARY KEY CLUSTERED
(
[ReferenceId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
WITH
(
SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[Reference_History])
)
GO
ALTER TABLE [dbo].[Reference] WITH CHECK ADD CONSTRAINT [FK_Reference_Plan] FOREIGN KEY([PlanId])
REFERENCES [dbo].[Plan] ([PlanId])
GO
ALTER TABLE [dbo].[Reference] CHECK CONSTRAINT [FK_Reference_Plan]
GO
CREATE TABLE [planData].[p0010_vtr_OutputDistriktsbolag](
[ReferenceId] [int] NOT NULL,
[Id] [int] IDENTITY(1,1) NOT NULL,
[d_Distriktsbolag_Id] [int] NOT NULL,
[d_KontoDistriktsbolagen_Id] [int] NOT NULL,
[d_Period_Id] [int] NOT NULL,
[d_Specifikation_Id] [int] NOT NULL,
[DecimalValue] [decimal](38, 18) NOT NULL,
[EditLogId] [nvarchar](100) NOT NULL,
[SysStartTime] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL,
[SysEndTime] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL,
[ClientRowId] [int] NULL,
CONSTRAINT [PK_p0010_vtr_OutputDistriktsbolag] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
CONSTRAINT [UQ_p0010_vtr_OutputDistriktsbolag_ReferenceAndDimensions] UNIQUE NONCLUSTERED
(
[ReferenceId] ASC,
[d_Distriktsbolag_Id] ASC,
[d_KontoDistriktsbolagen_Id] ASC,
[d_Period_Id] ASC,
[d_Specifikation_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
) ON [PRIMARY]
WITH
(
SYSTEM_VERSIONING = ON (HISTORY_TABLE = [planData].[p0010_hvtr_OutputDistriktsbolag])
)
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] WITH CHECK ADD CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_Distriktsbolag] FOREIGN KEY([d_Distriktsbolag_Id])
REFERENCES [planData].[p0010_d_Distriktsbolag] ([Id])
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] CHECK CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_Distriktsbolag]
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] WITH CHECK ADD CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_KontoDistriktsbolagen] FOREIGN KEY([d_KontoDistriktsbolagen_Id])
REFERENCES [planData].[p0010_d_KontoDistriktsbolagen] ([Id])
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] CHECK CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_KontoDistriktsbolagen]
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] WITH CHECK ADD CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_Period] FOREIGN KEY([d_Period_Id])
REFERENCES [planData].[p0010_d_Period] ([Id])
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] CHECK CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_Period]
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] WITH CHECK ADD CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_Reference] FOREIGN KEY([ReferenceId])
REFERENCES [dbo].[Reference] ([ReferenceId])
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] CHECK CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_Reference]
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] WITH CHECK ADD CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_Specifikation] FOREIGN KEY([d_Specifikation_Id])
REFERENCES [planData].[p0010_d_Specifikation] ([Id])
GO
ALTER TABLE [planData].[p0010_vtr_OutputDistriktsbolag] CHECK CONSTRAINT [FK_p0010_vtr_OutputDistriktsbolag_Specifikation]
GO
Isso parece ser o problema 13607143 , que foi corrigido no SQL Server 2019 CU7
Sob exatamente quais circunstâncias isso é acionado não está claro.
Instalei a atualização cumulativa e a atualização de segurança KB5014353 mais recentes . Agora estou na versão 15.0.4236.7 o problema desapareceu.
Não sei qual é a referência de bug para esse problema específico.