AdventureWorks 中的架构

在 AdventureWorks 示例 OLTP 数据库中,像表、视图和过程这样的对象包含在架构中。架构可更改访问这些对象的方式。本主题简要介绍架构,说明如何在 AdventureWorks 数据库中使用架构,并提供了访问包含在架构中的对象的方法和备选方法。

AdventureWorks 中的架构

在 SQL Server 2005 及更高版本中,架构与用户是分离的:作为数据库主体,用户拥有架构,而对象则包含在架构中。有关详细信息,请参阅用户架构分离

下表说明 AdventureWorks 中所使用的架构并列出每个架构中典型的表。

架构

包含相关对象

示例

HumanResources

Adventure Works Cycles 的雇员。

Employee 表

Department 表

Person

各个客户、供应商和雇员的名称和地址。

Contact 表

Address 表

StateProvince 表

Production

由 Adventure Works Cycles 生产和销售的产品。

BillOfMaterials 表

Product 表

WorkOrder 表

Purchasing

从其采购零件和产品的供应商。

PurchaseOrderDetail 表

PurchaseOrderHeader 表

Vendor 表

Sales

与客户和销售相关的数据。

Customer 表

SalesOrderDetail 表

SalesOrderHeader 表

访问架构中包含的对象

用户始终拥有一个默认架构。该默认架构是服务器解析 DML 或 DDL 语句中指定的未限定的对象名称时搜索的架构。因此,当引用的对象包含在默认架构中时,不需要指定架构名。例如,如果 table_name 包含在默认架构中,则语句“SELECT * FROM table_name”可以成功执行。

注意注意

如果在创建用户时未指定默认架构,则默认架构为 dbo。有关详细信息,请参阅 CREATE USER (Transact-SQL)

若要访问非默认架构中的对象,则必须至少指定一个由两部分构成的标识符 (schema_name**.**object_name)。引用架构范围内的对象的所有 DDL 和 DML 语句都必须符合此要求。

下面的示例使用两条 SELECT 语句来显示默认架构以外的引用对象。假定默认架构不是 HumanResources,由于 Department 表不包含在默认架构中,第一条语句将失败。而由于第二条语句指定了包含对象的架构,因此该语句能够成功执行。

USE AdventureWorks;
GO
--This statement fails.
SELECT Name, GroupName
FROM Department;
GO
--This statement succeeds.
SELECT Name, GroupName
FROM HumanResources.Department;
GO

AdventureWorks 中架构的使用方法

在 SQL Server 联机丛书中的代码示例以及可与 SQL Server 一起安装的其他示例中,所有架构范围内的对象都指定了至少由两部分构成的标识符。不管用户的默认架构是什么,这些示例都能成功运行。

需要在自己的示例和测试中使用 AdventureWorks 的用户可能需要一种方法来指定由两部分构成的标识符。SQL Server 的 SQLServerEngineSamples.msi 中提供了一些脚本,这些脚本提供两种使用 AdventureWorks 中的架构的方法。

将对象传输到 DBO 架构

AlterSchemaToDbo.sql 脚本将 AdventureWorks 中每个架构范围内的对象传输到 dbo 架构。运行此脚本后,默认架构为 dbo 的用户在 DDL 和 DML 语句中引用 AdventureWorks 对象时,就不需要使用由两部分构成的标识符。

重要说明重要提示

执行 AlterSchemaToDbo.sql 后,除非用 dbo 替换 SQL Server 所提供的代码示例中指定的架构名或将其删除,否则这些代码示例将无法运行。

AlterSchemaFromDbo.sql 脚本将对象从 dbo 架构传输回运行 AlterSchemaToDbo.sql 脚本前它们所在的架构。

使用同义词

同义词是架构范围内的对象所具有的另一个名称。在 DDL 和 DML 语句中,指定的是同义词而不是基对象。

CreateSynonymsDbo.sql 脚本为 AdventureWorks 中每个架构范围内的对象创建一个同义词。同义词名称与基对象名称相同,但使用的是 dbo 架构。例如,HumanResources.Department 的同义词为 dbo.Department。这样做有下列优点:

  • 如果 dbo 是默认架构,则在 DDL 和 DML 语句中指定这些对象时就不需要使用由两部分构成的标识符。

  • SQL Server 提供的代码示例可以直接使用,而无需修改。

DropSynonymsDbo.sql 脚本删除 CreateSynonymsDbo.sql 脚本所创建的同义词。有关同义词的详细信息,请参阅使用同义词