Visual Studio中的SQL Server数据库项目-如何构建新数据库

GameFromScratch

我想创建一个在其中创建新数据库的SQL Server数据库项目。这是我的项目的结构:

SQL Server数据库项目结构

基本上,我想要4个表,所以我.sql为它们添加了4个脚本。

CREATE TABLE [dbo].[MovieActors]
(
    [Id] INT NOT NULL PRIMARY KEY,
    [ActorID] INT NOT NULL,
    [MovieID] INT NOT NULL
)

CREATE TABLE [dbo].[Actors]
(
    [Id] INT NOT NULL PRIMARY KEY, 
    [Name] NVARCHAR(50) NOT NULL, 
    [Bio] NVARCHAR(MAX) NULL, 
    [Sex] NCHAR(10) NOT NULL, 
    [DOB] DATE NULL
)

CREATE TABLE [dbo].[Movies]
(
    [Id] INT NOT NULL PRIMARY KEY, 
    [Name] NVARCHAR(50) NOT NULL, 
    [Year of Release] SMALLINT NULL, 
    [PLOT] NVARCHAR(MAX) NULL, 
    [Poster] NVARCHAR(MAX) NULL,
    [ProducerId] int FOREIGN KEY REFERENCES Producers(Id)
)

CREATE TABLE [dbo].[Producers]
(
    [Id] INT NOT NULL PRIMARY KEY, 
    [Name] NVARCHAR(50) NOT NULL, 
    [Bio] NVARCHAR(MAX) NULL, 
    [Sex] NCHAR(10) NULL, 
    [DOB] DATE NULL
)

而且我还添加了部署前(用于删除现有数据)和部署后脚本(用于播种初始数据)。

预部署:

DROP TABLE [dbo].MovieActors
DROP TABLE [dbo].Movies
DROP TABLE dbo.Actors
DROP TABLE dbo.Producers

部署后:

INSERT INTO dbo.Actors (Id, Name, Sex)
VALUES (1, 'Actor1', 'MALE')

INSERT INTO dbo.Producers (Id, Name, Sex)
VALUES (1, 'Producer1', 'MALE')

INSERT INTO dbo.Movies (Id, Name, ProducerId)
VALUES (1, 'Movie1', 1)

INSERT INTO dbo.MovieActors (Id, MovieID, ActorID)
VALUES (1, 1, 1)
  1. 但是每次我构建项目时,它都不会部署-仅显示构建成功
  2. 此外,数据库创建脚本在哪里。
  3. 当我右键单击“发布并选择生成脚本的选项”时,只有前部署脚本和后部署脚本位于主脚本中。--

右键单击项目->发布选项

这是生成的脚本-

/*
Deployment script for MoviesDatabase

This code was generated by a tool.
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
*/

GO
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;

SET NUMERIC_ROUNDABORT OFF;


GO
:setvar DatabaseName "MoviesDatabase"
:setvar DefaultFilePrefix "MoviesDatabase"
:setvar DefaultDataPath "C:\Users\viiye\AppData\Local\Microsoft\VisualStudio\SSDT"
:setvar DefaultLogPath "C:\Users\viiye\AppData\Local\Microsoft\VisualStudio\SSDT"

GO
:on error exit
GO
/*
Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported.
To re-enable the script after enabling SQLCMD mode, execute the following:
SET NOEXEC OFF; 
*/
:setvar __IsSqlCmdEnabled "True"
GO
IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
    BEGIN
        PRINT N'SQLCMD mode must be enabled to successfully execute this script.';
        SET NOEXEC ON;
    END


GO
USE [$(DatabaseName)];


GO
/*
 Pre-Deployment Script Template                         
--------------------------------------------------------------------------------------
 This file contains SQL statements that will be executed before the build script.   
 Use SQLCMD syntax to include a file in the pre-deployment script.          
 Example:      :r .\myfile.sql                              
 Use SQLCMD syntax to reference a variable in the pre-deployment script.        
 Example:      :setvar TableName MyTable                            
               SELECT * FROM [$(TableName)]                 
--------------------------------------------------------------------------------------
*/
Drop table [dbo].MovieActors
Drop table [dbo].Movies
Drop table dbo.Actors
Drop table dbo.Producers
GO

GO
/*
Post-Deployment Script Template                         
--------------------------------------------------------------------------------------
 This file contains SQL statements that will be appended to the build script.       
 Use SQLCMD syntax to include a file in the post-deployment script.         
 Example:      :r .\myfile.sql                              
 Use SQLCMD syntax to reference a variable in the post-deployment script.       
 Example:      :setvar TableName MyTable                            
               SELECT * FROM [$(TableName)]                 
--------------------------------------------------------------------------------------
*/
INSERT INTO dbo.Actors (Id,Name,Sex)
values (1,'Actor1','MALE')

INSERT INTO dbo.Producers (Id,Name,Sex)
values (1,'Producer1','MALE')

INSERT INTO dbo.Movies (Id,Name,ProducerId)
values (1,'Movie1',1)

Insert into dbo.MovieActors (Id,MovieID,ActorID)
values (1,1,1)

GO

GO
PRINT N'Update complete.';


GO

可以看出,在用于发布的脚本中没有创建表脚本。为什么?这是实现需要从头开始创建表的要求的正确方法吗?

德米特里·库尔塔舍夫(Dmitry Kultasev)

这是项目发布的简化步骤:

  1. 已构建项目,此步骤的输出是DACPAC文件
  2. 将DACPAC与目标数据库进行比较,并生成发布脚本
  3. 针对目标数据库执行发布脚本

您遇到的问题是,在执行第二步时,表存在于目标数据库中,因此它们的创建未包括在发布脚本中。在步骤3中执行预部署脚本!

基本上,您不需要做的就是删除表。只需在预脚本中将其截断并在帖子中填充即可。或者只是在发布脚本中使用MERGE语句。您可以使用generate-sql-merge过程为所需表生成MERGE语句。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Visual Studio 2013中创建SQL Server数据库项目?

如何在 Visual Studio 2019 中将表和数据导入 SQL Server 数据库项目

如何在Visual Studio中的动态SQL中为SQL Server项目使用数据库变量名?

如何在Visual Studio中设置SQL数据库项目中的数据库连接字符串?

Visual Studio 2013 SQL Server数据库项目生成失败

如何向现有的Visual Studio数据库项目中添加新的架构?

Visual Studio数据库项目在脚本中参数化数据库名称

Visual Studio Team Services构建失败-Azure SQL的数据库项目

如何在Visual Studio 2015中为SQL Server创建数据库图?

如何在 Visual Studio (C#) 中将 ASP.NET 项目与 SQL Server 数据库表连接

在Ubuntu中构建SQL Server数据库项目

如何从 Visual Studio / SQL Server Data Tools 部署包含的 SQL Server 数据库?

我已经无法在Visual Studio Express for Web上创建新的SQL Server数据库选项

Visual Studio数据库项目中的版本更新

Visual Studio 2013:数据库项目MSBuild错误

无法将C#SQL CLR数据库项目从Visual Studio 2010部署到SQL Server 2014

如何在VS 2015中发布Visual Studio数据库项目

如何在Visual Studio中连接Oracle数据库

如何从 Visual Studio 中的网页访问数据库?

如何在Visual Studio 2010(基于服务的数据库)中添加新表?

在Microsoft Visual Studio 2017中创建SQL Server Compact Edition数据库文件

使用AT TIME ZONE时无法建立针对Azure SQL数据库的Visual Studio数据库项目

如何使用SQL Server 2008数据库为我的Visual Basic项目创建安装程序?

Visual Studio 2015 SQL Server项目。管理具有对多个数据库的引用的链接服务器

如何使用Visual Studio 2013连接到asp.net中的本地SQL Server数据库?

如何在Visual Studio-2010中的运行时刷新SQL Server数据库表?

存储新数据库后如何删除大数据库中的行(SQL Server)

在 Visual Basic 中创建更改密码表单。如何更新 SQL Server 数据库?

如何将数据库的子集导入Visual Studio 2013项目