在用户只能访问与其 id 列相关的列的条件下向用户授予选择列权限 - Oracle pl/sql
Posted
技术标签:
【中文标题】在用户只能访问与其 id 列相关的列的条件下向用户授予选择列权限 - Oracle pl/sql【英文标题】:grant select column privileges to user on condition that users can only access column related to their id column - Oracle pl/sql 【发布时间】:2021-03-18 14:04:50 【问题描述】:我有一些桌子:
图书(bookId, libraryId, bookName, bookType);
BookType(bookType, typeName);
库(LibrayId);
用户(UserId);
BookBorrowed(BorrowId, LibraryId, UserId);
BorrowDetail(BorrowId, bookId)
以及在 sqlDeveloper、C##DG 中创建的用户。
如何在 BookBorrowed 和 UserId = 1 的用户上GRANT 权限(选择)(C##DG 只能查看和使用 SELECT 2 表上 UserId 列为 1 的数据)?。
你们能给我举几个例子吗? 非常感谢。
【问题讨论】:
我看不出这个问题与 PL/SQL 编程或 SQL Developer 或 PL/SQL Developer 桌面工具有什么关系。这似乎是一个一般的 Oracle DBA 问题。 【参考方案1】:对此的适当 Oracle 解决方案是 Virtual Private Database。
如果这不是一个选项,另一种方法是定义视图,例如:
create view userBookBorrowed
as select * from bookBorrowed bb
join users u on (u.userid = bb.userid)
where u.username = USER;
然后只授予用户访问视图的权限,而不是表。
【讨论】:
我按照你说的做了,当我以 C##DG 和 SELECT * FROM BOOKBROWED 登录 SQL Plus 时,它返回 2。打印出 SQL Plus 有什么问题?请给我解释一下好吗? 听起来你需要revoke select on bookborrowed from c##dg;
这个想法是他们只从新视图中选择,而不是从表格中选择。
我的意思是,当我在 SQL Plus 上 SELECT * FROM userBookBorrowed 时,它仍然返回 2。
如果您的更改正确,那就没有意义了 - 我们将 bookBorrowed 加入 user_id 上的用户表,然后限制连接用户的用户行。必须只有一个用户行的用户名 = 'C##DG',如果用户 ID = 1,那么只能返回用户 ID = 1 的 bookBorrowed?
我明白了。谢谢。【参考方案2】:
没有您可以授予或撤销的列级权限。您需要为这些类型的过滤器或限制实施虚拟专用数据库策略。见这里:https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/using-oracle-vpd-to-control-data-access.html#GUID-06022729-9210-4895-BF04-6177713C65A7
【讨论】:
以上是关于在用户只能访问与其 id 列相关的列的条件下向用户授予选择列权限 - Oracle pl/sql的主要内容,如果未能解决你的问题,请参考以下文章