设为首页 收藏本站
查看: 828|回复: 0

[经验分享] SQL SERVER 2005/2008 中关于架构的理解(二)

[复制链接]

尚未签到

发表于 2015-6-27 17:05:36 | 显示全部楼层 |阅读模式
本文上接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权限层次结构的图可能会给我们一个直观的认识:
DSC0000.jpg
       SQL Server 2005/2008 Database Engine 管理着可以通过权限进行保护的实体的分层集合。这些实体称为“安全对象”。在安全对象中,最突出的是服务器和数据库,但可以在更细的级别上设置离散权限。SQL Server 通过验证主体是否已获得适当的权限来控制主体对安全对象执行的操作。

安全对象关系如下图:
DSC0001.jpg
下面举个具体的示例来说明以一下架构的作用。




--命令对架构进行操作
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


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81022-1-1.html 上篇帖子: 利用SQLDMO操控SQL Server 下篇帖子: 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表