Postgresql中动态数据库名称的授权

4

我正在尝试授予当前数据库(其名称我不知道)上的新用户权限。

基本上我想要实现这样的内容:

grant all privileges on database $(SELECT current_database();) to my_new_user;

有什么提示可以实现这个吗?
1个回答

4

不能直接将GRANT与查询组合,但是你可以编写一个小块来实现。由于GRANT仅允许使用数据库名称而不支持变量,所以必须将命令创建为字符串并用EXECUTE执行:

DO $_$
    DECLARE
        the_database TEXT := CURRENT_DATABASE();
    BEGIN
        EXECUTE FORMAT('GRANT ALL PRIVILEGES ON DATABASE %s TO my_new_user', the_database);
    END
$_$;

附加说明: 如果数据库名称可能包含像破折号这样的特殊字符,则应将名称放入双引号中:

DO $_$
    DECLARE
        the_database TEXT := CURRENT_DATABASE();
    BEGIN
        EXECUTE FORMAT('GRANT ALL PRIVILEGES ON DATABASE %I TO my_new_user', the_database);
    END
$_$;

1
只是提供给后来者的一条信息:由于我的数据库名称中有破折号,因此我不得不在%s周围添加"" - stiller_leser
2
@stiller_leser:感谢你的提示。我已经将它包含在我的帖子中了。 - clemens
4
你不需要用引号包裹,只需使用 %I 转换即可。如果需要,它会自动包含引号。 - pyramation
2
@pyramation 很抱歉,我现在才看到你的帖子。我已经相应地调整了代码。感谢你的提示。 :) - clemens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接