sql >> データベース >  >> RDS >> PostgreSQL

ユーザーがPostgreSQLでテーブル/関数/...を選択/更新/...する権限を取得したかどうかを確認します

    より良いアプローチは、has_*_privilegeを使用することです(これは、psqlに組み込まれているいくつかのクエリ、またはおそらくinformation_schemaビューから取得されたことを覚えているようです)。 関数を作成し、ユーザーとオブジェクトのすべての可能な組み合わせのセットにそれらを適用するだけです。これは、いくつかのグループロールを介してオブジェクトにアクセスできることも考慮に入れます。

    たとえば、これにより、どのユーザーがカタログ以外のテーブルとビューにアクセスできるかが示されます。

    select usename, nspname || '.' || relname as relation,
           case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type,
           priv
    from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace,
         pg_user,
         (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder)
    where relkind in ('r', 'v')
          and has_table_privilege(pg_user.usesysid, pg_class.oid, priv)
          and not (nspname ~ '^pg_' or nspname = 'information_schema')
    order by 2, 1, 3, privorder;
    

    可能な特権については、has_*_privilegeの説明で詳しく説明されています。 http://www .postgresql.org / docs / current / static / Functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE

    「CREATETEMP」はデータベースレベルの権限です。ユーザーがpg_temp_*を使用できるようにします。 スキーマ。 has_database_privilege(useroid, datoid, 'TEMP')でテストできます。 。



    1. MySQLCLIより400倍長いPDOステートメント

    2. 非アクティブな時間の後に接続がハングする

    3. if-elseステートメントエラーが発生しないことをトリガーします

    4. 複数のフィールドから多次元配列を使用してデータを挿入します