Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在Visual Studio数据库项目(SSDT)上设置更改跟踪_Sql Server_Sql Server Data Tools_Change Tracking - Fatal编程技术网

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

Sql server 如何在Visual Studio数据库项目(SSDT)上设置更改跟踪,sql-server,sql-server-data-tools,change-tracking,Sql Server,Sql Server Data Tools,Change Tracking,我有一个SQLServer2005DB项目,希望在SQLServer更高版本上的现有DB上部署该模式。我遇到的问题是,在我希望部署到的DB上启用了更改跟踪,因此SSDT想做的第一件事就是禁用CT。这带来了一个问题,因为我得到以下错误: (43,1):SQL72014:.Net SqlClient数据提供程序:Msg 22115,级别16, 状态1中的一个或多个表的第5行更改跟踪已启用 数据库“测试”。在开始之前禁用每个表上的更改跟踪 为数据库禁用它。使用sys.change\u tracking

我有一个SQLServer2005DB项目,希望在SQLServer更高版本上的现有DB上部署该模式。我遇到的问题是,在我希望部署到的DB上启用了更改跟踪,因此SSDT想做的第一件事就是禁用CT。这带来了一个问题,因为我得到以下错误:

(43,1):SQL72014:.Net SqlClient数据提供程序:Msg 22115,级别16, 状态1中的一个或多个表的第5行更改跟踪已启用 数据库“测试”。在开始之前禁用每个表上的更改跟踪 为数据库禁用它。使用sys.change\u tracking\u表 “目录视图”以获取需要更改跟踪的表列表 启用。(39,0):SQL72045:脚本执行错误。被处决的 脚本:

为了解决这个问题,我创建了一个预部署脚本,它执行以下操作:

/* 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;');
因此,基于DB版本更改跟踪在DB和相关表上设置为enabled(已启用),假设尚未启用。我从以前的帖子中得到了这个想法:


不幸的是,这仍然不起作用,因为SSDT正在尝试在执行部署前脚本之前禁用更改跟踪。

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


打开数据库项目的属性>项目设置>数据库设置…>操作选项卡>检查“更改跟踪”选项,如Keith所说,如果您想启用它,请选中该选项。如果确实要禁用它,则只需在执行比较之前运行脚本,这样您就有了一个预部署脚本,如:

如果你要禁用它,那么这是一件非常简单的一次性事情

其他选项是编写自己的部署贡献者,并通过connect引发错误

部署贡献者:


Ed

是的,这将是一个简单的解决方案,但由于该项目是2005年,因此未列出该选项。理想情况下,我会将项目切换到2012年,并执行您的建议。不幸的是,该项目在可预见的时间内需要停留在2005年。这看起来是一个有用的读物,听起来类似于我已经开始尝试通过Octopus部署前脚本使用的内容。这就是说,在CI管道中更早地使用这一功能将使生活更轻松,更不用说更安全,因此我将更详细地查看这篇文章,并尝试复制。
/* 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;');