在Oracle数据库中,用户名(用户账户)是不能直接修改的。Oracle没有提供类似"ALTER USER...RENAME"这样的命令。要修改用户名,需要通过以下步骤间接实现:
创建新用户:
CREATE USER new_username IDENTIFIED BY password
DEFAULT TABLESPACE tablespace_name
TEMPORARY TABLESPACE temp
QUOTA unlimited ON tablespace_name;
授予权限(从旧用户复制):
-- 获取旧用户的权限
SELECT 'GRANT '||privilege||' TO new_username'||
DECODE(admin_option,'YES',' WITH ADMIN OPTION;',';')
FROM dba_sys_privs WHERE grantee='OLD_USERNAME';
SELECT 'GRANT '||granted_role||' TO new_username'||
DECODE(admin_option,'YES',' WITH ADMIN OPTION;',';')
FROM dba_role_privs WHERE grantee='OLD_USERNAME';
-- 执行生成的授权语句
导出旧用户数据:
expdp system/password schemas=old_username directory=DATA_PUMP_DIR dumpfile=old_user.dmp logfile=exp_old_user.log
导入到新用户:
impdp system/password schemas=old_username remap_schema=old_username:new_username directory=DATA_PUMP_DIR dumpfile=old_user.dmp logfile=imp_new_user.log
验证数据完整性后删除旧用户:
DROP USER old_username CASCADE;
执行以下PL/SQL脚本:
DECLARE
v_old_user VARCHAR2(30) := 'OLD_USERNAME';
v_new_user VARCHAR2(30) := 'NEW_USERNAME';
BEGIN
-- 修改数据字典
UPDATE sys.user$ SET name = v_new_user WHERE name = v_old_user;
-- 修改相关对象的所有者
FOR r IN (SELECT object_name, object_type
FROM dba_objects
WHERE owner = v_old_user) LOOP
EXECUTE IMMEDIATE 'ALTER ' || r.object_type || ' "' || v_old_user ||
'"."' || r.object_name || '" RENAME TO "' ||
v_new_user || '"."' || r.object_name || '"';
END LOOP;
COMMIT;
END;
/
刷新共享池:
ALTER SYSTEM FLUSH SHARED_POOL;
对于生产环境,推荐使用方法一,虽然步骤较多,但更为安全可靠。