虚拟专用数据库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 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

基于DB time的调优分析 (r6笔记第79天)

继昨天使用DB time能够快速灵活的定位sql语句之后,发现分析问题更快捷,高效了。今天就牛刀小试,把一个数据库从500%的负载调到不到100%的负载。前提是...

2994
来自专栏乐沙弥的世界

批量生成sqlldr文件,高速卸载数据

      SQL*Loader 是用于将外部数据进行批量高速加载的数据库的最高效工具,可用于将多种平面格式文件加载到Oracle数据库。SQL*Loader支...

1152
来自专栏Pythonista

mysql索引提高查询速度

  在web开发中,业务模版,业务逻辑(包括缓存、连接池)和数据库这三个部分,数据库在其中负责执行SQL查询并返回查询结果,是影响网站速度最重要的性能瓶颈。本文...

1023
来自专栏用户2442861的专栏

基于Spring + Spring MVC + Mybatis 高性能web构建

http://blog.csdn.net/zoutongyuan/article/details/41379851#comments

1791
来自专栏北京马哥教育

SQL优化之踩过的坑

正看资料看的过瘾,突然收到报警,说服务器负载太高,好吧,登录服务器看看,我擦嘞,还能不能愉快的玩耍了?下面是当时的负载情况 ? 看见mysql使用cpu已经到了...

4126
来自专栏Jerry的SAP技术分享

使用ABAP代码返回S/4HANA Material上维护的Attachment明细

1593
来自专栏ASP.NET MVC5 后台权限管理系统

SQL Server 存储过程生成insert语句

你肯定有过这样的烦恼,同样的表,不同的数据库,加入你不能执行select  insert 那么你肯定需要一条这样的存储过程,之需要传入表明,就会给你生成数据的插...

2015
来自专栏林欣哲

MySQL执行计划(explain)分析

这里的索引有auditstatus和productid,可以建立联合索引。但是哪个放左边就要计算区分度。

1254
来自专栏杨建荣的学习笔记

关于reset sequence(r3笔记第85天)

sequence在工作中使用比较频繁,对于Insert中插入的值,如果只需要它能够自动递增,这个时候sequence就派上用场了。 但是既然sequence的值...

3038
来自专栏一个爱吃西瓜的程序员

学习SQL【5】-数据更新

数据的更新处理大体可以分为插入(INSERT)、删除(DELETE)和更新(UPDATE)三类,此外,还会给大家介绍数据库中用来管理数据更新的重要概念—事务。 ...

3557

扫码关注云+社区