2011-08-10 43 views
22

Khi tạo một chức năng như thế này với một người sử dụng không phải là siêu Tôi nhận được báo lỗi dưới đây:LỖI: cho phép từ chối cho ngôn ngữ c

ERROR: permission denied for language c SQL state: 42501

Chức năng tạo ra là:

CREATE OR REPLACE FUNCTION dblink_connect (text) 
RETURNS text 
AS '$libdir/dblink','dblink_connect' 
LANGUAGE C STRICT; 

Nhưng nếu tôi muốn cấp quyền cho ngôn ngữ C cho người dùng không phải là siêu người dùng của tôi, tôi nhận được lỗi bên dưới: postgres=# grant usage on language c to caixa; ERROR: language "c" is not trusted

Điều đó có nghĩa, người dùng không phải siêu không thể tạo hàm bằng ngôn ngữ C? hoặc có điều gì khác tôi đang làm sai?

+0

Có lẽ bạn không cần phải cấp 'USAGE' đặc ân cho 'vai trò caixa' một cách rõ ràng, bởi vì nó được trao cho' PUBLIC' (tất cả các vai trò) rồi. Chìa khóa ở đây là thuộc tính 'lanpltrusted' từ danh mục hệ thống' pg_language'. –

Trả lời

29

Đúng vậy, theo doc:

Only superusers can create functions in untrusted languages

nhanh séc:

SELECT lanpltrusted FROM pg_language WHERE lanname LIKE 'c'; 
lanpltrusted 
-------------- 
f 
(1 row) 

Nếu bạn thực sự muốn điều này, sau đó bạn có thể sửa đổi pg_language danh mục hệ thống (ALTER LANGUAGE không có như vậy tùy chọn):

UPDATE pg_language SET lanpltrusted = true WHERE lanname LIKE 'c'; 
+0

tuyệt vời nó hoạt động. – vchitta

+2

Bản cập nhật phải được áp dụng trong _database_ đang được sử dụng. Tôi tiếp tục cố gắng áp dụng nó vào cơ sở dữ liệu mặc định (_postgres_). – Otheus

13

Thay vì thiết lập ngôn ngữ để tin cậy được coi xấunguy hiểm, bạn chứ không nên sử dụng vai trò cung cấp đặc quyền superuser tạm thời cho người sử dụng trong suốt thời gian ông thao túng các thủ tục lưu trữ:

như superuser :

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

sau đó đăng nhập như người dùng mà bạn có thể set role dba

Và sau đó bạn có thể tạo ra được lưu trữ thủ tục trong C trong khi bạn tạm thời có vai trò dba.

reset role; khi bạn hoàn tất để quay lại quyền bình thường.

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

+3

'(không) kế thừa' hoạt động theo cách khác. Từ các tài liệu: * "Những mệnh đề này xác định liệu một vai trò" kế thừa "các đặc quyền của ** vai trò nó là một thành viên của **." * (Nhấn mạnh của tôi) Đó là, 'người dùng' là một trong những nhu cầu' noinherit' trong để thực hiện 'set role dba' cần thiết. Đặt 'noinherit' trên vai trò' dba' trong ví dụ này không chính xác là gì, vì 'dba' không phải là thành viên của bất kỳ vai trò nào. – cdhowie

Các vấn đề liên quan