CREATE SCHEMA (Transact-SQL)
在当前数据库中创建架构。 CREATE SCHEMA 事务还可以在新架构内创建表和视图,并可对这些对象设置 GRANT、DENY 或 REVOKE 权限。
适用范围:SQL Server(SQL Server 2008 至当前版本),Azure SQL Database(初始版本至当前版本)。 |
语法
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
}
参数
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 语句定义表之前声明表的外键。
备注
支持在 CREATE SCHEMA 语句中使用 DENY 和 REVOKE。DENY 和 REVOKE 子句将按照它们在 CREATE SCHEMA 语句中出现的顺序执行。
执行 CREATE SCHEMA 的主体可以将另一个数据库主体指定为要创建的架构的所有者。 完成此操作需要另外的权限,如本主题下文中的“权限”部分所述。
新架构由以下数据库级别主体之一拥有:数据库用户、数据库角色或应用程序角色。 在架构内创建的对象由架构所有者拥有,这些对象在 sys.objects 中的 principal_id 为 NULL。 架构所包含对象的所有权可转让给任何数据库级主体,但架构所有者始终保留对该架构内对象的 CONTROL 权限。
备注
从 SQL Server 2005 开始,架构的行为发生了更改。因此,假设架构与数据库用户等价的代码不再返回正确的结果。旧目录视图(包括 sysobjects)不应该用在曾使用过下列任何 DDL 语句的数据库中:CREATE SCHEMA、ALTER SCHEMA、DROP SCHEMA、CREATE USER、ALTER USER、DROP USER、CREATE ROLE、ALTER ROLE、DROP ROLE、CREATE APPROLE、ALTER APPROLE、DROP APPROLE 或 ALTER AUTHORIZATION。在这类数据库中,必须改用新目录视图。新的目录视图将采用在 SQL Server 2005 中引入的使主体和架构分离的方法。有关目录视图的详细信息,请参阅目录视图 (Transact-SQL)。
在创建数据库对象时,如果您将某一有效的域主体(用户或组)指定为对象所有者,则该域主体将作为架构添加到数据库中。 这个新架构将为该域主体所拥有。
不推荐使用的声明
当前支持不指定架构名称的 CREATE SCHEMA 语句,目的是为了向后兼容。 此类语句并不在数据库中实际创建架构,但它们会创建表和视图,并授予权限。 主体不需要 CREATE SCHEMA 权限来执行这一早期形式的 CREATE SCHEMA,因为不会创建任何架构。 在 SQL Server 的未来版本中将删除此功能。
权限
需要对数据库具有 CREATE SCHEMA 权限。
若要创建在 CREATE SCHEMA 语句中指定的对象,用户必须拥有相应的 CREATE 权限。
若要指定其他用户作为所创建架构的所有者,则调用方必须具有对该用户的 IMPERSONATE 权限。 如果指定一个数据库角色作为所有者,则调用方必须拥有该角色的成员身份或对该角色拥有 ALTER 权限。
备注
对于向后兼容的语法,将不针对 CREATE SCHEMA 检查任何权限,因为不创建任何架构。
示例
下面的示例将创建由 Annik 拥有的、包含表 NineProngs 的 Sprockets 架构。 该语句向 Mandar 授予 SELECT 权限,而对 Prasanna 拒绝授予 SELECT 权限。 请注意,Sprockets 和 NineProngs 在一个语句中创建。
USE AdventureWorks2012;
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