En caso de un mantenimiento correcto de la geodatabase versionada editada (mantenimiento regular con compresiones y compresión completa), ni el administrador de base de datos ni el administrador SDE deberían necesitar consultar la tabla de estados. Es una tabla del sistema completamente controlada por el sistema ArcGIS.
Sin embargo, por razones educativas (que pueden ser útiles para motivos detectivescos), no está mal echar un vistazo a la tabla de estados de vez en cuando (por ejemplo, durante las ediciones). Lo más interesante de la tabla de estados es básicamente la relación del estado dado con su estado padre a través del atributo parent_state_id (estructura jerárquica en forma de árbol) que muestra dónde se produjo una bifurcación por edición, aunque desafortunadamente no es muy ilustrativo en la tabla de la base de datos relacional.
El árbol de estados en la tabla sde.states no es muy intuitivo en una vista común.
Sin embargo, las bases de datos relacionales tienen sus métodos para trabajar con estructuras jerárquicas, que permiten manejar datos jerárquicos en consultas select y modificar los datos para su visualización.
Por ejemplo, Oracle tiene la cláusula START WITH/CONNECT BY, que permite recorrer recursivamente la tabla basándose en la relación con el elemento padre, y funciones que proporcionan información sobre la posición del elemento en el árbol. Por ejemplo, LEVEL indica el nivel de anidamiento en la recursión (es decir, el número de enlaces al elemento inicial) o SYS_CONNECT_BY_PATH devuelve una lista de elementos padres ordenados desde el inicial hasta el elemento dado.
SELECT
--formateo del resultado total (sangría según nivel en el árbol de estados, unión con estado padre)
LPAD(t.state_id, 2* t."LEVEL" + 1 , ' ')|| '(' || t.parent_state_id || ')' "state(parent state)" ,
ver.owner || '.' || ver.name "version"
FROM
(
--agregar en la recursión el inicio excluido donde 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, --obtener nivel en el árbol de estados
SYS_CONNECT_BY_PATH(state_id, '/') AS PATH_STR --obtener ruta desde el inicio hasta el estado específico
FROM
sde.states
START WITH --es necesario excluir state_id = 0 que tiene parent_state_id igual a sí mismo para evitar ciclos
parent_state_id = 0
AND state_id != parent_state_id
CONNECT BY
PRIOR state_id = parent_state_id --la conexión recursiva es mediante parent_state_id
) t
LEFT OUTER JOIN sde.versions ver ON --unión para obtener información sobre los estados de versiones específicas
ver.state_id = t.state_id
ORDER BY --ordenar según la línea parental del estado
t.PATH_STR
Ejemplo de consulta que formatea recursivamente el árbol de estados desde la tabla sde.states.
Una consulta diseñada así para la tabla de estados (y versiones) ya formatea adecuadamente y con claridad el árbol de estados:
Postgresql tiene funciones similares connectby para la extensión tablefunc, pero esta no está habilitada por defecto y el administrador SDE puede no tener permisos para ello.
Sin embargo, esto no significa que un administrador SDE no pueda mostrar el árbol de estados sin esta extensión. Se puede usar la cláusula WITH RECURSIVE, donde se realiza una unión recursiva similar a una auto-unión. Al igual que Oracle (con LEVEL y SYS_CONNECT_BY_PATH), Postgresql ofrece funciones que devuelven información sobre la posición en el árbol como DEPTH' y '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