`

数据库中User和Schema的关系-以SqlServer为例

 
阅读更多

参考:http://blog.csdn.net/yanjiangbo/article/details/1782576

 

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

和Schema到底是什么概念。
        在SQL Server2000中,由于架构的原因,User和Schema总有一层隐含的关系,让我们很少意识到其

实User和Schema是两种完全不同的概念,不过在SQL Server2005中这种架构被打破了,User和Schema

也被分开了。 

   
        首先我来做一个比喻,什么是Database,什么是Schema,什么是Table,什么是Column,什么是

Row,什么是User?我们可以把Database看作是一个大仓库 ,仓库分了很多很多的房间,Schema就是其

中的房间 ,一个Schema代表一个房间,Table可以看作是每个Schema中的 ,Table(床)就被放入每个

房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了。然后床上可以放置很多物品,就好比Table

上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位

就是床, User就是每个Schema的主人 ,【所以Schema包含的是Object,而不是User】,其实User是对

应于数据库的(即User是每个对应数据库的主人),既然有操作数据库(仓库)的权利,就肯定有操作数

据库中每个Schema(房间)的权利,就是说每个数据库映射的User有每个Schema(房间)的钥匙,换句

话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有

完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,当然也可以拆

除一个房间(Remove Schema)。呵呵,和现实也太相似了吧。我(仓库的管理员)还可以给User分配具

体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控

制权(R/W),这个就要看这个User所对应的角色Role了,至于分配权限的问题,我留在以后单独的blog中

详述。比喻到这里,相信大家都清楚了吧。


OK,我们话题继续!


       在SQL Server2000中,假如我们在某一个数据库中创建了用户Bosco,按么此时后台也为我们默认地创

建了默认Schema 【Bosco】。Schema的名字和User的名字相同,这也是我们分不清楚用户和Schema的原

因。
       在SQL Server2005中,为了向后兼容,当你用sp_adduser 存储过程创建一个用户的时候,SQL Server

2005同时也创建了一个和用户名相同的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都可以删除。

分享到:
评论

相关推荐

    SQLServer2005数据库学习笔记

    │ Sql Server 2005中的架构(Schema)用户(User)角色(Role)和登录(Login).pdf │ ├─14 数据库备份与恢复 │ Backup.sql │ └─15 其它应用 other.sql SQL Server将数据导出SQL脚本的方法_sql.sql SqlDB.bat ...

    数据库中的Schema和Database的区别

    在mysql中创建一个Schema和创建一个Database的效果好像是一样的,但是在sqlserver和orcal数据库中效果又是不同的,目前我只能理解为在mysql中schema<==>database;  数据库中的user和schema的关系:  假如...

    数据库操作语句大全(sql)

    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db ...

    sql表关系.txt

    sys:以视图形式将information_schema和performance_schema结合,查询出更容易理解数据。 用户数据库:  用户自己创建的数据库,一个项目一个数据库。 常用数据类型: double:浮点型(double(5,2)表示最多5位,...

    mysql示例数据库 employee

    You need a MySQL database server (5.0+) and run the commands below through a user that has the following privileges: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, REFERENCES, INDEX, ALTER, ...

    经典SQL语句大全

    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后...

    sql经典语句一部分

    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后...

    f3-schema-builder:用于PHP无脂肪框架SQL Schema Builder插件

    用于创建和更改SQL数据库表的扩展。 该插件为PHP Fat-Free Framework提供了一个SQL表模式构建器。 这对于安装脚本,动态应用程序或CMS环境可能很有用。 当前支持并完全测试了MySQL,SQLite,PostgreSQL和SQL ...

    Oraclet中的触发器

    REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN...

    SQLDBDiffFreeware.3.5.1数据库对比

    Ø Compare the structure of two SQL Server databases The following objects are supported : Tables and columns (with the possibility to respect or not columns order); Views (including their ...

    智能开发平台 DOROODO

    +++++++++++++++++++[doroodo_defult.properties]中几个需要改的部分+++++++++++++++++++ hibernate.default_schema=doroodo ---->mysql中指到数据库名,sqlserver中指到数据库所有者,如dbo jdbc.url=jdbc:mysql://...

    centos 7.5 安装zabbix4.0

    `mysql -uzabbix -p123456 zabbix < /root/zabbix-4.0.4/database/mysql/schema.sql` `mysql -uzabbix -p123456 zabbix < /root/zabbix-4.0.4/database/mysql/images.sql` `mysql -uzabbix -p123456 zabbix ...

    MS-sql 2005拒绝了对对象 'xxx' (数据库 'xxx',架构 'dbo')的 SELECT 权限的解决方法

    访问了提示“MS-sql 2005拒绝了对对象 'xxx' (数据库 'xxx',架构 'dbo')的 SELECT 权限”的错误

    mysql数据库my.cnf配置文件

    server-id = 1 #表示是本机的序号为1,一般来讲就是master的意思 skip-grant-tables skip-name-resolve # 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项...

    wabacus4.1开发的信息化系统<hilltop升级版>

    ====20130703==== ...1.说明: 这是一个用wabacus4.1开发的系统(此次升级支持sqlserver和oracle)(wabacus4.1+tomcat6+jdk1.6+...5.此次升级支持sqlserver2008和oracle,请根据数据库类型选择对应的脚本,并修改程序的数据源

    sqlmap (懂的入)

    以绕过注入检测和其他IDS设 备。 稍晚一下,我编译一个dos版本的给你们。 1、首先安装python2.5。 2、然后进入sqlmap的目录,执行sqlmap 详细用法 1、sqlmap -u 注入点 2、sqlmap -g "关键词“ //这是通过...

    wabacus4.1开发的信息化系统示例(hilltop升级wabacus4.1)

    ====20130703==== ... 1.说明: 这是一个用wabacus4.1开发的系统(hilltop项目升级wabacus4.1)(wabacus4.1+tomcat6+jdk1.6+sql...5.此次升级支持sqlserver2008和oracle,请根据数据库类型选择对应的脚本,并修改程序的数据源

    asp.net知识库

    在Framework1.0下同时连接SqlServer和Oracle的一些体会 XML XPath XPath最通俗的教程(ZZ) XPath中相对路径和绝对路径 XPath 简单语法 Asp.Net(C#)利用XPath解析XML文档示例 XSL .Net框架下的XSLT转换技术简介 一个...

    mysql数据库的基本操作语法

    MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息; 约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 常用五类约束: ...

Global site tag (gtag.js) - Google Analytics