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

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

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

:ref:`bdr.role_replication <bdr.role_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対応データベースで実行されている場合、ロール管理ステートメントをキャプチャおよびレプリケートしません。たとえば、データベース `bdrdb`  bdrグループメンバーと`postgres`  bare db、および`bdr.role_replication = on` があるとします。 `bdrdb` で実行された`CREATE USER` はレプリケートされますが、 `postgres` で実行された`CREATE USER` はレプリケートされません。
