微軟公司的SQL Server是目前小型網絡中常用的數據庫管理系統之一。面向這種網絡數據庫的應用程序也在日益增多,這種網絡數據庫應用系統的正常運行,一般都依賴於已經存在的用戶數據庫。創建數據庫的工作當然可以用SQL Server提供的SQL Enterprise Manager工具來完成,但是,如果能夠提供一種定制的數據庫管理工具,專門管理應用系統需要的數據庫及其設備,對用戶來說無疑更加理想。
現存問題
我們知道,在使用CREATE DATABASE語句創建一個數據庫之前,必須存在一個有剩余空間的數據庫設備,或者事先使用DISK INIT語句創建一個新設備。但是這些語句含有很多必需的參數,而且如果不使用SQL Server的管理工具,很多參數值往往難以確定。
以創建數據庫設備的DISK INIT語句為例,這個語句的完整語法如下:
DISK INIT
NAME =‘logical_name,
PHYSNAME =‘physical_name,
VDEVNO = virtual_device_number,
SIZE = number_of_2K_blocks
[, VSTART = virtual_address]
其中NAME和SIZE這兩個參數都很容易得到,麻煩的是物理名PHYSNAME和虛擬設備號VDEVNO這兩個參數。前者要求是一個服務器上的物理文件全路徑名;後者要求在1~255之間找一個沒有被別的設備占用的號碼。而在編寫數據庫管理程序時,用戶的服務器上有哪些設備號已經被占用,SQL Server裝在哪個驅動器上,都是無法預料的。
雖然,使用SQL Server的管理工具SQL Enterprise Manager,可以非常方便地創建、刪除數據庫設備,或者擴大一個已經存在的數據庫,也可以非常方便地創建、刪除或者修改一個數據庫,但是,這個工具仍然要求我們輸入很多不太常用的參數,界面稍顯復雜。
所以,理想的情況是:用戶只需要按下一個命令按鈕,應用程序需要的數據庫及其設備都能立即自動地創建好。
解決方案
為了實現這樣的目標,我們必須想辦法解決SQL語句中的參數設置問題。
1.創建設備的語句參數
創建設備的語句即前面提到的DISK INIT語句。
為了簡化問題,我們可以指定與數據庫名相同的設備文件名,並將設備文件保存在master設備所在的子目錄中。數據庫名是在設計應用程序時已經確定;而master設備所在的子目錄,可以從系統表sysdevices中查詢得到。這樣,設備文件的物理名參數就確定下來了。
虛擬設備號的問題則比較復雜,因為sysdevices系統表中沒有“虛擬設備號”這樣一個字段,因此,必須另想辦法。
對SQL Server的系統存儲過程sp_helpdevice進行分析之後,我們發現,虛擬設備號是“隱藏”在sysdevices系統表的low字段中的,借助另一個系統表spt_values,可以找到每個設備的虛擬設備號。這樣,我們只需要在一個循環中找一下某個設備號是否存在於sysdevices中,就可以確定我們現在可用的虛擬設備號。
至於數據庫設備的大小,我們不妨設得大一些,或者讓用戶指定一下也可以。
2.創建數據庫的語句參數
創建數據庫的語句如下:
CREATE DATABASE database_name
[ON {DEFAULT | database_device} [= size]
[, database_device [= size]]...]
[LOG ON database_device [= size]
[, database_device [= size]]...]
[FOR LOAD]
其中,大部分參數都是可選的,我們只需要指定一個設備名及數據庫的大小即可,而數據庫名、設備名、大小在創建設備的時候已經確定好了,所以,這個語句的參數不存在問題。