模式实际上是名称空间,因此在SQL Serve中调用数据库对象时,一定要设置对象引用的环境。每个用户都被赋予了一个默认模式,在用户登录SQL Server并凋用数据库对象时,这个默认模式就是对象引用方式的区别机制。

与许多其他数据库产品一样,SQL Server也使用模式来组织对象,所以理解如何正确地访问这些对象是很重要的。

其工作作原理如下:模式由数据库设计人员定义,实际上就是类别的名称,这些模式名可以有相关的所有权与权限。这和SQL Server早期版本提供的功能是一样的。

如果使用随SQL Scrver一起安装的AdventureWorks2008数据库,且所用的登录被赋予了DBQ默认模式,就必须使用如下语法杳询Product表:

SELECT * FROM Production.Product

在SQL Scrvcr的早期版本中,对象通常被DBO用户拥有。如果不使用用户名作为对象引用的前缀,系统就默认使用DB0用户名。SQL Server 2005和2008的模式也是这样,对象可以属于DBO模式,如果在对象引用中不使用模式名,只要DBO是默认模式,系统就使用DBO模式。然而,如果默认模式从DBO改为其他模式,DBO模式就不会被使用了。如果对象使用其他模式,就必须在表达式中指定模式名。以下这个例子说明了这个功能。用户Fred将名为Bedrock1的SpL Server实例连接到Adventure Works2008数据库上,Fred的默认模式没有明确指定,所以这个模式默认设置为DBO然后Fred执行了下列查询:

SELECT * FROM Product

查询处理器尝试将Product表名解析为Bedrock1.AdventureWorksZ008.dbo.Product ,但是这个杳询执行失败了。原因在于Product表存在与Production模式中,而不是在DBO模式中。现在将Fred的默认模式改成:

ALTER USER Fred WITH  DEFAULT_SCHEMA = Production

当Fred再次执行查询时,查询处理器将Product表名解析为 Bedrock1.AdventureWorks2008.Production.Product,查询执行成功。

现在看一个相反的例子。用户Barney是助理 DBA,他将数据库连接到和Fred一样的实例上,但要检索DBO模式中的DBAudit表的内容,Barney的默认模式也被设置为Production。Barney运行了下列查询:

SELECT * FROM DBAudit

查询处理器先尝试将DBAudit表解析为Barney的默认模式Bedrock1.AdventureWorks2008.Production.DBAudit,但解析失败了。不过,由于查询处理器是从非DBO模式开始的,于是它返回DBO模式,并尝试经DBAudit表解析为Bedrock1.AdventureWorks2008.dbo.DBAudit。 这个解析是成功的,它返回了表的内容。

这种返回解析方式能够处理两种情况:一种是对象不在用户的默认模式中,而在DBO模式中的情况;另一种是对象不在用户的默认模式中,而在SYS模式中的情况。SYS模式是为系统对象保留的。包含可以管理SQL Server数据库的系统视图。

最后,理解不同模式中的表可以重名是很重要的。因此在Sales模式、Production模式和HumanResources模式中都可以创建User表。但此时必须用表的两部分名字来引用表,才能确保返回正确的数据。为什么要创建3个重名的表昵?因为SQL Server模式不仅是名称空间,还是一个安个环境。DBA可以给销售经理授予在Sales.User表中添加和删除用户的权限,但拒绝他访问Productian.User表。这是管理安全性和应用程序访问的另一种方式。

SQL Server 模式和名称解析的更多相关文章

  1. SQL Server 连接问题案例解析(1)

    SQL Server 连接问题案例解析(1) 转载自:http://blogs.msdn.com/b/apgcdsd/archive/2015/04/27/sql.aspx?CommentPosted ...

  2. SQL SERVER 修改数据库名称(包括 db.mdf 名称的修改)

    刚开始学习SQL SERVER 2005,弄了一个上午修改数据库名,主要是需要修改db.mdf 和db_log.ldf的名字,总算解决了.在这里记下,以后再要修改了就别忘了. 假设原来数据库名为db, ...

  3. SQL Server并行死锁案例解析

    并行执行作为提升查询响应时间,提高用户体验的一种有效手段被大家所熟知,感兴趣的朋友可以看我以前的博客SQL Server优化技巧之SQL Server中的"MapReduce", ...

  4. SQL Server的实例恢复解析

    同Oracle一样,SQL Server在非一致性关闭的时候也会进行实例恢复(Instance Recovery),本文根据stack overflow的文章介绍一些SQL Server实例恢复的知识 ...

  5. SQL Server 事务隔离级别的解析

    近来在项目中遇到的一些有关事务的问题,跟同事间讨论了一下,后面翻看了一些书籍和做了一些测试,趁有点时间把它写下来,一来加深印象,二来希望对大家有所帮助,当然,由于自身水平问题,如理解有误,还请大牛指出 ...

  6. sql server报:名称 不是有效的标识符

    可能出现的几种情况: 1.执行sql提示 名称***不是有效的标识符 --添加括号 sql exec(sql) 注意exec的时候要到括号 exec  (@sql) 2.sql中的单引号嵌套采用两个单 ...

  7. SQL Server 判断表名称、索引、表字段是否存在

    1.判断索引是否存在 ps:@tableName 表名称, @indexName 索引名 IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id=OB ...

  8. SQL SERVER 根据字段名称批量设置为主键

    --设置主键 --alter table 你的表名 add constraint pk_s primary key (id) SELECT 'alter table ' + TABLE_NAME + ...

  9. sql server(mssql)联合注入

    sql server(mssql)联合注入 sql server简介: SQL Server 是Microsoft 公司推出的关系型数据库管理系统.具有使用方便可伸缩性好与相关软件集成程度高等优点,可 ...

随机推荐

  1. mongodb数据文件内部结构

    有人在Quora上提问:MongoDB数据文件内部的组织结构是什么样的.随后10gen的工程师Jared Rosoff出来做了简短的回答. 每一个数据库都有自己独立的文件.如果你开启了director ...

  2. 华为Oj 找出字符串第一个出现一次的字符

    #include <stdio.h> #include <string.h> char firstSingle(char *str) { int hash[255]={0}; ...

  3. OpenGL ES 2.0 纹理映射

    纹理坐标用符点数表示,范围一般从0.0到1.0,在纹理坐标系中.纹理坐标系原点在左上侧,向右为S轴,向下为T轴.两个轴的取值范围都是0.0-1.0. 纹理映射 纹理映射:把一幅纹理图应用到相应的几何图 ...

  4. 基于webrtc的多人视频会话的demo运行程序

    服务端程序: 该服务程序为windows平台下的程序,使用libevent书写,并集成了UDP的中转程序.(该服务器程序不能和客户端程序运行在同一台PC机电脑,不然服务器程序和客户端程序会抢占同一UD ...

  5. HDU 4507 有点复杂却不难的数位DP

    首先来说,,这题我wrong了好几次,代码力太弱啊..很多细节没考虑.. 题意:给定两个数 L R,1 <= L <= R <= 10^18 :求L 到 R 间 与 7 无关的数的平 ...

  6. python之简单入门01

     python简单的介绍使用: 一.个人感觉写Python程序,最好用的工具就是pycharm了,自动补全功能可以满足大多数不太喜欢记忆的人群: 安装pycharm之前应该先安装python解释器,目 ...

  7. a foreign key constraint fails

    今天遇到一个问题,一对一级联保存时,报错如下: Cannot add or update a child row: a foreign key constraint fails 解决方法: MySQL ...

  8. js基础小总结之string&array&object

    一.数据类型之间的转换 string--->number :parseInt(string)/parseFloat(string); 注:在Date中,因为返回值date为单位为ms的字符串,将 ...

  9. sqlserver exists和in 与exists和not in

    1.exists 和 in 1.1 正常情况下exists和in的效果是一样的,如图试验 即使子查询中包含null也没有关系,依然可以正常使用 1.2 in 和 exists效率比较 先看in 由图中 ...

  10. c# 输出excel、word实例只需一行代码

    第一.首先下载 WindICFrameNet.dll 下载地址:http://pan.baidu.com/s/1dDBqC9r 第二.前台代码 <div style="display: ...