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

dced5bon  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(193)

当我用一个非超级用户创建一个这样的函数时,我得到了下面的错误:
第一个月
创建的函数为:

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语言创建函数?还是我做错了什么

1wnzp6jl

1wnzp6jl1#

没错,根据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中完成。

idfiyjo8

idfiyjo82#

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

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

w46czmvw

w46czmvw3#

在RDS postgres 12.5中的uuid函数中。我要做的就是

CREATE EXTENSION IF NOT EXISTS "uuid-ossp';

字符串

u4vypkhs

u4vypkhs4#

也许我的回答会对正在研究相关主题的人有用。
在DB从一个项目移动到另一个项目期间,我试图在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: language "c" is not trusted中的相同。
我无法使用任何提供的答案,因为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";

相关问题