您现在的位置是:首页
>
如何进行权限控制 实现数据行的权限控制(Policy的应用)
实现数据行的权限控制 Policy的应用 前言 数据访问权限控制 是一个古老而又实际的问题 在大部份系统中 权限控制主要定义为模块进入权限的控制和数据列访问权限的控制 如 某某人可以进入某

实现数据行的权限控制(Policy的应用)
前言 数据访问权限控制 是一个古老而又实际的问题 在大部份系统中 权限控制主要定义为模块进入权限的控制和数据列访问权限的控制(如 某某人可以进入某个控制 仓库不充许查看有关金额的字段等等) 但在某些系统中 权限控制又必须定义到数据行访问权限的控制 此需求一般出现在同一系统 不同的相对独立机构使用的情况 (如 集团下属多个子公司 所有子公司使用同一套数据表 但不同子公司的数据相对隔离) 当然 绝大多数人会选择在View加上Where子句来进行数据隔离 此方法编码工作量大 系统适应用户管理体系的弹性空间较小 一旦权限逻辑发生变动 就可能需要修改权限体系 导致所有的View都必须修改 本文探讨的使用Oracle提供的Policy管理方法来实现数据行的隔离 特别感谢Javac兄提出的此解决方案! 实现 Oracle Policy的简单说明 Policy应用于数据行访问权限控制时 其作用简而言之 就是在查询数据表时 自动在查询结果上加上一个Where子句 如果该查询已有where子句 则在该Where子句后面加上 And 由Oracle Policy自动加入的Where子句的内容 通常由一个函数来实现 而进行数据行访问权限控制算法实现的结果 也是通过该函数返回 Oracle Policy的语法简述 新增Policy Dbms_Rls Add_Policy(Object_Schema 数据表(或视图)所在的Schema名称 Object_Name 数据表(或视图)的名称 Policy_Name POLICY的名称 主要用于将来对Policy的管理 Function_Schema 返回Where子句的函数所在Schema名称 Policy_Function 返回Where子句的函数名称 Statement_Types 要使用该Policy的DML类型 如 Select Insert Update Delete Update_Check 仅适用于Statement_Type为 Insert Update 值为 True 或 False Enable 是否启用 值为 True 或 False ); 注 如果Update_Check设为 True 则用户插入的值不符合Policy_Function返回条件时 该DML执行返回错误信息 删除Policy Dbms_Rls drop_policy(object_schema 要删除的Policy所在的Schema object_name 要删除Policy的数据表(或视图)名称 policy_name 要删除的Policy名称 ); 设定Policy状态 Dbms_Rls Enable_Policy(object_schema 要删除的Policy所在的Schema object_name 要删除Policy的数据表(或视图)名称 policy_name 要删除的Policy名称 Enable 是否启用 值为 True 或 False ); Policy使用特性及使用建议 ● 一个数据表(或视图)可以有多个Policy 但Policy的名称在整个Schema范围内不允许重复 ● 如果将Policy指定到视图 则删除Policy后 应重新编译该视图 否则User_Updatable_Columns系统字典表返回的是否可新增修改删除的信息可能会全部为 NOT ● 通过Policy可以限制用户对数据表记录的操作范围 如果Policy加在数据表 则由于前台涉及的数据源(通常是视图)往往涉及许多张数据表 权限控制难度很大 建议将Policy加在视图 Oracle Policy 应用实例 创建测试数据表 Create Table T_Policy(T Varchar ( ) T Number( )); 创建测试的Policy函数 CREATE OR REPLACE Function Fn_GetPolicy (P_Schema In Varchar P_Object In Varchar ) Return Varchar Is Begin Return T = ; End; 插入测试数据 Insert Into T_Policy Values( a ); Insert Into T_Policy Values( b ); Insert Into T_Policy Values( c ); Commit; 加入Policy Begin Dbms_Rls Add_Policy(Object_Schema => Scott Object_Name => T_Policy Policy_Name => T_TestPolicy Function_Schema => Scott Policy_Function => Fn_GetPolicy Statement_Types => Select Insert Update Delete Update_Check => True Enable => True ); End; 测试Policy Select * From T_Policy; Insert Into T_Policy Values ( d ); Insert Into T_Policy Values ( d ); Commit; 查看Policyy设定情况 Select * From user_policies; 重要提示 执行Dbms_Rls Add_Policy时 必须将执行Dbms_Rls包执行的权限授予Scott 测试时也可能使用其它Schema 最简单的方法是将测试的Schame设为 DBA 权限 lishixinzhi/Article/program/Oracle/201311/16724 很赞哦! (1052)