ORACLE 通过动态SQL进行授权

我们知道授权对象权限都是通过grant,但是如果将某一个用户的某一类的权限全部授权给某一个用户,如果是查出来每一个对象然后进行grant很费时间,下面我们可以通过动态sql的循环的方式来授权。

一:通过动态sql将EXT用户下的表授予test用户查询

DECLARE

XSQL1 VARCHAR2(2000);
BEGIN
FOR I IN (SELECT 'EXT.' || TABLE_NAME AS NAMES
FROM DBA_TABLES
WHERE OWNER = 'EXT') LOOP
XSQL1 := 'grant select ON ' || I.NAMES || ' TO test';
EXECUTE IMMEDIATE XSQL1;
DBMS_OUTPUT.PUT_LINE(XSQL1);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(XSQL1);
END;
/

二:通过动态sql将EXT用户下的包、函数、过程授予test用户执行查看。

DECLARE XSQL1 VARCHAR2(2000);
BEGIN
FOR I IN (SELECT 'EXT.' || OBJECT_NAME AS NAMES
FROM DBA_PROCEDURES
WHERE OWNER = 'EXT') LOOP
XSQL1 := 'grant execute ON ' || I.NAMES || ' TO test';
EXECUTE IMMEDIATE XSQL1;
DBMS_OUTPUT.PUT_LINE(XSQL1);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(XSQL1);
END;
/

通过DBMS_OUTPUT.PUT_LINE(XSQL1);语句我们可以把执行的结果打印到plsql developer的OUTPUT窗口。

如果执行出现异常,由于使用了EXCEPTION我们也可以将异常部分打印出来,笔者在执行第一个select授权的时候,遇到过表名大小写都有的情况(默认建表时不论用的大写还是小写在dba_tables中都是大写),

这样授权的脚本会执行失败,这说明有人建表时用了双引号,真是坑,

举个例子:

CREATE TABLE "Aaa_Bbb" (A INT);

 

 

 完!

posted on 2020-05-27 15:08  狂奔的熊猫  阅读(275)  评论(0)    收藏  举报