0

这两个都在我的应用程序中工作:

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

4 回答 4

3

如果您使用多个模式,那么不会。这都是关于上下文的。显式优于隐式。

于 2012-08-02T16:51:03.943 回答
2

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

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

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

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

于 2012-08-08T06:07:44.073 回答
2

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

于 2012-08-02T16:50:42.123 回答
1

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

alter session set current_schema = MYSCHEMA;

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

假设我是一名广播员,我运行多个频道: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; 

ETC...

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

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

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

这种方法效果很好,我知道我通过查询访问了哪些对象:

select sys_context('USERENV','CURRENT_SCHEMA') from dual;     
于 2012-08-02T19:43:56.623 回答