V případě správné údržby editované verzované geodatabáze (pravidelná údržba kompresí a plnou kompresí), by databázový či SDE administrátor ani neměl mít potřebu se do tabulky stavů podívat. Je to systémová tabulka plně kontrolovaná systémem ArcGIS.
Nicméně už z edukativních důvodů (které se mohou hodit při důvodech detektivních) není špatné do tabulky stavů sem tam nakouknout (například třeba při editacích). Co je na tabulce stavů v podstatě nejzajímavější, vazba daného stavu na svůj rodičovský stav přes atribut parent_state_id (hierarchická stromová struktura) ukazující, kde došlo editací k odštěpení, ale bohužel není v tabulce relační databáze příliš názorné.
Strom stavů v tabulce sde.states není v běžném pohledu příliš intuitivní.
Relační databáze ale mají pro práci s hierarchickou strukturou své metody, které umožňují pracovat s hierarchickými daty v selectech a data pro zobrazení upravit.
Například Oracle klauzuli START WITH/CONNECT BY, která umožňuje rekurzivní procházení tabulky na základě vazby na rodičovský prvek, a funkce které zpřistupňují informace o poloze prvku ve stromu. Například LEVEL úroveň zanoření v rekurzi (neboli počet vazeb k počátečnímu prvku) nebo SYS_CONNECT_BY_PATH vrací pro seznam rodičovských prvků řazených od počátečního až po daný prvek.
SELECT
--formátování celkového výstupu (odsazení dle úrovně ve stromu stavu, připojení parent state)
LPAD(t.state_id, 2* t."LEVEL" + 1 , ' ')|| '(' || t.parent_state_id || ')' "state(parent state)" ,
ver.owner || '.' || ver.name "version"
FROM
(
--přidání v rekurzi vyloučeného počátku kde 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, --získání úrovně ve stromu stavu
SYS_CONNECT_BY_PATH(state_id, '/') AS PATH_STR --získání cesty state_id od počátku až do konkrétního stavu
FROM
sde.states
START WITH --je nutné vyloučit state_id = 0 který má parent_state_id sám sebe kvůli zacyklení
parent_state_id = 0
AND state_id != parent_state_id
CONNECT BY
PRIOR state_id = parent_state_id --napojení v rekurzi je přes vazbu parent_state_id
) t
LEFT OUTER JOIN sde.versions ver ON --najoinovani informace o stavech konkretních verzí
ver.state_id = t.state_id
ORDER BY --seřazení dle rodičovské linie stavu
t.PATH_STR
Ukázka dotazu formátujícího rekurzivním zpracováním strom stavů z tabulky sde.states.
Takto koncipovaný dotaz do tabulky srtavů (a verzí) nám již strom stavů patřičně přehledně naformátuje:
Postgresql má sice podobné funkce connectby pro extenzi tablefunc, ta ale není defaultně povolena a SDE administrátor k tomu nemusí mít práva.
To ale neznamená, že by si SDE administrátor podobným způsobem nemohl strom stavů bez této extenze zobrazit. Je možné použít klauzuli WITH RECURSIVE ... kde dochází obdobně v rekurzivním pohledu k joinu tabulky sama na sebe. Obdobně jako v Oracle (LEVEL a SYS_CONNECT_BY_PATH) i Postgresql nabízí funkce vracející informace o poloze ve stromu DEPTH a PATH :
with recursive cte(state_id, parent_state_id, depth) as (
--přidání v rekurzi vyloučeného počátku kde je 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 --napojení v rekurzi je přes vazbu parent_state_id
)
cycle state_id -- detekce cyklu pro vyloučení nekonečných smyček v joinu
set
"is_cycle"
using "path" -- přidání celé rodičovské linie prvku od počátečního prvku po daný prvek
,
cte2 as
(
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