我正在研究 Oracle 11g 中的一些数据访问限制功能,从那时起就一直在努力。
我想要实现的是,我只想允许一个特定的组访问一组特定的数据,其余的不应该能够看到它们(或对它们进行哈希处理)......
让我们想象两个用户
USER_JOHN 和 USER_TIMMY
他们的角色设置如下
USER_JOHN
- it_analyst
- sales_analyst
- read_all
USER_TIMMY
- risk_analyst
%_ANALYST 角色只是为了演示而已......在这种情况下唯一重要的角色是READ_ALL 角色,它允许JOHN访问“特权”数据......
特权数据示例(标有 * 的列被视为“特权”):
CLIENT_TABLE
-------------------------------------------------------------
ID | Name | Date of Birth * | Address * | Sex |
-------------------------------------------------------------
1 | Franco | 8/1/1990 | Sesame Street | Male |
2 | Jane | 1/18/1976 | Corner Road | Female |
当用户(具有 READ_ALL)角色查询此表时,我希望他获得与您在上面看到的相同的数据集
USER_JOHN:$> SELECT * FROM client_table;
-------------------------------------------------------------
ID | Name | Date of Birth * | Address * | Sex |
-------------------------------------------------------------
1 | Franco | 8/1/1990 | Sesame Street | Male |
2 | Jane | 1/18/1976 | Corner Road | Female |
但是如果没有这个 READ_ALL 角色的用户查询这个表,他们应该只获得可读形式的非特权数据......见下文
USER_TIMMY:$> SELECT * FROM client_table;
-------------------------------------------------------------
ID | Name | Date of Birth * | Address * | Sex |
-------------------------------------------------------------
1 | Franco | 3978005636 | 4259532014 | Male |
2 | Jane | 2282325776 | 1146039631 | Female |
正如你所看到的,这些“特权”记录被散列了......它们甚至可以是空的或者根本不是 select.able ..因此结果看起来像这样
USER_TIMMY:$> SELECT * FROM client_table;
--------------------------
ID | Name | Sex |
--------------------------
1 | Franco | Male |
2 | Jane | Female |
有一些解决方案可以实现这一目标吗?对我来说最好的结果是散列值......我已经阅读了一些关于 Oracle VPD 的东西,它应该做同样的事情我只是不知道,如何将它应用于全局角色......
到目前为止我所做的是我在不同的模式中创建了相同的对象......
SCHEMA_RAW.CLIENT_TABLE -> READ_ALL 可访问;其他人无法访问 SCHEMA_HASHED.CLIENT_TABLE -> 所有人都可以访问
我知道这不是最好的解决方案,但至少我确实实施了一些数据保护。这个解决方案的主要缺点是脚本共享。如果有用户只能访问 SCHEMA_RAW。他们需要更改只能访问 SCHEMA_HASHED 的用户提供的脚本...
注意:不仅仅是这个单一的表......有很多(数百个)需要以这种方式保护......
编辑:Oracle 数据库 11g 企业版 11.2.0.4.0 版 - 64 位