- 作者: 三十而立
- 时间:2009年11月15日 7:50:15
- 请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“inthirties(三十而立)”和出处”http://blog.csdn.net/inthirties/archive/2009/11/15/4812899.aspx”,深入讨论可以联系inthirties@gmail.com。
想到前几天一个网友朋友问过的schema的问题, schema和user的关系
v$session表里的username和schemaname都是一样的,有什么意义? 但是时间仓促,大致的解释了一下,今天看到那个帖子。
http://topic.csdn.net/u/20091113/10/cb29d8ee-1edb-4839-992b-db19264a4212.html ,感到自己还没有解释的清楚,今天特地总结了一下。以供网友参考
当我们用用户登录sqlplus或者其他客户端登录Oracle数据库的时候,都会建立连接session,默认情况下,当一个用户登录的时候,schema是这个用户的schmea
SQL>conn test1/test1;
Connected.
SQL> show user;
USER is "TEST1"
SQL>select sys_context('userenv', 'current_schema') from dual;
SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
--------------------------------------------------------------------------------
TEST1
可以看到这里的test1用户登录以后的schema是TEST1
我们查一查session,也可以看到test1这个用户的session里使用的schema
SQL> select username, schemaname from v$session where username='TEST1';
USERNAME SCHEMANAME
------------------------------ ------------------------------
TEST1 TEST1
现在我们通过alter session set current_context来修改这个schema
SQL> alter session set current_schema=system;
SQL> show user;
USER is "TEST1"
用户还是test1
SQL> select sys_context('userenv', 'current_schema') from dual;
SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
--------------------------------------------------------------------------------
SYSTEM
schema已经切换到了system的schema叻
在session里查查看
SQL> select username, schemaname from v$session where username='TEST1';
USERNAME SCHEMANAME
------------------------------ ------------------------------
TEST1 SYSTEM】
这里也显示为systenm叻
注意这里切换的是schema而已,也就是说你建表时是建立在哪个schema里而已,session中的用户并没有切换,也就是说all_tables, user_tables这些和session里的user有关的结果不会发生改变
比如
SQL> select table_name from user_tables;
TABLE_NAME
--------------------------------------------------------------------------------
T1_111
TABLE_1111
TEMP_TABLE2
TEMP_TABLE3
我们这里看到的还是当前用户test1里看到的建立的表而已,有兴趣可以 根据我的文章 数据字典-数据字典表 里介绍的内容 追溯一下这个all_tables视图的sql语句
当然现在如果你建表的时候 都是建立在当前的schema里的, 如果不指定表空间的话,还是用的当前用户的表空间。 如果没有在当前schema建表权限的会,会报ORA-01031: insufficient privileges
SQL> create table test_schema (id int);
create table test_schema (id int)
*
ERROR at line 1:
ORA-01031: insufficient privileges
- 如果没有那句“三十而立”,三十岁的男人正可以轻轻松松
- 专业论坛 http://www.inthirties.com
- 技术博客 http://blog.csdn.net/inthirties
- 个人站点 http://blog.inthirties.com
- Oracle Mysql技术论坛| 打造实用的Oracle Mysql技术交流园地