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);

完!
浙公网安备 33010602011771号