我們知道,在SQL SERVER企業管理器中,在“設計表”狀態下,當查看該表的CHECK約束時,會看到CHECK約束有“創建中檢查現存數據”、“對復制強制約束”、“對INSERT和UPDATE強制約束”三個復選框,那么如果不在企業管理器環境下,或者在應用程序中,我們如何得知某個CHECK約束的這三個選項是否選中呢?
我查看了相關系統表的幫助說明,但里面對好多字段的說明都為“保留”、“僅供內部使用”等,沒有字段的作用說明。但我發現當改變三個選項的選中狀態時,sysobjects中相應CHECK約束記錄的status字段值發生改變,為了得知其中是否有規律可循,我做了如下測試并得出一些結論,拿出來共享。
“創建中檢查現存數據”、“對復制強制約束”、“對INSERT和UPDATE強制約束”三項屬性分別對應000的三位,0為不選,1為選中。
建立一個測試表,為其建立列級CHECK約束和表級CHECK約束,先令其為空表。
下面結果中,等號左邊為三個屬性的選中狀態,右邊為sysobjects表中約束記錄的status字段值:
對于列級約束:
000=3330
001=3074
010=2306
011=2050
100=3330(保存后仍未選中,不知為何)
101=3074
110=2306
111=2
發現除111外,其余首位為1均作為0看待。
對于表級約束:
000=3328
001=3072
010=2304
011=2048
100=3328
101=3072
110=2304
111=0
可發現與列級約束有同樣的問題,同時,對于相同的二進制值,表級約束比列級約束少2。
但值得注意的是,以上測試是在表中無數據的情況下,故可能引起三位二進制數的最高位無意義。下面測試表中有數據的結果(在測試表中插入了符合各CHECK約束的數據):
對于列級約束:
000=3330
001=3074
010=2306
011=2050
100=3330
101=3074
110=2306
111=2
對于表級約束:
000=3328
001=3072
010=2304
011=2048
100=3328
101=3072
110=2304
111=0
可見結果完全相同。
猜測原因是“創建中檢查現存數據”一項只在CHECK約束保存瞬間作用,保存后系統即將其取消,故若查看已有的CHECK約束,該選項已無意義,故為不選中狀態。
但在pubs庫中,發現系統已有的一些CHECK約束的status初始值為6,不知何解?不過修改后與以上結果相符。