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