ORACLE VPD AND FGA

简介: 原创 转载请注明出处 VPD 虚拟专用数据库,主要用来控制某个用户对特定列的一个访问权限,比如我是李三,我在查看员工信息表的时候,只要查看了薪水列,就只显示我李三的这一行,因为其他员工的薪水对我是保密了。

原创 转载请注明出处

VPD 虚拟专用数据库,主要用来控制某个用户对特定列的一个访问权限,比如我是李三,我在查看员工信息表的时候,只要查看了薪水列,就只显示我李三的这一行,因为其他员工的薪水对我是保密了。使用包dbms_rls来管理列:只要用户查看了薪水列只返回这个用户相关的列。

 1、表结构如下: SQL> select * from pp;


EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980-12-17    6000.00               20
 7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
 7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
 7782 CLARK      MANAGER    7839 1981-6-9      2450.00               10
 7788 SCOTT      ANALYST    7566 1987-4-19     3000.00               20
 7839 KING       PRESIDENT       1981-11-17    5000.00               10
 7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
 7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
 7900 JAMES      CLERK      7698 1981-12-3      950.00               30
 7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
 7934 MILLER     CLERK      7782 1982-1-23     1300.00               10

2、建立函数

 create or replace function emp_pf
 (owner varchar2,objname varchar2)
 return varchar2
 is
where_clause varchar2(2000);
begin
 where_clause:='ename=sys_context(''userenv'',''session_user'')';
 return where_clause;
 end;

Function created 这个函数主要返回是当前会话的用户名,用于判断他一旦访问了薪水列,哪一列他能够查看。

3、建立策略

SQL> begin
  2    dbms_rls.add_policy(object_name => 'pp',policy_name => 'TEST',function_schema => 'pp',policy_function => 'emp_pf',sec_relevant_cols => 'SAL',sec_relevant_cols_opt => dbms_rls.all_rows);
  3  end;
  4  /

4、登陆SMITH用户查看,可以看到这里的SAL列除了SMITH用户自己的SAL是有值的其他都是NULL,当然我这里使用了dbms_rls.all_rows显示所有列,策略列其他值放回为NULL。也可以不使用那样的话只会返回1列就是SAL有值的那一列。

SQL> select * from pp.pp;
 
EMPNO ENAME      JOB         MGR HIREDATE           SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- ---------- --------- ------
 7369 SMITH      CLERK      7902 1980-12-17        6000               20
 7499 ALLEN      SALESMAN   7698 1981-2-20                 300.00     30
 7521 WARD       SALESMAN   7698 1981-2-22                 500.00     30
 7566 JONES      MANAGER    7839 1981-4-2                             20
 7654 MARTIN     SALESMAN   7698 1981-9-28                1400.00     30
 7698 BLAKE      MANAGER    7839 1981-5-1                             30
 7782 CLARK      MANAGER    7839 1981-6-9                             10
 7788 SCOTT      ANALYST    7566 1987-4-19                            20
 7839 KING       PRESIDENT       1981-11-17                           10
 7844 TURNER     SALESMAN   7698 1981-9-8                    0.00     30
 7876 ADAMS      CLERK      7788 1987-5-23                            20
 7900 JAMES      CLERK      7698 1981-12-3                            30
 7902 FORD       ANALYST    7566 1981-12-3                            20
 7934 MILLER     CLERK      7782 1982-1-23                            10

5、删除

SQL> execute dbms_rls.drop_policy(object_name => 'pp',policy_name=> 'TEST');

ORACLE 10G中VPD的策略因为要消耗较多的资源,所以引入了SGA缓存,所以有了5中不同类型的策略

1、动态

2、静态

3、共享-静态

4、上下文敏感

5、共享-上下文敏感

本人也不太熟悉,所以这里提一下。需要的朋友自己研究下。

FGA 细粒度审计,ORACLE其实提供了审计功能,但是为了支持更加复杂的审计情况引入了FGA,比如我只想审计谁修改了员工信息表中的薪水列,就可以考虑使用FGA来实现。使用包dbms_fga来管理列,我想审计PP表中对薪水列有关的且薪水列大于5000的SELECT UPDATE会话信息

1、查看表结构

SQL> select * from pp;


EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980-12-17    6000.00               20
 7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
 7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
 7782 CLARK      MANAGER    7839 1981-6-9      2450.00               10
 7788 SCOTT      ANALYST    7566 1987-4-19     3000.00               20
 7839 KING       PRESIDENT       1981-11-17    5000.00               10
 7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
 7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
 7900 JAMES      CLERK      7698 1981-12-3      950.00               30
 7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
 7934 MILLER     CLERK      7782 1982-1-23     1300.00               10

2、建立策略

execute dbms_fga.add_policy(policy_name => 'FGA_TEST',object_name => 'PP',audit_column=> 'SAL',statement_types=> 'SELECT,UPDATE',audit_condition => 'SAL>5000');

3、查看结果

SQL> select count(*) from pp where sal>5000;

COUNT(*)

----------

0

SQL> select count(*) from dba_fga_audit_trail;

COUNT(*)

----------

0

没有涉及到大于5000的现在进行UPDATE,SELECT

SQL> update pp set SAL=6000 where ENAME='SMITH';

1 row updated

SQL> commit;

Commit complete

SQL> select * from pp where ENAME='SMITH';

 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

7369 SMITH CLERK 7902 1980-12-17 6000.00 20

再次查看结果

SQL> select count(*) from dba_fga_audit_trail;

COUNT(*)

----------

2

SQL> select SESSION_ID,DB_USER,OS_USER,SQL_TEXT  from dba_fga_audit_trail;
 
SESSION_ID DB_USER                        OS_USER                                                                          SQL_TEXT
---------- ------------------------------ -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
     68491 PP                             gaopeng                                                                         
                                                                                                                           update pp set SAL=6000 where ENAME='SMITH'
 
     68491 PP                             gaopeng                                                                         
                                                                                                                           select * from pp where ENAME='SMITH'
                                                                       

不错吧。其实有时候还是很有用的,当然这两个包的选项都很多,我没学习完。这里只是给出了一些列子。

相关文章
|
安全 关系型数据库 Oracle
ORACLE 安全访问策略VPD与ORA-28132
                                                                                                                                    ...
1224 0
|
安全 Oracle 关系型数据库
SYS_R12 MOAC多组织底层技术实现技术分析(Oracle VPD) (案例)
2014-05-30 Created By BaoXinjian 一、 介绍 之前一直存在对Oracle R12 多组织访问的一些疑惑,所以查询了一些相关资料,并介绍实现R12 MOAC的Oracle VPD技术 Oracle VPD全称Virtual Private Database, ...
1289 0
|
6月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
548 93
|
5月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
314 0
|
8月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
6月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
435 8
|
8月前
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
402 11
|
8月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—服务器异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。 Oracle数据库恢复流程: 1、检测数据库故障情况; 2、尝试挂起并修复数据库; 3、解析数据库文件; 4、导出并验证恢复的数据库文件。

推荐镜像

更多