PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/10/2012 14:25:37

charleydc5
Membre

GRANT sur plusieurs fonctions dans un même script

Bonjour à tous,

J'ai déjà un script que j'utilise pour donner accès à tous les éléments que je désire dans pour une base de données spécifique. Ça fonctionne sur tous les objets de la base de données sauf pour les fonctions où je n'arrive pas à le faire fonctionner.

Voici mon script existant:

En gros on remplace <DATABASE>, <ROLE_NAME> et <SCHEMA> par les bonnes valeurs et on exécute tout simplement.

CREATE OR REPLACE FUNCTION <SCHEMA>.execute(text) 
RETURNS void AS 
 
$BODY$
	BEGIN 
		execute $1; 
	END;
$BODY$ 

LANGUAGE plpgsql;

-- Base de données/Database
GRANT CONNECT, TEMPORARY ON DATABASE <DATABASE> TO GROUP <ROLE_NAME>;

-- Schéma/Schema
GRANT USAGE ON SCHEMA <SCHEMA> TO <ROLE_NAME>;

-- Tables
SELECT 	<SCHEMA>.EXECUTE('GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON TABLE <SCHEMA>.' || relname || ' TO GROUP "<ROLE_NAME>";') 
FROM 	pg_class t, pg_namespace s 
WHERE 	t.relkind = 'r' 
AND 	t.relnamespace = s.oid 
AND 	s.nspname = '<SCHEMA>';

-- Séquences/Sequences
SELECT 	<SCHEMA>.EXECUTE('GRANT SELECT, UPDATE ON <SCHEMA>.' || relname || ' TO GROUP "<ROLE_NAME>";') 
FROM 	pg_class t, pg_namespace s 
WHERE 	t.relkind = 'S'
AND 	t.relnamespace = s.oid 
AND 	s.nspname = '<SCHEMA>';

-- Vues/Views
SELECT 	<SCHEMA>.EXECUTE('GRANT SELECT, UPDATE ON <SCHEMA>.' || relname || ' TO GROUP "<ROLE_NAME>";') 
FROM 	pg_class t, pg_namespace s 
WHERE 	t.relkind = 'v' 
AND 	t.relnamespace = s.oid 
AND 	s.nspname = '<SCHEMA>';

J'aimerais également ajouter un bloc pour supporter les fonctions. Présentement, je dois aller faire les grants pour les fonctions manuellement dans pgAdmin. C'est pas si mal mais j'aimerais mieux avoir un script qui couvre tout.

J'ai trouvé une "solution", mais elle nécessite une intervention supplémentaire:

SELECT 'GRANT ALL ON FUNCTION ' || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || ' (' || pg_get_function_identity_arguments(p.oid) || ') TO john_doe;'
FROM pg_language AS l
JOIN pg_proc AS p
ON p.prolang = l.oid
JOIN pg_namespace AS n
ON p.pronamespace = n.oid
WHERE l.lanname = 'plpgsql'

En gros, cette solution consiste à rouler le script-ci-dessous, et ensuite de copier coller le résultat de la requête pour ensuite l'exécuter séparemment.

Je suppose qu'il doit bien y avoir un moyen de tout faire cela sans une étape supplémentaire?

Merci beaucoup

Charles


Charles Morin
PostgreSQL 9.0.3 sur Windows 2008 Server Standard (x64)

Hors ligne

#2 15/10/2012 14:53:46

gleu
Administrateur

Re : GRANT sur plusieurs fonctions dans un même script

Je ne comprends pas bien. Pourquoi n'utilisez-vous pas la fonction que vous avez défini ? (<SCHEMA>.EXECUTE)


Guillaume.

Hors ligne

#3 15/10/2012 15:02:43

charleydc5
Membre

Re : GRANT sur plusieurs fonctions dans un même script

Ce que je veux dire, c'est que si je fonctionne de la même façon qu'avec les tables, les séquences, etc... ça ne fonctionne pas car les fonctions ont une signature (les paramètres). Je n'arrive pas à faire en sorte que peu importe la signature le GRANT se fasse correctement.

Je me demandais si quelqu'un ici avait une bonne pratique ou un script déjà fait pour faire un grant sur les fonctions vite fait. Je dois supporter un grand nombre de développeurs donc ce genre de scripts est très utile pour que tout le monde travaille de la même façon, surtout au niveau des permissions sur les bases de données.

Merci


Charles Morin
PostgreSQL 9.0.3 sur Windows 2008 Server Standard (x64)

Hors ligne

#4 15/10/2012 15:08:45

charleydc5
Membre

Re : GRANT sur plusieurs fonctions dans un même script

Voici ce que j'essaie de faire depuis un bon bout de temps:

SELECT 	monschema.EXECUTE('GRANT EXECUTE ON monschema.' || p.proname || '(' || pg_catalog.pg_get_function_arguments(p.oid) ||') TO GROUP "grp011_users";') 
FROM pg_catalog.pg_proc p     

LEFT JOIN pg_catalog.pg_namespace n ON 
n.oid = p.pronamespace 

WHERE pg_catalog.pg_function_is_visible(p.oid)      
AND n.nspname <> 'pg_catalog'   
AND n.nspname <> 'information_schema'

Le message d'erreur:

ERROR:  syntax error at or near "("
LINE 1: GRANT EXECUTE ON monschema.unaccent_string(text) TO GROUP "grp01...
                                              ^
QUERY:  GRANT EXECUTE ON monschema.unaccent_string(text) TO GROUP "grp011_users";
CONTEXT:  PL/pgSQL function "execute" line 2 at EXECUTE statement

********** Error **********

ERROR: syntax error at or near "("
SQL state: 42601
Context: PL/pgSQL function "execute" line 2 at EXECUTE statement

Je n'arrive pas à concaténer correctement pour composer la signature de la fonction.

Merci beaucoup pour votre aide


Charles Morin
PostgreSQL 9.0.3 sur Windows 2008 Server Standard (x64)

Hors ligne

#5 15/10/2012 16:07:07

gleu
Administrateur

Re : GRANT sur plusieurs fonctions dans un même script

Vous devez indiquer le mot-clé FUNCTION pour que cela fonctionne. Ainsi :

GRANT EXECUTE ON FUNCTION monschema.unaccent_string(text) TO GROUP "grp011_users";

Si vous n'indiquez pas le type d'objet, PostgreSQL suppose qu'il s'agit d'une relation. Et dans ce cas, une parenthèse n'a rien à y faire, d'où le message d'erreur.

Bref, ajoutez FUNCTION à votre GRANT et ça ira mieux smile


Guillaume.

Hors ligne

#6 15/10/2012 16:24:27

charleydc5
Membre

Re : GRANT sur plusieurs fonctions dans un même script

Merci Guillaume

Encore une belle erreur d'inattention.

J'apprécie ton aide.

A+


Charles Morin
PostgreSQL 9.0.3 sur Windows 2008 Server Standard (x64)

Hors ligne

Pied de page des forums