A5:SQL Mk-2

開発のこと、日々のこと

テーブル情報参照(ポスグレ)

ホーム フォーラム A5:SQL Mk-2掲示板 テーブル情報参照(ポスグレ)

  • このトピックには4件の返信、1人の参加者があり、最後にとなりのドドロにより6ヶ月、 1週前に更新されました。
5件の投稿を表示中 - 1 - 5件目 (全5件中)
  • 投稿者
    投稿
  • #20756 返信
    となりのドドロ
    ゲスト

    はじめまして。
    A5:SQL Mk-2につきましては大変お世話になっております。
    質問させていただきます。

    【環境】
    OS: Windows10
    ポスグレ: バージョン15
    A5m2: ver2.18.4 (直接接続)

    【質問】
    テーブル所有者以外のユーザ(スーパユーザ権限なし)がテーブル参照した際、
    「ソース」タブからテーブル情報を参照した際、主キー情報が表示されないのは仕様でしょうか?

    「データ」や「カラム」タブの主キー列がピンク色にもなっておらずでして。
    「制約」タブでは主キー情報は表示されています。

    #20765 返信
    松原正和
    キーマスター

    となりのドドロさんこんにちは。
     
    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

    #20768 返信
    となりのドドロ
    ゲスト

    お返事ありがとうございます。

    記載いただきました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を参照しなければいけない理由が分かってないので
    何ともですが、、
    面倒な対応になってしまいますかね。。。

    #20783 返信
    松原正和
    キーマスター

    となりのドドロさんこんにちは。
      
    詳細な報告ありがとうございます。調査したところ、元々 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 で修正してみましたのでご確認いただければと思います。

    #20800 返信
    となりのドドロ
    ゲスト

    Version 2.19.0 beta 12にて期待通りになっていること確認致しました。
    ご対応ありがとうございました。

5件の投稿を表示中 - 1 - 5件目 (全5件中)
返信先: テーブル情報参照(ポスグレ)
あなたの情報:




コメントは受け付けていません。