Postgresql

如何在 PostgreSQL 中獲取 regclass 類型表的模式名稱?

  • March 2, 2022

在編寫一個函式來測試表中是否col_name存在列時_tbl,我想提取表的模式名稱,該名稱作為regclass參數傳遞給函式(為了安全??)。

CREATE OR REPLACE FUNCTION column_exists(_tbl regclass, col_name text)
 RETURNS bool AS
$func$
 SELECT EXISTS (
   SELECT 1 FROM information_schema.columns 
   WHERE table_schema=get_schema($1) 
     AND table_name=get_table($1) 
     AND column_name=$2
   );
$func$  LANGUAGE sql;

所以如果表名是'staging.my_table'::regclass,我想staging從一個虛構的函式中得到get_schema

我可以案例如實現這個功能split_part(_tbl::text, '.', 1)嗎?

此外,是否保證表名_tbl在轉換為文本時始終具有模式名稱?(即不省略諸如 之類的東西public.

我對regclass類型不是很熟悉。我搜尋但找不到如何提取模式名稱,只是想在重新發明輪子之前先問一下。

我可以案例如實現這個功能split_part(_tbl::text, '.', 1)嗎?

我不確定那是否安全。相反,我會使用,

SELECT nspname
FROM pg_catalog.pg_class AS c
JOIN pg_catalog.pg_namespace AS ns
 ON c.relnamespace = ns.oid
WHERE c.oid = _tbl;

這是保證工作。

在編寫一個函式來測試表中是否col_name存在列時_tbl,我想提取表的模式名稱,該名稱作為 regclass 參數傳遞給函式(為了安全??)。

所以你可以做類似的事情,

SELECT nspname
FROM pg_catalog.pg_attribute AS a
JOIN pg_catalog.pg_class AS c
 ON a.attrelid = c.oid
JOIN pg_catalog.pg_namespace AS ns
 ON c.relnamespace = ns.oid
WHERE c.oid = _tbl
 AND a.attname = col_name;

更新

如果你有一個完全限定的標識符,一個包含表名和模式名的標識符,你可以使用parse_ident它來安全地解析它。

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