【问题标题】:Deploy database to Azure SQL fails, sp_MSforeachtable not found将数据库部署到 Azure SQL 失败,找不到 sp_MSforeachtable
【发布时间】:2023-12-27 11:00:02
【问题描述】:

我正在尝试使用 .dacpac 发布 SQL Server 数据库并将配置文件发布到 Azure SQL 数据库。我们在本地使用 SQL Server 已经有一段时间了,没有任何问题,现在我们正在评估 Azure 和 AWS,看看哪个最适合我们的需求。

我们有一个 SQL Server 数据库项目,想将其部署到 Azure SQL 数据库,但是它无法执行 SSDT 生成的脚本。这是因为生成的脚本包含对 Azure SQL 中不存在的存储过程 sp_MSforeachtable 的调用。

我还将目标平台从 SQL Server 2016 更改为 Azure SQL V12。我正在从 Visual Studio 2017 的发布配置文件和使用 Azure SQL 数据库部署任务的 VSTS 发布管理中尝试此操作。当然是在任务中提供必要的.dacpacpublish.xml 文件。

我知道我可以手动添加存储过程,但这些发布/部署方法似乎并非如此。有人有什么想法吗?

谢谢

【问题讨论】:

  • 有哪些详细步骤和代码可以重现这个问题?
  • 直接通过Visual Studio发布会有什么结果?
  • 我无法使用简单的数据库项目(表和存储过程)重现此问题。可以分享一下 OneDrive 上的详细构建和发布日志吗? (将 system.debug 变量设置/添加为 true)
  • 你解决了这个问题吗?
  • 所以在深入挖掘之后,我没有意识到我的团队在前一段时间添加了一个使用此存储过程的预部署脚本。所以我将它的创建添加到了预部署脚本中,我们可以开始了。谢谢

标签: sql-server azure azure-sql-database azure-devops azure-pipelines-release-pipeline


【解决方案1】:

sp_MSforeachtable 是 Master 数据库中未记录的存储过程。这显然还没有移植到 Azure SQL。我相信您需要手动将其添加到主数据库中。完成后,您的 DACPAC 应该可以在您自己的 Azure SQL 数据库上正常工作。我认为手动添加 sp_MSforeachtable 没有问题。 DACPAC 旨在保持您的数据库同步,而不是主数据库。

【讨论】:

【解决方案2】:

Azure 的 SQL 数据库中未实现此功能。

您可以在以下位置找到它的副本:https://gist.github.com/metaskills/893599

【讨论】:

  • 我很好奇是否有人知道该要点的分叉以及每个分叉的优缺点。
【解决方案3】:

正确,sp_MSforeachtable Azure SQL 中仍然缺少存储过程,但您可以轻松地手动创建它。当您必须一次为所有表重建索引时,这非常有用:

exec sp_MSforeachtable @command1="DBCC DBREINDEX ('?', '', 80)"

【讨论】:

  • DBCC DBREINDEX 是 deprecatedExec sp_msforeachtable 'SET QUOTED_IDENTIFIER ON; ALTER INDEX ALL ON ? REBUILD' 而不是