用DNINMSV31账户登录数据库进行如下操作:
CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND
DEFAULT TABLESPACE "TBS_DNINMSV31"
TEMPORARY TABLESPACE "TEMP2"
QUOTA UNLIMITED ON "TBS_DNINMSV31";
GRANT "CONNECT" TO NORTHBOUND;
ALTER USER NORTHBOUND DEFAULT ROLE NONE;
GRANT CREATE SESSION TO NORTHBOUND;
GRANT SELECT ON "DNINMSV31"."V_DNDEVICE" TO NORTHBOUND;
GRANT SELECT ON "DNINMSV31"."V_DNSUBNE" TO NORTHBOUND;
GRANT SELECT ON "DNINMSV31"."V_DNPACKAGE" TO NORTHBOUND;
GRANT SELECT ON "DNINMSV31"."V_DNPORT" TO NORTHBOUND;
【注】:在用NORTHBOUND登录后查询的时候要在视图前加上DNINMSV31,否则会报表或视图不存在。
例如:
select * from DNINMSV31.V_DNDEVICE; --可以正常执行
select * from DNINMSV31.TB_DEVICE where rownum<5; --执行的时候会报表或视图不存在
创建同义词供对方公司系统访问:
CREATE SYNONYM V_DNDEVICE FOR DNINMSV31.V_DNDEVICE;
CREATE SYNONYM V_DNSUBNE FOR DNINMSV31.V_DNSUBNE;
CREATE SYNONYM V_DNPACKAGE FOR DNINMSV31.V_DNPACKAGE;
CREATE SYNONYM V_DNPORT FOR DNINMSV31.V_DNPORT;
第三方的系统直接通过这个同义词就可以访问到用户DNINMSV31中的视图。这也是对系统安全的一种保护措施。第三方系统登录后,只能看到其同义词,其他的都不会访问得到。
最后还要对NORTHBOUND用户进行连接数的限制,以免第三方无限制的连接数据库,造成数据库SESSION暴涨:
conn / as sysdba
alter system set resource_limite=true scope=both sid='*';
新建profile, 初始限制为1 ,用于测试。
create profile third_user limit SESSIONS_PER_USER 1 FAILED_LOGIN_ATTEMPTS unlimited;
alter user NORTHBOUND profile third_user;
将会话数调整到30
alter profile third_user limit SESSIONS_PER_USER 30;
--------------------------------------------------------------------------------------------------
跟第三方做接口程序时给对方开放只能查询某些视图用户的步骤如下:
我们有这样一个需求:在数据库中建立两个用户,用户A 用于创建一些视图,直接访问自己数据库中一个模式下的表,以及通过数据库链路访问其他数据库中的表;另一个用户B 能访问到这个用户A 中的视图,并且只能访问视图,且访问连接数有限制。
这个用户B 是用来给其他系统访问的,因此对权限和资源使用都需要有限制条件。
这种需求在很多行业的应用中都很常见。假如这是一道面试题,您该如何去回答呢?
我采用下面的方法来回答这个问题。
第一步,创建新用户A 和B 。
这里用户名称分别为ryd_interface_src 和ryd_interface ,对这两个用户都授予非常有限的权限。
复制代码
drop user ryd_interface_src cascade;
create user ryd_interface_src identified by ryd_interface_src;
grant connect,create view to ryd_interface_src;
drop user ryd_interface cascade;
create user ryd_interface identified by ryd_interface;
grant connect,create synonym to ryd_interface;
第二步,登录数据库一个模式中,授权给用户A ,使得用户A 能创建视图
conn qlzqclient/qlzq+client8
grant select on INVEST_CLOCK to ryd_interface_src with grant option;
grant select on INVEST_LOG to ryd_interface_src with grant option;
这里授权方法加了一个with grant option ,请注意。
第三步,登录数据库用户A 中,创建视图
复制代码
conn ryd_interface_src/ryd_interface_src
create or replace view run_views as
select id as doc_id, title,fbsj as upload_date,'' as branch_code from qlzq.runs_lantern@CLIENT_QLZQWEB
where EXT1='1' and sysdate > START_TIME
and sysdate < SOLID_TIME
union
select a.doc_id,a.title,a.upload_date,a.branch_code from qlzq.cms_doc_single_attr@CLIENT_QLZQWEB a
left join qlzq.cms_doc_category_map@CLIENT_QLZQWEB b on a.doc_id=b.doc_id
where
a.state =1 and a.is_delete =0
and a.upload_date> sysdate-90
and b.cat_id=4;
create or replace view INVEST_CLOCK_VIEWS as
select * from qlzqclient.INVEST_CLOCK;
create or replace view INVEST_LOG_VIEWS as
select * from qlzqclient.INVEST_LOG;
第四步,在数据库用户A 中,将视图查询权限授予给用户B
因为在步骤二中,加了with grant option ,所以这里视图查询权限可以成功授予。
grant select on INVEST_CLOCK_views to ryd_interface;
grant select on INVEST_LOG_views to ryd_interface;
grant select on run_views to ryd_interface;
第五步,在数据库用户B 中,检查视图能否查询得到,再创建同义词。
复制代码
conn ryd_interface/ryd_interface
select count(*) from ryd_interface_src.run_views;
select count(*) from ryd_interface_src.INVEST_CLOCK_views;
select count(*) from ryd_interface_src.INVEST_LOG_views;
create synonym run_views for ryd_interface_src.run_views;
create synonym INVEST_CLOCK_views for ryd_interface_src.INVEST_CLOCK_views;
create synonym INVEST_log_views for ryd_interface_src.INVEST_log_views;