用户架构分离

更新日期: 2006 年 12 月 12 日

从 SQL Server 2005 开始,每个对象都属于一个数据库架构。数据库架构是一个独立于数据库用户的非重复命名空间。您可以将架构视为对象的容器。可以在数据库中创建和更改架构,并且可以授予用户访问架构的权限。任何用户都可以拥有架构,并且架构所有权可以转移。

ms190387.note(zh-cn,SQL.90).gif注意:
数据库架构不同于 XML 架构。有关 XML 架构的详细信息,请参阅管理服务器上的 XML 架构集合

有关创建数据库对象架构的详细信息,请参阅 CREATE SCHEMA (Transact-SQL)

新行为

在 SQL Server 的早期版本中,数据库用户和架构在概念上是同一对象。从 SQL Server 2005 开始,用户和架构便区分开来,架构用作对象的容器。

所有权与架构的分离具有重要的意义。数据库架构通过下列方式可以更好地控制数据库对象的安全性:

  • 与早期版本相比,对架构及架构中包含的安全对象的权限的管理更加精细。有关详细信息,请参阅 GRANT 架构权限 (Transact-SQL)GRANT 对象权限 (Transact-SQL)
  • 架构的所有权和架构范围内的安全对象可以转移。有关详细信息,请参阅 ALTER AUTHORIZATION (Transact-SQL)
  • 对象可以在架构之间移动。有关详细信息,请参阅 ALTER SCHEMA (Transact-SQL)
  • 单个架构可以包含由多个数据库用户拥有的对象。
  • 多个数据库用户可以共享单个默认架构。
  • 架构可以由任何数据库主体拥有。这包括角色和应用程序角色。
  • 可以删除数据库用户而不删除相应架构中的对象。

数据库架构引入了对早期版本安全性的以下其他重要更改:

  • 为 SQL Server 早期版本编写的代码可能会返回错误的结果(如果代码假定架构等同于数据库用户)。
  • 为 SQL Server 早期版本设计的目录视图可能会返回错误的结果。这包括 sysobjects
  • 现在,所有权链和用户上下文切换的行为可能有所不同,因为用户可以拥有多个架构。有关所有权链的详细信息,请参阅所有权链权限层次结构。有关上下文切换的详细信息,请参阅上下文切换
  • 在 SQL Server 2000 中,数据库对象由用户所有。在 SQL Server 2000 中,由四部分组成的对数据库对象的引用是 [DatabaseServer].[DatabaseName].[ObjectOwner].[DatabaseObject]。从 SQL Server 2005 开始,由四部分组成的对数据库对象的引用改为 [DatabaseServer].[DatabaseName].[DatabaseSchema].[DatabaseObject]

对象所有权更改

下列对象的所有权属性引用的是架构,而不是用户:

  • CREATE TABLE
  • ALTER TABLE
  • CREATE VIEW
  • ALTER VIEW
  • CREATE INDEX
  • ALTER INDEX
  • CREATE FUNCTION
  • ALTER FUNCTION
  • DROP FUNCTION
  • VIEW_TABLE_USAGE
  • VIEW_COLUMN_USAGE
  • TABLE_CONSTRAINTS
  • REFERENTIAL_CONSTRAINTS
  • KEY_COLUMN_USAGE
  • CONSTRAINT_TABLE_USAGE
  • CONSTRAINT_COLUMN_USAGE
  • CHECK_CONSTRAINTS
  • COLUMN_DOMAIN_USAGE
  • COLUMNS
  • DOMAIN_CONSTRAINTS
  • ROUTINE_COLUMNS

有关哪些列返回用户元数据与架构元数据的详细信息,请参阅下面的“架构目录视图和函数”部分。

系统表替换为目录视图和函数

SQL Server 2005 引入了 250 多个新目录视图(其中一些负责处理数据库用户和架构对象),它们将替换 SQL Server 2000 系统表。极力建议使用新的目录视图访问元数据。有关详细信息,请参阅目录视图 (Transact-SQL)

下表显示了 SQL Server 2000 系统表与对等的 SQL Server 2005 目录视图之间的映射:

SQL Server 2000 系统表 SQL Server 2005 目录视图

Sysusers

sys.database_principals (Transact-SQL)

sys.schemas (Transact-SQL)

Syslogins

sys.server_principals (Transact-SQL)

默认架构

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

在 SQL Server 2005 中,可以为每个用户分配默认架构。可以使用 CREATE USER 或 ALTER USER 的 DEFAULT_SCHEMA 选项设置和更改默认架构。如果未定义 DEFAULT_SCHEMA,SQL Server 2005 将假定 dbo 架构为默认架构。

ms190387.note(zh-cn,SQL.90).gif注意:
通过 Windows 身份验证组连接的用户将不具有默认的架构关联。如果该用户创建的不是由架构限定的对象,则会创建一个新架构,其名称设置为当前用户的名称,并且将在这一由用户命名的新命名空间中创建表对象。

新的数据定义语言 (DDL) 语句可以将复杂性引入到系统元数据中,而旧的系统表(如 sysobjects)不能准确地反映此复杂性。在此示例中,由 sysobjects 返回的用户 ID 和架构名称之间不同步,反映出用户与 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
ms190387.Caution(zh-cn,SQL.90).gif注意:
您必须在任何曾经使用过下列 DDL 语句的数据库中使用新的目录视图:CREATE/ALTER/DROP SCHEMA;CREATE/ALTER/DROP USER;CREATE/ALTER/DROP ROLE;CREATE/ALTER/DROP APPROLE;ALTER AUTHORIZATION。

架构目录视图和函数

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

下表显示了 SQL Server 2005 中架构的目录视图、元数据和函数:

相关信息 请参阅

常规架构元数据

sys.schemas (Transact-SQL)

信息架构视图

信息架构视图 (Transact-SQL)

INFORMATION_SCHEMA.SCHEMATA 视图返回的列定义

SCHEMATA (Transact-SQL)

示例

A. 创建架构并向用户分配所有权

下面的示例将名为 Marjorie 的 SQL Server 登录名和用户及名为 Auditing 的新架构添加到 AdventureWorks 数据库中,并指定 MarjorieAuditing 架构的所有者。

CREATE LOGIN Marjorie
    WITH PASSWORD = '8fdKJl3$nlNv3049jsKK';
USE AdventureWorks;
CREATE USER Marjorie FOR LOGIN Marjorie
GO
CREATE SCHEMA Auditing AUTHORIZATION Marjorie;
GO

B. 授予用户访问其他架构的权限

下面的示例向名为 Marjorie 的用户授予对 AdventureWorks 数据库中 Purchasing 架构的 SELECT 权限。

USE AdventureWorks;
GO
GRANT SELECT ON SCHEMA::Purchasing TO Marjorie;
GO

C. 更改架构的所有权

在下面的示例中,在 AdventureWorks 数据库中创建了一个新用户 Jon,并将 AdventureWorks 数据库中 Auditing 架构的所有权授予了 Jon。然后将名为 Marjorie 的用户从 AdventureWorks 数据库中删除。

USE AdventureWorks;
GO
/* Create a new user in the database */
CREATE LOGIN Jon
    WITH PASSWORD = '1fdKJl3$nlNv3049jsBB';
USE AdventureWorks;
CREATE USER Jon FOR LOGIN Jon
GO
ALTER AUTHORIZATION ON SCHEMA::Auditing TO Jon;
GO
/* Removes the user from the system */
DROP LOGIN Marjorie;
GO
DROP USER Marjorie;
GO

D. 显示架构的所有权

下面的示例显示 AdventureWorks 数据库中 Auditing 架构的所有者。

USE AdventureWorks;
GO
/* This method uses the INFORMATION_SCHEMA views */
SELECT * 
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'Auditing';
GO

/* This method uses the sys.schemas catalog and links
   the names of the database users and server logins */
SELECT s.name AS 'Schema Name'
, db.name AS 'Database User Name'
, svr.name AS 'SQL Server Login Name'
FROM sys.schemas s
/* Obtains the name of the database user */
   INNER JOIN sys.database_principals db
      ON s.principal_id = db.principal_id
/* Obtains the name of the server login */
      INNER JOIN sys.server_principals svr
         ON db.sid = svr.sid
WHERE s.name = 'Auditing'
ORDER BY s.name

请参阅

概念

权限层次结构
主体

其他资源

CREATE SCHEMA (Transact-SQL)
ALTER SCHEMA (Transact-SQL)
ALTER AUTHORIZATION (Transact-SQL)
DROP SCHEMA (Transact-SQL)
sys.schemas (Transact-SQL)
CREATE USER (Transact-SQL)
ALTER USER (Transact-SQL)
对发布数据库进行架构更改

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2006 年 12 月 12 日

更改的内容:
  • 添加了新示例、有关使用构架的详细信息以及新链接。

2006 年 7 月 17 日

更改的内容:
  • 大幅度重新组织了主题。