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



以下是我的模式详细信息:

  • DB_A:schema_1、schema_2、schemon_3
  • DB_B:schema_3

schema_3中的一些过程访问schema_1和schema_2中的资源(表、视图、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,这样我就可以处理更少的同义词了。

我找到的最佳选择如下。

为同一架构中具有相同名称的单个对象(在共享数据库DB_A中)创建同义词(独立数据库DB_B)。这样,您的现有程序就不需要更改,并且将按要求运行。同义词很好地说明了这一点。我很快就会创建一个应用程序来轻松创建此类情况的同义词。

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

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

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

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

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

现在,使用[database]。[架构]。[对象],当您使用其他数据库的对象时

例如:我有两个数据库("帮助台"、"内部网")

从桌面到内部网

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
;

最新更新