SQL Server 模式和名称解析
模式实际上是名称空间,因此在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 模式和名称解析的更多相关文章
- SQL Server 连接问题案例解析(1)
SQL Server 连接问题案例解析(1) 转载自:http://blogs.msdn.com/b/apgcdsd/archive/2015/04/27/sql.aspx?CommentPosted ...
- SQL SERVER 修改数据库名称(包括 db.mdf 名称的修改)
刚开始学习SQL SERVER 2005,弄了一个上午修改数据库名,主要是需要修改db.mdf 和db_log.ldf的名字,总算解决了.在这里记下,以后再要修改了就别忘了. 假设原来数据库名为db, ...
- SQL Server并行死锁案例解析
并行执行作为提升查询响应时间,提高用户体验的一种有效手段被大家所熟知,感兴趣的朋友可以看我以前的博客SQL Server优化技巧之SQL Server中的"MapReduce", ...
- SQL Server的实例恢复解析
同Oracle一样,SQL Server在非一致性关闭的时候也会进行实例恢复(Instance Recovery),本文根据stack overflow的文章介绍一些SQL Server实例恢复的知识 ...
- SQL Server 事务隔离级别的解析
近来在项目中遇到的一些有关事务的问题,跟同事间讨论了一下,后面翻看了一些书籍和做了一些测试,趁有点时间把它写下来,一来加深印象,二来希望对大家有所帮助,当然,由于自身水平问题,如理解有误,还请大牛指出 ...
- sql server报:名称 不是有效的标识符
可能出现的几种情况: 1.执行sql提示 名称***不是有效的标识符 --添加括号 sql exec(sql) 注意exec的时候要到括号 exec (@sql) 2.sql中的单引号嵌套采用两个单 ...
- SQL Server 判断表名称、索引、表字段是否存在
1.判断索引是否存在 ps:@tableName 表名称, @indexName 索引名 IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id=OB ...
- SQL SERVER 根据字段名称批量设置为主键
--设置主键 --alter table 你的表名 add constraint pk_s primary key (id) SELECT 'alter table ' + TABLE_NAME + ...
- sql server(mssql)联合注入
sql server(mssql)联合注入 sql server简介: SQL Server 是Microsoft 公司推出的关系型数据库管理系统.具有使用方便可伸缩性好与相关软件集成程度高等优点,可 ...
随机推荐
- weblogic开机启动-超简单
1.编写weblogic启动脚本,命名为start_weblogic_server.sh,内容如下: #!/bin/bashnohup /home/weblogic/Oracle/Middlewar ...
- 引用 exit、return、_exit、_Exit这几个函数的区别
引用 exit.return._exit._Exit这几个函数的区别 一.exit函数和return函数的主要区别是: exit用于在程序运行的过程中随时结束程序,其参数是返回给OS的.也可以这么讲: ...
- Trident内核中取验证码图片的几种方法
程序中用了IE的内核,想取出网站中的验证码图片,单独显示出来,调研了以下几路方法 1.枚举所有缓存文件,进行处理,找到想要的,核心代码 )//这段代码可以枚举所有缓存资源,然后对应做处理 { LPIN ...
- Qt信号槽写法
1.标准写法 2.lamda表达式写法 3.地址函数指针写法
- django post方法不能提交
def login(request): if request.method == 'GET': c = {} c.update(csrf(request)) return render_to_resp ...
- 关于HTML5中audio标签在手机中的autoplay
这个问题是我最头疼的: 问题描述:在开发手机网页的时候,苹果和三星的一些浏览器不能自动开始播放 解决办法:在这个页面上弹出一个层来触发audio标签的play()方法,或者你还可以 谷歌一下----& ...
- WordPress插件制作教程(五): 创建新的数据表
上一篇讲解了怎样将数据保存到数据库,今天为大家讲解创建新的数据表,也就是说当我们激活插件的时候,会在该数据库下面创建一个新的数据表出来.原理很简单,激活插件的时候运行创建数据库的代码.看下面代码: & ...
- C# .net Jquery ajax 简单示例
jquery中ajax相信大家都不陌生,这里只写个简单例子示意用法,详细后续再写. 在html中按钮事件中添加如下js var param = "data=" + escape($ ...
- Block(一)基础-备
一.概述 Block是C级别的语法和运行时特性.Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存.堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block ...
- [Ioi2007]Miners 矿工配餐(BZOJ1806)
[Ioi2007]Miners 矿工配餐 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 214 Solved: 128 Description 现有两 ...