如何在撤销表时仅授予功能?

Eon*_*nil 2 postgresql permissions

我是 PostgreSQL 的新手,正在配置一个新数据库。

我写了几个间接访问(读/写)数据的函数,我想禁止所有对表的直接访问。

GRANT CONNECT ON DATABASE db1 TO role1;
GRANT USAGE ON SCHEMA schema1 TO role1;

REVOKE ALL ON table1 FROM role1;
GRANT ALL ON ALL FUNCTIONS IN SCHEMA schema1 TO role1;
Run Code Online (Sandbox Code Playgroud)

如果我不 REVOKE 表权限,将允许直接表访问。如果我 REVOKE 表特权和 GRANT 函数,用户访问这些函数但看到表访问限制错误。

psql:./test1.psql:6: ERROR:  permission denied for relation table1
Run Code Online (Sandbox Code Playgroud)

如何让用户role1只能使用函数访问数据,同时禁止对表的所有直接访问?我想我错过了一些东西,但我无法弄清楚。

PS 我使用的是 Postgres 9.2.x。

Cra*_*ger 5

你想使你的功能SECURITY DEFINER,并让他们拥有由用户具备必要的权利。

编写SECURITY DEFINER函数时要非常小心。不要让超级用户拥有它们并仔细阅读手册。创建一个仅具有所需权限而没有更多权限的角色;赋予它SECURITY DEFINER功能的所有权。在适当的情况下,为不同的访问级别创建多个角色。

CREATE FUNCTION