Как отследить преобразование полей в разветвленной цепочке запросов SQL?
Есть большое количество таблиц и большое количество SQL-вставок из одной в другую вида INSERT as SELECT.
В SELECT'ах нет звездочек, все поля перечисляются явно, но используются вьюхи, код которых тоже доступен.
В запросах есть многократно вложенные подзапросы, INNER/LEFT JOINs, CROSS JOIN, WITH, UNION ALL, но нет коррелированных подзапросов с EXISTS\IN.
Преобразования, перенос данных образуют сложное дерево , где в одну таблицу заходит поля из многих, в которые в свою очередь заливаются данные из других. итд.
Хочется написать инструмент, который отслеживал бы для конкретного поля в конечной таблице, какие поля в него пишутся из прямых таблиц-источников, и так далее , до самого начала. То есть надо провести рекурсивный парсинг или синтаксический разбор всех запросов, которые льют данные в таблицу и отследить преобразования полей, на выходе получить дерево для одного конечного поля.
Я уверен, что задача много раз вставала раньше перед другими и есть инструменты, но сходу нагуглить не получилось.
Нереально. Достаточно одного CASE, который в зависимости от условия выбирает значение одной из альтернативных таблиц - и анализ встанет колом. То же с рекурсивным CTE - на что ориентироваться, на базу или хвост? А если обнаружится формально-циклическая зависимость?
Если есть CASE - значит в терминах дерева на поле влияют все поля или их комбинации, которые могут быть во всех ветках THEN и ELSE.
Так же, как и SELECT composite_field = field1 * field2 FROM table1 - в дереве у поля composite_field 2 отдельных родителя field1, field2
Рекурсивных CTE нет, слава Богу, но и они могу разбираться при желании.
Да, селект в таблицу может брать данные из самой таблицы - значит получается не дерево, а граф с циклами, ничего страшного.. )
Тэкс. По парсингу.
Хотите получить адекватный ответ - приведите пример (кусок кода), И во что он должен превратится! (Кусок кода)
Иначе это похоже на гадание на кофейной гуще.