Postgresql 使用函数创建用户
Postgresql creating users with a function
我目前无法在函数内创建 postgresql 数据库用户。
背景:
我有一个 Java Swing 应用程序,我的目标是开发一个菜单来创建、更改和删除数据库用户。为了让它更安全一点,我创建了一个角色 "usermanagement" 并且只允许该角色的成员使用该功能创建用户。角色也包含对"createuser"
查询运行没有任何问题,但它没有创建新用户...所以我不知道它有什么问题。
这是我尝试使用我的函数的方式:
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;
注意 STRICT
(returns NULL on NULL input
),使用 FORMAT()
帮助解决 SQL 注入问题,并正确引用输入。输入参数“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 ''%L''', 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;
我目前无法在函数内创建 postgresql 数据库用户。 背景: 我有一个 Java Swing 应用程序,我的目标是开发一个菜单来创建、更改和删除数据库用户。为了让它更安全一点,我创建了一个角色 "usermanagement" 并且只允许该角色的成员使用该功能创建用户。角色也包含对"createuser"
查询运行没有任何问题,但它没有创建新用户...所以我不知道它有什么问题。
这是我尝试使用我的函数的方式:
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;
注意 STRICT
(returns NULL on NULL input
),使用 FORMAT()
帮助解决 SQL 注入问题,并正确引用输入。输入参数“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 ''%L''', 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;