教學:將資料庫結構儲存在 Git 中

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Microsoft Fabric 中的 SQL 資料庫

將資料庫結構儲存在 Git 中帶來多項好處,包括版本控制、協作,以及追蹤變更隨時間的便利。 這種方法特別適用於以程式碼為先的開發,透過程式碼定義資料庫架構,並透過 ORM 或像 GitHub Copilot 這類程式代理程式直接將變更套用到開發環境中。

在這個教學中,你會學習如何在 Git 中儲存資料庫結構,並將其作為開發工作流程的一部分來管理。

  • 從現有資料庫建立新的 SQL 專案
  • 將資料庫程式碼提交並推送到 Git 遠端儲存庫
  • 將資料庫的變更套用到現有程式碼
  • 從 Git 遠端儲存庫拉取變更並套用到本地資料庫(可選)

示範教學資訊流程的示意圖。

完成後,你就能在原始碼控制中追蹤資料庫,並透過 Git 倉庫與團隊協作進行資料庫變更。

Note

要完成教學,你需要存取 SQL 資料庫。 你可以在 Windows 上使用 SQL Server 開發者版,或在容器中免費本地開發。

先決條件

Warning

這個教學在 Visual Studio 2022 的 SDK 風格專案(預覽版)中無法提供。 建議改用 SQL Server Management Studio(SSMS)或 Visual Studio Code。

# install SqlPackage CLI
dotnet tool install -g Microsoft.SqlPackage

# install Microsoft.Build.Sql.Templates
dotnet new install Microsoft.Build.Sql.Templates

步驟 1:從現有資料庫建立新的 SQL 專案

若要在原始碼控制中表示你的資料庫,請使用 SQL 資料庫專案 格式。 專案包含每個資料庫物件的 .sql 檔案,以及包含資料庫設定的 .sqlproj。 當你在檔案總管和原始碼控制中查看專案時,SQL 專案的結構會像在物件總管中瀏覽資料庫一樣。

在 Visual Studio 的 SQL Server 物件總管,右鍵點擊你想建立project的資料庫,選擇 建立新 Project...

Visual Studio 中 [匯入資料庫] 對話方塊的螢幕擷取畫面。

Create New Project 對話框中,輸入一個project名稱。 專案名稱不需要和資料庫名稱相符。 視需要驗證並修改專案位置。 預設匯入設定會依結構描述將物件匯入資料夾,然後再依物件類型匯入。 您可以修改匯入設定來變更資料夾結構,或將權限包含在要匯入的物件中。 啟動匯入。

匯入資料庫對話框會以訊息形式顯示匯入進度。 匯入完成後,你可以在 方案總管 看到匯入的物件。 該程序會將日誌儲存在專案目錄中的 Import Schema Logs檔案中。 選取 完成

Warning

這個教學在 Visual Studio 2022 的 SDK 風格專案(預覽版)中無法提供。 建議改用 SQL Server Management Studio(SSMS)或 Visual Studio Code。

在 Visual Studio Code 的資料庫物件總管檢視中,選擇你想建立專案的資料庫。 在資料庫上按右鍵,選擇從資料庫建立專案

Visual Studio Code 中從資料庫對話框中建立專案的截圖。

在 Visual Studio Code 中,從 database 創建專案對話框需要專案名稱與地點。 預設匯入設定會依結構描述將物件匯入資料夾,然後再依物件類型匯入。 你可以選擇不同的資料夾結構,或 在選擇建立前,先在匯入物件中加入權限。

開啟 [資料庫專案] 檢視,以查看新的專案和匯入的物件定義。

在 SQL Server Management Studio 的 物件總管 中,右鍵點擊你想建立 project 的資料庫,然後在任務選單中選擇「從資料庫建立 Project」......。

SQL Server Management Studio 資料庫對話框中新 SQL Project 的截圖。

「從資料庫建立 SQL Project」對話框中,驗證所選資料庫,並視需要修改 project 名稱與位置。 新專案會用所選資料庫的物件建立,並依照結構和物件類型排列在資料夾中。

解決方案檔案會自動建立在專案資料夾上方的資料夾,並在建立後於 方案總管 開啟。 如果你想將新專案加入現有解決方案,請選擇 「加入解決方案 」並瀏覽解決方案檔案。 選取 [建立] 以建立專案。

使用 SqlPackage CLI 將現有資料庫的結構擷取到 SQL 專案。 以下 SqlPackage 指令將資料庫的結構擷取成完整的 SQL 專案。 檔案 .sql 依巢狀結構與物件類型資料夾組織,並 .sqlproj 建立一個管理專案的檔案,屬性設定與資料庫選項相符。

sqlpackage /a:Extract /ssn:localhost /sdn:MyDatabase /tf:MyDatabaseProject /p:ExtractTarget=SqlProject

步驟 2:將資料庫程式碼提交並推送到 Git 遠端儲存庫

建立 SQL 專案後,在本地 Git 倉庫中啟動資料庫的 Git 時間軸。

在 Visual Studio 開啟 SQL 專案後,建立本地 Git 倉庫並推送到遠端。

  1. 從選單列選擇 Git>建立 Git 儲存庫

  2. 「建立 Git 儲存庫」 對話方塊中,於 「推送到新的遠端」 區段下,選擇 GitHubAzure DevOps 其中之一。 如果你選擇推送到 GitHub,請在提示時登入你的 GitHub 帳號。 如果你選擇 Azure DevOps,請登入你的 Azure DevOps 帳號,選擇或建立一個專案。

  3. 輸入儲存庫名稱與描述。 確保 .gitignore 範本 設定為 VisualStudio ,並選擇 建立並推送

Visual Studio 會建立本地的 Git 倉庫,先用你的 SQL 專案檔案提交,然後推送到遠端。

要確認程式碼是否成功推送,請開啟瀏覽器並前往你的 GitHub() 或https://github.com Azure DevOpshttps://dev.azure.com() 的儲存庫。 你應該會看到 SQL 專案檔案,包括檔案和.sqlproj.sql物件定義。

欲了解更多資訊,請參閱 Visual Studio 中的 Git

Warning

這個教學在 Visual Studio 2022 的 SDK 風格專案(預覽版)中無法提供。 建議改用 SQL Server Management Studio(SSMS)或 Visual Studio Code。

在 Visual Studio Code 中開啟 SQL 專案資料夾,初始化本地的 Git 儲存庫並推送到遠端。

  1. 在活動欄中選擇來源控制圖示,或按 .,開啟Ctrl+Shift+G檢視。

  2. 選擇 初始化儲存庫 ,在目前資料夾中建立新的 Git 儲存庫。

  3. 所有專案檔案都顯示為未追蹤變更。 選取 +變更 旁邊的圖示,以暫存所有檔案。

  4. 輸入提交訊息,例如 Initial commit of SQL project 訊息輸入框,並選擇 提交 按鈕(勾選圖示)。

  5. 在 Source Control 檢視中選擇 發佈分支 ,將你的本地儲存庫推送到遠端。 選擇要發佈到 GitHubAzure DevOps,並依照登入提示操作。 選擇一個儲存庫可見性(公開或私有)並確認。

要確認程式碼是否成功推送,請開啟瀏覽器並前往你的 GitHub() 或https://github.com Azure DevOpshttps://dev.azure.com() 的儲存庫。 你應該會看到 SQL 專案檔案,包括檔案和.sqlproj.sql物件定義。

欲了解更多資訊,請參閱 Visual Studio Code 中的原始碼控制

在 SQL Server Management Studio 開啟 SQL 專案後,建立本地 Git 倉庫並推送到遠端。

  1. 從選單列選擇 Git>建立 Git 儲存庫

  2. 「建立 Git 儲存庫」 對話方塊中,於 推送到新的遠端 區段下,選擇 GitHubAzure DevOps。 如果你選擇推送到 GitHub,請在提示時登入你的 GitHub 帳號。 如果你選擇 Azure DevOps,請登入你的 Azure DevOps 帳號,選擇或建立一個專案。

  3. 輸入儲存庫名稱與描述。 確保 .gitignore 範本 設定為 VisualStudio ,並選擇 建立並推送

SSMS 會建立本地的 Git 倉庫,先用你的 SQL 專案檔案提交,然後推送到遠端。

要確認程式碼是否成功推送,請開啟瀏覽器並前往你的 GitHub() 或https://github.com Azure DevOpshttps://dev.azure.com() 的儲存庫。 你應該會看到 SQL 專案檔案,包括檔案和.sqlproj.sql物件定義。

欲了解更多資訊,請參閱 Visual Studio 中的 Git

從 SQL 專案目錄初始化本地 Git 儲存庫,提交所有檔案,然後推送到遠端。

  1. 初始化一個新的 Git 儲存庫,新增檔案 .gitignore ,並進行初始提交:

    cd MyDatabaseProject
    git init
    dotnet new gitignore
    git add .
    git commit -m "Initial commit of SQL project"
    
  2. 在 GitHub 或 Azure DevOps 建立新的遠端儲存庫:

    • GitHub:前往https://github.com/new並建立一個新的儲存庫。 不要用 README .gitignore或授權來初始化。
    • Azure DevOps:前往你的 Azure DevOps 專案,選擇 Repos,並建立一個新的倉庫。 取消勾選 新增 README
  3. 新增遙控器並推送你的初始提交:

    git remote add origin <your-repository-url>
    git push -u origin main
    

    請將 <your-repository-url> 替換為你在建立存放庫時 GitHub 或 Azure DevOps 提供的網址。

要確認程式碼是否成功推送,請開啟瀏覽器並進入你的儲存庫。 你應該會看到 SQL 專案檔案,包括檔案和.sqlproj.sql物件定義。

步驟 3:將資料庫中的變更套用到現有程式碼

當資料庫結構在 SQL 專案之外發生變動(例如直接修改資料庫、ORM 遷移或代理動作),你可以更新專案以反映這些變更。

使用 schema compare 從資料庫更新 SQL 專案。

  1. SQL Server 物件總管中,右鍵點擊資料庫並選擇「結構比較」。

  2. 結構比較 視窗中,資料庫被設定為來源。 選擇 「選擇目標 」下拉選單,並選擇 「選擇目標」。

  3. 「選擇目標結構」對話框中,選擇 Project,並選擇你的 SQL 資料庫 project。 請選擇 [確定]

  4. 選擇 「比較 」以執行比較。 結果顯示資料庫(來源)與專案(目標)之間的差異。

  5. 檢視差異。 取消勾選任何你不想套用到專案的變更。

  6. 選擇 更新 以套用所選變更至SQL專案。

專案檔案會更新以符合資料庫結構。 在 Git 變更 視窗中檢視變更,輸入提交訊息,並選擇 全部提交。 選擇 推送 將變更推送到遠端儲存庫。

Warning

這個教學在 Visual Studio 2022 的 SDK 風格專案(預覽版)中無法提供。 建議改用 SQL Server Management Studio(SSMS)或 Visual Studio Code。

使用 Update Project from Database 指令來從資料庫更新 SQL 的 project。

  1. 在資料庫物件總管中,以滑鼠右鍵按一下資料庫,然後選取 SQL 資料庫專案>從資料庫更新專案

  2. 選擇 SQL 資料庫專案來更新並確認。

  3. 系統會進行比較,並將資料庫中的變更套用至專案。 更新後 .sql 的檔案會以修改後的檔案形式出現在 原始碼控制 檢視中。

原始碼控制 檢視中檢視變更,先處理修改過的檔案,輸入提交訊息,然後選擇 提交。 選擇 同步變更 以將提交推送到遠端儲存庫。

使用 schema compare 從資料庫更新 SQL 專案。

  1. 物件總管 中,右鍵點擊資料庫並選擇「任務>結構比較(預覽)」。

  2. 結構比較 視窗中,資料庫被設定為來源。 選擇目標省略號按鈕,並選擇你的 SQL 資料庫專案作為目標。

  3. 選擇 「比較 」以執行比較。 結果顯示資料庫(來源)與專案(目標)之間的差異。

  4. 檢視差異。 取消勾選任何你不想套用到專案的變更。

  5. 選擇 「套用 」以將所選變更套用到 SQL 專案。

專案檔案會更新以符合資料庫結構。 在 Git 變更 視窗中檢視變更,輸入提交訊息,並選擇 全部提交。 選擇 推送 將變更推送到遠端儲存庫。

使用 SqlPackage 從資料庫重新產生 SQL 專案,將現有專案檔案替換為目前的資料庫結構。 其他 SQL 專案工具提供圖形介面,而 SqlPackage 則採用命令列自動化方式,且無法在套用檔案變更前檢視檔案變更。

  1. 移除現有的 SQL 物件檔案並重新產生專案:

    rm -rf MyDatabaseProject
    sqlpackage /a:Extract /ssn:localhost /sdn:MyDatabase /tf:MyDatabaseProject /p:ExtractTarget=SqlProject
    
  2. 用 Git 檢視變更並提交:

    cd MyDatabaseProject
    dotnet new gitignore
    git add .
    git status
    git commit -m "Update project from database changes"
    git push
    

步驟 4:(可選)從 Git 遠端儲存庫擷取變更並套用到本地資料庫

當其他團隊成員將資料庫架構變更推送到遠端儲存庫時,你可以將這些變更拉取並部署到本地開發資料庫。

  1. 從選單列選擇 Git>Pull ,從遠端儲存庫拉取最新的變更。

  2. 方案總管 中,右鍵點擊 SQL 資料庫專案節點,選擇 Schema Compare

  3. 結構比較 視窗中,專案被設定為原始碼。 選擇 「選擇目標 」下拉選單,並選擇 「選擇目標」。

  4. 「選擇目標結構 」對話框中,選擇 資料庫 並選擇你所在的開發資料庫連線。 請選擇 [確定]

  5. 選擇 「比較 」以執行比較。 結果顯示專案(來源)與資料庫(目標)之間的差異。

  6. 請檢視差異,確認變更是否預期中。

  7. 選擇 更新 以套用變更至資料庫。

Warning

這個教學在 Visual Studio 2022 的 SDK 風格專案(預覽版)中無法提供。 建議改用 SQL Server Management Studio(SSMS)或 Visual Studio Code。

  1. 打開原始碼控制檢視,從......選單中選擇「拉取」(或使用狀態列中的同步按鈕),從遠端儲存庫拉取最新變更。

  2. 資料庫專案 檢視中,右鍵點擊 SQL 資料庫專案並選擇結構 比較

  3. 結構比較 視窗中,專案被設定為原始碼。 選擇目標省略號按鈕,並選擇你所在的開發資料庫連線作為目標。

  4. 選擇 「比較 」以執行比較。 結果顯示專案(來源)與資料庫(目標)之間的差異。

  5. 請檢視差異,確認變更是否預期中。

  6. 選擇 「應用」 以套用變更至資料庫。

  1. 開啟終端機,在專案目錄中執行 git pull ,從遠端儲存庫拉取最新的變更。

  2. 方案總管 中,右鍵點擊 SQL 資料庫專案節點,選擇 Schema 比較(預覽)。

  3. 結構比較 視窗中,專案被設定為原始碼。 選擇目標並選擇你的本地開發資料庫連線。

  4. 選擇 「比較 」以執行比較。 結果顯示專案(來源)與資料庫(目標)之間的差異。

  5. 請檢視差異,確認變更是否預期中。

  6. 選擇 「應用」 以套用變更至資料庫。

  1. 從遠端儲存庫擷取最新的變更:

    cd MyDatabaseProject
    git pull
    
  2. 建立專案以驗證變更是否成功編譯:

    dotnet build
    
  3. 請使用 SqlPackage 將變更部署到您的本地開發資料庫:

    sqlpackage /a:Publish /sf:bin/Debug/MyDatabaseProject.dacpac /tsn:localhost /tdn:MyDatabase
    

    用你的MyDatabaseProject.dacpac輸出檔名稱替換.dacpac,並依需要更新目標伺服器(/tsn)和資料庫(/tdn)的數值。