有没有办法让非管理员 PostgreSQL 用户发现它可以在它所连接的服务器上访问哪些数据库,更具体地说,这些数据库中的哪些有一个具有特定名称的表,用户有足够的权限查看(并且可能询问)?
据我所知,MySQL 的等价物是这样的:
SELECT t.TABLE_SCHEMA FROM information_schema.`TABLES` AS t
WHERE t.TABLE_NAME = 'the_table_name'
(这最好适用于 PostgreSQL 8.4,但如果已经更改,我也对 9.1 的解决方案感兴趣。)
不在单个查询中。
information_schema.tables
视图和pg_catalog.pg_class
表是每个数据库的。如果没有像 DBLink 这样的 hack,你不能在 PostgreSQL 中跨多个数据库查询表。PostgreSQL 数据库更像是一个独立的 MySQL 服务器,而 PostgreSQL 模式更像是一个 MySQL 数据库。如果您希望能够在 PostgreSQL 中跨多个命名空间进行查询,请将它们全部创建为一个数据库中的模式,而不是在多个数据库中。
要列出所有数据库中的表,必须连接到每个感兴趣的数据库。您可以从 列出它们
select * from pg_catalog.pg_database where datistemplate = 'f';
。该pg_catalog.pg_database
表在所有数据库中都是全局的,因此连接到任何数据库都可以获得相同的结果。