如何更改ORACLE中schema或user的名字

本文介绍了一种在Oracle数据库中通过直接更新数据字典表user$来实现Schema名称更改的方法。此方法避免了对象迁移的繁琐步骤,但需谨慎使用以防潜在风险。

注:此文提供的方法非官方解决方法,正式环境下,保险起见,请不要滥用,以免引起不可逆的隐含问题。


前两天开发人员有个需求,要求把某个schema中所有对象移到另一个shema中,后来一想,不就是把schema的名字改了就可以了吗?这样就不用移来移去的,准备用DDL语句直接改的:

alter user scott rename to scott2;

发现根本没有这个语句,后来查了一下,才发现,oracle本身没有提供这个功能的语句,但有一个数据字典的表:user$,所有的用户都存在这张表中,可以直接update,就尝试着改了一下,发现还挺管用的,实现如下:

SQL> desc user$;   --查看表结构
 Name                                      Null?    Type
 ----------------------------------------- -------- --------------

 USER#                                     NOT NULL NUMBER
 NAME                                      NOT NULL VARCHAR2(30)
 TYPE#                                     NOT NULL NUMBER
 PASSWORD                                           VARCHAR2(30)
 DATATS#                                   NOT NULL NUMBER
 TEMPTS#                                   NOT NULL NUMBER
 CTIME                                     NOT NULL DATE
 PTIME                                              DATE
 EXPTIME                                            DATE
 LTIME                                              DATE
 RESOURCE$                                 NOT NULL NUMBER
 AUDIT$                                             VARCHAR2(38)
 DEFROLE                                   NOT NULL NUMBER
 DEFGRP#                                            NUMBER
 DEFGRP_SEQ#                                        NUMBER
 ASTATUS                                   NOT NULL NUMBER
 LCOUNT                                    NOT NULL NUMBER
 DEFSCHCLASS                                        VARCHAR2(30)
 EXT_USERNAME                                       VARCHAR2(4000)
 SPARE1                                             NUMBER
 SPARE2                                             NUMBER
 SPARE3                                             NUMBER
 SPARE4                                             VARCHAR2(1000)
 SPARE5                                             VARCHAR2(1000)
 SPARE6                                             DATE

SQL> select user#,name from user$ where name='SCOTT'; --找出需要更改的用户

     USER# NAME
---------- ------------------------------
        84 SCOTT

SQL> select count(*) from scott.emp; 

  COUNT(*)
----------
        14

SQL> update user$ set name='SCOTT2' where user#=84; --更改用户名

1 row updated.

SQL> commit;  --记得提交
Commit complete.


SQL> select count(*) from scott.emp;

  COUNT(*)
----------
        14


SQL> alter system flush shared_pool; --刷新shared_pool
System altered.

SQL> select count(*) from scott.emp;
select count(*) from scott.emp
                           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select count(*) from scott2.emp; --已经更改成功

  COUNT(*)
----------
        14


 

Oracle 数据库中,schema(模式)是数据库结构的重要组成部分,其主要功能和作用体现在以下几个方面: - **组织数据库对象** schema 是数据库对象的容器,包括表、视图、索引、序列、存储过程、触发器等。这些对象在逻辑上归属于某个特定的 schema,从而实现数据库对象的分类与组织。每个 schema 通常对应一个数据库用户,且其名称与用户名相同[^1]。 - **管理用户权限与访问控制** schema 提供了权限管理的基础。通过 schema,可以定义用户对数据库对象的访问权限,例如 SELECT、INSERT、UPDATE 和 DELETE 等操作权限。这种机制增强了数据库的安全性,确保只有授权用户才能访问特定的数据对象[^2]。 - **支持多用户环境下的隔离与共享** 在多用户环境中,每个用户拥有自己的 schema,并可以创建多个 schema 来满足不同的应用需求。虽然 schema 在逻辑上是隔离的,但通过权限设置,不同用户之间仍可以共享 schema 中的对象,实现灵活的数据访问控制[^2]。 - **提供命名空间管理** schema 为数据库对象提供了一个命名空间,避免了对象名称的冲突。例如,两个不同的 schema 可以包含同名的表,而不会导致命名冲突。这在大型数据库系统中尤为重要,有助于提高系统的可维护性和可扩展性。 - **支持数据抽象与逻辑独立性** schema 定义了数据库对象的结构和关系,为应用程序提供了逻辑视图。这种抽象机制使得应用程序可以独立于底层物理存储结构进行开发,提升了系统的灵活性和可移植性。 - **简化数据库管理和维护** 通过 schema,数据库管理员可以更方便地进行对象管理、备份恢复、权限分配等操作。schema 使得数据库结构更加清晰,有助于提高数据库维护的效率。 ### 示例代码:在 Oracle 中创建 schema 对象 Oracleschema 通常与用户关联,以下为创建用户并定义其 schema 中表的示例: ```sql -- 创建用户(同时自动创建同名的 schema) CREATE USER scott IDENTIFIED BY tiger; -- 授予权限 GRANT CONNECT, RESOURCE TO scott; -- 切换到用户 scott 并创建表 CONNECT scott/tiger; -- 在 schema 中创建表 CREATE TABLE employees ( employee_id NUMBER PRIMARY KEY, first_name VARCHAR2(50), last_name VARCHAR2(50), department_id NUMBER ); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值