oracle策略POLICY学习
程序员文章站
2022-06-17 19:47:04
...
-- 1、创建测试表
create
table
TEST_POLICY
(
USERNAME VARCHAR2(10),
PASSWORD
NUMBER(10)
);
insert
into
t_policy
values
(
'a'
,30);
insert
into
t_policy
values
(
'b'
,20);
insert
into
t_policy
values
(
'c'
,40);
commit
;
--2、创建策略约束函数,表只可输入密码为40的用户,其他用户将被删除
CREATE
OR
REPLACE
Function
Fn_GetPolicy(P_Schema
in
varchar2,
P_Object
in
varchar2)
return
varchar2
is
L_PREDICATE VARCHAR2(1000) :=
''
;
Begin
L_PREDICATE :=
'password=40'
;
Return
L_PREDICATE;
end
Fn_GetPolicy;
--3、创建策略
declare
Begin
Dbms_Rls.Add_Policy(Object_Schema =>
'SCOTT'
,
--数据表(或视图)所在的Schema名称
Object_Name =>
'TEST_Policy'
,
--数据表(或视图)的名称
Policy_Name =>
'T_TestPolicy'
,
--POLICY的名称,主要用于将来对Policy的管理
Function_Schema =>
'SCOTT'
,
--返回Where子句的函数所在Schema名称
Policy_Function =>
'Fn_GetPolicy'
,
--返回Where子句的函数名称
Statement_Types =>
'Select,Insert,Update,Delete'
,
--要使用该Policy的DML类型,如'Select,Insert,Update,Delete'
Update_Check =>
True
,
--仅适用于Statement_Type为'Insert,Update',值为'True'或'False'
Enable =>
True
--是否启用,值为'True'或'False'
);
end
;
--注:如果Update_Check设为'True',则用户插入的值不符合Policy_Function返回条件时,该DML执行返回错误信息。
--现在就可以工作了: select * from t_policy; 看看结果怎样, 是不是少了password<>40的数据了.
--4、查看当前用户的策略
SELECT
*
FROM
USER_POLICIES;
--5、删除策略
DECLARE
BEGIN
Dbms_Rls.drop_policy(
'SCOTT'
,
--要删除的Policy所在的Schema
'TEST_Policy'
,
--要删除Policy的数据表(或视图)名称
'T_TESTPOLICY'
--要删除的Policy名称
);
end
;