首先,我们来看一下微软对架构的官方定义:
架构(Schema)是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。在这里,我们可以将架构看成一个存放数据库中对象的一个容器。
显然这与Oracle中的用户(Schema)含义有着很大的不同。
架构实际上在SQL Server 2000中就已经存在,在SQL Server 2000中数据库用户和架构是隐式连接在一起的, 每个数据库用户都是与该用户同名的架构的所有者。当我们使用查询分析器去查询一个表的时候,一个完整的表的名称应该包括服务器名.数据库名.用户名.对象名,而在SQL SERVER 2005/2008中一个表的完全限定名称应该为服务器名.数据库名.架构名.对象名。即,SQL SERVER 2000中的完全限定名称中的“用户名”也是数据库中的用户,也是“架构名”。但在2008中已经将用户和其创建对象所属关联取消了,而加入了一个全新的架构体系。
用户架构分离的好处
- 1 架构管理与用户管理分开。多个用户可以通过角色(Role)或组(Windows Groups)成员关系拥有同一个架构。在SQL SERVER 2005/2008 中,每个数据库中的固定数据库角色都有一个属于自己的架构,如果我们创建一个表,给它指定的架构名称为
db_ddladmin
,那么任何一个属于db_ddladmin
中的用户都是可以去查询、修改和删除属于这个架构中的表,但是不属于这个组的用户是没有对这个架构中的表进行操作的权限。 - 2 在创建数据库用户时,可以指定该用户账号所属的默认架构,若不指定默认架构,则为
dbo
。大多数用户在创建对象的时候习惯直接输入对象名而将对象的架构名称省略,在2005/2008 中,用户如果没有设置自己的默认架构,会给这样创建的对象加上一个缺省的架构dbo
,也就是说,如果一个db_ddladmin的成员在数据库中创建一个没有加上架构名称的表,这个表在数据库中的完整名称应该是dbo.表名
,创建者在数据库中如果不是属于其它特殊组的成员,是不能对自己创建的表进行任何修改和查询的,那就相当于把自己赚的钱存进了别人的银行卡,自己却取不出来。 - 3 删除数据库用户变得极为简单。在 SQL Server 2000 中,用户(User)和架构是隐含关联的,即每个用户拥有与其同名的架构。因此要删除一个用户,必须先删除或修改这个用户所拥有的所有数据库对象。SQL SERVER 2005/2008将架构和对象者分离后就不在存在这样的问题,删除用户的时候不需要重命名该用户架构所包含的对象,在删除创建架构所含对象的用户后,不再需要修改和测试显式引用这些对象的应用程序。
- 4 区分不同业务处理需要的对象,例如,我们可以把公共的表设置成Pub的架构,把销售相关的设置为Sales,这样管理和访问起来更容易。
- 5 在架构和架构所包含的对象上设置权限(Permissions)比以前的版本拥有更高的可管理性。
- 6 当查找对象时,先找与用户默认架构相同的架构下的对象,找不到再找
dbo
的对象。