虚拟专用数据库VPD应用 (48天)

系统中有个需求,需要把一个表里的信用卡号字段进行权限管理,大家讨论再三,说TDE不太好,因为需求希望能够让有些用户可以访问这个表,但是卡号字段读不到东西。有些用户可以直接读取该字段的内容。

我给了一个建议,使用VPD,基于列的VPD可以满足这样的需求。

以下是一个样例,供参考。

--create user and grant privileges
create user test identified by test;
grant connect,resource to test;
grant execute dbms_rls to test;
create user credit_test identified by oracle;
grant connect,resource to credit_test;
grant create synonym to credit_test;
--create samples tables
SQL> create table credit_card_test as select object_id card_id,object_name card_name,object_id card_pwd from all_objects ;
Table created.
SQL> select count(*) from all_objects;
  COUNT(*)
----------
      4876
SQL> select * from credit_card_test where rownum<10;
   CARD_ID CARD_NAME                        CARD_PWD
---------- ------------------------------ ----------
       258 DUAL                                  258
       259 DUAL                                  259
       311 SYSTEM_PRIVILEGE_MAP                  311
       313 SYSTEM_PRIVILEGE_MAP                  313
       314 TABLE_PRIVILEGE_MAP                   314
       316 TABLE_PRIVILEGE_MAP                   316
       317 STMT_AUDIT_OPTION_MAP                 317
       319 STMT_AUDIT_OPTION_MAP                 319
       605 MAP_OBJECT                            605
9 rows selected.
SQL> desc credit_card_test
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
CARD_ID                                   NOT NULL NUMBER
CARD_NAME                                 NOT NULL VARCHAR2(30)
CARD_PWD                                  NOT NULL NUMBER
--create synonyms or roles using credit_test
create or replace synonym credit_card_test for test.credit_card_test;
--using test(table owner account)
--add_policy  create_rls.sql
exec  dbms_rls.add_policy(object_schema => 'test',object_name => 'credit_card_test',policy_name => 'card_pwd_policy',function_schema =>'test',policy_function => 'rls_encryption',statement_types =>'select',policy_type => dbms_rls.CONTEXT_SENSITIVE,sec_relevant_cols=>'card_pwd',sec_relevant_cols_opt=>dbms_rls.all_rows);
--add function  create_rls_f.sql
create or replace function rls_encryption (p_owner in varchar2,p_obj in varchar2)
return varchar2
is  v_flag varchar2(1000);
begin
if(p_owner=USER ) then
v_flag:=null;
else
v_flag:='1=2';
end if;
return v_flag;
end;
--drop policy  drop_rls.sql
exec  dbms_rls.drop_policy(object_schema => 'test',object_name => 'credit_card_test',policy_name => 'card_pwd_policy');
SQL> @drop_rls.sql
PL/SQL procedure successfully completed.
SQL> @create_rls.sql
PL/SQL procedure successfully completed.
SQL> @create_rls_f.sql
Function created.
SQL> conn test/test
seConnected.
SQL> lect * from credit_card_test where rownum<10;
   CARD_ID CARD_NAME                        CARD_PWD
---------- ------------------------------ ----------
       258 DUAL                                  258
       259 DUAL                                  259
       311 SYSTEM_PRIVILEGE_MAP                  311
       313 SYSTEM_PRIVILEGE_MAP                  313
       314 TABLE_PRIVILEGE_MAP                   314
       316 TABLE_PRIVILEGE_MAP                   316
       317 STMT_AUDIT_OPTION_MAP                 317
       319 STMT_AUDIT_OPTION_MAP                 319
       605 MAP_OBJECT                            605
9 rows selected.
SQL> conn credit_test/oracle
Connected.
SQL> select * from credit_card_test where rownum<10;
   CARD_ID CARD_NAME                        CARD_PWD
---------- ------------------------------ ----------
       258 DUAL
       259 DUAL
       311 SYSTEM_PRIVILEGE_MAP
       313 SYSTEM_PRIVILEGE_MAP
       314 TABLE_PRIVILEGE_MAP
       316 TABLE_PRIVILEGE_MAP
       317 STMT_AUDIT_OPTION_MAP
       319 STMT_AUDIT_OPTION_MAP
       605 MAP_OBJECT
9 rows selected.

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-04-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏文渊之博

初识SQL Server2017 图数据库(一)

背景:   图数据库对于表现和遍历复杂的实体之间关系是很有效果的。而这些在传统的关系型数据库中尤其是对于报表而言很难实现。如果把传统关系型数据库比做火车的话,那...

2238
来自专栏Jackson0714

【T-SQL基础】03.子查询

2696
来自专栏数据和云

12C 新特性 | 标量子查询自动转换

优化器是 Oracle 数据库最引人入胜的部件之一,因为它对每一个 SQL 语句的处理都必不可少。优化器为每个 SQL 语句确定最有效的执行计划,这是基于给定的...

3187
来自专栏java一日一条

MySQL分页性能优化指南

很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽...

803
来自专栏匠心独运的博客

大型分布式业务平台数据库优化方法(上)

文章摘要:一个小小的MySQL数据库B-Tree索引可能会带来意想不到的性能优化提升……

914
来自专栏数据和云

一个不懂业务的DBA不是好的DBA

编辑手记:懂业务,懂系统逻辑,你才能做一个更好的DBA。 在数据库巡检中发现一个MES生产信息数据库中一个存储过程中一条SQL单次逻辑读为2100,且执行很频繁...

2776
来自专栏程序你好

正确使用索引和Explain工具,MySQL性能提升实例

可以有多种不同层次的技术提高应用程序性能,但是通常我们首先关注的是数据库方面——这是最常见的性能瓶颈。数据库的性能可以改善吗?我们如何衡量,到底什么需要性能改进...

1003
来自专栏PHP实战技术

MySQL性能优化的最佳20+条经验

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事...

33512
来自专栏沃趣科技

ASM 翻译系列第二十六弹:ASM 高级知识 Where is my data

原作者:Bane Radulovic 译者: 邱大龙 审核: 魏兴华 DBGeeK社群联合出品 Where is my data 有时候我们想要知道...

3507
来自专栏高性能服务器开发

数据库进阶3 Mysql 性能优化20个原则(1)

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事...

681

扫码关注云+社区