2012-04-18 30 views
5

我對rails很陌生,所以希望這不是一個愚蠢的問題。如何在postgresql中設置rails的表所有權?

我想讓rails使用帶有兩個不同用戶帳戶的postgresql數據庫。但是我希望能夠在這些帳戶之間切換,因此它們對數據庫具有相同的權限(理想情況下,它們都不是PostgreSQL超級用戶)。

我在postgres中創建了一個NOLOGIN角色,它是數據庫的所有者。然後爲此角色分配兩個用戶帳戶。但是,每當我做rake db:migrate時,它都會使用戶帳戶(而不是角色)爲的所有者。如果我然後切換用戶,第二個用戶將不會在第一個用戶創建的表上擁有正確的權限。

有兩個帳戶的原因是能夠快速切換,例如,當我需要更改密碼時不停機。

有沒有辦法在創建表時告訴rails使用特定角色作爲所有者?(或者也許有一個更好的方式,在同一PostgreSQL的作用來實現這一點沒有兩個帳戶?)

更新:到目前爲止,我發現this solution爲外部腳本手動運行和更改所有表的所有權轉讓給NOLOGIN作用,但我希望有更優雅的東西,或者適合滑軌。

回答

5

你可以在PostgreSQL的側頗有幾分:

如果你想role2到有role1擁有所有權限,你可以:

GRANT role1 TO role2; 

和/或在PostgreSQL 9.0或後,您可以指示PostgreSQL的設置default privileges新的對象:

ALTER DEFAULT PRIVILEGES allows you to set the privileges that will be applied to objects created in the future. (It does not affect privileges assigned to already-existing objects.) Currently, only the privileges for tables (including views and foreign tables), sequences, and functions can be altered.

你能做到這一點的角色或模式。對於你的情況,你可以:

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語句需要的對象的所有權。我引用the manual on ALTER TABLE

You must own the table to use ALTER TABLE.

作爲擁有表工作的角色的成員。所以,在上面的例子中,如果你製作role0自己的表格,role1role2可以使用ALTER TABLE。執行:

ALTER TABLE tbl OWNER TO user0; 

對於您創建的每個表。

或者你潛入你的角色運行CREATE命令之前:

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

如果你記不清你是誰:

SELECT current_user, session_user; 
+0

感謝您的快速回復。因此,看看第一種選擇:與兩個用戶共同擁有一個「主人」角色,我將有兩個用戶分別授予另一個用戶?例如'GRANT user1 TO user2;授予user2 TO user1'?這必須在每次「切換」之前手動執行?如果我使用'DEFAULT PRIVILEGES',但我只能做一次。對? – gingerlime 2012-04-18 16:40:16

+0

['GRANT'](http://www.postgresql.org/docs/current/interactive/sql-grant.html)意味着永久授予權限並僅需要一次。 – 2012-04-18 17:13:24

+0

很抱歉,但我不明白這是如何工作的。看起來授權是分層的,例如, 'GRANT user1 TO user2',所以user2將擁有與user1相同的權限,但不會以相反的方式。無論哪個用戶創建表,我都需要兩個用戶具有完全相同的權限。也許我錯過了一些東西。 – gingerlime 2012-04-18 20:30:03

相關問題