我有一个 Visual Studio 2010 数据库项目。在项目内部,我添加了两个存储 -> 文件组文件脚本:一个用于我的主数据文件 (.mdf),另一个用于我的日志文件 (.ldf)。这将在未来得到扩展。
现在,这两个文件的构建操作
都设置为构建
。
每个文件的内容都很简单。我真正创建它们的唯一原因是完全控制它们的文件名。
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
并将您的脚本添加到此文件中:
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/