PostgreSQL View Table Info

查询表字段名
SELECT * FROM pg_attribute WHERE attrelid = ‘tablename’::regclass;
–只查看字段名
SELECT attname FROM pg_attribute WHERE attrelid = ‘tablename’::regclass;
<think>我们参考用户上一次的问题和现有引用内容,用户询问为什么在PostgreSQL中查询information_schema.view_table_usage无法获取数据。引用[3]提到不同的数据库系统在information_schema的实现上可能略有不同,但上述方法在处理MySQL和PostgreSQL时是有效的。同时,用户提供的引用[1]和[2]主要涉及复合类型创建和默认用户登录,与当前问题关系不大。根据PostgreSQL官方文档,information_schema.view_table_usage是一个视图,它标识了当前数据库中视图所依赖的表(以及如果适用,视图)。如果查询没有返回结果,可能有以下几个原因:1.当前数据库中没有视图,或者视图没有基于表(例如基于其他视图或函数)。2.视图的所有者或当前用户没有足够的权限来查看这些视图的依赖关系。3.查询条件太严格(例如指定了特定的视图名称或模式,但实际上不存在或不符合条件)。4.视图可能是在不同的模式中,而查询时没有在正确的模式中查找。为了诊断问题,我们可以采取以下步骤:步骤1:检查当前数据库中是否存在视图。可以运行以下查询:```sqlSELECT*FROMinformation_schema.views;```如果这个查询没有返回任何行,说明当前数据库中没有视图,那么自然在view_table_usage中也查不到依赖关系。步骤2:检查权限。确保当前用户有权限访问视图和视图依赖的表。因为information_schema视图只显示当前用户有权限查看的对象。可以尝试用超级用户(如postgres)登录执行同样的查询。步骤3:检查查询语句是否正确。例如,用户可能使用了不正确的模式名称。可以尝试不指定模式查询所有:```sqlSELECT*FROMinformation_schema.view_table_usage;```步骤4:如果存在视图,但view_table_usage仍然没有返回,可能需要检查视图的定义。有可能视图的定义使用了函数或者其他非表的对象,或者视图是基于多个数据库的对象(但information_schema只记录当前数据库)。此外,引用[2]中显示了默认的数据库和模式,注意到默认模式是public。如果视图创建在非public模式,那么需要确认查询时是否指定了正确的模式,或者在查询时使用了模式限定。例如,如果视图创建在模式myschema中,那么需要这样查询:```sqlSELECT*FROMinformation_schema.view_table_usageWHEREview_schema='myschema';```或者查询所有模式:```sqlSELECT*FROMinformation_schema.view_table_usageWHEREview_schemaNOTIN('information_schema','pg_catalog');```因为系统模式中的视图可能被排除。如果以上步骤都没有解决问题,可能需要考虑PostgreSQL版本的差异。由于用户引用的内容中出现了PostgreSQL10.4,在较新的版本中,information_schema可能会有更新。综上所述,用户应该按照上述步骤逐一排查。为了帮助用户进一步解决问题,我们生成以下相关问题:§§相关问题§§1.如何检查当前用户对特定视图的权限?2.在PostgreSQL中如何查看视图定义的SQL语句?3.不同PostgreSQL版本中information_schema视图有哪些差异?</think> 在 PostgreSQL 中查询 `information_schema.view_table_usage` 无返回结果,可能由以下原因导致: ### 常见原因分析 1. **无视图或视图无表依赖** - 若数据库中未创建视图,或视图仅依赖函数/其他视图(而非基础表),则该视图无记录 - 验证视图是否存在: ```sql SELECT * FROM information_schema.views; ``` 2. **权限限制** - `information_schema` 仅显示当前用户**有权限访问**的对象(系统文档:[权限约束](https://www.postgresql.org/docs/current/infoschema-intro.html)) - 以超级用户(如 `postgres`)执行查询: ```shell sudo -u postgres psql -c "SELECT * FROM view_table_usage;" ``` 3. **模式限定问题** - 视图创建在非默认模式(如非 `public`)时需显式指定模式: ```sql SELECT * FROM information_schema.view_table_usage WHERE view_schema = 'your_schema'; -- 替换为实际模式名 ``` 4. **视图定义方式特殊** - 使用 `WITH CHECK OPTION` 或 `RECURSIVE` 的视图可能不被收录 - 物化视图(`MATERIALIZED VIEW`)不在 `information_schema` 中统计 ### 诊断步骤 1. **检查视图依赖关系** ```sql -- 查看所有视图及其依赖表 (包含系统表) SELECT dependee.relname AS view, dependent.relname AS table FROM pg_depend d JOIN pg_class dependee ON d.refobjid = dependee.oid JOIN pg_class dependent ON d.objid = dependent.oid WHERE dependee.relkind = 'v'; ``` 2. **跨模式查询** ```sql -- 检索所有模式下的视图依赖表 SELECT * FROM information_schema.view_table_usage WHERE view_schema NOT IN ('pg_catalog', 'information_schema'); ``` 3. **验证权限** ```sql -- 检查当前用户权限 SELECT table_catalog, table_schema, table_name, privilege_type FROM information_schema.table_privileges WHERE grantee = CURRENT_USER; ``` > ⚠️ **注意**:PostgreSQL 的 `information_schema` 实现与其他数据库(如 MySQL)存在差异[^3],需按标准语法查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值