Sql-Server

Visual Studio 數據工具 (SSDT) 架構比較工具似乎無法正常工作

  • June 9, 2021

我最近開始使用 SSDT 架構以及數據和比較工具。多年來,我一直在使用 Red Gate 的 SQL 比較和 SQL 數據比較,但我認為 VS 工具可能就足夠了,我想看看我是否可以忍受它們。在過去的幾個月裡,它們一直執行良好,但今天在比較本地數據庫和 Azure SQL 數據庫之間的架構時,我得到了一個奇怪的結果,我想為 Web 應用程序部署更改。架構比較已將若干列標記為不同,並指示它們將被刪除。實際上,添加了一個新列。但是,其他列中的任何內容都沒有改變。我勾選了“忽略列順序”框,以便不考慮列順序。

這是它的樣子:

在此處輸入圖像描述

只是顏色不對嗎?即使沒有任何變化,它是否會實際刪除 PermitLimit 列並重新創建它?我是否需要設置其他一些設置,以便這些相同的列不會被突出顯示為有差異?

模式比較 UI 有時會在面對這樣的多個更改時有點混亂。您應該使用“生成腳本”按鈕來查看在執行時將進行哪些實際更改。通常,您希望您的測試執行與您實際部署更改的方式盡可能相似。

在您的情況下,導致混淆的組合是:

  • 一些列正在重新排序
  • 一些預設約束正在轉換為命名約束

我可以通過創建此表並在本地部署它來重複您的問題:

CREATE TABLE dbo.TableA
(
   Id int NOT NULL,
   ABitColumn bit NOT NULL DEFAULT ((1)),
   AStringColumn varchar(10) NOT NULL,
   AnIntColumn int NULL,

   CONSTRAINT PK_TableA PRIMARY KEY (Id)
)

現在,我可以更改源文件以重新排序 int 和 string 列,架構比較工具將預設顯示該更改:

CREATE TABLE dbo.TableA
(
   Id int NOT NULL,
   ABitColumn bit NOT NULL DEFAULT ((1)),
   AnIntColumn int NULL,
   AStringColumn varchar(10) NOT NULL,

   CONSTRAINT PK_TableA PRIMARY KEY (Id)
)

SSDT 模式比較的螢幕截圖顯示列將被重新排序

正如您所提到的,我可以使用小齒輪圖示啟用“忽略列順序”設置,然後架構比較顯示沒有任何變化。

已選中“忽略列順序”的架構比較選項視窗的螢幕截圖

如果我然後去給我的預設約束命名:

CREATE TABLE dbo.TableA
(
   Id int NOT NULL,
   ABitColumn bit NOT NULL CONSTRAINT DF_TableA_ABitColumn DEFAULT ((1)),
   AnIntColumn int NULL,
   AStringColumn varchar(10) NOT NULL,

   CONSTRAINT PK_TableA PRIMARY KEY (Id)
)

架構比較顯示列順序更改約束名稱更改,即使我仍然選中了“忽略列順序”:

SSDT 模式比較工具的螢幕截圖,顯示約束和列順序更改

查看實際將進行哪些更改的更可靠方法是點擊工具欄中的“生成腳本”按鈕:

生成腳本按鈕的螢幕截圖,看起來像一張紙

生成的腳本不會刪除並重新添加任何列:

USE [$(DatabaseName)];


GO
PRINT N'Dropping Default Constraint unnamed constraint on [dbo].[TableA]...';


GO
ALTER TABLE [dbo].[TableA] DROP CONSTRAINT [DF__TableA__ABitColu__24927208];


GO
PRINT N'Creating Default Constraint [dbo].[DF_TableA_ABitColumn]...';


GO
ALTER TABLE [dbo].[TableA]
   ADD CONSTRAINT [DF_TableA_ABitColumn] DEFAULT ((1)) FOR [ABitColumn];


GO
PRINT N'Update complete.';

引用自:https://dba.stackexchange.com/questions/293970