Postgresql 使用函数创建用户

标签 postgresql function user-management

我目前无法在函数内创建 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(在 NULL 输入时返回 NULL),使用 FORMAT() 来帮助解决 SQL 注入(inject)问题,并引用输入适本地。输入参数“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 使用函数创建用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47934646/

相关文章:

sql-server - SQL Server 函数返回最小日期(1753 年 1 月 1 日)

Mysql Slow.log 用户特定

postgresql - postgresql中二级索引的定义是什么?

java - JTS - Hibernate + Postgres + UUID 冲突

r - 编写一个将向量作为输入、丢弃不需要的值、删除重复项并返回原始向量的相应索引的函数

user-management - 您使用什么工具来管理 Web 应用程序的 Beta 测试人员?

azure - 如何邀请新用户成为 Azure 的共同管理员?

postgresql - SQL - 组合多个列并应用 ILIKE

postgresql - 如何将二进制 pgdump(压缩)转换为纯 SQL 文件?

c++ - 函数参数的前向使用