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)
这些脚本在幕后处理的方式(新数据库与更新)让我觉得它们不能有条件.
创建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 都应该添加到该文件中,但这不是一个大问题
| 归档时间: |
|
| 查看次数: |
707 次 |
| 最近记录: |