16.3.5 グラフ共有オプションおよびグラフ権限の検証

pgx.confファイルのgraph_sharing_optionパラメータは、グラフを共有できるかどうか、およびグラフを共有する方法を決定します。

これは主に、グラフがデータベースからグラフ・サーバー(PGX)にロードされるかどうかによって異なります。session.readGraphByName() APIを使用してデータベースから直接ロードされるグラフは、トレース可能なグラフと呼ばれます。ただし、ロードされたグラフ・インスタンスで(グラフ変更APIを介して)変更の結果として作成されるグラフは、トレース可能なグラフではありません。

グラフ・サーバー(PGX)では、(公開APIを介して)単一ユーザーのセッション内または(公開および権限付与APIを介して)異なるユーザーのセッション間でグラフを共有できます。これは、pgx.confファイルのgraph_sharing_optionフィールドによって決まります。

また、グラフ・サーバー(PGX)は、トレース可能なすべてのグラフに対して定期的なチェックを実行して、トレース可能なグラフへの参照を保持しているユーザーが、データベース内のソース・グラフ・データにアクセスするためのすべての権限を持っていることを確認します。権限チェックが失敗した場合(たとえば、元のデータ・ソースに対するユーザー権限が取り消された場合)、ユーザー・セッションは破棄され、トレース可能なグラフ・データにアクセスしている同じユーザーのすべてのセッションがメモリーから解放されます。pgx.confファイルのpermission_checks_intervalフィールドを使用すると、グラフ・サーバーがグラフ権限をチェックする必要がある頻度を制御できます。

次の表に、グラフ・サーバー(PGX)でサポートされている3つのgraph_sharing_optionモードを示します。この表には、権限チェックおよびこれらのモードでサポートされているAPIに関する情報も示されています。

表16-10 グラフ共有オプション

グラフ共有オプション 説明 公開APIの許可 権限付与APIの許可 データ・ソースの権限チェック
ALLOW_DATA_SHARING <default> 単一ユーザーのセッション間およびユーザー間で、すべてのグラフ・タイプ(トレース可能かどうかに関係なく)が許可されることを示します はい はい いいえ
ALLOW_TRACEABLE_DATA_SHARING_WITHIN_SAME_USER トレース可能なグラフを単一ユーザーのセッション間でのみ共有できます はい いいえ はい
DISALLOW_DATA_SHARING グラフが常にセッションに対してプライベートであることを示します いいえ いいえ いいえ

たとえば、graph_sharing_optionALLOW_TRACEABLE_DATA_SHARING_WITHIN_SAME_USERに設定され、permission_checks_intervalパラメータがpgx.confファイルで60秒にデフォルト設定される次の例を考えてみます。基礎となるソース表に対するグラフ・ユーザーの権限が、ユーザーがグラフを公開した後に取り消されるとします。ユーザーが現在のセッションまたは別のセッションでグラフ・データにアクセスしようとすると、グラフが無効になり、それぞれのセッションが破棄されます。

次のコードは、現在のユーザー・セッションのグラフ無効化シナリオを示しています:

opg4j> var graph = session.readGraphByName("HR", "EMP_GRAPH", GraphSource.PG_PGQL)
graph ==> PgxGraph[name=EMP_GRAPH,N=134,E=11,created=1696308375704]
opg4j> session.getGraph("EMP_GRAPH")
$2 ==> graph ==> PgxGraph[name=EMP_GRAPH,N=134,E=11,created=1696402820966]
opg4j> graph.publish()
// Source table permission revoked for the user
opg4j> session.getGraph("EMP_GRAPH") //throws exception and the current session is explicitly destroyed
PgxGraph graph = session.readGraphByName("HR", "EMP_GRAPH", GraphSource.PG_PGQL);
session.getGraph("EMP_GRAPH");
graph.publish();
// Source table permission revoked for the user
session.getGraph("EMP_GRAPH"); //throws exception and the current session is explicitly destroyed
>>> graph = session.read_graph_by_name("EMP_GRAPH", "pg_pgql", schema="HR")
>>> session.get_graph("EMP_GRAPH")
PgxGraph(name: EMP_GRAPH, v: 134, e: 11, directed: True, memory(Mb): 0)
>>> graph.publish()
>>> # Source table permission revoked for the user
>>> session.get_graph("EMP_GRAPH") #throws exception and the current session is explicitly destroyed

次のコードは、ソース・データ表に対する権限がユーザーに対して取り消された後、指定されたユーザーの別のセッションでも参照したグラフが無効になることを示しています:

opg4j> //throws exception in another session and the session gets explicitly destroyed
opg4j> graph.queryPgql("SELECT n.* from MATCH (n:employees) LIMIT 5").print()
//throws exception in another session and the session gets explicitly destroyed
graph.queryPgql("SELECT n.* from MATCH (n:employees) LIMIT 5").print();
>>> #throws exception in another session and the session gets explicitly destroyed
>>> graph.query_pgql("SELECT n.* from MATCH (n:employees) LIMIT 5").print()