两个用户访问相同的数据库还是不同的数据库?

Div*_*vas 5 oracle

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

现在启动数据库已作为安装的一部分创建。我使用系统帐户创建了 2 个用户 user1 和 user2。

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

所以

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

数据库实例只能连接到一个数据库,那么这是否意味着每次我创建一个新数据库,为了使数据库实例指向该数据库,我都需要进行配置更改?

jpm*_*c26 4

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

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

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

CREATE TABLE MY_SCHEMA.TABLE_X ( X NUMBER )
Run Code Online (Sandbox Code Playgroud)

如果两个语句的模式CREATE不同,那么它将创建不同的对象。Oracle 中的不同之处在于每个用户的默认架构都会更改。默认架构始终是当前连接的架构/用户。因此,如果您省略架构,如下所示:

CREATE TABLE TABLE_X ( X NUMBER )
Run Code Online (Sandbox Code Playgroud)

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

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

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

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