創(chuàng)建Oracle同義詞帶來的3種意外驚喜
Oracle數(shù)據(jù)庫中提供了同義詞管理的功能。Oracle同義詞是數(shù)據(jù)庫方案對象的一個別名,經(jīng)常用于簡化對象訪問和提高對象訪問的安全性。在Oracle數(shù)據(jù)庫中的大部分?jǐn)?shù)據(jù)庫對象,如表、視圖、同義詞、序列、存儲過程、函數(shù)、JAVA類、包等等,數(shù)據(jù)庫管理員都可以根據(jù)實際情況為他們定義同義詞。通過Oracle數(shù)據(jù)庫同義詞管理,可以給數(shù)據(jù)庫管理員與應(yīng)用程序開發(fā)人員帶來不少驚喜。
驚喜一:應(yīng)用程序開發(fā)可以不管數(shù)據(jù)庫的具體對象名。
在應(yīng)用程序中,要不斷的調(diào)用Oracle數(shù)據(jù)庫的對象,如表、視圖、對象等等。為此,在管理軟件開發(fā)的過程中,若應(yīng)用程序已經(jīng)完成了某部分功能的開發(fā)。此時,數(shù)據(jù)庫管理員若一定需要更改某個數(shù)據(jù)庫對象的命名。那么,此時應(yīng)用程序也需要調(diào)整。這在實際工作中,會很不方便。特別是有些應(yīng)用程序如果提供了功能自定義平臺的話,會非常的麻煩。如在一個ERP軟件中,有報表自定義功能。在系統(tǒng)中,原來就有一張供應(yīng)商產(chǎn)品明細(xì)表。但是,用戶覺得這張報表信息不夠齊全。用戶希望能夠顯示出某個零件所對應(yīng)的成品。此時,用戶可以更改原有的數(shù)據(jù)庫對象來完成這個自定義。但是,這往往不被建議這么做。因為若不小心修改錯誤,那么就很難再修改回來。所以自定義平臺中,若需要對原有報表進(jìn)行比較大的變更時,往往建議用戶另外建立一個視圖,來收集自己所需要的信息。若這么做的話,那么用戶不僅需要定義數(shù)據(jù)庫對象,而且還要重新調(diào)整前臺應(yīng)用程序的報表格式。顯然這工作量有多大。
而現(xiàn)在有了Oracle同義詞功能的話,這一切都會變得方便。因為前臺應(yīng)用程序可以不用作調(diào)整,而只需把數(shù)據(jù)庫對象同義詞進(jìn)行重新定義即可。這既保障了前臺應(yīng)用程序的可恢復(fù)性;同時也降低了工作量。這就是Oracle數(shù)據(jù)庫同義詞給我們帶來的第一個驚喜。
驚喜二:避免應(yīng)用程序直接訪問數(shù)據(jù)庫對象,提高數(shù)據(jù)庫安全性。
在開發(fā)數(shù)據(jù)庫應(yīng)用程序的時候,應(yīng)當(dāng)普遍遵守的一個規(guī)則是盡量避免直接飲用數(shù)據(jù)庫的表、視圖、函數(shù)或者其他對象。因為這會在很大程度上破壞數(shù)據(jù)庫的安全性。
如在前臺應(yīng)用程序中直接調(diào)用數(shù)據(jù)庫對象,那么攻擊者只需要對應(yīng)用程序所引用的對象進(jìn)行分析,就可以很容易的了解后臺數(shù)據(jù)庫的基本邏輯結(jié)構(gòu)。這顯然會為攻擊者提供很大的便利。所以,為了保障數(shù)據(jù)庫的安全,前臺應(yīng)用程序最好通過同義詞來訪問后臺數(shù)據(jù)庫。如此的話,攻擊者就很難通過前臺應(yīng)用程序的調(diào)用,來分析后臺數(shù)據(jù)庫的對象,以及對象之間的關(guān)系。
驚喜三:簡化數(shù)據(jù)庫對象的訪問。
有時候,我們某個數(shù)據(jù)庫對象的名字可能會很長,如AD_USER_ROLE_NAME_TRL。若每次調(diào)用這個數(shù)據(jù)庫對象的時候,都要輸入這么長的對象名,肯定會讓數(shù)據(jù)庫管理員很頭疼。但是,若名字定義的太短了呢,可讀性就不好。其他一些數(shù)據(jù)庫,只有犧牲可讀性,把數(shù)據(jù)庫對象的名字盡量縮短。
不過在Oracle數(shù)據(jù)庫中,則可以不用這個煩惱。因為我們可以給這個數(shù)據(jù)庫對象設(shè)置一個Oracle同義詞,就好像別名一樣。如此的話,在訪問的時候,只需要通過同義詞訪問即可,而不需要輸入這么長的對象名。
除了上面三個應(yīng)用之外,在分布式數(shù)據(jù)庫系統(tǒng)中,為存儲在遠(yuǎn)程數(shù)據(jù)庫中的對象創(chuàng)建同義詞,使用戶可以像使用本地對象一樣對遠(yuǎn)程對象進(jìn)行操作,就不需要提供網(wǎng)絡(luò)連接名進(jìn)行限定了。顯然,這也會給一些分布式數(shù)據(jù)庫管理員帶來很大的便利。
Oracle同義詞有兩種類型,分別是公用同義詞與方案同義詞。
1)公用Oracle同義詞:由一個特殊的用戶組Public所擁有。顧名思義,數(shù)據(jù)庫中所有的用戶都可以使用公用同義詞。公用同義詞往往用來標(biāo)示一些比較普通的數(shù)據(jù)庫對象,這些對象往往大家都需要引用。在引用這些對象時,并不需要在其前面添加一個Public所有者名字作為限定。否則的話,如果在一個公用同義詞前加上一個Public,就是畫蛇添足,系統(tǒng)反而會給出一個錯誤提示。不過在實際應(yīng)用中,筆者不建議用戶采用公用同義詞。因為現(xiàn)在系統(tǒng)中,公用同義詞已經(jīng)有很多。若用戶仍然為數(shù)據(jù)庫定義公用同義詞的話,不能夠起到簡化數(shù)據(jù)庫對象訪問的作用。
2)方案Oracle同義詞:它是是跟公用同義詞所對應(yīng),他是由創(chuàng)建他的用戶或者方案所有。故也被稱為私有同義詞。當(dāng)然,這個同義詞的創(chuàng)建者,可以控制其他用戶是否有權(quán)使用屬于自己的方案同義詞。方案同義詞經(jīng)常在應(yīng)用程序開發(fā)中使用,為應(yīng)用開發(fā)提供命名上的解決方案。如當(dāng)一個數(shù)據(jù)庫對象,如一張表,被重命名或者被復(fù)制成新的表時,并且新名字與老名字都需要使用的情況下,數(shù)據(jù)庫管理員就可以使用方案同義詞,即為老名字和新名字都建立專用同義詞,不過他們都同時指向同一個數(shù)據(jù)庫對象。
其實創(chuàng)建方案同義詞也很簡單。不過其必須要有一個前期條件,就是必須要擁有一定的權(quán)限,如CREATE SYNONYM權(quán)限,若是要在他人的方案中建立同義詞的話,則還必須擁有CREATE ANY SYNONYM權(quán)限等等。這些是必須遵循的首要條件。否則的話,就不能夠建立同義詞。
另外需要注意的是,即使在數(shù)據(jù)庫對象不存在的情況下,也可以為預(yù)計要建立的數(shù)據(jù)庫對象設(shè)置同義詞。這個特性很好用,它可以幫助數(shù)據(jù)庫開發(fā)團(tuán)隊或者應(yīng)用程序開發(fā)團(tuán)隊進(jìn)行更高的協(xié)作。如只要數(shù)據(jù)庫管理員跟應(yīng)用程序預(yù)先做好對象的命名與同義詞的定義工作,那么即使數(shù)據(jù)庫管理員還沒有開發(fā)好某個數(shù)據(jù)庫對象,前臺應(yīng)用程序開發(fā)人員也可以通過引用同義詞的方式引用為建立的數(shù)據(jù)庫對象。如此的話,就不會因為某一步工作沒有完成而給其他人的工作帶來什么負(fù)面影響。
【編輯推薦】