No caso de manutenção correta do geodatabase versionado editado (manutenção regular com compressões e compressão completa), o administrador do banco de dados ou SDE nem deveria precisar olhar para a tabela de estados. É uma tabela do sistema totalmente controlada pelo sistema ArcGIS.
No entanto, por razões educacionais (que podem ser úteis em casos investigativos), não é ruim dar uma olhada na tabela de estados de vez em quando (por exemplo, durante edições). O que é basicamente mais interessante na tabela de estados é a ligação do estado atual ao seu estado pai através do atributo parent_state_id (estrutura hierárquica em árvore) mostrando onde ocorreu a ramificação pela edição, mas infelizmente isso não é muito claro na tabela do banco relacional.
Aárvore de estados na tabela sde.states não é muito intuitiva na visualização comum.
Bancos de dados relacionais têm seus métodos para trabalhar com estruturas hierárquicas, que permitem manipular dados hierárquicos em consultas e ajustar os dados para exibição.
Por exemplo, o Oracle tem a cláusula START WITH/CONNECT BY, que permite percorrer recursivamente a tabela com base na ligação ao elemento pai, e funções que fornecem informações sobre a posição do elemento na árvore. Por exemplo, LEVEL nível de profundidade na recursão (ou seja, número de ligações até o elemento inicial) ou SYS_CONNECT_BY_PATH retorna a lista dos elementos pais ordenados desde o inicial até o elemento atual.
SELECT
--formatação da saída geral (indentação conforme nível na árvore de estados, anexando estado pai)
LPAD(t.state_id, 2* t."LEVEL" + 1 , ' ')|| '(' || t.parent_state_id || ')' "state(parent state)" ,
ver.owner || '.' || ver.name "version"
FROM
(
--adição na recursão do início excluído onde 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, --obtenção do nível na árvore de estados
SYS_CONNECT_BY_PATH(state_id, '/') AS PATH_STR --obtenção do caminho state_id desde o início até o estado específico
FROM
sde.states
START WITH --é necessário excluir state_id = 0 que tem parent_state_id igual a si mesmo para evitar ciclos
parent_state_id = 0
AND state_id != parent_state_id
CONNECT BY
PRIOR state_id = parent_state_id --conexão na recursão é feita pela ligação parent_state_id
) t
LEFT OUTER JOIN sde.versions ver ON --junção das informações dos estados das versões específicas
ver.state_id = t.state_id
ORDER BY --ordenar pela linha parental do estado
t.PATH_STR
Exemplo da consulta formatando recursivamente a árvore de estados da tabela sde.states.
Essa consulta concebida para a tabela de estados (e versões) já formata adequadamente a árvore de estados para melhor visualização:
O Postgresql tem funções similares connectby para a extensão tablefunc, mas essa não está habilitada por padrão e o administrador SDE pode não ter permissão para isso.
Mas isso não significa que o administrador SDE não possa exibir a árvore de estados sem essa extensão. É possível usar a cláusula WITH RECURSIVE ... onde ocorre uma junção recursiva da tabela consigo mesma. Assim como no Oracle (LEVEL e SYS_CONNECT_BY_PATH), o Postgresql oferece funções que retornam informações sobre a posição na árvore DEPTH e PATH :
with recursive cte(state_id, parent_state_id, depth) as (
--adição na recursão do início excluído onde 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 --conexão na recursão é feita pela ligação parent_state_id
)
cycle state_id -- detecção de ciclo para evitar loops infinitos na junção
set
'is_cycle'
'using path' -- adição da linha parental completa do elemento desde o elemento inicial até o atual
,
cte2 as
(
select
state_id,
parent_state_id,
depth,
path
from
'cte'
'where --exclusão dos loops infinitos'
'not is_cycle') '
'select'
'--formatação da saída geral (indentação conforme nível na árvore de estados, anexando estado pai)'
'lpad(cast(cte2.state_id as text), 2 * depth + 1, ' ')|| '(' || cte2.parent_state_id || ')' "state(parent state)",'
'ver.owner || '.' || ver.name "version"'
'from'
'cte2'
'--junção das informações dos estados das versões específicas'
'left outer join sde.sde_versions ver on'
'cte2.state_id = ver.state_id'
'order by --ordenar pela linha parental do estado'
'path'
'Exemplo de consulta postgresql formatando a árvore de estado similar à consulta oracle.'
'As consultas apresentadas podem ser estendidas por junções para incluir outras informações (por exemplo, junção com sde.state_locks e sde.process_information sobre estados bloqueados por edições).'
'Mais informações sobre consultas hierárquicas podem ser encontradas diretamente na documentação:'
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