在用户只能访问与其 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)

以及在 sqlDeveloperC##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的主要内容,如果未能解决你的问题,请参考以下文章

QTableWidget的列文本格式如何设置?

使用Angularjs重新排序html表中的列

mysql'WHERE'条件中的列号

如何将具有外键的列修改为 null?

Aggrid 获取表格中显示的列的名称

用另一个表中的列值替换列的空值