共用方式為


ALTER SCHEMA (Transact-SQL)

在結構描述之間傳送安全性實體。

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

語法

ALTER SCHEMA schema_name 
   TRANSFER [ <entity_type> :: ] securable_name [;]

<entity_type> ::=
    {
        Object | Type | XML Schema Collection
    }

引數

  • schema_name
    這是安全性實體要移至的目前資料庫中的結構描述名稱。不可以是 SYS 或 INFORMATION_SCHEMA。

  • <entity_type>
    這是變更擁有者的實體類別。物件是預設值。

  • securable_name
    這是要移至結構描述的結構描述內含安全性實體之一部分或兩部分名稱。

備註

使用者和結構描述完全分隔。如需詳細資訊,請參閱<使用者結構描述分隔>。

ALTER SCHEMA 只能用來移動相同資料庫中結構描述之間的安全性實體。若要變更或卸除結構描述內的安全性實體,請使用該安全性實體特定的 ALTER 或 DROP 陳述式。

如果 securable_name 使用一部分名稱,則會使用目前使用的名稱解析規則來尋找該安全性實體。

當安全性實體移至新結構描述時,將卸除與這個安全性實體相關聯的所有權限。如果已明確設定安全性實體的擁有者,該擁有者將保持不變。如果安全性實體的擁有者已設為 SCHEMA OWNER,該擁有者將維持為 SCHEMA OWNER;不過,在移動之後,SCHEMA OWNER 將解析為新結構描述的擁有者。新擁有者的 principal_id 會是 NULL。

若要使用 SQL Server Management Studio 來變更資料表或檢視表的結構描述,請在 [物件總管] 中,以滑鼠右鍵按一下資料表或檢視表,然後按一下 [設計]。按下 F4 開啟 [屬性] 視窗。在 [結構描述] 方塊中,選取新的結構描述。

警告注意事項注意

從 SQL Server 2005 開始,結構描述的行為已經變更。結果是,假設結構描述相當於資料庫使用者的程式碼可能不會傳回正確的結果。不應該在曾經使用下列任何一個 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 中所導入的主體和結構描述的分隔。如需目錄檢視的詳細資訊,請參閱目錄檢視 (Transact-SQL)。

權限

若要從另一個結構描述傳送安全性實體,目前使用者必須對安全性實體 (而非結構描述) 具有 CONTROL 權限,並對目標結構描述具有 ALTER 權限。

如果安全性實體上有 EXECUTE AS OWNER 規格,且擁有者設為 SCHEMA OWNER,則該使用者也必須對目標結構描述的擁有者具有 IMPERSONATION 權限。

移動要傳送的安全性實體時,將會卸除與該安全性實體相關聯的所有權限。

範例

A. 傳送資料表的擁有權

下列範例會將 Person 結構描述中的 Address 資料表傳送到 HumanResources 結構描述中,以修改這個結構描述。

USE AdventureWorks2008R2;
GO
ALTER SCHEMA HumanResources TRANSFER Person.Address;
GO

B. 傳送某個類型的擁有權

下列範例會在 Production 結構描述中建立某個類型,然後將此類型傳送至 Person 結構描述。

USE AdventureWorks2008R2;
GO

CREATE TYPE Production.TestType FROM [varchar](10) NOT NULL ;
GO

-- Check the type owner.
SELECT sys.types.name, sys.types.schema_id, sys.schemas.name
    FROM sys.types JOIN sys.schemas 
        ON sys.types.schema_id = sys.schemas.schema_id 
    WHERE sys.types.name = 'TestType' ;
GO

-- Change the type to the Person schema.
ALTER SCHEMA Person TRANSFER type::Production.TestType ;
GO

-- Check the type owner.
SELECT sys.types.name, sys.types.schema_id, sys.schemas.name
    FROM sys.types JOIN sys.schemas 
        ON sys.types.schema_id = sys.schemas.schema_id 
    WHERE sys.types.name = 'TestType' ;
GO