我想使用 dbms_metadata 包获取数据库中所有角色的 ddls。不幸的是,当角色没有授权(对象、系统或角色类型)时,dbms_metadata.get_granted_ddl 会失败并出现错误。这就是为什么我必须检查 dba_tab_privs、dba_sys_privs 和 dba_role_privs 视图中是否存在权限。 但是,AQ_ADMINISTRATOR_ROLE 角色具有系统权限,以下语句将失败。检查了两个数据库。
sqlplus system/pass@db1
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', 'AQ_ADMINISTRATOR_ROLE')
from dual
where exists (select 1 from dba_sys_privs where grantee = 'AQ_ADMINISTRATOR_ROLE')
/
ORA-31608: 未找到 SYSTEM_GRANT 类型的指定对象 ORA-06512: 在“SYS.DBMS_METADATA”,第 4018 行 ORA-06512:在“SYS.DBMS_METADATA”, 第 5991 行 ORA-06512:位于第 1 行
select * from v$version
/
Oracle Database 11g Release 11.2.0.2.0 - 64bit Production PL/SQL
Release 11.2.0.2.0 - Production CORE 11.2.0.2.0 Production
如果没有与您的参数匹配的行,Oracle 将返回该异常。 QA_ADMINISTRATOR_ROLE 不得有 SYSTEM_GRANT 对象
这将返回您正在寻找的内容:
select dbms_metadata.GET_GRANTED_DDL('SYSTEM_GRANT') from dual;
这将返回类似以下内容:
GRANT CREATE JOB TO "SCOTT"
GRANT SELECT ANY DICTIONARY TO "SCOTT"
GRANT EXECUTE ANY TYPE TO "SCOTT"
我假设,您想要提取授予当前模式用户(当您说“数据库”时)的所有权限(角色/权限)的 DDL。
如果要提取给定用户,请使用以下命令:
select dbms_metadata.GET_GRANTED_DDL('SYSTEM_GRANT', 'SCOTT') from dual;
如果想要将对象上授予的权限从当前用户提取到另一个架构用户,请使用以下命令:-
select DBMS_METADATA.GET_DEPENDENT_DDL('OBJECT_GRANT','TEST_TABLE') from dual;
它看起来像是依赖于特定角色的东西:
SELECT
dbms_metadata.get_granted_ddl ('SYSTEM_GRANT', role)
FROM (
SELECT
DISTINCT R.ROLE
FROM
dba_sys_privs TP
INNER JOIN DBA_ROLES R ON (R.ROLE=TP.GRANTEE)
WHERE R.ROLE!='AQ_ADMINISTRATOR_ROLE'
)
/
对我有用,但如果包含该特定角色则不起作用......