2013-05-16 12 views
5

Potrzebuję nowego użytkownika, ale powinien on otrzymać wszystkie te uprawnienia, które ma inny istniejący użytkownik/rola.jak utworzyć duplikat roli użytkownika w postgresie

np.

  • Użytkownik A ma uprawnienia SELECT na Table1
  • Użytkownik A ma uprawnienia EXECUTE Table2
  • ...

Jeśli tworzony jest nowy użytkownika B, muszę te same przywileje jak

  • Użytkownik B ma uprawnienia SELECT na Table1
  • użytkownik B EXECUTE uprawnienia Table2
  • ...

nie pytaj dlaczego:/

Właściwie Użytkownik A ma niestandardowe uprawnienia na różnych tabel, schematów i funkcji; tak więc bardzo żmudny i długotrwały proces ręcznego udzielania uprawnień nowemu użytkownikowi. Każda pomoc byłaby dobra.

Odpowiedz

0

Musiałem napisać kod pgpsql, aby przechwycić uprawnienia użytkownika A i przekazać go użytkownikowi B. Wykonano to bez żadnego problemu.

create or replace function update_user_privileges() returns text as 
$$ 
declare 

     info record; 
     str text; 

begin 
     /*Grant privileges to user B the same as with user A for a given table schema*/ 
     str:=''; 
     FOR info IN 
      select * from information_schema.table_privileges where table_schema='public' and grantee = 'A' 
     LOOP 
      /*append the tables' name, for which we are assigning privileges from user A to B*/ 
      str:= str ||info.table_name || ','; 

     /*this is the main statement to grant any privilege*/ 
     execute 'GRANT '|| info.privilege_type ||' on table public.'|| info.table_name || ' to B'; 

     END LOOP; 

    return str; 
end 

$$ language 'plpgsql'; 

Zastosowanie: Kopiuj/wklej ten kod do skrzyni tej funkcji, a następnie wykonaj

select update_user_privileges(); 

** Musisz dostosować ją do stolika-schematu i tabeli nazw. Mam nadzieję, że pomaga każdemu

+0

co z kolumną, funkcją, uprawnieniami widoków? – ArunaFromLK

1

Najpierw zrozum, że roles i users to to samo. W rzeczywistości nie ma rzeczy o nazwie user, jest to po prostu ROLE z opcją LOGIN.

Druga roles może być przyznana innej roles.

Trzecie przywileje w zakresie ról można dziedziczyć.

utworzeniu użytkownika a jak Więc zakładając:

CREATE ROLE A LOGIN; 
GRANT SELECT ON table1 TO a; 
GRANT EXECUTE ON FUNCTION xxx TO a; 

powinien być w stanie utworzyć drugą rolę, która odzwierciedla pierwszą rolę takiego:

CREATE ROLE b LOGIN; 
GRANT a TO b; 
+0

Nie musisz określać "INHERIT" dla roli A. Tylko dla roli B (kto odziedziczy prawa). + 'INHERIT' jest ustawieniem domyślnym, więc nie trzeba go zapisywać jawnie. –

+0

Dobrze, byłem po prostu jawny, ale to chyba tylko denerwujące ... * aktualizacje * –

+0

co, jeśli nie chcę dziedziczyć przywilejów roli, ale zamiast tego przyznać wszystkie przywileje od A do B, a także być w stanie zmienić uprawnienia A bez wpływu na B – Saad

4

Spróbuj coś takiego:

GRANT A TO B; 

Udziela prawa do pełnienia roli A do B.

Aby uzyskać szczegółowe informacje, przeczytaj rozdział this w podręczniku.

+0

Niewystarczające. Jeśli A jest superużytkownikiem, potrzebujesz również: ZMIENIAĆ UŻYTKOWNIKA B Z SUPERUSUSEM; –

+0

Uwaga: sprawi to, że rola B "odziedziczy" wszystkie uprawnienia do roli A. Role będą połączone w pewien rodzaj relacji dziedziczenia. To nie będzie faktycznie duplikować przywilejów. –

0

Użyłem następującej metody, aby utworzyć nowego użytkownika tak samo jak istniejący użytkownik przy użyciu Ubuntu.

  1. Uzyskaj pełny zrzut istniejącej bazy danych.
  2. Użyj poniższego polecenia, aby wyodrębnić każdą linię z użytkownikiem, który chcesz sklonować.

    cat/path/to/db_dump_file | grep "nazwa_użytkownika_użytkownika" >> /ścieżka/do/ekstrakt.sql

  3. Otwórz extract.sql za pomocą edytora tekstu i zastąp istniejącą nazwę użytkownika nową nazwą użytkownika.

  4. Usuń niechciane zapytania (jeśli istnieją).
  5. Teraz masz nowe zapytania SQL, aby utworzyć nowego użytkownika.

To działało dla mnie dobrze. Mam nadzieję, że to pomoże komuś.

Powiązane problemy