周進平+宋紹云
摘要:數(shù)據(jù)庫的安全機制保障了數(shù)據(jù)庫中數(shù)據(jù)的完整性,如果不允許為空的數(shù)據(jù)項信息不全時無法寫入數(shù)據(jù)。利用數(shù)據(jù)庫的這一特點,用軟件控制數(shù)據(jù)庫的寫錯誤,從而實現(xiàn)了軟件試用限制的功能。
關鍵詞:數(shù)據(jù)庫;寫錯誤;試用限制a
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)04-0032-02
在開發(fā)信息管理軟件時,我們常常在試用版中進行試用時間的限制,在信息增加、修改時進行判斷試用時間到了就跳過保存。但是如果到期了,修改一下電腦系統(tǒng)日期還可以再接著使用,使用試用次數(shù)限制的方式也容易通過破解軟件跟蹤到跳轉(zhuǎn)點,運用數(shù)據(jù)庫自己的安全機制,在數(shù)據(jù)庫寫入出錯時信息就不能保存這一特點,可以更巧妙地實現(xiàn)軟件試用功能的限制。
1 意外的發(fā)現(xiàn)
曾經(jīng)在寫一個信息管理系統(tǒng)時,使用的是ACCESS數(shù)據(jù)庫,功能全部測試正常,刻錄光盤交付使用,從光盤復制到電腦上時出現(xiàn)了一個問題,新增一條記錄時系統(tǒng)提示新增成功,但是查詢信息時卻看不到新增加的信息,只有以前錄入的信息可以正常查詢。軟件功能在我的電腦上已經(jīng)測試過多次了,一直都是正常的,為什么到了這臺電腦上卻不行了?我把這個模塊的代碼是檢查了三遍也沒發(fā)現(xiàn)有什么錯誤,問題出在哪里?最后才發(fā)現(xiàn)數(shù)據(jù)庫文件的屬性在通過光盤復制到新電腦的磁盤時變成了只讀,把數(shù)據(jù)庫文件的屬性中的只讀取消,再次測試系統(tǒng),功能全部正常。這個問題讓我花了半天的時間,過后一想,這個問題可以加于利用一下,我在程序代碼中增加一小段代碼來控制數(shù)據(jù)庫文件的只讀屬性,這樣就可以給軟件設置全功能的試用時間了。
db="mdb/xxpj@jksmdb.asa" '數(shù)據(jù)庫文件的位置
sysyy=15 '2015年開始,試用185天
sysmmdd=now()
if datediff("d",Cdate("20"&sysyy&"-"&sysmmdd),date())>185 then
Dim fso,f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile( Server.MapPath(""&db&""))
if f.attributes <> 1 then
f.attributes = 1
end if
end if
通過上面的幾行代碼,在試用時間結(jié)束時,將數(shù)據(jù)庫文件的屬性改為只讀,這樣系統(tǒng)就只有查詢功能了,任何新增、修改信息在保存時都是提示保存成功,但信息卻不能寫到數(shù)據(jù)庫中,回到查詢窗口自然就找不到剛才操作的信息了,這時再修改電腦系統(tǒng)日期也沒用了,因數(shù)據(jù)庫的屬性已經(jīng)改成只讀了,這樣的方式在利用破解軟件跟蹤時,程序是按順序執(zhí)行下去的,保存指令也執(zhí)行了。
2 擴展一下
這個辦法對于SQL Server或MySql數(shù)據(jù)庫有用嗎?直接操作數(shù)據(jù)庫文件來修改文件屬性是不可能的,查詢了一下百度,要實現(xiàn)SQL Server數(shù)據(jù)庫的只讀還是可行的,可以使用如下命令來設置sql server數(shù)據(jù)庫的只讀特性。
以下是以SQL Server的mydb數(shù)據(jù)庫為例來說明的:
USE [mydb]
GO
ALTER DATABASE [TESTDB] SET READ_ONLY WITH NO_WAIT
GO
對于MySql數(shù)據(jù)庫卻不太好實現(xiàn)了,flush tables with read lock或者set global read_only=1可以修改數(shù)據(jù)庫的屬性,但擁有super權(quán)限的仍然可以寫操作,有沒有更好的辦法來實現(xiàn)呢?一直沒能找到實現(xiàn)的辦法。
3 找到新辦法
這幾天在開發(fā)一個網(wǎng)絡報名信息管理系統(tǒng)時使用的是SQL Server的數(shù)據(jù)庫,在設計數(shù)據(jù)庫時有一個表的字段較多,在以前的ACCESS數(shù)據(jù)庫做過就想偷懶一下,由ACCESS數(shù)據(jù)庫導到SQL Server數(shù)據(jù)庫中來,ok,成功了。在完成模塊代碼后測試功能,糟了,新增數(shù)據(jù)寫不到數(shù)據(jù)庫中了,檢查了程序代碼也沒發(fā)現(xiàn)問題,想到以前遇到過這個問題,就去查看數(shù)據(jù)庫的屬性,正常呀。為什么不能增加記錄呢?修改也不行。頭大了。只好去求助百度了,可是把百度上解決SQL Server數(shù)據(jù)庫不能寫的辦法都試了一遍,問題還是依舊。只好從頭來檢查修改程序代碼,沒用。再來檢查數(shù)據(jù)庫,檢查到這個由ACCESS數(shù)據(jù)庫導入的表時發(fā)現(xiàn),除了編號字段不允許為空以外,還有一個可以為空的字段不知什么原因也被設置成了不允許為空,因為在程序中新增記錄時這個字段是可以不填的,所以在新增記錄時沒有填寫這個數(shù)據(jù)項,保存數(shù)據(jù)時數(shù)據(jù)庫就認為出錯,導致新增記錄無效,也就出現(xiàn)了系統(tǒng)開發(fā)中的問題。問題解決了。
設置一個無關緊要的字段為不允許為空,在新增記錄時又不填寫這個字段時就會導致數(shù)據(jù)庫新增失敗,這個辦法用來解決去年想實現(xiàn)的問題不是挺好的嗎!
UPDATE xjxxb SET beizhu = "'" WHERE beizhu = ""
ALTER table xjxxb ALTER column beizhu varchar(100) not null
注意修改前需要把這個字段中為空的那些信息填個字符“”進去,修改時一定要帶上字段類型,不然是修改不成功的。
兩行代碼就實現(xiàn)了我想要的功能,而且這個辦法在每個類型的數(shù)據(jù)庫中都可以實現(xiàn),比起設置數(shù)據(jù)庫屬性為只讀要方便可行。
4 結(jié)束語
沒想到在遇到問題時卻發(fā)現(xiàn)了原來問題的解決辦法。我們都怕出現(xiàn)問題,都要解決問題,但是我們可以自己制造問題,利用問題來解決問題,從而實現(xiàn)我們想要的功能。
參考文獻:
[1] 蘇俊.數(shù)據(jù)庫基礎教程[M]. 北京:中國人民大學出版社,2004.
[2] SQL Server 2000基礎[M]. 北京: 紅旗出版社,2005.
[3] 范德蘭斯. SQL完全手冊[M]. 北京: 電子工業(yè)出版社,2007.
[4] 王向云,王嶸,張琨.SQL從入門到精通[M]. 北京: 電子工業(yè)出版社,2009.