是否存在跨多个数据库使用通用数据和过程的标准方法?

Wil*_*Cau 3 sql-server-2008 sql-server

我们有几个独立的数据库,它们的数据和代码是相同的,不是在数据库之间访问,而是在每个数据库中数据意味着相同的事情,代码做同样的事情。

例子是:

  • 配置设置(例如错误代码 50xxx、公司名称的样板文本等)。
  • 执行常见任务的过程和函数(例如,将 CSV 字符串转换为表格、记录错误、根据错误代码格式化错误消息)。
  • 表结构(例如数据库版本历史表、记录错误表)。除了列、约束和触发器之外,还有读/写数据的通用过程和函数。
  • 查找表(例如,包含 2000-2100 年之间日期的日期查找表)。这些类似于表结构,但通常数据库中的数据是相同的。对于日期表,开始和结束日期是配置设置,由函数读取,然后由程序生成日期数据。所有这些操作在数据库之间都是通用的。
  • 用户定义的类型(例如用于将表传递给函数的类型)。

出于维护和支持的原因,我认为对于错误代码、过程、函数和类型之类的东西来说,在所有数据库中拥有一个“单一事实点”是有意义的,而不是每个数据库中都有一个不同的事实。

目前,每个数据库都有自己的所有副本,包括源存储库,我们独立维护它们。这很不理想,因为在 A 中修复一个过程而忘记将它放在 B 中太容易了,或者在 A 中添加错误代码而在 B 中添加相同的错误代码但它们意味着不同的东西,等等。

数据库不会同时更新,它们不一定驻留在相同的硬件上。在某些情况下,它们可以相互读取数据(如果存在另一个)。

是否有一种标准方法可以为跨多个数据库使用的数据/代码提供单一事实点?

Aar*_*and 6

除了Thomas的回答,对于常见的查找数据和泛型函数之类的东西,您可以使用同义词

USE CentralDB;
GO

CREATE TABLE dbo.Dates(...);
GO

USE OtherDB;
GO

CREATE SYNONYM dbo.Dates
  FOR CentralDB.dbo.Dates;
Run Code Online (Sandbox Code Playgroud)

现在您的其他数据库可以将这些视为一流的本地对象,但您只需要维护一个副本。请注意,缺少某些功能,例如您无法设置外键。

在以前的生活中,我管理过一个系统,其中每个实例上都有大约 500 个具有几乎相同架构的数据库。我们使用同义词管理公共数据,并使用 Red-Gate SQL 比较和 SQL 农场组合(非常类似于多脚本)部署必须在本地的代码。