2011-07-23 11 views
14

nie mogę dowiedzieć się, jak dać każdą prawo do określonego użytkownika, chcę użytkownikowi mieć każdą prawo na schemacie:PgSQL: Grant każdą prawo do użytkownika na schemacie

  • wkładki, usuwa, aktualizacje, wybiera ... na istniejących tabel

próbowałem robić:

GRANT ALL PRIVILEGES ON SCHEMA schema to "user"; 
    GRANT ALL ON SCHEMA schema to "local_518561"; 
    GRANT ALL PRIVILEGES ON table schema.table to "user"; 
    GRANT ALL ON table schema.table to "user"; 

w querys powrócić udana, ale za każdym razem korzystać z innych użytkownikowi uzyskać insuffie błąd centów uprawnień.

Odpowiedz

3

Odpowiedź dotyczy sekwencji, jeśli nie przyznajesz praw do tabeli ORAZ sekwencji (jeśli istnieją), której nie możesz wstawić.

4

Jeśli używasz wersji PostgreSQL < 9, można użyć następujących procedur przechowywania zarządzać uprawnieniami tabel i sekwencji:

CREATE OR REPLACE FUNCTION grantTablesOfSchema (user VARCHAR, 
    permissions VARCHAR, schema VARCHAR) RETURNS VARCHAR AS 
$body$ 
DECLARE 
    regActual RECORD; 
    numTables INTEGER; 
BEGIN 

    numTables := 0; 

    FOR regActual IN 
     SELECT tablename FROM pg_tables WHERE schemaname = schema 
    LOOP 
     numTables := numTables + 1; 

     EXECUTE 'GRANT ' || permissions || ' ON ' || schema || '.' || regActual.tablename || ' TO ' || user; 
    END LOOP; 

    RETURN 'Tables: ' || numTables::VARCHAR; 
END; 
$body$ 
LANGUAGE 'plpgsql'; 


CREATE OR REPLACE FUNCTION grantSequencesOfSchema (user VARCHAR, 
    permissions VARCHAR, database VARCHAR, schema VARCHAR) RETURNS VARCHAR AS 
$body$ 
DECLARE 
    regActual  RECORD; 
    numSequences INTEGER; 
BEGIN 

    numSequences := 0; 

    FOR regActual IN 
     SELECT sequence_catalog, sequence_schema, sequence_name 
     FROM information_schema.sequences 
     WHERE sequence_catalog = database AND sequence_schema = schema 
    LOOP 
     numSequences := numSequences + 1; 

     EXECUTE 'GRANT ' || permissions || ' ON ' || schema || '.' || regActual.sequence_name || ' TO ' || user; 
    END LOOP; 

    RETURN 'Sequences: ' || numSequences::VARCHAR; 
END; 
$body$ 
LANGUAGE 'plpgsql'; 

oraz przykładowe zastosowania:

CREATE USER user1 WITH PASSWORD '[email protected]?user1'; 
GRANT CONNECT ON DATABASE database1 TO user1; 
GRANT USAGE ON SCHEMA schema1 TO user1; 

SELECT * FROM grantTablesOfSchema ('user1', 'SELECT, UPDATE, INSERT, DELETE', 'schema1'); 

SELECT * FROM grantSequencesOfSchema ('user1', 'ALL', 'database1', 'schema1'); 

Jeśli, przeciwnie, twoja wersja PostgreSQL wynosi> = 9:

GRANT ALL ON ALL SEQUENCES IN SCHEMA schema1 TO user1; 
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA schema1 TO user1; 
20
GRANT ALL PRIVILEGES ON     SCHEMA schema_name TO role_name; 
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema_name TO role_name; 
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA schema_name TO role_name; 
Powiązane problemy