ALTER SCHEMA (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库

在架构之间传输安全对象。

Transact-SQL 语法约定

语法

-- Syntax for SQL Server and Azure SQL Database  

ALTER SCHEMA schema_name   
   TRANSFER [ <entity_type> :: ] securable_name   
[;]  

<entity_type> ::=  
    {  
    Object | Type | XML Schema Collection  
    }  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric

ALTER SCHEMA schema_name   
   TRANSFER [ OBJECT :: ] securable_name   
[;]  

参数

schema_name

当前数据库中的目标架构。 安全对象将移动到此架构中。 不能或 SYSINFORMATION_SCHEMA

<entity_type>

要为其更改所有者的实体的类。 Object 是默认值。

securable_name

要移动到架构范围内的安全对象的一部分或两部分名称。

备注

用户与架构完全分离。 架构不等同于数据库用户。 使用 系统目录视图 标识数据库用户和架构之间的任何差异。

ALTER SCHEMA 仅可用于在同一数据库中的架构之间移动安全对象。 若要更改或删除架构中的安全对象,请使用特定于该安全对象的 ALTER 或 DROP 语句。

如果对 securable_name 使用了由一部分组成的名称,则将使用当前生效的名称解析规则查找该安全对象。

当安全对象移动到新架构时,将删除与安全对象关联的所有权限。 如果显式设置了安全对象的所有者,则所有者保持不变。 如果安全对象的所有者已设置为 SCHEMA OWNER,则该所有者将保持为 SCHEMA OWNER;但移动之后,SCHEMA OWNER 将解析为新架构的所有者。 principal_id新所有者将是 NULL

重要

如果用于ALTER SCHEMA将存储过程、函数、视图或触发器传输到另一个架构,则它不会更改 sys.sql_modules 目录视图列中对象的definition架构名称(如果存在)或OBJECT_DEFINITION内置函数的结果。 因此, ALTER SCHEMA 不应用于移动这些对象类型。 而是删除对象,然后在新架构中重新创建该对象。

移动表或同义词不会自动更新对该对象的引用。 必须手动修改引用已移动对象的任何对象。 例如,如果移动了某个表,并且触发器中引用了该表,则必须修改触发器以反映新的架构名称。 请使用 sys.sql_expression_dependencies 列出该对象上的依赖关系,然后再进行移动。

若要使用 SQL Server Management Studio 更改表的架构,请在对象资源管理器中右键单击该表,然后选择“ 设计”。 按 F4 以打开“属性”窗口。 在“架构”框中,选择新架构。

ALTER SCHEMA 使用架构级别锁。

谨慎

在 Fabric SQL 分析终结点中,不支持通过 T-SQL 在架构之间传输表。 它可能会对 OneLake 和 SQL 分析终结点之间的同步作产生负面影响。

权限

若要从另一个架构中传输安全对象,当前用户必须拥有对该安全对象(非架构)的 CONTROL 权限,并拥有对目标架构的 ALTER 权限。

如果已为安全对象指定 EXECUTE AS OWNER,且所有者已设置为 SCHEMA OWNER,则用户还必须拥有对目标架构所有者的 IMPERSONATE 权限。

在移动安全对象后,将删除与所传输的安全对象相关联的所有权限。

示例

答: 转移表的所有权

以下示例通过将表 HumanResources 从架构 Address 传输到 Person 架构来修改架构 HumanResources

USE AdventureWorks2022;  
GO  
ALTER SCHEMA HumanResources TRANSFER Person.Address;  
GO  

B. 转让类型的所有权

以下示例在 Production 架构中创建一个类型,然后将该类型传递到 Person 架构。

USE AdventureWorks2022;  
GO  

CREATE TYPE Production.TestType FROM [VARCHAR](10) NOT NULL ;  
GO  

-- Check the type owner.  
SELECT sys.types.name, sys.types.schema_id, sys.schemas.name  
    FROM sys.types JOIN sys.schemas   
        ON sys.types.schema_id = sys.schemas.schema_id   
    WHERE sys.types.name = 'TestType' ;  
GO  

-- Change the type to the Person schema.  
ALTER SCHEMA Person TRANSFER type::Production.TestType ;  
GO  

-- Check the type owner.  
SELECT sys.types.name, sys.types.schema_id, sys.schemas.name  
    FROM sys.types JOIN sys.schemas   
        ON sys.types.schema_id = sys.schemas.schema_id   
    WHERE sys.types.name = 'TestType' ;  
GO  

示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

C. 转移表的所有权

下面的示例在 Region 架构中创建一个表 dbo,创建一个 Sales 架构,然后将 Region 表从 dbo 架构移动到 Sales 架构。

CREATE TABLE dbo.Region   
    (Region_id INT NOT NULL,  
    Region_Name CHAR(5) NOT NULL)  
WITH (DISTRIBUTION = REPLICATE);  
GO  

CREATE SCHEMA Sales;  
GO  

ALTER SCHEMA Sales TRANSFER OBJECT::dbo.Region;  
GO