2011-06-23 15 views
16

Chcę utworzyć użytkownika z tylko wybranym uprawnieniem dla wszystkich tabel we wszystkich bazach danych. Myślałem, że mogę uzyskać listę baz danych i zastosować następujące polecenie dla każdej bazy danych:Jak utworzyć użytkownika z uprawnieniami tylko do odczytu dla wszystkich baz danych w PostgreSQL?

GRANT select ON DATABASE dbname to user1; 

Ale mam następujący błąd:

ERROR: invalid privilege type SELECT for database 

Kiedy google ludzie powinni robić operację grant select dla wszystkich stołów. Ale nowe tabele są dodawane zawsze. To nie jest dla mnie dopuszczalne rozwiązanie. Czy ktoś zna jakieś obejścia?

+0

@Jonas faktycznie jest to podstawowy SQL, więc nie dobre dopasowanie do DBA - http: //dba.stackexchange.com/faq – Stefano

Odpowiedz

17

Nie można tego zrobić na poziomie bazy danych, tylko na poziomie schematu.

Zakładając, że tylko przy użyciu schematu public w każdej bazy danych, można to zrobić:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user; 
+2

Twoje oświadczenie, że będzie to dotyczyło nowo utworzonych tabel i widoków jest niepoprawne - "WSZYSTKIE TABLICE" są po prostu skrótem do uruchamiania GRANT SELECT na każdej aktualnie istniejącej tabeli i nie ustawiają żadnych wartości domyślnych. Aby ustawić domyślne dla nowych obiektów, potrzebujesz komendy ALTER DEFAULT PRIVILEGES: http://www.postgresql.org/docs/current/static/sql-alterdefaultprivileges.html (Zobacz moją odpowiedź poniżej) – IMSoP

+0

@IMSoP: thanks for pointing to! –

+0

Pierwotne pytanie dotyczyło SELECt dla wszystkich tabel i WSZYSTKICH baz danych. Jest to możliwe w mysql, ale (jak sądzę) nie jest możliwe w postgresie. W postgresie należy przyznać te prawa dla każdej bazy danych niezależnie. Może możesz dodać to jako wyjaśnienie (lub poprawić mnie, jeśli to możliwe). – Michael

4

Zdaję sobie sprawę, że już powiedziałeś, że nie jest to akceptowalna odpowiedź, ale i tak jest to właściwa odpowiedź.

Określanie zabezpieczeń (GRANT i REVOKE) jest częścią projektowania i testowania tabel.

Nie przenoś tabel do produkcji, zanim definicje tabel, zabezpieczenia, testy i dane testowe będą pod kontrolą wersji.

Po tym, PostgreSQL nie ma żadnych uprawnień SELECT do baz danych. W bazach danych można udzielać uprawnień CREATE, CONNECT lub TEMP.

Możesz udzielić SELECT na wszystkich tabelach w danym schemacie. Nie wiem jak to wpływa na tabele utworzone po uruchomieniu instrukcji GRANT, ale jest to dość łatwe do przetestowania.

PostgreSQL Grant syntax

21

trzeba zrobić 2 rzeczy: po pierwsze, umożliwić dostęp do istniejących obiektów; i po drugie, ustaw domyślny dostęp dla nowych obiektów utworzonych od teraz.

Należy pamiętać, że przyznanie dostępu do "TABLES" obejmuje widoki, ale nie obejmuje sekwencji (takich jak funkcja automatycznego zwiększania liczby dla kolumn "SERIAL"), więc prawdopodobnie będziesz także chciał przyznać dostęp do nich.

Poniższe zakłada, że ​​chcesz zrobić wszystko w schemacie public. Instrukcja ALTER DEFAULT PRIVILEGES może działać na całej bazie danych, pomijając klauzulę IN SCHEMA ...; GRANT należy uruchomić raz dla każdego schematu.

-- Grant access to current tables and views 
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; 
-- Now make sure that's also available on new tables and views by default 
ALTER DEFAULT PRIVILEGES 
    IN SCHEMA public -- omit this line to make a default across all schemas 
    GRANT SELECT 
ON TABLES 
TO user1; 

-- Now do the same for sequences 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1; 
ALTER DEFAULT PRIVILEGES 
    IN SCHEMA public -- omit this line to make a default across all schemas 
    GRANT SELECT, USAGE 
ON SEQUENCES 
TO user1; 

podręcznik PostgreSQL

+0

Dziwnie potrzebowałem 'use grant na schemacie public do user1;' oraz –

3

Dla wersji PostgreSQL niższych niż 9.0:

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;' 
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME 

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;' 
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME 

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;' 
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME 
+0

musiałem zrobić 'psql -d DBNAME -qAt -c" SELECT 'GRANT SELECT ON '|| relname ||' TO USER; ' FROM pg_statio_all_tables WHERE schemaname = 'public' "| psql -d DBNAME' jeszcze – tymik

Powiązane problemy