Visual Studio 2010数据库项目中的条件文件组文件脚本

Joh*_*ell 5 sql-server visual-studio-2010 visual-studio

我有一个Visual Studio 2010数据库项目.在项目内部,我添加了两个存储 - >文件组文件脚本:一个用于我的主数据文件(.mdf),另一个用于我的日志文件(.ldf).这将在未来扩展.

在此输入图像描述

现在,将这两个文件Build Action设置为Build.

每个文件的内容都很简单.我真正创建它们的唯一原因是完全控制它们的文件名.

Primary.sql:

ALTER DATABASE [$(DatabaseName)]
ADD FILE
    (
        NAME = [Primary],
        FILENAME = '$(DefaultDataPath)$(DefaultFilePrefix).mdf'
    );
Run Code Online (Sandbox Code Playgroud)

Log.sql:

ALTER DATABASE [$(DatabaseName)]
    ADD LOG FILE
        (
            NAME = [Log],
            FILENAME = '$(DefaultLogPath)$(DefaultFilePrefix)_Log.ldf'
        );
Run Code Online (Sandbox Code Playgroud)

当我发布我的数据项目以在幕后创建新数据库时,将呈现以下TSQL/SQLCMD.这正是我想要的:

PRINT N'Creating $(DatabaseName)...'
GO
CREATE DATABASE [$(DatabaseName)]
    ON 
    PRIMARY(NAME = [Primary], FILENAME = '$(DefaultDataPath)$(DefaultFilePrefix).mdf')
    LOG ON (NAME = [Log], FILENAME = '$(DefaultLogPath)$(DefaultFilePrefix)_Log.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS
GO
Run Code Online (Sandbox Code Playgroud)

但是,当我将更改发布到现有数据库时(例如,我添加了一个新表),将呈现以下TSQL/SQLCMD:

PRINT N'Creating [Primary]...';
GO
ALTER DATABASE [$(DatabaseName)]
    ADD FILE (NAME = [Primary], FILENAME = '$(DefaultDataPath)$(DefaultFilePrefix).mdf') TO FILEGROUP [PRIMARY];
GO
PRINT N'Creating [Log]...';
GO
ALTER DATABASE [$(DatabaseName)]
    ADD LOG FILE (NAME = [Log], FILENAME = '$(DefaultLogPath)$(DefaultFilePrefix)_Log.ldf');
Run Code Online (Sandbox Code Playgroud)

这不是我想要的,因为.mdf文件和.ldf文件已经存在.如何修改我的存储脚本,以便它们在两种情况下都很好:创建新数据库和更新现有数据库?

有任何想法吗?

更新8/18

我想我可以简单地将存储脚本包装在IF/EXISTS类型检查中.如果文件已存在,请不要执行任何操作.这似乎不起作用.它实际上阻止了解决方案的完全构建:

所以类似于:

IF(EXISTS(SELECT TOP(1) 1 FROM sys.master_files as mf WHERE DB_NAME(mf.[database_id]) = [$(DatabaseName)] AND name = '[Primary]'))
BEGIN
ALTER DATABASE [$(DatabaseName)]
    ADD FILE
        (
            ...
        );
END
Run Code Online (Sandbox Code Playgroud)

产生以下编译器错误:

Error   200 SQL70001: This statement is not recognized in this context.
Run Code Online (Sandbox Code Playgroud)

这些脚本在幕后处理的方式(新数据库与更新)让我觉得它们不能有条件.

Bac*_*cks 0

创建1个sql文件,将构建操作设置为PreDeploy

在此输入图像描述

并将您的脚本添加到此文件中:

IF(EXISTS(SELECT TOP(1) 1 FROM sys.master_files as mf WHERE DB_NAME(mf.[database_id]) = '[$(DatabaseName)]' AND name = '[Primary]'))
BEGIN

ALTER DATABASE [$(DatabaseName)]
ADD FILE
    (
        NAME = [Primary],
        FILENAME = '$(DefaultDataPath)$(DefaultFilePrefix).mdf'
    );

ALTER DATABASE [$(DatabaseName)]
    ADD LOG FILE
        (
            NAME = [Log],
            FILENAME = '$(DefaultLogPath)$(DefaultFilePrefix)_Log.ldf'
        );

END
Run Code Online (Sandbox Code Playgroud)

该文件将在每次部署时执行并检查数据库是否存在。但是你只有一个 PreDeploy 文件,因此,任何 srcips 都应该添加到该文件中,但这不是一个大问题