`

深入讲解数据库中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(床)就被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了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都可以删除。
分享到:
评论

相关推荐

    网上购物数据库代码文档

    1. 数据库模式(Schema):详细列出每个表的字段、数据类型和约束,如用户表(User)、商品表(Product)、订单表(Order)等。 2. SQL语句:用于插入、更新、删除和查询数据的示例,如添加新用户、获取商品详情、...

    数据库原理与SQL Server教程

    本教程旨在深入讲解数据库的基本理论以及SQL Server的实用技能。 1. **数据库基本概念** - 数据库(Database):存储数据的系统,负责数据的安全性、完整性和一致性。 - 关系型数据库(Relational Database):...

    oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文

    以下将详细讲解标题和描述中涉及的各个知识点: 1. **创建表**:在Oracle中,使用`CREATE TABLE`语句来定义新的表格结构。例如: ```sql CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName ...

    SpringBoot整合Oracle数据库使用双数据源

    本文将详细讲解如何利用SpringBoot整合Oracle数据库实现双数据源的配置和使用,帮助开发者构建可扩展、高可用的应用系统。 首先,我们需要理解"双数据源"的概念。双数据源意味着应用程序可以同时访问两个不同的...

    修改数据库表名的命令

    本文将详细讲解如何使用SQL命令来更改数据库中的表名,以及如何批量修改表名前缀,以适应不同的应用场景。 首先,我们需要理解数据库的基本概念。数据库是一个组织和存储数据的系统,它提供了一种方式来有序地管理...

    MYSQL操作手册,基础管理操作

    - **USER_PRIVILEGES、SCHEMA_PRIVILEGES、TABLE_PRIVILEGES、COLUMN_PRIVILEGES表**:分别提供全局、数据库、表和列级别的权限信息。 - **CHARACTER_SETS、COLLATIONS、COLLATION_CHARACTER_SET_APPLICABILITY表*...

    Hibernate ORM 5.3.7.Final User Guide

    10. 锁定(Locking):详细讲解了Hibernate中的锁定机制,包括乐观锁定和悲观锁定。 11. 数据抓取(Fetching):手册解释了在Hibernate中抓取数据的不同策略及其适用场景。 12. 批处理(Batching):这部分提供了在...

    db2用户权限操作1

    DB2是一个由IBM开发的关系型数据库管理系统,广泛用于存储和管理关键业务数据。本篇将详细讲解如何在DB2环境中进行用户权限操作,确保数据的安全性和合规性。 首先,创建用户是在操作系统层面进行的,例如在Linux或...

    使用nodejs的koa框架连接MongoDB数据库.zip

    本教程将详细讲解如何使用Koa框架来连接和操作MongoDB数据库。 ### 1. 安装必要的库 首先,我们需要安装`koa`和`mongoose`。`mongoose`是Node.js中用于操作MongoDB的库,它提供了一套强大的API,简化了数据库操作...

    PyPI 官网下载 | schema_config-0.1.0.tar.gz

    本文将详细讲解如何下载并使用PyPI上的"schema_config-0.1.0.tar.gz"资源,以及这个Python库的基本功能和应用场景。 "schema_config-0.1.0.tar.gz"是一个通过PyPI发布的压缩包文件,它是Python编程语言中的一个库,...

    数据库期末复习SQL专项

    在数据库管理中,**模式**(Schema)通常指的是对数据的一种逻辑分组,它可以用来组织表和其他数据库对象。通过创建模式,可以更好地管理和控制数据库中的权限以及数据访问。 ##### 1. 创建模式(Create Schema) - *...

    Beginning XML Databases_AppB_Oracle.zip

    通过schema.sql文件,我们可以推测作者可能讲解了如何在Oracle中定义和应用XML模式(XML Schema),这对于确保数据的一致性和完整性至关重要。 OracleInserts.sql文件可能包含一系列SQL插入语句,用于演示如何将XML...

    最完整的Toad For Oracle使用手册

    - **Quest Code Tester Integration**:讲解了如何将Quest Code Tester集成到Toad中以提高代码质量。 #### 五、Toad基础知识 - **Toad Basics**:覆盖了Toad的基础操作和设置。 - **Toad Tips**:提供了一些实用的...

    MyCat 第1天.zip

    在`schema.xml`中,`schema`配置详解主要介绍如何定义逻辑数据库,以及与物理数据库的映射关系。`dataNode`配置详解讲解了如何配置数据节点,包括数据源的选择和数据分片策略。`dataHost`配置详解涉及数据源的详细...

    Android程序设计-数据存储数据库存储.pptx

    本讲座主要讲解了如何在Android中使用SQLite数据库进行数据操作,包括手动建库和代码建库两种方式。 1. 手动建库: - 首先,需要在应用的内部存储目录`/data/data/<package_name>/databases`下创建一个名为`...

    CQ管理员手册

    在CQ环境中,首先需要创建数据库来存储Schema数据和用户数据。例如,可以创建名为B_MAS的数据库用于存储Schema,B_USER用于存储实际用户信息,而B_SAMPL则用于存储示例数据。这些数据库的创建是CQ系统的基础,便于...

    greendao相关资源及eclipse和android studio平台使用

    标题"greendao相关资源及eclipse和android studio平台使用"指出,这个主题将涉及一个名为greendao的数据库框架,并且会讲解如何在Eclipse和Android Studio这两个不同的集成开发环境中(IDEs)进行使用。Greendao是一...

    Mycat高可用以及mycat实现mysql高可用以及mycat的mysql主从配置,负载均衡,读写分离,以及验证查询sql具体执行在主库还是从库上

    读写分离是指将读操作和写操作分离到不同的数据库实例中,以提高数据库的性能和可用性。负载均衡是指将读写操作分布到多个数据库实例中,以提高数据库的性能和可用性。 五、验证查询SQL具体执行在主库还是从库上 ...

    如何搭建一套ClearQuest的测试环境

    在"database"选项中选择"new database",然后按照四个步骤设置:命名user库、提供数据库连接信息、设置连接超时(推荐设为0)以及选择之前创建的schema进行关联。 为了在不同机器间共享这个配置,你需要导出和导入...

Global site tag (gtag.js) - Google Analytics