Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
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
Pages : 1