ホーム › フォーラム › A5:SQL Mk-2掲示板 › テーブル情報参照(ポスグレ)
- このトピックには4件の返信、1人の参加者があり、最後にとなりのドドロにより1年前に更新されました。
-
投稿者投稿
-
となりのドドロゲスト
はじめまして。
A5:SQL Mk-2につきましては大変お世話になっております。
質問させていただきます。【環境】
OS: Windows10
ポスグレ: バージョン15
A5m2: ver2.18.4 (直接接続)【質問】
テーブル所有者以外のユーザ(スーパユーザ権限なし)がテーブル参照した際、
「ソース」タブからテーブル情報を参照した際、主キー情報が表示されないのは仕様でしょうか?「データ」や「カラム」タブの主キー列がピンク色にもなっておらずでして。
「制約」タブでは主キー情報は表示されています。松原正和キーマスターとなりのドドロさんこんにちは。
A5:SQL Mk-2では以下のSQLを実行してPostgreSQL の主キーを取得しているのですが、以下のSQLを実行してみて何かエラーは出ますでしょうか?
(スキーマ名・テーブル名となっているところは適宜置き換えてください)
SELECT
ccu.column_name as COLUMN_NAME
FROM
information_schema.table_constraints tc
INNER JOIN information_schema.constraint_column_usage ccu
ON tc.table_catalog = ccu.table_catalog
and tc.table_schema = ccu.table_schema
and tc.table_name = ccu.table_name
and tc.constraint_name = ccu.constraint_name
INNER JOIN information_schema.key_column_usage kcu
ON kcu.constraint_catalog = tc.constraint_catalog
AND kcu.constraint_schema = tc.constraint_schema
AND kcu.constraint_name = tc.constraint_name
AND kcu.column_name = ccu.column_name
WHERE
tc.table_schema = ‘スキーマ名’
and tc.table_name = ‘テーブル名’
and tc.constraint_type = ‘PRIMARY KEY’
ORDER BY
kcu.ordinal_position
となりのドドロゲストお返事ありがとうございます。
記載いただきましたSQLを実行したところ、
エラーは出ずに、結果0件返却となりました。3テーブル参照していますので、
それぞれ1つずつテーブルを参照するSQLを実行してみました。
————————————————————
①select * from information_schema.table_constraints;
②select * from information_schema.constraint_column_usage;
③select * from information_schema.key_column_usage;
————————————————————①と③は結果は何件か返却されました。
②だけ結果が0件でした。②ですが、どうもログインユーザが所有しているテーブルのみしか
結果を返さないようです。
例)
・Aユーザでテーブル作成(所有者A)
・Bユーザでテーブル参照(事前にBユーザにテーブル参照権限を設定。スーパユーザ権限なし)
とした場合は、Aユーザでログインして上記①~③は期待どおりに結果が返されます(ご記載いただいたSQLも結果あり)。
今回Bユーザで実行しているので、②が返却されないといった模様です。②information_schema.constraint_column_usageですが、
【参考URL】
https://www.postgresql.jp/document/15/html/infoschema-constraint-column-usage.html
上記URL記載には「現在有効なロールが所有するテーブル内の列のみが表示」と明記されていますので、
おそらく、そういうことなんだろうなと思います。(※PostgreSQLでは「ロール」と「ユーザ」は同義)constraint_column_usageを参照せず、
かつ、column_nameをkey_column_usageから取得するSQLにしてみれば
一応、期待通りには取れました。
—————————————————————————
SELECT
kcu.column_name as COLUMN_NAME
FROM
information_schema.table_constraints tc
INNER JOIN information_schema.key_column_usage kcu
ON kcu.constraint_catalog = tc.constraint_catalog
AND kcu.constraint_schema = tc.constraint_schema
AND kcu.constraint_name = tc.constraint_name
WHERE
tc.table_schema = ‘develop’
and tc.table_name = ‘com_m_company’
and tc.constraint_type = ‘PRIMARY KEY’
ORDER BY
kcu.ordinal_position
—————————————————————————ただ、これにすることにより、他への影響があるのかどうかとか
現状SQLでconstraint_column_usageを参照しなければいけない理由が分かってないので
何ともですが、、
面倒な対応になってしまいますかね。。。松原正和キーマスターとなりのドドロさんこんにちは。
詳細な報告ありがとうございます。調査したところ、元々 information_schema.table_constraints と information_schema.constraint_column_usage のみで実装していたところ、あとから information_schema.key_column_usage を追加していたようです。ただ、information_schema.key_column_usage を追加した場合、information_schema.constraint_column_usage は不要となるので削除するべきでした。
Version 2.18.0 beta 12 で修正してみましたのでご確認いただければと思います。となりのドドロゲストVersion 2.19.0 beta 12にて期待通りになっていること確認致しました。
ご対応ありがとうございました。 -
投稿者投稿