2012-04-18 10 views
5

Jestem nowy na szynach, więc mam nadzieję, że to nie jest głupie pytanie.Jak ustawić własność tabeli w szynach z postgresql?

Próbuję zrobić szyn używać bazy danych PostgreSQL z dwóch różnych kont użytkownika. Chcę jednak móc przełączać się między tymi kontami, więc mają takie same uprawnienia do bazy danych (bez tego, aby obaj byli superużytkownikami postgreSQL idealnie).

Stworzyłem rolę w PostgreSQL, która jest właścicielem bazy danych. Następnie przypisano do tej roli dwa konta użytkowników. Jednak za każdym razem, gdy wykonuję numer rake db:migrate, konto użytkownika (a nie rola) stanie się właścicielem tabeli Tabela. Jeśli zmienię użytkowników, drugi użytkownik nie będzie miał odpowiednich uprawnień do tabel utworzonych przez pierwszego użytkownika.

Powodem posiadania dwóch kont jest możliwość szybkiego przełączania, np. kiedy muszę zmienić hasło bez przestojów.

Czy istnieje sposób, aby powiedzieć szynom, aby używały określonej roli jako właściciel podczas tworzenia tabel? (lub być może istnieje lepszy sposób, aby osiągnąć ten cel bez dwóch kont w tej samej roli PostgreSQL?)

UPDATE: Do tej pory znalazłem this solution uruchomić ręcznie jako skrypt zewnętrznego i zmienić własność wszystkich stołów do roli nologin, ale mam nadzieję na coś bardziej eleganckiego lub dobrze pasującego do szyn.

Odpowiedz

5

Można zrobić trochę na boku PostgreSQL:

Jeśli chcesz role2 mieć wszystkie przywileje, które role1 trzyma, można po prostu:

GRANT role1 TO role2; 

i/lub PostgreSQL 9.0 lub później można polecić PostgreSQL ustawić default privileges na nowych obiektów:

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.

można to zrobić na role lub schematów. W Twoim przypadku możesz:

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

Jeśli chcesz wiele różnych ról podzielić zbiór przywilejów, chciałbym udzielić wszystkie uprawnienia obiektów do jednej zakaz logowania roli (kiedyś nazywane GROUP) - role0 w moim przykładzie poniżej. Użyj do tego celu DEFAULT PRIVILEGES i nie zapomnij o wcześniej istniejących obiektach, w tym sekwencjach (często je zapominam).
Następnie GRANT role0 do tych innych ról.

Wzdłuż tych linii:

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; 

W ten sposób można łatwo GRANT dodatkowe przywileje tylko jedna rola w razie potrzeby powinno być. Możesz dodać dowolną liczbę ról do tej konfiguracji.

Wiele oświadczeń DML wymaga właściciela obiektu.Cytuję the manual on ALTER TABLE:

You must own the table to use ALTER TABLE.

Będąc członkiem roli, która jest właścicielem pracę tabeli, jak również. W powyższym przykładzie, jeśli tworzysz własne tabele, role0, role1 i role2 mogą używać ALTER TABLE. Wykonanie:

ALTER TABLE tbl OWNER TO user0; 

dla każdego utworzonego stołu.

Albo wsunąć do roli przed uruchomieniem polecenia CREATE:

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

Jeśli straciłem kim jesteś:

SELECT current_user, session_user; 
+0

Dzięki za szybką odpowiedź. Tak więc patrząc na pierwszą opcję: zamiast mieć jedną rolę "nadrzędną" z dwoma użytkownikami, będę mieć dwóch użytkowników przyznanych po drugiej? na przykład 'GRANT user1 TO user2; PRZYZNAĆ użytkownika 2 DO użytkownika 1? A to będzie trzeba ręcznie wykonać za każdym razem przed "przełącznikiem"? Jeśli używam "PRZYCHODNICH DOMYŚLNYCH", mogę to zrobić tylko raz. Dobrze? – gingerlime

+0

['GRANT'] (http://www.postgresql.org/docs/current/interactive/sql-grant.html) oznacza stałe przyznawanie uprawnień i jest potrzebne tylko raz. –

+0

Przepraszam za bycie głupim, ale nie rozumiem, jak to działa. Wydaje się, że granty są hierarchiczne, np. 'GRANT user1 TO user2', więc użytkownik2 będzie miał takie same uprawnienia jak użytkownik1, ale nie na odwrót. Potrzebuję obu użytkowników, aby mieli dokładnie takie same uprawnienia, niezależnie od tego, który użytkownik utworzył tabelę. Być może czegoś brakuje. – gingerlime

Powiązane problemy