数据库与架构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据库与架构(Schema)

在ANSI SQL-92标准里,架构被定义为由单个用户所有的一组数据库对象,并构成一个单独的命名空间。一个命名空间就是一组不能重名对象。例如,两张表只有在不同的架构下才能取相同的名字,也就是说,同一个架构下不能有两张名字一样的表。我们可以把架构看作对象的容器(在数据库工具的上下文中,架构也是指描述架构和数据库中对象的目录信息。在SQL Server Analysis Service中,架构是指对多维对象如多维数据集(c ube)和维度(dimension)的描述)。

分离主体与架构

以前的版本,如SQL Server 2000,提供有CREATE SCHEMA语句,但是由于在用户和架构之间的隐式关系不能被更改或删除,所以它并没有任何有效的用途。实际上,这种关系是如此紧密以至于很多SQL Server 2000的用户认为用户和架构其实是相同的概念。每个用户都是一个与其同名的架构的所有者。如果我们创建一个用户例如sue,SQL Server 会创建一个名为sue的架构作为sue的默认架构。权限被赋予用户,但是对象被放置在架构中。

在SQL Server 2000中,语句GRANT CREATE TABLE TO sue引用了用户sue。假定之后sue创建了一张表:

CREATE TABLE mytable (col1 varchar(20));

因为架构sue是用户sue的默认架构,所以这张表会被放入架构sue中。如果有另一个用户想要从这张表中取出数据,他可以使用下面的语句:

SELECT col1 FROM sue.mytable;

在这个语句中,sue就是包含有这个表的架构。

在新版本中SQL Server 2005打断了用户与架构之间的联系。一级和二级主体都可以拥有架构。虽然在SQL Server 2005中的每一个对象都为一个用户所有,但是我们决不需要根据所有者来引用对象,而是使用包含对象的架构来引用对象。另外,用户是不能被加到架构中的,架构包含的是对象而不是用户。为了向后兼容,当使用sp_adduser或sp_grant dbaccess存储过程来向一个数据库中添加用户时,SQL Server 2005同时会创建一个用户和一个架构,并将该架构作为新用户的默认架构。然而,我们应该习惯于使用新的DDL CR

EATE USER和CREATE SCHEMA。当我们创建一个用户时,可以选择指定一个默认的架构,但是默认情况下架构是dbo架构。

默认架构

当我们在SQL Server 2005中创建一个新的数据库时,其中包含有几个架构。这些架构包括对应SQL Server 2000中默认用户名的架构:dbo、INFORMATION_SCH EMA和guest。另外,每个数据库都有一个名为sys的架构,该架构提供了一种访问所有系统表和视图的方法。最后,每一个来自SQL Server 2000的预定义数据库角色在SQL Server 2005中都有一个架构。

当用户被创建时,可以指派给他一个可能存在也可能不存在的默认架构。在任何时候,一个用户最多只能有一个默认架构。前面提到,如果没有给一个用户指定默认架构,该用户的默认架构就是dbo。一个用户的默认架构可以用来在对象创建和对象引用期间进行名字解析。对后向兼容性来讲,这既是一个好的消息又是一个不好的消息。好的消息是如果我们从SQL Server 2000升级上来了一个数据库,其中很多对象都在dbo架构之下,那么我们的代码就能继续引用那些对象而不用显式地指定这个架构。坏的消息是对对象创建来讲,SQL Server将会尝试在dbo架构中而不是创建该表的用户所拥有的架构中创建对象。该用户也许没有在dbo架构下创建对象的权限,即使那是该用户的默认架构。为了避免混乱,在SQL Server 2005中,我们应该在所有的对象访问和对象管理时总是指定架构名称。

无论一个用户的默认架构是什么,SQL Server 2005对任何对象访问总是先检查sys架构。例如,如果一个用户Sue运行查询“select col1 from mytable”并且Sue的默认架构是SueSchema,名字解析的过程如下:

1. 寻找sys.table1。

2. 寻找SueSchema.table1。

3. 寻找dbo.mytable5。

注意当sysadmin角色中的一个登录账户创建一个只有一部分的名字时,架构总会是dbo。然而,一个sysadmin能够显式地指定一个替代架构并在该架构中创建一个对象。

为了在一个架构中创建一个对象,必须满足下列条件:

n 架构必须存在。

n 创建对象的用户必须有权限来创建对象(CREATE TABLE、CREATE VIE

W、CREATE PROCEDURE等),或者是直接权限,或者是通过角色成员关

系具备的权限。

n 创建对象的用户必须是架构的所有者,或者是拥有该架构的角色成员,或

者是具有该架构修改(ALTER)权限的用户,或者是在整个数据库中具有修

改任意架构(ALTER ANY SCHEMA)权限的用户。

相关文档
最新文档