2015-07-26 1 views
3

L'application que j'intègre va maintenant créer de nouveaux schémas. Pour accorder l'accès en lecture seule au nouveau schéma créé et aux tables spécifiques du schéma, j'exécute les commandes suivantes:accorder l'utilisation et les privilèges sur le schéma créé dans PostgreSQL

(chaque client a son propre schéma, par exemple schema1, schema2, schema3 .... etc)
GRANT USAGE ON SCHEMA schema1 TO read_only_user; 
GRANT SELECT ON schema1.talbe1 TO read_only_user; 
GRANT SELECT ON schema1.table2 TO read_only_user; 

GRANT USAGE ON SCHEMA schema2 TO read_only_user; 
GRANT SELECT ON schema2.talbe1 TO read_only_user; 
GRANT SELECT ON schema2.table2 TO read_only_user; 

(......and so on.....) 

Je me demande simplement si je pourrais accorder des privilèges d'utilisation & sur le futur schéma créé dans PostgreSQL. Impossible de trouver des façons de modifier les privilèges par défaut sur les futures tables créées, mais pas sur les futurs schémas créés.

Répondre

1

Il n'existe aucun privilège par défaut pour les schémas. Mais puisque vous utilisez un modèle dans lequel chaque utilisateur a son propre schéma, vous pouvez automatiser le processus complet, y compris la création de l'utilisateur et définir un mot de passe, si nécessaire:

CREATE FUNCTION new_user_schema (user text, pwd text) RETURNS void AS $$ 
DECLARE 
    usr name; 
    sch name; 
BEGIN 
    -- Create the user 
    usr := quote_identifier(user); 
    EXECUTE format('CREATE ROLE %I LOGIN PASSWORD %L', usr, quote_literal(pwd)); 

    -- Create the schema named after the user and set default privileges 
    sch := quote_identifier('sch_' || user); 
    EXECUTE format('CREATE SCHEMA %I', sch); 
    EXECUTE format('ALTER SCHEMA %I OWNER TO %L', sch, usr); 
    EXECUTE format('ALTER DEFAULT PRIVILEGES IN SCHEMA %I 
        GRANT SELECT ON TABLES TO %L', sch, usr); 
END; $$ LANGUAGE plpgsql STRICT;

Vous pouvez ensuite créer l'utilisateur, créer le schéma et définir les privilèges par défaut avec une simple commande:

SELECT new_user_schema('new_user', 'secret'); 
+0

Merci pour votre réponse. Apprécié. – edyywang

+0

Merci pour votre réponse. Apprécié. Toutefois, mon problème est que je n'ai pas le contrôle lorsque le nouveau schéma de base de données créé et l'utilisateur en lecture seule que j'ai accordé n'est pas le propriétaire du schéma (je n'ai pas non plus le contrôle du propriétaire du schéma d'origine). Donc je suppose que ce dont j'ai besoin est un processus automatisé pour détecter un schéma créé et accorder une utilisation/sélection à l'utilisateur en lecture seule. – edyywang

+0

Alors, qui va faire la commande 'GRANT'? Comme il n'est apparemment pas le propriétaire du schéma, il devra être un super-utilisateur. Et comment le schéma est-il créé? – Patrick