數據庫的完整性是影響客戶/服務器應用系統正常運行的重要因素。維護數據庫的完整性不僅是數據庫設計人員的任務,也需要客戶端開發人員的積極參與。不在客戶端進行完整性約束,一般會引起ODBC錯誤,導致數據庫操作失敗,程序異常中斷。更為嚴重的是在某些情況下會突破服務器的約束機制,破壞後台數據庫的完整性。因此,只有雙方相互配合才能開發出完整、可靠的客戶/服務器系統。下面以MSSQLServer6.5和VB5.0為例,對客戶端應用開發中的數據庫完整性問題進行討論。其原理同樣適用於其他開發環境。
數據庫完整性分類
實體完整性(EntityIntegrity),指表和它模仿的實體一致。
域完整性(DomainIntegrity),某一數據項的值是合理的。
參照(引用)完整性(ReferenceIntegrity),在一個數據庫的多個表中保持一致性。
用戶定義完整性(User-definedIntergrity)。
分布式數據完整性(DistributeddataIntegrity)。
其中分布式數據完整性不在本文的討論范圍。
數據庫完整性的解決方法
在MSSQLServer6.5中,用約束的方法來保證上述完整性。
●列約束
NOTNULL為指定該列不能為空值;
DEFAULT為指定當沒有輸入值時該列的默認值;
UNIQUE為指定該列不能有重復值,但可對定義為關鍵字以外的任何列使用;
CHECK為對列指定規則,如值的定義域,可限制輸入到受約束列中的值。
●表約束
PRIMARYKEY為對表指定主關鍵字。用來保證列的完整性和引用完整性。它的主要作用:
1.通過確保一個或多個列不允許輸入重復值來保證表的所有行是唯一的。
2.保證受約束的列不允許為空值。從這個角度來講,相當於NOTNULL和UNIQUE。
FOREIGNKEY為指定外來關鍵字。與定義在相關表上的PRIMARYKEY一起使用。
●斷言Assertion(多個表上的約束)
MSSQLServer6.5還提供了數據完整性擴展,如用戶自定義類型、規則、存儲過程和觸發器。SQLServer6.5對不同完整性的約束方法見下表。
客戶端數據庫操作程序開發准則
1.插入操作
檢查非空字段,保證有輸入。如VB中一般用Text控件獲得用戶輸入,則:
If Len(el_l.Text)=0 Then
MessageBox"該字段不能為空!"
EndIf
檢查受UNIQUE約束的字段不能有重復值輸入。如對順序編號等字段采用自動增量的方式,或者在接受輸入前檢查數據庫。對布爾型字段,使用Check控件供用戶輸入,以限制非法數據。對有限的枚舉列字段,使用ListBox或ComboBox控件,列出全部有效值供用戶挑選。對外來關鍵字字段,使用ListBox或ComboBox控件,動態列出全部有效值供用戶挑選。如在一個設備管理數據庫中,企業信息表FacMsg中的"企業名稱"字段是設備Devices中"企業名稱"字段的外來關鍵字。當成功地添加了一個新企業記錄後,要將新企業的名稱添加到FrmDevices的FacName列表控件中。
FacName.AddItem"企業名稱"
同樣,當成功地刪除了一個企業記錄後,要將該企業的名稱從FrmDevices的FacName列表控件中刪除。
2.刪除操作
刪除記錄前檢查是否有字段值被相關表的記錄所引用。
3.修改操作
檢查修改字段值是否被相關表的記錄所引用;
檢查修改字段值是否被相關表的記錄所引用;
檢查修改後的字段值是否違反相關的約束規則。
4.擴展操作
充分考慮擴展的約束,如自定義類型、規則、存儲過程和觸發器,以免造成沖突。
實踐表明,采用以上方法可以有效避免用戶(尤其是對系統不熟悉的用戶)的非法輸入,同時彌補《計算機世界》1998年第36期"用VB5RDO訪問數據庫出現的缺陷及改正"一文所指出的數據庫缺陷。->