在PostgreSQL上授予用户对表子集的访问权限

时间:2011-05-14 19:38:57

标签: sql database postgresql privileges grant

我知道我可以使用视图来授予对表中属性子集的访问权限。但是,我如何只授予对特定元组的访问权限?假设我有一个注册学生表,一个用户名属性,然后是其他一些像degree_status,我如何授予访问权限,以便用户A只能从表中选择一个对应于用户名A的元组?我有一个数据库考试,我正在研究一些过去的论文,我遇到了这个问题,但我不知道如何回答它,我不知道如何从我的书“Dtabase系统:数据库设计的实用方法”中做到这一点,实施和管理'

非常感谢任何帮助!

马特

4 个答案:

答案 0 :(得分:3)

说你得到了:

Table items (item_id, ...)
Table users (user_id, ...)
Table users_permissions( user_id, item_id, perm_type )

你可以像这样创建一个VIEW:

SELECT i.*, p.perm_type 
FROM items JOIN users_permissions USING (item_id) 
WHERE user_id = get_current_user_id();

用户可以从此视图中进行选择,但不能删除限制权限的WHERE和JOIN。

get_current_user_id()函数可能是主要问题;)

答案 1 :(得分:2)

根据peufeu的回答,在Postgresql中,当前用户名可通过函数current_user获得。所以一个观点

CREATE VIEW available_bigtable AS
SELECT * FROM bigtable
WHERE username = current_user;

看起来它可以满足您的需求。向视图中的所有人授予SELECT,但对基础bigtable上的任何人(管理员除外)都不会。{/ p>

答案 2 :(得分:1)

Veil项目为PostgreSQL中的行级访问控制提供了一个框架。

答案 3 :(得分:0)

如何创建一个获取用户ID的函数并返回他有权访问的行的子集?

CREATE FUNCTION user_items(integer) RETURNS SETOF items AS $$
    SELECT * FROM items WHERE user_id = $1
$$ LANGUAGE SQL;

SELECT * FROM user_items(55); # 55 being the user id

编辑考虑更多,这可能会导致相当大的性能损失,因为在任何其他“用户登陆”条件之前,user_id条件将应用于整个数据集。

例如,SELECT * FROM user_items(55) WHERE id=45将首先过滤整个表中的用户项,而不是在该子集上查找ID。

使用视图,查询计划程序可以决定评估条件的最佳顺序(他可能首先过滤ID,而不是用户ID)。当使用我建议的功能时,postgres不能这样做。