術語
本文中進行的所有比較均假定使用了以下軟件:
?Microsoft Access 2002 或更高版本
?Microsoft SQL Server 2000 Standard Edition 或 Enterprise Edition
還假設您的數據當前存儲在 Access 數據庫 (.mdb) 文件中,而不是在 SQL Server 上,而且您沒有使用支持本文中介紹的許多 SQL Server 功能的 Access 數據項目 (ADP)。
本文的目標讀者
本文的目標讀者是熟悉 Access 功能,且正在考慮將後端基礎結構(數據和查詢)遷移到 Microsoft SQL Server 的 Access 開發人員、Microsoft Visual Basic 開發人員和 .Net 開發人員。
讀者需要熟悉以下 Access 功能:
?基本 SQL
?以多種格式導入和導出數據
?備份和恢復數據
?實現安全性
本文通過比較 Access 和 SQL Server 的功能,希望能對新的 SQL Server 開發人員有所幫助。
Microsoft Access 開發人員通常由於性能、安全性和穩定性因素而考慮遷移到 SQL Server,此過程稱為升級 (upsizing)。在從 Access 遷移到 SQL Server 時,開發人員會發現幾點主要的差異。關鍵是要注意到這些差異並采取相應的措施,確保從 Access 無縫且無錯誤地遷移到 SQL Server。
Microsoft SQL Server 是一個企業級數據管理系統。它集成了行業標准的安全性、可伸縮性和可管理性。此外,它還支持可擴展標記語言 (XML) 和 Internet 查詢。
提示:這裡不討論從 Access 遷移到 SQL Server 的過程。 有關遷移的詳細信息,請參閱 ASP" target="_blank">Migrating Your Access Database to Microsoft SQL Server 7.0。(注意:這篇文章是針對 SQL Server 7.0 編寫的,尚未進行更新。)
提示:這裡不討論數據復制和數據庫安全性之間的差異。
有關在 SQL Server 中實現復制的詳細信息,請參閱 SQL Server 2000 SDK 文檔中的 ASP" target="_blank">Implementing Replication。
有關 SQL Server 安全性的詳細信息,請參閱 SQL Server 2000 SDK 文檔中的 ASP" target="_blank">Managing Security Accounts。
使用 Access 數據庫窗口中的主菜單,您可以創建查詢、設計數據庫或浏覽數據。要從數據庫中導出數據,請單擊 File(文件),然後單擊 Export(導出)。要將數據導入到數據庫中,請單擊 File(文件)-> Get External Data(獲取外部數據),然後單擊 Import(導入)。
SQL Server 提供了一套功能強大的工具,它們簡化了浏覽、查詢、導入和導出數據的過程。它們是:
?SQL Server 企業管理器
?SQL Server 查詢分析器
?數據轉換服務
?SQL Server 事件探查器
用於設計數據庫和查詢以及浏覽數據的 SQL Server 工具
在 SQL Server 中,您可以使用兩個工具來執行數據庫維護任務、浏覽和編輯數據。這兩個工具分別是 SQL Server 企業管理器和 SQL Server 查詢分析器。計劃將窗體遷移到 .NET 的 Access 窗體開發人員還會發現 Microsoft Visual Studio .Net 非常有用,因為它提供了一種集成的方法,使您可以在一個開發環境中創建和管理 SQL Server 數據庫和數據訪問窗體。
SQL Server 企業管理器
SQL Server 企業管理器是與 SQL Server 捆綁安裝的應用程序,用於設計和管理數據庫(如圖 1 所示)以及浏覽數據(如圖 2 所示)。企業管理器還提供以下功能:
?管理表/字段/數據、表關系、存儲過程、視圖、觸發器、函數和用戶定義的數據類型。
?創建數據庫關系圖
?創建數據庫備份和恢復數據
?管理數據庫登錄和對象權限
?以使用數據轉換服務 (DTS) 的多種格式導入和導出數據
圖 1:SQL Server 企業管理器在設計和管理數據庫方面可以代替 Access 主對話框。
圖 2:使用企業管理器可以像在 Access 中一樣浏覽和編輯數據。
SQL Server 查詢分析器
SQL Server 查詢分析器是一個完善的圖形查詢工具,可以代替 Access 主查詢設計器。您可以通過它完成以下操作:
?創建和調試查詢?
運行多個同步查詢
?
查看數據
?
導出數據(單擊 Query [查詢],然後單擊 Results to File [將結果保存到文件])
?
優化查詢(單擊 Query [查詢],然後單擊 Show Execution Plan [顯示執行方案])
?
調試高級查詢(單擊 Tools [工具] -> Object Browser [對象浏覽器],然後單擊 Debug [調試])
提示:查詢分析器不僅支持上述功能,還可以突出顯示語法,使您可以很容易地查看和調試查詢(如圖 3 所示)。盡管可以在企業管理器中編寫存儲過程(如所圖 4 示),但 Access 開發人員會發現查詢分析器的功能更豐富。
圖 3:查詢分析器可以代替 Access 查詢設計器,還增加了諸如突出顯示語法和查詢調試等功能。
圖 4:在企業管理器中編寫高級存儲過程沒有在查詢分析器中容易
Access 中“使用向導創建查詢”的功能在 SQL Server 中沒有對應的功能。必須使用查詢設計器或 SQL Server 語句來創建查詢。
Visual Studio .Net
使用 Visual Studio .NET,您可以像在企業管理器中一樣管理數據庫和數據庫對象,如圖 5 所示。根據您使用的 Visual Studio .Net 版本,您可以創建允許您執行以下操作的數據庫項目:
?
設計和執行存儲過程、視圖、觸發器和函數
?
浏覽表
?
查看數據
此功能對 .Net 開發人員很有用,因為它提供了一種集成的數據庫管理方法。開發人員可以在一個應用程序中開發應用程序並管理數據庫。
圖 5:Visual Studio .Net 提供了一種集成的數據管理方法
有關哪些版本的 Visual Studio .Net 支持哪些數據庫管理功能的詳細信息,請參閱 ASP" target="_blank">Visual Database Tools Editions。
用於導入和導出數據的 SQL Server 工具
數據轉換服務
數據轉換服務 (DTS) 允許您在使用基於 OLE DB 體系結構的多種數據源(例如 Microsoft Excel)中導入和導出數據。DTS 不僅可以代替 Access 的導入和導出功能(如圖 7 所示),還提供了以下功能:
?
在 SQL Server 數據庫中導入和導出數據
?
以多種格式導入和導出數據,這些格式包括 Excel(.xls 文件)、逗號分隔值(.csv 文件)和 Microsoft Access,請參閱圖 6。
?
執行數據轉換
圖 6:使用 DTS 以多種數據格式導入和導出數據。
DTS 的功能比 Access 中的導入和導出命令更強大。在 Access 導入過程中需要執行多個步驟才能完成的許多任務(例如,要執行數據轉換,需要填充臨時表並運行多個查詢)在 DTS 中只需一個步驟即可完成。可以執行數據轉換,例如,使用 SQL 查詢將數據從一個表復制到另一個表中,或在插入目標表之前執行 VBScript 代碼以轉換部分數據,如圖 8 所示。
圖 7:DTS 可以代替 Access 導入和導出向導,還可以進行高效的數據轉換。
圖 8:DTS 可以執行高效的數據轉換,而 Access 則需要更長的時間才能完成同樣的操作。
SQL Server 事件探查器
SQL Server 事件探查器是優化數據庫性能的重要工具。該工具非常有用,尤其是從只適用於客戶端的系統(例如 Access)遷移之後。它可以顯示服務器上執行的所有命令(例如,已打開和關閉連接)和數據庫事務,如圖 9 所示,這可以幫助您識別特別耗時或耗費資源的事務。
圖 9:SQL Server 事件探查器可以監視數據庫活動,從而幫助您優化性能。
有關使用這些 SQL Server 工具的詳細信息,請參閱 ASP" target="_blank">Migrating Your Access Database to Microsoft SQL Server 7.0。(注意:這篇文章是針對 SQL Server 7.0 編寫的,尚未進行更新。)
Access 體系結構與 SQL Server 體系結構相比有幾個不同點、相似點和缺點。它們的不同點體現在以下幾個方面:
?
數據訪問模型
?
表設計
?
關系
?
索引
?
數據查詢類型
?
SQL Server 還為優化和簡化數據處理提供了強大的功能,包括:
?
觸發器
?
臨時表
?
用戶定義的函數
系統要求
最低系統要求
由於 SQL Server 比 Access 具有更豐富的功能和更好的可縮放性,因此它對系統的要求要略高一點。表 1 對這兩個系統的最低系統要求進行了比較。
表 1:SQL Server 和 Access 的最低系統要求 Access SQL Server
處理器
Pentium 75 MHz
Pentium 166 MHz
內存
8 MB,每個同時運行的應用程序需增加 4 MB,運行 Microsoft Windows XP 需增加 128 MB
128 MB RAM 或更多
硬盤空間
30 MB
270 MB(完全安裝)
操作系統
Microsoft Windows Server 2003、Windows XP、Windows 2000、Windows NT 4.0 Service Pack 6 (SP6)、Windows Millennium Edition、Windows 98 Second Edition、Windows 98 或 Windows 95
Microsoft Windows Server 2003、Windows XP、Windows 2000、Windows NT 4.0、Windows 98 Second Edition、Windows 98、Windows 95 或 Windows CE
實際系統要求
表 1 列出的最低要求在典型的操作環境中是不現實的。系統要求主要取決於數據量和並發用戶的數量。
如果有 10 個並發用戶和一個 1 GB 的數據庫,建議使用表 2 中指定的系統在生產環境中運行 Access 或 SQL Server。
表 2:建議的 SQL Server 和 Access 系統要求 建議使用
處理器
Pentium III 650 MHz
內存
384 MB
硬盤空間
2 GB
操作系統
Microsoft Windows Server 2003 或 Windows 2000
SQL Server 版本
SQL Server 2000 有六個版本:
?
Enterprise Edition
?
Standard Edition
?
Personal Edition
?
Developer Edition
?
Desktop Engine MSDE)
?
SQL Server CE(與 Windows CE 兼容的版本)
表 3 顯示了不同 SQL Server 版本的操作系統要求。
表 3:不同 SQL Server 版本的操作系統要求 操作系統 Enterprise Edition Standard Edition Personal Edition Developer Edition Desktop Engine (MSDE) SQL Server CE
Windows Server 2003 Standard Edition
是
是
是
是
是
否
Windows Server 2003 Enterprise Edition
是
是
是
是
是
否
Windows Server 2003 Datacenter Edition
是
是
是
是
是
否
Windows XP Professional
否
否
是
是
是
您正在看的SQLserver教程是:將 Access 2002 數據庫遷移到 SQL Server。
否
Windows CE
否
否
否
否
否
是
Windows 9x
否
否
是
否
是
否
引擎實現
Access 中的 Jet 數據庫引擎與 SQL Server 的不同之處在於,它不能像 SQL Server 那樣作為一項服務持續運行,而是在用戶每次使用 Access 或其他某些數據訪問方法打開 Jet 數據庫文件(.mdb 文件)時啟動。當用戶關閉 .mdb 文件並且不再使用該文件時,Jet 引擎將從內存中卸載。
主要區別在於,如果用戶當前沒有訪問 .mdb 文件,則可以使用 Windows 將該文件復制或移動到其他位置。在 SQL Server 中,SQL Server 服務是持續運行的,而且連接到在其中注冊的 SQL Server 數據庫文件(.mdf 文件)。要復制 .mdf 文件,必須先停止 SQL Server 服務,或者將 .mdf 文件與當前的 SQL Server 服務拆離,然後才能移動它。
數據訪問模型
Access 是只適用於客戶端的關系型數據庫管理系統 (RDBMS)。這意味著所有數據處理(例如排序和篩選)都是在一台計算機上完成的。
Access 開發人員通常通過拆分數據庫來模擬客戶端/服務器方法。通常,在多個並發用戶使用 Access 的環境中,將在每台客戶端計算機上設置一個 Access 數據庫。此數據庫包含窗體、報表、保存的查詢和 Microsoft Visual Basic for Applications (VBA) 窗體代碼。所有數據都存儲在中央服務器的 Access 數據庫中,而在請求時才發送給客戶端計算機。此方案需要大量網絡資源和客戶端資源。圖 10 顯示了這種結構。
圖 10:拆分 Access 數據庫(紅色表示負載)
在此方案中,服務器上不執行任何數據處理。當客戶端請求數據時,將把整個數據集通過網絡發送給客戶端,任何處理都是在客戶端計算機上完成的。
例如,一家財務公司的數據庫中有一個 Accounts Receivable 表(Access .mdb 文件),其中存儲了一百萬條記錄。某個 Access 應用程序要顯示應收帳款的總和(一個計算的字段)。要完成此操作,Access 必須通過網絡傳輸整個表,而在工作站上執行計算。
這將為服務器和網絡帶來嚴重的性能問題。多次請求大量數據將占用大量服務器資源,而通過網絡連接傳輸整個數據集將大大降低網絡速度。
相反,SQL Server 是一個純客戶端/服務器 RDBMS。這意味著客戶端和服務器可以共同分擔處理負載。客戶端(例如 .Net Windows 應用程序)使用參數發送數據請求,服務器執行排序和篩選操作,然後只將經過篩選的數據集返回客戶端。圖 11 顯示了這種結構。
圖 11:SQL Server 可以將處理任務分散到客戶端和服務器上,有助於減少網絡通信量和服務器負載。
因為 SQL Server 在服務器上處理所有的篩選和排序操作,所以只返回指定的結果集。這有助於大大減少網絡通信量,因為在客戶端和服務器之間傳輸的數據比較少。這還有助於減少服務器的處理負載,因為服務器不需要像在 Access 中那樣返回大量記錄。
數據類型
Access 數據類型和 SQL Server 數據類型之間有幾點不同之處。這些數據類型中的大多數會在升級時自動轉換,但升級之後,您需要在 SQL Server 數據庫中進行驗證,這一點很重要。表 4 顯示了 Access 數據類型和 SQL Server 數據類型之間的不同之處。請注意,還有某些不受支持的數據類型。
表 4:比較 Access 數據類型和 SQL Server 數據類型 Jet (Access) SQL Server
Text
char、nchar、varchar、nvarchar
Memo
text、ntext
Byte
tinyint
Integer
smallint
Long Integer
integer
Single
real
Double
float
Replication ID
uniqueidentifIEr
Decimal
decimal
Date/Time
smalldatetime、datetime、timestamp
Currency
smallmoney、money
AutoNumber
int + 標識屬性
Yes/No
bit
OLE 對象
image
Hyperlink
<無對應項>
<無對應項>
您正在看的SQLserver教程是:將 Access 2002 數據庫遷移到 SQL Server。
binary、varbinary
提示:在 Access 中,只要用戶開始編輯新記錄,系統就會自動生成自動編號的列。在 SQL Server 中,只有在保存記錄時才會生成自動編號的列。在 Access 中重新設計基於自動編號值的現有邏輯時,一定要謹慎。
用戶定義的數據類型
SQL Server 允許用戶定義自定義數據類型,稱為用戶定義的數據類型 (UDDT)。UDDT 基於現有的 SQL Server 數據類型。還可以直接為類型添加約束,以執行以下操作:
?
指定默認值。(默認值是指沒有為記錄指定值時,由系統自動在字段中輸入的值。)
?
設置最大字段大小。
?
設置字段是否可以為空。
在表中指定其屬性將來有可能發生變化的字段時,UDDT 將非常有用。例如,如果您為基本 SQL Server 數據類型 varchar(15)(長度為 15 個字符的字符串)定義了一個唯一標識符字段,然後定義了可以接受 varchar(15) 參數類型的所有相關的存儲過程,那麼,更改該字段的長度或數據類型將成為一個棘手的維護問題。要反映數據類型的變化,必須更改所有存儲過程和表。
更好的做法是創建一個名為 CodeType 的 UDDT,而在 UDDT 中定義長度和基本數據類型。所有存儲過程和表定義都使用該 UDDT,所以,如果字段大小增加,只需更改 UDDT 的定義。
UDDT 是通過企業管理器定義的,如圖 12 所示。
圖 12:指定在 SQL Server 數據庫對象中使用的 UDDT
表設計
表的表示方式在 Access 和 SQL Server 中是相似的。這兩個數據庫管理系統 (DBMS) 都是關系型的,也就是說,相關數據都存儲在通過唯一標識符鏈接的邏輯表中。
表的設計界面在 Access 和 SQL Server 中也是相似的,如圖 13 所示。圖 13:Access 和 SQL Server 中相似的表設計
關系
在 Access 中,可以為表中的字段指定規則,這樣,當一個表中的值發生變化時,相關表中的值將自動更新(級聯更新)。
在 SQL Server 中,可以通過企業管理器中的關系圖設計器創建相同的規則(如圖 14 所示)。SQL Server 支持五類約束:
?
NOT NULL。指定列不能包含空值。
?
CHECK。限制列中可以輸入的值。下列代碼將創建一個 Employee 表,並為 Salary 字段添加 CHECK 約束,使該字段的值在 10,000 和 1,000,000 之間。
CREATE TABLE Employee ( EmployeeID int PRIMARY KEY, Name char(50), Address char(50), Salary money, CONSTRAINT chk_Salary CHECK (Salary BETWEEN 10000 and 1000000) )
?
UNIQUE。確保表列中的所有值都是唯一的。此約束通常用於 ID 列。
?
PRIMARY KEY。標識一列或一個列集合,其值唯一標識表中的某個行。
?
FOREIGN KEY。設置表之間的關系。下列代碼將創建一個 EmployeePosition 表,該表引用上面創建的 Employee 表中的 EmployeeID。
CREATE TABLE EmployeePosition ( EmployeePositionID int PRIMARY KEY, EmployeeID int FOREIGN KEY REFERENCES Employee(EmployeeID) ON DELETE CASCADE Position char(50) )
圖 14:SQL Server 支持與 Access 相似的關系
ON DELETE 子句有兩個選項:
?
CASCADE。指定如果從 Employee 表刪除某個雇員的記錄,還將刪除 EmployeePosition 表中具有相同 EmployeeID 的任何記錄。
?
NO ACTION。指定如果刪除 EmployeePosition 記錄在 Employee 表中引用的父記錄,EmployeePosition 記錄將不受影響。
SQL Server 還支持 ON UPDATE 子句,該子句指定父記錄更新時要執行的操作。它還支持 CASCADE 和 NO ACTION 選項。
請注意,SQL Server 中的關系沒有 Access 中的關系靈活。在 Access 中,您可以:
?
在表中進行級聯、更新或刪除更新。
?
對表中 Required 屬性設置為 Yes 的外鍵進行級聯、更新或刪除更新。
盡管 SQL Server 不支持這兩個選項,但這樣可以創建更可靠的數據庫,不容易出現關系和鍵問題。
不支持級聯更新循環引用
與 Access 不同的是,SQL Server 不能保證循環引用的完整性。例如,某公司的銷售部門有一個高級雇員。在數據庫中,該雇員的 EmployeeType 為 Senior,Category 為 Sales。但在數據庫中,EmployeeType Senior 在 Sales Category 中。如圖 15 所示,允許這種情況的數據庫結構將創建循環引用,而 SQL Server 不允許這樣做。如果您嘗試創建循環更新約束,將看到類似以下內容的錯誤消息:
您正在看的SQLserver教程是:將 Access 2002 數據庫遷移到 SQL Server。Unable to create relationship 'FK_EmployeeType_Employee'. ODBC error:[Microsoft][ODBC SQL Server Driver][SQL Server]Introducing FOREIGN KEY constraint 'FK_EmployeeType_Employee' on table 'EmployeeType' may cause cycles or multiple cascade paths.Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. [Microsoft][ODBC SQL Server Driver][SQL Server]Could not create constraint.See previous errors.
這是因為,如果更新任何表中的一個字段,都可能導致無限循環。在本例中,更新一個 CategoryID 字段將導致下一個 CategoryID 字段更新(由於級聯更新引用完整性),而這又會導致下一個 CategoryID 字段更新,如此循環下去。
圖 15:循環級聯更新約束在 SQL Server 中產生錯誤。
要在 SQL Server 中解決此問題,需要從表中刪除引用完整性約束,並在每個表中創建一個觸發器以執行更新。有關使用觸發器的詳細信息,請參閱 ASP" target="_blank">Enforcing Business Rules with Triggers。
對索引的改進
在 Access 中,可以為表中的一個或多個字段建立索引,稱為組合鍵。
SQL Server 可以按照相同的方式處理索引。建立索引後的表實際上在硬盤上進行排序,並按照排序順序進行存儲。這稱為群集。群集是指 SQL Server 基於群集索引在硬盤上排序和存儲數據。如果某個字段已建立索引但沒有建立群集,SQL Server 必須首先查詢索引才能找到數據,這將降低性能。
例如,Employees 表中可以有一個唯一標識符,稱為 EmployeeID。但是,此表主要基於 FirstName 來字段完成搜索。通過為 EmployeeID 字段定義索引並將其 clustered 屬性設置為 true,可以優化對 FirstName 列的數據訪問(如圖 16 所示)。因為它已建立群集,所以按照排序順序以物理方式存儲在硬盤上,使數據訪問更有效。
圖 16:在 SQL Server 中設置使用群集的表索引以提高性能
Access 查詢與 SQL Server 視圖
SQL Server 視圖類似於 Access 查詢,如圖 17 和圖 18 所示。它們都允許您指定一個經過篩選的數據集,其中的數據可能是從多個表和其他視圖中整理出來的。
視圖對處理安全問題很有用。例如,如果您想允許一組用戶查看產品訂單的信息,但不允許他們查看與付款鏈接的信用卡詳細信息,那麼您可以:
1.
創建一個視圖,只檢索訂單表中的非敏感性字段。
2.
拒絕該組用戶訪問訂單表。
3.
允許該組用戶訪問視圖。
圖 17:Access 查詢
圖 18:SQL Server 視圖
與查詢不同的是,視圖還可以利用索引,這樣可以大大提高應用程序的性能,而查詢則需要頻繁地執行某些聯接或聚合操作。在一個已建立索引的視圖中,可以為其他視圖創建索引,而該視圖的結果集存儲在數據庫中,並在數據庫中進行索引。
Access 查詢與 SQL Server 存儲過程
SQL Server 使用存儲過程來查詢數據,執行數據計算。存儲過程的主要優點是它們在第一次運行時即被編譯。這意味著 SQL Server 可以計算出執行存儲過程的最佳方式,並將該執行方案存儲在內存中。以後再執行存儲過程將會非常快,因為 SQL Server 已經找到運行查詢的最佳路徑。
存儲過程是在 SQL Server 企業管理器中創建和修改的,這非常類似於在 Access 中編輯 Access 查詢(參閱圖 19)。存儲過程與 Access 查詢的相似之處在於它們都接受輸入參數。
圖 19:用於查詢數據和執行數據計算的存儲過程
由於存儲過程是使用 T-SQL 編寫的,因此它們要優於 Access 查詢,因為可以使用條件邏輯和計算來修改或返回數據或執行其他某些函數,如圖 20 所示。
圖 20:使用 T-SQL 在查詢中執行條件邏輯和計算
使用 SQL Server 還可以調試存儲過程,這在使用包含復雜業務邏輯的存儲過程時很有用。調試程序允許設置斷點、定義監視表達式以及創建逐步執行的過程,如圖 21 所示。
圖 21:SQL Server 中的高級查詢調試
Access 查詢與 SQL Server 用戶定義的函數
除了 SQL Server 中內置的函數外,您還可以指定自定義的 T-SQL 語句塊。它們稱為用戶定義的函
您正在看的SQLserver教程是:將 Access 2002 數據庫遷移到 SQL Server。數 (UDF)。UDF 的實現方式與編程語言中的函數的實現方式相同,UDF 是一項強大的功能,它允許重用代碼和封裝業務邏輯。UDF 可以返回單個(標量)值,也可以返回一個表。
標量 UDF
例如,可以編寫一個 UDF 來接受貨幣值、執行稅收計算,然後返回稅前價格。然後即可從任何需要計算稅收的存儲過程中調用此函數。
表 UDF
SQL Server 2000 引入了 table 數據類型,它可以從函數中返回數據表。與為了對數據子集執行查詢而創建物理表然後丟棄物理表相比,在 UDF 中使用 table 數據類型更有效。它們存儲在內存中並在內存中進行處理,不需要進行任何磁盤訪問。
有關用戶定義的函數的詳細信息,請參閱 ASP" target="_blank">User-Defined Functions。
表觸發器和視圖觸發器
SQL Server 已增加了對觸發器的支持。觸發器是在表中更新、刪除或插入數據時執行的存儲過程。可以將觸發器設置為在特定的行或字段發生更新時運行。請注意,可以使用觸發器來確保引用的完整性,這一點與約束非常類似。但約束比觸發器更有效,應盡可能使用約束。
可以使用觸發器在表中的數據發生更改時執行某些自定義操作。例如,您可以設置一個觸發器,將插入或更新的數據與另一個表中另一個字段的數據進行比較,然後對該字段中的數據進行相應的更新,或顯示自定義的錯誤消息。有關使用觸發器強制應用業務規則的詳細信息,請參閱 ASP" target="_blank">Enforcing Business Rules with Triggers。
可以通過 SQL Server 企業管理器在 Visual Studio .Net 數據庫項目中創建觸發器,如圖 22 所示。
圖 22:在 Visual Studio .Net 數據庫項目中創建的觸發器
在擴展數據庫解決方案以滿足增長的業務需求方面,SQL Server 的優勢要遠遠超過 Access。而且,改進後的客戶端/服務器體系結構還能將處理負載分散開來,從而可以大大提高性能。
支持更多的並發用戶
Access 最多支持 255 個並發用戶,這並不適合作為企業級數據存儲解決方案。在生產環境中,僅僅 20 個用戶通過網絡同時使用 Access 數據庫時就常常會遇到嚴重的性能問題以及數據被損壞的問題。
SQL Server 支持的並發用戶數量只受可用系統內存的限制,而且由於它具有優化的查詢處理引擎,還能夠同時使用多台計算機、多個處理器和硬盤驅動器,因此可以進行擴展以滿足任何企業需求。
支持更大的數據庫Access 支持的最大數據庫大小為 2 GB,還允許使用鏈接的表。盡管從理論上講使用鏈接的表可以存儲更多數據,但隨著處理的數據量的增加,通常會出現性能問題和網絡問題。有關詳細信息,請參閱本文前面的ASP?frame=true#sqlbac_topic5a" target="_blank">引擎實現一節。
SQL Server 的存儲能力已經大大提高,可以在多台設備上有效地存儲 1,048,516 TB 的數據。
日志文件可以保留所有數據庫活動的記錄
與 Access 相比,SQL Server 的優點之一是所有事務(數據庫更新、插入和刪除)都保留在日志文件中。該日志記錄了數據更改和詳細的信息,如果需要,以後可以利用這些信息撤消在每個事務中所做的更改。
您可以使用諸如 Lumigent Log Explorer 之類的工具查看 SQL Server 事務日志,並手動撤消事務(參閱圖 23)。有關詳細信息,請訪問 Lumigent Web 站點。
圖 23:通過查看所有過去的事務,Lumigent Log Explorer 使您可以完全控制 SQL Server 數據庫。
分散到多台設備上的數據庫和日志文件
Access 數據庫作為一個 .mdb 文件進行存儲,因此只能在一台計算機上存儲和運行。這可能會隨著數據庫和用戶數量的增加而產生問題,因為處理能力和存儲空間受每台數據庫服務器硬件的制約。
SQL Server 中的數據庫是一組由 SQL Server 管理的物理文件。這些文件中至少包括一個事務日志文件(擴展名為 .ldf)和一個主要數據文件(擴展名為 .mdf)。SQL Server 數據庫還可以具有一個或多個次要數據文件(擴展名為 .ndf)。主要數據文件用作數據庫的起點,還包含數據以及對次要數據文件的引用。
使用大型數據庫時,通過在相互獨立的計算機上存儲事務日志和多個數據文件,您可以利用多台計算機的處理能力,還可以幫助您使用多台計算機或多個硬盤的存儲空間。
更可靠的查詢
?
當 Access 開發人員嘗試運行查詢、窗體或基於查詢的報表時,可能會遇到 Out of Memory(內存不足)或 Query too Complex(查詢太復雜)錯誤。這通常是因為您要執行的查詢中包含的表聯接數超出了 Access 的處理能力。為了解決此問題,Access 開發人員通常不得不花費大量資源重新設計查詢以及重建表結構。
SQL Server 已被重新設計,可以支持更靈活的查詢。在一個查詢中,最多可以:
?
在 SELECT 語句中使用 256 個表
?
使用約 256 KB 的查詢文本
?
在 SELECT 語句中使用 4096 個列
還有一點要注意,Access 最多支持 50 個嵌套的子查詢,但 SQL Server 最多只能支持 32 個。
在 Access 和 SQL Server 中創建數據查詢的方式並不一樣。不同之處在於使用的查詢語言和查詢設計器。SQL Server 還支持存儲過程(一種靈活有效的數據查詢存儲方式)和用戶定義的函數(允許您重用業務邏輯)。而且,SQL Server 還提供了比 Access 功能更強大的故障恢復模式。
查詢數據
查詢優化
在 Access 中遠程查詢數據時,所有數據都將返回客戶端,而且篩選和排序也是在客戶端完成的。因為 SQL Server 數據查詢通常通過網絡從客戶端進行,所以可能會發生嚴重的網絡帶寬問題。因此,將後端系統遷移到 SQL Server 時,重要的是要重新設計查詢,以便只將所需的數據集返回客戶端(而不是整個數據集)。例如,某個 Access 窗體暗含的查詢可能是:
SELECT * FROM Customers
打開該窗體時,上面的查詢將返回整個 Customers 表。在 SQL Server 中,必須優化該查詢,以便只返回當前記錄。對應的 SQL 查詢應為:
SELECT * FROM Customers WHERE CustomerID = 'C00010'
這樣將只返回一個行/記錄。每當用戶導航到該窗體中的下一個或上一個記錄時,CustomerID 就會發生變化,而數據庫就需要重新執行查詢以檢索當前記錄。
這種服務器端篩選方法在數據庫服務器上執行篩選和排序,並且只返回最少數量的所需的
您正在看的SQLserver教程是:將 Access 2002 數據庫遷移到 SQL Server。數據,從而有助於減少網絡通信量。
查詢類型
Access 為查看和設計數據查詢提供了多種方法。表 5 列出了將內置的 Access 查詢類型遷移到 SQL Server 時可以使用的選項。
表 5:將 Access 查詢轉換為 SQL Server 查詢的選項 Access 查詢類型 SQL Server 遷移選項
Select
SELECT 語句可以在 T-SQL 文件、存儲過程或視圖中使用。還可以使用內置的 SQL Server 查詢設計器來設計 SELECT 語句,該設計器與 Access 查詢設計器類似(參閱圖 24)。
Crosstab
Crosstab 可以作為 T-SQL 文件、存儲過程或視圖來實現。可以使用臨時表來查詢內存中的 Crosstab 所需的數據集。然後可以聯接和查詢臨時表,以檢索所需的 Crosstab 數據。
將 Access Crosstab 數據轉換為可以在 SQL Server 中使用的數據可能很耗時。您可以考慮使用第三方應用程序自動執行某些步驟。
要處理 Crosstab 查詢,一種更靈活有效且可擴展的解決方案是使用 SQL Server 分析服務。使用分析服務可以創建聯機分析處理 (OLAP) 多維數據集,以生成復雜的動態報表。有關使用 SQL Server 分析服務處理數據的詳細說明,請參閱 ASP" target="_blank">Analysis Services。
Make table
Make table 可以作為 T-SQL 語句實現,該語句使用 SELECT INTO 子句將數據從一個表復制到另一個表中。
Update
Update 語句可以作為使用 UPDATE 子句的 T-SQL 語句或存儲過程進行存儲。
Append
Append 語句可以作為使用 INSERT INTO 子句的 T-SQL 語句或存儲過程進行存儲。
Delete
Delete 語句可以作為使用 DELETE FROM 子句的 T-SQL 語句或存儲過程進行存儲。
圖 24:設計 SELECT 查詢的過程在 Access 和 SQL Server 中很相似
查詢語言功能
表 6 總結了 Access 和 SQL Server 在支持的查詢語言功能方面的主要區別(摘錄自《Access 2002 Desktop Developer's Handbook》,Paul Litwin 等著,SYBEX Inc. 2001 年出版)。
表 6:Access 和 SQL Server 在數據查詢方面的區別 功能 是否受帶有 Jet 4 SQL-92 擴展的 Access SQL 支持 是否受 SQL Server 2000 T-SQL 支持
安全性(GRANT、REVOKE 等)
是
是
事務支持(COMMIT、ROLLBACK 等)
是
是
視圖 (CREATE VIEW)
是
是
臨時表
否
是
FROM 子句中的聯接
是
是
UPDATE 和 DELETE 語句中的聯接
是
否
支持 FULL OUTER JOIN 和 UNION JOIN
否
是
支持在 UPDATE 語句的 SET 子句中使用子查詢
否
是
支持在 DELETE 語句中使用多個表
是
否
SELECT DISTINCTROW
是
否
SELECT TOP
是
否
游標(DECLARE CURSOR、FETCH 等)
否
是
域支持(CREATE DOMAIN、ALTER DOMAIN 等)
否
是
支持檢查約束
是
否
聲明(CREATE ASSERTION、DROP ASSERTION 等)
否
否
行值構造函數
否
否
CASE 表達式
您正在看的SQLserver教程是:將 Access 2002 數據庫遷移到 SQL Server。否
是
在 CREATE TABLE 語句中實現完全的引用完整性支持
否
是
標准化的系統表和錯誤代碼
否
否
標准數據類型
是
是
標准字符串運算符
否
是
標准通配符
是
是
支持 VBA 函數
是
否
其他聚合函數
是
否
TRANSFORM 語句
是
否
在查詢或存儲過程中使用參數
是
是
SELECT INTO 語句
是
是
有關在 SQL Server 中設計 Access 查詢的詳細信息,請參閱 ASP" target="_blank">Migrating Your Access Database to Microsoft SQL Server 7.0。(注意:這篇文章是針對 SQL Server 7.0 編寫的,尚未進行更新。)
為對象編寫腳本的能力
結構化查詢語言 (SQL) 是 Access 和 SQL Server 進行數據訪問和數據處理時使用的標准語言。SQL 語言的最新修訂版稱為 SQL-92,以完成修訂的年份命名。Microsoft 在基本 SQL 語言中添加了自己的某些擴展,這些擴展在兩個 DBMS 解決方案中是不同的。
Access 支持帶有 Jet 4 ANSI-92 擴展的 SQL-92,這使您可以使用 SQL 來管理事務。
Jet 4 ANSI-92 擴展還使您可以更輕松地管理數據庫安全性。但它不支持某些功能,例如,設置和更改數據庫對象所有權。
在 SQL Server 2000 中,Microsoft 在基本 SQL-92 語言中添加了一些自定義擴展。這些擴展增加了對某些重要功能的腳本支持,例如:
?
存儲過程
?
分布式事務
?
操作系統函數
?
更靈活的子查詢
?
在查詢中使用別名
?
備份和恢復數據
T-SQL 語言是對標准 SQL 命令集的有力擴展。它提供了執行以下操作所需的所有功能:
?
在數據庫表中檢索、修改、刪除和添加數據
?
接受和返回參數
?
執行計算
?
運行內置函數和用戶定義的函數
?
在服務器之間復制數據
T-SQL 就像 Access 查詢和 VBA 之間的橋梁,因為它使數據查詢可以與條件邏輯和計算組合在一起。
請注意,SQL Server 完全支持 SQL-92 標准,因此不需要使用擴展。
表變量:對復雜查詢很有用
要在 Access 中對一組聯接表執行計算,您需要創建一個定義聯接的查詢。在使用該數據的應用程序中,每次在 SQL SELECT 語句中使用該查詢時,所有表都需要重新聯接,這可能就是一項耗費資源的操作(尤其是在多用戶環境中)。
例如,要刪除名字以字母 A 開頭的所有客戶並刪除所有客戶訂單和訂單歷史記錄,在 Access 中,您需要:
1.
創建一個 SELECT 查詢,以獲得所有需要的客戶 ID:
SELECT Customers.CustomerID FROM Customers WHERE Customer.FirstName LIKE 'A%'
2.
將上面的 SELECT 查詢包括在三個 DELETE 查詢中,以刪除所有需要的客戶、訂單和訂單歷史記錄:
DELETE FROM Orders WHERE Orders.CustomerID IN ( SELECT Customers.CustomerID FROM Customers WHERE Customer.FirstName LIKE 'A%' ) And DELETE FROM OrderHistory WHERE OrderHist
ory.CustomerID IN ( SELECT Customers.CustomerID FROM Customers WHERE Customer.FirstName LIKE 'A%' ) And DELETE FROM Customers WHERE Customer.FirstName LIKE 'A%'
以這種方式執行該操作的效率非常低,因為每個刪除操作都需要對 Customers 表運行耗費資源的 LIKE 篩選。如果 Customers 表中的記錄增加到數百萬條,執行此類通配符 WHERE 篩選就會產生嚴重的性能問題。
執行該操作的更有效的方式是使用表變量,這是 SQL Server 提供的一項功能。表變量的使用方式類似於 SQL 語法中的常規表。但是,表變量與常規表的不同之處在於表變量暫時存儲在內存中,而不是存儲在硬盤上。因為內存訪問要比硬盤訪問快得多,因此,在對同一個篩選或聯接的數據集執行多個操作時,表變量會很有用。
要使用表變量實現上面的示例,您需要:
1.
聲明表:
DECLARE @tmpCustomerIDs TABLE (CustomerID nvarchar(50))
2.
獲得篩選的記錄集並將它們存儲在表變量中:
您正在看的SQLserver教程是:將 Access 2002 數據庫遷移到 SQL Server。
INSERT INTO @tmpCustomerIDs (CustomerID) (SELECT CustomerID FROM Customers WHERE Customers.ContactName LIKE 'A%')
3.
使用表變量中的值,對客戶、訂單和訂單歷史記錄執行所有刪除操作:
DELETE FROM Orders WHERE Orders.CustomerID IN ( SELECT CustomerID FROM @tmpCustomerIDs ) And DELETE FROM OrderHistory WHERE OrderHistory.CustomerID IN ( SELECT CustomerID FROM @tmpCustomerIDs ) And DELETE FROM Customers WHERE Customers.CustomerID IN ( SELECT CustomerID FROM @tmpCustomerIDs )
臨時表是 SQL Server 為了有效地對動態數據集執行操作所提供的另一個機制。與表變量不同的是,臨時表停留在內存中的時間較長,因此可能需要更多的數據控制和日志記錄資源。
系統故障恢復
在嘗試打開已損壞的數據庫時,大多數 Access 開發人員都遇到過 Unrecognized database format(無法識別的數據庫格式)錯誤,如圖 25 所示。如果系統出現故障(例如操作系統故障或停電),您可以選擇以下解決方法:
?
使用 Access 壓縮和修復工具嘗試從損壞的 .mdb 文件中恢復數據,然後將恢復的數據導入到空數據庫中,以便盡量減少受損壞的記錄數量。這並不是一個萬無一失的措施,數據仍然可能會丟失。
?
從最近的備份恢復。由於需要重新輸入丟失的數據,這可能會浪費資源。
?
運行 Jet 壓縮工具 Jetcomp.exe。通常,這比運行壓縮和修復工具更有效。但是,仍然無法保證所有數據都完好無損。
?
將損壞的數據庫提交給第三方數據庫恢復專家,由他們使用專有方法從數據庫中提取數據。這種方法的費用可能很高,而且由於讓外部人員處理您的數據,還可能會帶來安全隱患。
圖 25:嘗試打開已損壞的 Access 數據庫時出錯
SQL Server 使您可以更好地控制數據恢復過程。您可以為每個 SQL Server 數據庫選擇三種恢復模式之一,以確定如何備份數據,以及在丟失數據時采取哪些措施。這三種恢復模式包括:
?
簡單恢復。可以恢復最近的備份。
?
完全恢復。使數據庫恢復到出現故障之前的狀態。這種模式需要的系統資源和磁盤空間最多(用於日志記錄)。
?
批日志恢復。使數據庫恢復到最後一次備份日志時的狀態。這種模式需要的系統資源和磁盤空間比完全恢復模式少,但很可能需要手動重新輸入數據。
?
這些恢復模式使您可以根據可用的系統資源靈活地選擇進行系統故障恢復的最佳方式。
提示:與 Access 備份相比,SQL Server 數據備份的主要優點是,用戶可以在數據庫運行時完成備份,而不需要從數據庫中注銷。這就增加了數據庫對用戶的可用性,並能保證更長的正常運行時間。
比較數據庫
在 Access 中,根據最新的結構更改實時更新生產數據庫是一項持續的工作。您需要快速斷開數據庫連接以進行結構更改和數據轉換,但是,如果用戶依賴於該系統,則很難完成這項工作。由於可能添加了新的字段和關系,因此數據轉換也需要時間。
要對 Access 數據庫進行結構更改,通常需要:
1.
由開發人員處理應用程序數據庫,對包含數據的數據庫進行結構更改。
2.
跟蹤對包含數據的數據庫所做的更改,並編寫用於執行更新的更新查詢、DAO 或 ADO 代碼。
3.
完成開發後,需要在手動更新時斷開數據庫連接。
可以使用第三方應用程序(例如 SSW Data Renovator)自動完成上述過程中的某些操作,以幫助您盡量減少系統的不可用性,降低發生錯誤的可能性。SSW Data Renovator 可以將新數據庫與生產數據庫進行比較,然後針對二者之間的所有差異生成報表,並提供向導樣式的界面,以便自動將數據遷移到新的結構中。
盡管 SQL Server 具有不需要斷開數據庫連接就能進行結構更新的優點,數據庫管理員仍然必須:
?
分析所有數據庫架構,並針對結構更改而修改日志。
?
手動創建遷移腳本,以便將更改推入目標數據庫。
可以使用第三方工具(例如 Red-Gate SQL Compare 或 SSW SQL Deploy)幫助您自動執行此任務,步驟如下:
?
比較數據庫中的所有對象,包括存儲過程、關系、表、視圖和用戶定義的函數
?
報告所有差異
?
生成可以直接在目標數據庫上運行的遷移腳本
Microsoft SQL Server 2000 是企業級數據庫解決方案,與 Microsoft Access 2002 相比,它極大地改進了可伸縮性、維護性和數據庫恢復功能。由於 SQL Server 基於客戶端/服務器體系結構,所以在通過遠程連接處理和發送數據的方式上與 Access 有很大的不同。SQL Server 還提供了許多功能,使數據查詢、業務邏輯重用和數據備份等任務變得更簡單,更靈活。
ADO.Net
Microsoft .Net Framework 附帶的一種數據訪問模型。它是專門為需要可伸縮性、無狀態和 XML 的 Web 而設計的。
客戶端/服務器體系結構
一種軟件體系結構,它允許多個客戶端向中央服務器或服務器組發出請求,並從這些服務器接收結果,從而改進了可伸縮性。這種體系結構的處理負載由客戶端和服務器共同分擔。
群集
一種直接在硬盤上為數據建立索引和排序的方法,大大提高了數據查詢的速度。
數據轉換服務
SQL Server 附帶的工具,用於在使用基於 OLE DB 體系結構的多種數據源(例如 Microsoft Excel)中導入和導出數據。
OLAP
聯機分析處理。一種數據存儲模型,可以幫助您從不同的角度分析業務數據。例如,您可以使用 OLAP 查看某個時段以超過某個價格的價格在某個地區銷售的所有產品。
SQL Server
您正在看的SQLserver教程是:將 Access 2002 數據庫遷移到 SQL Server。企業管理器
SQL Server 附帶的工具,使您可以輕松地管理數據庫對象、用戶、備份和數據庫權限。
SQL Server 事件探查器
SQL Server 附帶的工具,它可以識別特別耗時或耗費資源的數據庫事務,從而幫助您優化查詢。
SQL Server 查詢分析器
SQL Server 附帶的工具,用於編寫和調試數據庫查詢。
T-SQL
Transact-SQL。對 SQL-92 標准查詢語言的擴展,它提供了 SQL Server 中的擴展功能,例如存儲過程、數據備份和恢復以及分布式事務。
UDDT
用戶定義的數據類型。SQL Server 中的一項功能,它允許您基於現有的 SQL Server 基本數據類型創建您自己的數據類型。UDDT 使您能夠對數據應用更嚴格的業務規則。
UDF
用戶定義的函數。自定義的 T-SQL 語句塊,它使您能夠輕松地在整個數據庫應用程序中重用業務邏輯。
Visual Studio .Net
一種集成的開發環境 (IDE),它使開發人員能夠以可視方式開發各種與 Microsoft .NET 相關的應用程序。它為設計、編譯、測試和部署支持 .Net 的 Web 和 Windows 應用程序提供了功能強大的工具。
XML
可擴展標記語言。一種廣泛采用的標准方式,它以不需要太多人工或計算機操作即可處理的格式來表現文本和數據。
有關詳細信息,請訪問
Microsoft SQL Server 產品頁
關於作者
Adam Cogan 是 SSW 的主要體系結構設計師。SSW 是一家 Microsoft 認證合作伙伴,專門提供基於 Office 和 .NET 的解決方案。在 SSW,Adam 使用 Microsoft 技術(例如 SQL Server 2000、.NET 和 Office 2003)開發了適用於各種業務領域的自定義解決方案。Adam 還組建了悉尼的 Microsoft .Net 用戶組,並積極參與該地區的 INETA 管理過程。