错误:语言c的权限被拒绝。

33

当以非超级用户创建类似以下函数时,我收到以下错误:

ERROR: permission denied for language c SQL state: 42501

所创建的函数为:

CREATE OR REPLACE FUNCTION dblink_connect (text)
RETURNS text
AS '$libdir/dblink','dblink_connect'
LANGUAGE C STRICT;

如果我想在语言C上授予权限给非超级用户,我会得到以下错误: postgres=# grant usage on language c to caixa; ERROR: language "c" is not trusted

这意味着非超级用户无法使用语言C创建函数吗?还是我有其他错误?


1
可能您不需要显式地授予caixa角色USAGE权限,因为它已经被授予给了PUBLIC(所有角色)。关键在于pg_language系统目录中的lanpltrusted属性。 - Grzegorz Szpetkowski
4个回答

40

根据doc的说法:

只有超级用户才能在不受信任的语言中创建函数

快速检查:

SELECT lanpltrusted FROM pg_language WHERE lanname LIKE 'c';
 lanpltrusted 
--------------
 f
(1 row)

如果你真的想要这个功能,那么你可以修改pg_language系统目录( ALTER LANGUAGE 没有此选项):
UPDATE pg_language SET lanpltrusted = true WHERE lanname LIKE 'c';

根据下面用户@Otheus的要求:UPDATE语句必须在包含函数的数据库中执行。

3
更新必须应用于正在使用的数据库中。我一直试图将其应用于默认的数据库(_postgres_)。 - Otheus
出现了这个错误:对于表pg_language,权限被拒绝。 - Talha Anwar

19

与其将语言设置为“可信任的”,这被认为是不好的危险的,你应该使用角色来在用户操作存储过程时为其提供超级用户特权:

作为超级用户:

create role dba with superuser noinherit;
grant dba to user;

然后以用户身份登录,您可以设置角色为dba

然后您可以在拥有角色dba的情况下创建C中的存储过程。

完成后重置角色;回到普通权限。

更多信息请参见:https://dba.stackexchange.com/questions/37336/cannot-create-function-in-plpython3u-permission-denied


3
"(no)inherit" 的作用是相反的。根据文档:“这些子句确定角色是否继承它所属的角色的特权。”(强调我的)也就是说,user 需要使用 noinherit 才能使 set role dba 成为必要的操作。在此示例中,在 dba 角色上设置 noinherit 实际上没有任何作用,因为 dba 没有加入任何角色。 - cdhowie

2
在我的情况下,针对RDS postgres 12.5中的uuid函数。 我所需要做的就是:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp';

你救了我的命。 - undefined

1

可能我的答案对于正在处理相关主题的人会有用。

在从一个项目迁移到另一个项目期间,我尝试在GCP Postres安装中重新创建/恢复一个函数uuid_generate_v1

CREATE OR REPLACE FUNCTION public.uuid_generate_v1()
 RETURNS uuid
 LANGUAGE c
 PARALLEL SAFE STRICT
AS '$libdir/uuid-ossp', $function$uuid_generate_v1$function$;

与问题中的错误相同,发生了失败:ERROR: 语言“c”不受信任

我无法使用提供的任何答案,因为GCP不提供对Postgres的超级用户访问权限。但是我找到了一个解决方法,可能对某人有帮助。

事实证明,这个函数以及其他一些函数(uuid_generate_v1mcuuid_generate_v3uuid_generate_v4uuid_generate_v5uuid_niluuid_ns_dnsuuid_ns_oiduuid_ns_urluuid_ns_x500)都随附于uuid-ossp扩展。因此,我所做的就是创建一个扩展,将所有必要的函数都引入。

CREATE EXTENSION "uuid-ossp";

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