ALTER AUTHORIZATION (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲
變更安全性實體的擁有權。
注意
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
}
-- 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 Database、Azure Synapse Analytics、Analytics Platform System (PDW)。 |
ASSEMBLY | 適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL Database。 |
ASYMMETRIC KEY | 適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL Database。 |
AVAILABILITY GROUP | 適用於:SQL Server 2012 和更新版本。 |
CERTIFICATE | 適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL Database。 |
CONTRACT | 適用於:SQL Server 2008 (10.0.x) 和更新版本。 |
DATABASE | 適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL Database。 如需詳細資訊,請參閱資料庫的 ALTER AUTHORIZATION。 |
端點 | 適用於:SQL Server 2008 (10.0.x) 和更新版本。 |
FULLTEXT CATALOG | 適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL Database。 |
FULLTEXT STOPLIST | 適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL Database。 |
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 Database。 |
ROUTE | 適用於:SQL Server 2008 (10.0.x) 和更新版本。 |
SCHEMA | 適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL Database、Azure Synapse Analytics、Analytics Platform System (PDW)。 |
SEARCH PROPERTY LIST | 適用於:SQL Server 2012 (11.x) 和更新版本、Azure SQL Database。 |
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 Database。 |
TYPE | 適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL Database。 |
XML SCHEMA COLLECTION | 適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL Database。 |
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)。
下列「物件」類型之結構描述所包含實體的擁有權可以傳送:資料表、檢視、函數、程序、佇列和同義字。
無法轉移下列實體的擁有權:連結的伺服器、統計資料、條件約束、規則、預設值、觸發程序、Service Broker 佇列、認證、資料分割函數、資料分割配置、資料庫主要金鑰、服務主要金鑰和事件通知。
下列安全性實體類別之成員的擁有權無法傳送:伺服器、登入、使用者、應用程式角色和資料行。
當您傳送結構描述包含之實體的擁有權時,SCHEMA OWNER 選項才有效。 SCHEMA OWNER 會將實體的擁有權傳送給其所在之結構描述的擁有者。 只有 OBJECT、TYPE 或 XML SCHEMA COLLECTION 類別的實體才會包含結構描述。
如果目標實體不是資料庫,且實體要傳送給新的擁有者,則會卸除目標的所有權限。
警告
在 SQL Server 2005 (9.x) 中,結構描述的行為已經與舊版 SQL Server 中的行為不同。 假設結構描述相當於資料庫使用者的程式碼可能不會傳回正確的結果。 不應該在曾經使用下列任何一個 DDL 陳述式的資料庫中使用舊的目錄檢視 (包括 sysobjects):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 | 無法將這些實體的擁有權傳送給角色或群組。 |
端點 | 主體必須是登入。 |
資料庫的 ALTER AUTHORIZATION
若為 SQL Server
新擁有者的需求:新的擁有者主體必須是下列其中一項:
- SQL Server 驗證登入。
- 表示 Windows 使用者的 Windows 驗證登入 (而非群組)。
- 透過表示 Windows 群組之 Windows 驗證登入驗證的 Windows 使用者。
執行 ALTER AUTHORIZATION 陳述式的人員需求:若您不是 sysadmin 固定伺服器角色的成員,您必須至少擁有資料庫的 TAKE OWNERSHIP 權限,並且必須擁有新擁有者登入的 IMPERSONATE 權限。
針對 Azure SQL Database
新擁有者的需求:新的擁有者主體必須是下列其中一項:
- SQL Server 驗證登入。
- Microsoft Entra ID 中存在的同盟使用者(非群組)。
- 受控使用者(不是群組)或存在於 entra 識別碼Microsoft的應用程式。
如果新擁有者是Microsoft Entra 使用者,則新擁有者會成為新資料庫擁有者 (dbo) 的資料庫中無法以使用者身分存在。 Microsoft Entra 用戶必須先從資料庫移除,才能執行 ALTER AUTHORIZATION 語句,將資料庫擁有權變更為新的使用者。 如需使用 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 使用者或服務主體的物件標識符。 您可以在 Entra ID Microsoft 中檢查使用者的物件識別碼,以驗證此識別碼。 當 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 Database。
下列範例會將 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)