You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中dbms_metadata.get_granted_ddl无法过滤SYS对象授权的问题

Oracle Schema迁移:提取SYS对象授权的问题解决

问题原因

你当前的SQL写法逻辑存在误区:dbms_metadata.get_granted_ddl('OBJECT_GRANT', 'USERNAME')函数本身会返回指定用户的所有对象级授权,外层dba_tab_privs的查询只是用来触发函数调用,函数不会参考外层的grantor = 'SYS'过滤条件,所以无论是否添加该条件,都会返回该用户的全部授权。

解决方案

方案一:直接从数据字典生成精准授权语句

这种方式更高效且可控,直接从dba_tab_privs过滤SYS授予的权限并生成DDL:

set long 1120000 longchunksize 1120000 pagesize 0 linesize 1000 feedback off verify off trimspool on
column grant_ddl format a1000
select 'GRANT ' || privilege || ' ON ' || owner || '.' || table_name || ' TO ' || grantee ||
       case when grantable = 'YES' then ' WITH GRANT OPTION;' else ';' end as grant_ddl
from dba_tab_privs
where grantee = 'USERNAME'
  and grantor = 'SYS';

方案二:结合DBMS_METADATA和正则筛选

如果需要保留dbms_metadata的格式输出,可以先提取所有授权,再通过正则表达式筛选SYS对象的授权:

set long 1120000 longchunksize 1120000 pagesize 0 linesize 1000 feedback off verify off trimspool on
column ddl format a1000
begin
    dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'PRETTY', true);
end;
/
select regexp_substr(ddl, 'GRANT .*ON SYS\..*;', 1, level) as ddl
from (
    select dbms_metadata.get_granted_ddl('OBJECT_GRANT', 'USERNAME') as ddl
    from dual
)
connect by level <= regexp_count(ddl, 'GRANT .*ON SYS\..*;');

补充说明

针对Schema迁移中SYS对象授权无法随Schema迁移的问题,Oracle官方文档Doc ID 1911151.1提及的脚本失效可能与数据库版本、权限范围等因素有关,上述两种方法可以更灵活地获取目标授权。

内容的提问来源于stack exchange,提问作者Gary G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:37:38