1、在SDE数据库中创建测试面状要素类testfeature,如下:
SQL> desc sde.testfeature;
Name Type Nullable Default Comments
-------- --------------- -------- ------- --------
OBJECTID INTEGER
TYPE NUMBER(5) Y
SHAPE SDE.ST_GEOMETRY Y
2 创建数据库访问角色和用户,并授权
--创建地图服务账户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
授权:
grant select on sde.testfeature TO user1; grant select on sde.testfeature TO user2;
3 在sde用户中创建策略函数(以sde用户登录)
--编写策略函数(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用户中应用策略
--应用策略 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的要素。
查看策略使用情况:
select object_owner,object_name,policy,predicate from V$VPD_POLICY;
清除所有数据:
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;
本文出自 “IT技术学习与交流” 博客,谢绝转载!