【发布时间】:2015-12-02 07:51:58
【问题描述】:
我有一个 SQL Server 2005 数据库项目,并希望将架构部署到更高版本的 SQL Server 上的现有数据库上。我遇到的问题是在我希望部署到的数据库上启用了更改跟踪,因此 SSDT 要做的第一件事就是禁用 CT。当我收到以下错误时,这会造成问题:
(43,1):SQL72014:.Net SqlClient 数据提供者:消息 22115,级别 16, 状态 1,第 5 行 更改跟踪已为中的一个或多个表启用 数据库“测试”。之前禁用每个表上的更改跟踪 为数据库禁用它。使用 sys.change_tracking_tables 目录视图以获取对其进行更改跟踪的表的列表 启用。 (39,0): SQL72045: 脚本执行错误。被执行的 脚本:
IF EXISTS (SELECT 1 FROM [master].[dbo].[sysdatabases] WHERE [name] = N'$(DatabaseName)') BEGIN ALTER DATABASE [$(DatabaseName)] SET CHANGE_TRACKING = OFF WITH ROLLBACK IMMEDIATE; END
为了解决这个问题,我创建了一个 PreDeployment 脚本来执行以下操作:
/* Run pre-deployment scripts to resolve issues */
IF(SELECT SUBSTRING(@@VERSION, 29,4)) = '11.0'
BEGIN
PRINT 'Enabling Change Tracking';
DECLARE @dbname VARCHAR(250)
SELECT @dbname = DB_NAME()
EXEC('
IF NOT EXISTS(SELECT * FROM [master].[dbo].[sysdatabases] WHERE name = ''' + @dbname + ''')
ALTER DATABASE ['+ @dbname +
']SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 5 DAYS, AUTO_CLEANUP = ON);
');
EXEC('
IF NOT EXISTS(SELECT * FROM sys.change_tracking_tables ctt
INNER JOIN sys.tables t ON t.object_id = ctt.object_id
INNER JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE t.name = ''TableName'')
BEGIN
ALTER TABLE [dbo].[TableName] ENABLE CHANGE_TRACKING;
END;');
因此,基于数据库版本更改跟踪设置为在数据库和相关表上启用,假设它尚未启用。我从以前的帖子中得到了这个想法:# ifdef type conditional compilation in T-SQL sql server 2008 2005
不幸的是,这仍然无法正常工作,因为 SSDT 试图在 PreDeployment 脚本执行之前禁用更改跟踪。
【问题讨论】:
标签: sql-server sql-server-data-tools change-tracking