Postgres函数使用DDL语句

时间:2016-04-26 19:44:15

标签: postgresql-9.4

我正在尝试在Postgres中创建函数,它可以自动化用户创建过程,但它不接受DDL语句中的参数。

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语句显示正确的结果。提前谢谢,

1 个答案:

答案 0 :(得分:1)

您需要使用动态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正确处理字符串文字。