2017-12-22 13 views
1

現在、関数内でpostgresqlデータベースユーザーを作成できません。 背景: 私はJava Swingアプリケーションを持っています。私の目標は、データベースユーザーを作成、変更、削除するためのメニューを開発することです。より安全なものにするために、私は役割 "usermanagement"を作成し、この役割のメンバーだけがユーザーを作成するために関数を使用することができます。ロールには「createuser」という権利が含まれていますPostgresqlで関数を持つユーザーを作成する

クエリは問題なく実行されますが、新しいユーザーは作成されません...だから私は何が問題なのか分かりません。

これは私が私の機能を使用しようとする方法である:

SELECT create_databaseuser(v_username := 'thisname' ,v_password := 'pwpwpw'); 

誰でも助けることができますか?ここで

が私のコードです:

-- Function: public.create_databaseuser(text, text) 

-- DROP FUNCTION public.create_databaseuser(text, text); 

CREATE OR REPLACE FUNCTION public.create_databaseuser(
    v_username text, 
    v_password text) 
    RETURNS numeric AS 
$BODY$ 
DECLARE 
    r_id numeric; 
BEGIN 
    --CREATE ROLE v_username LOGIN 
    --PASSWORD 'v_password' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 

    EXECUTE 'CREATE USER ' || v_username || ' WITH PASSWORD ' || v_password; 
-- Alternative:CREATE ROLE v_username LOGIN PASSWORD v_password NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 

    return 1; 
    -- Simple Exception 
EXCEPTION 
    WHEN others THEN 
     RETURN 0; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE SECURITY DEFINER 
    COST 100; 
ALTER FUNCTION public.create_databaseuser(text, text) 
    OWNER TO postgres; 
+0

これは、兄弟姉妹サイトhttp://dba.StackExchange.com/ –

答えて

0

注意STRICTreturns NULL on NULL input)、SQLインジェクションの問題に対して支援するFORMAT()を使用し、適切に入力を引用しています。入力引数 "v_username"がタイプNAMEに変更され、タイプがpg_catalog.pg_rolesに一致しました。

DROP FUNCTION IF EXISTS public.create_databaseuser(NAME, TEXT); 

CREATE OR REPLACE FUNCTION public.create_databaseuser(
    v_username NAME, 
    v_password TEXT) 
RETURNS smallint AS 
$BODY$ 
DECLARE 
BEGIN 
    EXECUTE FORMAT('CREATE ROLE "%I" LOGIN PASSWORD ''%I''', v_username, v_password); 
    RETURN 1; 
    -- Simple Exception 
EXCEPTION 
    WHEN others THEN 
     RETURN 0; 
END; 
$BODY$ 
LANGUAGE plpgsql STRICT VOLATILE SECURITY DEFINER 
COST 100; 

ALTER FUNCTION public.create_databaseuser(NAME, TEXT) OWNER TO postgres; 


select rolname from pg_catalog.pg_roles order by 1; 
SELECT create_databaseuser(v_username := 'thisname' ,v_password := 'pwpwpw'); 
select rolname from pg_catalog.pg_roles order by 1; 
+0

に投稿するとよいでしょう。それは働いている。その間、私はアプリケーションでプレーンSQLを使用しましたが、今ではそれを変更して、はるかに優れた関数を使用できます:) – Beginner

+0

pwとしてプレーンナンバーを使用したい場合は、提案もありますか? 私は 'pw123'で関数を呼び出していますが、それは動作していますが、 '12345'は機能していません。実際に見つかった場合は動作しています。しかしその後、PWWは12345にはなりません。私はpgadminと私の関数を使ってpwを変更したので、md5ハッシュをチェックしました。 その後、パスワードは「12345」として保存されます。だから私はこの関数内のreg式でこれを解決することができます。今私はさらに進んで、$のような特殊文字を使用したいのであればうまくいきません。どうすればこの問題を解決できますか? – Beginner

関連する問題