在Oracle SQL中使用用户标识选择行

时间:2015-01-21 23:10:57

标签: sql oracle security

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

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

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

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

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

  1. 以上sql语句是否有效?我的意思是,uid会被我们案例bob中当前用户的id所取代吗?
  2. 这是一种安全明智的逻辑方法吗?我的意思是说有更简单/更好的方法吗?

1 个答案:

答案 0 :(得分:4)

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

Oracle有一个名为&#34; Virtual Private Database&#34;的功能。这可以用来实现你想要的。

从上面的链接:

  

Oracle虚拟专用数据库(VPD)使您可以创建安全性   用于控制行和列级别的数据库访问的策略。   实质上,Oracle虚拟专用数据库添加了动态WHERE   对于表,视图或者发出的SQL语句的子句   Oracle Virtual Private Database安全策略的同义词   应用了。