學習如何使用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
架構已從數據庫中刪除。