在一次的实际工做中碰到如下状况,在 SQL SERVER 2008中,新建了一个新用户去访问几张由其余用户建立的表,可是没法进行查询,提示“对象名'CustomEntry' 无效。”。当带上了架构名称以后(如“cus.CustomEntry”),却又能查询到表中的数据了,可是查询语句是已经写死在了应用程序中的,若是要进行更改,就有很大的工做量, 这是一件很郁闷的事情。因而想从数据库层面上解决此问题,在查询了大量的资料以后,对于SQL SERVER中的架构有所了解,并解决以上问题。数据库
下面来讲说,本身对SQL SERVER 中架构的理解,并在此记录,以备查。服务器
在SQL SERVER 2000中不存在上面所说的问题,那为何在2008中会出现这样的事情,这样的设置能够带来哪些好处?致使这一问题的缘由主要在于SQL SERVER 2005/2008中多了一个新的概念——架构。架构
首先,咱们来看一下微软对架构的官方定义:架构(Schema)是造成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每一个元素的名称都是惟一的。在这里,咱们能够将架构当作一个存放数据库中对象的一个容器。测试
架构实际上在SQL SERVER 2000中就已经存在,在SQL SERVER 2000中数据库用户和架构是隐式链接在一块儿的, 每一个数据库用户都是与该用户同名的架构的全部者。当咱们使用查询分析器去查询一个表的时候,一个完整的表的名称应该包括服务器名.数据库名.用户名.对象名,而在SQL SERVER 2005/2008中一个表的彻底限定名称应该为服务器名.数据库名.架构名.对象名对象
在SQL SERVER 2000中的彻底限定名称中的“用户名”也是数据库中的用户,也是“架构名”。假若有一个帐户df在test数据库中建立了一张表tb1的时候,在查询分析器中应该输入的查询语句为select * from test.df.tb1,也就是说,在SQL SERVER 2000中一张表所属的架构默认就是表的建立者的登陆名称,用户能够修改他所建立的全部数据库对象。但在2008中已经将用户和其建立对象所属关联取消了,而加入了一个全新的架构体系。blog
用户架构分离的好处开发
那么将架构与数据库用户分离对管理员和开发人员而言有什么好处呢?it
1. 架构管理与用户管理分开。多个用户能够经过角色(role)或组(Windows groups)成员关系拥有同一个架构。在SQL SERVER 2005/2008 中,每一个数据库中的固定数据库角色都有一个属于本身的架构,若是咱们建立一个表,给它指定的架构名称为 db_ddladmin,那么任何一个属于db_ddladmin中的用户都是能够去查询、修改和删除属于这个架构中的表,可是不属于这个组的用户是没有对这个架构中的表进行操做的权限,有一点必须注意,db_dbdatareader组的成员能够查看全部数据库中的表,db_dbdatawriter组成员能够修改全部数据库中 的表,db_owner组成员能够对数据库全部表进行全部操做,这几个组的成员能够经过角色获取到在数据库中的特殊权限。io
2. 在建立数据库用户时,能够指定该用户帐号所属的默认架构。 ( 建议你们指定)class
3. 删除数据库用户变得极为简单。在 SQL Server 2000 中,用户(User)和架构是隐含关联的,即每一个用户拥有与其同名的架构。所以要删除一个用户,必须先删除或修改这个用户所拥有的全部数据库对象,就好比 一个员工要离职要删除他的帐户的时候,还得将他所建立的表和视图等都删除,影响过大。SQL SERVER 2005/2008将架构和对象者分离后就不在存在这样的问题,删除用户的时候不须要重命名该用户架构所包含的对象,在删除建立架构所含对象的用户后,再也不须要修改和测试显式引用这些对象的应用程序。
4. 共享缺省架构使得开发人员能够为特定的应用程序建立特定的架构来存放对象,这比仅使用管理员架构(DBO schema)要好。
5. 在架构和架构所包含的对象上设置权限(permissions)比之前的版本拥有更高的可管理性。
6. 区分不一样业务处理须要的对象,例如,咱们能够把公共的表设置成pub的架构,把销售相关的设置为sales,这样管理和访问起来更容易。
大多数用户在建立对象的时候习惯直接输入对象名而将对象的架构名称省略,在2005/2008 中,会给用户建立的这样的表加上一个缺省的架构,用户若是没有对本身的默 认架构作设置,那缺省架构就是dbo,也就是说,若是一个db_ddladmin的成员在数据库中建立一个没有加上架构名称的表,这个表在数据库中的完整 名称应该是dbo.表名,建立者在数据库中若是不是属于其它特殊组的成员,是不能对本身建立的表进行任何修改和查询的,那就至关于把本身赚的钱存进了别人的银行卡,本身却取不出来。
7 若不指定默认架构,则为DBO,为了向前兼容,早期版本中的对象迁移到新版本中,早期版本中没有架构的概念的。因此就该对象的架构名就是dbo.在SQL Server 2008中,DBO就是一个架构
8 当查找对象时,先找与用户默认架构相同的架构下的对象,找不到再找DBO的对象
第8点有点难理解,咱们来看一张图,经过这张图,你们应该能很显示的理解这一点: