/*
控制要求如下:
三个逻辑库(数据源SA, SB, 中间结果SC)
让TA组对SA只读,SC可读写
让TB组对SB只读,SC可读写
假设TA组有ta1,ta2用户,TB组有TB1用户*/
/*通过管理员连接3库*/
libname sa sasspds "sa" server=wuyz.5400 user="admin" password="sasadm2" ;
libname sb sasspds "sb" server=wuyz.5400 user="admin" password="sasadm2" ;
libname sc sasspds "sc" server=wuyz.5400 user="admin" password="sasadm2" ;
/*写入初始测试表*/
data sa.test;
do i=1 to 100;
output;
end;
run;
data sc.test;
do i=1 to 100;
output;
end;
run;
/*
验证用户名是否能登陆
第一次连接时会提示如下:
ERROR: No ACL READ access to LIBNAME domain granted.
ERROR: LIBNAME 语句出错。
*/
libname u_sa sasspds "sa" server=wuyz.5400 user="ta1" password="sasadm1" prompt=yes;
libname u_sa sasspds "sa" server=wuyz.5400 user="ta2" prompt=yes;
libname u_sa sasspds "sa" server=wuyz.5400 user="tb1" prompt=yes;
/*
开始授权
让TA组对SA只读,SC可读写
让TB组对SB只读,SC可读写
*/
proc spdo library=sa;
set acluser admin;
add acl/libname;
modify acl/libname ta=(y,n,n,n);
list acl _all_;
quit;
proc spdo library=sb;
set acluser admin;
add acl/libname;
modify acl/libname tb=(y,n,n,n);
list acl _all_;
quit;
proc spdo library=sc;
set acluser admin;
add acl/libname;
modify acl/libname ta=(y,y,y,n) tb=(y,y,y,n);
list acl _all_;
quit;
/*测试TA组所在用户是否拥有对SA库的读权限*/
libname u_sa sasspds "sa" server=wuyz.5400 user="ta1" password="sasadm2";
/*
由于只有读权限,故不能执行写动作,否则报如下错误:
ERROR: ACLWRITE access to LIBNAME domain required to create new data set.
*/
data u_sa.ta1_t1;
i=1;run;
/*
如果读sa.test表,出现如下错误:
ERROR: ACLREAD access to existing data set required.
则是由于LIBNAMES.parm在分配库时没有指定 LIBACLINHERIT=YES 选项,故导致组的权限不能被继承下来,通过改动,则可以正常执行
*/
data _null_;
set u_sa.test;
put _all_;
run;
/*
测试TA组所在用户是否拥有对SB库的任意权限
由于用户没有对sb库的权限,会提示如下错误:
ERROR: No ACL READ access to LIBNAME domain granted.
ERROR: LIBNAME 语句出错。
*/
libname u_sb sasspds "sb" server=wuyz.5400 user="ta1" password="sasadm2";
/*测试TA组所在用户是否拥有对SC库的读写权限*/
libname u_sc sasspds "sc" server=wuyz.5400 user="ta1" password="sasadm2";
/*测试写*/
data u_sc.ta1_t1;
i=1;run;
/*测试读*/
data _null_;
set u_sc.test;
put _all_;
run;
/*测试能否更改*/
data u_sc.test;
set u_sc.test;
run;
/*TB组的测试不在参照TA组*/