我正在编写一个脚本,我需要在其中解析表的名称 (in regclass
)。parse_ident()
到目前为止,解析 (with ) 有效。但是,当表在public
模式中时脚本会失败,因为 PostgreSQL (10.3) 会自动删除模式名称。
例如,如果表tt
在非public
schemaex
中,则其文本值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
如果模式无论如何都不是第一个匹配项,则表名仅是模式限定的。手册:search_path
您可以通过设置一个空(本地)来强制 Postgres 打印模式名称:但这会迫使您为事务的其余部分或直到您
search_path
再次设置之前对所有内容进行模式限定。好吧,几乎所有的东西都是特别的。看:pg_catalog
pg_temp
或者您避免特殊转换和直接
search_path
从中获取架构名称pg_class
: