LINUX: как выводить таблицы, используемые в скрипте SQL - PullRequest
0 голосов
/ 23 ноября 2018

чел.

У меня есть тонна SQL-скриптов (более 1000 файлов), и я должен перечислить некоторую информацию о них.Основная проблема заключается в том, чтобы перечислить все таблицы и используемые операции для каждого сценария.Мне нужно найти в основном операции SELECT, INSERT, DELETE и UPDATE.

SELECT EXAMPLE:

     SELECT column1, column2
       FROM SCHEMA1.TABLE_A A, SCHEMA1.TABLE_B B,
            SCHEMA3.TABLE_K, SCHEMA3.TABLE_M,
            SCHEMA4.TABLE N
      INNER JOIN SCHEMA2.TABLE_C C ON C.COLUMN_XX = A.COLUMN_XX
       LEFT JOIN SCHEMA2.TABLE_D D ON D.COLUMN_YY = A.COLUMN_YY
 FULL OUTER JOIN SCHEMA2.TABLE_E E ON E.COLUMN_ZZ = B.COLUMN_ZZ
      WHERE B.COLUMN_AA = A.COLUMN_AA
        AND K.COLUMN_KK = A.COLUMN_KK
        AND M.COLUMN_MM = A.COLUMN_MM
        AND N.COLUMN_NN = A.COLUMN_NN;

ВЫХОД ДЛЯ ВЫБОРА БУДЕТ БЫТЬ (ЗАКАЗАТЬ НЕ СУЩЕСТВУЕТ):

SCHEMA1.TABLE_A | SELECT
SCHEMA1.TABLE_B | SELECT
SCHEMA3.TABLE_K | SELECT
SCHEMA3.TABLE_M | SELECT
SCHEMA4.TABLE_N | SELECT
SCHEMA2.TABLE_C | SELECT
SCHEMA2.TABLE_D | SELECT
SCHEMA2.TABLE_E | SELECT

ПРИМЕР ВСТАВКИ:

INSERT INTO SCHEMA1.TABLE_A (COLUMN1,COLUMN2) VALUES ('VALUE_1','VALUE_2');
INSERT INTO SCHEMA1.TABLE_B
(COLUMN_1,COLUMN2)
VALUES
('VALUE_1','VALUE_2');
INSERT INTO SCHEMA2.TABLE_C SELECT * FROM SCHEMA5.TABLE_C;

ВЫХОД ДЛЯ ВСТАВКИ БУДЕТ (ЗАКАЗАТЬ НЕ ДЕЛАЕТ):

SCHEMA1.TABLE_A | INSERT
SCHEMA1.TABLE_B | INSERT
SCHEMA2.TABLE_C | INSERT
SCHEMA5.TABLE_C | SELECT (IF IT IS "OK" TO PUT SOMETHING LIKE 'SELECT (INSERT)' WOULD BE BETTER.. IF NOT, THAT'S OK)

УДАЛИТЬ ПРИМЕР:

DELETE FROM SCHEMA3.TABLE_K WHERE K.COLUMN_KK = 'A';
DELETE FROM SCHEMA1.TABLE_A A
 INNER JOIN SCHEMA2.TABLE_C C ON C.COLUMN_XX = A.COLUMN_XX
 WHERE A.COLUMN_AA = 'A';

ВЫХОД ДЛЯ УДАЛЕНИЯ БУДЕТ (ЗАКАЗАТЬ НЕ ДЕЛАЕТ):

SCHEMA3.TABLE_K | DELETE
SCHEMA1.TABLE_A | DELETE
SCHEMA2.TABLE_C | JOIN (IF IT IS "OK" TO PUT SOMETHING LIKE 'JOIN (DELETE)' WOULD BE BETTER... IF NOT, THAT'S OK)

ПРИМЕР ОБНОВЛЕНИЯ:

UPDATE SCHEMA1.TABLE_A SET COLUMN_AA = 'A';
UPDATE SCHEMA2.TABLE_C SET COLUMN_CC = (SELECT COLUMN_CC FROM SCHEMA5.TABLE_C)
 WHERE EXISTS (SELECT * FROM SCHEMA5.TABLE_C C2 WHERE C2.COLUMN_CC = C.COLUMN_CC);
UPDATE SCHEMA2.TABLE_D D
 INNER JOIN SCHEMA1.TABLE_A A ON D.COLUMN_ID = A.COLUMN_ID
   SET D.COLUMN_DD = A.COLUMN_DD;

ВЫХОД ДЛЯ ОБНОВЛЕНИЯ БУДЕТ (ПОРЯДОК НЕ ДЕЛАЕТ):

SCHEMA1.TABLE_A | UPDATE
SCHEMA2.TABLE_C | UPDATE
SCHEMA5.TABLE_C | SELECT
SCHEMA2.TABLE_D | UPDATE
SCHEMA1.TABLE_A | JOIN (IF IT IS "OK" TO PUT SOMETHING LIKE 'JOIN (UPDATE)' WOULD BE BETTER... IF NOT, THAT'S OK)

Любые подсказки, о которыхполезнее всего это сделать, как преодолеть основные проблемы, такие как разрывы строк после FROM, например, как получить слова после одной конкретной работы (например, как получить то, что после предложения FROM), как определить основную операцию в JOINпункты и т. д., будет очень приветствоваться.

Спасибо всем.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

простая команда для всех операций:

cat your_sql_script.sql | tr -d "\n" | tr ";" "\n" | sed 's/$/;/'

Теперь вы можете выполнить любую команду sql grep.
это вывод для вставленного удаления:

DELETE FROM SCHEMA3.TABLE_K WHERE K.COLUMN_KK = 'A'
DELETE FROM SCHEMA1.TABLE_A A INNER JOIN SCHEMA2.TABLE_C C ON C.COLUMN_XX = A.COLUMN_XX WHERE A.COLUMN_AA = 'A'     

Может быть, это поможет вам:

cat SELECT.sql | tr -d "\n" | tr ";" "\n" | sed 's/$/;/' | awk '{print $3,"|",$1}'     

вывод:

SCHEMA3.TABLE_K | DELETE
SCHEMA1.TABLE_A | DELETE
0 голосов
/ 23 ноября 2018

Хм, это довольно сложно интерпретировать весь синтаксис SQL (PostgeSQL, Oracle, MS ..,) в регулярные выражения.

В любом случае, вот несколько начальных примеров AWK, которые должны работать для ваших примеров операторов SELECT и INSERT.:

awk '
BEGIN { RS="[ ,;\n]"; }
/^SELECT$|^INSERT$/ { operation=$1; watchtable=0; }
/^FROM$|^JOIN$|^INTO$/ { watchtable=1; }
/^WHERE$|^INNER$|^OUTER$|^LEFT$|^RIGHT$|^ON$|^ORDER$|^GROUP$|^\(/ { watchtable=0; }
watchtable && /^[^\.]+\.[^\.]+$/ { print($0 " | " operation); }
' SELECT.sql INSERT.sql

Вы можете продолжить и настроиться на дальнейший и более надежный код.

Примечание. В соответствии с вашими примерами я упростил задачу и предположил, что ваши таблицы всегда находятся в схеме формы.Таблица.

Выход для SELECT:

SCHEMA1.TABLE_A | SELECT
SCHEMA1.TABLE_B | SELECT
SCHEMA3.TABLE_K | SELECT
SCHEMA3.TABLE_M | SELECT
SCHEMA4.TABLE | SELECT
SCHEMA2.TABLE_C | SELECT
SCHEMA2.TABLE_D | SELECT
SCHEMA2.TABLE_E | SELECT

Выход для INSERT:

SCHEMA1.TABLE_A | INSERT
SCHEMA1.TABLE_B | INSERT
SCHEMA2.TABLE_C | INSERT
SCHEMA5.TABLE_C | SELECT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...