在 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。我有两个问题:
- 上面的sql语句行得通吗?我的意思是,在我们的案例 bob 中,uid 会被当前用户的 id 替换吗?
- 这是一种合乎逻辑的安全方法吗?我的意思是有 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.
我有一个名为 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。我有两个问题:
- 上面的sql语句行得通吗?我的意思是,在我们的案例 bob 中,uid 会被当前用户的 id 替换吗?
- 这是一种合乎逻辑的安全方法吗?我的意思是有 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.