Hologres は、メタデータ、統計情報、ロック情報、アクセス権限をクエリするための一連のシステムテーブルを提供します。このトピックでは、各システムテーブルの列と、それらに対して実行できる一般的な SQL クエリについて説明します。
概要
Hologres は、2 種類のシステムテーブルを公開しています:
Hologres ネイティブテーブル (
hgプレフィックス):Hologres 専用に構築され、すべてのノードで共有される Hologres 固有のプロパティと統計情報をカバーします。PostgreSQL 互換テーブル (
pgプレフィックスまたはinformation_schema配下):PostgreSQL から継承されています。Hologres はスタンドアロンの PostgreSQL インスタンスではなく分散システムであるため、これらのテーブルの一部の列は Hologres では該当しません。
| テーブル | ソース | 説明 |
|---|---|---|
hologres.hg_table_properties | Hologres ネイティブ | 現在のデータベース内のすべてのテーブルのプロパティとインデックス。 |
hologres_statistic.hg_table_statistic | Hologres ネイティブ | すべてのノードで共有されるテーブル統計情報。 |
pg_catalog.pg_tables | PostgreSQL 互換 | スキーマ、所有者、インデックス情報を含むテーブルメタデータ。 |
pg_catalog.pg_locks | PostgreSQL 互換 | ランタイムロック情報。このテーブルを使用して、ブロックされた DDL 文やクエリを診断します。 |
pg_catalog.pg_class | PostgreSQL 互換 | リレーションメタデータを含む PostgreSQL カタログテーブル。通常、他の pg_catalog テーブルと一緒に使用されます。 |
pg_catalog.pg_stats | PostgreSQL 互換 | シングルノードの PostgreSQL プランナーによって使用される列レベルの統計情報。 |
pg_catalog.pg_roles | PostgreSQL 互換 | Hologres インスタンス内のロールとその権限。 |
information_schema.role_table_grants | PostgreSQL 互換 | テーブルとビューでロールに付与された権限。 |
制限事項
hgプレフィックスが付いたテーブルは Hologres のシステムテーブルです。pgプレフィックスが付いたテーブルは PostgreSQL のシステムテーブルです。V1.3.22 より前のバージョンの Hologres では、PostgreSQL のシステムテーブルを Hologres の内部テーブルと結合したり、PostgreSQL のシステムテーブルから Hologres の内部テーブルにデータをインポートしたりすることはできません。この制限を解除するには、V1.3.22 以降にアップグレードしてください。Hologres では、システムテーブルのオブジェクト識別子 (OID) フィールドは、テーブル、インデックス、ビューなどのリレーションを一意に識別します。Hologres は複数のフロントエンド (FE) ノードを持つ分散システムであるため、OID の値はノード間で異なる場合があります。OID 値を含むクエリ結果は、ノード間で一貫性がない可能性があります。
hologres.hg_table_properties
このテーブルには、現在のデータベース内のすべてのテーブルに関する情報とプロパティが含まれています。
| 列 | 説明 |
|---|---|
table_namespace | テーブルを含むスキーマ。Hologres は 3 つのシステムスキーマを提供します:hologres (Hologres システムテーブル)、hologres_statistic (統計テーブル)、pg_catalog (PostgreSQL メタデータテーブル)。 |
table_name | テーブル名。システムテーブルには、hologres.hg_insert_progress_stats、hologres.hg_table_properties、hologres.hg_table_group_properties、hologres_statistic.hg_table_statistic、pg_catalog.pg_stat_activity が含まれます。 |
property_key | プロパティ名。有効な値:table_id、clustering_index_id、clustering_index_name、lifecycle_in_days (TTL; -1 は無期限に有効であることを意味します)、storage_format (行指向テーブルの場合は sst、V0.10 以降の列指向テーブルの場合はデフォルトで orc)、table_group、schema_version、primary_key、orientation (row、column、または V1.1 以降でサポートされるハイブリッド行列表ストレージの場合は row,column)、distribution_key、dictionary_encoding_columns、bitmap_columns、clustering_key、create_time、last_ddl_time、storage_mode (標準ストレージの場合は hot、低頻度アクセス (IA) ストレージの場合は cold)。 |
property_value | プロパティの値。 |
pg_catalog.pg_tables
このテーブルには、ユーザー作成テーブルやシステムテーブルを含む、すべてのテーブルのメタデータが含まれています。
| 列 | 説明 |
|---|---|
schemaname | テーブルを含むスキーマ。Hologres は 3 つのシステムスキーマを提供します:hologres、pg_catalog、information_schema。 |
tablename | テーブル名。 |
tableowner | テーブルの所有者。holo_admin はシステムテーブルを所有しており、この値は変更できません。簡易権限モデル (SPM) またはスキーマレベルの簡易権限モデル (SLPM) が有効になっているアカウントは developer として表示されます。 |
tablespace | Hologres では該当しません。 |
hasindexes | true テーブルにインデックスがある、またはあった場合。 |
hasrules | true テーブルに書き換えルールが設定されているか、または設定されていた場合。 |
hastriggers | true テーブルがトリガーを持っているか、または持っていた場合。 |
rowsecurity | Hologres では該当しません。 |
pg_catalog.pg_locks
このテーブルは、ランタイムロック情報を表示します。このテーブルをクエリして、ロックが DDL 文またはクエリをブロックしているかどうかを判断します。
| 列 | 説明 |
|---|---|
locktype | ロック可能なオブジェクトのタイプ。有効な値:relation (テーブルロック) と advisory (DDL ロック)。PostgreSQL のロックタイプ extend、page、tuple、transactionid、virtualxid、object、userlock は Hologres では該当しません。 |
database | ロックされたオブジェクトを含むデータベースの OID。 |
relation | ロックされたテーブルの OID。オブジェクトがテーブルまたはテーブルの一部でない場合は Null。 |
virtualxid | ロックの仮想トランザクション ID。オブジェクトが仮想トランザクション ID でない場合は Null。 |
transactionid | トランザクション ID。オブジェクトがトランザクション ID でない場合は Null。 |
pid | ロックを保持または待機しているサーバープロセスのプロセス ID (PID)。この PID を使用して pg_catalog.pg_stat_activity でプロセスを検索します。 |
mode | ロックモード:共有ロックまたは排他ロック。 |
granted | true の場合、ロックが保持されています。false の場合、ロックの取得を待機しています。 |
Hologres で該当しない列: page、tuple、classid、objid、objsubid、virtualtransaction、fastpath。
pg_catalog.pg_class
このテーブルには、すべてのリレーション (テーブル、インデックス、ビューなど) の PostgreSQL カタログ情報が含まれています。通常、他の pg_catalog テーブルと一緒にクエリされます。
Hologres は複数の FE ノードを持つ分散システムであるため、OID の値は通常ノード間で異なります。OID を含むクエリ結果は一貫性がない可能性があります。
| 列 | 説明 |
|---|---|
oid | リレーションの一意の OID。 |
relname | リレーションの名前。 |
relnamespace | リレーションを含むスキーマの OID。 |
relowner | リレーションの所有者。 |
reltuples | プランナーが使用する推定行数。VACUUM、ANALYZE、または DDL 文によって更新されます。Hologres では、この列は統計行数を指定します。 |
relallvisible | プランナーが使用する推定全可視ページ数。VACUUM、ANALYZE、または DDL 文によって更新されます。Hologres では、この列は統計バージョンを指定します。 |
relhasindex | true リレーションがインデックスを有するか、あるいは有していた場合。 |
relisshared | true は、テーブルがクラスター内のすべてのデータベース間で共有されている場合です(例: pg_catalog.pg_database)。Hologres では適用されません。 |
relpersistence | テーブルの永続化:p (永続)、u (ログなし)、または t (一時)。 |
relkind | リレーションタイプ:r (テーブル)、i (インデックス)、S (シーケンス)、v (ビュー)、m (マテリアライズドビュー)、c (複合型)、t (TOAST テーブル)、f (外部テーブル)。 |
relnatts | システム列を除くユーザー列の数。 |
relhaspkey | true リレーションにプライマリキーが存在するか、または存在していた場合。 |
relhassubclass | true、リレーションが継承された子テーブルを持つ、または持っていた場合 |
relacl | リレーションのアクセス権限。 |
reloptions | テーブルのプロパティ。例えば、autovacuum_enabled=false は、テーブルに対して自動バキュームと自動アナライズが無効になっていることを示します。 |
Hologres で該当しない列: reltype、reloftype、relam、relfilenode、reltablespace、relpages、reltoastrelid、relchecks、relhasoids、relhasrules、relhastriggers、relispopulated、relreplident、relfrozenxid、relminmxid。
hologres_statistic.hg_table_statistic
このテーブルには、すべてのノードで共有される Hologres ネイティブの統計情報が含まれています。ANALYZE を実行したとき、または自動アナライズ機能が実行されたときに更新されます。
| 列 | 説明 |
|---|---|
unique_name | テーブルの一意の識別子。 |
schema_version | テーブルのスキーマバージョン。 |
statistic_version | 統計バージョン。 |
statistics | Base64 でエンコードされた統計コンテンツ。 |
schema_name | テーブルを含むスキーマ。 |
table_name | テーブル名。 |
total_rows | テーブルの総行数。 |
sample_rows | 統計収集のためにサンプリングされた行数。 |
nattr | テーブルの列数。 |
used_attrs | ANALYZE 文によって分析された列。 |
histogram_attrs | ヒストグラム統計が収集される列。 |
ndv_attrs | 個別値 (NDV) 統計が収集される列。 |
user_name | ANALYZE を実行した、または自動アナライズをトリガーしたユーザー。 |
analyze_timestamp | ANALYZE が実行された、または自動アナライズがトリガーされた時刻。 |
analyze_cost | ANALYZE または自動アナライズが完了するまでにかかった時間。 |
analyze_count | ANALYZE が実行された、または自動アナライズがトリガーされた回数。 |
pg_catalog.pg_stats
このテーブルには、シングルノードの PostgreSQL プランナーが使用する PostgreSQL の列レベルの統計情報が含まれています。
| 列 | 説明 |
|---|---|
schemaname | スキーマ名。 |
tablename | テーブル名。 |
attname | 列名。 |
inherited | true 統計情報に継承されたサブカラムが含まれる場合。 |
null_frac | この列で null 値を持つ行の割合。 |
avg_width | 列エントリの平均幅 (バイト単位)。 |
n_distinct | 正の場合は推定個別値の数。負の場合は、絶対値が総行数に対する個別値の比率です (個別値の数がテーブルとともに増加すると予想される場合に使用)。例えば、-1 は一意の列を示します。 |
most_common_vals | 列内で最も一般的な値のリスト。十分に一般的な値がない場合は Null。 |
most_common_freqs | 最も一般的な値の頻度。出現回数を総行数で割って計算されます。most_common_vals が null の場合は Null。 |
histogram_bounds | 列の値の範囲をほぼ同じサイズのグループに分割する値。most_common_vals の値はこのヒストグラムから除外されます。 |
most_common_elems | 配列型の列値内の最も一般的な非 null 要素値。 |
most_common_elem_freqs | 最も一般的な要素値の頻度:各値のインスタンスを少なくとも 1 つ含む行の割合。most_common_elems が null の場合は Null。 |
Hologres で該当しない列: correlation、elem_count_histogram。
pg_catalog.pg_roles
このテーブルは、Hologres インスタンス内のすべてのロールとその権限をリストします。
| 列 | 説明 |
|---|---|
rolname | ロール名。 |
rolsuper | t、それ以外は f。 |
rolinherit | t ロールが所属する任意のロールから権限を継承する場合。f それ以外の場合。 |
rolcreaterole | t、それ以外は f。 |
rolcreatedb | t、それ以外は f。 |
rolcanlogin | t、それ以外は f。 |
rolconnlimit | ロールが確立できる同時接続の最大数。値が -1 の場合、Hologres では同時接続の最大数は設定されていません。 |
oid | ロールの一意の OID。 |
Hologres で該当しない列: rolreplication、rolpassword、rolvaliduntil、rolbypassrls、rolconfig。
information_schema.role_table_grants
このテーブルは、Hologres インスタンス内のテーブルとビューでロールに付与された権限をリストします。
| 列 | 説明 |
|---|---|
grantor | 権限を付与したロール。 |
grantee | 権限を受け取ったロール。 |
table_catalog | データベース名。 |
table_schema | スキーマ名。 |
table_name | テーブル名。 |
privilege_type | 付与された権限のタイプ。有効な値:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER。 |
is_grantable | YES、それ以外は NO。 |
with_hierarchy | SELECT の場合は YES、それ以外は NO。 |
一般的な SQL クエリ
このセクションのすべてのクエリは、psql または任意の PostgreSQL 互換クライアントを使用して実行できます。
テーブルのプロパティとインデックスのクエリ
SELECT * FROM hologres.hg_table_properties WHERE table_name = '<table_name>';テーブルまたはビューの DDL の取得
-- テーブルの DDL を取得
SELECT hg_dump_script('<table_name>');
-- ビューの DDL を取得
SELECT hg_dump_script('<view_name>');クエリが失敗した場合は、まず hg_toolkit 拡張機能をインストールしてください:CREATE EXTENSION hg_toolkit;インスタンスエンドポイントのクエリ
SHOW hg_frontend_endpoints;現在のインスタンス内のすべてのデータベースのリスト
SELECT
d.datname AS "Name",
pg_catalog.pg_get_userbyid(d.datdba) AS "Owner",
pg_catalog.pg_encoding_to_char(d.encoding) AS "Encoding",
d.datcollate AS "Collate",
d.datctype AS "Ctype",
pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
WHERE d.datname != 'postgres'
AND d.datname != 'template0'
AND d.datname != 'template1'
ORDER BY 1;現在のデータベース内のすべてのユーザーマッピングのリスト
SELECT
um.srvname AS "Server",
um.usename AS "User name"
FROM pg_catalog.pg_user_mappings um
WHERE um.srvname != 'query_log_store_server'
ORDER BY 1, 2;現在のデータベース内のすべてのスキーマのリスト
SELECT
n.nspname AS "Name",
pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_'
AND n.nspname <> 'information_schema'
AND n.nspname != 'hologres'
AND n.nspname != 'hologres_sample'
AND n.nspname != 'hologres_statistic'
AND n.nspname !~ '^hg_'
AND n.nspname !~ '^holo_'
ORDER BY 1;現在のデータベース内のすべてのテーブル、外部テーブル、ビューのリスト
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
WHEN 'f' THEN 'foreign table'
WHEN 'p' THEN 'partitioned table'
WHEN 'I' THEN 'partitioned index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p', 'v', 'm', 'S', 'f', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;現在のスキーマ内のすべてのテーブルと所有者のリスト (システムテーブルを除く)
-- システムテーブルを含む
SELECT * FROM pg_tables;
-- システムテーブルを除く
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
WHEN 'f' THEN 'foreign table'
WHEN 'p' THEN 'partitioned table'
WHEN 'I' THEN 'partitioned index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p', 'v', 'm', 'S', 'f', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;親テーブルの子テーブルのリスト
-- パーティションキー値あり
SELECT
c.oid::pg_catalog.regclass,
c.relkind,
pg_catalog.pg_get_expr(c.relpartbound, c.oid)
FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i
WHERE c.oid = i.inhrelid
AND i.inhparent::pg_catalog.regclass = '<parent_table_name>'::pg_catalog.regclass
ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT';
-- パーティションキー値なし
SELECT
nmsp_parent.nspname AS parent_schema,
parent.relname AS parent,
nmsp_child.nspname AS child_schema,
child.relname AS child
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
WHERE parent.relname = '<parent_table_name>';作成時刻と親テーブルを含む子テーブルのリスト
SELECT
cn.nspname AS child_schema_name,
c.relname AS child_table_name,
pn.nspname AS parent_schema_name,
p.relname AS parent_table_name,
to_timestamp(cp.property_value::bigint) AS create_time
FROM pg_inherits i
LEFT JOIN pg_class p ON p.oid = i.inhparent
LEFT JOIN pg_namespace pn ON pn.oid = p.relnamespace
LEFT JOIN pg_class c ON c.oid = i.inhrelid
LEFT JOIN pg_namespace cn ON cn.oid = c.relnamespace
LEFT JOIN hologres.hg_table_properties cp
ON cp.property_key = 'create_time'
AND cp.table_namespace = pn.nspname
AND cp.table_name = c.relname;すべての外部テーブルとそれに対応する MaxCompute テーブルのリスト
SELECT
n.nspname,
c.relname,
s.srvname,
pg_catalog.array_to_string(
ARRAY(
SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value)
FROM pg_catalog.pg_options_to_table(ftoptions)
),
', '
)
FROM pg_catalog.pg_foreign_table f,
pg_catalog.pg_foreign_server s,
pg_catalog.pg_class c,
pg_catalog.pg_namespace n
WHERE s.oid = f.ftserver
AND c.oid = f.ftrelid
AND c.relnamespace = n.oid
AND n.nspname NOT IN ('hologres', 'hologres_statistic', 'pg_catalog', 'pg_toast');現在のデータベース内のすべてのビューのリスト
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
WHEN 'f' THEN 'foreign table'
WHEN 'p' THEN 'partitioned table'
WHEN 'I' THEN 'partitioned index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('v', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;テーブルに依存するビューの検索
SELECT * FROM information_schema.view_table_usage WHERE table_name = '<table_name>';列コメントとテーブルコメントのクエリ
-- テーブルの列コメントをクエリ
SELECT
a.attname AS "Column",
pg_catalog.format_type(a.atttypid, a.atttypmod) AS "Type",
a.attnotnull AS "Nullable",
pg_catalog.col_description(a.attrelid, a.attnum) AS "Description"
FROM pg_catalog.pg_attribute a
WHERE a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = '<schema_name>.<table_name>'::regclass::oid
ORDER BY a.attnum;<schema_name>.<table_name> を実際のスキーマ名とテーブル名に置き換えてください。
-- テーブルコメントと関連メタデータ (所有者、サイズ) をクエリ
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
WHEN 'f' THEN 'foreign table'
WHEN 'p' THEN 'table'
WHEN 'I' THEN 'index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner",
pg_catalog.pg_size_pretty(pg_catalog.pg_table_size(c.oid)) AS "Size",
pg_catalog.obj_description(c.oid, 'pg_class') AS "Description"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p', 'v', 'm', 'S', 'f', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;-- 特定のテーブルのコメントをクエリ
SELECT pg_catalog.obj_description('<table_name>'::regclass::oid, 'pg_class') AS "Description";データベース内のすべてのユーザーとロールのリスト
SELECT
r.rolname,
r.rolsuper,
r.rolinherit,
r.rolcreaterole,
r.rolcreatedb,
r.rolcanlogin,
r.rolconnlimit,
r.rolvaliduntil,
ARRAY(
SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid
) AS memberof,
r.rolreplication,
r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;データベース内のすべての拡張機能のリスト
SELECT
e.extname AS "Name",
e.extversion AS "Version",
n.nspname AS "Schema",
c.description AS "Description"
FROM pg_catalog.pg_extension e
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace
LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid
AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass
WHERE e.extname != 'hg_admin_cmd'
AND e.extname != 'holo_dump_stat'
AND e.extname != 'holo_funcs'
AND e.extname != 'holo_link'
AND e.extname != 'holo_system_admin'
AND e.extname != 'query_log'
AND e.extname != 'plpgsql'
ORDER BY 1;アカウントの権限の確認
SELECT * FROM pg_roles WHERE rolname = '<uid>';インスタンスのすべてのユーザーとその権限のリスト
SELECT
r.rolname,
r.rolsuper,
r.rolinherit,
r.rolcreaterole,
r.rolcreatedb,
r.rolcanlogin,
r.rolconnlimit,
r.rolvaliduntil,
ARRAY(
SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid
) AS memberof,
r.rolreplication,
r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;ユーザーが権限を持つすべてのテーブルのリスト
SELECT
current_database()::information_schema.sql_identifier AS table_catalog,
nc.nspname::information_schema.sql_identifier AS table_schema,
c.relname::information_schema.sql_identifier AS table_name,
CASE
WHEN nc.oid = pg_my_temp_schema() THEN 'LOCAL TEMPORARY'::text
WHEN c.relkind = ANY (ARRAY['r'::"char", 'p'::"char"]) THEN 'BASE TABLE'::text
WHEN c.relkind = 'v'::"char" THEN 'VIEW'::text
WHEN c.relkind = 'f'::"char" THEN 'FOREIGN'::text
ELSE NULL::text
END::information_schema.character_data AS table_type,
CASE
WHEN (c.relkind = ANY (ARRAY['r'::"char", 'p'::"char"]))
OR (c.relkind = ANY (ARRAY['v'::"char", 'f'::"char"])
AND (pg_relation_is_updatable(c.oid::regclass, false) & 8) = 8)
THEN 'YES'::text
ELSE 'NO'::text
END::information_schema.yes_or_no AS is_insertable_into,
CASE
WHEN t.typname IS NOT NULL THEN 'YES'::text
ELSE 'NO'::text
END::information_schema.yes_or_no AS is_typed,
NULL::character varying::information_schema.character_data AS commit_action
FROM pg_namespace nc
JOIN pg_class c ON nc.oid = c.relnamespace
LEFT JOIN (pg_type t JOIN pg_namespace nt ON t.typnamespace = nt.oid) ON c.reloftype = t.oid
WHERE (c.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'f'::"char", 'p'::"char"]))
AND NOT pg_is_other_temp_schema(nc.oid)
AND (
pg_has_role('<user_id>', c.relowner, 'USAGE'::text)
OR has_table_privilege('<user_id>', c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER'::text)
OR has_any_column_privilege('<user_id>', c.oid, 'SELECT, INSERT, UPDATE, REFERENCES'::text)
);<user_id> を実際のユーザー ID に置き換えてください。
テーブルに対する権限を持つすべてのユーザーのリスト
SELECT rolname
FROM pg_roles
WHERE has_table_privilege(rolname, '<schema_name>.<table_name>',
'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER');<schema_name>.<table_name> を実際のスキーマ名とテーブル名に置き換えてください。