數據庫的一些基本概念

數據庫的一些基本概念

oracle/db2/sqlserver/sybase等數據庫中,都有着實例(instance)/用戶(user)/角色(role)/架構(schema)/表空間(tablespace)等等概念。不同數據庫中,這些名詞的含義雖大同,亦有小異。

1. 數據庫(database)與實例(instance)

實例和數據庫,是數據庫系統中最大、最外層的兩個對象,幾乎所有類型的數據庫都使用了這兩個概念。

1.1 數據庫

數據庫(database)是數據的集合,使用一定的形式組織/管理內部的數據。所有數據對象(表/用戶/類型/表空間/架構/操作日誌)等等都屬於數據庫的組成部分。數據庫佔用一定的存儲空間,常以文件的形式存放在磁盤空間上;數據庫服務運行時,存儲在磁盤上的數據會被按需加載到內存當中。

如果用一座圖書館來類比的話,數據庫就是圖書館中的圖藏書大樓及其中的物體,如大樓/書籍/書架,人員信息, 用來提供各種相關功能的工具等等。

1.2 實例

實例(instance),用來獨立提供數據服務的一組進程和資源(內存/數據等)的集合,數據庫作爲數據源包含於實例之中。儘管多個實例間可能會共用一些模塊,但每個實例擁有自己的配置和資源,相互之間獨立。

一個實例就是一個處於運行狀態的圖管館系統,內有圖書大廈(數據庫),可以爲讀者/用戶提供書籍借閱等服務,也可以由工作人員/管理員購入新書籍/廢棄部分物體等。

1.2 不同數據庫間的區別

對於o/d/s/y這四種數據庫類型,數據庫和實例間的關係除了以上共同的部分外,還有着一些小區別:

  • oracle: 一個實例只能包含一個數據庫;反過來,一個數據庫可以同時被多個實例共享;一臺主機上,可以同時提供多個服務實例,多個實例間以實例名來區分(也即不同的實例可以共享同一個端口);創建一個新數據庫必須要先創建一個新的實例
  • db2: 一個實例可以同時包含多個數據庫;一個數據庫也可同時被多個實例所使用;一個節點(node, 主機)之上,可以同時運行多個實例,使用不同的端口來區分。對於db2而言,創建數據庫(create database)屬於實例級別的操作,一旦用戶聯接到一個數據庫後(connect to)後就僅能進行數據庫級別的操作,無法創建新的數據庫。因此,db2中創建數據庫的動作只能在連接到某個實例後進行(attach to)
  • sqlserver/sybase: 這倆一樣,同一主機上可同時運行多個實例,使用不同實例名稱/端口加以區分;一個實例可以包含多個數據庫;但不同實例間不能共享同一數據庫

1.4 數據庫的基礎組成部分

數據庫大多使用以下對象來組織和管理數據:

  • 表(table) : 最基本的數據組織形式。表是擁有相同數據結構的一組數據的無序集合。表由行(row)和列(column)組成。列對應於一類特定的數據類型(及長度),可以被看作是數據結構中的一個字段(field);行是實現了表數據結構實現的一個數據對象,也是數據庫中有完整意義的最小數據對象。對錶的操作包括"create/alter/drop"等
  • 索引(inex) : 索引是基於表中的某一列或某幾列作爲關鍵字對錶中的數據對象進行排序的結果。常用來加快數據查詢速度和/或用來確保表中沒有重複數據。對索引的操作包括"create/alter/drop"等
  • 視(view) : 視是一種虛擬表(virtual table)。視中不包含任何具體的數據,僅定義虛表中的數據結構。從某種角度說,視在一張/多張表中特定的字段之間建立邏輯聯繫,以表的形式提供給用戶。視由"create/alter/drop"等語句生成/更改/丟棄,視中的數據結構由select語句決定。
  • 觸發器(trigger) : 用來實現自動完成功能的控制邏輯。指定數據庫在某個事件(如select/insert等操作)發生時自動執行指定的命令。
  • 存儲過程(Stored Procedure) : 完成特定功能的一系列數據庫操作命令的集合。數據庫中一般都預置了一些系統存儲過程,也可以由用戶來創建。odsy中,存儲過程的概念並不完全相同,有一些差異或各自的細分
  • 約束(constraint) : 表中數據對象必須符合的邏輯條件
  • 表空間(table space) : 容器對象,用來將指定的關聯表/索引存放在同一塊物理存儲區域中(磁盤空間和內存空間),以加快查詢速度

2. 用戶(user)

用戶,數據庫的使用者,以字符串形式的用戶名(user name)進行區分,使用密碼(password)進行認證。一般情況下,爲了方便操作,數據庫內部還會爲每一位用戶創建一個數字標識(userid/uid/user#)。

數據庫用戶,相當於圖書館的讀者和管理人員的集合。

o/d/s/y的差別:

  • oracle: 用戶是用來連接和使用數據庫的身份標識,每位用戶可以擁有自己的權限與數據對象集合。擁有管理權限的管理員,可以使用"create user"語句創建新用戶(並指定默認表空間),使用"grant"語句授予用戶一定的權限(連接和指定操作)
  • db2: 使用操作系統級別的用戶認證機制,用戶首先是操作系統的用戶,其次纔是數據庫的用戶。因此db2中不能直接創建數據用戶,必須通過先創建操作系統用戶(組)後再使用"grant"語句向用戶或用戶所在組賦予數據庫訪問權限的方式進行
  • sqlserver: 數據庫用戶(dbuser)僅僅只針對數據庫操作而言,不能用來登陸數據庫/建立數據庫連接。必須使用專用登錄名(login name)來登錄,登錄完成後須映射爲數據庫用戶才能擁有權限對數據對象進行操作。因此,登錄名和(數據庫)用戶名之間存在的對應關係由數據庫管理員來管理。同一登錄名可映射爲多個數據庫上的不同用戶。對sqlserver,創建一個完整用戶的過程爲:
    • 使用sp_addlogin(不推薦)或"create login"語句創建一個新的登錄名(並指定默認數據庫,語言等選項)
    • 使用sp_adduser(不推薦)或"create user"語句創建一個新的數據庫用戶(dbuser)(並指定對應的登錄名,默認架構等)
    • 使用sp_addrolemember或"grant"語句爲數據庫用戶(dbuser)分配訪問權限
  • sybase:與sqlserver基本相同,不過僅能使用系統存儲過程sp_addlogin/sp_droplogin來完成創建登錄名的操作,數據庫用戶(dbuser)操作可通過系統存儲過程sp_adduser/sp_dropuser或SQL語句"create user/drop user/alter user"完成

數據庫的用戶(dbuser/password),可以理解爲使用圖書館服務的憑證。oracle/db2中的用戶憑證,既可以用來進入圖書館(connect),也可以用來辦理一定權限的操作。而sqlserver/sybase,額外需要一張門禁卡(loginname/password)才能進入圖書大樓。

3. 角色(role)

角色,數據庫安全模型中不同權限的集合,也可以擁有自己的數據對象。對於數據庫用戶來說,至爲擁有系統角色之一(一般默認爲pulic),也可以同時擁有多個角色。

幾種數據庫中,都有着一些預定的角色,用戶還可以添加/刪除自定義角色(create role, drop role),並賦予/取消他們不同的權限。(grant/revoke), 或者將一些具體的用戶添加至角色當中(od中使用grant/revoke,s使用sp_addrolemember/sp_droprolemember完成, y以上兩種方式均可)。

圖書館系統中,不同的人會有不同的身份,比如已登記的普通用戶僅僅能借閱書籍(查詢數據庫),而圖書管理人員不僅可以查閱書籍,還可進行購置/淘汰書籍等操作(添加/刪除操作等)。像館長等角色,還會擁有自己的辦公室....

4. 架構(schema)

架構(schema, 也有翻譯爲模式),命名的邏輯容器對象, 用來存放表/視/存儲過程/觸發器等基本數據對象(僅爲邏輯上的包含關係)。通常一個架構內所有數據對象都屬於同一個用戶(db user),也可以不屬於任何用戶。

對於表/視/存儲過程等等基本數據對象,從邏輯從屬關係上說,它們一定是屬於某一個schema對象所有,也即屬於某一個用戶(dbuser)所有(對於不屬於任何用戶的schema,可以認爲它們屬於無主用戶或公共用戶);從物理存放關係上看,基本數據對象存放在某一個表空間(table space)之中。

最終,一個基本數據對象(object)的完整邏輯描述爲server.database.schema.object。一次會話(session)中,用戶對所有基本數據對象的操作總是基於會話的當前server/database/schema,如某一項未指定,則使用用戶默認配置。

*對db2,server的準確名稱應該是node;
**對oracle, server/database都已經由instance指定;

4.1 oracle/db2中的架構

對於ody,創建新用戶時,隱式地也爲此用戶創建了一個同名schema,用以存放用戶所擁有的數據對象。用戶創建成功後,就不能修改自己的默認schema。用戶訪問自己同名schema以外其他架構中對象時,必須顯式給出對象所在架構名稱。不過,oracle和db2都提供了將當前會話架構由用戶架構更改爲其他架構的功能。

  • oracle : 可以通過"alter session set current_schema=xxx"將當前會話默認架構設定爲xxx,會話用戶訪問xxx時無需再指定schema。甚至可以對某個用戶的"logon"事件設定一個觸發器,在用戶登錄後自動將會話默認架構設定爲指定值。如下所示:
    CREATE OR REPLACE TRIGGER db_logon AFTER logon ON DATABASE WHEN (USER = 'username')
    BEGIN
    execute immediate 'ALTER SESSION SET CURRENT_SCHEMA = xxx';
    END;
  • db2 : 可通過"set [current] schema [=] xxx"的語句將當前會話架構切換爲xxx

4.2 SQL Server中的架構

MS在SQL Server2000及以前版本中,以schema的處理方式和其他數據庫相同,均是在創建用戶時創建同名schema, 用戶和schema隱式鏈接在一起;從sql server2005起,MS分離了schema與用戶之間的隱式鏈接關係,不再一一對應。MS對此作法的好處描述如下(用戶-架構分離)

  • 與早期版本相比,對架構及架構中包含的安全對象的權限的管理更加精細。有關詳細信息,請參閱 GRANT 架構權限 (Transact-SQL) 和 GRANT 對象權限 (Transact-SQL)。
  • 架構的所有權和架構範圍內的安全對象可以轉移。有關詳細信息,請參閱 ALTER AUTHORIZATION (Transact-SQL)。
  • 對象可以在架構之間移動。有關詳細信息,請參閱 ALTER SCHEMA (Transact-SQL)。
  • 單個架構可以包含由多個數據庫用戶擁有的對象。
  • 多個數據庫用戶可以共享單個默認架構。
  • 架構可以由任何數據庫主體擁有。這包括角色和應用程序角色。
  • 可以刪除數據庫用戶而不刪除相應架構中的對象。

簡單地說,解除了用戶和架構一對一的鏈接,分離schema和db user之後,可以更靈活地單獨處理用戶或架構,數據共享也更加便利。

SQL Server中架構的一些其他特點:

①從sql server 2005後,創建新用戶(create user)時可以使用參數“WITH DEFAULT_SCHEMA = schema_name”顯式爲用戶指定一個架構名稱,若未指定,則缺省爲"dbo";MS不推使用sp_adduser,僅爲保持向下兼容而提供,使用sp_adduser創建的用戶,擁有一個與用戶名相同的同名架構。

②sql server 2000中的系統表syslogins, sysusers被替換sys.database_principals,sys.schemas,sys.server_principals 視圖(前兩張表仍可訪問,但不推薦使用)。

③sql2005起,用戶查詢(select)數據對象時,如未顯示指定架構,sql server會首先在用戶默認架構中查中,如未找到,系統會自動在dbo架構中進行查找。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章