парсинг SQL - ключевые слова allTeradata, которые выбираются из таблицы - PullRequest
2 голосов
/ 27 апреля 2020

Я пытаюсь выполнить быстрый анализ многих сценариев sql, чтобы определить используемые исходные таблицы и представления. Идея состоит в том, чтобы найти «ОТ» и взять следующее слово. Я знаю, что это может также привести к подзапросам, но в конечном итоге в них также будет «FROM».

альтернатива - объединение с таблицами db c, но это даст нам быстрый первый взгляд .

какие ключевые слова мне нужно искать? JOIN и FROM - единственные, кого я могу сейчас придумать. Есть ли еще ключевые слова?

спасибо

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

Глядя на источники существующего парсера:

Я смотрю на источников парсер . Он может анализировать таблицы по крайней мере в следующих контекстах:

Оператор SELECT:

  • FROM (будьте осторожны, здесь есть список через запятую: FROM a, b, c вполне возможно)
  • (LEFT, RIGHT, FULL, CROSS) (NATURAL) (INNER, OUTER) JOIN

Предостережения:

  • Ссылки на таблицы в FROM могут быть производными таблицами
  • Таблица ссылки в FROM могут быть общими табличными выражениями (из предложения WITH)

Оператор INSERT:

  • INTO (хотя в Teradata это необязательно)
  • INSERT или INS (Teradata поддерживает INS в качестве псевдонима для INSERT)

Оператор UPDATE:

  • UPDATE или UPD (Teradata поддерживает UPD в качестве псевдонима для UPDATE)

Оператор DELETE:

  • FROM (но ключевое слово необязательно)
  • DELETE или DEL (Teradata поддерживает DEL в качестве псевдонима для DELETE)

Оператор MERGE:

  • INTO (необязательно) * 10 81 *
  • MERGE
  • USING

Заявления DDL:

Не забудьте:

  • TRUNCATE (TABLE)
  • CREATE TABLE
  • CREATE VIEW
  • ALTER TABLE
  • ALTER VIEW
  • DROP TABLE
  • DROP VIEW
  • COMMENT ON TABLE
  • COMMENT ON VIEW
  • CREATE INDEX (ON предложение )
  • GRANT (предложение ON или ON TABLE)
  • REVOKE (предложение FROM или FROM TABLE)

Использование существующий синтаксический анализатор для сценария этого:

Если опция Java является опцией, то вы можете использовать парсер jOOQ , запустить все сценарии через него, заново сгенерировать SQL и подключить VisitListener, чтобы собрать все таблицы. Примерно так:

DSLContext ctx = DSL.using(SQLDialect.TERADATA);
ctx.configuration().set(new DefaultVisitListener() {
    @Override
    public void visitStart(VisitContext ctx) {
        if (ctx.queryPart() instanceof Table)
            System.out.println(ctx.queryPart());
    }
});

// The toString() call will trigger a re-generation which passes through the VisitListener
ctx.parser().parse(allSQL).toString();

Хотя jOOQ требует коммерческую лицензию для TERADATA, вы можете использовать бесплатное Open Source Edition для этой конкретной задачи, так как анализатор Open Source Edition поддерживает практически весь синтаксис .

Отказ от ответственности: я работаю в компании, работающей над jOOQ.

1 голос
/ 29 апреля 2020

Вы можете использовать встроенный механизм SHOW (QUALIFIED):

Используйте параметр QUALIFIED для создания отчета, который разрешает неоднозначные зависимости.

SHOW QUALIFIED SELECT * FROM view_name;

Таким образом, вы получите отчет с зависимостями просмотра. Затем вы можете удалить имена таблиц на основе этого отчета.

...