Проект базы данных SQL Server в Visual Studio - как структурировать новую базу данных - PullRequest
0 голосов
/ 30 июня 2019

Я хочу создать проект базы данных 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

Post-Deployment:

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

Как видно, сценарий создания таблиц не существует в этом сценарии, который используется для публикации. Почему?и это правильный путь для выполнения требования, когда мне нужно создавать таблицы с нуля?

1 Ответ

1 голос
/ 01 июля 2019

Это упрощенные этапы публикации проекта:

  1. Проект построен, и файл DACPAC является результатом этого шага
  2. DACPAC сравнивается с целевой базой данных исценарий публикации генерируется
  3. сценарий публикации выполняется для целевой базы данных

Проблема в вашем случае состоит в том, что во время выполнения 2-го шага таблицы существовали в месте назначениябазы данных, поэтому их создание не было включено в сценарий публикации.Сценарий предварительного развертывания выполняется на шаге 3!

По сути, вам нужно не удалять таблицы.Просто TRUNCATE их в предварительном сценарии и заполнить в посте.Или просто используйте операторы MERGE в пост-скрипте.Вы можете использовать generate-sql-merge процедуру, которая сгенерирует инструкцию MERGE для нужной таблицы.

...