程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle策略相關,oracle策略

Oracle策略相關,oracle策略

編輯:Oracle教程

Oracle策略相關,oracle策略


Oracle策略可以限制查詢、修改、刪除、新增等操作,剛接觸,對查詢做一個測試:

參照 http://blog.csdn.net/diyyong/article/details/19552637

用法如下:

begin
-- Call the procedure
sys.dbms_rls.add_policy(object_schema => :數據表(或視圖)所在的Schema名稱/用戶,
object_name => :數據表(或視圖)的名稱,
policy_name => :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',
static_policy => 默認值為FALSE。如果它被設置為TRUE則所有用戶啟用該策略,sys或特權用戶例外。
policy_type => :默認值是null,意味著static_policy的值決定,在這裡指定任何策略將覆蓋static_policy的值。
long_predicate => long_predicate,
sec_relevant_cols => :敏感的字段名稱,
sec_relevant_cols_opt => :設置為dbms_rls.ALL_ROWS來顯示所有的行,敏感的列的值為null);
end;

創建函數:

create or replace function f_policy
(
  p_owner  in varchar2,--兩個參數必須要有,名字可以不一樣
  p_object in varchar2
) return varchar2 as
  v_sql varchar2(2000);
begin
  v_sql := lower(sys_context('USERENV', 'CURRENT_SQL', 4000));
  if instr(v_sql, ' where ') = 0 then
    return 'deptno=10';
    --raise_application_error(-20001, '未包含where條件');
  end if;
  return '';
end;

  

添加策略(需在sys下添加):

begin
dbms_rls.add_policy(object_schema => 'scott', object_name => 'emp',
policy_name => 'sal', function_schema => 'scott',
policy_function => 'f_policy', sec_relevant_cols => 'sal');
end;

該策略和函數搭配,限制了如果關於emp表的dml語句中未包含where下自動添加where dept=10的條件,示例如下:

select * from emp;

 刪除策略:

begin  
  sys.dbms_rls.drop_policy(object_schema => 'scott',  
                           object_name => 'emp',  
                           policy_name => 'sal');  
end;

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved