这一切都与SQL Server有关。
Visual Studio 2019数据库架构比较在比较数据库项目(源(和实际数据库(目标(之间的架构时忽略外键名(键的定义相同(。不仅仅是大小写,外键名称完全不同,但没有检测到差异。
我浏览了所有可用的模式比较选项,没有发现任何可以忽略外键名称差异的内容。
事情就是这样吗?还是我错过了一些选择?
SSDT的几个最新版本忽略了系统命名约束的名称,并且AFAIK是不可配置的。假设您的数据库项目有一个表定义,如下所示:
CREATE TABLE [dbo].[Lookups] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[LookupType] VARCHAR (50) NOT NULL,
[Value] [sysname] NOT NULL,
[IsActive] BIT DEFAULT ((1)) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [UQ_Lookups_NK] UNIQUE NONCLUSTERED ([LookupType] ASC, [Value] ASC)
);
如您所见,该表有2个未命名的约束(PK和IsActive
列上的默认约束(,以及一个明确指定名称的唯一键。现在,如果您查看元数据,对于密钥,它将是
select c.name, c.type_desc, c.is_system_named
from sys.key_constraints c
where c.parent_object_id = object_id('dbo.Lookups');
当然,它们都有名称,但有些会在创建表/约束时由SQL Server自动命名,例如:
name type_desc is_system_named
-------------------------------- ----------------------- ---------------
PK__Lookups__3214EC076C07A41D PRIMARY_KEY_CONSTRAINT 1
UQ_Lookups_NK UNIQUE_CONSTRAINT 0
-- This row actually comes from sys.default_constraints
DF__Lookups__IsActiv__24927208 DEFAULT_CONSTRAINT 1
注意is_system_named
列,它告诉SSDT架构比较应忽略哪些约束的名称。如果为PK或默认设置了显式名称,则在比较过程中会突出显示这些差异。但是,如果约束在项目中未命名,并且数据库中有is_system_named = 1
,则其自动生成的名称将被忽略。