首页 > 解决方案 > VS 数据库项目不断跳过一个表

问题描述

我有一个 Visual Studio (2019) 数据库项目,无论我做什么都会跳过生成表,我不知道为什么。

背景:

我通过从 Azure 中具有现有表结构的 SQL 数据库导入来创建项目。该数据库几乎是一个原型,我将其拉入其中以加快创建“真实”数据库的速度。

然后,我修改了项目中几乎所有的表,应用了一些标准命名约定、索引等。我添加了种子数据文件作为部署后的一部分等。

然后为了准备数据库和测试数据的全新安装测试,我将所有内容都放在 SQL Server 数据库中。

我尝试了什么:

首先,我尝试将数据库项目发布到我新的空数据库。我“生成脚本”,执行脚本(来自 VS)只是发现它正在尝试向不存在的表添加索引。我发誓 Item 表就在那里……果然它在 Project 中。它也将建造。但是查看部署脚本,它没有 Item 表。

我接下来尝试了什么:

快进到我的下一次尝试,忽略数小时的 VS 更新、构建、重建、清理、重新启动等。我继续从我的项目到空数据库进行模式比较,知道它将生成我所有的创建语句,但是不包括我的部署后文件。(我决定以后可以手动运行它们)。与一个空数据库进行比较看起来就像人们期望的那样(模式比较屏幕右侧只有空白)。我生成更新脚本并查看“预览”(摘录如下),我的项目表在那里:

** 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 表再次被省略,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);

有什么建议么?

编辑1:

要添加一些附加信息,我确实在输出脚本中看到有一些 ALTER 指向我的“跳过”表。所以VS清楚地认为该表存在于目标数据库中。由于它没有,我推测目标数据库元数据必须存储/缓存在某处并且它已经过时了。我已经删除了 obj 和 bin 文件夹。任何人都知道这个缓存的目标数据库元数据是否/在哪里?

编辑2:

令人困惑的是,如果我单击“发布”而不是“生成脚本”来神奇地部署数据库,则发布实际上可以工作,创建所有表。但更奇怪的是ProjectName.publish.sql,作为发布的一部分生成的内容就像您选择“生成脚本”一样,因为它在 25 个表中缺少5 个。因此,在发布期间暗中运行的 SQL 命令输出的不同ProjectName.publish.sql

不幸的是,我需要将发布 SQL 文件提供给 DBA 才能“真正”运行,我只能将 VS 直接部署到我的开发数据库。

标签: sql-serverazure-sql-databasevisual-studio-2019database-project

解决方案


推荐阅读