學習如何使用SQL Server CREATE SCHEMA在當前數據庫中創建新架構。
SQL Server中的架構是什么
架構是包括表,視圖,觸發器,存儲過程,索引等在內的數據庫對象的集合。架構與稱為架構所有者的用戶名相關聯,該用戶名是邏輯上相關的數據庫對象的所有者。
架構始終屬於一個數據庫。另一方面,數據庫可以具有一個或多個架構。
SQL Server中的內置架構
SQL Server提供了我們與具有相同名稱的內置數據庫用戶和角色,例如一些預先定義的架構:dbo,guest,sys,和INFORMATION_SCHEMA。
請注意,SQL Server 為系統對象保留sys和INFORMATION_SCHEMA架構,因此,您不能在這些架構中創建或刪除任何對象。
新創建的數據庫的默認架構為dbo,由dbo用戶帳戶擁有。默認情況下,當您使用CREATE USER命令創建新用戶時,該用戶將dbo作為其默認架構。
SQL Server創建架構語句概述
該創建架構語句允許您在當前數據庫中創建新的架構。
CREATE SCHEMA schema_name
[AUTHORIZATION owner_name]
用這種語法,
- 首先,在
CREATE SCHEMA子句中指定要創建的架構的名稱。 - 其次,在
AUTHORIZATION關鍵字之后指定架構的所有者。
SQL Server創建架構語句示例
以下示例顯示如何使用該CREATE SCHEMA語句創建customer_services架構:
CREATE SCHEMA customer_services; GO
請注意,該GO命令指示SQL Server Management Studio將SQL語句發送GO到要執行的服務器的語句。
執行該語句后,您可以在數據庫名稱的“ 安全性”>“架構 ” 下找到新創建的架構。

如果要列出當前數據庫中的所有架構,則可以從中查詢架構,sys.schemas如以下查詢所示:
SELECT
s.name AS schema_name,
u.name AS schema_owner
FROM
sys.schemas s
INNER JOIN sys.sysusers u ON u.uid = s.principal_id
ORDER BY
s.name;
這是輸出:

擁有customer_services架構后,您可以為架構創建對象。例如,以下語句創建一個jobs在customer_services架構中命名的新表:
CREATE TABLE jobs( job_id INT PRIMARY KEY IDENTITY, customer_id INT NOT NULL, description VARCHAR(200), created_at DATETIME2 NOT NULL );
SQL Server更改架構
如何使用SQL Server更改架構將安全對象從一種架構轉移到另一種架構。
SQL Server更改架構概述
該ALTER SCHEMA語句允許您將安全對象從架構轉移到同一數據庫中的另一個架構。
請注意,安全對象是數據庫引擎授權系統控制對其進行訪問的資源。例如,表是安全的。
下面顯示了該ALTER SCHEMA語句的語法:
ALTER SCHEMA target_schema_name TRANSFER [ 實體對象 :: ] securable_name;
- target_schema_name是當前數據庫中您要將對象移動到的架構的名稱。 請注意,它不能是SYS或INFORMATION_SCHEMA。
- 實體類型可以是對象,類型或XML架構集合。 默認為對象。 entity_type代表要為其更改所有者的實體的類。
- object_name是要移到target_schema_name中的安全對象的名稱
如果移動存儲過程,函數,視圖或觸發器,則SQL Server不會更改這些安全對象的架構名稱。 因此,建議您在新架構中刪除並重新創建這些對象,而不要使用ALTER SCHEMA語句進行移動。
如果移動對象(例如表或同義詞),SQL Server將不會自動更新這些對象的引用。您必須手動修改引用以反映新的架構名稱。例如,如果移動存儲過程中引用的表,則必須修改存儲過程以反映新的架構名稱。
SQL Server更改架構示例
首先,在dbo架構中創建一個名為office的新表:
CREATE TABLE dbo.offices ( office_id INT PRIMARY KEY IDENTITY, office_name NVARCHAR(40) NOT NULL, office_address NVARCHAR(255) NOT NULL, phone VARCHAR(20), );
INSERT INTO dbo.offices(office_name, office_address) VALUES ('Silicon Valley','400 North 1st Street, San Jose, CA 95130'), ('Sacramento','1070 River Dr., Sacramento, CA 95820');
然后,創建一個存儲過程,按辦公室ID查找辦公室:
CREATE PROC usp_get_office_by_id( @id INT ) AS BEGIN SELECT * FROM dbo.offices WHERE office_id = @id; END;
之后,將此dbo.offices表轉移到sales架構:
ALTER SCHEMA sales TRANSFER OBJECT::dbo.offices;
如果執行usp_get_office_by_id存儲過程,SQL Server將發出錯誤:

最后,手動修改存儲過程以反映新的架構:
ALTER PROC usp_get_office_by_id( @id INT ) AS BEGIN SELECT * FROM sales.offices WHERE office_id = @id; END;
SQL Server DROP架構
DROP SCHEMA語句從數據庫中刪除架構。
SQL Server刪除架構語句概述
該DROP SCHEMA語句允許您從數據庫中刪除架構。下面顯示了該DROP SCHEMA語句的語法:
DROP SCHEMA [IF EXISTS] schema_name;
使用以下語法:
- 首先,指定要刪除的架構的名稱。如果架構包含任何對象,則該語句將失敗。因此,您必須在刪除架構之前刪除架構中的所有對象。
- 其次,
IF EXISTS僅當架構存在時,才使用該選項有條件地刪除該架構。嘗試刪除不帶該IF EXISTS選項的不存在的架構將導致錯誤。
SQL Server刪除架構語句示例
首先,創建一個名為logistics的新架構:
CREATE SCHEMA logistics; GO
接下來,在logistics架構內部創建一個名為delivery的新表:
CREATE TABLE logistics.deliveries ( order_id INT PRIMARY KEY, delivery_date DATE NOT NULL, delivery_status TINYINT NOT NULL );
然后,刪除架構logistics:
DROP SCHEMA logistics;
SQL Server發出以下錯誤,因為架構不為空。
DROP TABLE logistics.deliveries;
最后,DROP SCHEMA再次發出以刪除logistics架構:
DROP SCHEMA IF EXISTS logistics;
現在,logistics架構已從數據庫中刪除。
