臨時表在Oracle數(shù)據(jù)庫與SQL Server數(shù)據(jù)庫中的異同(1)
常見應(yīng)用:
臨時表在數(shù)據(jù)庫設(shè)計中,有著舉足輕重的作用。
如我們可以利用臨時表的功能來限制同一個用戶名多次登陸到同一個系統(tǒng)中去。例如現(xiàn)在有一個財務(wù)管理系統(tǒng),企業(yè)希望同一個用戶在同一時間里只能登陸一次,這主要是用來限制每位員工都以自己的用戶名與密碼登陸。如此限制的目的主要是為財務(wù)管理系統(tǒng)中的每張單據(jù)找到其主人。
原始方案:
在以前數(shù)據(jù)庫設(shè)計的時候,也有人不用臨時表進(jìn)行這方面的限制,而用實體數(shù)據(jù)庫表來登記相關(guān)的信息。如在用戶信息表中有一列專門用來記錄用戶的當(dāng)前登陸狀態(tài)。當(dāng)用戶登陸系統(tǒng)后,該用戶登陸狀態(tài)的字段就改為Y,而當(dāng)用戶退出系統(tǒng)能后,該字段的內(nèi)容又改為N。這個方案看起來是可行的,但是,其在實際應(yīng)用中,有一個非常大的漏洞。若用戶登陸到系統(tǒng)后,終端因為各種原因,如病毒、斷電等突然狀況,發(fā)生死機的話,此時,用戶雖然沒有登陸到系統(tǒng)中去,但是,因為其退出系統(tǒng)的時候,沒有正常退出,這就導(dǎo)致在財務(wù)管理系統(tǒng)中的用戶信息表中,顯示該用戶的登陸狀態(tài)仍然為Y。此時,用戶嘗試登陸到財務(wù)管理系統(tǒng)中去的話,就會被系統(tǒng)拒絕,系統(tǒng)會認(rèn)為該用戶已經(jīng)登陸了系統(tǒng),不能重復(fù)登陸。
所以說,利用實體表來記錄用戶登陸的信息,存在著管理上的漏洞。
利用臨時表實現(xiàn)用戶重新登陸的限制:
后來,數(shù)據(jù)庫設(shè)計師們想,能否把該用戶登陸信息記錄在一張臨時性的表中呢?當(dāng)用戶結(jié)束會話,無論是正常的退出還是因為意外情況的退出,只要用戶結(jié)束一個會話后,那么該臨時表中的內(nèi)容就會清空。
若跟這個需求結(jié)合的話,數(shù)據(jù)庫設(shè)計師就希望能夠?qū)崿F(xiàn)如下功能。
當(dāng)用戶登陸系統(tǒng)開始一個會話后,數(shù)據(jù)庫系統(tǒng)就建立一張臨時表,該表中至少有一個內(nèi)容,就是用戶的帳號(或者該帳號對應(yīng)的ID)。當(dāng)有其他用戶登陸到系統(tǒng)的時候,系統(tǒng)會先從這張臨時表中查詢,是否有相同的用戶記錄。若有的話,就會拒絕用戶的登陸,警告用戶已經(jīng)有相同的用戶登陸了。當(dāng)用戶正常退出系統(tǒng)或者因為以外情況退出系統(tǒng)結(jié)束當(dāng)前會話的時候,那么數(shù)據(jù)庫系統(tǒng)就會清除這張表的內(nèi)容。如此,當(dāng)用戶下次登陸系統(tǒng)的話,即使是在意外情況下登陸系統(tǒng)的,也可以正常的登陸。
可見,數(shù)據(jù)庫的臨時表在企業(yè)實際應(yīng)用中有著舉足輕重的作用。
在ORACLE數(shù)據(jù)庫與SQL SERVER數(shù)據(jù)庫中,都實現(xiàn)了臨時表的功能。不過兩者實現(xiàn)的方式有差異。而不同的實現(xiàn)方式又賦予了其不同的特點,這是我們在數(shù)據(jù)庫選型中不得不重視的一方面內(nèi)容。
兩個數(shù)據(jù)庫臨時表實現(xiàn)方式的異同:
SQL SERVER臨時表跟ORACLE數(shù)據(jù)庫臨時表的差異,可以利用一句話來概括。SQL SERVER 臨時表是在需要用到的時候創(chuàng)建;而ORACLE 數(shù)據(jù)庫的臨時表,則是在數(shù)據(jù)庫初始化中就開始創(chuàng)建,在具體的會話或者事務(wù)開始后進(jìn)行操作,結(jié)束一個會話或者結(jié)束一個事務(wù)后該數(shù)據(jù)庫的內(nèi)容就會被清空。
1、在創(chuàng)建時的異同。 SQL SERVER 數(shù)據(jù)庫的臨時表,是在實際需要時創(chuàng)建的。具體的來說,可以利用SELECT語句與CREAT語句創(chuàng)建臨時表。如可以利用SELECT * INTO #USER_TEMP FROM USER;通過這條語句就可以在需要的時間創(chuàng)建一張臨時表。除此之外,還可以利用CREATE語句,在需要的時候創(chuàng)建臨時表。
而ORACLE數(shù)據(jù)庫,是在數(shù)據(jù)庫系統(tǒng)初始化的過程中,就需要建立臨時表。也就是在用戶安裝財務(wù)管理軟件系統(tǒng)時,初始化數(shù)據(jù)庫系統(tǒng)時,系統(tǒng)就會創(chuàng)建臨時表。而不是在臨時表需要用到的時候,才被創(chuàng)建。故,ORACLE數(shù)據(jù)庫的臨時表創(chuàng)建方式只有一種,在數(shù)據(jù)庫初始化的時候,利用CREATE創(chuàng)建數(shù)據(jù)庫臨時表。所以,ORACLE數(shù)據(jù)庫臨時表,又有另一種說法。我們一般稱ORACLE數(shù)據(jù)庫的臨時表是永久性的,只是臨時表的內(nèi)容是臨時的,在需要用到臨時表時,只要直接調(diào)用即可,而不用臨時創(chuàng)建。這不像SQL SERVER數(shù)據(jù)庫那樣,只有在用到時,才創(chuàng)建該臨時表;當(dāng)結(jié)束會話時,不僅表中的數(shù)據(jù)被清空了,而且該表也被刪除了。
筆者評論:
筆者還是比較喜歡ORACLE數(shù)據(jù)庫臨時表的實現(xiàn)方式。為什么呢?因為我們都知道,數(shù)據(jù)庫定義語言,如CREATE等,比較占用系統(tǒng)資源。若在數(shù)據(jù)庫SQL SERVER數(shù)據(jù)庫系統(tǒng)設(shè)計的過程中,前臺程序頻繁的使用CREATE等數(shù)據(jù)庫定義語言創(chuàng)建臨時表的話,會對SQL server數(shù)據(jù)庫系統(tǒng)的運行效率產(chǎn)生很大的不利影響;而且,每次運行的話,都會有類似的不利影響,因為每次運行都會有一個創(chuàng)建臨時表的過程。而ORCLE數(shù)據(jù)庫中,則是在系統(tǒng)初始化的時候才利用CREATE語句,所以,只是在系統(tǒng)初始化的時候,可能性能會受到影響,而在以后的數(shù)據(jù)庫運行中,就不會為這個老是運行CREATE語句而困饒。所以,我個人還是比較喜歡采用ORACLE系統(tǒng)的臨時表處理方案。
