热门问题
时间线
聊天
视角

綱要 (資料庫)

来自维基百科,自由的百科全书

Remove ads

綱要(英語:Schema),香港和中國大陸翻譯為模式架構,在資料庫系統中是形式語言描述的一種結構,是對象的集合,[1]可包含各種對象如:欄位關係模型視圖索引儲存程序子程式佇列觸發器資料類型序列物化視圖英語materialized view同義詞(synonym)、database link、directoryXML schema等。[2][3]

模式的益處:

  • 允許多個使用者使用一個資料庫而不會干擾其它使用者。
  • 把資料庫對象組織成邏輯組,讓它們更便於管理。
  • 第三方的應用可以放在不同的模式中,不會和其它對象的名字衝突。

Oracle資料庫實現

Oracle資料庫中,schema object是一類邏輯資料庫儲存結構英語Database storage structures[4]

Oracle的資料庫會為每個在資料庫的使用者關聯一個獨立的schema。[5]

schema包括有一堆schema objects的集合。schema objects的例子包括有:

與此同時,非schema objects可能包括[6]

  • users
  • roles
  • contexts
  • directory objects

Schema objects跟磁碟上用來儲存資料的物理檔案並沒有一對一的關連。不過,Oracle資料庫會將schema objects以虛擬的邏輯形式儲存在資料庫的表空間裡。每一件schema object的數據在物理上如同其他表空間的內容一樣,儲存在表空間所屬的其中一個datafile英語datafile裡。部分objects(例如:表、索引、叢集等)所佔的空間,資料庫管理員可控制Oracle的RDBMS可如何在表空間的datafile內如何分配與schema object。

schemas與表空間之間沒有必然的關係:表空間可以包含來自不同schema的objects,並且單個schema的object可以位於不同的表空間中。

Remove ads

SQL Server資料庫實現

SQL Server資料庫把schema譯作「綱要」。綱要是資料庫中對象的容器。綱要是形成單個命名空間的資料庫實體的集合。命名空間是一個集合,其中每個元素的名稱都是唯一的。預設綱要DBO。訪問預設綱要中的對象時,不需要指定綱要的名稱。微軟建議使用兩段式對象名稱:

 架構名.對象名

建立綱要的語句舉例:

 CREATE SCHEMA mySchema AUTHORIZATION user1
      CREATE TABLE myTable1(source int, cost int, partnumber int)
      GRANT SELECT TO user2
      Deny SELECT TO AnotherUser3;

上述語句建立一個綱要mySchema,所有者為user1,包含表myTable1,授予user2以SELECT權限,拒絕給AnotherUser3以SELECT權限。

授予/復原使用者對綱要的所有權:

GRANT INSERT ON SCHEMA ::mySchema1 To myUser2;
REVOKE INSERT ON SCHEMA ::mySchema1 To myUser2;

把對象從一個綱要移動到另一個綱要(必須同個資料庫):

ALTER SCHEMA mySchema2 TRANSFER mySchema1.myTable1;

刪除一個綱要,該綱要不能包含對象:

DROP SCHEMA mySchema3;
Remove ads

歷史

SQL Server 2000 中,資料庫使用者和綱要是隱式同一。每個資料庫使用者都是與該使用者同名的綱要的所有者。對象的所有者在功能上與包含它的綱要所有者相同。因而,SQL Server 2000 中的完全限定名稱的「綱要」也是資料庫中的使用者。

SQL Server 2005 中,綱要獨立於建立它們的資料庫使用者而存在。多個使用者可以共享一個預設綱要進行統一的名稱解析。 刪除資料庫使用者不需要重新命名該使用者綱要所包含的對象。完全限定的對象名稱現在包含四部分:server.database.schema.object。如果未定義DEFAULT_SCHEMA 選項設定和更改預設綱要,則資料庫使用者將把 dbo 作為其預設綱要。

MySQL資料庫實現

MySQL 中 Schema 等價於 資料庫。[7]

CREATE SCHEMA是CREATE DATABASE的同義詞。

PostgreSQL資料庫實現

PostgreSQL資料庫叢集可以有一個或多個命名的資料庫。使用者和使用者群組在整個叢集的範圍內是共享的,即不能有同名使用者。任何給定的客戶連接(connection)都只能訪問一個資料庫。

一個資料庫包含一個或多個命名的模式, 模式包含其它命名的對象,如表、資料類型、函式、運算子等。在不同的模式里使用同名的對象不會導致衝突。例如,schema1 和 schemaA 都可以包含叫做 mytable 的表。一個使用者可以訪問所連接的資料庫中的任意模式中的對象,只要有這個權限。

Apache Derby資料庫實現

Apache Derby資料庫(即Java DB)的任何connection的當前schema,預設是對應於該使用者名稱的一個schema。如果無使用者名稱被提供,那麼當前使用者名稱與當前schema預設是APP。

但即使當前schema被設定為使用者名稱,這個schema仍然可能不存在。一個schema只能被建立:通過CREATE SCHEMA語句顯式建立或者建立一個對象(例如表等)來隱式建立。

APP schema總是存在,不需要建立。

如果你的程式試圖訪問當前schema但該schema下沒有建立任何對象,就會遇到「schema not exists」錯誤。[8]

SQL實現

ISO/IEC 9075-1 SQL標準中將schema定義為描述符的持久命名集合(a persistent, named collection of descriptors)。

建立一個schema:

create schema demo_schema;

在指定模式里建立表:

CREATE TABLE myschema.mytable (
   ...
);

刪除一個空的schema:

drop schema myschema;

刪除一個模式以及模式裡面所有的對象:

drop schema MySchema CASCADE;

預設的pulic schema:建立表時,如果沒有指定schema,則會自動被歸屬到資料庫的「public」的模式中。下面兩種建立表的方式是等效的:

CREATE TABLE tableName(...);
CREATE TABLE public.tableName(...);
Remove ads

模式的權限

使用者預設是看不到模式中不屬於他們所有的對象。

模式權限:

  • USAGE 權限
  • CREATE 權限:在別人的模式里建立對象。預設時,每個使用者在 public 模式上有 CREATE 權限。復原這個權限:REVOKE CREATE ON public FROM PUBLIC; (第一個 "public" 是模式,第二個 "public" 意思是"所有使用者"。 第一句里它是個識別碼,而第二句里是個關鍵字,所以有不同的大小寫)

模式搜尋路徑

系統使用一個模式的列表作為搜尋路徑來解析一個表屬於哪個模式。搜尋路徑中的第一個模式是當前模式;CREATE TABLE 沒有聲明模式名的時候,新建的表屬於當前模式。

檢視搜尋路徑:

SHOW search_path; 'PostgreSQL数据库

設定搜尋路徑

SET search_path TO myschema,public; 'PostgreSQL数据库

參考文獻

參看

外部連結

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads