2012-04-18 36 views
5

Raylara çok yeniyim, bu yüzden bu aptalca bir soru değil.Tablo sahipliğini postgresql ile raylarda nasıl ayarlayabilirim?

Rayların iki farklı kullanıcı hesabıyla bir postgresql veritabanı kullanmasını sağlamaya çalışıyorum. Ancak, bu hesaplar arasında geçiş yapabilmeyi istiyorum, bu nedenle veritabanında aynı izinlere sahipler (her ikisi de ideal olarak postgresql süper kullanıcı olmaksızın).

Veritabanının sahibi olan postgres'te bir NOLOGIN rolü oluşturdum. Daha sonra bu role iki kullanıcı hesabı atanmıştır. Ancak, rake db:migrate'u ne zaman yaparım, kullanıcı hesabını (ve rolünü değil) tablosunun sahibini yapacaktır. Kullanıcıları değiştirirseniz, ikinci kullanıcı ilk kullanıcı tarafından oluşturulan tablolarda doğru izinlere sahip olmaz. İki hesaba sahip olmanın sebebi hızlı bir şekilde geçiş yapabilmektir, örn. şifreyi hiçbir kesinti olmadan değiştirmem gerektiğinde.

Tablo oluştururken, rayların sahibi olarak belirli bir rol kullanmasını söylemenin bir yolu var mı? (ya da belki aynı postgresql rolünde iki hesaplar olmadan bunu gerçekleştirmek için daha iyi bir yolu var?)

GÜNCELLEME: Şimdiye kadar harici komut dosyası olarak elle çalıştırmak ve NOLOGIN rolüne tüm tabloları sahipliğini değiştirmek için this solution bulundu ama daha zarif bir şey umuyorum ya da raylarla iyi uyuyor.

cevap

5

Sen PostgreSQL tarafında biraz yapabilirsiniz: role1 tutan tüm ayrıcalıkları olması

Eğer role2 istiyorsanız, sadece can:

GRANT role1 TO role2; 

Ve/veya PostgreSQL 9.0 ile veya Daha sonra, yeni nesneler üzerinde default privileges ayarlamak için PostgreSQL'i talimat verebilirsiniz:

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.

sen roller veya şemalar için yapabilir. yapabildin sizin durumunuzda için: ayrıcalıkları bir dizi paylaşmaya birden çok farklı roller istiyorum

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

, bir tane sigara giriş role nesneler üzerinde tüm izinleri vereceğini (GROUP çağrılacak kullanılan) - Aşağıdaki örnekte role0. Bunun için DEFAULT PRIVILEGES kullanın ve sıralar dahil olmak üzere önceden var olan nesneleri unutmayın (bunları unutmaya eğilimliyim).
Sonra diğer roller için GRANT role0. Bu doğrultuda

:

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; 

kolayca GRANT ek ayrıcalıklar sadece bir rol ihtiyacı olmalıdır için eğer Bu şekilde. Bu kurulumda istediğiniz kadar rol ekleyebilirsiniz.

Birçok DML deyimleri, sahipliğinin numaralı içeriğe sahip olmasını gerektirir.Ben the manual on ALTER TABLE alıntı:

You must own the table to use ALTER TABLE.

yanı tablo iş sahibi rolünün üyesi olmak. Bu nedenle, yukarıdaki örnekte, role0 kendi tablolarını yaparsanız, role1 ve role2, ALTER TABLE'u kullanabilir. Oluşturduğunuz her tablo için

. Eğer CREATE komutları çalıştırmadan önce

Yoksa rolüne kayma: Hızlı cevap için

SELECT current_user, session_user; 
+0

Teşekkür:

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

kim olduğunu izini kaybetmiş edin. İlk seçeneğe bakmak: İki kullanıcıyla bir 'ana' rol oynamak yerine, her biri diğerinde verilen iki kullanıcımız olacak mı? Örneğin. 'GRANT user1 kullanıcısına2; GRANT user2 kullanıcısına1? Ve bu bir “anahtar” dan önce her seferinde manuel olarak yürütmek zorunda olacak mı? Eğer 'VARSAYILAN PRIVILEGES' kullanırsam ancak bunu sadece bir kez yapabilirim. Sağ? – gingerlime

+0

['GRANT'] (http://www.postgresql.org/docs/current/interactive/sql-grant.html), kalıcı olarak ayrıcalıklar vermek anlamına gelir ve yalnızca bir kez gereklidir. –

+0

daft için üzgünüm, ama bunun nasıl işe yaradığını anlamıyorum. Hiberarşinin hiyerarşik olduğu görülmektedir. GR GRANT user1 kullanıcısına ', böylece user2 kullanıcı1 ile aynı izinlere sahip olacak, ancak diğer şekilde değil. Hangi kullanıcının bir tablo oluşturduğuna bakılmaksızın, her iki kullanıcının da tam olarak aynı ayrıcalıklara sahip olmasına ihtiyacım var. Belki bir şey özlüyorum. – gingerlime