我可以使用 post 部署脚本更改现有的 table 模式吗?

Can I ALTER an existing table schema using a post-deployment script?

使用

使用 post 部署脚本更改 table 模式是否存在任何 problems\potential 问题?

我的公司有一个 Web 应用程序 (App A),其后端数据库有 table 个,使用 CDC Replication 复制到另一个公司应用程序的数据库 (App B)。对这些 table 进行架构更改会导致 SSDT 在生成部署脚本时使用 DROP/CREATE。对于在这些 table 上使用 CDC Replication 的 App B 的数据库来说,这是一个问题,因为当 table 被删除并重新创建时,App B 的数据库的 CT_[table_name] table s 被删除,导致 App B 宕机。我的解决方案是使用 post 部署脚本对这些 table 进行更改,而不是让 SSDT 生成 DROP/CREATE。这种方法有任何潜在的问题或问题吗?

我真的需要一些帮助。

您是否使用内置的重构支持来重命名 columns/tables?如果你这样做,那么部署应该生成一个 sp_rename.

如果你是并且它是因为 cdc 的错误:

  • 提出一个连接项目
  • 做你自己的改变,但你需要在部署之前 运行 一个脚本,否则它会为你做出它想要的更改(我称之为预比较脚本)

有关详细信息,请参阅 https://the.agilesql.club/Blog/Ed-Elliott/Pre-Compare-and-Pre-Deploy-Scripts-In-SSDT

埃德

如果您要从 table 中排除这些 table,您可以使用 Post-Deployment 脚本来处理此类 table 更改SSDT 项目模型。这可以通过以下任一方式实现:

  • 对于 CDC 复制中涉及的每个 table 个文件,将 Build Action 属性 设置为 None
  • 或者干脆从项目中完全删除受影响的 table 文件

这将完全阻止 SSDT 尝试对该 table 执行任何操作,因此您不必担心比较引擎生成的脚本会破坏您的 CDC 实例。

自然地,这意味着任何依赖于排除的 table 对象的对象(例如过程或视图)也需要移动到 Post-部署脚本。这将导致 数据库的可追溯性 降低,因为所有排除的那些 table 将不再在源代码管理中存储每个文件的历史记录。

即使找到不会导致这些缺点的解决方案,例如根据 Ed 的优秀博客 post 使用预比较脚本,也存在 部署问题atomicity 来考虑。如果部署的一部分发生在 SSDT 生成的脚本中,而另一部分发生在 Post-部署脚本中,则可能会发生使数据库处于半部署状态的错误。这是因为 SSDT 仅将事务用于它负责的部署部分; Post-部署脚本中包含的任何内容都将在提交初始事务后执行。

这意味着您的Post-部署脚本需要以幂等的方式编写,以便在出现问题时可以重新执行(抱歉,如果这是一个有点明显的陈述......每当提到 post-部署脚本时,它似乎总是一个很好的观点!)。

如果需要对 table 更改的部署方式进行更高程度的控制,而不会失去可追溯性或部署原子性,那么我可以建议 考虑迁移驱动部署工具 ,例如 ReadyRoll(免责声明:我在 Redgate Software 工作)。 ReadyRoll 是 SSDT 的项目子类型,但使用与 SSDT 完全不同的部署方式:不是等到部署才发现 table 将是 dropped/recreated,而是在开发时生成迁移脚本,允许在将其提交到源代码管理之前更改同步操作。

有关 SSDT 和 ReadyRoll 比较的更多信息,请查看 ReadyRoll 常见问题解答: http://www.red-gate.com/library/readyroll-frequently-asked-questions-faq