精简版
问: SQL 2019 v15.0.2095.3 中是否存在类似kb4503379的 bug。
- 答:是的,似乎是这样。安装v15.0.4236.7,问题就消失了。
原长版
我了解外键和参照完整性,但我遇到了像这个错误这样的问题,即 DELETE 在应该成功时可能会失败。但是,那是针对 SQL 2016 和 2017 的,我在 2019 年。SQL 2019 上是否有类似的错误?我正在使用 SQL 2019 开发人员版 v15.0.2095.3。(剧透:升级修复它)
我的问题是我遇到了这个错误,但是表中没有数据导致冲突。如果我删除其他表,那么问题就会消失,就像上面提到的错误一样。
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'.
我知道,听起来我只是看起来不正确,但实际上没有数据会导致违反约束。
有两个主要的感兴趣的表dbo.Reference
(父表)和planData.p0010_vtr_OutputDistriktsbolag
(子表)。当我运行这个 SQL 时,我得到了错误:
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
表定义在下面进一步,但dbo.Reference
具有标识主键ReferenceId
并且planData.p0010_vtr_OutputDistriktsbolag
具有来自其ReferenceId
列的外键 to dbo.Reference.ReferenceId
。到目前为止没有什么奇怪的。
但是,总共有 404 个类似的表planData.p0010_vtr_OutputDistriktsbolag
也参考dbo.Reference.ReferenceId
。如果我删除除 planData.p0010_vtr_OutputDistriktsbolag 之外的所有这些,然后运行上面的语句,则不会发生错误!这让我觉得这是一个问题,就像kb4503379一样。
其他几点:
- 数据库上没有其他活动,这是在我的开发机器上的开发数据库上运行的。
- 这两个表都是系统版本的时态表,带有服务器生成的历史表。我尝试删除 SYSTEM_VERSIONING ,但这似乎没有什么不同。
- 我尝试将兼容性级别设置为 130,但这似乎没有什么不同
- 我不知道如何查看失败的 DELETE 查询计划,因此我无法检查现在是否正在发生与该 SQL 错误相同的问题。有小费吗?
- 我在两个表上运行了 DBCC CHECKDB 和 ALTER TABLE x REBUILD,结果没有改变。
- 如您所见,一个表在 dbo 模式中,另一个在 planData 中。
- 我已经仔细检查过,没有其他名称看起来非常相似的表,也没有其他名称看起来非常相似的外键,所以这不仅仅是名称混淆问题。或者一个我看不到。
我应该通过 Windows 更新获取 SQL Server 更新,但我发现我不是最新版本,所以现在将尝试修复它。
表创建脚本如下:
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