ALTER AUTHORIZATION (Transact-SQL)

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 中的 SQL 终结点 Microsoft Fabric 中的仓库 Microsoft Fabric SQL 数据库

更改安全对象的所有权。

Transact-SQL 语法约定

注意

Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。

语法

-- Syntax for SQL Server
ALTER AUTHORIZATION
    ON [ <class_type>:: ] entity_name
    TO { principal_name | SCHEMA OWNER }
    [;]

<class_type> ::=
     {
      OBJECT | ASSEMBLY | ASYMMETRIC KEY | AVAILABILITY GROUP | CERTIFICATE
    | CONTRACT | TYPE | DATABASE | ENDPOINT | FULLTEXT CATALOG
    | FULLTEXT STOPLIST | MESSAGE TYPE | REMOTE SERVICE BINDING
    | ROLE | ROUTE | SCHEMA | SEARCH PROPERTY LIST | SERVER ROLE
    | SERVICE | SYMMETRIC KEY | XML SCHEMA COLLECTION
     }
-- Syntax for SQL Database

ALTER AUTHORIZATION
    ON [ <class_type>:: ] entity_name
    TO { principal_name | SCHEMA OWNER }
    [;]

<class_type> ::=
     {
    OBJECT | ASSEMBLY | ASYMMETRIC KEY | CERTIFICATE
     | TYPE | DATABASE | FULLTEXT CATALOG
     | FULLTEXT STOPLIST
     | ROLE | SCHEMA | SEARCH PROPERTY LIST
     | SYMMETRIC KEY | XML SCHEMA COLLECTION
     }
-- Syntax for Azure Synapse Analytics and Microsoft Fabric

ALTER AUTHORIZATION ON
     [ <class_type> :: ] <entity_name>
     TO { principal_name | SCHEMA OWNER }
    [;]

    <class_type> ::= {
    SCHEMA
     | OBJECT
    }

    <entity_name> ::=
    {
    schema_name
     | [ schema_name. ] object_name
    }
-- Syntax for Parallel Data Warehouse

ALTER AUTHORIZATION ON
     [ <class_type> :: ] <entity_name>
     TO { principal_name | SCHEMA OWNER }
    [;]

<class_type> ::= {
    DATABASE
     | SCHEMA
     | OBJECT
    }

<entity_name> ::=
    {
    database_name
     | schema_name
     | [ schema_name. ] object_name
    }

注意

Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。

参数

<class_type> 更改其所有者的实体的安全对象类。 OBJECT 是默认值。

Products
OBJECT 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库、Azure Synapse Analytics、Analytics Platform System (PDW)。
ASSEMBLY 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。
ASYMMETRIC KEY 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。
AVAILABILITY GROUP 适用范围:SQL Server 2012 及更高版本。
CERTIFICATE 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。
CONTRACT 适用于:SQL Server 2008 (10.0.x) 及更高版本。
DATABASE 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。 有关详细信息,请参阅用于数据库的 ALTER AUTHORIZATION
ENDPOINT 适用于:SQL Server 2008 (10.0.x) 及更高版本。
FULLTEXT CATALOG 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。
FULLTEXT STOPLIST 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。
MESSAGE TYPE 适用于:SQL Server 2008 (10.0.x) 及更高版本。
REMOTE SERVICE BINDING 适用于:SQL Server 2008 (10.0.x) 及更高版本。
ROLE 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。
ROUTE 适用于:SQL Server 2008 (10.0.x) 及更高版本。
SCHEMA 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库、Azure Synapse Analytics、Analytics Platform System (PDW)。
SEARCH PROPERTY LIST 适用范围:SQL Server 2012 (11.x) 及更高版本、Azure SQL 数据库。
SERVER ROLE 适用于:SQL Server 2008 (10.0.x) 及更高版本。
SERVICE 适用于:SQL Server 2008 (10.0.x) 及更高版本。
SYMMETRIC KEY 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。
TYPE 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。
XML SCHEMA COLLECTION 适用于:SQL Server 2008 (10.0.x) 及更高版本、Azure SQL 数据库。

entity_name 是实体名称。

principal_name | SCHEMA OWNER:将拥有实体的安全主体的名称。 数据库对象必须为数据库主体、数据库用户或角色所拥有。 服务器对象(如数据库)必须为服务器主体(登录名)所拥有。 指定 SCHEMA OWNER 作为 *principal_name,以指明对象应该由拥有对象架构的主体拥有。

备注

ALTER AUTHORIZATION 可用于更改任何具有所有者的实体的所有权。 数据库包含的实体的所有权,可以转移给任何数据库级的主体。 服务器级实体的所有权只能转移给服务器级主体。

重要

从 SQL Server 2005 (9.x) 开始,用户可以拥有由另一个数据库用户拥有的架构所包含的 OBJECT 或 TYPE。 这是对早期版本的 SQL Server的行为的更改。 有关详细信息,请参阅 OBJECTPROPERTY (Transact-SQL)TYPEPROPERTY (Transact-SQL)

以下包含在架构中、类型为“object”的实体的所有权可以转移:表、视图、函数、过程、队列和同义词。

不能传输以下实体的所有权:链接服务器、统计信息、约束、规则、默认值、触发器、Service Broker 队列、凭据、分区函数、分区方案、数据库主密钥、服务主密钥和事件通知。

以下安全对象类的成员所有权不能进行转移:服务器、登录、用户、应用程序角色和列。

仅当转移架构包含的实体的所有权时,SCHEMA OWNER 选项才有效。 SCHEMA OWNER 将实体所有权转移给它所在的架构所有者。 只有类 OBJECT、TYPE 或 XML SCHEMA COLLECTION 的实体是架构包含的。

如果目标实体不是数据库,且该实体正被转移给新的所有者,则该目标的所有权限将被删除。

注意

在 SQL Server 2005 (9.x) 中,架构的行为与早期版本的 SQL Server 中的行为不同。 假设架构与数据库用户等效的代码可能不会返回正确的结果。 旧目录视图(包括 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 (9.x) 中引入的使主体和架构分离的方法。 有关目录视图的详细信息,请参阅目录视图 (Transact-SQL)

另请注意下列事项:

重要

查找对象所有者的唯一可靠的方式是查询 sys.objects 目录视图。 查找类型所有者的唯一可靠的方式是使用 TYPEPROPERTY 函数。

特殊事例和条件

下表列出了适用于更改授权的特殊事例、异常和条件。

条件
OBJECT 无法更改触发器、约束、规则、默认值、统计信息、系统对象、队列、索引视图或具有索引视图的表的所有权。
SCHEMA 转移所有权时,将删除没有显式所有者的架构包含对象的权限。 无法更改 sys、dbo 或 information_schema 的所有者。
TYPE 无法更改属于 sys 或 information_schema 的 TYPE 的所有权。
CONTRACT、MESSAGE TYPE 或 SERVICE 无法更改系统实体的所有权。
SYMMETRIC KEY 无法更改全局临时密钥的所有权。
CERTIFICATE 或 ASYMMETRIC KEY 无法将这些实体的所有权转移给角色或组。
ENDPOINT 主体必须为登录名。

对数据库执行 ALTER AUTHORIZATION

对于 SQL Server

对新所有者的要求:新所有者主体必须是以下项之一:

  • SQL Server 身份验证登录名。
  • 表示 Windows 用户(而不是组)的 Windows 身份验证登录名。
  • 表示 Windows 组的 Windows 用户,通过 Windows 身份验证登录名进行身份验证。

对执行 ALTER AUTHORIZATION 语句的人员的要求: 如果不是 sysadmin 固定服务器角色的成员,则必须至少对数据库具有 TAKE OWNERSHIP 权限和对新所有者用户名具有 IMPERSONATE 权限。

对于 Azure SQL 数据库

对新所有者的要求:新所有者主体必须是以下项之一:

  • SQL Server 身份验证登录名。
  • Microsoft Entra ID 中存在的联合用户(而不是组)。
  • 托管用户(而不是组)或Microsoft Entra ID 中显示的应用程序。

如果新所有者是 Microsoft Entra 用户,则它不能作为新所有者将成为新数据库所有者(dbo)的数据库中的用户存在。 在执行 ALTER AUTHORIZATION 语句,将数据库所有权更改为新用户之前,必须先从数据库中删除 Microsoft Entra 用户。 有关使用SQL 数据库配置 Microsoft Entra 用户的详细信息,请参阅“配置Microsoft Entra 身份验证”。

对执行 ALTER AUTHORIZATION 语句的人员的要求: 必须连接到目标数据库才能更改数据库的所有者。

以下类型的帐户可以更改数据库的所有者。

下表概述了这些要求:

执行者 目标 结果
SQL Server 身份验证登录名 SQL Server 身份验证登录名 Success
SQL Server 身份验证登录名 Microsoft Entra 用户 未通过
Microsoft Entra 用户 SQL Server 身份验证登录名 Success
Microsoft Entra 用户 Microsoft Entra 用户 成功

若要验证数据库的Microsoft Entra 所有者,在用户数据库中执行以下 Transact-SQL 命令(在本例 testdb中)。

SELECT CAST(owner_sid as uniqueidentifier) AS Owner_SID
FROM sys.databases
WHERE name = 'testdb';

输出将是 GUID(如 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXX),对应于作为数据库所有者分配的 Microsoft Entra 用户或服务主体的对象 ID。 可以通过在 Microsoft Entra ID 中检查用户的对象 ID 来验证这一点。 如果 SQL Server 身份验证登录名用户是数据库所有者,请在 master 数据库中执行以下语句以验证数据库所有者:

SELECT d.name, d.owner_sid, sl.name
FROM sys.databases AS d
JOIN sys.sql_logins AS sl
ON d.owner_sid = sl.sid;

最佳做法

不使用 Microsoft Entra 用户作为数据库的单个所有者,而是使用 Microsoft Entra 组作为db_owner固定数据库角色的成员。 以下步骤演示如何将禁用的登录名配置为数据库所有者,并将Microsoft Entra 组(mydbogroup)设置为db_owner角色的成员

  1. 以 Microsoft Entra 管理员身份登录到 SQL Server,并将数据库的所有者更改为禁用的 SQL Server 身份验证登录名。 例如,在用户数据库中执行:

    ALTER AUTHORIZATION ON database::testdb TO DisabledLogin;
    
  2. 创建一个应拥有数据库的 Microsoft Entra 组,并将其作为用户添加到用户数据库。 例如:

    CREATE USER [mydbogroup] FROM EXTERNAL PROVIDER;
    
  3. 在用户数据库中,将表示 Microsoft Entra 组的用户添加到 db_owner 固定数据库角色。 例如:

    ALTER ROLE db_owner ADD MEMBER mydbogroup;
    

现在,mydbogroup 成员可将数据库作为 db_owner 角色的成员进行集中管理。

  • 从 Microsoft Entra 组中删除此组的成员时,会自动丢失此数据库的 dbo 权限。
  • 同样,如果将新成员添加到 mydbogroup Microsoft Entra 组,则它们会自动获取此数据库的 dbo 访问权限。

若要检查特定用户是否具有有效的 dbo 权限,请让该用户执行以下语句:

SELECT IS_MEMBER ('db_owner');

返回值 1 表示该用户是角色的成员。

权限

要求具有实体的 TAKE OWNERSHIP 权限。 如果新所有者不是执行该语句的用户,那么:1) 如果新所有者是用户或登录名,则要求具有该所有者的 IMPERSONATE 权限;2) 如果新所有者是角色,则要求具有该角色的成员身份或该角色的 ALTER 权限;3) 如果新所有者是应用程序角色,则要求具有该应用程序角色的 ALTER 权限。

示例

A. 转移表的所有权

以下示例将 Sprockets 表的所有权转移给 MichikoOsada 用户。 该表位于 Parts 架构内。

ALTER AUTHORIZATION ON OBJECT::Parts.Sprockets TO MichikoOsada;
GO

该查询可能如下所示:

ALTER AUTHORIZATION ON Parts.Sprockets TO MichikoOsada;
GO

如果语句中不包含对象架构,数据库引擎 将在用户默认架构中查找对象。 例如:

ALTER AUTHORIZATION ON Sprockets TO MichikoOsada;
ALTER AUTHORIZATION ON OBJECT::Sprockets TO MichikoOsada;

B. 将视图的所有权转移给架构所有者

以下示例将 ProductionView06 视图的所有权转移给包含它的架构的所有者。 该视图位于 Production 架构内。

ALTER AUTHORIZATION ON OBJECT::Production.ProductionView06 TO SCHEMA OWNER;
GO

C. 将架构所有权转移给用户

以下示例将 SeattleProduction11 架构的所有权转移给 SandraAlayo 用户。

ALTER AUTHORIZATION ON SCHEMA::SeattleProduction11 TO SandraAlayo;
GO

D. 将端点的所有权转移给 SQL Server 登录名

以下示例将 CantabSalesServer1 端点的所有权转移给 JaePak。 由于该端点是服务器级安全对象,因此只能将它转移给服务器级别主体。

适用于:SQL Server 2008 (10.0.x) 及更高版本。

ALTER AUTHORIZATION ON ENDPOINT::CantabSalesServer1 TO JaePak;
GO

E. 更改表所有者

下面的每个示例都将 Parts 数据库中 Sprockets 表的所有者更改为数据库用户 MichikoOsada

ALTER AUTHORIZATION ON Sprockets TO MichikoOsada;
ALTER AUTHORIZATION ON dbo.Sprockets TO MichikoOsada;
ALTER AUTHORIZATION ON OBJECT::Sprockets TO MichikoOsada;
ALTER AUTHORIZATION ON OBJECT::dbo.Sprockets TO MichikoOsada;

F. 更改数据库所有者

适用于:SQL Server 2008 (10.0.x) 及更高版本、Analytics Platform System (PDW)、SQL 数据库。

以下示例将 Parts 数据库的所有者更改为登录名 MichikoOsada

ALTER AUTHORIZATION ON DATABASE::Parts TO MichikoOsada;

G. 将数据库的所有者更改为 Microsoft Entra 用户

在以下示例中,组织中名为 cqclinic.onmicrosoft.com自定义Microsoft Entra 域的 SQL Server 的 Microsoft Entra 管理员可以使用以下命令更改数据库的 targetDB 当前所有权,并使现有Microsoft Entra 用户 richel@cqclinic.onmicorsoft.com 成为新的数据库所有者:

ALTER AUTHORIZATION ON database::targetDB TO [rachel@cqclinic.onmicrosoft.com];

另请参阅

OBJECTPROPERTY (Transact-SQL)TYPEPROPERTY (Transact-SQL)EVENTDATA (Transact-SQL)