`
edison87915
  • 浏览: 196277 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

(转)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都可以删除。
分享到:
评论

相关推荐

    数据库中的Schema和Database的区别

    在mysql中创建一个Schema和创建一个...  在sqlserver2000中,由于架构的原因,user和schema总有一层隐含的关系,让我们很少意识到其实user和schema是两种完全不同的概念,不过在sqlserver2005中这种架构被打破了,use

    SQL电商网站数据库设计案例database-schema.sql

    根据这些需求,可以抽象出以下实体和关系: 用户(User):包含用户ID、用户名、密码、邮箱、手机号等属性。 商品(Product):包含商品ID、商品名称、商品描述、价格、库存等属性。 订单(Order):包含订单ID、用户ID、...

    sql表关系.txt

    mysql学习总结, 表与表的关系 表:具有固定列数和任意行数。 数据库:一些关联表的集合。 主键:一个数据表只能包含一个主键,使用主键来查询数据。 外键:用来关联两张表。 索引:快速访问数据库表的特定信息...

    mongoose-friends:用于Mongoose ODM的2向友谊关系插件

    猫鼬朋友 用于Mongoose ODM的2向友谊关系插件 安装 npm install mongoose-friends 说明和用法 通过一个简单的插件即可轻松地向您的Mongoose用户模型添加“友谊”...var User = mongoose.model("User", schema); 通过re

    react-use-database:React挂钩可在客户端上轻松进行关系数据管理

    React使用数据库关系数据最简单 :warning: :warning: :warning: 该库不再维护,请考虑使用和作为更可靠的解决方案 :warning: :warning: :warning: react-use-database为您提供了一个自以为是的界面,有效的数据流和...

    Mongoose索引、内置方法、静态方法与实例方法

    1. Mongoose 索引 索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快,...var UserSchema=mongoose.Schema({ name:{ type:String, // 普通索引 index:true }, sn:{ type:Str

    存储:类似于猫鼬的架构验证,浏览器上的集合和文档(客户端)

    var userSchema = new Schema ( 'User' , { name : { type : String , required : true } } ) ; // or var blogSchema = new Schema ( 'Blog' , { title : String , author : String , body : String , ...

    jschema:JSON模式实施

    特征严格按照规范实施JSON Schema草案4 小型,高效且线程安全没有依赖关系干净且可扩展的代码经过Rubinius,MRI和JRuby的测试安装将jschema添加到您的Gemfile并执行bundle install 。基本用法示例require 'jschema'#...

    one_plus_n_detector:Elixir库可帮助您使用Ecto检测应用程序中的1 + n个查询

    当您具有诸如has_many , has_one或belongs_to has_many的父子关系时,您可以通过一个查询加载父记录,然后为每条记录触发另一个SQL语句以加载相关的孩子。 假设您有以下Ecto模式 defmodule User do use Ecto . ...

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

    权限设置为:user属性有group_id,group_id下挂privilege_id,privilege_id下挂各page (增加了一个group的父子关系表,各位看官自己决定如何使用吧) 详情查看table_schema.xlsx 4.友情提示:管理员帐号 hilltop/123;新建...

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

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

    客户关系管理系统框架搭建(二)

    CREATE TABLE `sys_user_group` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT, #编号 `remark` TEXT, #备注 `name` VARCHAR(100) DEFAULT NULL, #部门名称 `principal` VARCHAR(50) DEFAULT ...

    深入探讨:oracle中方案的概念以及方案与数据库的关系

    先来看一下他们的定义: 代码如下:A schema is a collection of database objects (used by a user.). Schema objects are the logical structures that directly refer to the database’s data. A user is a name ...

    mongoke:MongoDb的即时Graphql(活动分支为golang,正在重写)

    弹性幂等配置:一个YAML配置是一个文件中真实,关系,授权和类型的唯一来源 快速开始: 使用Docker compose 尝试Mongoke的最快方法是通过docker-compose。 1.编写配置以描述数据库架构和关系 默认情况下已经定义了...

    spring考试通过必备材料.docx

    applicationContext.xml 中Setter方法属性注入 User配置 8 applicationContext.xml构造器方法属性注入 9 applicationContext.xml中setter方法(UserDAO注入到UserServiceImpl中) 12 3、引入实体类及配置文件book....

    MySQL 5.1中文手冊

    添加和删除InnoDB数据和日志文件 15.2.8. InnoDB数据库的备份和恢复 15.2.9. 将InnoDB数据库移到另一台机器上 15.2.10. InnoDB事务模型和锁定 15.2.11. InnoDB性能调节提示 15.2.12. 多版本的实施 15.2.13. 表和...

    Hadoop权威指南(中文版)2015上传.rar

    1.8 用户定义函数(User-Defined Functions) 1.8.1 编写UDF 1.8.2 编写UDAF 第13章 HBase 2.1 HBasics 2.1.1 背景 2.2 概念 2.2.1 数据模型的"旋风之旅" 2.2.2 实现 2.3 安装 2.3.1 测试驱动 2.4 客户机 2.4.1 Java...

    MySQL5.1参考手册官方简体中文版

    2.1.4. 通过MD5校验和或GnuPG验证软件包的完整性 2.1.5. 安装布局 2.2. 使用二进制分发版的标准MySQL安装 2.3. 在Windows上安装MySQL 2.3.1. Windows系统要求 2.3.2. 选择安装软件包 2.3.3. 用自动安装器安装MySQL ...

    最全的oracle常用命令大全.txt

    一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle&gt;svrmgrl SVRMGR&gt;connect internal SVRMGR&gt;startup SVRMGR&gt;quit b、关闭...

Global site tag (gtag.js) - Google Analytics