DDL and role manipulation statements
====================================

ユーザーはPostgreSQLインスタンスのグローバルオブジェクトです。つまり、ユーザーは複数のデータベースにまたがりますが、
PGDは個々のデータベースレベルで動作します。この動作のため、ロール操作ステートメントの処理には追加の検討が必要です。

PGDでは、レプリケートされたDDLによって参照されるロールがすべてのノードに存在する必要があります。ロールの付与、パスワードなどは同じである必要はありませんが、存在する必要があります。

`bdr.role_replication <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/pgd-settings#bdrrole_replication>`_ が有効デフォルトであり、ロール操作ステートメントがPGD対応データベースで実行されている場合、PGDはロール操作ステートメントをレプリケートします。

ロール操作ステートメントには次のものが含まれます。

- ``CREATE ROLE``

- ``ALTER ROLE``

- ``DROP ROLE``

- ``GRANT ROLE``

- ``CREATE USER``

- ``ALTER USER``

- ``DROP USER``

- ``CREATE GROUP``

- ``ALTER GROUP``

- ``DROP GROUP``

一般に、次のいずれかです。

- ``bdr.role_replication = off``
  でシステムを構成し、Ansible、Puppet、Chefなどの外部オーケストレーションツールまたは\ ``bdr.replicate_ddl_command()``
  によって明示的にレプリケートされて、すべてのロール変更ユーザーとグループを展開します。

- PostgreSQLインスタンス上の1つのPGD対応データベースに\ ``bdr.role_replication = on``
  があるようにシステムを構成し、そのデータベースですべてのロール管理DDLを実行します。

すべてのロール管理コマンドを1つのデータベースで実行することをお勧めします。

ロールレプリケーションがオフになっている場合、管理者は、あるノードでDDLが使用するロールが他のノードにも存在することを確認する必要があります。それ以外の場合、PGD
applyは、他のノードでロールが作成されるまで、エラーでストールします。

..  Note PGD with non-PGD-enabled databases ::
   PGDは、 PGD対応のPostgreSQLインスタンスの非PGD対応データベースで実行されている場合、ロール管理ステートメントをキャプチャおよびレプリケートしません。たとえば、データベース `pgddb`  bdrグループメンバーと`postgres`  bare db、および`bdr.role_replication = on` があるとします。 `pgddb` で実行された`CREATE USER` はレプリケートされますが、 `postgres` で実行された`CREATE USER` はレプリケートされません。
