У меня есть проект базы данных Visual Studio (2019), который пропускает создание таблицы независимо от того, что я делаю, и я не могу понять, почему.
Фон:
Я создал проект, импортировав его из базы данных SQL в Azure с существующей структурой таблиц. База данных была в значительной степени прототипом, и я потянул ее, чтобы ускорить создание «настоящей» базы данных.
Затем я модифицировал почти все таблицы в проекте, применяя некоторые стандартные соглашения об именах, индексы,и т. д. Я добавил исходные файлы данных как часть Post Deployment и т. д.
Затем, чтобы подготовиться к тесту чистой установки базы данных и тестовых данных, я отбрасываю все в базу данных SQL Server.
То, что я пробовал:
Сначала я попытался опубликовать проект базы данных в моей новой пустой базе данных. Я «Создать сценарий», выполнить сценарий (из VS) только, чтобы обнаружить, что он пытается добавить индекс в таблицу, которая не существует. Клянусь, таблица Предметов есть ... и, конечно же, она есть в Проекте. Он тоже собирается строить. Но, глядя на сценарий развертывания, у него нет таблицы Item.
То, что я попробовал дальше:
Перемотка вперед к моей следующей попытке, игнорируя часы обновлений VS, сборки, перестройки, очистки, перезапуска и т. Д. Я перехожу насравнивая схему из моего проекта с пустой базой данных, я знаю, что она сгенерирует все мои операторы create, но не включит мои файлы после развертывания. (Я решил, что смогу запустить их позже). Сравнение с пустой базой данных выглядит так, как и следовало ожидать (ничего, кроме пробелов в правой части экрана сравнения схем). Я генерирую скрипт обновления и смотрю «Предварительный просмотр» (отрывок ниже), и моя таблица элементов там:
** Highlights
Tables that will be rebuilt
None
Clustered indexes that will be dropped
None
Clustered indexes that will be created
None
Possible data issues
None
** User actions
Create
[db_executor] (Role)
[dbo].[ApiKey] (Table)
[dbo].[AppLog] (Table)
[dbo].[AppLog].[IX_AppLog_SessionId] (Index)
[dbo].[Customer] (Table)
[dbo].[Customer].[IX_Customer_ExternalId] (Index)
[dbo].[Customer].[IX_Customer_OrganizationId] (Index)
[dbo].[Customer].[UX_Customer_Name] (Index)
[dbo].[CustomerDepartment] (Table)
[dbo].[CustomerDepartment].[IX_CustomerDepartment_DepartmentId] (Index)
[dbo].[CustomerSetting] (Table)
[dbo].[CustomerSetting].[IX_CustomerSetting_SettingId] (Index)
[dbo].[Department] (Table)
[dbo].[Department].[IX_Department_ExternalId] (Index)
[dbo].[Department].[UX_Department_Code] (Index)
[dbo].[ImageResource] (Table)
[dbo].[Item] (Table)
[dbo].[Item].[IX_Item_UPC] (Index)
<snip>
Далее я смотрю на сгенерированный сценарий SQL и обнаруживаю, что моя таблица элементов снова опущена,с индексом Item, появляющимся сразу после таблицы ImageResource, создайте:
PRINT N'Creating [dbo].[ImageResource]...';
GO
CREATE TABLE [dbo].[ImageResource] (
[ImageResourceId] INT IDENTITY (1, 1) NOT NULL,
[URL] NVARCHAR (2048) NULL,
[ContentType] NVARCHAR (128) NOT NULL,
[Width] INT NULL,
[Height] INT NULL,
[IsActive] BIT NOT NULL,
[Created] DATETIME2 (7) NOT NULL,
[CreatedBy] NVARCHAR (128) NOT NULL,
[Modified] DATETIME2 (7) NULL,
[ModifiedBy] NVARCHAR (128) NULL,
CONSTRAINT [PK_ImageResource] PRIMARY KEY CLUSTERED ([ImageResourceId] ASC)
);
GO
PRINT N'Creating [dbo].[Item].[IX_Item_UPC]...';
GO
CREATE NONCLUSTERED INDEX [IX_Item_UPC]
ON [dbo].[Item]([UPC] ASC);
Есть предложения?
EDIT1:
Чтобы добавить дополнительную информациюЯ вижу в выходном скрипте, что есть несколько ALTERS, которые указывают на мои «пропущенные» таблицы. Таким образом, VS ясно считает, что таблица существует в целевой БД. Поскольку это не так, я предполагаю, что метаданные целевой базы данных должны где-то храниться / кэшироваться и что они устарели. Я удалил папки obj и bin. Кто-нибудь знает, если / где могут быть метаданные этой кешированной целевой БД?
EDIT2:
Так запутанно, если я нажму «Опубликовать» вместо «Создать сценарий», чтобы волшебным образомразверните базу данных, в которой действительно работает публикация, создав все таблицы. Но что еще более странно, это то, что ProjectName.publish.sql
, который генерируется как часть публикации, похож на тот, который создается, когда вы выбираете «Создать сценарий», поскольку в нем отсутствует 5 из 25 таблиц. ,Таким образом, команды SQL, которые выполняются скрытно во время публикации, , а не , совпадают с ProjectName.publish.sql
, который выводится.
К сожалению, мне нужен файл SQL публикации, чтобы датьчтобы администратор баз данных работал «по-настоящему», я могу выполнить только прямое развертывание VS в моей базе данных dev.