La solución más barata que la 'dependencia de seguimiento' es el sys.sql_dependencies tabla de diccionario de datos que a partir de la cual estos datos se pueden consultado desde el diccionario de datos. Oracle tiene una vista de diccionario de datos con una funcionalidad similar llamada DBA_DEPENDENCIES (más USER_ equivalente y ALL_ views). Usando las otras tablas de diccionarios de datos (sys.tables/DBA_TABLES) etc. puede generar informes de dependencia de objetos.
Si te sientes particularmente interesado, puedes utilizar una consulta recursiva (Oracle CONNECT BY o SQL Server Common Table Expressions) para crear un gráfico completo de dependencia de objetos.
Aquí hay un ejemplo de un CTE recursivo en sys.sql_dependencies. Devolverá una entrada para cada dependencia con su profundidad. Los elementos pueden aparecer más de una vez, posiblemente a diferentes profundidades, para cada relación de dependencia. No tengo a mano una instancia de Oracle que funcione para crear una consulta CONNECT BY en DBA_DEPENDENCIES, por lo que cualquier persona con privilegios de edición y el tiempo y la experiencia es bienvenido para anotar o editar esta respuesta.
Tenga en cuenta también con sys.sql_dependencies
que puede obtener referencias de columnas de referenced_minor_id
. Esto podría usarse (por ejemplo) para determinar qué columnas se usaron realmente en los scripts ETL de un área de ensayo con copias de las tablas de DB de la fuente con más columnas de las que realmente se usan.
with dep_cte as (
select o2.object_id as parent_id
,o2.name as parent_name
,o1.object_id as child_id
,o1.name as child_name
,d.referenced_minor_id
,1 as hierarchy_level
from sys.sql_dependencies d
join sys.objects o1
on o1.object_id = d.referenced_major_id
join sys.objects o2
on o2.object_id = d.object_id
where d.referenced_minor_id in (0,1)
and not exists
(select 1
from sys.sql_dependencies d2
where d2.referenced_major_id = d.object_id)
union all
select o2.object_id as parent_id
,o2.name as parent_name
,o1.object_id as child_id
,o1.name as child_name
,d.referenced_minor_id
,d2.hierarchy_level + 1 as hierarchy_level
from sys.sql_dependencies d
join sys.objects o1
on o1.object_id = d.referenced_major_id
join sys.objects o2
on o2.object_id = d.object_id
join dep_cte d2
on d.object_id = d2.child_id
where d.referenced_minor_id in (0,1)
)
select *
from dep_cte
order by hierarchy_level
Tengo esto para abrir ahora a la comunidad.¿Podría alguien con acceso conveniente a una instancia de Oracle en ejecución publicar una consulta recursiva CONNECT BY aquí? Tenga en cuenta que esto es específico del servidor SQL y que el propietario de la pregunta dejó claro que está usando Oracle. No tengo una instancia de Oracle en ejecución para desarrollar y probar nada.
No sabía nada de eso. Pero creo que no es muy fácil de usar. Voy a echar un vistazo sin embargo. –
CONNECT BY definitivamente simplificaría este código. –