我是Oracle DBA,是PostgreSQL的新手。我需要分离一些模块数据,以便一个模块将无权读取另一模块的数据。 我读到有关在PostgreSql中使用模式的信息,这与在Oracle中使用模式有些不同。但是似乎建议使用不同模式的方法进行分离和管理-就像在Oracle中一样。 但是,当我创建2个模式-连接到相同的数据库和相同的用户时-我可以从其他模式的表中进行选择。 也就是说,例如,如果我有架构A拥有表a,而架构B拥有表b,那么当我将搜索路径设置为架构B时,我可以在架构A的表a上进行选择。 我找不到从架构B撤消此特权的方法。 然后,我唯一能找到的分离数据访问的方法就是使用不同的角色,即使用架构A创建角色A,使用架构B创建角色B。然后,我可以授予和撤消用户B的访问权限,以便其看到我想从角色的A表获得什么。
这是正确的吗?我想念什么吗?
答案 0 :(得分: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
模式中创建所有内容。