2016-04-26 30 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正確處理字符串文字。