我可以使用 post 部署脚本更改现有的 table 模式吗?
Can I ALTER an existing table schema using a post-deployment script?
使用
- SQL 服务器 2008(非 R2)
- Visual Studio 2012 高级
- SQL 服务器数据库 Project/SQL 服务器数据工具 (SSDT)
使用 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
使用
- SQL 服务器 2008(非 R2)
- Visual Studio 2012 高级
- SQL 服务器数据库 Project/SQL 服务器数据工具 (SSDT)
使用 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