Chciałbym również, aby ta dotacja została utrzymana na potrzeby tworzenia nowych tabel w przyszłości.[...] Przeszukałem dokumentację i nie mogę znaleźć odpowiedniego rozwiązania.
Ponieważ przed 9.0 nie ma żadnego. Wszystko, co możesz uzyskać, to ustawić uprawnienia dla istniejących tabele. Musisz zrobić jedną GRANT
dla każdej tabeli, ponieważ przed 9.0 nie było trybu „luzem”. Zobacz gramer SQL dla wersji 8.4 i 9.0:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] tablename [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
i 9.0 tutaj:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Nowy ALL TABLES IN SCHEMA
część jest tą, której brakuje.
Także:Ustawienie uprawnień na poziomie bazy danych, jak w twoim pytaniu, nie pomoże ci:Ustawisz uprawnienia "tylko" dla bazy danych, ale nie do żadnych "zawartych" rzeczy, takich jak tabele. Odpowiednia sekcja:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE dbname [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Co oznacza, że możesz ustawić tylko CREATE
, CONNECT
i TEMP
uprawnienia do samej bazy danych, ale bez SELECT
, INSERT
itp.
Jak dotąd za złe rzeczy. Co możesz są następujące rzeczy:
-
Zmniejsz liczbę zarządzania uprawnieniami, nadając uprawnienia nie użytkownikom, ale rolom. Następnie dodaj role do poszczególnych użytkowników. Po utworzeniu nowej tabeli wystarczy dostosować jedną lub dwie role, ale nie setki użytkowników.
-
Przeszukuj katalogi systemowe i utwórz odpowiedni
GRANT
polecenia. Zapisz je do pliku i uruchom ten plik. Powinno to ułatwić uruchamianie.
Takie zapytanie może wyglądać tak:
select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;'
from information_schema.tables
where
table_type = 'BASE TABLE' and
table_schema not in ('pg_catalog', 'information_schema');