2017-02-06 4 views
0

から移入した後、私はPostgresのDBはCIテストサーバーで.sqlファイルを播種されたプロジェクトを持っています。これはビルドされ、ドッカー画像として公開されます。テストPostgresのDBのための右の権限は、プログラム、.sqlファイル

今、私は、サーバーにこれらの.SQLファイルをプッシュするだけではありません。 このファイルで紹介されているすべてのデータベースに対して、すべてのpostgresユーザー(および今後のユーザー)のアクセス許可をチェックする必要があります。

例: ユーザーAおよびB ユーザーAはすべてのデータベースを所有しています。 ユーザBは、データベースX. で読むことができるように読むべきであるので、

にこのprogrammaticalyをテストする方法はありますか? 「BからY->エラーを読み込もうとする以外?

私がこれまでに見つけた他のすべてのソリューションは、手動のどちらかであるかのもの「/エラーしてみてください」を。

+3

[アクセス権限照会関数](https://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-:0(initdbによって作成されたものとは別として)すべてのデータベースを所有していますINFO-ACCESS-TABLE) –

+0

ありがとうございます。 しかし: SELECT has_schema_privilege関数( 'B'、 'X'、 '選択')。結果内: ERROR:認識されていない特権の種類:「選択」 は「P」のスキーマ内のすべてのテーブルでの選択のための「has_table_privilege関数」を依頼する方法はありますか? 他のすべてを除外する簡単な方法はありますか? – MrOerni

答えて

0

あなたはaccess privilege inquiry functionsを経由して、データベース・オブジェクトの様々なタイプのための助成金を検査することができます。これらはすべて個々のオブジェクトのレベルで動作するため、あらゆる種類のデータベース検査では、それらを組み合わせてcatalogクエリにする必要があります。オーナーシップ情報については、カタログを参照する必要があります。 OID typesであり、これらのクエリを書くときに非常に役立ちます。

ユーザーbが読み取り専用の場合、スキーマp内のすべてのテーブルへのアクセスを確認するには:

SELECT EVERY(
    has_table_privilege('b', oid, 'SELECT') AND 
    NOT has_table_privilege('b', oid, 'INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER') 
) 
FROM pg_class 
WHERE relkind = 'r' 
    AND relnamespace = 'p'::regnamespace 

を(あなたもこれらをチェックすることもできますので、そのテーブルの権限は、列レベルの補助金が優先されます。 )

aがスーパーであるかどうかを確認するには、次の

SELECT rolsuper 
FROM pg_roles 
WHERE rolname = 'a' 

かどうかを確認するには

SELECT EVERY(datdba = 'a'::regrole) 
FROM pg_database 
WHERE datname NOT IN ('postgres', 'template0', 'template1') 
関連する問題