ALTER AUTHORIZATION (Transact-SQL)

適用于:SQL Server (所有支援的版本) Azure SQL Database Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)

變更安全性實體的擁有權。

主題連結圖示Transact-SQL 語法慣例

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

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 與更早版本的 Transact-SQL 語法,請參閱舊版文件

引數

<class_type > 這是要變更擁有者之實體的安全性實體類別。 OBJECT 是預設值。

類別 Products
OBJECT 適用于:SQL Server 2008 和更新版本、Azure SQL Database、Azure Synapse Analytics、Analytics Platform System (PDW) 。
ASSEMBLY 適用于:SQL Server 2008 和更新版本,Azure SQL Database。
ASYMMETRIC KEY 適用于:SQL Server 2008 和更新版本,Azure SQL Database。
AVAILABILITY GROUP 適用于:SQL Server 2012 和更新版本。
CERTIFICATE 適用于:SQL Server 2008 和更新版本,Azure SQL Database。
CONTRACT 適用于:SQL Server 2008 和更新版本。
DATABASE 適用于:SQL Server 2008 和更新版本,Azure SQL Database。 如需詳細資訊,請參閱 資料庫的 ALTER AUTHORIZATION
端點 適用于:SQL Server 2008 和更新版本。
FULLTEXT CATALOG 適用于:SQL Server 2008 和更新版本,Azure SQL Database。
FULLTEXT STOPLIST 適用于:SQL Server 2008 和更新版本,Azure SQL Database。
MESSAGE TYPE 適用于:SQL Server 2008 和更新版本。
REMOTE SERVICE BINDING 適用于:SQL Server 2008 和更新版本。
ROLE 適用于:SQL Server 2008 和更新版本,Azure SQL Database。
ROUTE 適用于:SQL Server 2008 和更新版本。
SCHEMA 適用于:SQL Server 2008 和更新版本、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 和更新版本。
SERVICE 適用于:SQL Server 2008 和更新版本。
SYMMETRIC KEY 適用于:SQL Server 2008 和更新版本,Azure SQL Database。
TYPE 適用于:SQL Server 2008 和更新版本,Azure SQL Database。
XML SCHEMA COLLECTION 適用于:SQL Server 2008 和更新版本,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。 在曾經使用這些陳述式的任何一個資料庫中,您必須使用新的目錄檢視。 新的目錄檢視會考慮在 2005 SQL Server (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 資料庫

新擁有者的需求: 新的擁有者主體必須是下列其中一項:

  • SQL Server 驗證登入。
  • Azure AD 中存在的同盟使用者 (而非群組)。
  • Azure AD 中存在的受控使用者 (而非群組) 或應用程式。

若新的擁有者為 Azure Active Directory 使用者,它將無法在新的擁有者會成為新 DBO 的資料庫中作為使用者存在。 必須先從資料庫移除這類 Azure AD 使用者,才能執行 ALTER AUTHORIZATION 陳述式,將資料庫的擁有權變更為新的使用者。 如需使用 SQL Database 設定 Azure Active Directory 使用者的詳細資訊,請參閱使用 Azure Active Directory 驗證連線到SQL Database或Azure Synapse分析

執行 ALTER AUTHORIZATION 語句的人員需求: 您必須連線到目標資料庫,才能變更該資料庫的擁有者。

下列帳戶類型可變更資料庫的擁有者。

  • 服務層級主體登入。 (建立 SQL Database 伺服器時佈建的 SQL Azure 系統管理員。)
  • Azure SQL Server 的 Azure Active Directory 系統管理員。
  • 資料庫目前的擁有者。

下表摘要這些需求:

執行程式 目標 結果
SQL Server 驗證登入 SQL Server 驗證登入 Success
SQL Server 驗證登入 Azure AD 使用者 失敗
Azure AD 使用者 SQL Server 驗證登入 Success
Azure AD 使用者 Azure AD 使用者 Success

若要驗證資料庫的 Azure AD 擁有者,請在使用者資料庫中執行下列 Transact-SQL 命令 (在此範例中為 testdb)。

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

輸出會是識別碼 (,例如 6D8B81F6-7C79-444C-8858-4AF896C03C67) ,其對應于指派給 richel@cqclinic.onmicrosoft.com SQL Server 驗證登入使用者是資料庫擁有者的 Azure AD ObjectID 時,請在 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;

最佳做法

請使用 Azure AD 群組作為 db_owner 固定資料庫角色的成員,而非使用 Azure AD 使用者作為資料庫的個別擁有者。 下列步驟示範如何將已停用的登入設定為資料庫擁有者,並讓 Azure Active Directory 群組 (mydbogroup) 成為 db_owner 角色的成員。

  1. 以 Azure AD 系統管理員的身分登入 SQL Server,然後將資料庫的擁有者變更為已停用的 SQL Server 驗證登入。 例如,從使用者資料庫中執行:

    ALTER AUTHORIZATION ON database::testdb TO DisabledLogin;
    
  2. 建立應擁有資料庫的 Azure AD 群組,然後將其作為使用者新增至使用者資料庫。 例如:

    CREATE USER [mydbogroup] FROM EXTERNAL PROVIDER;
    
  3. 在使用者資料庫中,將表示 Azure AD 群組的使用者新增至 db_owner 固定資料庫角色。 例如:

    ALTER ROLE db_owner ADD MEMBER mydbogroup;
    

現在 mydbogroup 成員可作為 db_owner 角色的成員集中管理資料庫。

  • 當此群組的成員從 Azure AD 群組移除時,會自動喪失此資料庫的 dbo 權限。
  • 同樣的,若將新的成員新增至 mydbogroup Azure AD 群組,它們也會自動取得此資料庫的 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

如果物件架構未包含在 語句中,Database Engine 會尋找使用者預設架構中的物件。 例如:

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 和更新版本。

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 和更新版本、Analytics Platform System (PDW) ,SQL Database。

下列範例會將 Parts 資料庫的擁有者變更為 MichikoOsada 登入。

ALTER AUTHORIZATION ON DATABASE::Parts TO MichikoOsada;

G. 將 SQL Database 的擁有者變更為 Azure AD 使用者

在下列範例中,組織中具有名為 cqclinic.onmicrosoft.com 的 Active Directory SQL Server Azure Active Directory 系統管理員可以變更資料庫的 targetDB 目前擁有權,並使用下列命令將 AAD 使用者 richel@cqclinic.onmicorsoft.com 設為新的資料庫擁有者:

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

Azure AD 需要使用者名稱的括弧 []

另請參閱

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