楼主: dba_mx

[笔记] 尝试修改Oracle中的用户名所引发的……

[复制链接]
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
11#
 楼主| 发表于 2006-2-18 19:50 | 只看该作者
呵呵,我也正是想用 SQL trace  来观察Oracle在 Create user 的时候都操作了哪些表。
一会儿把试验结果贴上来

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
12#
 楼主| 发表于 2006-2-18 21:55 | 只看该作者
利用SQLTrace查看Oracle在 Create User 时究竟写了几个表:

[PHP]


SQL> ALTER SESSION SET SQL_TRACE=TRUE;

会话已更改。

SQL> CREATE USER TEST IDENTIFIED BY TEST;

用户已创建

SQL> ALTER SESSION SET SQL_TRACE=FALSE;

会话已更改。


分析trace文件可以看出:
Oracle先依次检查 obj$ tab$ seg$ cdef$ ...user$...procedure$... 等一堆表,查看是否有这个用户的对象等等,
最后用一个 insert into 将新用户的信息写入 user$ 表,没有对其它表进行写操作。

此处有个疑问:为何不第一步就直接检查 user$ ,从而判定该用户能否创建成功呢?

[/PHP]

ora9_ora_688.rar

11.24 KB, 下载次数: 34

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
13#
 楼主| 发表于 2006-2-18 22:00 | 只看该作者

准备测试数据:

[PHP]
--记录用户的密码

SQL> CREATE USER TT IDENTIFIED BY TT;

用户已创建

SQL> SELECT PASSWORD FROM USER$ WHERE NAME='TT';

PASSWORD
------------------------------
294CE6E7131DD890

SQL> DROP USER TT CASCADE;

用户已丢弃

--创建准备换名的用户 TEST
SQL> CREATE USER "TEST" IDENTIFIED BY "TEST" DEFAULT TABLESPACE "DATA";

用户已创建

SQL> ALTER USER TEST QUOTA 1024K ON "DATA";

用户已更改。

SQL> GRANT CONNECT TO TEST;

授权成功。


--创建 TEST1 用户对 TEST 用户进行对象授权 [测试换名后 对象授权是否受到影响]
SQL> CREATE USER "TEST1" IDENTIFIED BY "TEST1" DEFAULT TABLESPACE "DATA";

用户已创建

SQL> ALTER USER TEST1 QUOTA 1024K ON "DATA";

用户已更改。

SQL> GRANT CONNECT TO TEST1;

授权成功。

--对 TEST 进行对象授权
SQL> CONN TEST1/TEST1
已连接。
SQL> CREATE TABLE TEST1_TT ( A VARCHAR2(1));

表已创建。

SQL> INSERT INTO TEST1_TT VALUES('A');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> GRANT SELECT ON TEST1_TT TO TEST;

授权成功。

--测试用户 TEST 的系统权限 CREATE TABLE
SQL> CONN TEST/TEST
已连接。

SQL> SELECT * FROM TEST1.TEST1_TT;

A
-
A

SQL> CREATE TABLE TEST_TT AS SELECT * FROM TEST1.TEST1_TT;

表已创建。

SQL> SELECT * FROM TEST_TT;

A
-
A

SQL> EXIT

...
[/PHP]

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
14#
 楼主| 发表于 2006-2-18 22:06 | 只看该作者

值得期待的时刻:

[PHP]
SQL>SHOW USER
USER 为"SYS"

SQL> SELECT USER#,NAME,PASSWORD FROM USER$ WHERE NAME='TEST';

     USER# NAME                           PASSWORD
---------- ------------------------------ -------------------
        91 TEST                           7A0F2B316C212D67

--直接修改底层表 USER$ 更换用户名
SQL> UPDATE USER$ SET NAME='TT' WHERE USER#=91;

已更新 1 行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM CHECKPOINT;

系统已更改。

SQL> ALTER USER TT IDENTIFIED BY VALUES '294CE6E7131DD890';
ALTER USER TT IDENTIFIED BY VALUES '294CE6E7131DD890'
           *
ERROR 位于第 1 行:
ORA-01918: 用户'TT'不存在

--强制 Oracle 读取实际数据,而不是读取缓存
SQL> ALTER SYSTEM FLUSH SHARED_POOL;

系统已更改。

SQL> ALTER USER TT IDENTIFIED BY VALUES '294CE6E7131DD890';

用户已更改。

--测试连接

SQL> CONN TT/TT
已连接。

SQL> SELECT * FROM TAB;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
TEST_TT                        TABLE

SQL> CONN / AS SYSDBA
已连接。
SQL> SHOW USER
USER 为"SYS"

SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP
ORACLE 例程已经启动。
......
数据库装载完毕。
数据库已经打开。

--可以看出没有再恢复为TEST
SQL> SELECT USER#,NAME,PASSWORD FROM USER$ WHERE USER#=91;

     USER# NAME                           PASSWORD
---------- ------------------------------ ----------------
        91 TT                             294CE6E7131DD890

SQL> CONN TT/TT
已连接。

--查看数据对象
SQL> SELECT * FROM TAB;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
TEST_TT                        TABLE

SQL> SELECT * FROM TEST_TT;

A
-
A

--对象权限依然有效
SQL> SELECT * FROM TEST1.TEST1_TT;

A
-
A
--系统权限依然有效
SQL> CREATE TABLE KK AS SELECT * FROM TEST1.TEST1_TT;

表已创建。

SQL> SELECT * FROM TAB;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
KK                             TABLE
TEST_TT                        TABLE

SQL> CONN / AS SYSDBA
已连接。
SQL> SHOW USER
USER 为"SYS"

--DROP USER 也没有问题
SQL> DROP USER TT CASCADE;

用户已丢弃

SQL> DROP USER TEST1 CASCADE;

用户已丢弃
...
[/PHP]

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
15#
 楼主| 发表于 2006-2-18 22:24 | 只看该作者
[PHP]

测试表明:
1、初步来看,采用直接 UPDATE SYS.USER$ 这种方式给用户换名是可以成功的!!!
2、更改用户名之后,系统权限、对象权限依然有效。这是因为Oracle在内部存储权限等信息时
使用的用户的内部ID,而不是用户名。
3、最初试验失败的原因在于没有执行以下语句:
ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM FLUSH SHARED_POOL;

Oracle在shutdown的时候,发现 SYS.USER$ 的内容与缓存中的不一致,因此用缓存中的修复了这个表,
从而重启之后,用户名又恢复原状。

在此,非常感谢 "carny" 的提醒!!!
...
[/PHP]

使用道具 举报

回复
论坛徽章:
10
数据库板块每日发贴之星
日期:2006-02-12 01:02:47授权会员
日期:2006-04-14 13:04:46数据库板块每日发贴之星
日期:2006-03-29 01:01:20数据库板块每日发贴之星
日期:2006-02-26 01:01:35数据库板块每日发贴之星
日期:2006-02-21 01:02:31数据库板块每日发贴之星
日期:2006-02-20 01:02:36数据库板块每日发贴之星
日期:2006-02-17 01:02:30数据库板块每日发贴之星
日期:2006-02-15 01:02:28数据库板块每日发贴之星
日期:2006-02-14 01:02:26会员2006贡献徽章
日期:2006-04-17 13:46:34
16#
发表于 2006-2-18 22:37 | 只看该作者
不管怎么样,这种测试你是不敢用于生产库!强烈建议不要对数据库底层数据表进行修改!否则.呵呵 .

j建议LZ再执行一下
catproc.sql
catalog.sql

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
17#
 楼主| 发表于 2006-2-19 09:18 | 只看该作者
嘿嘿嘿,探讨一下而已,哪里会用在生产库上。

使用道具 举报

回复
论坛徽章:
9
授权会员
日期:2006-02-10 14:50:312008新春纪念徽章
日期:2008-02-13 12:43:032009日食纪念
日期:2009-07-22 09:30:002010新春纪念徽章
日期:2010-03-01 11:08:24ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:332014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11秀才
日期:2017-02-22 15:18:00
18#
发表于 2006-2-20 19:43 | 只看该作者
提倡探索精神!

使用道具 举报

回复
论坛徽章:
112
2008新春纪念徽章
日期:2008-02-13 12:43:03马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-11-03 12:40:39沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31慢羊羊
日期:2015-03-09 16:15:39
19#
发表于 2006-2-21 21:47 | 只看该作者
最初由 dba_mx 发布
[B][PHP]

测试表明:
1、初步来看,采用直接 UPDATE SYS.USER$ 这种方式给用户换名是可以成功的!!!
2、更改用户名之后,系统权限、对象权限依然有效。这是因为Oracle在内部存储权限等信息时
使用的用户的内部ID,而不是用户名。
3、最初试验失败的原因在于没有执行以下语句:
ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM FLUSH SHARED_POOL;

Oracle在shutdown的时候,发现 SYS.USER$ 的内容与缓存中的不一致,因此用缓存中的修复了这个表,
从而重启之后,用户名又恢复原状。

在此,非常感谢 "carny" 的提醒!!!
...
[/PHP] [/B]


首先需要确认的是,修改用户以后,如果不做
ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM FLUSH SHARED_POOL;


如果你做alter user username identified by password; 系统也会提示成功,但你用该用户和新的密码登录的时候,就回报你说的那个错误。

而此时你用其他用户登陆,就会发现,原来的name已经被改回去了,而不是在重启的时候改回去的,

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
20#
 楼主| 发表于 2006-2-22 13:01 | 只看该作者
最初由 Toms_zhang 发布
[B]

首先需要确认的是,修改用户以后,如果不做
ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM FLUSH SHARED_POOL;


如果你做alter user username identified by password; 系统也会提示成功,但你用该用户和新的密码登录的时候,就回报你说的那个错误。

而此时你用其他用户登陆,就会发现,原来的name已经被改回去了,而不是在重启的时候改回去的, [/B]


非常感谢您的提醒!!!
我被胜利冲昏了头脑,没有仔细查看究竟什么时候被改回去的。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表