适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Microsoft Fabric中的SQL分析端点
Microsoft Fabric中的仓库
Microsoft Fabric中的SQL数据库
更改安全对象的所有权。
Note
Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。
Syntax
-- 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
}
Note
Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。
Arguments
<class_type> 更改其所有者的实体的安全对象类。 OBJECT 是默认值。
| Class | Product |
|---|---|
| OBJECT | 适用于:SQL Server 2008 (10.0.x)及以后版本,Azure SQL 数据库,Azure Synapse Analytics。 |
| 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。 |
| 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为 *principal_name-,表示该对象应归拥有该对象模式的主体所有。
Remarks
ALTER AUTHORIZATION 可以用来变更任何有所有者实体的所有权。 数据库包含的实体的所有权,可以转移给任何数据库级的主体。 服务器级实体的所有权只能转移给服务器级主体。
Important
从SQL Server 2005(9.x)开始,用户可以拥有一个对象,或者TYPE该对象被另一个数据库用户拥有的模式所包含。 这是对早期版本的 SQL Server的行为的更改。 有关详细信息,请参阅 OBJECTPROPERTY (Transact-SQL) 和 TYPEPROPERTY (Transact-SQL)。
以下包含在架构中、类型为“object”的实体的所有权可以转移:表、视图、函数、过程、队列和同义词。
不能传输以下实体的所有权:链接服务器、统计信息、约束、规则、默认值、触发器、Service Broker 队列、凭据、分区函数、分区方案、数据库主密钥、服务主密钥和事件通知。
以下安全对象类的成员所有权不能进行转移:服务器、登录、用户、应用程序角色和列。
SCHEMA OWNER 选项仅在你转让包含 schema 实体的所有权时有效。 SCHEMA 所有者会将实体的所有权转让给其所处模式的所有者。 只有类为OBJECT的TYPEXML SCHEMA COLLECTION实体,或是包含模式的实体。
如果目标实体不是数据库,且该实体正被转移给新的所有者,则该目标的所有权限将被删除。
Note
架构不等同于数据库用户。 使用 系统目录视图 标识数据库用户和架构之间的任何差异。
另请注意下列事项:
Important
查找对象所有者的唯一可靠的方式是查询 sys.objects 目录视图。 查找类型所有者的唯一可靠的方式是使用 TYPEPROPERTY 函数。
特殊事例和条件
下表列出了适用于更改授权的特殊事例、异常和条件。
| Class | Condition |
|---|---|
| OBJECT | 无法更改触发器、约束、规则、默认值、统计信息、系统对象、队列、索引视图或具有索引视图的表的所有权。 |
| SCHEMA | 转移所有权时,将删除没有显式所有者的架构包含对象的权限。 无法更改 sys、dbo 或 information_schema 的所有者。 |
| TYPE | 无法更改属于系统或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 语句的人要求: 如果你不是 系统管理员 固定服务器角色的成员,你必须至少拥有数据库的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 语句的人的要求: 您必须连接到目标数据库以更改该数据库的所有者。
以下类型的帐户可以更改数据库的所有者。
- 服务级别主体登录名,这是在 Azure 中创建逻辑服务器时预配的 SQL 管理员。
- 逻辑服务器的 Microsoft Entra 管理员。
- 数据库的当前所有者。
下表概述了这些要求:
| Executor | Target | Result |
|---|---|---|
| SQL Server 身份验证登录名 | SQL Server 身份验证登录名 | Success |
| SQL Server 身份验证登录名 | Microsoft Entra 用户 | Fail |
| Microsoft Entra 用户 | SQL Server 身份验证登录名 | Success |
| Microsoft Entra 用户 | Microsoft Entra 用户 | Success |
若要验证数据库的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角色的成员。
以 Microsoft Entra 管理员身份登录到 SQL Server,并将数据库的所有者更改为禁用的 SQL Server 身份验证登录名。 例如,在用户数据库中执行:
ALTER AUTHORIZATION ON database::testdb TO DisabledLogin;创建一个应拥有数据库的 Microsoft Entra 组,并将其作为用户添加到用户数据库。 例如:
CREATE USER [mydbogroup] FROM EXTERNAL PROVIDER;在用户数据库中,将表示 Microsoft Entra 组的用户添加到 db_owner 固定数据库角色。 例如:
ALTER ROLE db_owner ADD MEMBER mydbogroup;
现在,mydbogroup 成员可将数据库作为 db_owner 角色的成员进行集中管理。
- 从 Microsoft Entra 组中删除此组的成员时,会自动丢失此数据库的 dbo 权限。
- 同样,如果将新成员添加到
mydbogroupMicrosoft Entra 组,则它们会自动获取此数据库的 dbo 访问权限。
若要检查特定用户是否具有有效的 dbo 权限,请让该用户执行以下语句:
SELECT IS_MEMBER ('db_owner');
返回值 1 表示该用户是角色的成员。
Permissions
要求具有实体的 TAKE OWNERSHIP 权限。 如果新所有者不是执行该语句的用户,那么:1) 如果新所有者是用户或登录名,则要求具有该所有者的 IMPERSONATE 权限;2) 如果新所有者是角色,则要求具有该角色的成员身份或该角色的 ALTER 权限;3) 如果新所有者是应用程序角色,则要求具有该应用程序角色的 ALTER 权限。
Examples
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. 更改表所有者
下面的每个示例都将 Sprockets 数据库中 Parts 表的所有者更改为数据库用户 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)及以后版本的 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];