在SYSTEM下执行,新建用户CFDBUSER
技巧:在SYSTEM下执行,设定用户账号密码不过期
ALTER USER CFDBUSER DISABLE PASSWORD LIFETIME;
在SYSTEM下执行,给角色CFDBUSER_READ授予远程数据源CFMOTODB访问权限
在SYSTEM下执行,给用户CFDBUSER授予角色CFDBUSER_READ
(备注:同样给用户SAPHANADB授予角色CFDBUSER_READ,可获得下面设置的权限)
登录用户SAPHANADB,给角色授予对自己的访问权限
(备注:仅开发环境勾选3、查看对象定义语句)
给角色授予对自己的访问权限(同2.3),主要用于通过该角色授予其他用户访问权限,如SAPHANADB访问CFDBUSER(因为SAPHANADB也被授予了角色CFDBUSER_READ)
(1)对账号同名Schema,具备管理员权限;
(2)通过角色CFDBUSER_READ,获得对本地Schema SAPHANADB以及远程数据源CFMOTODB的访问权限(仅限执行、查询权限)
权限验证:
select * from saphanadb.mara --schema.table
select * from cfmotodb.cfmotodb.cesi --remotesource.schema.table
在CFDBUSER库中,创建以下对象:
--创建表:
create table t_test
(
f1 int,
f2 varchar(10)
)
--创建视图:本地表
create view v_test_for_table
as
select * from t_test;
--创建视图:跨Schema表
create view v_test_for_schema
as
select top 10 * from saphanadb.mara;
--创建视图:远程数据源表
CREATE view v_test_for_remote
as
select top 10 * from CFMOTODB.CFMOTODB.cesi;
--创建存储过程:跨Schema表
create procedure p_test_GET_MARAS
(
in i_matnr NVARCHAR(40)
)
language sqlscript as
begin
select top 10 MANDT, MATNR, GROES, WRKST
from SAPHANADB.MARA
where MATNR like :i_matnr || '%';
end;
在CFDBUSER库中,执行以下语句:
select * from t_test; --执行成功
select * from v_test_for_table; --执行成功
select * from v_test_for_schema; --执行成功
select * from v_test_for_remote; --执行成功
call p_test_GET_MARAS(''); --执行成功
select * from CFMOTODB.CFMOTODB.cesi; --执行成功
在SAPHANADB库中,执行以下语句:
select * from CFDBUSER.t_test; --执行成功
select * from CFDBUSER.v_test_for_table; --执行成功
select * from CFDBUSER.v_test_for_schema; --执行失败,Not authorized
select * from CFDBUSER.v_test_for_remote; --执行失败,Not authorized
call CFDBUSER.p_test_GET_MARAS(''); --执行失败,Not authorized
select * from CFDBUSER.CFMOTODB.CFMOTODB.cesi; --执行失败,语法错误,不能再加前缀CFDBUSER
处理以上Not authorized问题:若其他用户需要访问CFDBUSER的被授权资源,需在原授权时勾选“Grantable to others”,如下图:
再次,在SAPHANADB库中,执行以下语句:
select * from CFDBUSER.t_test; --执行成功
select * from CFDBUSER.v_test_for_table; --执行成功
select * from CFDBUSER.v_test_for_schema; --执行成功
select * from CFDBUSER.v_test_for_remote; --执行成功
call CFDBUSER.p_test_GET_MARAS(''); --执行成功
select * from CFMOTODB.CFMOTODB.cesi; --执行成功