在同一台服务器上具有不同名称的相同dbs。需要一种方法来管理数据库对象

时间:2015-02-10 10:36:34

标签: sql-server database-design merge

背景

我们是英国人,有几个数据库:DbFront_UK和DbBack_UK。我们最近冒险进入美国,现在有2个新的Dbs:DbFront_US和DbBack_US。 DbFront包含执行交叉数据库连接到DbBack的sprocs,反之亦然。美国和英国的数据库永远不应该通信。

美国代码和Db变更很快完成,并与英国的变化分开。现在我有一个合并代码库和dbs的任务。然而,合并代码很简单,dbs更难。有很多sprocs加入 DbFront_UK.schema.table 所以我不能再有一个可以部署到两个Dbs的SP了。

限制:

所有这4个数据库都在Rackspace的同一台服务器上。没有办法拆分它们,我只能有一个SQL实例。

问题:

提供可轻松部署和管理的单组数据库对象的最佳方式是什么?我们不断改进我们的产品,因此SP变化的可能性很高。

选项:

  1. 我可以找到引用其他Db的所有SP和对象,并为SP添加后缀,一个用于英国,一个用于美国(因此 sp_one 变为加倍,因为 sp_one_UK sp_one_US )。然后在我的C#代码中,我可以if UK call this SP, if US call this one。这样做的好处是,它可能更容易识别SP在哪里,并且新开​​发人员更容易理解。危险在于它是一项繁琐的工作而且很丑陋,在美国dbs中会存在SP,其英国后缀永远不会被称为。但是我们为这两种环境都有相同的Db对象集
  2. 保持原样。英国的Sp1仍将在美国命名为SP1。这里最大的危险是我们最终会重复变更,很容易被错过。这里有很多开发人员,这些变化很可能会被遗漏,未来的可维护性是一个重要因素
  3. 我可以在sqlcmd模式下运行sql并将Db名称作为变量。我认为这会影响执行计划,并可能导致糟糕的SQL性能,对此的想法将不胜感激。
  4. 任何想法都表示赞赏。

    由于

1 个答案:

答案 0 :(得分:1)

我在SQL Server中知道没有简单的方法可以做到这一点,但是你可以在前端数据库中为后端数据库中的每个表和/或SP创建一个同义词:

use TestStuff; -- My frontend db
create schema backend; -- or whatever schema you want
create synonym backend.EPValue for RCDEV.ops.EPValue -- RCDev is the backend
select * from backend.EPValue

或者,您可以创建视图:

create view backend.EPValue as select * from RCDev.ops.EPValue

然后SP将使用同义词或视图。

对于Oracle,您可以在每个Front数据库中创建数据库链接(无法记住语法,对不起)到相应的后端,并且SP使用链接名称。

对于其他数据库类型......好吧,请指定您正在使用的那个!