2011-01-21 58 views
2

我们有2台服务器使用相同的数据库模式,但由于方式我们的基础架构的Oracle连接字符串是设置一台服务器上,我们必须有一个用户名对其他用户的表

前前缀的所有表名:

select * from engmon.cmts 

然而在其他服务器上查询需要看起来像这样

select * from cmts 

这是因为一台服务器在一个不同的模式/用户名连接到一个表。是否有可能改变jdbc网址中的内容使两个查询看起来像#2?这样我们就不需要根据我们连接的服务器(dev或prod)来动态更改sql。

任何想法?

回答

5

我不相信你可以对JDBC URL做任何事情。但是,您可以在连接后立即发出SQL语句

ALTER SESSION SET current_schema = ENGMON 

(您也可以将它放在Oracle的登录触发器中)。这可能会指示Oracle使用ENGMON模式而不是当前用户的模式解析非限定对象名称。这对权限没有影响 - 您的会话仍然只有分配给当前用户的权限,而不是ENGMON用户。

或者,您可以为需要访问的各种表创建同义词。可以是本地同义词(只对您可见)或公共同义词(对所有用户都可见)。所以

CREATE [PUBLIC] SYNONYM cmts 
    FOR engmon.cmts 

同义词将只需要创建一次,并适用于所有会话,无论他们来自哪个应用程序。每次都需要设置CURRENT_SCHEMA。

+0

+1:公共同义词是我以前用过的 – 2011-01-21 21:31:46