CREATE SCHEMA (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲

在目前資料庫中建立結構描述。 CREATE SCHEMA 異動也可在新結構描述中建立資料表與檢視,以及設定這些物件的 GRANT、DENY 或 REVOKE 權限。

Transact-SQL 語法慣例

Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
CREATE SCHEMA schema_name_clause [ <schema_element> [ ...n ] ]  
  
<schema_name_clause> ::=  
    {  
    schema_name  
    | AUTHORIZATION owner_name  
    | schema_name AUTHORIZATION owner_name  
    }  
  
<schema_element> ::=   
    {   
        table_definition | view_definition | grant_statement |   
        revoke_statement | deny_statement   
    }  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
CREATE SCHEMA schema_name [ AUTHORIZATION owner_name ] [;]  

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

schema_name
這是資料庫中結構描述的識別名稱。

AUTHORIZATION owner_name
指定將擁有結構描述之資料庫層級主體的名稱。 這個主體可能擁有其他結構描述,且可能不使用目前結構描述做為其預設結構描述。

table_definition
指定在結構描述中建立資料表的 CREATE TABLE 陳述式。 執行這個陳述式的主體必須具有目前資料庫的 CREATE TABLE 權限。

view_definition
指定在結構描述中建立檢視表的 CREATE VIEW 陳述式。 執行這個陳述式的主體必須具有目前資料庫的 CREATE VIEW 權限。

grant_statement
指定授與新結構描述之外任何安全性實體之權限的 GRANT 陳述式。

revoke_statement
指定撤銷新結構描述以外任何安全性實體之權限的 REVOKE 陳述式。

deny_statement
指定拒絕新結構描述以外任何安全性實體之權限的 DENY 陳述式。

備註

注意

允許包含 CREATE SCHEMA AUTHORIZATION 但不指定名稱之陳述式的目的,只是為了與舊版相容。 陳述式不會導致錯誤,但是不會建立結構描述。

CREATE SCHEMA 可以在單一陳述式中建立結構描述、其所包含的資料表和檢視表,以及任何安全性實體的 GRANT、REVOKE 或 DENY 權限。 這個陳述式必須以分隔批次來執行。 由 CREATE SCHEMA 陳述式建立的物件,會建立在將要建立之結構描述的內部。

CREATE SCHEMA 交易不可部分完成。 如果執行 CREATE SCHEMA 陳述式期間發生任何錯誤,將不會建立任何指定的安全性實體,也不會授與任何權限。

除了參考其他檢視表的檢視表之外,要用 CREATE SCHEMA 建立的安全性實體可以按任何順序排列。 在這個情況下,被參考的檢視必須建立於參考它的檢視之前。

因此,GRANT 陳述式可以在物件本身建立之前授與物件的權限,或者 CREATE VIEW 陳述式可以出現在建立檢視表所參考之資料表的 CREATE TABLE 陳述式之前。 此外,CREATE TABLE 陳述式可以宣告稍後在 CREATE SCHEMA 陳述式中所定義之資料表的外部索引鍵。

注意

CREATE SCHEMA 陳述式內支援 DENY 和 REVOKE。 DENY 和 REVOKE 子句會按其出現於 CREATE SCHEMA 陳述式中的順序來執行。

執行 CREATE SCHEMA 的主體可以指定其他資料庫主體做為要建立之結構描述的擁有者。 此時需要本主題稍後「權限」一節所描述的其他權限。

新結構描述的擁有者是下列資料庫層級主體之一:資料庫使用者、資料庫角色或應用程式角色。 在結構描述中建立的物件由結構描述擁有者擁有,其在 sys.objects 中具有 NULL principal_id。 結構描述包含物件的擁有權可以轉移到任何資料庫層級主體,但結構描述擁有者恆保有結構描述中物件的 CONTROL 權限。

警告

從 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)

建立隱含結構描述和使用者

注意

Microsoft Entra 標識符 先前稱為 Azure Active Directory (Azure AD)。

在某些情況下,使用者可以使用資料庫,但是沒有資料庫使用者帳戶 (資料庫中的資料庫主體)。 此錯誤會於下列情況發生:

  • 登入具有 CONTROL SERVER 權限。

  • Windows 使用者沒有個別的資料庫使用者帳戶 (資料庫中的資料庫主體),但是可以具有資料庫使用者帳戶 (Windows 群組的資料庫主體) 之 Windows 群組的成員身分來存取資料庫。

  • Microsoft Entra 使用者沒有個別的資料庫用戶帳戶(資料庫中的資料庫主體),但以具有資料庫用戶帳戶的 Microsoft Entra 群組成員存取資料庫(Microsoft Entra 群組的資料庫主體)。

當不具有資料庫使用者帳戶的使用者建立物件但沒有指定現有結構描述時,將會為該使用者在資料庫中自動建立資料庫主體和預設結構描述。 建立的資料庫主體與結構描述,其名稱與使用者在連線到 SQL Server 時所使用的名稱相同 (SQL Server 驗證登入名稱或 Windows 使用者名稱)。

必須有這個行為,才能允許基於 Windows 群組的使用者建立和擁有物件。 不過,它可能會導致意外建立結構描述和使用者。 為了避免隱含建立使用者和結構描述,請盡可能地明確建立資料庫主體並指派預設結構描述。 或者當在資料庫中建立物件時,使用二或三部份的物件名稱,明確指定現有的結構描述。

注意

無法在 SQL 資料庫 上隱含建立 Microsoft Entra 使用者。 由於從外部提供者建立 Microsoft Entra 使用者必須檢查 Microsoft Entra 識別碼中的用戶狀態,因此建立使用者將會失敗,並出現錯誤 2760: 指定的架構名稱 「<user_name@domain>」 不存在,或您沒有使用它的許可權。 然後錯誤 2759: CREATE SCHEMA 因為先前的錯誤而失敗。 嘗試建立或改變架構會導致錯誤 15151: 找不到使用者 '',因為它不存在或您沒有許可權。後面接著錯誤 2759。 若要解決這些錯誤,請從外部提供者建立 Microsoft Entra 使用者,或變更 Microsoft Entra 群組以指派預設架構。 然後重新執行建立 對象的語句。

在 Microsoft Fabric 中的 SQL 分析端點和倉儲中,架構名稱不能包含 /\ 結尾為 .

取代通知

目前支援不指定結構描述名稱之 CREATE SCHEMA 陳述式的目的,是為了與舊版相容。 這些陳述式實際上並不會在資料庫中建立結構描述,但是會建立資料表和檢視表,以及授與權限。 主體不需要 CREATE SCHEMA 權限來執行這個舊格式的 CREATE SCHEMA,因為不會建立任何結構描述。 未來的 SQL Server 版本將移除這項功能。

權限

需要資料庫的 CREATE SCHEMA 權限。

若要建立 CREATE SCHEMA 陳述式中指定的物件,使用者必須具有對應的 CREATE 權限。

若要指定其他使用者做為建立之結構描述的擁有者,呼叫者必須具有該使用者的 IMPERSONATE 權限。 如果指定資料庫角色做為擁有者,呼叫端必須具有下列項目之一:角色的成員資格或角色的 ALTER 權限。

注意

為了語法與舊版相容,不會檢查任何 CREATE SCHEMA 權限,因為不會建立任何結構描述。

範例

A. 建立結構描述及授與權限

下列範例會建立結構描述 Sprockets,這是由包含資料表 AnnikNineProngs 所擁有。 陳述式授與 SELECTMandar,拒絕 SELECTPrasanna。 請注意,SprocketsNineProngs 是在單一陳述式中建立。

USE AdventureWorks2022;  
GO  
CREATE SCHEMA Sprockets AUTHORIZATION Annik  
    CREATE TABLE NineProngs (source int, cost int, partnumber int)  
    GRANT SELECT ON SCHEMA::Sprockets TO Mandar  
    DENY SELECT ON SCHEMA::Sprockets TO Prasanna;  
GO   

範例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

B. 建立結構描述並在結構描述中建立資料表

下例範例會建立名為 Sales 的結構描述,然後在該結構描述中建立 Sales.Region 資料表。

CREATE SCHEMA Sales;  
GO
  
CREATE TABLE Sales.Region   
(Region_id INT NOT NULL,  
Region_Name CHAR(5) NOT NULL)  
WITH (DISTRIBUTION = REPLICATE);  
GO  

C. 設定結構描述的擁有者

下列範例會建立由 Mary 擁有的 Production 結構描述。

CREATE SCHEMA Production AUTHORIZATION [Contoso\Mary];  
GO  

另請參閱

ALTER SCHEMA (Transact-SQL)
DROP SCHEMA (Transact-SQL)
GRANT (Transact-SQL)
DENY (Transact-SQL)
REVOKE (Transact-SQL)
CREATE VIEW (Transact-SQL)
EVENTDATA (Transact-SQL)
sys.schemas (Transact-SQL)
建立資料庫結構描述