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