2016-04-26 76 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; 

以上函数来创建用户为“纳米”,而不是传递的参数名称然而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正确处理字符串文字。