ОШИБКА: разрешение отклонено для языка 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? или что-то еще я делаю неправильно?
Ответы
Ответ 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