【数据库~】SQL Server中Schema(架构)概念理解

转载 2014年08月19日 22:36:15
前段时间,重新拿起数据库的教材(《数据库系统概论》王珊等著,高等教育出版社)温习,一年以前学的知识不用还真是忘了委屈

3.3.1讲到Schema的定义和删除,书里将Schema翻译为“模式”,博主觉得欠妥。因为在书本第2章提到了“模式”的概念,并且强调了一个数据库对应着一个模式,博主以为3.1.1中的“模式”就是第2章的模式,所以定义语句如CREATE SCHEMA "S-T" AUTHORIZATION WANG只能写一次。在网上查了好半天才发现两个地方的模式不是同一个东西。

先解释3.1.1中Schema的概念,如果将Schema翻译为“架构”就不会跟第2章的“模式”混淆了,在另一个博主的一片博文SQL SERVER 2005中的Schema(架构)概念详解里面有对Schema的详细解释,看这个就比较清楚啦~~

为了更形象地说明什么是Schema,贴上另一篇博文sqlserver中的User和Schema的关系,这里面用了一些比喻,帮助理解。

=============================================华丽丽的分割线=======================================


如果我们想了解数据库中的User和Schema到底什么关系,那么让我们首先来了解一下数据库中User和Schema到底是什么概念。

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

首先我来做一个比喻,什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User?我们可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)就被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了。床上可以放置很多物品,就好比Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人,所以Schema包含的是Object,而不是User

其实User是对应与数据库的(即User是每个对应数据库的主人),既然有操作数据库(仓库)的权利,就肯定有操作数据库中每个Schema(房间)的权利,就是说每个数据库映射的User有每个Schema(房间)的钥匙,换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,呵呵,和现实也太相似了吧。我还可以给User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了,至于分配权限的问题,我留在以后单独的blog中详述。比喻到这里,相信大家都清楚了吧。

OK,我们话题继续!

在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都可以删除。

SQL SERVER 中的Schema详解

以往 SQL Server 内的对象命名是“服务器.数据库.用户名.对象”,但新版的对象命名改为“服务器.数据库.Schema.对象”。这让你规划数据库对象命名时更有弹性。   架构是形成单个命名空间...

Sql Server 的Schema详解

SQL SERVER 中的Schema详解   以往 SQL Server 内的对象命名是“服务器.数据库.用户名.对象”,但新版的对象命名改为“服务器.数据库.Schema.对象”。这让你...

Sql Server 中的Login,Schema,User,Role之间的关系

相信很多人初次看到这几个对象都会晕,今天我就带领大家一起来把这几个概念捋一捋。 ·         Login       Login 是Server一级的概念,表示登录Server的...

理解SQL SERVER中所有者和架构的区别

理解SQL SERVER中所有者和架构的区别SQL SERVER2005介绍了架构,架构相对于以前版本中的对象所有者。本文将解释这两者的区别,并希望能解开你至今仍对架构一点困惑。对象所有者要理解所有者...

Sql Server需要架构(Schema)的真实原因

一直以来,不知道Sql Server为什么搞出一个架构(Schema)的概念。数据库本身不就是一个架构吗?为什么还要费神费力弄出一个架构(Schema)呢?前几天终于有点明白了。         设...
  • hejisan
  • hejisan
  • 2016年08月23日 17:31
  • 767

sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系

1.一个数据库用户可以对应多个架构(架构是表容器)。架构里面包含的是数据库表。 2.一个数据库角色有可能涉及多个架构。数据库角色对应的是权限。 3.一个用户对应一个数据库角色。 4.登录名与数据...

如何理解sql中的schema

我相信很多人接触这些概念的时候一头雾水。要把这些概念理清楚真不是件容易的事,哪像原始社会,只要能分清楚什么能吃什么不能吃就行了。    但是我始终坚信,每一个概念的产生必然是因为碰到了无法解决的问题...

MySQL运行原理与基础架构细说

1.MySQL基础              MySQL是一个开放源代码的关系数据库管理系统。原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视...

数据库Schema两种含义

数据库Schema两种含义 2010-09-01 17:07 数据库Schema有两种含义,一种是概念上的Schema,指的是一组DDL语句集,该语句集完整地描述了数据库的结构。还有一种是物理...
  • tuyf_hs
  • tuyf_hs
  • 2015年08月31日 11:37
  • 2936

数据库表的存储结构-SQL Server

SQL Server数据库中表的存储结构
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数据库~】SQL Server中Schema(架构)概念理解
举报原因:
原因补充:

(最多只允许输入30个字)