数据库schema含义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库 sc hema含义
数据库Sche ma有两种含义,一种是概念上的Schem a,指的是一组DDL语句集,该语句集完整地描述了数据库的结构。
还有一种是物理上的 Sche ma,指的是数据库中的一个名字空间,它包含一组表、视图和存储过程等命名对象。
物理Schem a 可以通过标准SQL语句来创建、更新和修改。
例如以下SQL语句创建了两个物理Sc hema:
crea te sc hemaSCHEM A_A;
c reate tabl e SCH EMA_A.CUST OMERS(ID i nt no t nul l,……);
cre ate s chema SCHE MA_B;
creat e tab le SC HEMA_B.CUS TOMER S(IDint n ot nu ll,……);
简单的说:就是一个数据库用户所拥有的数据库的对象。
比如sco tt用户建立了表,索引,视图,存储过程等对象,那么这些对象就构成了sc hema sco tt
在一个数据库中可以有多个应用的数据表,这些不同应用的表可以放在不同
的s chema之中,同时,每一个s chema对应一个用户,不同的应用可以以不同的用户连接数据库,这样,一个大数据库就可以根据应用把其表分开来管理。
不同
的s chema之间它们没有直接的关系,不同的shcem a之间的表可以同名,也可以互相引用(但必须有权限),在没有操作别的sc hema的操作根权下,每个用户只能操作它自己的sc hema下的所有的表。
不同的s chema下的同名的表,可以存入不同的数据(即sc hema用户自己的数据).
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果我们想了解数据库中的User和Schem a到底什么关系,那么让我们首先来了解一下数据库中U ser和S chema到底是什么概念。
在SQL Serv er2000中,由于架构的原因,User和Sche ma总有一层隐含的关系,让我们很少意识到其实Use r和Sch ema是两种完全不同的概念,不过在SQL Serv er2005中这种架构被打破了,User和Sche ma也被分开了。
首先我来做一个比喻,什么是Datab ase,什么是Sch ema,什么是Tab le,什么是Colu mn,什么是Row,什么是Us er?我们可以把Da tabas e看作是一个大仓库,仓库分了很多很多的房间,Sch ema就是其中的房间,一个Sc hema代表一个房间,Tabl e可以看作是每个Sc hema中的床,Ta ble(床)就被放入每个房间中,不能放
置在房间之外,那岂不是晚上睡觉无家可归了J。
,然后床上可以放置很多物品,就好比Ta ble上可以放置很多列和行一样,数据库中存储数据的基本单元是
Table,现实中每个仓库放置物品的基本单位就是床, Use r就是每个Schem a的主人,【所以Sc hema包含的是Ob ject,而不是Us er】,其实User是对应于数据库的(即User是每个对应数据库的主人),既然有操作数据库(仓库)的权利,就肯
定有操作数据库中每个Schem a(房间)的权利,就是说每个数据库映射的User有每个Sch ema(房间)的钥匙,换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,当然也可以拆除一个房间(Re moveSchem a)。
呵呵,和现实也太相似了吧。
我(仓库的管理员)还可以给U ser分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Rea d-Onl y),还是可以像主人一样有所有的控制权(R/W),这个就要看这个Use r所对应的角色Rol e了,至于分配权限的问题,我留在以后单独的blog中详述。
比喻到这里,相信大家都清楚了吧。
OK,我们话题继续!
在SQL S erver2000中,假如我们在某一个数据库中创建了用户Bo sco,按么此时后台也为我们默认地创建了默认Sch ema 【Bosco】。
Sch ema的名字和Use r的名字相同,这也是我们分不清楚用户和S chema的原因。
在SQ L Ser ver2005中,为了向后兼容,当你用s p_add user存储过程创建一个用户的时候,S QL Se rver2005同时也创建了一个和用户名相同的Sc hema,然而这个存储过程是为了向后兼容才保留的,我们应该逐渐熟悉用新的DDL语言Crea te
Us er和Cr eateSchem a来操作数据库。
在S QL Se rver2005中,当我们用C reate User 创建数据库用户时,我们可以为该用户指定一个已经存在的Sche ma作为默认
Sche ma,如果我们不指定,则该用户所默认的S chema即为dbo Sche ma,db o 房间(Schem a)好比一个大的公共房间,在当前登录用户没有默认S chema的前提下,如果你在大仓库中进行一些操作,比如Cre ate T abe,如果没有指定特定的房间(Sche ma),那么你的物品就只好放进公共的db o房间(S chema)了。
但是如果当前登录用户有默认的Sch ema,那么所做的一切操作都是在默认Sc hema上进行(比如当前登录用户为log in1,该用户的默认Schem a为log in1,那么所做的所有操作都是在这个lo gin1默认Sche ma上进行的。
实验已经证明的确如此)。
估计此时你会有一点晕,为什么呢?我刚才说d bo是一个Schem a,但是你可以在数据库
中查看到,dbo同时也是一个user,晕了吧,呵呵。
在SQLServe r2005中创建一个数据库的时候,会有一些默认Sc hema被创建,被默认创建的S chema有:dbo,INFO RMATI ON_SC HEMA, gues t,sys等等(还有一些角色S chema,不提了,又晕了)。
我在上文中已经提到了,在SQL S erver2005中当用存储过程sp_a dduse r创建一个user时,同时SQ L Ser ver2005也为我们创建了一个默认的和用户名相同的
Sche ma,这个时候问题出来了,当我们crea te ta ble A时,如果没有特定的S chema 做前缀,这个A表创建在了哪个S chema上,即进入了哪个房间?答案是:
如果当前操作数据库的用户(可以用Sel ect c urren t_use r查出来)有默认的S chema (在创建用户的时候指定了),那么表A被创建在了默认的Sche ma上。
如果当前操作数据库的用户没有默认的Sc hema(即在创建U ser的时候默认为空),但是有一个和用户名同名的S chema,那么表A照样被创建在了dbo Sche ma 上,即使有一个和用户名同名的Sche ma存在,由于它不是该用户默认的
Sche ma,所以创建表的时候是不会考虑的,当作一般的Sc hema来处理,别看名字相同,可是没有任何关系哦。
如果在创建表A的时候指定了特定的Sch ema做前缀,则表A被创建在了指定
的S chema上(有权限吗?)
现在问题又出来了,在当前操作数据库的用户(用se lectcurre nt_us er可以查看到,再次强调)没有默认Sch ema的前提下,当我们用Cre ate t ableA语句时,A表会去寻找dboSchem a,并试图创建在db o Sch ema上,但是如果创建A表的用户只有对d bo Sc hema的只读权限,而没有写的权限呢?这个时候A表既不是建立不成功,这个就是我以后会提及到的Logi n,Use r, Ro le和Sc hema四者之间的关系。
在这里,为了避免混淆和提高操作数据库的速度(在少量数据范围内,对我们肉眼来说几乎看不到差异),我们最好每次在操作数据库对象的时候都显式地指定特定的Schem a最为前缀。
现在如果登录的用户为Sue,该用户有一个默认Sch ema也为Sue,那么如果现在有一条查询语句为Se lect* fro m myt able,那么搜寻每个房间(Schem a)的顺序是怎样的呢?顺序如下:
首先搜寻 sy s.myt able(Sy s Sch ema)
然后搜寻Sue.m ytabl e (Defau lt Sc hema)
最后搜寻 dbo.mytab le (D bo Sc hema)
执行的顺序大家既然清楚了,那么以后在查询数据库表中的数据时,最好指定特定的Schem a前缀,这样子,数据库就不用去扫描Sys Sche ma了,当然可以提高查询的速度了。
另外需要提示一下的是,每个数据库在创建后,有4个Schem a是必须的(删都删不掉),这4个Sche ma为:d bo,gu est,s ys和IN FORMA TION_SCHEM A,其余的Schem a都可以删除。
。