将模式名称添加到查询中的表名称是多余的吗?

时间:2012-08-02 16:49:00

标签: c# oracle

这两项都可以在我的应用中使用:

INSERT INTO PLATYPUS (Bla, Blee, Bloo, Blah) VALUES (:Bla, :Blee, :Bloo, :Blah)

INSERT INTO CRITTERS.PLATYPUS (Bla, Blee, Bloo, Blah) VALUES (:Bla, :Blee, :Bloo, :Blah)

......比其他方式更优选吗?

4 个答案:

答案 0 :(得分:3)

如果您使用多个架构,那么没有。这完全取决于背景。显式优于隐式。

答案 1 :(得分:2)

它们都有效,因为您可能以默认架构为CRITTERS的用户身份登录。如果您在默认架构不同时以其他用户身份登录,则必须使用查询的限定格式。

答案 2 :(得分:2)

在使用了隐式和显式(我称之为“硬编码”)模式引用的许多系统之后,我发现在所有情况下,在应用程序代码中对模式名称进行硬编码会使生活变得更加困难。 / p>

这就是Oracle有同义词的原因。

我唯一一次硬编码模式名称是在部署脚本中,例如在创建对象时,我想明确说明应该在哪个模式中创建对象。

这意味着当开发人员问,“我们可以在同一个实例中拥有我们的开发数据库的副本吗?”,我可以说,“没问题 - 给我几分钟”。我创建一个新模式,将表等复制到其中,然后更新其登录用户的同义词以指向新模式。 Voila,一个实例上有两个数据库。但是,如果我让他们在应用程序代码中对模式名称进行硬编码,那么这就变得不可能了,因为同义词翻译还没有完成。

答案 3 :(得分:1)

任何Oracle应用程序中的第一个语句都明确指出您将访问哪些对象:

alter session set current_schema = MYSCHEMA;

这样我可以将我的应用程序指向一个数据库服务器(实例)中的不同模式(数据库)。所以永远不要以schema-account身份登录。架构帐户应该被锁定,并且只在ddl-changes(升级)期间打开。

假设我是一名广播公司并运行多个频道:RTL1,RTL2,RTL3,RTL4等...同一个应用程序可以登录到数据库服务器内的不同数据库(Oracle术语架构)

现在我运行RTL1的应用程序:

alter session set current_schema = RTL1;
select * from top_stories;

现在我运行我的RTL2应用程序:

alter session set current_schema = RTL2;
select * from top_stories; 

等...

我看到的#1设计缺陷是一对一的关系:应用程序 - 数据库服务器。 它使管理,存储和备份成为一项全职工作。 Oracle可以在一个数据库服务器上运行数千个应用程序和数据库/模式。

但一如既往,这取决于。有时在一个数据库服务器上运行一个应用程序是有意义的。

所以我尽量不在我的应用程序前缀和设计安装在任何架构中。如果我需要访问其他模式中的对象,我会使用视图和/或同义词。

这种方法非常有效,我通过查询知道我正在访问的对象:

select sys_context('USERENV','CURRENT_SCHEMA') from dual;