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

时间:2011-08-10 16:34:49

标签: 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;

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

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

3 个答案:

答案 0 :(得分:34)

这是正确的,根据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语句必须在函数所在的DB中完成。

答案 1 :(得分:15)

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

作为超级用户:

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

然后以用户set role dba

登录

然后,您可以在暂时拥有角色dba时在C中创建存储过程。

reset role;当你完成恢复正常权利时。

More info here: https://dba.stackexchange.com/questions/37336/cannot-create-function-in-plpython3u-permission-denied

答案 2 :(得分:0)

就我而言,RDS postgres 12.5 中的 uuid 函数。 我所要做的就是:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp';