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