2017-04-20 5 views
0

Je cherche un moyen de créer une fonction qui accepte deux paramètres pour le nom d'utilisateur et le mot de passe et crée un rôle en lecture seule avec lui. J'ai essayé quelque chose comme:Créer un rôle par programmation avec les paramètres

create or replace function create_user_readonly (
    unm varchar, 
    pwd varchar 
) 
    returns varchar(10) as $$ 

begin 

    create role unm login password @pwd; 
    return 'success'; 

end; 

$$ language plpgsql; 

Cela jette l'erreur:

[42601] ERROR: syntax error at or near "@" Position: 151

Je pensais d'utiliser SQL dynamique pour construire la requête, mais couru dans ce ici (https://www.postgresql.org/docs/9.1/static/plpgsql-statements.html):

Another restriction on parameter symbols is that they only work in SELECT, INSERT, UPDATE, and DELETE commands. In other statement types (generically called utility statements), you must insert values textually even if they are just data values.

Répondre

2

voici un exemple:

create or replace function create_user_readonly (
    unm varchar, 
    pwd varchar 
) 
    returns varchar(10) as $$ 

begin 

    execute format($f$create role %I login password '%s'$f$,unm,pwd); 
    execute format('alter role %I set transaction_read_only to on',unm); 
    return 'success'; 

end; 

$$ language plpgsql; 

Gardez à l'esprit que vous devrez modifier l'utilisateur pour définir transaction_read_only également pour le rendre uniquement en lecture. aussi:

CREATE ROLEdoes not offer setting par défaut RO au rôle.

ALTER ROLEdoes

Et gardez à l'esprit que pour surmonter la configuration uset transaction_read_only est aussi facile que d'exécuter une instruction.

et de créer un rôle ne donnera pas la permission CONNECT, utilisez CREATE USER à la place si vous en voulez un.

+0

Merci Vao, ça a marché! Votre nom devrait être Wow :) Est-ce que le '' 'transaction_read_only''' n'est pas quelque chose qui peut être fait dans la même instruction que' '' create role'''? – Anand

+0

pas vraiment, au moins je n'ai jamais essayé et il n'est pas documenté :) –

+1

mis à jour avec votre note et ajouté plusieurs mines comme nota bene –