如何在PostgreSQL中向用户授予存储过程创建权限

时间:2020-05-14 18:40:08

标签: sql postgresql stored-procedures postgresql-9.5

我需要授予特定用户权限以在PostgreSQL中创建存储过程,而无需向其他表写入权限。存储过程应该只在一个表中读写。

我已经设置了对该表的读取权限,但是我在写权限上苦苦挣扎。

GRANT CONNECT ON DATABASE production_database TO user;
GRANT USAGE ON SCHEMA public TO user;
GRANT SELECT ON table TO user;

1 个答案:

答案 0 :(得分:2)

如果要使用PL / PGSQL编写过程,则需要使用PostgreSQL 11或12。

在PostgreSQL中,没有显式特权来创建过程或函数。

但是您可以尝试:

  • 仅为该过程创建特定的模式

  • 仅向特定用户授予对此模式的使用权限

  • 以SECURITY DEFINER作为表所有者创建过程

示例:

create user myuser password 'myuser';
--
create table public.t(x int);
--
create schema myschema;
--
create or replace procedure myschema.myproc(param int)
language plpgsql
as
$$
declare
 v int;
begin
 insert into public.t values(param);
end;
$$
security definer
set search_path='';
--
grant usage on schema myschema to myuser;

表所有者是超级用户postgres,表模式是公共的:

使用此脚本:

\c postgres myuser
select * from t;
call myschema.myproc(1);
\c postgres postgres
select * from t;

我得到:

You are now connected to database "postgres" as user "myuser".
select * from t;
psql:cp.sql:25: ERROR:  permission denied for table t
call myschema.myproc(1);
CALL
You are now connected to database "postgres" as user "postgres".
select * from t;
 x 
---
 1
(1 row)