Bij correcte onderhoud van de bewerkte versiegeodatabank (regelmatig onderhoud met compressies en volledige compressie) zou een database- of SDE-beheerder eigenlijk niet eens de behoefte moeten hebben om in de statustabel te kijken. Het is een systeemtabel die volledig door het ArcGIS-systeem wordt beheerd.
Toch is het, ook om educatieve redenen (die nuttig kunnen zijn bij detectivewerk), niet verkeerd om af en toe in de statustabel te kijken (bijvoorbeeld tijdens bewerkingen). Wat aan de statustabel eigenlijk het meest interessant is, is de koppeling van een bepaalde status aan zijn ouderstatus via het attribuut parent_state_id (hiërarchische boomstructuur) die laat zien waar door bewerking een splitsing heeft plaatsgevonden, maar helaas is dit in de relationele databasetabel niet erg duidelijk.
Statusboom in de tabel sde.states is in de gewone weergave niet erg intuïtief.
Relationele databases hebben echter hun eigen methoden voor het werken met hiërarchische structuren, waarmee je met hiërarchische gegevens in selecties kunt werken en de gegevens voor weergave kunt aanpassen.
Bijvoorbeeld Oracle-clausule START WITH/CONNECT BY, die recursief door de tabel navigeert op basis van de koppeling naar het ouderelement, en functies die informatie over de positie van het element in de boom verschaffen. Bijvoorbeeld LEVEL niveau van inspringing in de recursie (oftewel het aantal koppelingen naar het beginpunt) of SYS_CONNECT_BY_PATH geeft voor een lijst van ouderelementen gerangschikt van het begin tot aan het gegeven element terug.
SELECT
--opmaak van de totale output (inspringing volgens niveau in de statusboom, toevoeging parent state)
LPAD(t.state_id, 2* t."LEVEL" + 1 , ' ')|| '(' || t.parent_state_id || ')' "state(parent state)" ,
ver.owner || '.' || ver.name "version"
FROM
(
--toevoeging in recursie van uitgesloten start waar 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, --bepaling van niveau in statusboom
SYS_CONNECT_BY_PATH(state_id, '/') AS PATH_STR --bepaling van pad state_id vanaf start tot aan specifieke status
FROM
sde.states
START WITH --het is nodig state_id = 0 uit te sluiten die parent_state_id zichzelf heeft vanwege oneindige lus
parent_state_id = 0
AND state_id != parent_state_id
CONNECT BY
PRIOR state_id = parent_state_id --koppeling in recursie via parent_state_id relatie
) t
LEFT OUTER JOIN sde.versions ver ON --joinen van informatie over statussen van specifieke versies
ver.state_id = t.state_id
ORDER BY --sorteren volgens ouderlijn van status
t.PATH_STR
Uitvoering van query die door recursieve verwerking statusboom uit tabel sde.states formatteert.
Een zodanig geconcipieerde query op de statustabel (en versies) formatteert voor ons al netjes de statusboom:
Postgresql heeft weliswaar vergelijkbare connectby-functies voor extensie tablefunc, maar deze is standaard niet ingeschakeld en een SDE-beheerder heeft daar mogelijk geen rechten voor.
Dat betekent echter niet dat een SDE-beheerder op soortgelijke wijze zonder deze extensie geen statusboom kan weergeven. Het is mogelijk om clausule WITH RECURSIVE te gebruiken ... waarbij op vergelijkbare wijze in een recursieve view een join van de tabel met zichzelf plaatsvindt. Net als bij Oracle (LEVEL en SYS_CONNECT_BY_PATH) biedt Postgresql ook functies die informatie over positie in de boom teruggeven DEPTH en PATH :
with recursive cte(state_id, parent_state_id, depth) as (
--toevoeging in recursie van uitgesloten start waar 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 --koppeling in recursie via parent_state_id relatie
)
cycle state_id -- detectie cyclus ter uitsluiting van oneindige lussen in join
set
'is_cycle'
'using path' -- toevoeging van volledige ouderlijn van element vanaf startpunt tot aan gegeven element
,
'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