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权限层次结构的图可能会给我们一个直观的认识:

 图片 1

      
SQL Server 2005/2008 Database Engine 管理着可以由此权限进行保险的实体的支行集合。那些实体称为“安全目标”。在广元目的中,最卓越的是服务器和数据库,但足以在更细的级别上设置离散权限。SQL Server 通过验证主体是不是已得到适当的权位来支配中央对平安目的执行的操作。

 

安然目的关联如下图:

 图片 2

上面举个具体的示范来评释以一下架构的意义。

 

--命令对架构进行操作

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

 

相关文章