1、在SDE数据库中创建测试面状要素类testfeature,如下:
SQL> desc sde.testfeature;
Name Type Nullable Default Comments
-------- --------------- -------- ------- --------
OBJECTID INTEGER
TYPE NUMBER(5) Y
SHAPE SDE.ST_GEOMETRY Y
2 创建数据库访问角色和用户,并授权
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
--创建地图服务账户user1
CREATE
USER
user1 IDENTIFIED
by
password123
DEFAULT
TABLESPACE SDE
TEMPORARY
TABLESPACE
TEMP
;
--为地图服务账户赋予数据库访问权限
GRANT
CONNECT
,RESOURCE
to
user1;
--创建地图服务账户user2
CREATE
USER
user2 IDENTIFIED
by
password123
DEFAULT
TABLESPACE SDE
TEMPORARY
TABLESPACE
TEMP
;
--为地图服务账户赋予数据库访问权限
GRANT
CONNECT
,RESOURCE
to
user2;
--授权user1和user2通过SDE用户访问SDE数据
ALTER
USER
user1
GRANT
CONNECT
THROUGH sde;
ALTER
USER
user2
GRANT
CONNECT
THROUGH sde;
--供水设施浏览角色:role1
CREATE
ROLE role1
NOT
IDENTIFIED;
GRANT
SELECT
ON
SDE.testfeature
TO
role1;
--将角色授权给用户
GRANT
role1
TO
user1;
GRANT
role1
TO
user2;
|
备注:授权user1和user2通过SDE用户访问SDE数据,可以省略不要。
ALTER
USER
user1
GRANT
CONNECT
THROUGH sde;
ALTER
USER
user2
GRANT
CONNECT
THROUGH sde;
或可以不用创建角色,直接给用户
user1和user2
授权:
1
2
|
grant select on sde.testfeature TO user1;
grant select on sde.testfeature TO user2;
|
3 在sde用户中创建策略函数(以sde用户登录)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
--编写策略函数(get_data)
CREATE
OR
REPLACE
FUNCTION
get_data(p_owner
in
varchar2, p_object
in
varchar2)
return
varchar2
IS
v_region varchar2(40);
begin
v_region := sys_context(
'USERENV'
,
'SESSION_USER'
);
IF v_region =
'USER1'
then
return
'Type=1'
;
ELSIF v_region =
'USER2'
then
return
'Type=2'
;
ELSIF v_region =
'USER3'
then
return
'Type=3'
;
ELSE
return
null
;
end
IF;
end
;
|
4 在sys用户中应用策略
1
2
3
4
5
6
7
8
9
10
11
|
--应用策略
BEGIN
dbms_rls.add_policy(
object_schema =>
'sde'
,
object_name =>
'testfeature'
,
policy_name =>
'testfeature_pol'
,
function_schema =>
'sde'
,
policy_function =>
'get_data'
,
Statement_Types =>
'Select'
,
Enable =>
True
);
END
;
|
5、 测试
(1)以sde用户连接数据库,加载要素类testfeature,结果如下:
备注:策略函数中sde用户返回值为null,即不加谓词。
(2)以user1用户连接数据库,加载要素类testfeature,结果如下:
备注:user1用户返回值为Type=1,即只显示Type=1的要素。
查看策略使用情况:
1
|
select
object_owner,object_name,policy,predicate
from
V$VPD_POLICY;
|
清除所有数据:
1
2
3
4
5
6
7
8
9
10
11
|
drop
user
user1
cascade
;
drop
user
user2
cascade
;
drop
role role1;
drop
function
sde.get_data;
BEGIN
DBMS_RLS.drop_policy (
object_schema =>
'sde'
,
object_name =>
'testfeature'
,
policy_name =>
'testfeature_pol'
);
END
;
commit
;
|
本文转自stock0991 51CTO博客,原文链接:http://blog.51cto.com/qing0991/1374177,如需转载请自行联系原作者