5 .5 數據庫關系圖


5 .5 數據庫關系圖
一旦創建了數據庫及其對象,就可以很方便地創建和底層結構鏈接的實體關系圖,這
樣,任何必要改動(尤其是創建外鍵約束)都可以通過一個方便的圖形環境應用到數據庫中。
SQL Server Management Studio中的數據庫關系圖就提供了這種功能。但是它不能完全替代
成熟的數據庫設計工具。數據庫關系圖更多地用在數據庫部署的測試和開發階段中。
通 過 SQL Server Management Studio的 “對象資源管理器”中的用戶數據庫節點可訪
問數據庫關系圖功能。在創建第一個數據庫關系圖前,需要安裝關系圖支持對象。方法是
右 擊 “數據庫關系圖”節點並選擇“安裝關系圖支持程序”命令。如果不進行安裝,那么
在第一次嘗試創建數據庫關系圖時,系統會彈出一個消息通知缺少“一個或多個支持對象”,
並詢問是否要安裝它們。安裝支持對象或選擇“是”會 使 SQL Server創建一個名為 dbo.sysdiagrams的由系統所有的表,它將包括創建的任意關系圖的定義。
通過下面的步驟可創建和修改一個數據庫關系圖:
(1) 展 幵 “數 據 庫 ”節 點 ,然 后 展 開 AdventureWorks2008數 據 庫 節 點 。右擊 AdventureWorkCOOS中 的 “數據庫關系圖”節點,然后單擊“新建數據庫關系圖”命令。 此時將顯示“數據庫關系圖”窗格,以及一個“添加表”對話框,它按字母順序列出了數
據庫中所有的用戶表。
(2) 選擇Address(Person)表。單 擊 “添加”按鈕將Person.Address表添加到關系圖中,然
后單擊“添加表”對話框上的“關閉”按鈕。也可以雙擊列表中的表將其添加至關系圖中。
(3) 右擊Address(Person)表,然后單擊“添加相關表”命令。這將把所有和Address(Person)
表有關系的表添加到關系圖中,如果您不熟悉數據庫結構,那么這個功能非常方便。
注意,在關系圖中,所有的表都只是互相堆矜在一起的。可以手動重新排列它們,或
者右擊關系圖的空白處,然后選擇 “排列表”命令。SQL Server會把表整齊地排列在窗格 上,使表和它們之間的關系易於査看。
由於關系圖中空間有限,可以創建多個關系圖把數據庫分成功能區域,或者可以顯示
關系圖上的分頁符,把一個大型關系圖分成多頁。要顯示分頁符,可右擊關系圖上的空白
處,然后選擇“査看分頁符”命令。
右擊任何表都可獲得改變表在關系圖中顯示方式的命令、從數據庫中刪除表的命令、
從關系圖中移除表的命令,以及一些通常在“表設計器”工具欄上訪問的表修改命令。
5 . 6 視圖
SQL Server 2008視圖就是保存的命名查詢,可以獨立於它們引用的表進行管理。視圖 和它們所引用的表非常相似,只是它們默認是邏輯對象而非物理對象。但也有例外:當在
視圖上創建了一個唯一聚集索引時,該視圖就會被“物化”。通常,創建視圖是為了抽象復
雜的數據庫設計,通過允許訪問視圖而不是多個表來簡化權限,以及安排將數據導出到其
他數據存儲器中。
有關視圖創建和其他編程對象的內容不在本書討論范圍之內。要了解有關如何和為什么

創建視圖的更多信息,請參閱Paul Turley和 Dan Wood編 寫 的 《T-SQL編程入門經典(涵蓋
SQL Server 2008 & 2005)》一書。有關保護視圖的信息,請閱讀第6 章。
系統視圖
如第4 章所述,系統視圖是數據庫管理員的系統對象視圖。因為有太多的系統視圖,
所以這里無法一~描 述 。您可以查閱SQL Server 2008聯機從書獲取相關信息。系統視圖可 分成4 類:
• 信息架構視圖—— 信息架構視圖是屬於INFORMATION_SCHEMA這個特殊架構
的預定義視圖。SQL Server 2008實現了 INFORMATION_SCHEMA的 ISO標准定
義,並提供了 SQL Server元數據的一致視圖,即它們在版本之間沒有改變。 • 目錄視圖—— 目錄視圖是從SQL Server中檢索元數據的另一種方法。由於目錄視 圖是最常用的SQL Server元數據界面,因此建議使用該視圖而不是信息架構視圖。 它們提供了大量可用於排除問題和維護SQL Server 2008的有用信息。如果在固定 腳本巾使用它們,要確保用名稱指定列。Microsoft保留了在目錄視圖末尾添加額外
列的權利,這可能會破壞現有代碼。事實上,當在SQL Server 2005和 SQL Server
2008之間選擇目錄視圖時就會發生這種情況。
• 動態管理視圖—— 動態管理視圖返回用來監視SQL Server進程、診斷問題以及優 化性能的服務器狀態信息。第4 章對其做了簡要介紹。
• 兼容性目錄視圖—— 由於 SQL Server 2000中的系統表被棄用,因 此 SQL Server 2008提供了很多和之前的系統表同名的視閣。這些視圖僅返冋和SQL Server 2000
兼容的SQL Server 200S功能,並嚴格規定用於在SQL Server 2000上設計的對象
和腳本。后面的開發工作應使用返回SQL Server 2008特定信息的新目錄視圖,因 為在未來版本中將刪除這些兼容性目錄視圖。
5 . 7 同義詞
所謂同義詞,是指給SQL Server架構范圍內的數據庫對象指定一個名稱,數據庫應用 程序可使用該名稱來代替其由兩部分、三部分或四部分組成的名稱。例如,如果一個數據
庫應用程序引用了另一台服務器上的一個表,它通常需要使用一個由四部分組成的名稱。
定義一個同義詞實際上就是取一個直接映射到表的別名,而不必對表進行完全限定。下列
代 碼 將 在 AdventureWorks2008數據庫中創建一個名為Products的同義詞,它將引用
AdventureWorksDW2008 數據庫中的 dbo.DimProduct 表。

在有了一個新的同義詞后,現在打開一個新的査詢窗口,然后輸入下列代碼:
USE AdventureWorks2008 GO
SELECT ProductKey, EnglishProductName, StandardCost FROM dbo.Products
注意,該査詢從AdventureWorksDW數據庫中返回了 606行,但不需要像下面的示例 這樣限定對象名稱:
USE AdventureWorks2008 GO
SELECT ProductKey, EnglishProductName, StandardCost FROM AdventureWorksDW2008.dbo.DimProduct
同義詞可以用來引用任意數據庫或一個鏈接服務器上的視圖、表、存儲過程和函數,
從而簡化應用程序的數據訪問。
5 .8 編程對象
如前所述,有關編程對象創建及其邏輯的內容不在本書的討論范圍之內,但這些對象
的目的和基本用途與這里的討論還是有關的。數據庫管理員需要理解編程對象如何影響數
據庫行為。最重要的一個方面通常是安全性,第6 章將會介紹相關內容。
5 . 8 . 1 存儲過程
存儲過程是存儲在服務器的數據庫中的T-SQL或托管代碼的命名集合。SQL Server存 儲過程和其他編程語言中的過程很相似,因為它們都被用來封裝重復性任務。存儲過程支
持用戶聲明的變量、條件執行以及許多其他編程功能。
可以使用傳統的T-SQL語言,或像C#或 VB.NET等.NET托管語言編寫存儲過程。
第 14章將討論使用托管代碼創建復雜的存儲過程的好處,它們可以突破T-SQL的局限性。
存儲過程最主要的用途是封裝業務功能,並創建可重用的應用邏輯。由於存儲過程存
儲在服務器上,因此對業務邏輯的更改可以在一個位置完成。
存儲過程還提供對數據庫數據的可控修改。通常,給予用戶修改數據庫表中數據的權
限是一個很糟糕的想法。可以創建僅執行應用程序所需的修改的存儲過程。然后可以授予
用戶執行存儲過程的權限來完成所需的數據修改。
用戶創建的存儲過程比即席Transact-SQL更有效率,也更安全。它們大大減少了查詢和 修改數據庫所需的網絡數據包數,而為了有效地重用這些存儲過程,可以編譯並長期緩存它們。
除了用戶創建的存儲過程之外,SQL Server還提供了數百種系統存儲過程。這些系統 存儲過程可以用來檢索系統信息和修改底層系統對象、它們涵蓋了從返回一個所有登錄用
戶列表的簡單存儲過程,到創建數據庫維護作業的復雜存儲過程。后面章節在討論相關主
題時會涉及其中一些存儲過程。

5 .8 .2 函數
SQL Server 2008支持三種類型的用戶自定義函數:標量函數、表值函數和聚合函數。 SQL Server函數和其他編程語言中的函數非常相似。它們接受參數,然后基於輸入參數執 行操作並返回值。表值函數總是返回table數據類型。標量函數和聚合函數可以返回除text、 ntext和 image之外的任何數據類型。 用戶定義函數都可以使用T-SQL或托管代碼創建,但聚合函數除外,它總是使用托管
代 碼 創 建 。從效率和安全方面來說,用戶自定義函數提供了許多和存儲過程相同的好處。
它們的區別在於函數不能執行修改數據庫狀態的代碼,而存儲過程可以。
在 SQL Server Management Studio的 “對象資源管理器”中,系統函數被分成兒類。
一些函數用來操作用戶數據(如聚合函數和字符串函數),而另一些則用來檢索系統信息(如
安全性函數和元數據函數)。
5 .8 .3 觸發器
觸發器是由系統中其他一些動作引發並執行的存儲的T-SQL或托管代碼對象,它不能
直接執行。SQL Server 2008中有兩種觸發器:DML觸發器和DLL觸發器。
1.DML觸發器
數據操作語言(Data Manipulation Language, DML)觸 發 器 是 由 於 DML命令(INSERT、 UPDATE、DELETE)執行而執行的。SQL Server 2008中 有 兩 種 DML觸發器:After觸發器 和 Instead O f觸發器。
After觸發器
傳統的觸發器是After觸發器,因為它們是在DML語句在具有已定義的觸發器的表上 執 行 “之后”才執行的。觸發器中的代碼其實也是導致觸發器執行的事務的一部分。觸發
器主體中的任意ROLLBACK命令都會導致觸發器和相關事務回滾。
Instead O f觸發器
之所以稱為Instead O f觸發器,是因為執行的是該觸發器中的命令,而不是實際上導 致該觸發器執行的事務。Instead O f觸發器主要用作將更新發送至包含UNION操作符的視 圖中引用的表的方法,因為不能直接更新這些視圖。要想了解更多有關Instead Of觸發器 和這些分區視圖的信息,請 參 閱 Paul Turley和 Dan Wood編 寫 的 《T-SQL編程入門經典(涵
蓋 SQL Server & 2005)》一書。 2. DDL觸發器
數據定義語言(DDL)觸發器是由於DDL命令(CREATE、DROP、ALTER)執行而執行的,
其作用域可在數據庫或服務器范圍。DDL觸發器可以審核或防止數據庫和服務器修改。
下面的例子演示了如何創建一個數據庫級別的DDL觸發器,以此審核對數據庫做出的修改。
首先創建一個表,記錄數據庫中發生的所有DDL事件。方法是運行下列腳本:

USE AdventureWorks2008
GO
CREATE TABLE AuditLog ( EventID int IDENTITY (1,1) NOT NULL, LoginName EventTime DDLEvent Eventdata
varchar(75) NOT NULL, datetime NOT NULL, varchar(100) NULL, xml NOT NULL)
GO
接着創建一個觸發器,它將在任何DDL級別的事件執行時執行。該觸發器使用了一個名
為 EVENTDATA的系統函數,后者返回一個XML結果集,包含有關DDL事件的所有信息。
該觸發器使用XQUERY命令將XML數據拆解成關系結果集,然后將其插入到審核表中。
USE AdventureWorks2008
GO
CREATE TRIGGER DatabaseAudit ON DATABASE
FOR DDL_DATABASE一LEVEL_EVENTS
AS
DECLARE @data XML = EVENTDATA() INSERT AuditLog(LoginName, EventTime,DDLEvent,EventData)
VALUES
(SYSTEM_USER
r
GETDATE()
r
@data.value(' (/EVENT_INSTANCE/TSQLCommand) [1] * r ,nvarchar (2000)•) ,@data) RETURN
GO
現在測試該觸發器,創建並刪除一個名為TriggerTest的表,然后査詢審核表看是否捕 獲了想要的信息:
USE AdventureWorks2008
GO
CREATE TABLE TriggerTest ( Columnl int ,Column2 int) DROP TABLE TriggerTest SELECT * FROM AuditLog
結果應該是與圖5-31類 似 的兩行(當然,您 的 LoginName和 EventTime會有所不同)。

注意:
為了確保此觸發器不會干擾本書后面的一些練習,可以執行下列命令刪除它。
DROP trigger DatabaseAudit ON DATABASE
5 . 8 . 4 程序集
程序集是包含數據庫編程對象的文件,通過使用Visual Studio創建。它們可以包含使 用任何托管語言(如 C#或 VisualBasic.Net)編寫的存儲過程、函數、觸發器、聚合函數和數 據類型。由於集成了公共語言運行時(CLR),所以可在數據庫引擎中可以直接訪問它們。
在某些特定的情況下,例如需要密集而遞歸的數學操作或復雜的字符串操作時,托管代碼
比傳統的T-SQL編程更有優勢。第 14章將更詳細介紹CLR對象和集成。
從 第 14章可以知道,數據庫管理員和開發人員之間關系緊張。通常,這種緊張程度會
因為數據庫管理員缺乏編程技能而加劇。隨着CLR和數據庫引擎集成,數據庫管理員了解
編程並與和系統交互的開發人員溝通變得比以往更重要。
通過 Visual Studio、Transact-SQL 或 SQL Server Management Studio 可將 CLR 程序集 導入到數據庫巾。這 里 主 要 討 論 Transact-SQL和 SQL Server Management Studio。為了理解
這些內容,您 需 要 t 傳一個文件。第 14章將介紹如何創建這個文件,目前只能想象。 要 使 用 SQL Server Management Studio添 加 新 程 序 集 , 依 次 展 開 “數 據 庫 ” | “AdventureWOrks2008” | “可編程性”節點,右 擊 “程序 集 ”節點,然 后 單 擊 “新建程序 集”命令。
在 “新建程序集”對話框(如圖5-32所示)中,瀏覽至該程序集,指定程序集所有者並
為其設置權限。

權限集定義了授予程序集多少訪問權來執行包含的操作。“安全”列表項把程序集限
於當前數據庫和連接。“外部訪問”列表項使程序集能夠與操作系統、網絡和文件系統交互。

“無限制”列表項使程序集有“外部訪問”的所有權限,並且還可以調用非托管代碼。第
6 章和第14章將更詳細地討論程序集權限集。
在將程序集添加到數據庫中之后,就可以將鏈接至此程序集的存儲過程、函數、觸發
器、類型或聚合函數添加到數據庫中(要了解具體過程,可參閱第14章)。
5 .8 .5 類型
類型包括系統數據類型、用戶定義數據類型、用戶定義表類型、用戶定義類型以及數
據庫中使用的任意XML架構集合。第4 章介紹了系統數據類型,因此這里只介紹其他類型。
1 .用戶定義數據類型
用戶定義數據類型是系統類型的別名。這些類型僅存在於創建它們的數據庫中。用戶
定義數據類型常用於提供一個直觀的數據類型名稱及維護不同表之間數據類型一致性。
例如,如果我要求5 位不同的數據庫開發人員創建一個存儲個人信息的表,那我可能
會得到5種不同的解決方案。該表可能包含個人姓、名、地址和電話號碼列,但很可能這
5 位不同的數據庫開發人員對於任一指定的字段提供出3 種不同的數據類型。例如,一位
開發人員可能使用varchar(13)表示電話號碼,認為電話號碼應表示為(111)111-1111。另一位 幵發人員可能考慮得更全面,提供了國際代碼,因此將電話號碼的類型指定為varchar(25)。 為避免后面可能發生的類型沖突,可以指定使用用戶定義數據類型。
要以圖形化方式創建用戶定義數據類型,可在“對象資源管理器”中依次展開“數據
庫” | AdventureWorks2008| “可編程性”丨“類型”節點,右 擊 “用戶定義數據類型”節點, 然后單擊“新建用戶定義數據類型”命令。
圖 5-33展示了在.dbo架構中創建一個基於系統類型char(5)的 ZipCode數據類型。通過 在合適的文本框中進行指定,用戶定義數據類型也可以綁定至數據庫默認值和規則。默認
值和規則將在本章后面介紹。

用戶定義數據類型有一些缺點。例如,它們對數據庫應用程序是不透明的。例如,應
用程序程序員將無法在使用ZipCode數據類型的應用層實例化變量。程序員必須知道基類 型是char (5)。除了應用層的可見性之外,用戶定義數據類型只存在於創建它們的數據庫中。
例如,AdventureWorks2008 數據庫中的 ZipCode 數據類型可能與 AdventureWorksDW2008
數據庫中的ZipCode數據類型不同。而且,這種數據類型一旦創建就不能更改。換句話說, 如果后面想將ZipCode數據類型改成char(9)來存放“zip+4” 編號形式的郵編,必須刪除並 重建它。遺憾的是,要刪除它,要求不能在任何地方使用它。
2 .用戶定義表類型
SQL Server 2008提供了創建表示表定義的用戶定義表類型的功能。可使用用戶定義表 類型聲明變量或將其用作存儲過程和函數的參數,使使用信息集更加容易。要創建用戶定
義表類型,使用CREATE TYPE提供表定義。下列代碼創建了一個用於表示一組客戶的表
結構,然后將它用作一個存儲過程的輸入參數:
CREATE TYPE Customers AS TABLE ( CustomerName varchar (50), CreditLimit decimal, Address varchar(50), PhoneNumber varchar(10));
GO
DECLARE Scustomers Customers INSERT INTO ^customers(CustomerName, CreditLimit, Addressr PhoneNumber) VALUES (••' 2300.00, •,),
(••, 2300.00, ••),
(•\ 2300.00,',、 " )
GO
EXEC usp_AddCustomers @customers GO
提示:
上面的代碼只是作演示之用,不會真正執行,因為Adventure Works數據庫中並沒有名
為 usp AddCustomers的存儲過程.
3 .用戶定義類型
用戶定義類型(UDT)和用戶定義數據類型非常相似,只是它們由托管代碼創建,並被
定義在導入到SQL Server數據庫的程序集中,UDT可以非常復雜,而且可以定義沒有對 應系統類型的自定義數據類型。例如,可以創建一個UDT來定義一個真正存儲為數字的
社會安全號碼數據類型,但不截斷前導零。我們還可以在托管代碼中利用正則表達式,以
更容易並更准確地驗證社會安全號碼。
UDT的其他優勢在於它們對應用層是可見的。由於它們定義在程序集中,而程序集可
以在數據庫應用程序引用,這樣就可以使用本地UDT實例化參數。然而,用戶定義類型
並不是完美的,在跨數據庫應用程序中,用戶定義類型可能會產生問題,因為UDT是特

定於數據庫的。不過,如果在每個數據庫創建UDT時引用了同樣的CLR程序集,這個限
制就會減弱。如前所述,第 14章包含有關CLR程序集和可用它創建的數據庫對象(包括
UDT)的更多信息。
5 .8 .6 默認值
可以在數據庫級創建一個單獨的默認值,然后將它綁定到數據庫中的任意表列,而不
是在表列上創建默認約束。默認值已被廢棄,所以建議在新的開發工作中不再使用它們。
可以在“對象資源管理器”丨“數據庫” | “可編程性”節點下找到默認值,但是必須用T-SQL
創 建 它 們 。下面的例子展示了如何創建一個默認的社會安全號碼,然后將其綁定到
dbo.Driver 表的 SocSecNum 列 。
USE AdventureWorks2008 GO
IF EXISTS(SELECT * FROM sys.default_constraints WHERE name = •DF一Driver一SocSecNum1> ALTER TABLE dbo.Driver DROP CONSTRAINT DF_Driver一SocSecNum CREATE DEFAULT dfItSocSecNum AS '000000000'
GO
sp bindefault •dfItSocSecNum*, 1dbo.Driver.SocSecNum1
5 .8 .7 規則
和默認值一樣,規則也被棄用了。規則類似於CHECK約束。不過,它是在數據庫級
別創建的,然后綁定到匹配指定數據類型的任意列。下面的例子展示了如何創建一條規則,
在基於字符的列上強制數字型數據,以及如何把該規則綁定到SocSecNum列。
USE AdventureWorks2008 GO
CREATE RULE AllNumRule AS @value LIKE 1 [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].
GO
sp_bindrule 'AllNumRule *, * dbo.Driver.SocSecNum *
5 . 9 小結
本章包含大量信息,但仍然有大景內容未能介紹。單 單 SQL Server數據庫及其包括的 功能就可以寫一本書,但是本書並不是這樣一本朽。本章的目的是幫助您了解SQL Server 數據庫中提供的對象,以及如何創建和管理它們。后續的章節將從數據庫管理員的角度深
入 討 論 SQL Server 2008其他各個方面。 在 第 6章中,您將學會如何保護SQL Server 2008服務器、數據庫和所有組成SQL Server
的相關對象的安全。該章將詳細介紹許多新特性(如 SQL Server證書、憑據和加密),以及 核心的安全功能,通過這些內容的學習可確保您的服務器盡可能安全。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM