Redshift表列可在information_schema.columns查到却不在pg_catalog.pg_table_def的原因咨询
pg_catalog.pg_table_def查不到自己创建的表? 这事儿我之前在项目里碰到过,本质是Redshift里这两个系统视图的可见性规则和覆盖范围不一样,主要有这几个常见原因:
临时表的特殊性
如果你创建的是临时表(用CREATE TEMP TABLE或者带TEMP关键字的建表语句),pg_catalog.pg_table_def默认不会返回临时表的信息,而information_schema.columns是包含临时表的列定义的。这是Redshift对pg_table_def的特定限制——临时表的元数据存储在会话级临时空间里,pg_table_def不会抓取这部分内容。权限差异导致的过滤
pg_table_def有个严格的规则:只返回你拥有SELECT权限的表。而information_schema.columns只要你是表的所有者,或者被授予了该表的USAGE等基础权限就能看到列信息。哪怕你是表的创建者,如果不小心执行了REVOKE SELECT ON your_table FROM current_user;这类操作,pg_table_def就会把这张表过滤掉,但information_schema依然能正常查到。Schema权限的隐性影响
如果你在非默认Schema里创建了表(比如CREATE TABLE my_schema.my_table (...)),即便你是表的所有者,要是没有该Schema的USAGE权限(这种情况很少见,因为建表时通常会自动赋予Schema权限),pg_table_def也可能无法返回表定义,但information_schema.columns还是能正常显示。
你可以先确认自己的表是不是临时表,或者执行GRANT SELECT ON your_table TO your_user;之后再查询pg_table_def,应该就能看到结果了。
内容的提问来源于stack exchange,提问作者Lee

