我需要授予特定用户权限以在PostgreSQL中创建存储过程,而无需向其他表写入权限。存储过程应该只在一个表中读写。
我已经设置了对该表的读取权限,但是我在写权限上苦苦挣扎。
GRANT CONNECT ON DATABASE production_database TO user;
GRANT USAGE ON SCHEMA public TO user;
GRANT SELECT ON table TO user;
答案 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)