网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  深入讲解数据库中user和schema的关系     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:70次  录入:管理员--2008-04-08  
 

【赛迪网:技术社区整理】假如我们想了解数据库中的user和schema究竟是什么关系,首先必须了解一下数据库中user和schema到底是什么概念。

在sql server2000中,由于架构的原因,user和schema总有一层隐含的关系,让我们很少意识到其实user和schema是两种完全不同的概念,不过在sql server2005中这种架构被打破了,user和schema也被分开了。

首先我来做一个比喻,什么是database,什么是schema,什么是table,什么是列,什么是行,什么是user?我们可以可以把database看作是一个大仓库,仓库分了很多很多的房间,schema就是其中的房间,一个schema代表一个房间,table可以看作是每个schema中的床,table(床)就被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了j。,然后床上可以放置很多物品,就好比table上可以放置很多列和行一样,数据库中存储数据的基本单元是table,现实中每个仓库放置物品的基本单位就是床, user就是每个schema的主人,(所以schema包含的是object,而不是user),其实user是对应与数据库的(即user是每个对应数据库的主人),既然有操作数据库(仓库)的权利,就肯定有操作数据库中每个schema(房间)的权利,就是说每个数据库映射的user有每个schema(房间)的钥匙,换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,呵呵,和现实也太相似了吧。我还可以给user分配具体的权限,也就是他到某一个房间能做些什么,是只能看(read-only),还是可以像主人一样有所有的控制权(r/w),这个就要看这个user所对应的角色role了,至于分配权限的问题,我留在以后单独的blog中详述。比喻到这里,相信大家都清楚了吧。

在sql server2000中,假如我们在某一个数据库中创建了用户bosco,按么此时后台也为我们默认地创建了默认schema 【bosco】。schema的名字和user的名字相同,这也是我们分不清楚用户和schema的原因。

在sql server2005中,为了向后兼容,当你用sp_adduser 存储过程创建一个用户的时候,sql server2005同时也创建了一个和用户名相同的schema,然而这个存储过程是为了向后兼容才保留的,我们应该逐渐熟悉用新的ddl语言create user和create schema来操作数据库。在sql server2005中,当我们用create user创建数据库用户时,我们可以为该用户指定一个已经存在的schema作为默认schema,如果我们不指定,则该用户所默认的schema即为dbo schema,dbo 房间(schema)好比一个大的公共房间,在当前登录用户没有默认schema的前提下,如果你在大仓库中进行一些操作,比如create tabe,如果没有指定特定的房间(schema),那么你的物品就只好放进公共的dbo房间(schema)了。但是如果当前登录用户有默认的schema,那么所做的一切操作都是在默认schema上进行(比如当前登录用户为login1,该用户的默认schema为login1,那么所做的所有操作都是在这个login1默认schema上进行的。实验已经证明的确如此)。估计此时你会有一点晕,为什么呢?我刚才说dbo是一个schema,但是你可以在数据库中查看到,dbo同时也是一个user,晕了吧,呵呵。

在sql server2005中创建一个数据库的时候,会有一些schema包括进去,被包括进去的schema有:dbo,information_schema, guest,sys等等(还有一些角色schema,不提了,有晕了)。

我在上文中已经提到了,在sql server2005中当用存储过程sp_adduser创建一个user时,同时sql server2005也为我们创建了一个默认的和用户名相同的schema,这个时候问题出来了,当我们create table a时,如果没有特定的schema做前缀,这个a表创建在了哪个schema上,即进入了哪个房间?答案是:

1.如果当前操作数据库的用户(可以用select current_user查出来)有默认的schema(在创建用户的时候指定了),那么表a被创建在了默认的schema上。

2.如果当前操作数据库的用户没有默认的schema(即在创建user的时候默认为空),但是有一个和用户名同名的schema,那么表a照样被创建在了dbo schema上,即使有一个和用户名同名的schema存在,由于它不是该用户默认的schema,所以创建表的时候是不会考虑的,当作一般的schema来处理,别看名字相同,可是没有任何关系哦。

3.如果在创建表a的时候指定了特定的schema做前缀,则表a被创建在了指定的 schema上(有权限吗?)

现在问题又出来了,在当前操作数据库的用户(用select current_user可以查看到,再次强调)没有默认schema的前提下,当我们用create table a语句时,a表会去寻找dbo schema,并试图创建在dbo schema上,但是如果创建a表的用户只有对dbo schema的只读权限,而没有写的权限呢?这个时候a表既不是建立不成功,这个就是我以后会提及到的login,user, role和schema四者之间的关系。在这里,为了避免混淆和提高操作数据库的速度(在少量数据范围内,对我们肉眼来说几乎看不到差异),我们最好每次在操作数据库对象的时候都显式地指定特定的schema最为前缀。

现在如果登录的用户为sue,该用户有一个默认schema也为sue,那么如果现在有一条查询语句为select * from mytable, 那么搜寻每个房间(schema)的顺序是怎样的呢?顺序如下:

1. 首先搜寻sys.mytable (sys schema)

2. 然后搜寻sue.mytable (default schema)

3. 最后搜寻 dbo.mytable (dbo schema)

执行的顺序大家既然清楚了,那么以后在查询数据库表中的数据时,最好指定特定的schema前缀,这样子,数据库就不用去扫描sys schema了,当然可以提高查询的速度了。

另外需要提示一下的是,每个数据库在创建后,有4个schema是必须的(删都删不掉),这4个schema为:dbo,guest,sys和information_schema,其余的schema都可以删除。

 
 
上一篇: 怎样才能dump oracle数据库的内部结构    下一篇: 讲解数据库中行级转换成列级的应用案例
  相关文档
用一个实例讲解如何正确使用数据库游标 04-09
详细讲解oracle数据库10g rman的备份过程 05-07
如何使用sql server数据库嵌套子查询 05-15
使用专用服务进程的Oracle的运行 09-29
三种Windows版本下教你如何卸载Oracle 05-27
oracle数据库9i dataguard的安装与维护 06-10
视图上含有row_number分析函数没法走索引 03-10
快速掌握ora-00600 4194错误的解决方法 11-15
解析:MIS系统实例中Oracle的安全策略 09-01
实例讲解更改oracle数据库中的sys口令 07-30
数据库Oracle 11g Alert Log 的新变化 09-01
解读oracle数据库的统一命名与编码规范 (1) 10-16
详细讲解oracle物理结构故障的处理方法 (1) 05-15
深入了解缓冲日志文件i/o重要性能问题 04-16
轻松掌握什么是数据的物理(存储)结构 09-29
详细介绍Oracle 8i中怎样实现实时通信 04-12
Oracle 8 资料库函式库 01-15
临时表在特定的条件下同样可以灵活易用 05-16
如何使用ruby脚本调用oracle存储过程 03-11
杜绝安全隐患被忽视的Oracle安全问题 04-23
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息