Несколько последних версий 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 Сервером при создании таблицы / ограничения, например:
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, какие имена ограничений должны игнорироваться в Schema Compare. Если вы установите явные имена для PK или по умолчанию, эти различия будут выделены во время сравнения. Однако, если ограничение не указано в проекте и имеет is_system_named = 1
в базе данных, его автоматически сгенерированное имя будет игнорироваться.