从存储过程中的另一个数据库访问数据

时间:2014-02-18 12:34:42

标签: sql sql-server stored-procedures dynamic-data synonym

以下是我的架构详细信息:

  • DB_A:schema_1,schema_2,schema_3
  • DB_B:schema_3

schema_3中的一些过程从schema_1和schema_2访问资源(table,view,sp)。

schema_3中的所有过程在dbs上都是相同的。 如何从schema_3访问dbs

的schema_1

现在我可以在我的程序中硬编码DB_A但是当我将代码移动到客户端机器时,它会产生问题,因为DB_A可能不相同(其中一个原因是客户端是吝啬的并且QA,Dev和Prod相同机)。

第二个选项是将DB_A名称作为参数,但它会使所有schema_3 SP动态化(因为我没有获得任何方法来访问@ DBName.schema_name.ResourceName之类的东西)。

第三个选项是创建链接服务器,由于与第一个相同的原因,它再次无法解决我的问题。

任何想法如何继续,我不希望我的程序是动态的,因为80%的程序是直的。

编辑开始:

所以我可以重申它,因为我有多个数据库,数据库有资源(表/视图/模式)需要共享,然后有其他数据库(一个或多个),这些数据库具有存储过程,用于计算共享数据数据库和自我数据库。

共享数据库名称在所有环境中都不会保持不变,我想更改它们(特定于环境)。我已经提出了一个解决方案,我将为所有共享资源创建同义词,所有程序都将使用它们,这样它们都指的是来自第一个数据库的共享资源。

对于每个安装,我需要修改同义词定义以反映正确的共享数据库名称。是否有SYNONYM对于数据库名称,这样我就可以处理更少的同义词。

3 个答案:

答案 0 :(得分:1)

我找到的最佳选择如下。

为同一模式中具有相同名称的单个对象(在共享数据库DB_B中)创建Synonym(独立数据库DB_A)。这样,您现有的程序无需更改,并可按要求运行。 Synonym为此提供了很好的参考。我将很快创建一个应用程序,以便轻松为这些情况创建同义词。

CREATE SYNONYM DB_B.schema_1.proc_1 FOR DB_A.schema_1.proc_1

答案 1 :(得分:0)

您可以在DB_A中运行您的程序,并创建从DB_ADB_B的视图:

create view dbo.vw_B_Schema_3
as
select  *
from    DB_B.dbo.Schema_3

您必须创建三个版本的视图(dev,QA,prod。)但视图将是唯一的区别:过程定义可以保持相同。

答案 2 :(得分:0)

如果DB_A和DB_B在同一台服务器上,只能确保登录在两个数据库中具有权限。

现在,使用[database]。[schema]。[object],当你使用其他人的对象时

例如:我有两个数据库,(“helpdesk”,“intranet”)

从heldesk到Intranet

create view dbo.users
as 
select login, name, lastname
from intranet.dbo.user // [database].[schema].[object] user is a table in dbo schema from intranet database.
where status = 1
;