0

新しいデータベースが作成される SQL Server データベース プロジェクトを作成したいと考えています。これが私のプロジェクトの構造です:

SQL Server データベース プロジェクトの構造

基本的には 4 つのテーブルが必要なので、4 つ.sqlのスクリプトを追加しました。

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

ご覧のとおり、テーブルの作成スクリプトは、公開に使用されるこのスクリプトにはありません。なぜですか? これは、テーブルを最初から作成する必要がある要件を満たす正しい方法ですか?

4

1 に答える 1

2

これは、プロジェクトを公開する簡単な手順です。

  1. プロジェクトがビルドされ、DACPAC ファイルがこのステップの出力になります
  2. DACPAC が宛先データベースと比較され、発行スクリプトが生成されます
  3. 発行スクリプトは、宛先データベースに対して実行されます

あなたの場合の問題は、2番目のステップが実行された時点でテーブルが宛先データベースに存在していたため、それらの作成が公開スクリプトに含まれていなかったことです。手順 3 でデプロイ前スクリプトが実行されます。

基本的に必要なことは、テーブルをドロップしないことです。プレスクリプトでそれらを TRUNCATE し、投稿に入力するだけです。または、post スクリプトで MERGE ステートメントを使用するだけです。必要なテーブルの MERGE ステートメントを生成するgenerate-sql-mergeプロシージャを使用できます。

于 2019-07-01T06:55:22.350 に答える