迁移 Oracle 到 PostgreSQL: 用户和模式

七月 10, 2023

用户和模式是关系数据库的基本概念,但是在 Oracle 和 PostgreSQL 里面,用户和模式的使用存在一些差异。

Oracle 用法

Oracle 在database对象下面也有模式,作为逻辑上的数据库对象容器,但它们严格绑定到用户,这意味着每次为 Oracle 创建用户时,都会自动创建模式。通常,在与 Oracle 建立数据库连接后,您可以转到自己的模式,但您可以更改会话切换到另一个模式,或者如果您授予了权限,则可以从其他模式中查询数据。下面的示例会在 Oracle 中创建用户和同名的模式:

CREATE USER joe IDENTIFIED BY 'password';

PostgreSQL 用法

PostgreSQL 数据库实例包含多个命名的database对象,它们也是相互隔离的。database对象包含多个模式,而模式又包含表和其他常见数据库对象。PostgreSQL 的模式用来将数据库对象进行逻辑上的分组,使它们更易于管理,并允许不同的用户连接到同一个数据库而不会相互干扰。

如果你没有足够注意,PostgreSQL 中的模式可能是不可见的,因为 PostgreSQL 有 2 个非常重要的概念:public模式和模式搜索路径。如果在创建表时未指定模式名称,则这些表将转到默认的public模式,并且每个数据库都包含此类模式,除非另有明确删除。如果在引用表时省略模式名称,PostgreSQL 会通过遵循模式搜索路径 (要查看的模式列表)来确定实际表,返回找到的第一个表。

模式搜索路径 search_path 的默认值为"$user",public,因此首先搜索与当前用户同名的模式,然后搜索public模式。因此,如果你想在 PostgreSQL 中消除模式的存在,并让连接到数据库的所有用户共享所有内容,请不要创建任何模式,默认情况就可以了。如果要将每个用户彼此隔离,请使用确切的用户名为每个用户创建一个模式,最好删除public模式。

我们可以使用 CREATE USERCREATE SCHEMA,创建和 Oracle 一样的用户和同名的模式:

CREATE USER joe WITH PASSWORD 'password';
CREATE SCHEMA AUTHORIZATION joe;