我正在尝试在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语句显示正确的结果。提前谢谢,
答案 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
正确处理字符串文字。