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

vch*_*tta 27 c postgresql

使用非超级用户创建这样的函数时,我收到以下错误:

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;
Run Code Online (Sandbox Code Playgroud)

但是,如果我想向我的非超级用户授予语言C的许可,我会收到以下错误: postgres=# grant usage on language c to caixa; ERROR: language "c" is not trusted

那意味着,非超级用户无法使用C语言创建功能?或者还有什么我做错了吗?

Grz*_*ski 34

根据文件,这是对的:

只有超级用户才能以不受信任的语言创建功能

快速检查:

SELECT lanpltrusted FROM pg_language WHERE lanname LIKE 'c';
 lanpltrusted 
--------------
 f
(1 row)
Run Code Online (Sandbox Code Playgroud)

如果你真的想要这个,那么你可以修改pg_language系统目录(ALTER LANGUAGE没有这样的选项):

UPDATE pg_language SET lanpltrusted = true WHERE lanname LIKE 'c';
Run Code Online (Sandbox Code Playgroud)

  • 必须在正在使用的_database_中应用更新.我一直试图将它应用到默认数据库(_postgres_). (3认同)

Ste*_*and 16

而不是将语言设置为被认为是坏的危险的信任,您应该在操作存储过程期间使用角色临时向用户提供超级用户权限:

作为超级用户:

create role dba with superuser noinherit;
grant dba to user;
Run Code Online (Sandbox Code Playgroud)

然后以用户身份登录 set role dba

然后,您可以在临时拥有角色的同时在C中创建存储过程dba.

reset role; 当你完成恢复正常的权利.

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

  • `(no)inherit`以另一种方式工作.从文档:*"这些子句确定一个角色是否"继承"它是**成员的**角色的特权."*(强调我的)也就是说,`user`是需要`noinherit`的人为了使`set role dba`成为必要.在这个例子中对`dba`角色设置`noinherit`什么都不做,因为`dba`不是任何角色的成员. (3认同)