Сравнение схем базы данных Visual Studio 2019 игнорирует имена внешних ключей - PullRequest
0 голосов
/ 08 апреля 2020

Это все относится к SQL Серверу.

Сравнение схем базы данных Visual Studio 2019 игнорирует имена внешних ключей (определение ключей совпадает) при сравнении схемы между базами данных проекта (источник) и фактическая база данных (место назначения). Это не просто регистр, имена внешних ключей совершенно разные, но различий не обнаружено.

Я просмотрел все доступные варианты сравнения схем и не нашел ничего, что не игнорировало бы различия в именах внешних ключей.

Это так и есть? Или я пропустил некоторые варианты?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Несколько последних версий 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 в базе данных, его автоматически сгенерированное имя будет игнорироваться.

0 голосов
/ 10 апреля 2020

Я ценю ответ Роджера Вольфа.

Но сегодня я снова попробовал сравнение схем, и он обнаружил это изменение. Ну да ладно ...

...