2017-07-13 5 views
2

J'ai ajouté l'extension postgis_topology, qui a ajouté le schéma de topologie à ma base de données. Toutefois, mon utilisateur root ne dispose pas de privilèges suffisants pour utiliser les fonctions de ce schéma dans l'instance AWS RDS. Le schéma de la topologie a été créé avec les éléments suivants (comme on le voit dans pgAdmin):Modification des privilèges sur le schéma créé par l'utilisateur rdsadmin

CREATE SCHEMA topology 
    AUTHORIZATION rdsadmin; 

Lorsque je tente d'exécuter l'instruction SELECT topology.CreateTopology('element_topo', 4326); je reçois une erreur « permission refusée pour la topologie de schéma ». Lorsque j'essaie de supprimer le schéma et de recommencer, l'erreur est "doit être le propriétaire de la topologie du schéma".

J'ai aussi essayé simplement d'accorder des autorisations à mon utilisateur root avec

GRANT ALL ON ALL FUNCTIONS IN SCHEMA topology TO my_root_user; 

mais donne juste la « permission refusée pour la topologie de schéma ».

Comment accorder des privilèges sur ce schéma à mon utilisateur root?

Répondre

1

Je n'ai pas trouvé la raison pour laquelle l'instruction CREATE EXTENSION postgis_topology; crée le schéma de topologie et toutes ses fonctions et tables avec l'utilisateur administrateur rds. Cependant, cela empêche les autres utilisateurs d'exécuter des fonctions.

L'instruction DO suivante résout les problèmes en mettant à jour le propriétaire des tables et des fonctions au rôle donné à l'utilisateur root de la base de données.

DO 
$BODY$ 
DECLARE 
    _sql text; 

BEGIN 

    EXECUTE 'SET search_path = topology,public;'; 

    EXECUTE 'ALTER SCHEMA topology OWNER TO rds_superuser;'; 

    EXECUTE 'ALTER TABLE topology.topology OWNER TO rds_superuser;'; 

    EXECUTE 'ALTER TABLE topology.topology_id_seq OWNER TO rds_superuser;'; 

    EXECUTE 'ALTER SEQUENCE topology.topology_id_seq OWNER TO rds_superuser;'; 

    EXECUTE 'ALTER TABLE topology.layer OWNER TO rds_superuser;'; 

    SELECT INTO _sql 
    string_agg('ALTER FUNCTION ' 
     || nsp.nspname || '.' 
     || p.proname || '(' 
     || pg_get_function_identity_arguments(p.oid) 
     || ') OWNER TO rds_superuser;', E'\n' 
    ) 
    FROM pg_catalog.pg_proc p 
    JOIN pg_catalog.pg_namespace nsp ON p.pronamespace = nsp.oid 
    WHERE nsp.nspname = 'topology'; 

    EXECUTE _sql; 

END 
$BODY$;