【问题标题】:Separate and restrict data access using schemas使用模式分离和限制数据访问
【发布时间】:2019-06-27 05:33:37
【问题描述】:

我是一名 Oracle DBA,刚接触 PostgreSQL。我需要分离一些模块的数据,这样一个模块就无法读取另一个模块的数据。 我读到了 PostgreSql 中模式的使用,这与 Oracle 中的使用有些不同。但是似乎建议使用不同模式的方法进行分离和管理 - 就像在 Oracle 中一样。 但是,当我创建 2 个模式时 - 连接到同一个数据库和同一个用户 - 我可以从另一个模式的表中进行选择。 也就是说,例如,如果我有模式 A 拥有表 a,模式 B 拥有表 b,当我将搜索路径设置为模式 B 时,我可以毫无问题地对模式 A 表 a 进行选择。 我找不到从模式 B 撤销此特权的方法。 我唯一能找到的分离数据访问的方法是使用不同的角色,即使用模式 A 创建角色 A,使用模式 B 创建角色 B。然后我可以授予和撤销用户 B 的访问权限,以便它看到我想从角色的 A 表中得到什么。

这是正确的吗?我错过了什么吗?

【问题讨论】:

  • 您是否考虑过使用单独的数据库?
  • @sibert:只要 Tamar 只使用一个用户,不同的数据库也无济于事,因为用户对所有数据库都是全局的。所有权属于用户级别。
  • 非常感谢@a_horse_with_no_name。这是我的想法,但需要确定。我必须承认,我不明白为什么要使用不同的模式连接同一个用户......它是为了启用对象的重复性(也就是说,能够创建例如同名但在不同名称下的同一个表搜索路径)?
  • @Tamar:每个用户的“模式”一个模式正是 Oracle 使用的。

标签: postgresql


【解决方案1】:

如果我有架构 A 拥有表 a

架构不“拥有” Postgres 中的表 - 用户 拥有。这与 Oracle 中的相同 - 不同之处(可能是您产生混淆的地方)在于,在 Oracle 中,普通用户无法在与用户帐户同名的架构之外创建表。

因此,如果用户 arthur 在 schema_a 中创建一个表,在 schema_b 中创建一个表,则这两个表都归 arthur 所有 - 不是“架构”。

如果您在 Oracle 中使用不同的模式/用户来分隔数据并防止访问其他用户的表,那么您在 Postgres 中也需要两个用户和两个模式。

Postgres 中的默认search_path 设置方式是,始终首先在与运行语句的用户同名的模式中搜索(并创建)(不合格的)表。

因此,如果您创建两个用户并为每个用户创建一个带有用户名的架构,那么您的设置与 Oracle 中的设置几乎相同:

create user arthur with password 'foobar';
create schema arthur authorization arthur; --<< this is what Oracle does "automatically"
create user bob with password 'verysecret';
create schema bob authorization bob;

现在,如果 bob 创建了一个表,则该表将在架构 bob 中创建,并归用户 bob 所有。用户arthur 没有访问该表的权限。


如果您从不需要在这些用户(或模式)之间共享数据,那么您可以创建两个数据库,创建两个用户,然后让两个用户在“他们的”数据库的 public 模式中创建所有内容。

【讨论】:

  • 用用户名而不是目的来命名架构感觉很hacky
  • @AvinKavish:这根本不是 hacky。它与默认的 search_path 一起使用并模仿 Oracle 的行为(这是 Tamar 感到困惑的地方)。
猜你喜欢
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
相关资源
最近更新 更多