3

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

非常感谢任何帮助!

马特

4

4 回答 4

3

说你有:

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

你可以像这样创建一个视图:

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() 函数可能是主要问题;)

于 2011-05-14T21:18:44.593 回答
2

按照 peufeu 的回答,在 Postgresql 中,当前用户名可通过函数 current_user 获得。所以一个视图

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

看起来它可以满足您的需求。授予SELECT视图上的所有人,但不授予底层bigtable.

于 2011-05-14T21:58:49.940 回答
1

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

于 2011-05-14T23:08:25.017 回答
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 不能这样做。

于 2012-11-25T12:24:16.470 回答