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

标签 sql-server visual-studio-2010 visual-studio

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

enter image description here

现在,这两个文件的构建操作都设置为构建

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

Primary.sql:

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

Log.sql:

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

当我发布数据项目以创建新数据库时,在幕后会呈现以下 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

但是,当我发布对现有数据库的更改(例如添加一个新表)时,会呈现以下 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');

这不是我想要的,因为 .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

产生以下编译器错误:

Error   200 SQL70001: This statement is not recognized in this context.

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

最佳答案

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

enter image description here

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

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

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

关于sql-server - Visual Studio 2010 数据库项目中的条件文件组文件脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32025392/

相关文章:

c# - 无法从 IIS(内部服务器 500)使用 Visual Studio 2015 运行简单的 ASP.NET MVC 应用程序

sql-server - 如何在azure sql云中调用Web api?支持吗?

c# - 将 CSV 数据批量导入 Microsoft SQL Server Compact Edition 表?

c# - 图表工具在 Visual Studio 中显示为灰色

node.js - 恢复node_modules文件夹

c# - 对路径 'Global\{xxx}_YYY-YYY:13552' 的访问被拒绝。吊火?

sql - 事务中 GO 命令的奇怪行为

mysql - 如何加入我的结果集和第三个表?

visual-studio-2010 - VS2010 总是重新链接项目

c# - 从右到左菜单子(monad)菜单从左到右显示