用户架构分离

在 SQL Server 2005 中,架构行为已更改。架构不再等效于数据库用户;现在,每个架构都是独立于创建它的数据库用户存在的不同命名空间。也就是说,架构只是对象的容器。任何用户都可以拥有架构,并且架构所有权可以转移。

新行为

所有权与架构的分离具有重要的意义:

  • 架构的所有权和架构范围内的安全对象可以转移。有关详细信息,请参阅 ALTER AUTHORIZATION (Transact-SQL)

  • 对象可以在架构之间移动。有关详细信息,请参阅 ALTER SCHEMA (Transact-SQL)

  • 单个架构可以包含由多个数据库用户拥有的对象。

  • 多个数据库用户可以共享单个默认架构。

  • 与早期版本相比,对架构及架构中包含的安全对象的权限的管理更加精细。有关详细信息,请参阅 GRANT 架构权限 (Transact-SQL)GRANT 对象权限 (Transact-SQL)

  • 架构可以由任何数据库主体拥有。这包括角色和应用程序角色。

  • 可以删除数据库用户而不删除相应架构中的对象。

  • 如果为 SQL Server 早期版本编写的代码假定架构等效于数据库用户,这些代码可能会返回错误的结果。

  • 为 SQL Server 早期版本设计的目录视图可能会返回错误的结果。这包括 sysobjects。

  • 在创建数据库对象时,如果您将某一有效的域主体(用户或组)指定为对象所有者,则该域主体将作为架构添加到数据库中。这个新架构将为该域主体所拥有。

新目录视图

从 SQL Server 2005 开始,架构是在元数据中反映的显式实体;因此,架构只能有一个所有者,但一个用户可以拥有多个架构。这种复杂关系并未在 SQL Server 2000 系统表中反映,因此 SQL Server 2005 引入了新的目录视图,以准确反映新的元数据。

下表显示了 SQL Server 2000 系统表与其 SQL Server 2005 等效项和更高版本的目录视图之间的映射。

SQL Server 2000 系统表

SQL Server 2005 及更高版本的目录视图

sysusers

sys.database_principals

sys.schemas

syslogins

sys.server_principals

SQL Server 2005 引入了超过 250 个新目录视图。极力建议使用新的目录视图访问元数据。有关详细信息,请参阅目录视图 (Transact-SQL)

新的 DDL 语句可以将旧的目录视图(如 sysobjects)不能准确反映的复杂关系引入系统元数据中。在下面的示例中,用户 ID 与 sysobjects 返回的架构名称之间不同步,无法反映用户与 SQL Server 2005 中引入的架构之间的区别。

USE tempdb
GO
CREATE LOGIN u1 WITH PASSWORD = 'Mdfjd$sakj943857l7sdfh##30'
CREATE USER u1 WITH DEFAULT_SCHEMA = u1
GO
GRANT CREATE TABLE to u1 
GO
CREATE SCHEMA sch1
GO
CREATE SCHEMA u1 AUTHORIZATION u1
GO
EXECUTE AS user = 'u1'
GO
CREATE TABLE t1(c1 int)
GO
revert
GO
SELECT user_name(uid) , * FROM sysobjects WHERE name = 't1'
GO
注意事项注意

您必须在任何曾经使用过下列 DDL 语句的数据库中使用新的目录视图:CREATE/ALTER/DROP SCHEMA;CREATE/ALTER/DROP USER;CREATE/ALTER/DROP ROLE;CREATE/ALTER/DROP APPROLE;ALTER AUTHORIZATION。

默认架构

为了解析不完全限定的安全对象名称,SQL Server 2000 使用名称解析来检查执行调用的数据库用户所拥有的架构和 dbo 所拥有的架构。

从 SQL Server 2005 开始,每个用户都拥有一个默认架构。可以使用 CREATE USER 或 ALTER USER 的 DEFAULT_SCHEMA 选项设置和更改默认架构。如果未定义 DEFAULT_SCHEMA,则数据库用户将使用 dbo 作为默认架构。