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 公司推出的关系型数据库管理系统.具有使用方便可伸缩性好与相关软件集成程度高等优点,可 ...
随机推荐
- Tomcat6+nginx集群,达到负载均衡和session复制
nginx+tomcat做web项目集群,达到负载均衡.故障转移.session复制功能. 1.nginx配置文件见上一篇“nginx配置文件(反向代理+集群+动静分离)” 2.tomcat集群,修改 ...
- C#不用COM组件导出数据到Excel中
<?xml version='1.0'?><?mso-application progid='Excel.Sheet'?><Workbook xmlns='urn:sch ...
- ASP.NET MVC4 + Highcharts生成报表
//后端 public ActionResult TighteningReport(BReportTighteningReportModel model, string rate, string we ...
- C#通过生成ini文件,记住用户关闭程序之前的选择+忽略跨线程检查
1.在类的里面添加 //写配置文件 [DllImport("kernel32")] private static extern long WritePrivateProfileSt ...
- C#中KeyDown和KeyPress区别
1.比如说TexBox 输入'a' 按下->触发KeyDown事件,然后去处理 ->将a显示输入到文本框后 ->触发KeyPress事件
- C++常量指针与常量数据
常量指针即指针是常量的,一但声明指向某个数据后不能被更改,但是指向的数据可以被更改.声明格式如下: ; int * const p = &demo; 常量数据是指数据是常量的,一但被初始化后不 ...
- [转]shell中 source命令即点空格后面再跟可执行文件的说明
这里记录的是在一个shell脚本里面使用. ./file.sh 和./file.sh 的区别,本文参考了http://www.lslnet.com/linux/dosc1/39/linux-28353 ...
- python学习第三天 --布尔类型
我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and ...
- Lonely Integer
https://www.hackerrank.com/challenges/lonely-integer def main(): n = int(raw_input()) s = dict() a = ...
- rsyslog VS syslog-ng,日志记录哪家强?
还有慢慢摸索,NG的MYSQL配置,我始终没搞好. RSYSLOG则比较容易. 另外,也可以每个RSYSLOG直接入库,不需要经过LOG SERVER..如果有一个大内网的话... 配合LOGANAL ...