用户架构分离

在 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 作为默认架构。