模式实际上是名称空间,因此在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. Android Studio tips and tricks 翻译学习

    Android Studio tips and tricks 翻译 这里是原文的链接. 正文: 如果你对Android Studio和IntelliJ不熟悉,本页提供了一些建议,让你可以从最常见的任务 ...

  2. C#在局域网中连接Liunx上的MySql数据库

    前期准备工作: 我所用的平台是VS2010和Ubuntu 14.04.3  LTS 一.由于MySql并没有集成在VS2010中所以要先安装MySQL Connector Net 6.9.8连接工具, ...

  3. android*API19

     android android.accessibilityservice android.accounts android.animation android.app android.app.adm ...

  4. IIS 7 支持10万并发请求

    原文链接:http://www.cnblogs.com/dudu/archive/2009/11/10/1600062.html 今天下午17点左右,博客园博客站点出现这样的错误信息: Error S ...

  5. Mac添加或修改环境变量

    方式1. 终端添加或修改 命令:pico, vim等 方式:pico .bash_profile 方式2. 文本方式添加或修改 1)打开 touch ~/.bash_profile open -t ~ ...

  6. 美化xterm

    很多软件调试时,会打开xterm,不过很难看,字体.背景等等都不好看,网上找到了一个不错的xterm的配置文件 !look and feel xterm.termName: xterm-256colo ...

  7. jquery height、innerHeight、outHeight

    JQuery有很多的height,不总结一下你就要被他搞晕,所以为了保持清醒,汇总在下面 height:height innerHeight:height+padding outerHeight(fa ...

  8. iframe和response.sendRedirect使用的问题

    一.iframe下使用response.sendRedirect的问题 一般使用filter过滤用户是否登录,如果用户没有登陆则转向登陆页面,这时候可以使用response.sendRedirect( ...

  9. 异常处理:你不可能总是对的2 - 零基础入门学习Python033

    异常处理:你不可能总是对的2 让编程改变世界 Change the world by program 我们已经了解足够多的可能碰到的异常,那我们这节课就来谈谈如何检测这些异常并处理它们. 异常检测我们 ...

  10. 根据文字计算Label的尺寸

    CGSize size = [self.username.text boundingRectWithSize:(CGSize){130,20} options:NSStringDrawingUsesL ...