跨多个应用程序共享存储过程

Posted

技术标签:

【中文标题】跨多个应用程序共享存储过程【英文标题】:Sharing stored procedures across multiple apps 【发布时间】:2013-06-24 09:49:34 【问题描述】:

团队 A 有一个企业应用程序,该应用程序使用 ADO.NET 进行执行存储过程的数据访问。数据访问封装在自己的项目中(姑且称之为DAL.dll

团队 B 正在创建另一个不相关的应用程序,该应用程序重用企业应用程序中的存储过程。此应用程序当前正在使用 MS 应用程序块进行数据访问。我们遇到的问题是,每当团队 A 对存储过程中的输入/输出参数进行任何更改时,团队 B 的应用程序中都会出现运行时错误,并且需要更新此应用程序以适应额外的参数(或删除)。因此,在用户抱怨之前,其中大部分都不会被注意到。至少,我们希望应用程序抛出编译错误,以便构建过程警告我们所做的更改。

一种方法是让团队 B 的项目添加对 DAL.dll 的引用

我想知道是否还有其他更简洁的方法可以解决此问题。如有必要,我们已准备好替换 Team B 的 MS Data 应用程序块以使用不同的技术(实体框架?)。

【问题讨论】:

“至少,我们希望应用程序抛出编译错误,以便构建过程警告我们所做的更改。”,您对构建过程还有什么期望呢? ? 【参考方案1】:

在其他答案中,我强烈建议在Database Project 中将这些存储过程纳入源代码管理。然后,您可以使用源代码控制系统的功能来做几件事:

    锁定部分代码,使其无法更改 如果代码发生更改,请通知您 如果存储过程发生更改而导致无法调用它们,则会发出警告 对存储过程进行分支,以便每个团队可以拥有自己的更改代码版本,同时保持未更改的存储过程通用。您当然需要将数据库中的不同版本分开。

【讨论】:

【参考方案2】:

我同意此线程上的其他发帖人的观点,即您不应该在不同的 .NET DLL 之间共享存储过程,这只会导致灾难。如果您对数据库模式做任何复杂的事情,我也会回避 ORM 之类的实体框架,因为 ORM 擅长将简单的对象模型从您的 .NET 应用程序类转换为 SQL 表和 SP,但传统上在优化方面做得很差它们用于数据库端的性能。会有人提出不同的主张,如果你是一个专家,他们可能有一个正确的观点,可以像他们一样让 ORM 做你想做的事情,但你很可能不是,从长远来看,这会让你头疼。

共享数据访问层可能会起作用,但从概念上讲,您只是将依赖项的实现从 DBA 编写的一些代码更改为 .NET 程序员编写的一些代码。是的,您可以使用集成测试来实现更好的可验证性,但是使用 Red Gate 的 SQL 测试之类的工具可以为 SQL 提供相同的案例。如果这两个应用程序已经因共享 SP 而感到痛苦,我会回避这种方法。这表明应该消除依赖关系。

如果由我决定,我会为 B 团队的应用创建一个新架构。您可以在此处阅读有关 SQL Server 中架构的更多信息:MSDN Schema description for 2008 R2。您可以将它们视为 SQL Server 的命名空间,但还有一些额外的花里胡哨,例如权限和访问控制。从长远来看,将不同的应用程序分离到同一个共享数据库上的不同模式中可能会实现最灵活的实现。

【讨论】:

【参考方案3】:

重用企业应用中的存储过程的无关应用

如果这两个应用程序真的不相关,为什么那些共享程序甚至是同一个数据库。我知道这篇文章很长,但我建议您阅读:A Better Path to Enterprise Architectures

其中的分区概念与bounded context in Domain driven design有关:

在任何大型项目中都有多个模型在发挥作用。然而,当组合基于不同模型的代码时,软件会变得有缺陷、不可靠且难以理解。团队成员之间的沟通变得混乱。在什么情况下不应该应用模型通常不清楚。

因此:明确定义模型应用的上下文。根据团队组织、应用程序特定部分的使用以及代码库和数据库模式等物理表现形式明确设置边界。使模型在这些范围内严格保持一致,但不要因外部问题而分心或困惑。

如果您不明确处理此问题,则预计您会遇到问题。你很幸运,你看到了早期的失败,因为从长远来看,它可能会变成更难发现的问题。

根据上述情况再次分析问题。考虑一下你是否遗漏了一些明确的上下文,这个通用功能应该存在。

【讨论】:

【参考方案4】:

我的问题是:哪个团队拥有存储过程和共享数据库?通常作为一个好的架构/设计,你不应该有两个不同的应用程序共享相同的数据库/过程。

在两个不同的应用程序之间共享数据/功能的更好方法是通过服务或 API,因此拥有该功能的团队将负责维护它。

另外,强烈建议两个团队之间保持良好的沟通。

【讨论】:

【参考方案5】:

根据 DAL 项目的所有者,您可以托管 Web 服务并共享 API。这样,您就可以将数据访问层与业务逻辑分开,这样任何人都可以使用相同的 DAL,而不必将其发布到每个不同的位置。

在我看来,团队 A 和团队 B 似乎应该共享相同的核心模型,并将多层架构视为一种可能的解决方案。

【讨论】:

【参考方案6】:

听起来创建两个应用程序可以共享的共享 DAL 是有意义的。

我会添加单元测试(或真正的集成测试)以确保 DAL 在更改后与应用程序兼容。这样,如果进行了不兼容的更改,您的测试将失败

【讨论】:

为了进一步扩展,我建议您实现存储库模式,因此如果有人更改接口中定义的 DAL 类中的实现,那么您将收到构建错误。当然,有人可能会忘记在接口中放置 DAL 方法签名并绕过这种非实现检查,但编译器仍会捕获不匹配的参数/参数。【参考方案7】:

“我想知道是否有其他更简洁的方法来解决这个问题。”

最简洁的方式是让 B 团队与 A 团队坐下来,将相关的业务逻辑封装到一个共享的 API 中。如何实现该 API 并不重要。重要的是 API 的接口有文档和版本,所以每个人都知道会发生什么。

在 .NET 环境中一个合理的机制是使用微软的WebAPI。

简而言之,“我们如何共享存储过程?”的问题。很可能是在查看错误的抽象级别。

【讨论】:

以上是关于跨多个应用程序共享存储过程的主要内容,如果未能解决你的问题,请参考以下文章

使用同义词跨数据库共享存储过程

SQL 存储过程

mysql存储过程中怎么进行跨库操作?

WSFC2016 跨站点运行状况检测

SQL SERVER 存储过程中如何使用传入的DB参数,实现跨库查询?

PHP MySQL PDO 存储过程和 INOUT 参数