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

PostgreSQLの特定のデータベースに権限を付与する

    Postgresの基本概念

    ロールは、必要な権限が与えられた場合に、dbクラスター内のすべてのデータベースにアクセスできるグローバルオブジェクトです。

    クラスター 多くのデータベースを保持します 、多くのスキーマを保持します 。異なるDBのスキーマ(同じ名前であっても)は無関係です。スキーマの権限の付与は、現在のDB(付与時の現在のDB)内のこの特定のスキーマにのみ適用されます。

    すべてのデータベースは、スキーマpublicで始まります デフォルトでは。これは慣例であり、多くの設定はそれから始まります。それ以外は、スキーマpublic 他のスキーマと同じです。

    MySQLから来ているので、単一のスキーマpublicから始めたいと思うかもしれません。 、スキーマレイヤーを事実上完全に無視します。私はデータベースごとに数十のスキーマを定期的に使用しています。
    スキーマはファイルシステムのディレクトリに少し(完全ではありませんが)似ています。

    複数のスキーマを使用する場合は、必ずsearch_pathを理解してください。 設定:

    • search_pathは識別子の解決と「現在のスキーマ」にどのように影響しますか

    デフォルトの権限

    GRANTのドキュメントごと :

    PostgreSQLは、一部のタイプのオブジェクトに対するデフォルトの権限をPUBLICに付与します 。 PUBLICには権限が付与されていません デフォルトでは、テーブル、列、スキーマ、またはテーブルスペースにあります。その他のタイプの場合、PUBLICに付与されるデフォルトの特権 次のとおりです。CONNECT およびCREATE TEMP TABLE データベース用。 EXECUTE 機能の特権;およびUSAGE 言語の特権。

    これらのデフォルトはすべて、ALTER DEFAULT PRIVILEGESで変更できます。 :

    • データベース内の特定のスキーマのすべてをPostgreSQLのグループロールに付与します

    グループの役割

    @Craigがコメントしたように、GRANTするのが最善です グループロールへの権限を付与してから、そのロールの特定のユーザーメンバーを作成します(GRANT グループロールからユーザーロールへ)。これにより、特定のタスクに必要な一連の特権を簡単に処理して取り消すことができます。

    グループロールは、ログインなしの単なる別のロールです。ログインを追加して、ユーザーロールに変換します。詳細:

    • PostgreSQLがユーザーとグループをロールにマージしたのはなぜですか?

    事前定義された役割

    更新: Postgres 14以降では、新しい定義済みの役割(正式には「デフォルトの役割」)が追加されますpg_read_all_data およびpg_write_all_data 以下のいくつかを単純化するために。参照:

    • データベースのすべてのテーブルへのアクセスを許可する

    レシピ

    たとえば、新しいデータベースmydbがあります。 、グループmygrp 、およびユーザーmyusr ...

    スーパーユーザーとして問題のデータベースに接続している間(postgres 例):

    REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
    GRANT CONNECT ON DATABASE mydb TO mygrp;  -- since we revoked from public
    
    GRANT USAGE ON SCHEMA public TO mygrp;
    

    「ユーザーにすべてのテーブルへのすべての権限」を割り当てるには あなたが書いたように(私はもっと制限的かもしれません):

    GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
    GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
    

    将来のオブジェクトにデフォルトの権限を設定するには、すべての役割に対して実行します このスキーマにオブジェクトを作成します:

    ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
    GRANT ALL ON TABLES TO mygrp;
    
    ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
    GRANT ALL ON SEQUENCES TO mygrp;
    
    -- more roles?
    

    次に、グループをユーザーに付与します:

    GRANT mygrp TO myusr;
    

    関連する回答:

    • PostgreSQL-DBユーザーは関数の呼び出しのみを許可する必要があります

    代替(非標準)設定

    MySQLから来ており、データベースに対する特権を分離したいので、この非標準設定db_user_namespaceが好きかもしれません。 。ドキュメントごと:

    このパラメーターは、データベースごとのユーザー名を有効にします。デフォルトではオフになっています。

    マニュアルを注意深くお読みください。この設定は使用しません。上記を無効にすることはありません。



    1. CRYPT_GEN_RANDOM()を使用して、SQLServerで暗号化されたランダム番号を作成します

    2. Oracleデータベースで深夜を過ぎた秒数を返す方法

    3. OracleDatabaseのPL/SQLストアドプロシージャとは

    4. SQLiteで英数字以外の文字のみを含む行を返す