Подтвердить что ты не робот

ОШИБКА: разрешение отклонено для языка c

При создании такой функции с не-суперпользователем я получаю следующую ошибку:

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? или что-то еще я делаю неправильно?

4b9b3361

Ответ 1

Это верно, в соответствии с док:

Только суперпользователи могут создавать функции на ненадежных языках

Быстрая проверка:

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 должен выполняться в БД, где будет находиться функция.

Ответ 2

Вместо того, чтобы указать доверенный язык, который считается плохим и опасным вам лучше использовать роли для предоставления привилегии суперпользователя временно пользователю в течение времени, когда он манипулирует хранимыми процедурами:

как суперпользователь:

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

а затем войти в систему как пользователь, вы можете set role dba

И тогда вы можете создавать хранимые процедуры в C, пока у вас временно есть роль dba.

reset role;, когда вы закончите, чтобы вернуться к нормальным правам.

Дополнительная информация здесь: https://dba.stackexchange.com/info/37336/cannot-create-function-in-ppython3u-permission-denied