SQL SERVER 2005/2008 中关于架构的理解(二)
本文上接SQL SERVER 2005/2008 中关于架构的理解(一)
架构的作用与示例
用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVER 2000及以前版本中“用户离开公司"问题,也就是在拥有该对象的用户离开公司,或离开该职务时,不必要大费周章地更改该用户所有的对象属于新的用户所有。另外,也可让 DBA 在安装某个套装软件时,设置该套装软件所用的数据库对象都属于某个特定的架构,容易区别。也就是说,在单一数据库内,不同部门或目的的对象,可以通过架构区分不同的对象命名原则与权限。
在 SQL Server 2005 /2008中,架构独立于创建它们的数据库用户而存在。可以在不更改架构名称的情况下转让架构的所有权。并且可以在架构中创建具有用户友好名称的对象,明确指示对象的功能。例如,除了 cus.app.entry.customEntry 外,您还可以创建名为 cus.app.manifest.customEntry 的架构。因为“manifest”不是用户,所以从数据库中删除用户后,无需更改此名称。这就简化了数据库管理员和开发人员的工作。
SQL Server 2005/2008 还引入了“默认架构”的概念,用于解析未使用其完全限定名称引用的对象的名称。在 SQL Server 2000 中,首先检查的是调用数据库用户所拥有的架构,然后是 DBO 拥有的架构。在 SQL Server 2005 /2008中,每个用户都有一个默认架构,用于指定服务器在解析对象的名称时将要搜索的第一个架构。可以使用 CREATE USER 和 ALTER USER 的 DEFAULT_SCHEMA 选项设置和更改默认架构。如果未定义 DEFAULT_SCHEMA,则数据库用户将把 DBO 作为其默认架构。
下面的显示SQL Server权限层次结构的图可能会给我们一个直观的认识:
SQL Server 2005/2008 Database Engine 管理着可以通过权限进行保护的实体的分层集合。这些实体称为“安全对象”。在安全对象中,最突出的是服务器和数据库,但可以在更细的级别上设置离散权限。SQL Server 通过验证主体是否已获得适当的权限来控制主体对安全对象执行的操作。
安全对象关系如下图:
下面举个具体的示例来说明以一下架构的作用。
- --命令对架构进行操作
- use master
- go
- setuser
- go
- --创建测试数据库
- create database schTest
- go
- create login df with password='sj1234',default_database=schTest
- create login xhl with password='sj1245',default_database=schTest
- go
- use schTest
- go
- -- 创建两个用户时没有指定属于哪个架构
- create user df for login df
- create user xhl for login xhl
- -- 这个表没指定属于哪个架构属于默认DBO 架构
- go
- create table tb1 (姓名 varchar(8),性别 char(2))
- go
- --这个表就属于sch架构
- create schema sch
- go
- create table sch.tb2(姓名 varchar(8),性别 char(2),年龄 int)
- go
- -- 赋予schTest这个用户查询sche架构中的对象的权限.
- grant select on schema::sch to df
- go
- setuser 'df' --切换用户df
- select * from tb2
- -- 此时报告"对象名无效" 是因为没有指定tb2的架构,系统默认为dbo,而我们的tb2属于sch架构.
- --带上架构名称,就可以查询了
- go
- select * from sch.tb2
- go
- setuser -- 切换到sa
- ---切换到xhl
- setuser 'xhl'
- --不能查询,是因为没有权限
- select * from sch.tb2
- go
- setuser --切换sa
- --给df用户赋默认架构
- alter user df with default_schema=sch
- go
- setuser 'df' --切换df
- -- 此时不需要指定sch 也可以了,如果架构中还有其他对象,也可以查询
- select * from tb2
- go
- setuser --切换sa
- --创建第三张测试表,同样的是sch架构下
- create table sch.tb3 (id int,uname varchar(8))
- go
- --切换用户df
- setuser 'df'
- ---可以进行查询
- select * from tb3
- go
- ---但是无法进行数据插入,因为没有插入权限
- insert into tb3 values (1,'abcde') --拒绝了insert权限
- go
- setuser
- --赋插入权限
- grant insert on schema::sch to df
- --切换用户df
- setuser 'df'
- go
- ---可以进行数据插入
- insert into tb3 values (1,'abcde') --OK!
- ---查询结果
- select * from tb3
- GO
- Grant alter on schema::sch to df -- 使schTest 这个用户对所有的架构都有可更改的能力。
- --错误
- --无法对sa、dbo、实体所有者、information_schema、sys 或您自己授予、拒绝或撤消权限。
- GO
- Use master
- go
- Grant control server to df -- 使schTest这个用户能够控制服务器。
- --错误
- --无法对sa、dbo、实体所有者、information_schema、sys 或您自己授予、拒绝或撤消权限。
- setuser
- go
- use schtest
- go
- --创建架构sch1
- create schema sch1
- go
- -- 修改对象的架构tb2表的架构由sch 转移到sch1
- alter schema sch1 transfer sch.tb2
- go
- --创建一个新用户,同时指定默认schema,默认属于DBO
- create login yhy with password='sj1234',default_database=master
- GO
- use schTest
- GO
- create user yhy for login yhy with default_schema=sch --属于sch
- --切换用户yhy
- setuser 'yhy'
- --查询表,对象名'tb2' 无效。
- select * from tb2
- go
- setuser
- --赋架构权限
- grant select on schema::sch1 to yhy
- --切换用户yhy
- setuser 'yhy'
- go
- select * from tb2 ---还是无效,因为不在同一个schema
- go
- setuser
- go
- alter user yhy with default_schema=sch1 --更改yhy的默认架构
- GO
- --由于yhy不是当前用户,所以无法进行查询
- select * from tb2
- --显示当前用户
- GO
- select user
- GO
- --切换用户yhy
- setuser 'yhy'
- -- 此时就可以进行查询了,如果架构中还有其他对象,也可以查询
- go
- select * from tb2
- --显示当前用户
- select user
- go
- --切换用户
- Setuser
- --切换用户为df
- setuser 'df'
- -- 此时由于tb2的架构由sch变为了sch1,所以df就不可以查询tb2了
- go
- --查询报错
- select * from tb2
- --显示当前用户
- select user
- go
- setuser
- go
- use master
- go
- ---删除用户
- drop user df
- drop user xhl
- drop user yhy
- ---删除登录名
- drop login df
- drop login yhy
- drop login xhl
- --删除数据库
- drop database schTest
SQL SERVER 2005/2008 中关于架构的理解(二)的更多相关文章
- SQL SERVER 2005/2008 中关于架构的理解(一)
SQL SERVER 2005/2008 中关于架构的理解(一) 在一次的实际工作中碰到以下情况,在 SQL SERVER 2008中,新建了一个新用户去访问几张由其他用户创建的表,但是无法进行查询, ...
- 【转】SQL SERVER 2005/2008 中关于架构的理解
在一次的实际工作中碰到以下情况,在 SQL SERVER 2008中,新建了一个新用户去访问几张由其他用户创建的表,但是无法进行查询,提示“对象名'CustomEntry' 无效.”.当带上了架构名称 ...
- 怎样修改SQL Server 2005/2008的系统存储过程(转)
我们知道,SQL Server 2005/2008的系统存储过程在正常情况下是无法直接修改的. 尽管本文是介绍怎样修改它的,但在这里,我还是建议大家尽量不要去修改它.(好像有点绕哈...) OK,闲话 ...
- Access数据库导入到SQL Server 2005 Express中
安装好SQL Server 2005 Express后,再安装SQL Server Management Studio Express CTP就可以很方便的使用控制台进行数据库的管理.但SQL Ser ...
- 【缓存】Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结
Sql server 7.0/2000下 SqlCacheDependency使用轮询的方式进行缓存失效检查, 虽然ms说对服务器压力不大, 但还是有一些的, 而且对于不常改动的混存内容无休止的轮询感 ...
- SQL Server R2 2008中的SQL Server Management Studio 阻止保存要求重新创建表的更改问题的设置方法
在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你. SQL Server 2008“阻止保存要求重新创建表的更改”的错误的解决方案是本 ...
- SQL Server 2005,2008 正则表达式 替换函数应用详解
CREATE function dbo.regexReplace ( @source ntext, --原字符串 ), --正则表达式 ), --替换值 , --是否是全局替换 --是否忽略大小写 ) ...
- SQL Server 2005/2008压缩数据库日志的方法
适用于SQL Server 2005的方法 Backup Log DNName WITH no_log GO DUMP TRANSACTION DNName WITH no_log GO USE DN ...
- PHP连接Microsoft SQL Server 2005/2008
PHP自带的MSSQL扩展php_mssql.dll原来是给SQL Server 2000用的,难怪连接不上2008?! -_-!!要使用SQL Server 2005以上版本,就要用到微软为PHP提 ...
随机推荐
- bootstrap中table的colspan不起作用
bootstrap中table的colspan不起作用,即在不指定宽度的条件下,各个td宽度不符合colspan指定的宽度. 添加table0layout:fixed后显示正常. table{ tab ...
- JS-JQuery(JSONP)调用WebService跨域若干技术点
1.JSONP:JSON With Padding,让网页从别的网域获取信息,也就是跨域获取信息,可以当做是一种“工具”,大多数架构Jquery.EXTjs等都支持. 由于同源策略,一般来说位于 se ...
- Amazon Resource Names (ARNs)
The following are the general formats for ARNs; the specific components and values used depend on th ...
- MSVCRTD.lib(mfc.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainC (转)
一.问题描述 我所使用的编程环境:VS2010 出现的问题如下: MSVCRTD.lib(mfc.obj) : error LNK2019: 无法解析的外部符号_WinMain@16,该符号在函数 _ ...
- 关于Chrome浏览器不能使用Java插件的问题
最近测试的“上海电信宽带测速系统”中HTTP测试需要用到java插件,之前装过好多次插件,装好后还是提示java插件未安装,郁闷了N久,最近问题终于得到了解决,故做分享~ 关于Chrome浏览器不能使 ...
- (原创) 巩固理解I2C协议(MCU,经验)
题外话:这几天天气突然转冷了.今天已是11月23日了,查查黄历,昨天(11月22日)刚好是小雪,一夜温度骤降,果然老祖先的经验有灵验!冬天来了,还是多加加衣服,注意保暖! 1.Abstract ...
- 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础
上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...
- android知识杂记(二)
记录项目中的android零碎知识点,用以备忘. AsyncQueryHandler 继承与handler,可以用于处理增删改(ContentProvider提供的数据) 例如:query = new ...
- 谈谈.net模块依赖关系及程序结构
技术为解决问题而生. 上面这个命题并非本文重点,我将来有空再谈这个.本文也并非什么了不起的技术创新,只是分享一下我对.net模块依赖关系及程序结构方面的一些看法.先看一个最最简单的hello worl ...
- JavaScript思维导图—Window对象
JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/