ALTER AUTHORIZATION (Transact-SQL)
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库
更改安全对象的所有权。
注意
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 池不支持此语法。
注意
若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-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 语句的人员的要求: 必须连接到目标数据库才能更改数据库的所有者。
以下类型的帐户可以更改数据库的所有者。
- 服务级别主体登录名,这是在 Azure 中创建逻辑服务器时预配的 SQL 管理员。
- 逻辑服务器的 Microsoft Entra 管理员。
- 数据库的当前所有者。
下表概述了这些要求:
执行者 | 目标 | 结果 |
---|---|---|
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角色的成员。
以 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 权限。
- 同样,如果将新成员添加到
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)
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈