舊 Microsoft Access 數(shù)據(jù)的新生
2024-09-07 19:05:08
供稿:網(wǎng)友
在計(jì)算機(jī)和軟件世界艱難地向前發(fā)展的過(guò)程中,存在的一個(gè)不幸的事實(shí),有時(shí)我們發(fā)現(xiàn)自己必須丟棄舊的數(shù)據(jù)。 我們從一個(gè)字處理 Office 程序包轉(zhuǎn)移到另一個(gè)程序包,就發(fā)現(xiàn)舊的文檔再也打不開(kāi)了。
同樣的情況也發(fā)生在數(shù)據(jù)庫(kù)上。 一個(gè)小公司可能覺(jué)得將信息存儲(chǔ)在一個(gè) PC 數(shù)據(jù)庫(kù)中就足夠了,但在該遷移信息時(shí)將發(fā)生什么? 我們可能很苦惱要丟掉有價(jià)值的信息,但的確經(jīng)常扔掉這些信息。 不過(guò),當(dāng)時(shí)可能看起來(lái)不是非常主要并被丟棄的信息,有時(shí)可能會(huì)需要。
我最近就碰到這樣一個(gè)問(wèn)題。 我工作的一個(gè)社區(qū)機(jī)構(gòu)有一個(gè)基于 PC 的應(yīng)用程序,它帶有一個(gè)相當(dāng)大的 Microsoft access 格式的會(huì)員數(shù)據(jù)庫(kù)。 已經(jīng)編寫了一個(gè)來(lái)自第三方的用戶程序來(lái)與該數(shù)據(jù)庫(kù)一起工作,但隨后許可過(guò)期了,再?zèng)]有方法來(lái)獲取該軟件的更新。 碰巧,忽然又非常需要這些信息。 我們備份了舊的數(shù)據(jù)庫(kù),并將之存儲(chǔ)在一個(gè) linux 系統(tǒng)上。 在新的開(kāi)放源代碼世界中,為我們提供了許多強(qiáng)大的數(shù)據(jù)庫(kù)(如 Linux 上的 Oracle 數(shù)據(jù)庫(kù))。 一種選擇是購(gòu)買一份 Microsoft Access 并創(chuàng)建一個(gè)應(yīng)用程序,但這將把我們限制在同一個(gè)特定模型中,而這本來(lái)就已經(jīng)使我們陷于困境。 此外,公司希望能夠從一個(gè)安全的服務(wù)器遠(yuǎn)程訪問(wèn)這些數(shù)據(jù)。
再次依靠 Microsoft 不是我們希望的選擇。 Linux 將作為這個(gè)新的數(shù)據(jù)庫(kù)服務(wù)器的基礎(chǔ),并且它將運(yùn)行一個(gè)行業(yè)標(biāo)準(zhǔn)的 SQL 數(shù)據(jù)庫(kù)。 因此,假如我們著手取出限制在舊的 MDB 文件中的數(shù)據(jù) — 而不依靠于安裝帶新的 Access 許可的 Windows 服務(wù)器(這樣將再次受限于一個(gè)單體系結(jié)構(gòu)解決方案),那將如何?
到處尋找解決困境的解決方案,我來(lái)到了 Brian Burns 的網(wǎng)站,并知道了他的 mdBTools 程序包,該程序包是命令行工具的一個(gè)集合還有一個(gè) GUI,它的唯一的目的是提供從 Access 數(shù)據(jù)庫(kù)中取出信息方法。
獲取和安裝 mdbtools
您需要做的第一件事是獲取一份 mdbtools 程序包。 轉(zhuǎn)至 http://mdbtools.sourceforge.net/,您將找到源代碼和適用于幾種基于 RPM 的版本的 RPM 程序包。 從源代碼進(jìn)行編譯非常簡(jiǎn)單,包括提取到構(gòu)建 5 個(gè)步驟。
tar -xzvf mdbtools-0.5.tar.gz
cd mdbtools-0.5
./configure
make
su -c "make install"
還可能通過(guò)下載和從 CVS 進(jìn)行構(gòu)建獲得最新和最好的程序包。 這并不像它聽(tīng)起來(lái)那么復(fù)雜。 從連接并匿名登錄 CVS 服務(wù)器開(kāi)始。
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mdbtools login
下一個(gè)步驟是查看 mdbtools 程序包:
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mdbtools co mdbtools
注重前面的每一條命令都是完整的一行。 在輸入上面的命令之后,當(dāng)下載進(jìn)行時(shí),您將看到一個(gè)包含該版本中的各種文件的列表在屏幕上逐行顯示。 當(dāng)下載完成時(shí),轉(zhuǎn)移到下載目錄(名稱為 mdbtools)并執(zhí)行以下命令。
./autogen.sh --enable-sql --with-unixodbc=/usr/local
make:
su -c "make install"
對(duì) mdbtools 進(jìn)行一些研究
mdbtools 程序包自帶了一系列命令行工具以及一個(gè) GUI,用于從 mdb 文件中處理和提取數(shù)據(jù)。 我將馬上說(shuō)明這個(gè) GUI,但首先我想向您介紹一些命令行工具。 這些工具中最基礎(chǔ)的是 mdb-ver,您可以用它來(lái)識(shí)別您要處理的 mdb 文件的類型。
$ mdb-ver members.mdb
JET3
這種情況下的結(jié)果是 "JET3",它告訴我我的社區(qū)會(huì)員文件是基于 Access 97 應(yīng)用程序的。
返回值是 "JET4",則是 Access 2000 或 Access XP 數(shù)據(jù)庫(kù)。 使用 mdb-tables 命令將開(kāi)始出現(xiàn)稍微有趣一點(diǎn)的信息。
$ mdb-tables members.mdb
ActionTaken CaseMembers ContactFollowUp ContactReason ContactSource
ContactStatus Donations Issues Location MemberInfo PersonContacted Status ToDo
默認(rèn)情況下,所有的數(shù)據(jù)庫(kù)表將轉(zhuǎn)儲(chǔ)到一行上。 為了分別列出(每行一個(gè)表),可以使用 -1 標(biāo)記。 不過(guò),一些表不會(huì)顯示;這些是系統(tǒng)表(以 Msys 開(kāi)頭的表)。 假如您希望這些表也列出來(lái),那么可以使用 -S 標(biāo)記。
上面的輸出為您提供了組成您的 Access 數(shù)據(jù)庫(kù)的各種表的具體分類。 有趣的是,我們實(shí)際上可以在數(shù)據(jù)庫(kù)上執(zhí)行 SQL 查詢(盡管只能使用 SQL 的一個(gè)有限的子集),即使數(shù)據(jù)庫(kù)不再在一個(gè) Microsoft 系統(tǒng)上運(yùn)行。 這就是 mdb-sql 命令的用途。 要進(jìn)入交互式的 SQL 解釋程序,可以輸入 mdb-sql,后面緊跟數(shù)據(jù)庫(kù)名稱。 您將看到 1 => 提示符,您可以在提示符處輸入單行或多行查詢。 當(dāng)您完成輸入并且想運(yùn)行查詢時(shí),輸入 go,然后按 Enter 鍵。
$ mdb-sql members.mdb
1 => list tables
2 => go
在上面的例子中,我基本上重新創(chuàng)建了 mdb-tables 命令。 其不同之處是輸出限定在美觀的、帶有標(biāo)題并且四周用虛線框起來(lái)的表中。 當(dāng)調(diào)用 mdb-sql 時(shí),您可以重載這一行為,用 -H 來(lái)取消標(biāo)題,用 -p 來(lái)去除邊框。
$ mdb-sql -H -p members.mdb
您可以隨時(shí)通過(guò)輸入 quit 并按 Enter 鍵來(lái)退出 SQL 解釋程序。
要?jiǎng)?chuàng)建一條查詢,您可以使用默認(rèn)的交互模式或在一行上發(fā)送一條查詢。 在下面的例子中,我使用了另一條命令 — describe table 查詢,該命令讓我能夠更深入地挖掘數(shù)據(jù)庫(kù)的表的格式。
$ echo "describe table Location" mdb-sql members.mdb
+------------------------------+--------------------+----------+
Column Name Type Size
+------------------------------+--------------------+----------+
ID Long Integer 4
Address1 Text 255
Address2 Text 255
Address3 Text 255
Phone Text 50
Fax Text 50
DefaultInd Boolean 0
+------------------------------+--------------------+----------+
為了便于使用腳本,還可以用 -I 標(biāo)記從外部文件中導(dǎo)入查詢,以及用 -o 標(biāo)記并指定一個(gè)文件名來(lái)將查詢輸出到一個(gè)文本文件中。
利用這些簡(jiǎn)單的 SQL 查詢,我們能夠了解到關(guān)于數(shù)據(jù)庫(kù)的布局和其相關(guān)的表的許多信息。 通過(guò)加上邊框的標(biāo)題和美觀的顯示格式,我們可以導(dǎo)出到文本文件中,并利用 shell 腳本來(lái)處理結(jié)果。 實(shí)際上,假如您所需要只是您的舊數(shù)據(jù)的一些簡(jiǎn)單的報(bào)表,那么以上操作就足夠了。 不過(guò),假如您希望將數(shù)據(jù)庫(kù)移植到一個(gè)基于服務(wù)器的 SQL 數(shù)據(jù)庫(kù)(如 Oracle)中,那么 mdbtools 也可以在此為您提供幫助。 (當(dāng)然,一旦您達(dá)到了這個(gè)目的您將如何處理數(shù)據(jù)就是一個(gè)完全不同的主題了。)
取出數(shù)據(jù)
取出數(shù)據(jù)至少有兩個(gè)步驟。 第一步是在您的服務(wù)器上創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)和它相關(guān)的表。 第二步是加載數(shù)據(jù)。 利用上述示例,您可以獲得關(guān)于組成原始的 Access 數(shù)據(jù)庫(kù)的各種表的所有具體信息。 然后利用這些信息,您可以編寫必需的腳本來(lái)專門為您的數(shù)據(jù)庫(kù)逐個(gè)地重新創(chuàng)建這些表。 幸運(yùn)的是,您不用太費(fèi)力,因?yàn)?mdbtools 程序包也為此提供了一個(gè)工具。 它就是mdb-schema。 考慮到我的社區(qū)會(huì)員表包含了一些敏感信息,所以讓我用 Microsoft Access 自帶的練習(xí)數(shù)據(jù)庫(kù) Northwind.mdb 來(lái)進(jìn)行演示。
$ mdb-schema Northwind.mdb
結(jié)果是模式的一個(gè)文本文件,該文件以 DDL(數(shù)據(jù)定義語(yǔ)言)格式發(fā)送至標(biāo)準(zhǔn)輸出。 假如您想捕捉該輸出(非常有用)則務(wù)必將該輸出重定向到一個(gè)文件中。 DDL 輸出默認(rèn)是 Access 格式(如以下示例所示)。
DROP TABLE Customers;
CREATE TABLE Customers
(
CustomerID Text (10),
CompanyName Text (80),
ContactName Text (60),
ContactTitle Text (60),
Address Text (120),
City Text (30),
Region Text (30),
PostalCode Text (20),
Country Text (30),
Phone Text (48),
Fax Text (48)
);
上面的輸出只顯示了一個(gè)表(為簡(jiǎn)潔起見(jiàn)),現(xiàn)在正好可以告訴您,您可以利用 -T 標(biāo)記來(lái)指定單個(gè)表(我將馬上演示這一操作)。
DDL 輸出的數(shù)據(jù)庫(kù)格式稱為后端。 這時(shí)支持五個(gè)不同的后端。 它們是 "access" — 代表 Microsoft Access;"sybase" — 代表 Sybase;"oracle" — 代表 Oracle;和 "postgres" 代表 PostgreSQL(以及在 CVS 代碼中的 "MySQL" — 代表 MySQL)。 因此,要為 SavedQueries 表創(chuàng)建 Oracle 格式的 DDL,我使用下面的命令: