PostgreSQL:隐藏表INSERT UPDATE DELETE函数后面

时间:2017-11-21 09:39:42

标签: postgresql permissions database-schema plpgsql database-permissions

我理解如何使用GRANT来控制谁可以对数据库对象做什么。

我遇到这样一种情况:拥有修改表格内容的特定功能,同时阻止用户直接访问该表格。

假设我有一个库存控制表,我想要一个仅修改一列的函数increase_stock(int)。还有其他功能可以修改其他列。

我的实际表包含了ltrees数组和int数组,使得触发器成为一个不合需要的选项,因为它没有提供直接操作一个字段而不测试每个字段更改的干净方法。更重要的是,它不会创建我想要的API。

无论采用哪种方法,我是否可以创建一个对用户可见的函数,同时该函数访问该用户不可见的表?

我正在使用PG 10。

1 个答案:

答案 0 :(得分:1)

这是一个选择的例子。或多或少与insert.update和delete相同:

t=# create table sd(i int);
CREATE TABLE
t=# insert into sd select 1;
INSERT 0 1
t=# create user nr;
CREATE ROLE
t=# create function s() returns table (i int) as $$ 
begin
return query select * from sd;
end;
$$ language plpgsql security definer;
CREATE FUNCTION

现在以nr登录:

-bash-4.2$ psql -U nr t
psql (9.3.14)
Type "help" for help.

t=> select * from sd;
ERROR:  permission denied for relation sd
t=> select * from s();
 i
---
 1
(1 row)

https://www.postgresql.org/docs/current/static/sql-createfunction.html

  

SECURITY INVOKER表示该函数将被执行   调用它的用户的权限。这是默认值。   SECURITY DEFINER指定要执行的功能   拥有它的用户的权限。

当然,这意味着功能所有者需要关系

的权限