#1 Wed 23 September 2009 10:30
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
postgresql : table avec privilèges
Bonjour,
Je cherche à créer une table qui mettrait le nom des tables où j'ai tous les privilèges.
Je me suis intéressé à la table pg_class. or le champ relacl est de type aclitem et il est impossible d'addapter des fonctions texte sur ce champ. Auriez-vous d'autres idées.
En effet, la selection suivante ne marche pas
Code:
select relname, relacl from pg_class where relacl like '%pluvinet%' ;
Merci d'avance
Pascal PLUVINET
Hors ligne
#2 Wed 23 September 2009 10:52
Re: postgresql : table avec privilèges
Bonjour Pascal,
en "castant" l'attribut relacl en text, la séléction fonctionne :
Code:
select relname, relacl from pg_class where relacl::text like '%pluvinet%' ;
Dernière modification par Mathieu BOSSAERT (Wed 23 September 2009 10:53)
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#3 Wed 23 September 2009 10:55
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: postgresql : table avec privilèges
J'avais déjà essayé et cela ne fonctionne pas
Code:
select relname, relacl from pg_class where relacl::text like '%pluvinet%' ; ERROR: cannot cast type aclitem[] to text LINE 1: ...elect relname, relacl from pg_class where relacl::text like ...
Pascal PLUVINET
Hors ligne
#4 Wed 23 September 2009 11:45
Re: postgresql : table avec privilèges
Je ne comprends pas,
aucun problème chez moi (select version() => PostgreSQL 8.3.5, compiled by Visual C++ build 1400)
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#5 Wed 23 September 2009 12:02
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: postgresql : table avec privilèges
Je suis sur 8.2 :
PostgreSQL 8.2.0 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 3.3.5 (Debian 1:3.3.5-13)
Est-ce que c'est un problème de version?
On n'a pas l'intention de changer de version dans un avenir proche. Et je suis bien déçu que cela ne marche pas sur notre serveur!
J'ai essayé avec la fonction cast(), c'est idem.
C'est dommage car je n'avais pas envie d'abandonner !!!
Comment pourrais-je contourner cela? ....
Pascal PLUVINET
Hors ligne
#6 Wed 23 September 2009 12:48
Re: postgresql : table avec privilèges
Désolé Pascal, je ne suis pas à même de te répondre.
Il y a par contre des pistes ici :
http://markmail.org/message/2kzn4udf7xd … te:results
array_out(relacl) retourne un type cstring, tu dois pouvoir le "caster" en "text".
Et il semblerait bien que la possibilité de "caster" ce type en "text" soit apparu avec la version 8.3 de postgresql
Dernière modification par Mathieu BOSSAERT (Wed 23 September 2009 12:52)
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#7 Wed 23 September 2009 14:20
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: postgresql : table avec privilèges
Merci Mathieu,
Mon but final était de pouvoir donner à certains utilisateurs tous les droits sur mes tables. Pour cela, je me suis appercu que pour selectionner toutes les tables dont je suis le propriétaire, je n'avais pas forcément besoin du champ relacl
et j'ai trouvé la fonction pg_get_userbyid(relowner) from pg_class.
En cadeau, je vous donne la fonction qui permet donc à un utilisateur A de donner tous les droits à un utilisateur B sur toutes les tables de l'utilisateur A:
Code:
CREATE SCHEMA acl_admin; CREATE OR REPLACE FUNCTION acl_admin.grant_on_all(text, text, text) RETURNS TEXT STRICT VOLATILE AS ' DECLARE usr ALIAS FOR $1; prv ALIAS FOR $2; own ALIAS FOR $3; rel record; sql text; BEGIN FOR rel IN SELECT pg_catalog.quote_ident(schema_name) AS schema_name, pg_catalog.quote_ident(relation_name) AS relation_name FROM acl_admin.schema_and_relation_view where relation_name not in (''geometry_dump'',''plr_environ_type'',''r_typename'') and relation_name in (select c.table_name from (select c.relnamespace, c.relname as table_name, pg_get_userbyid(c.relowner) as table_owner, c.relacl from pg_class as c) as c join pg_namespace n on n.oid = c.relnamespace and c.table_owner = own) order by schema_name, relation_name LOOP sql := ''GRANT '' || prv || '' ON '' || rel.schema_name || ''.'' || rel.relation_name || '' TO '' || usr; RAISE NOTICE ''%'', sql; EXECUTE sql; END LOOP; RETURN ''OK''; END; ' LANGUAGE 'plpgsql'; COMMENT ON FUNCTION acl_admin.grant_on_all(text,text) IS 'Given a user name and privilidge, execute GRANT privilidge ON all relations in all schemas TO user.'; CREATE OR REPLACE FUNCTION acl_admin.grant_on_all(text,text) RETURNS TEXT STRICT VOLATILE AS 'SELECT acl_admin.grant_on_all($1, ''ALL''::text,$2);' LANGUAGE 'sql'; COMMENT ON FUNCTION acl_admin.grant_on_all(text) IS 'Given a user name, execute GRANT ALL ON all relations in all schemas TO user.'; select acl_admin.grant_on_all('utilisateur B','utilisateur A');
Je me suis inspiré également de cette page :
http://labs.alunys.com/viewvc/projects/ … iew=markup
A bientôt
Dernière modification par ppluvinet (Wed 23 September 2009 16:26)
Pascal PLUVINET
Hors ligne