2016-04-26 12 views
0

Postgresでユーザ作成プロセスを自動化する機能を作成しようとしていますが、DDL文でパラメータを受け付けません。機能上DDL文を使用したPostgres関数

CREATE OR REPLACE FUNCTION AUTOUSER (uname varchar(20)) 
RETURNS TEXT AS $$ 
DECLARE 
     nm varchar(20); 
BEGIN 
    nm=$1; 
    CREATE USER nm WITH PASSWORD 'Iash12'; 
    GRANT ALL ON DATABASE iashdb TO nm; 
    GRANT ALL ON ALL TABLES IN SCHEMA public TO nm; 
    RETURN CONCAT(nm,' Created'); 
END; 
$$ 
LANGUAGE plpgsql; 

代わりに渡されたパラメータ名の「NM」としてユーザーに正しい結果を示したが、RETURN文を作成します。事前に感謝します。

+0

これには動的SQLが必要です。http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN –

+0

動的SQLはDDL文をサポートしていないため、 SELECT、UPDATE、INSERT、DELETEだけをサポートします。 – Nik

+0

もちろん、DDLをサポートしています。マニュアルのどこにその声明がありますか? –

答えて

0

動的SQLを使用する必要があり、パラメータを正しく引用する必要があります。最も簡単な方法は、適切なプレースホルダformat()機能を使用することです:

CREATE OR REPLACE FUNCTION AUTOUSER (uname varchar(20)) 
RETURNS TEXT AS $$ 
BEGIN 
    execute format('CREATE USER %I WITH PASSWORD %L', uname, 'Iash12'); 
    execute format('GRANT ALL ON DATABASE iashdb TO %I', uname); 
    execute format('GRANT ALL ON ALL TABLES IN SCHEMA public TO %I', uname); 
    RETURN CONCAT(uname,' Created'); 
END; 
$$ 
LANGUAGE plpgsql; 

プレースホルダ%Iが正しくSQL識別子を引用します。プレースホルダ%Lは、文字列リテラルを適切に処理します。

関連する問題