編集されたバージョン管理ジオデータベースが適切にメンテナンスされている場合(定期的な圧縮メンテナンスと完全圧縮)、データベースまたはSDE管理者は状態テーブルを確認する必要はほとんどありません。これはArcGISシステムによって完全に管理されているシステムテーブルです。
しかし、教育的な理由(探偵的な理由で役立つこともある)から、時々状態テーブルを覗くのは悪くありません(例えば編集時など)。状態テーブルで最も興味深いのは、親状態ID属性parent_state_idを介した親状態へのリンク(階層的なツリー構造)で、どこで編集による分岐が起きたかを示しますが、残念ながらリレーショナルデータベースのテーブルではあまり視覚的にわかりやすくありません。
状態ツリーはsde.statesテーブルの通常のビューではあまり直感的ではありません。
しかしリレーショナルデータベースには階層構造を扱うためのメソッドがあり、select文で階層データを操作し、表示用にデータを整形できます。
例えばOracleの句 START WITH/CONNECT BY は親要素へのリンクに基づいてテーブルを再帰的に走査でき、ツリー内の要素の位置情報を提供する関数があります。例えば LEVEL は再帰の深さ(つまり開始要素からのリンク数)、また SYS_CONNECT_BY_PATH は開始要素から指定要素までの親要素リストを返します。
SELECT
--全体出力のフォーマット(状態ツリーのレベルに応じたインデント、親状態の付加)
LPAD(t.state_id, 2* t."LEVEL" + 1 , ' ')|| '(' || t.parent_state_id || ')' "state(parent state)" ,
ver.owner || '.' || ver.name "version"
FROM
(
--state_id = parent_state_id の除外された開始点を再帰に追加
SELECT
state_id,
parent_state_id,
0 "LEVEL",
'/0' PATH_STR
FROM
sde.states
WHERE
parent_state_id = 0
AND state_id = parent_state_id
UNION ALL
SELECT
state_id,
parent_state_id,
LEVEL, --状態ツリー内のレベル取得
SYS_CONNECT_BY_PATH(state_id, '/') AS PATH_STR --開始から特定状態までのstate_idパス取得
FROM
sde.states
START WITH --無限ループ防止のため state_id = 0 かつ parent_state_id が自身であるものを除外する必要あり
parent_state_id = 0
AND state_id != parent_state_id
CONNECT BY
PRIOR state_id = parent_state_id --再帰結合はparent_state_idリンクによるもの
) t
LEFT OUTER JOIN sde.versions ver ON --特定バージョンの状態情報を結合するためにジョイン
ver.state_id = t.state_id
ORDER BY --親子関係ラインに基づく並び替え
t.PATH_STR
例示sde.statesテーブルから状態ツリーを再帰処理でフォーマットするクエリ例。
このように設計された状態(およびバージョン)テーブルへのクエリは、状態ツリーを適切に見やすくフォーマットします。
Postgresqlにもtablefunc拡張機能用のconnectby類似関数がありますが、これはデフォルトで有効ではなくSDE管理者が権限を持っていない場合があります。
しかし、それでもSDE管理者はこの拡張なしで同様に状態ツリーを表示可能です。句 WITH RECURSIVE を使い、Oracle同様に自己結合による再帰ビューで実現します。OracleのLEVELやSYS_CONNECT_BY_PATHと同様にPostgresqlもツリー内位置情報を返す関数として DEPTH:
with recursive cte(state_id, parent_state_id, depth) as (
--state_id = parent_state_id の除外された開始点を再帰に追加
select
state_id,
parent_state_id,
0
from
sde.sde_states
where
parent_state_id = state_id
union all
select
sde.sde_states.state_id,
sde.sde_states.parent_state_id,
cte.depth + 1
from
sde.sde_states
inner join cte
on
sde.sde_states.parent_state_id = cte.state_id --再帰結合はparent_state_idリンクによるものです。
)
cycle state_id --無限ループ防止のためサイクル検出設定
set
'is_cycle'
'path' を使って開始要素から指定要素までの全親ラインを追加
,
'cte2' として
(
select
state_id,
parent_state_id,
depth,
path
from
"cte"
where --vyloučení nekonečných smyček
not "is_cycle")
select
--formátování celkového výstupu (odsazení dle úrovně ve stromu stavu, připojení parent state)
lpad( cast(cte2.state_id as text) , 2 * depth + 1, ' ')|| '(' || cte2.parent_state_id || ')' "state(parent state)",
ver.owner || '.' || ver.name "version"
from
cte2
--najoinování informace o stavech konkrétních verzí
left outer join sde.sde_versions ver on
cte2.state_id = ver.state_id
order by --seřazení dle rodičovské linie stavu
path
Ukázka postgresql dotazu formátujícího strom stavu do podoby shodné s oracle dotazem.
Uvedené dotazy je možné joinem rozšířit o další informace (například joinem sde.state_locks a sde.process_information o stavy uzamčené editacemi).
Další informace o hierarchických dotazech lze získat přímo v dokumentaci:
https://docs.oracle.com/en/database/oracle/oracle-database/26/sqlrf/Hierarchical-Queries.html#GUID-0118DF1D-B9A9-41EB-8556-C6E7D6A5A84E
https://www.enterprisedb.com/postgres-tutorials/how-run-hierarchical-queries-oracle-and-postgresql
https://www.enterprisedb.com/blog/oracle-postgresql-start-withconnect
https://www.postgresql.org/docs/18/queries-with.html