2015-12-02 66 views
2

我有一個SQL Server 2005數據庫項目,並且希望將此模式部署到SQL Server更高版本上的現有數據庫。我遇到的問題是,在我希望部署的數據庫上啓用更改跟蹤功能,因此SSDT想要執行的第一件事是禁用CT。我得到下面的錯誤這就提出了一個問題:如何在Visual Studio數據庫項目(SSDT)上設置更改跟蹤

(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 

在努力解決這個問題我已經創建了執行以下部署前的腳本:

/* 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腳本執行之前禁用更改跟蹤。

回答

3

確保您的數據庫項目中啓用了更改跟蹤。

項目屬性>項目設置>數據庫設置...>操作選項卡>選中「更改跟蹤」選項

+0

是啊,這將是簡單的解決方案,但由於該項目是2005年,這一選項不會列出。理想情況下,我會將該項目切換到2012年並執行您的建議。不幸的是,項目需要保持2005年的可預見性。 – SQuirellingAlong

0

正如基斯說,如果你想在啓用它。如果你想禁用它,然後做比較,讓你擁有前預先部署腳本像以前一樣只是運行腳本:

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

如果要禁用它,然後它是一次性的事情,所以很簡單。

其他選項是編寫自己的部署貢獻者並通過連接引發bug。

部署貢獻者:

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

https://github.com/DacFxDeploymentContributors/Contributors

埃德

+0

這看起來很有用,讀音和聽起來類似於我通過Octopus PreDeployment腳本嘗試使用的內容。也就是說,在CI管線中早些時候會讓生活更輕鬆,更不用說更安全了,所以我會更詳細地查看該帖子並嘗試複製。 – SQuirellingAlong

相關問題