Есть ли какая-либо функция или способ получить имена таблиц из Snowflake в порядке зависимостей ссылочной целостности (FK)? - PullRequest
0 голосов
/ 02 апреля 2020

Я хотел бы получить имена таблиц из заданной схемы в отсортированном порядке на основе их зависимостей от внешнего ключа. Например, если у меня есть три следующие таблицы, созданные в Snowflake

CREATE TABLE TAB_X
(
    COL_A CHAR(18),
    COL_B CHAR(18),
    COL_C CHAR(18),
    CONSTRAINT XPKTAB_X PRIMARY KEY (COL_A, COL_B)
);

CREATE TABLE TAB_Z
(
    COL_D CHAR(18),
    COL_E CHAR(18),
    COL_F CHAR(18),
    COL_G CHAR(18),
    COL_A CHAR(18),
    COL_B CHAR(18),
    CONSTRAINT XPKTAB_Z PRIMARY KEY (COL_D, COL_E, COL_A, COL_B),
    CONSTRAINT R_1 FOREIGN KEY (COL_A, COL_B) REFERENCES TAB_X (COL_A, COL_B)
);

CREATE TABLE TAB_B
(
    COL_H CHAR(18),
    COL_I CHAR(18),
    COL_J CHAR(18),
    COL_K CHAR(18),
    COL_D CHAR(18),
    COL_E CHAR(18),
    COL_A CHAR(18),
    COL_B CHAR(18),
    CONSTRAINT XPKTAB_B PRIMARY KEY (COL_H, COL_I, COL_D, COL_E, COL_A, COL_B),
    CONSTRAINT R_2 FOREIGN KEY (COL_D, COL_E, COL_A, COL_B) REFERENCES TAB_Z (COL_D, COL_E, COL_A, COL_B)
);

В этом сценарии, если я выполню запрос SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES;, он вернет мне имена таблиц в алфавитном порядке, что будет.

TAB_B
TAB_X
TAB_Z

Но я хочу правильный порядок создания, то есть:

TAB_X
TAB_Z
TAB_B

Любая помощь с этим будет очень признательна.

Обновление: я не могу достигните этого, сортируя имена таблиц на основе метки времени CREATION, например, если я создаю таблицы следующим образом:

CREATE TABLE TAB_A
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_6 CHAR(18),
    COL_8 CHAR(18),
    COL_12 CHAR(18)
);

ALTER TABLE TAB_A
    ADD CONSTRAINT XPKCOL_C PRIMARY KEY (COL_1, COL_2, COL_3, COL_6, COL_8);

CREATE TABLE TAB_C
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_6 CHAR(18),
    COL_8 CHAR(18),
    COL_11 CHAR(18)
);

ALTER TABLE TAB_C
    ADD CONSTRAINT XPKCOL_X PRIMARY KEY (COL_1, COL_2, COL_3, COL_6, COL_8);

CREATE TABLE TAB_O
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_6 CHAR(18),
    COL_8 CHAR(18),
    COL_12 CHAR(18)
);

ALTER TABLE TAB_O
    ADD CONSTRAINT XPKCOL_A PRIMARY KEY (COL_1, COL_2, COL_3, COL_6, COL_8);

CREATE TABLE TAB_X
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_4 CHAR(18),
    COL_5 CHAR(18)
);

ALTER TABLE TAB_X
    ADD CONSTRAINT XPKTAB_A PRIMARY KEY (COL_1, COL_2, COL_3);

CREATE TABLE TAB_Z
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_6 CHAR(18),
    COL_8 CHAR(18),
    COL_9 CHAR(18),
    COL_0 CHAR(18)
);

ALTER TABLE TAB_Z
    ADD CONSTRAINT XPKTAB_Z PRIMARY KEY (COL_1, COL_2, COL_3, COL_6, COL_8);

ALTER TABLE TAB_A
    ADD CONSTRAINT R_4 FOREIGN KEY (COL_1, COL_2, COL_3, COL_6, COL_8) REFERENCES TAB_C (COL_1, COL_2, COL_3, COL_6, COL_8);

ALTER TABLE TAB_C
    ADD CONSTRAINT R_2 FOREIGN KEY (COL_1, COL_2, COL_3, COL_6, COL_8) REFERENCES TAB_Z (COL_1, COL_2, COL_3, COL_6, COL_8);

ALTER TABLE TAB_O
    ADD CONSTRAINT R_3 FOREIGN KEY (COL_1, COL_2, COL_3, COL_6, COL_8) REFERENCES TAB_C (COL_1, COL_2, COL_3, COL_6, COL_8);

ALTER TABLE TAB_Z
    ADD CONSTRAINT R_1 FOREIGN KEY (COL_1, COL_2, COL_3) REFERENCES TAB_X (COL_1, COL_2, COL_3);

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Присоединитесь к нему с помощью information_schema.table_constraints, отфильтруйте и сортируйте по типу ключа, чтобы получить информацию.

0 голосов
/ 02 апреля 2020

В представлении INFORMATION_SCHEMA.TABLES есть метка времени CREATED. Вы можете вернуть их в порядке отметки времени:

select TABLE_NAME from INFORMATION_SCHEMA.TABLES order by CREATED;

Если вы ищете что-то еще, дайте мне знать. Спасибо.

...