`

A good specification about Schema and User

    博客分类:
  • SQL
阅读更多

Source: http://edu.qudong.com/program/Oracle/jishujinghua/20080408/6296.html

 

假如我们想了解数据库中的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都可以删除。  

0
0
分享到:
评论

相关推荐

    The.Little.Mongo.DB.Schema.Design.Book151739402

    I wrote this book to be a helpful and concise guide to MongoDB Schema design, as well as a repository to look up specific MongoDB Schema patterns. This book came around, due to my experiences teaching...

    DB2 Schema操作总结

    db2=>create schema db2user12; ``` 执行成功后,可以通过查询`syscat.schemata`表来验证新创建的Schema及其所有者: ```sql db2=>select SCHEMA_NAME, OWNER from syscat.schemata where schemaname='DB2USER12';...

    Java bean转换为Json Schema

    Java Bean转换为Json Schema是一种常见的数据转换操作,特别是在开发基于RESTful API的Web服务时,因为JSON Schema提供了数据验证和文档化的功能。Java Bean是Java编程中的一个概念,它是一类具有特定规则的POJO...

    JSON-Schema定义规范

    ### JSON-Schema定义规范 #### 前言 在现代软件开发中,数据交换与处理是必不可少的一部分。随着Web服务的普及以及API的发展,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简单易读且...

    oracle数据库体系结构之一【user和schema】

    Oracle数据库中,用户(User)和模式(Schema)是两个紧密相关却又鲜明不同的概念。用户是指拥有数据库权限和资源的实体,而模式则是指一组数据库对象的集合,包括表、视图、索引、同义词等等。 首先,从官方文档中...

    persistence-2_0-final-jar_and_schema.zip

    《深入理解JPA:基于persistence-2_0-final-jar_and_schema.zip的解析》 在Java开发领域,Java Persistence API(JPA)是用于管理关系数据库中的对象持久化的一个重要标准。它为开发者提供了一种简洁、面向对象的...

    CoreIntegrity_Schema_Specification_v2.0.r5.pdf

    CoreIntegrity_Schema_Specification_v2.0.r5.pdf 这份文件是 Trusted Computing Group(TCG)发布的《Core Integrity Schema Specification》(核心完整性模式规范)第二版修订五版,发布于2011年8月24日。该规范...

    oracle中schema指的是什么意思

    因此,Schema的数目与User的数目相同,每个Schema都有一个与之对应且同名的User。 当我们访问数据库对象时,如果没有明确指出对象所属的Schema,系统会自动使用当前用户的默认Schema作为前缀。例如,当我们执行`...

    schema相关知识压缩包

    **Schema相关知识** Schema在信息技术领域中扮演着至关重要的角色,尤其在数据库设计、Web语义化和数据标准制定等方面。Schema是对数据结构的一种规范定义,它规定了数据的格式、类型以及各元素之间的关系,使得...

    MySQL中information_schema是什么

    SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = 'your_database' AND table_name = 'your_table'; ``` 4. **获取某张表的所有索引信息**: ```sql SELECT ...

    JSON Schema 规范(中文版).pdf

    JSON Schema 规范(中文版) JSON Schema 是一种强大的工具,用于验证 JSON 数据结构。Schema 可以理解为模式或者规则。在学习 JSON Schema 时,需要理解什么是模式, JSON Schema 的基本类型,如何使用 JSON ...

    json转换jsonschema

    而JSON Schema则是一个JSON格式的规范,用于定义JSON数据的结构和限制,类似于XML Schema,它为JSON数据提供了验证规则,确保数据的准确性和一致性。 在JavaScript开发中,有时我们需要将JSON对象转换为JSON Schema...

    JSON Schema 校验库——json-schema-validator(java版本).rar

    JSON Schema 是一个JSON格式的规范,用于定义JSON数据的结构和限制,类似于XML Schema和DTD(文档类型定义)。它提供了一种验证JSON数据是否符合预定义规则的方法,这对于API开发、数据交换和JSON数据存储非常有用。...

    JSON Schema 生成库——json-schema-inferrer(java版).rar

    JSON Schema 是一种JSON格式的规范,用于定义JSON数据的结构和限制,类似于XML Schema和DTD(文档类型定义)。它在API开发、数据验证、数据交换等场景中扮演着重要角色,确保了数据的一致性和准确性。`json-schema-...

    理解XML Schema XML Schema进阶

    XML Schema是目前国际标准的XML建模工具,本文将对XML Schema进行详细的介绍,帮助读者初步掌握XML Schema的使用方法和XML Schema文档实例的具体语义。 1. 命名空间的使用 XML Schema中命名空间的使用是非常重要的...

    XML Schema教程

    ### XML Schema 教程知识点详解 #### 一、XML Schema 概述 - **XML Schema 定义**:XML Schema 是一种基于 XML 的语言,用于描述 XML 文档的结构。它定义了 XML 文档中可以出现的元素、属性及其结构,并且指定了...

    Learning.GraphQL.and.Relay.1786465752

    Samer has authored a few books and online courses about React and GraphQL. You can follow him on Twitter at @samerbuna, and you can read more of what he writes at https://edgecoders.com/. Table of ...

    根据xml schema生成xml

    XML Schema(通常缩写为XSD)则是为XML文档定义结构和数据类型的规范,它允许我们对XML文档进行更严格的约束,确保数据的一致性和准确性。这篇博客文章“根据XML Schema生成XML”探讨了如何使用XML Schema来创建符合...

    (网页)Schema 教程

    Schema.org 是一个结构化数据的标准,它为网页内容提供了一种通用的语言,使得搜索引擎、浏览器和其他解析工具能更好地理解和解析网页上的信息。本教程将深入介绍Schema.org的概念、使用方法以及如何在HTML中应用。 ...

    Schema_Workbench

    **Schema_Workbench:Pentaho的数据仓库建模利器** Schema_Workbench是Pentaho Business Analytics Suite中的一个重要组件,专门用于数据仓库的设计和建模。它为用户提供了在关系型数据库上构建维度(Dimension)和...

Global site tag (gtag.js) - Google Analytics