跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何将Oracle用户的对象所有权转移_使用数据泵REMAP_SCHEMA功能

REMAP_SCHEMA仅重写导入语句中的schema名,不修改现有对象owner、不更新数据字典、不处理依赖链;真正转移所有权需重建用户或手动ALTER。 直接用
impdp
的
remap_schema
不能转移对象所有权——它只重定向对象创建语句中的 schema 名,不修改已存在对象的
owner
字段,也不触发权限链路重绑定。真正“转移所有权”必须配合用户重建或显式
alter
操作。 REMAP_SCHEMA 实际干了什么 它在导入时把源 dump 文件中所有
CREATE TABLE scott.emp
类语句,自动改写成
CREATE TABLE hr.emp
,再执行。但这个过程完全不碰源库里的
scott
用户本身,也不动目标库中已存在的
hr
用户对象。 只影响新导入的对象:表、索引、视图、同义词等结构都会落到目标 schema 下 不迁移已有对象:如果目标库
hr
已有同名表,
impdp
默认报错(除非加
TABLE_EXISTS_ACTION=REPLACE
) 不改系统字典:
dba_objects.owner
字段值由创建时决定,REMAP 不会 retroactively 更新旧对象 不处理依赖链:比如
scott.view_a
引用了
scott.table_b
,REMAP 后变成
hr.view_a
引用
hr.table_b
—— 但若
hr.table_b
不存在,视图编译失败,不会自动 fallback 到
scott.table_b
为什么导入后还是看到 scott.emp? 常见现象是:
impdp ... REMAP_SCHEMA=scott:hr
执行完,查
dba_objects
却发现仍有大量对象 owner 是
scott
。这不是 REMAP 失效,而是你导出时没限定范围,dump 文件里混进了其他 schema 的对象(比如 DBA 视图、SYS 对象),或者用了
CONTENT=ALL
导出了整个数据库级元数据。 检查导出命令是否带了
schemas=scott
:没加就默认导全库,REMAP 只对匹配的 schema 生效 确认 dump 文件是否干净:用
impdp ... SQLFILE=check.sql
把 DDL 导出为文本,搜
CREATE TABLE scott\.
看是否还有残留 注意
INCLUDE
参数干扰:例如
INCLUDE=PROCEDURE
会把所有 procedure 都拉进来,不管 owner 是谁 版本兼容问题:10g 导出的 dump 在 19c 导入时,某些系统对象可能被自动映射到
sys
,绕过 REMAP 真正转移所有权的可行路径 如果你的目标是让
hr
成为原
scott
下所有对象的法律 owner(即
dba_objects.owner = 'HR'
),只有两条路可走,且都绕不开人工干预: oracle知识库 oracle知识库下载 下载 先清空目标用户:
DROP USER hr CASCADE
,再用
REMAP_SCHEMA=scott:hr
导入——这是最干净的方式,所有对象 owner 自然就是
hr
不清空用户,但需手动修正:
ALTER TABLE scott.emp RENAME TO hr.emp
不合法;正确做法是
CREATE TABLE hr.emp AS SELECT * FROM scott.emp
+
DROP TABLE scott.emp
,再重建索引、约束、授权——适合少量关键表 权限不是自动跟着走的:
GRANT SELECT ON scott.emp TO app_user
不会因 REMAP 变成
GRANT SELECT ON hr.emp TO app_user
,必须额外导出并重放
GRANT
语句(加
CONTENT=ALL
或
INCLUDE=GRANT
) 同义词要单独处理:
CREATE SYNONYM app_emp FOR scott.emp
不会被 REMAP,得手动建新同义词或用
REMAP_SCHEMA
配合
INCLUDE=SYNONYM
最容易被忽略的权限静默失效点
REMAP_SCHEMA
导入成功 ≠ 权限生效。日志里出现
ORA-39112: Dependent object type GRANT:"HR" skipped
往往意味着目标对象还没建好,grant 就被跳过,而你根本看不到错误提示。 必须确保目标用户
hr
已存在且有足够配额:
ALTER USER hr QUOTA UNLIMITED ON users
如果源对象用了自定义类型(如
CREATE TYPE scott.t_list AS TABLE OF NUMBER
),REMAP 后类型名仍是
scott.t_list
,除非显式
REMAP_SCHEMA
两次(一次类型,一次表)或提前在
hr
下建好同名类型 物化视图日志(
MATERIALIZED VIEW LOG
)属于独立对象,owner 不随主表 REMAP,容易漏掉导致刷新失败 审计策略(
AUDIT POLICY
)、FGA 策略等安全对象不参与 REMAP,需单独导出配置

相关文章