适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
分析平台系统 (PDW)
Microsoft Fabric 中的 SQL 分析端点
Microsoft Fabric 中的仓库
在当前数据库中创建架构。 该CREATE SCHEMA
事务还可以在新架构中创建表和视图,并设置GRANT
DENY
REVOKE
或对这些对象的权限。
语法
SQL Server 和 Azure SQL 数据库 的语法。
CREATE SCHEMA schema_name_clause [ <schema_element> [ ...n ] ]
<schema_name_clause> ::=
{
schema_name
| AUTHORIZATION owner_name
| schema_name AUTHORIZATION owner_name
}
<schema_element> ::=
{
table_definition | view_definition | grant_statement |
revoke_statement | deny_statement
}
Azure Synapse Analytics 和并行数据仓库的语法。
CREATE SCHEMA schema_name [ AUTHORIZATION owner_name ] [;]
参数
schema_name
指定数据库中架构的名称。
AUTHORIZATION owner_name
指定将拥有架构的数据库级主体的名称。 此主体可能拥有其他架构,并且可能不会使用当前架构作为其默认架构。
table_definition
指定在 CREATE TABLE
架构中创建表的语句。 执行此语句的主体必须具有 CREATE TABLE
对当前数据库的权限。
view_definition
指定在 CREATE
架构中创建视图的 VIEW 语句。 执行此语句的主体必须具有 CREATE
当前数据库的 VIEW 权限。
grant_statement
指定一个 GRANT
语句,该语句授予除新架构以外的任何安全对象的权限。
revoke_statement
指定一个 REVOKE
语句,该语句撤消除新架构以外的任何安全对象的权限。
deny_statement
指定一个 DENY
语句,该语句拒绝对除新架构以外的任何安全对象的权限。
备注
仅允许包含 CREATE SCHEMA AUTHORIZATION
但未指定名称的语句以实现向后兼容性。 该语句不会导致错误,但不会创建架构。
CREATE SCHEMA
可以创建架构、它包含的表和视图,或者GRANT
REVOKE
DENY
对单个语句中任何安全对象的权限。 必须将此语句作为单独的批处理执行。 语句 CREATE SCHEMA
创建的对象是在创建的架构中创建的。
CREATE SCHEMA
事务是原子事务。 如果在执行 CREATE SCHEMA
语句期间发生任何错误,则不会创建任何指定的安全对象,也不会授予任何权限。
可以列出要按任意顺序创建 CREATE SCHEMA
的安全对象,但引用其他视图的视图除外。 在这种情况下,被引用的视图必须在引用它的视图之前创建。
因此, GRANT
语句可以在创建对象本身之前授予对对象的权限,也可以在 CREATE VIEW
创建视图所引用的表的语句之前 CREATE TABLE
显示语句。 此外, CREATE TABLE
语句还可以将外键声明为稍后在 CREATE SCHEMA
语句中定义的表。
注意
DENY
且 REVOKE
在语句中 CREATE SCHEMA
受支持。
DENY
和 REVOKE
子句按语句中 CREATE SCHEMA
出现的顺序执行。
执行的 CREATE SCHEMA
主体可以将另一个数据库主体指定为所创建的架构的所有者。 此作需要额外的权限,如本文后面的 “权限” 部分中所述。
新架构由以下数据库级别主体之一拥有:数据库用户、数据库角色或应用程序角色。 在架构中创建的对象由架构的所有者拥有,并在其中sys.objects
具有 nullprincipal_id
。 可以将架构包含对象的所有权转让给任何数据库级主体,但架构所有者始终保留 CONTROL
对架构中对象的权限。
注意
架构不等同于数据库用户。 使用 系统目录视图 标识数据库用户和架构之间的任何差异。
隐式架构和用户创建
注意
Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。
在某些情况下,用户可以在没有数据库用户帐户(数据库中的数据库主体)的情况下使用数据库。 这种情况可能发生在以下情况下:
登录名具有
CONTROL SERVER
特权。Windows 用户没有单个数据库用户帐户(数据库中的数据库主体),但访问数据库作为具有数据库用户帐户(Windows 组的数据库主体)的 Windows 组的成员。
Microsoft Entra 用户没有单个数据库用户帐户(数据库中的数据库主体),但访问数据库作为具有数据库用户帐户的 Microsoft Entra 组的成员(Microsoft Entra 组的数据库主体)。
当没有数据库用户帐户的用户在不指定现有架构的情况下创建对象时,会自动在该用户的数据库中创建数据库主体和默认架构。 创建的数据库主体和架构的名称与连接到 SQL Server 时使用的名称相同(SQL Server 身份验证登录名或 Windows 用户名)。
若要允许基于 Windows 组的用户创建和拥有对象,此行为很有必要。 但是,这可能会导致意外地创建架构和用户。 为了避免隐式创建用户和架构,请尽可能显式创建数据库主体和分配默认架构。 或者,在数据库中创建对象时,使用由两部分或三部分组成的对象名称显式声明现有架构。
SQL 数据库上无法隐式创建 Microsoft Entra 用户。 由于从外部提供程序创建 Microsoft Entra 用户必须在 Microsoft Entra ID 中检查用户的状态,创建用户失败并出现错误 2760: The specified schema name "<user@domain>" either does not exist or you do not have permission to use it.
然后错误 2759: CREATE SCHEMA failed due to previous errors.
尝试创建或更改架构会导致错误 15151: Cannot find the user '', because it does not exist or you do not have permission.
,后跟错误 2759。 若要解决这些错误,请从外部提供程序创建 Microsoft Entra 用户,或更改 Microsoft Entra 组以分配默认架构。 然后,重新运行创建对象的语句。
在 Microsoft Fabric 中的 SQL 分析终结点和仓库中,架构名称不能包含 /
或 \
以 a .
结尾。
弃用通知
CREATE SCHEMA
目前支持不指定架构名称的语句以实现向后兼容性。 这些语句实际上不会在数据库中创建架构,但它们确实会创建表和视图,并授予权限。 主体不需要 CREATE SCHEMA
执行此早期形式的 CREATE SCHEMA
权限,因为不会创建任何架构。 此功能将从 SQL Server 的未来版本中删除。
权限
需要对数据库拥有 CREATE SCHEMA
权限。
若要在语句中创建 CREATE SCHEMA
指定的对象,用户必须具有相应的 CREATE
权限。
若要将其他用户指定为所创建的架构的所有者,调用方必须具有 IMPERSONATE
该用户的权限。 如果将数据库角色指定为所有者,则调用方必须具有下列任一角色:角色的成员身份或 ALTER
角色的权限。
对于向后兼容的语法,不会检查任何 CREATE SCHEMA
权限,因为未创建任何架构。
示例
答: 创建架构并授予权限
下面的示例将创建由 Sprockets
拥有的、包含表 Annik
的 NineProngs
架构。 该语句向 SELECT
授予 Mandar
权限,而对 SELECT
拒绝授予 Prasanna
权限。
Sprockets
并在 NineProngs
单个语句中创建。
USE AdventureWorks2022;
GO
CREATE SCHEMA Sprockets AUTHORIZATION Annik
CREATE TABLE NineProngs
(
source INT,
cost INT,
partnumber INT
)
GRANT SELECT ON SCHEMA::Sprockets TO Mandar
DENY SELECT ON SCHEMA::Sprockets TO Prasanna;
GO
示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)
B. 在架构中创建架构和表
以下示例将创建架构 Sales
,然后在该架构中创建表 Sales.Region
。
CREATE SCHEMA Sales;
GO
CREATE TABLE Sales.Region
(
Region_id INT NOT NULL,
Region_Name CHAR (5) NOT NULL
)
WITH (DISTRIBUTION = REPLICATE);
GO
C. 设置架构的所有者
以下示例创建一个 Production
架构,并将其设置为 Mary
所有者。
CREATE SCHEMA Production AUTHORIZATION [Contoso\Mary];
GO