5

我对 Rails 很陌生,所以希望这不是一个愚蠢的问题。

我正在尝试让 rails 使用具有两个不同用户帐户的 postgresql 数据库。但是,我希望能够在这些帐户之间切换,因此它们对数据库具有相同的权限(理想情况下,它们都不是 postgresql 超级用户)。

NOLOGIN在 postgres 中创建了一个角色,它是数据库的所有者。然后将两个用户帐户分配给此角色。但是,每当我这样做时rake db:migrate,它都会使用户帐户(而不是角色)成为的所有者。如果我然后切换用户,第二个用户将没有第一个用户创建的表的正确权限。

拥有两个帐户的原因是能够快速切换,例如当我需要更改密码而不停机时。

有没有办法告诉 Rails 在创建表时使用特定角色作为所有者?(或者如果没有两个帐户在同一个 postgresql 角色中,也许有更好的方法来实现这一点?)

更新:到目前为止,我发现这个解决方案可以作为外部脚本手动运行,并将所有表的所有权更改为 NOLOGIN 角色,但我希望有更优雅的东西或者更适合 rails 的东西。

4

1 回答 1

6

你可以在 PostgreSQL 方面做很多事情:

如果你想role2拥有所有的特权role1,你可以:

GRANT role1 TO role2;

和/或,使用 PostgreSQL 9.0 或更高版本,您可以指示 PostgreSQL 为新对象设置默认权限:

ALTER DEFAULT PRIVILEGES 允许您设置将应用于将来创建的对象的权限。(它不影响分配给已存在对象的权限。)目前,只能更改表(包括视图和外部表)、序列和函数的权限。

您可以对角色或模式执行此操作。对于您的情况,您可以:

ALTER DEFAULT PRIVILEGES FOR ROLE role1 GRANT SELECT ON TABLES TO role2;

如果您希望多个不同的角色共享一组权限,我会将对象的所有权限授予一个非登录角色(曾经被称为GROUP) -role0在下面的示例中。使用DEFAULT PRIVILEGES它并且不要忘记预先存在的对象,包括序列(我倾向于忘记那些)。
然后GRANT role0是其他角色。

沿着这些思路:

ALTER DEFAULT PRIVILEGES FOR ROLE role1 GRANT SELECT ON TABLES TO role0;
ALTER DEFAULT PRIVILEGES FOR ROLE role2 GRANT SELECT ON TABLES TO role0;
...

GRANT role0 TO role1;
GRANT role0 TO role2;

这样GRANT,如果需要,您可以轻松地将特权附加到一个角色。您可以在此设置中添加任意数量的角色。

许多DML 语句需要对象的所有权。我引用手册ALTER TABLE

您必须拥有该表才能使用 ALTER TABLE。

作为拥有表工作的角色的成员。因此,在上面的示例中,如果您制作role0自己的表格,role1并且role2可以使用ALTER TABLE. 执行:

ALTER TABLE tbl OWNER TO user0;

对于您创建的每个表。

CREATE或者在运行命令之前进入角色:

SET ROLE user0;
CREATE ...;
CREATE ...;
RESET ROLE;

如果你忘记了你是谁:

SELECT current_user, session_user;
于 2012-04-18T16:16:59.597 回答