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

2021-08-21 13:49 更新

有時(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的例子。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)