同一服务器上具有不同名称的相同数据库。需要一种方法来管理数据库对象
Same dbs with different names on same server. Need a way to manage the db objects
背景
我们位于英国,拥有两个数据库:DbFront_UK 和 DbBack_UK。我们最近冒险进入美国,现在有 2 个新的 Db:DbFront_US 和 DbBack_US。 DbFront 包含执行跨数据库连接到 DbBack 的存储过程,反之亦然。美国和英国的数据库永远不应该通信。
美国代码和数据库更改完成得非常快,并且独立于英国更改。现在我的任务是合并代码库和数据库。合并代码很容易,但是数据库要难得多。有许多存储过程以 DbFront_UK.schema.table 的形式加入,所以我不能再拥有一个可以部署到两个 Db 的 SP。
限制:
所有这 4 个数据库都在 Rackspace 的同一台服务器上。没有办法拆分它们,我只能有 1 个 SQL 实例。
问题:
提供一组可以轻松部署和管理的数据库对象的最佳方法是什么?我们正在不断改进我们的产品,因此 SP 更改的可能性很高。
选项:
- 我可以找到所有引用另一个 Db 的 SP 和对象,并为 SP 添加后缀,一个用于英国,一个用于美国(因此 sp_one 变为翻倍为 sp_one_UK 和 sp_one_US)。然后在我的 C# 代码中,我可以做
if UK call this SP, if US call this one
。这样做的好处是可能更容易识别 SP 的用途,新开发人员也更容易理解。危险在于这是一项繁琐的工作,而且很丑陋,美国数据库中存在的 SP 带有英国后缀,永远不会被调用。但是我们对两种环境都有相同的 Db 对象集
- 保持原样。英国的 Sp1 在美国仍将命名为 SP1。这里最大的危险是我们最终会重复更改并且很容易错过它们。这里有很多开发人员,这些更改可能会被遗漏,未来的可维护性是一个重要因素
- 我可以在 sqlcmd 模式下 运行 sql 并将 Db 名称作为变量。我认为这会影响执行计划并可能导致 SQL 性能不佳,对此的想法将不胜感激。
如有任何想法,我们将不胜感激。
谢谢
据我所知,在 SQL 服务器中没有简单的方法可以做到这一点,但是您可以通过在前端数据库中为每个 table [=22 创建一个同义词来做到这一点=]后台数据库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 数据库中创建一个数据库 Link(对不起,语法不记得了)到适当的后端,SP 使用 Link 名称。
对于其他数据库类型...好吧,请指定您使用的是哪一种!
背景
我们位于英国,拥有两个数据库:DbFront_UK 和 DbBack_UK。我们最近冒险进入美国,现在有 2 个新的 Db:DbFront_US 和 DbBack_US。 DbFront 包含执行跨数据库连接到 DbBack 的存储过程,反之亦然。美国和英国的数据库永远不应该通信。
美国代码和数据库更改完成得非常快,并且独立于英国更改。现在我的任务是合并代码库和数据库。合并代码很容易,但是数据库要难得多。有许多存储过程以 DbFront_UK.schema.table 的形式加入,所以我不能再拥有一个可以部署到两个 Db 的 SP。
限制:
所有这 4 个数据库都在 Rackspace 的同一台服务器上。没有办法拆分它们,我只能有 1 个 SQL 实例。
问题:
提供一组可以轻松部署和管理的数据库对象的最佳方法是什么?我们正在不断改进我们的产品,因此 SP 更改的可能性很高。
选项:
- 我可以找到所有引用另一个 Db 的 SP 和对象,并为 SP 添加后缀,一个用于英国,一个用于美国(因此 sp_one 变为翻倍为 sp_one_UK 和 sp_one_US)。然后在我的 C# 代码中,我可以做
if UK call this SP, if US call this one
。这样做的好处是可能更容易识别 SP 的用途,新开发人员也更容易理解。危险在于这是一项繁琐的工作,而且很丑陋,美国数据库中存在的 SP 带有英国后缀,永远不会被调用。但是我们对两种环境都有相同的 Db 对象集 - 保持原样。英国的 Sp1 在美国仍将命名为 SP1。这里最大的危险是我们最终会重复更改并且很容易错过它们。这里有很多开发人员,这些更改可能会被遗漏,未来的可维护性是一个重要因素
- 我可以在 sqlcmd 模式下 运行 sql 并将 Db 名称作为变量。我认为这会影响执行计划并可能导致 SQL 性能不佳,对此的想法将不胜感激。
如有任何想法,我们将不胜感激。
谢谢
据我所知,在 SQL 服务器中没有简单的方法可以做到这一点,但是您可以通过在前端数据库中为每个 table [=22 创建一个同义词来做到这一点=]后台数据库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 数据库中创建一个数据库 Link(对不起,语法不记得了)到适当的后端,SP 使用 Link 名称。
对于其他数据库类型...好吧,请指定您使用的是哪一种!