在 Oracle SQL 中使用用户 ID 选择行

Selecting rows using user id in Oracle SQL

我有一个名为 Grades 的 table,其中包含学生的成绩。我还创建了一个名为 Student 的角色和一个名为 Bob 的用户。学生被授予 Bob。我希望 Bob 能够查看他的成绩,而且只能查看他的成绩。我不是在编写应用程序,而是在编写数据库模式。我正在尝试创建此视图

CREATE VIEW My_Grades AS SELECT * FROM Grades WHERE <and here is my issue>

我的问题是我需要一种方法让 oracle 确定 Bob 确实有权查看他要求的成绩。例如,我可以在 table 成绩中添加一个名为 User_Id 的列,然后执行

CREATE VIEW My_Grades AS SELECT * FROM Grades WHERE User_Id = uid

我指的是 Oracle 的保留字 uid。我有两个问题:

  1. 上面的sql语句行得通吗?我的意思是,在我们的案例 bob 中,uid 会被当前用户的 id 替换吗?
  2. 这是一种合乎逻辑的安全方法吗?我的意思是有 simpler/better 的方法吗?

您的视图解决方案会起作用,但随着系统的增长可能会失控。如果您确实采用这种方法,您可能希望将其基于 user(名称)而不是 uid(内部 ID)。

Oracle 有一个叫做“Virtual Private Database”的特性,可以用来实现你想要的。

来自上面的link:

Oracle Virtual Private Database (VPD) enables you to create security policies to control database access at the row and column level. Essentially, Oracle Virtual Private Database adds a dynamic WHERE clause to a SQL statement that is issued against the table, view, or synonym to which an Oracle Virtual Private Database security policy was applied.