W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有時(shí)候需要在同一個(gè)函數(shù)的兩次調(diào)用間保持某些全局?jǐn)?shù)據(jù)或者在不同的函數(shù)之間共享全局?jǐn)?shù)據(jù)。在 PL/Tcl 中這很容易做到,但是必須了解一些限制。
由于安全性原因,PL/Tcl 會(huì)為一個(gè) SQL 角色建立一個(gè)單獨(dú)的 Tcl 解釋器來(lái)執(zhí)行該角色調(diào)用的函數(shù)。這可以避免一個(gè)用戶(hù)無(wú)意或者惡意地干涉另一個(gè)用戶(hù)的 PL/Tcl 函數(shù)的行為。對(duì)任何“全局”Tcl 變量,每一個(gè)這樣的解釋器都有其自身的值。因此,當(dāng)且僅當(dāng)兩個(gè) PL/Tcl 函數(shù)由用一個(gè) SQL 角色執(zhí)行時(shí),它們才能共享相同的全局變量。在使用單個(gè)會(huì)話(huà)執(zhí)行多個(gè) SQL 角色的代碼(通過(guò)
SECURITY DEFINER
函數(shù)、使用SET ROLE
等)的應(yīng)用中,需要采取顯式的步驟以保證 PL/Tcl 函數(shù)能共享數(shù)據(jù)。要這樣做,需要確保要通信的函數(shù)都屬于同一個(gè)用戶(hù),并且把它們標(biāo)記為SECURITY DEFINER
。當(dāng)然,要小心這樣的函數(shù)被濫用。
在一個(gè)會(huì)話(huà)中使用的所有 PL/TclU 函數(shù)都在同一個(gè) Tcl 解釋器中執(zhí)行,這當(dāng)然與用于 PL/Tcl 函數(shù)的解釋器不同。因此,在 PL/TclU 函數(shù)之間會(huì)自動(dòng)地共享全局?jǐn)?shù)據(jù)。這并不是一種安全性風(fēng)險(xiǎn),因?yàn)樗械?PL/TclU 函數(shù)都在同樣的信任級(jí)別上執(zhí)行,即都以數(shù)據(jù)庫(kù)超級(jí)用戶(hù)的級(jí)別執(zhí)行。
為了保護(hù) PL/Tcl 函數(shù)不會(huì)無(wú)意間彼此干擾,通過(guò)upvar
命令可以建立一個(gè)對(duì)每個(gè)函數(shù)可用的全局?jǐn)?shù)組。這個(gè)變量的全局名稱(chēng)是該函數(shù)的內(nèi)部名稱(chēng),并且本地名稱(chēng)為GD
。推薦使用GD
來(lái)保持一個(gè)函數(shù)的持久私有數(shù)據(jù)。只對(duì)你特別希望在多個(gè)函數(shù)之間共享的值使用常規(guī)的 Tcl 全局變量(注意GD
數(shù)組只在一個(gè)特定的解釋器中是全局的,因此它們不會(huì)繞過(guò)上文提到的安全性限制)。
下文的spi_execp
例子中有一個(gè)使用GD
的例子。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: