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

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

これは主に、グラフ・ソースがわかっているかどうかで異なります。グラフ・サーバー(PGX)では、(公開APIを介して)単一ユーザーのセッション内または(公開および権限付与APIを介して)異なるユーザーのセッション間でグラフを共有できます。

グラフ・サーバー(PGX)では、次の3つのレベルのグラフ・トレーサビリティが定義されています:

  • 完全トレース可能グラフ: グラフのすべてのプロバイダがトレース可能です。たとえば、一連のデータベース表からのデータのロードは、トレース可能ソースです。したがって、session.readGrapbByName()を使用してロードされたグラフは、トレース可能とみなされます。
  • 部分トレース可能グラフ: グラフにおいて、プロバイダが混在しています(つまり、トレース可能プロバイダが少しと、トレース不可プロバイダが少し)。
  • トレース不可グラフ: グラフのすべてのプロバイダがトレース不可です。ロードされたグラフ・インスタンスで変更の結果として作成(グラフ変更APIを使用)されたグラフは、トレース不可とみなされます。

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

次の表に、グラフ・サーバー(PGX)でサポートされている3つのgraph_sharing_optionモードを示します。

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

グラフ共有オプション 説明 公開APIの許可 権限付与APIの許可 定期的な権限チェック getGraph権限チェック
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()