【问题标题】:How to set change tracking on a Visual Studio database project (SSDT)如何在 Visual Studio 数据库项目 (SSDT) 上设置更改跟踪
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这将是一个简单的解决方案,但由于项目是 2005 年,因此未列出此选项。理想情况下,我会将项目切换到 2012 年并执行您的建议。不幸的是,在可预见的情况下,该项目需要在 2005 年进行。
    【解决方案2】:

    正如基思所说,如果你想启用它。如果您确实想禁用它,那么只需在进行比较之前运行您的脚本,这样您就有了一个预部署脚本,例如:

    https://the.agilesql.club/Blog/Ed-Elliott/Pre-Compare-and-Pre-Deploy-Scripts-In-SSDT

    如果你禁用它,那么它就是一件非常简单的事情。

    其他选项是编写您自己的部署贡献者并通过连接提出错误。

    部署贡献者:

    https://the.agilesql.club/blog/Ed-Elliott/2015/09/23/Inside-A-SSDT-Deployment-Contributor

    https://github.com/DacFxDeploymentContributors/Contributors

    埃德

    【讨论】:

    • 这看起来很有用,听起来类似于我开始尝试通过 Octopus PreDeployment 脚本使用的内容。也就是说,在 CI 管道中更早地使用它会让生活更轻松,更不用说更安全了,所以我将更详细地查看这篇文章并尝试复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2011-08-09
    相关资源
    最近更新 更多