支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

42.4. PL/Tcl 中的全域資料 #

有時候,在對函式進行兩次呼叫之間,或是在不同的函式之間,保有某些全域資料會很有用。 這在 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 的範例。

提交更正

如果您在文件中看到任何不正確、與您特定功能的體驗不符或需要進一步澄清的地方,請使用 此表單 來回報文件問題。