首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

12.2  模式

在第4章中已经详细讨论了模式,其中介绍了Transact-SQL语言的一个DDL语句CREATE SCHEMA。因为SQL Server在安全模型中使用模式来简化用户和对象之间的关系,所以在SQL Server 2005中模式的概念有非常大的影响。下面几节将主要介绍模式的这一特性以及在SQL Server安全中模式的角色。首先,我们将详细描述模式和用户之间的关系;然后,讨论与模式的创建和修改有关的所有3个Transact-SQL语句。

12.2.1  用户和模式分离

模式是一些数据库对象的集合,这些数据库对象为单独某个用户所拥有,并且形成单个命名空间。(同一个模式中的两个表不能有相同的名称。)

注意:

因为SQL Server 2000只支持未命名的模式并且AUTHORIZATION子句指明了其拥有者(参见示例4.12),所以SQL Server 2000并没有把用户和模式区分开。在SQL Server 2000中,数据库用户和模式是隐式地连接在一起的。同时,这种连接是固定的、不能被修改的。因为这个原因,每个数据库用户都是与其同名的模式的拥有者。

SQL Server 2005打破了在以前版本中存在的用户和模式之间的紧密联系。现在,SQL Server 2005支持使用了主体(principal)概念的已命名的模式。主体是一个可以访问对象的实体。主体可以是:

不可分割的主体

组主体

不可分割的主体代表单个用户,比如一个SQL Server登录或者一个Windows用户账户。组主体可以是一个用户组,比如一个SQL Server角色或一个Windows组。主体具有模式的所有权,但是对某个模式的所有权可以很轻易地传递给另一个主体而不需要修改模式的名称。

数据库用户与模式的分离提供了很多明显的好处,比如:

一个主体可以拥有几个模式

几个不可分割的主体可以通过SQL Server角色或Windows组的成员关系而拥有单个模式

删除某个数据库用户不需要对用户模式拥有的对象进行重新命名

SQL Server 2005引入了默认模式的概念,它可以用来决定那些不使用完全限定名的对象的名称。默认模式指定在确定这些对象的名称时,服务器将要搜索的第一个模式。默认模式可以使用CREATE USER或ALTER USER语句的DEFAULT_SCHEMA选项来设置或修改。

如果DEFAULT_SCHEMA选项没有进行定义,那么数据库用户将把dbo作为它的默认模式。(所有的默认模式都将在本章后面的“默认数据库模式”部分详细介绍。)

12.2.2  与模式有关的DDL语句

因为SQL Server 2005把用户和模式分离,所以这里将首先介绍与模式有关的Transact SQL语句,然后再讨论与用户有关的Transact SQL语句。

与模式有关的语句有3个:

CREATE SCHEMA

ALTER SCHEMA

DROP SCHEMA

这里将对第4章中的示例(示例4.12)稍作修改,用来解释SQL Server 2005如何使用模式来控制数据库的安全性。

示例12.5

USE sample

GO

CREATE SCHEMA my_schema AUTHORIZATION peter

CREATE TABLE product

(product_no CHAR(10) NOT NULL UNIQUE,

product_name CHAR(20) NULL,

price MONEY NULL)

CREATE VIEW product_info

AS SELECT product_no,product_name

FROM product

GRANT SELECT TO mary

DENY UPDATE TO mary

注意:

在开始示例12.5之前,您必须创建数据库用户peter和mary。因此,请先运行示例12.8中的Transact-SQL语句。

在示例12.5中,创建了一个名为my_schema的模式,该模式由product表和一个视图(product_info)组成。名为peter的用户是数据库层次上的主体,它拥有该模式。使用AUTHORIZATION选项可以定义模式的主体。(主体也可以拥有其他模式,并且可能不把当前模式当作它的默认模式。)同样的,还有两个与数据库对象权限有关的语句,分别称作GRANT和DENY。第一个语句可以授予对在模式中创建的所有对象进行的SELECT权限,而第二个语句则用来剥夺模式中所有对象的UPDATE权限。(GRANT和DENY语句将在本章末尾进行详细讨论。)

CREATE SCHEMA语句可以创建一个模式(该模式含有表和视图),并能用单个语句来授予、取消或剥夺可保护(securable)资源的权限。(可保护资源是指SQL Server授权系统规则可以访问的资源。)这里有3个可获得资源的范围,即服务器、数据库以及模式,这些又包含了其他可保护资源,如SQL Server登录、数据库用户、表以及存储过程等。

CREATE SCHEMA语句是原子性的。换句话说,在CREATE SCHEMA语句运行期间如果有任何错误发生,那么在模式中指定的Transact-SQL语句都不会运行。

在CREATE SCHEMA语句中创建的数据库对象可以通过任何顺序进行指定,但是除了一个例外的情况:引用了另一个视图的某个视图必须在该被引用的视图后面进行指定。

数据库层次上的主体可以是数据库用户、角色,也可以是应用程序角色。(角色和应用程序角色将在随后进行讨论。)在CREATE SCHEMA语句的AUTHORIZATION子句中指定的主体是模式内创建的所有对象的拥有者。模式含有对象的这种拥有关系通过ALTER AUTHORIZATION语句传递给其他数据库层次上的任何主体(参见示例12.7)。

用户需要获取对数据库的CREATE SCHEMA权限,才能执行CREATE SCHEMA语句。同样,要想创建在CREATE SCHEMA语句内指定的对象,用户必须取得相应的CREATE权限。

ALTER SCHEMA语句可以在相同数据库的不同模式之间转换某个对象。ALTER SCHEMA语句的语法格式如下所示:

ALTER SCHEMA schema_name TRANSFER object_name

下面的示例给出了ALTER SCHEMA语句的用法。

示例12.6

USE AdventureWorks

ALTER SCHEMA humanresources TRANSFER person.address

示例12.6更改了AdventureWorks数据库中一个名为humanresources的模式,把同一个数据库中person模式的address表转换进来。

ALTER SCHEMA语句只能用来转换同一个数据库中不同模式之间的对象。(模式内部的单个对象可以使用第4章中讨论过的ALTER TABLE语句(即ALTER VIEW语句)进行更改。)

DROP SCHEMA语句可以用来从数据库中删除一个模式。只有当模式没有包含任何对象时,您才可以对某个模式成功地执行DROP SCHEMA语句。否则,系统将拒绝执行DROP SCHEMA语句。

正如前面已经阐述的,SQL Server 2005允许修改模式的从属关系。您只需使用ALTER AUTHORIZATION语句即可。ALTER AUTHORIZATION语句可以用来修改实体的从属关系。

注意:

SQL Server不支持CREATE AUTHORIZATION或DROP AUTHORIZATION语句。您需要使用CREATE SCHEMA语句来指定实体的从属关系。

示例12.7给出了ALTER AUTHORIZATION语句的使用方法,该语句修改了一个名为my_schema的模式(示例12.5)的从属关系。

示例12.7

USE sample

ALTER AUTHORIZATION ON SCHEMA ::my_schema TO mary;