【问题标题】:PostgreSQL: hide table INSERT UPDATE DELETE behind a functionPostgreSQL:在函数后面隐藏表 INSERT UPDATE DELETE
【发布时间】:2018-01-12 18:51:27
【问题描述】:

我了解如何使用GRANT 来控制谁可以对数据库对象执行什么操作。

我有一个案例,如果有特定的函数可以修改表的内容,同时阻止用户直接访问表,这会很有用。

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

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

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

我正在使用 PG 10。

【问题讨论】:

  • 是 - 如果您使用功能作为安全定义
  • 非常感谢!请作为答案发布,以便我接受。
  • 不用担心,做到了

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


【解决方案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 指定要执行的函数 拥有它的用户的权限。

当然这意味着函数所有者需要对关系的权限

【讨论】:

    猜你喜欢
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2011-05-16
    • 2013-10-25
    • 1970-01-01
    • 2013-08-29
    • 2011-01-17
    相关资源
    最近更新 更多