以下是我的架构详细信息:
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对于数据库名称,这样我就可以处理更少的同义词。
答案 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_A
到DB_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
;