4

我在我的系统上安装了 Oracle,所以现在 orcl 是 SID,它是我的数据库实例的唯一标识符。

现在 starter db 已作为安装的一部分创建。我使用系统帐户创建了 2 个用户 user1 和 user2。

使用 SQL 开发人员访问用户,这向我展示了与所有数据库对象(如表、存储过程视图等)的 2 个不同连接。

所以

当使用这 2 个用户时,我访问的是同一个数据库吗?我通过登录用户 1 或用户 2 来提供所有 ddl 命令,所有这些数据是否都进入同一个 .dbf 文件?

数据库实例只能连接一个数据库,那么这本质上是不是意味着每次我创建一个新数据库时,为了让一个数据库实例指向那个,我需要做一个配置更改?

4

1 回答 1

3

根据我使用 Oracle 的经验,典型的划分单元是模式。Oracle 中的模式的使用更像是在 SQL Server 或 PostgreSQL 中使用数据库。它们代表用户和对象的逻辑分离。物理分离通常使用表空间来完成。表空间是一组存储数据的物理文件。模式可以共享或使用不同的表空间。每个模式有一个表空间是不常见的。它们通常共享几个表空间,甚至通常只共享一个。

考虑到这一点,为了更直接地回答您的问题,

1) 与任何其他数据库一样,您可以指定对象所属的架构:

CREATE TABLE MY_SCHEMA.TABLE_X ( X NUMBER )

如果两个CREATE语句的模式不同,那么它将创建不同的对象。Oracle 的不同之处在于每个用户的默认模式都会发生变化。默认架构始终是当前连接的架构/用户。因此,如果您像这样省略架构:

CREATE TABLE TABLE_X ( X NUMBER )

那么隐含的模式是当前连接的模式/用户。因此,如果我以 身份登录MY_SCHEMA,则上面的内容相当于第一个示例。当作为两个不同的用户连接时,隐含的模式将不同,并且两个用户之间的 DDL等效。因此,如果您不指定模式,则运行相同的语句将创建两个不同的对象。

如果两个对象在同一个表空间中,则它们可以存储在同一个物理文件中。(如果您没有显式创建一个并且在创建模式时没有指定不同的默认表空间,它们很可能在 USERS 表空间中。)无论如何,它们仍然是两个完全独立的对象。

如果您像第一个示例中那样明确指定模式,那么无论谁执行 DDL 都是等效的(尽管权限可能会阻止某些用户执行它)。所以它会导致创建一次对象,并且尝试第二次创建它会导致错误,除非你正在使用CREATE OR REPLACE或类似的东西。

2)我不知道这个问题的答案,但正如我所说,在Oracle中,基本的分离单元通常是模式,而不是数据库。我相信您所问的问题是模式以它们的方式使用的很大一部分原因。在同一台机器/实例上拥有多个实际数据库在 Oracle 中比在其他数据库中困难得多(如果不是不可能的话),因此拥有一个具有许多模式的数据库要简单得多。

于 2013-05-27T06:02:59.633 回答