有時,在兩次函式呼叫之間保持一些全域性資料或在不同函式之間共享全域性資料非常有用。這在 PL/Tcl 中很容易實現,但有一些必須理解的限制。
出於安全原因,PL/Tcl 為任何一個 SQL 角色呼叫的函式執行一個單獨的 Tcl 直譯器。這可以防止一個使用者意外或惡意地干擾另一個使用者的 PL/Tcl 函式的行為。每個這樣的直譯器將擁有自己的一組 “全域性” Tcl 變數的值。因此,兩個 PL/Tcl 函式將共享相同的全域性變數,當且僅當它們由同一個 SQL 角色執行時。在同一個會話中透過多個 SQL 角色執行程式碼的應用程式(透過 SECURITY DEFINER
函式、使用 SET ROLE
等)中,您可能需要採取明確的步驟來確保 PL/Tcl 函式可以共享資料。要做到這一點,請確保應該通訊的函式屬於同一個使用者,並將它們標記為 SECURITY DEFINER
。當然,您必須注意此類函式不能被用於執行任何意外的操作。
在一個會話中使用的所有 PL/TclU 函式都在同一個 Tcl 直譯器中執行,該直譯器當然與用於 PL/Tcl 函式的直譯器是分開的。因此,全域性資料會在 PL/TclU 函式之間自動共享。這不被視為安全風險,因為所有 PL/TclU 函式都以相同的信任級別執行,即資料庫超級使用者的級別。
為了幫助保護 PL/Tcl 函式不被意外地相互干擾,一個全域性陣列透過 upvar
命令提供給每個函式。這個變數的全域性名稱是函式的內部名稱,區域性名稱是 GD
。建議將 GD
用於函式的持久私有資料。僅將常規 Tcl 全域性變數用於您特意打算在多個函式之間共享的值。(請注意,GD
陣列僅在特定直譯器內部是全域性的,因此它們不會繞過前面提到的安全限制。)
在下面的 spi_execp
示例中,有一個使用 GD
的示例。
如果您在文件中看到任何不正確的內容,與您對特定功能的體驗不符,或者需要進一步的澄清,請使用 此表格 報告文件問題。