PostgreSQL PL/Tcl 中的全局?jǐn)?shù)據(jù)

2021-08-21 13:49 更新

有時候需要在同一個函數(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的例子。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號