我知道我可以使用视图来授予对表中属性子集的访问权限。但是我怎样才能只授予对特定元组的访问权限呢?假设我有一个注册学生表,一个用户名属性,然后是其他一些像 degree_status,我如何授予访问权限,以便用户 A 只能从表中选择一个与用户名 A 对应的元组?我有一个数据库考试,我正在研究一些过去的论文,我遇到了这个问题,但我不知道如何回答,我无法从我的书“数据库系统:数据库设计的实用方法”中找到如何做, 实施和管理'
非常感谢任何帮助!
马特
我知道我可以使用视图来授予对表中属性子集的访问权限。但是我怎样才能只授予对特定元组的访问权限呢?假设我有一个注册学生表,一个用户名属性,然后是其他一些像 degree_status,我如何授予访问权限,以便用户 A 只能从表中选择一个与用户名 A 对应的元组?我有一个数据库考试,我正在研究一些过去的论文,我遇到了这个问题,但我不知道如何回答,我无法从我的书“数据库系统:数据库设计的实用方法”中找到如何做, 实施和管理'
非常感谢任何帮助!
马特
说你有:
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() 函数可能是主要问题;)
按照 peufeu 的回答,在 Postgresql 中,当前用户名可通过函数 current_user 获得。所以一个视图
CREATE VIEW available_bigtable AS
SELECT * FROM bigtable
WHERE username = current_user;
看起来它可以满足您的需求。授予SELECT
视图上的所有人,但不授予底层bigtable
.
Veil项目为 PostgreSQL 中的行级访问控制提供了一个框架。
如何创建一个获取用户 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 不能这样做。