2013-05-16 8 views
5

Ho bisogno di un nuovo utente, ma dovrebbe essere concesso tutti i privilegi che ha l'altro utente/ruolo esistente.come creare il ruolo duplicato di un utente in postgres

ad es.

  • utente A ha privilegi SELECT sul Table1
  • utente A ha ESEGUIRE privilegi su Table2
  • ...

Se viene creato un nuovo utente B, ho bisogno gli stessi privilegi,

  • utente B dispone di privilegi di SELECT sul Table1
  • utente B ha ESEGUI privilegi su Table2
  • ...

Non chiedono perché:/

In realtà l'utente A ha privilegi personalizzati su diversi tavoli, schemi e funzioni; quindi il suo processo molto noioso e lungo per concedere manualmente le autorizzazioni al nuovo utente. Qualsiasi aiuto sarebbe buono.

risposta

0

Ho dovuto scrivere il codice pgpsql per eseguire il loop dei privilegi dell'utente A e assegnarlo all'utente B. È stato eseguito senza alcun problema.

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

Usage: Copia/incolla questo codice qui crea questa funzione e poi fare

select update_user_privileges(); 

** Bisogna adattarsi per il vostro tavolo-schema e tabella-nomi. Spero che aiuti chiunque

+0

E riguardo le autorizzazioni di colonne, funzioni, viste? – ArunaFromLK

1

Innanzitutto capisco che roles e users sono la stessa cosa. In realtà non esiste una cosa chiamata user, è solo una ROLE con un'opzione LOGIN.

Secondo roles può essere concesso ad altri roles.

I terzi privilegi sui ruoli possono essere ereditati.

Quindi supponendo che avete creato il vostro utente a come:

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

Si dovrebbe essere in grado di creare un secondo ruolo che rispecchia il primo ruolo come:

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

Non è necessario specificare 'INHERIT' per il ruolo A. Solo per il ruolo B (che erediterà i diritti). + 'INHERIT' è un valore predefinito, quindi non è necessario scriverlo esplicitamente. –

+0

Buon punto, stavo solo esplicitando, ma probabilmente è solo fastidioso ... * aggiornamenti * –

+0

cosa succede se non desidero ereditare i privilegi di ruolo ma invece concedere tutti i privilegi da A a B e anche essere in grado di cambiare i privilegi di A senza influenzare B – Saad

4

Prova qualcosa di simile:

GRANT A TO B; 

Assegna tutto il diritto del ruolo A a B.

Per dettagli leggere il capitolo this del manuale.

+0

Insufficiente. Se A è un superutente, è necessario anche: ALTER USER B WITH SUPERUSER; –

+0

Avviso: questo renderà il ruolo B "ereditario" tutti i privilegi del ruolo A. I ruoli verranno accoppiati in una sorta di relazione di ereditarietà. Questo in realtà non duplica i privilegi. –

0

Ho usato il seguente metodo per creare un nuovo utente come un utente esistente utilizzando Ubuntu.

  1. Ottenere un dump completo del database esistente.
  2. Utilizzare il comando seguente per estrarre ogni riga con l'utente che si desidera clonare.

    cat/percorso/to/db_dump_file | grep "nome_utente_esperto" >> /path/to/extract.sql

  3. Aprire extract.sql con un editor di testo e sostituire il nome utente esistente con il nuovo nome utente.

  4. Rimuovere le query indesiderate (se presenti).
  5. Ora ci sono nuove query SQL per creare il nuovo utente.

Questo ha funzionato bene per me. Spero che questo aiuti qualcuno.