以下のように、機密マトリクスを説明するコメントとともに機密マトリクスを作成します。このコメントは、pgx_confidential_matrixテーブルに保存されます。
select pgx_create_confidential_matrix('matrix_foo', 'This matrix is defined for foo.')
ポイント
この関数を実行したロールを、機密管理ロールとみなします。もし、SET ROLEした後にこの関数を実行したならば、SET ROLEを実行したロールではなく、SET ROLEに指定されたロールを機密管理ロールとみなします。
以下のように、既に作成されている機密マトリクス'matrix_src'を複製して、新しく機密マトリクス'matrix_dest'を作成することもできます。機密マトリクスを複製して作成すると、コメントも複製されます。pgx_alter_confidential_matrix関数を使って、コメントを変更することができます。
select pgx_copy_confidential_matrix('matrix_dest', 'matrix_src')
また、pgx_confidential_matrixテーブルを参照すると、作成したマトリクスを確認することができます。
ポイント
複製元は、同じデータベース内でなければなりません。もし、異なるデータベース、あるいは、異なるデータベースインスタンスから複製するときには、以下のいずれかの方法を選択してください。ただし、COPYを使用した方法は、以下に示す注意を確認後、実行してください。
複製元と同じように関数を使って定義する。
以下の手順を実行する
手順6以外は、SUPERUSER権限を持つロールで実行してください。
ターゲットのデータベースにおいて、拡張をセットアップします。
以下の表から、複製元の機密マトリクスのIDをWHERE句に指定して、COPY TO文を使ってデータを抽出します。
pgx_confidential_matrix
pgx_confidential_level
pgx_confidential_group
pgx_confidential_privilege
pg_sequencesシステムビューを参照して、以下のSEQUENCEのlast_valueカラムの値を、ファイルなどに保存します。
pgx_confidential_matrix_cmatid_seq
pgx_confidential_level_clevid_seq
pgx_confidential_group_cgroid_seq
pgx_confidential_privilege_cpriid_seq
手順2で抽出したデータを、ターゲットのデータベースで、COPY FROM文を使用して上記のテーブルにロードします。この操作は、いずれかの機密マトリクスの機密管理ロールであれば実行できます。
複製先の各SEQUENCEに対して、手順3で保存した値を指定して、pg_catalog.setval関数を使ってlast_valueを設定します。以下に例を示します。
SELECT pg_catalog.setval('pgx_confidential_matrix_cmatid_seq', 5)
pgx_copy_confidential_matrix関数を使って、手順4でロードした機密マトリクスを複製元に指定して、新しい機密マトリクスを作成します。この操作は、新しく作成する機密マトリクスの機密管理ロールで実行します。
手順4でロードした機密マトリクスを、drop_roleにfalseを指定して、pgx_drop_confidential_matrix関数を使って削除します。
注意
drop_roleにtrueを指定すると、複製元の機密マトリクスによる管理を続けられなくなります。理由は以下のとおりです。
手順6が完了すると、以下の状態になっています。
a) 複製元のデータベースの機密マトリクス
b) 手順4でロードした機密マトリクス
c) 手順6で複製した機密マトリクス
b)とc)の機密マトリクスは、異なる機密グループロールを使用しています。これは、pgx_copy _confidential_matrix関数の効果です。しかし、a)とb)の機密マトリクスは、同じ機密グループロールを共有しています。これは一時的ですが、良くない状況です。そのために、b)の機密マトリクスを手順7で削除します。このときに、drop_roleにtrueを指定すると、a)で使用している機密グループロールが削除されます。よって、a)の機密マトリクスによる管理を続けられません。
コピー先では、この拡張をCREATE EXTENSIONでインストールした直後でなければなりません。この拡張に含まれる表のデータの中には、機密マトリクスや機密レベルを表すIDが含まれていて、このIDは拡張に含まれるSEQUENCEによって生成されるからです。例えば、もし機密マトリクスをひとつでも生成していたならば、その機密マトリクスにはIDの1がナンバリングされますが、そのマトリクスはコピー元におけるIDの1がナンバリングされたオブジェクトではありません。