架构的作用与示例
????? 用户与架构(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 mastergosetusergo--创建测试数据库create database schTestgo create login df with password='sj1234',default_database=schTestcreate login xhl with password='sj1245',default_database=schTestgouse schTestgo -- 创建两个用户时没有指定属于哪个架构create user df for login df create user xhl for login xhl-- 这个表没指定属于哪个架构属于默认DBO 架构gocreate table tb1 (姓名 varchar(8),性别 char(2)) go--这个表就属于sch架构create schema schgocreate table sch.tb2(姓名 varchar(8),性别 char(2),年龄 int)go-- 赋予schTest这个用户查询sche架构中的对象的权限. grant select on schema::sch to df gosetuser 'df' --切换用户df select * from tb2-- 此时报告"对象名无效" 是因为没有指定tb2的架构,系统默认为dbo,而我们的tb2属于sch架构. --带上架构名称,就可以查询了goselect * from sch.tb2gosetuser -- 切换到sa---切换到xhlsetuser 'xhl' --不能查询,是因为没有权限 select * from sch.tb2 gosetuser --切换sa--给df用户赋默认架构alter user df with default_schema=schgosetuser 'df' --切换df-- 此时不需要指定sch 也可以了,如果架构中还有其他对象,也可以查询select * from tb2 gosetuser --切换sa--创建第三张测试表,同样的是sch架构下create table sch.tb3 (id int,uname varchar(8))go--切换用户dfsetuser 'df'---可以进行查询select * from tb3go---但是无法进行数据插入,因为没有插入权限insert into tb3 values (1,'abcde') --拒绝了insert权限gosetuser--赋插入权限grant insert on schema::sch to df--切换用户dfsetuser 'df'go---可以进行数据插入insert into tb3 values (1,'abcde') --OK! ---查询结果select * from tb3GOGrant alter on schema::sch to df -- 使schTest 这个用户对所有的架构都有可更改的能力。--错误--无法对sa、dbo、实体所有者、information_schema、sys 或您自己授予、拒绝或撤消权限。GOUse master goGrant control server to df -- 使schTest这个用户能够控制服务器。--错误--无法对sa、dbo、实体所有者、information_schema、sys 或您自己授予、拒绝或撤消权限。setusergouse schtestgo--创建架构sch1create schema sch1 go-- 修改对象的架构tb2表的架构由sch 转移到sch1alter schema sch1 transfer sch.tb2go--创建一个新用户,同时指定默认schema,默认属于DBO create login yhy with password='sj1234',default_database=masterGOuse schTestGOcreate user yhy for login yhy with default_schema=sch --属于sch--切换用户yhysetuser 'yhy'--查询表,对象名'tb2' 无效。select * from tb2gosetuser--赋架构权限grant select on schema::sch1 to yhy--切换用户yhysetuser 'yhy'goselect * from tb2 ---还是无效,因为不在同一个schemagosetusergoalter user yhy with default_schema=sch1 --更改yhy的默认架构GO--由于yhy不是当前用户,所以无法进行查询select * from tb2 --显示当前用户GOselect userGO--切换用户yhysetuser 'yhy'-- 此时就可以进行查询了,如果架构中还有其他对象,也可以查询goselect * from tb2 --显示当前用户select usergo--切换用户Setuser--切换用户为dfsetuser 'df'-- 此时由于tb2的架构由sch变为了sch1,所以df就不可以查询tb2了go--查询报错select * from tb2 --显示当前用户select user gosetusergouse mastergo---删除用户drop user dfdrop user xhldrop user yhy---删除登录名drop login dfdrop login yhydrop login xhl--删除数据库drop database schTest