Postgresql

將“regclass”值轉換為文本時缺少“公共”模式

  • April 6, 2022

我正在編寫一個腳本,我需要在其中解析一個表的名稱(in regclass)。解析 (with parse_ident()) 到目前為止有效。但是,當表在public模式中時,腳本會失敗,因為 PostgreSQL (10.3) 會自動刪除模式名稱。

例如,如果表tt在非public模式ex中,則 的文本值regclass與原始值相同:

=> select 'ex.tt'::regclass::text;
text  
-------
ex.tt

當它在 中時public,模式名稱會失去:

=> select 'public.tt'::regclass::text;
text 
------
tt

有沒有辦法禁用這種行為,或者在text不失去模式名稱的情況下轉換為?

public這與模式本身無關——它只是另一個沒有特殊權力的模式,除了它是預設創建的——並且預設包含在其中search_path

電流**search_path**在這背後。值的文本表示regclass建立在它之上。如果模式不是第一個匹配項,則表名僅是模式限定的search_path手冊

輸入轉換器根據regclass模式路徑設置處理表查找,因此它會自動執行“正確的事情”。同樣,將表的 OID 轉換regclass為數字 OID 的符號顯示很方便。

search_path您可以通過設置一個空(本地)來強制 Postgres 列印模式名稱:

SET LOCAL search_path = '';
SELECT 'public.tt'::regclass::text;

但這會迫使您為事務的其餘部分或直到您search_path再次設置所有內容進行模式限定。好吧,幾乎所有東西,pg_catalog都是pg_temp特別的。看:

或者您避免特殊演員表和直接search_path從中獲取架構名稱pg_class

SELECT relnamespace::regnamespace::text
FROM   pg_catalog.pg_class
WHERE  oid = 'public.tt'::regclass;

引用自:https://dba.stackexchange.com/questions/207911