PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL 8.4 przyznaje uprawnienia DML do wszystkich tabel do roli

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');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połączenie odrzucone (PGError) (postgresql i rails)

  2. Nie można utworzyć tabeli bazy danych o nazwie „użytkownik” w PostgreSQL

  3. Brak `pg_tblspc` po instalacji najnowszej wersji OS X (Yosemite lub El Capitan)

  4. isnumeric() z PostgreSQL

  5. dlaczego PG::UniqueViolation:BŁĄD:zduplikowana wartość klucza narusza ograniczenie unikalności?