Oracle 数据库:如何限制用户只能看到他/她自己的数据?

Posted

技术标签:

【中文标题】Oracle 数据库:如何限制用户只能看到他/她自己的数据?【英文标题】:Oracle Database: how to restrict a user to see only his/her own data? 【发布时间】:2015-01-02 04:58:07 【问题描述】:

例如我有一个这样的表:

                 +-----------------------------+
                 |        sample_table         |
                 +-----------------------------+
                 |  col_1  |  col_2  |  col_3  |
                 +-----------------------------+
User_1 Entered : |'val_1_1'|'val_1_2'|'val_1_3'|
                 +-----------------------------+
User_2 Entered : |'val_2_1'|'val_2_2'|'val_2_3'|
                 +-----------------------------+

现在我想如果上述每个用户都发出以下查询:

Select * from sample_table

结果 User_1 是:

+-----------------------------+
|  col_1  |  col_2  |  col_3  |
+-----------------------------+
|'val_1_1'|'val_1_2'|'val_1_3'|
+-----------------------------+

对于 User_2 是:

+-----------------------------+
|  col_1  |  col_2  |  col_3  |
+-----------------------------+
|'val_2_1'|'val_2_2'|'val_2_3'|
+-----------------------------+

限制每个用户仅访问(选择-更新-删除)他/她的数据的好方法是什么? (所有用户都可以插入数据,但我让他们只能查看或修改他们的数据)。感谢您的回答和指导。 注意: 我的意思是 Database users 但如果有人也为 application users 提供解决方案,我们将不胜感激.

【问题讨论】:

您需要具体说明是application用户还是database用户? 你好@LalitKumarB,我的意思是“数据库”用户,但如果我也想知道“应用程序”用户的最佳方式,我现在就编辑帖子 除非您将输入数据的用户存储在表中,否则您以后无法将其过滤掉。所以你必须在表中添加一个“所有者”列 检查 Oracle 功能:Virtual Private Database。但是,这也要求您的数据包含@a_horse_with_no_name 指出的哪个用户输入了数据。 【参考方案1】:

将 Data_Owner 字段添加到由 USER 函数填充的表中。不允许直接访问表。所有访问都通过一个视图,该视图仅公开与查询该视图的用户的 USER 值匹配的那些行。视图上的“instead of”触发器可以使用 USER 函数来控制 DML。

create view Sample as
select col_1, col_2, col3
from   Sample_Table
where  Data_Owner = USER;

对于应用用户,只需使用提供应用用户名或 USER(如果没有)的 UDF 代替 USER。当然,具体细节取决于您维护应用用户名的方式。

【讨论】:

感谢这个Idea,这个机制我以前看过,但是没审核也没关注,反正谢谢你的回答。

以上是关于Oracle 数据库:如何限制用户只能看到他/她自己的数据?的主要内容,如果未能解决你的问题,请参考以下文章

请教oracle如何限制这个用户的连接数

SQL Server - 隐藏数据库并限制用户只能看到一个视图对象

如何从两个表中获取公共项目 - Oracle

ORACLE 数据库权限分配,我想分配给某个用户创建视图并只能能查看修改自己创建的视图的权限 这个怎么弄

如何将 Oracle 顶点项限制为数字/字符值

oracle连接数过多 如何释放