Masz co najmniej dwie opcje.
Pierwszy wykorzystuje małe zapytanie i edytor tekstu. Musimy zebrać schematy naszego zainteresowania:
SELECT nspname
FROM pg_namespace;
Możesz dodać WHERE
klauzulę, jeśli chcesz ograniczyć zakres. Skopiuj dane wyjściowe i popraw je, aby uzyskać szereg GRANT USAGE ON SCHEMA ... TO your_role;
poleceń. Następnie po prostu nakarm go psql
, na przykład:
psql -f multigrant.sql
Typowym wariantem tego może być skrypt powłoki, który zapętla zebrane nazwy i wywołania psql
, przekazując zbudowaną GRANT
instrukcję do -c
opcji.
Drugie rozwiązanie robi to samo w jednym bloku pl / pgsql, tworząc dynamiczne zapytanie. Rdzeń jest taki sam - musimy zebrać schematy. Następnie zapętlamy je wszystkie, przyznając schemat uprawnień według schematu:
DO $do$
DECLARE
sch text;
BEGIN
FOR sch IN SELECT nspname FROM pg_namespace
LOOP
EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
END LOOP;
END;
$do$;
Uwagi :
- w przeciwieństwie do tabel, sekwencji, funkcji i typów, nie można ustawiać domyślnych uprawnień dla schematów (od 9.4). Będziesz musiał przyznać to uprawnienie dla każdego nowo dodanego schematu ręcznie.
- tutaj używam cytowania dolara podczas tworzenia zapytania dynamicznego. Pozwala mi to na użycie „normalnej” składni, w przeciwieństwie do mnożenia pojedynczych cudzysłowów, na przykład (nieobecnych w tym przykładzie). W ten sposób większość redaktorów ładnie podświetli stwierdzenia.
- Używam również
format()
ze specyfikatorem %I
formatu, aby w razie potrzeby poprawnie podać nazwę obiektu. To podejście jest znacznie bardziej czytelne niż budowanie zapytania z konkatenacją stałych łańcuchowych i niektórych quote_ident()
wywołań.
pg_namespace
można znaleźć w pg_catalog
schemacie. Sprawdź inne znajdujące się tam obiekty - przechowują one każdy aspekt twoich schematów, tabel i tak dalej.
grant usage
nowy schemat.Ty też możesz użyć.
źródło