教程:在 Git 中存储数据库架构

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

将数据库架构存储在 Git 中提供了多种优势,包括版本控制、协作以及一段时间内跟踪更改的功能。 此方法特别适用于代码优先开发,可在其中通过代码定义数据库架构,并使用 ORM 或编码代理(如 GitHub Copilot)直接将更改应用到开发环境。

本教程介绍如何将数据库架构存储在 Git 中,并将其作为开发工作流的一部分进行管理。

  • 从现有数据库创建新的 SQL 项目
  • 提交数据库代码并将其推送到 Git 远程存储库
  • 将数据库中的更改应用到现有代码
  • 从 Git 远程存储库拉取更改并将其应用到本地数据库(可选)

演示信息教程流的示意图。

完成后,即可在源代码管理中跟踪数据库,并通过 Git 存储库与团队协作处理数据库更改。

注释

若要完成本教程,需要访问 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 中“导入数据库”对话框的屏幕截图。

在“”新建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中,从数据库创建项目对话框需要项目名称和位置。 默认导入设置先按架构,然后按对象类型将对象导入文件夹。 可以选择不同的文件夹结构,或选择在选择 “创建”之前在导入的对象中包含权限。

打开“数据库项目”视图以查看新项目和导入的对象定义。

在SQL Server Management Studio中的对象资源管理器中,右键单击要从中创建project的数据库,然后在“任务”菜单下选择“从数据库创建Project...”。

SQL Server Management Studio 中“从数据库”对话框里的“新建 SQL 项目”屏幕截图。

在“从数据库创建 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> 存储库”。

  2. 在“创建 Git 存储库”对话框中的“推送到新的远程”部分下,选择GitHub或Azure DevOps。 如果选择推送到GitHub,请在出现提示时登录到GitHub帐户。 如果选择Azure DevOps,请登录到Azure DevOps帐户并选择或创建项目。

  3. 输入存储库名称和说明。 确保 .gitignore 模板 设置为 VisualStudio ,然后选择“ 创建和推送”。

Visual Studio创建本地 Git 存储库,使用 SQL 项目文件进行初始提交,并将其推送到远程。

若要验证代码是否已成功推送,请打开浏览器并导航到GitHub(https://github.com)或Azure DevOps(https://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. 在“源代码管理”视图中选择 “发布分支 ”,将本地存储库推送到远程存储库。 选择是发布到GitHub还是Azure DevOps,并按照登录提示进行操作。 选择存储库可见性(公共或专用),然后确认。

若要验证代码是否已成功推送,请打开浏览器并导航到GitHub(https://github.com)或Azure DevOps(https://dev.azure.com)上的存储库。 应会看到 SQL 项目文件,包括 .sqlproj 文件和 .sql 对象定义。

有关详细信息,请参阅Visual Studio Code中的源代码管理。

在SQL Server Management Studio中打开 SQL 项目后,创建本地 Git 存储库并将其推送到远程存储库。

  1. 从菜单栏中选择“Git> 存储库”。

  2. 在“创建 Git 存储库”对话框中的“推送到新的远程”部分下,选择GitHub或Azure DevOps。 如果选择推送到GitHub,请在出现提示时登录到GitHub帐户。 如果选择Azure DevOps,请登录到Azure DevOps帐户并选择或创建项目。

  3. 输入存储库名称和说明。 确保 .gitignore 模板 设置为 VisualStudio ,然后选择“ 创建和推送”。

SSMS 创建本地 Git 存储库,使用 SQL 项目文件进行初始提交,并将其推送到远程。

若要验证代码是否已成功推送,请打开浏览器并导航到GitHub(https://github.com)或Azure DevOps(https://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 提供的 URL。

若要验证代码是否已成功推送,请打开浏览器并转到存储库。 应会看到 SQL 项目文件,包括 .sqlproj 文件和 .sql 对象定义。

步骤 3:将数据库中的更改应用到现有代码

当数据库架构在 SQL 项目外部发生更改时(例如,通过对数据库、ORM 迁移或代理操作的直接修改),可以更新项目以反映这些更改。

使用架构比较从数据库更新 SQL 项目。

  1. 在SQL Server 对象资源管理器中,右键单击数据库并选择“架构比较”。

  2. 在 “架构比较 ”窗口中,数据库设置为源。 选择 “选择目标 ”下拉列表,然后选择 “选择目标”。

  3. 在“选择目标架构”对话框中,选择Project,然后选择你的 SQL 数据库项目。 选择“确定”。

  4. 选择“ 比较 ”以运行比较。 结果显示数据库(源)与项目(目标)之间的差异。

  5. 查看差异。 取消选中你不想应用到项目的任何更改。

  6. 选择 “更新 ”,将所选更改应用于 SQL 项目。

将更新项目文件以匹配数据库架构。 查看 “Git 更改” 窗口中的更改,输入提交消息,然后选择“ 全部提交”。 选择 “推送 ”以将更改推送到远程存储库。

Warning

本教程不适用于 Visual Studio 2022 中的 SDK 样式项目(预览版)。 请改用SQL Server Management Studio(SSMS)或Visual Studio Code。

使用从数据库更新项目命令从数据库更新 SQL 项目。

  1. 在数据库对象资源管理器中,右键单击该数据库,然后选择SQL 数据库项目>从数据库更新项目。

  2. 选择要更新和确认的 SQL 数据库项目。

  3. 运行比较,并将数据库中的更改应用到项目中。 更新 .sql 的文件将作为修改的文件显示在 源代码管理 视图中。

查看 源代码管理 视图中的更改,暂存修改的文件,输入提交消息,然后选择 “提交”。 选择 “同步更改 ”以将提交推送到远程存储库。

使用架构比较从数据库更新 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 数据库项目节点并选择“架构比较”。

  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 数据库项目节点并选择“架构比较”(预览版)。

  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)的值。