sql-server之如何在 Visual Studio 数据库项目 (SSDT) 上设置更改跟踪

程序猿 阅读:19 2024-09-07 23:24:14 评论:0

我有一个 SQL Server 2005 数据库项目,我希望在更高版本的 SQL Server 上的现有数据库上部署架构。我遇到的问题是更改跟踪在我希望部署到的数据库上启用,因此 SSDT 想要做的第一件事是禁用 CT。当我收到以下错误时,这会带来问题:

(43,1): SQL72014: .Net SqlClient Data Provider: Msg 22115, Level 16, State 1, Line 5 Change tracking is enabled for one or more tables in database 'Test'. Disable change tracking on each table before disabling it for the database. Use the sys.change_tracking_tables catalog view to obtain a list of tables for which change tracking is enabled. (39,0): SQL72045: Script execution error. The executed script:

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 试图在执行预部署脚本之前禁用更改跟踪。

请您参考如下方法:

确保在您的数据库项目中启用更改跟踪。

打开数据库项目的属性 > 项目设置 > 数据库设置... > 操作选项卡 > 检查“更改跟踪”选项


标签:数据库
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号