Oracle策略相關(guān)
Oracle策略可以限制查詢、修改、刪除、新增等操作,剛接觸,對(duì)查詢做一個(gè)測(cè)試:
用法如下:
begin
-- Call the procedure
sys.dbms_rls.add_policy(object_schema => :數(shù)據(jù)表(或視圖)所在的Schema名稱/用戶,
object_name => :數(shù)據(jù)表(或視圖)的名稱,
policy_name => :policy的名稱
function_schema => :返回Where子句的函數(shù)所在Schema名稱/用戶,
policy_function => :返回Where子句的函數(shù)名稱,
statement_types => :要使用該P(yáng)olicy的DML類型,如'Select,Insert,Update,Delete',
update_check => 僅適用于Statement_Type為'Insert,Update',值為'True'或'False',
enable => 是否啟用,值為'True'或'False',
static_policy => 默認(rèn)值為FALSE。如果它被設(shè)置為TRUE則所有用戶啟用該策略,sys或特權(quán)用戶例外。
policy_type => :默認(rèn)值是null,意味著static_policy的值決定,在這里指定任何策略將覆蓋static_policy的值。
long_predicate => long_predicate,
sec_relevant_cols => :敏感的字段名稱,
sec_relevant_cols_opt => :設(shè)置為dbms_rls.ALL_ROWS來顯示所有的行,敏感的列的值為null);
end;
創(chuàng)建函數(shù):
- create or replace function f_policy
- (
- p_owner in varchar2,--兩個(gè)參數(shù)必須要有,名字可以不一樣
- 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;
該策略和函數(shù)搭配,限制了如果關(guān)于emp表的dml語句中未包含where下自動(dòng)添加where dept=10的條件,示例如下:
select * from emp;

刪除策略:
- begin
- sys.dbms_rls.drop_policy(object_schema => 'scott',
- object_name => 'emp',
- policy_name => 'sal');
- end;