Восстановите данные из таблицы, воссозданной несколько раз в снежинке

У меня возникла проблема, когда кто-то из моей команды несколько раз воссоздал таблицу, используя CREATE OR REPLACE, поскольку нужно было добавить несколько новых полей. Однако вместо добавления столбца с помощью ALTER TABLE была воссоздана вся таблица.

Я пытался вернуть данные, используя путешествие во времени. Но поскольку CREATE OR REPLACE удаляет и воссоздает таблицу, путешествие во времени не работает.

SELECT * FROM {MY_TABLE} AT (OFFSET => -60*60*23);

Данные о путешествиях во времени недоступны для таблицы {MY_TABLE}. Запрошенный время либо выходит за пределы разрешенного периода путешествия во времени, либо до время создания объекта.

Я попытался развернуть таблицу с помощью UNDROP {MY_TABLE} после переименования текущей версии таблицы во что-то другое. Но не повезло! Я все еще не вижу данных. Мне интересно, есть ли другой способ вернуть данные, поскольку это важно, поскольку мы следуем постепенной загрузке вместо уничтожения и заполнения.

ALTER TABLE {MY_TABLE} RENAME TO {MY_TABLE_BLANK};

UNDROP TABLE {MY_TABLE};

Была ли таблица определенно удалена и воссоздана только один раз? Вы можете просмотреть историю таблицы, используя ПОКАЗАТЬ ИСТОРИЮ ТАБЛИЦ, КАК… Если она была воссоздана несколько раз, возможно, вам придется несколько раз переименовать/отменить удаление docs.snowflake.com/en/user-guide/…

NickW 18.05.2024 00:23

@NickW Спасибо за ссылку, Ник! да, его воссоздавали несколько раз. Я нашел ответ здесь Community.snowflake.com/s/article/… Однако ссылка, которой вы поделились, тоже полезна.

evOAD 18.05.2024 00:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
2
177
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Неважно, я узнал об этом от сообщества Snowflake. Публикую свой ответ здесь, возможно, он поможет кому-то в будущем.

Решение состоит в том, чтобы восстановить таблицу N раз, используя UNDROP; и это работает только в том случае, если нет таблицы с таким же именем.

N — сколько раз таблица воссоздается с использованием CREATE OR REPLACE; и путешествие во времени не работает, поскольку CREATE OR REPLACE удаляет таблицу и воссоздает ее.

Я создал таблицу с некоторыми фиктивными данными, чтобы проверить ее.

--------------------------------------------------------
-- Creating Dummy Table with Data
--------------------------------------------------------
USE ROLE SYSADMIN;

CREATE TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE (ID INT, NAME STRING);

INSERT INTO DW_STAGE.PUBLIC.DUMMY_DATA_TABLE (ID, NAME)
SELECT SEQ4()+1, CONCAT('DATA-' , TO_CHAR(SEQ4(),'0000'),  UNIFORM(100000, 990000, RANDOM())) C 
FROM TABLE(GENERATOR(ROWCOUNT => 100));

SELECT * FROM DW_STAGE.PUBLIC.DUMMY_DATA_TABLE;

Теперь мне приходится воссоздавать одну и ту же таблицу несколько раз, меняя DDL (также можно использовать один и тот же DDL). Это создаст несколько версий таблиц, из которых будет видна только последняя.

----------------------------------------------------------
-- Recreating Table three times with an additional Column
----------------------------------------------------------
CREATE OR REPLACE TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE (ID INT, NAME STRING, AGE INT);

CREATE OR REPLACE TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE (ID INT, NAME STRING, AGE STRING);

CREATE OR REPLACE TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE (ID INT, NAME STRING, DOB DATE);

Чтобы просмотреть эти разные версии таблиц, мы можем запросить TABLE_STORAGE_METRICS. Однако для этого требуются достаточные привилегии. Я использую ACCOUNTADMIN для запроса этой таблицы.

--------------------------------------------------------
-- Table Storage Metrics
--------------------------------------------------------
-- This step is not required if you don't have account admin rights
-- But if you have, you can see the N versions of the table where only one doesn't have a dropped date

USE ROLE ACCOUNTADMIN;

SELECT ACTIVE_BYTES, TABLE_CREATED AS CREATED_DATE, TABLE_DROPPED AS DROPPED_DATE, *
FROM SNOWFLAKE.INFORMATION_SCHEMA.TABLE_STORAGE_METRICS
WHERE TABLE_NAME IN ('DUMMY_DATA_TABLE') 
        AND TABLE_CATALOG = 'DW_STAGE'
        AND TABLE_SCHEMA = 'PUBLIC'
        AND TABLE_CREATED::DATE = CURRENT_DATE::DATE
ORDER BY TABLE_CREATED DESC;

Теперь просто мне нужно переименовать текущую версию таблицы во что-то другое и восстановить предыдущую версию таблицы, используя UNDROP. Что-то мне нужно повторить N раз, пока я не увижу данные в таблице из 1-й версии.

--------------------------------------------------------
-- Rename and Undrop Table Three Times
--------------------------------------------------------
-- Switching back to my previous role
USE ROLE SYSADMIN;

--------------------------------
-- Restore To 3rd Version
--------------------------------
ALTER TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE 
RENAME TO DW_STAGE.PUBLIC.DUMMY_DATA_TABLE_v03;

UNDROP TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE;

-- No Data
SELECT * FROM DW_STAGE.PUBLIC.DUMMY_DATA_TABLE; 


--------------------------------
-- Restore To 2nd Version
--------------------------------
ALTER TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE 
RENAME TO DW_STAGE.PUBLIC.DUMMY_DATA_TABLE_v02;

UNDROP TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE;

-- No Data
SELECT * FROM DW_STAGE.PUBLIC.DUMMY_DATA_TABLE; 

--------------------------------
-- Restore To 1st Version
--------------------------------
ALTER TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE 
RENAME TO DW_STAGE.PUBLIC.DUMMY_DATA_TABLE_v01;

UNDROP TABLE DW_STAGE.PUBLIC.DUMMY_DATA_TABLE;

-- Will have DATA
SELECT * FROM DW_STAGE.PUBLIC.DUMMY_DATA_TABLE; 

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

--------------------------------------------------------
-- Dropping off Dummy Tables
--------------------------------------------------------

DROP TABLE IF EXISTS DW_STAGE.PUBLIC.DUMMY_DATA_TABLE;

DROP TABLE IF EXISTS DW_STAGE.PUBLIC.DUMMY_DATA_TABLE_v01;

DROP TABLE IF EXISTS DW_STAGE.PUBLIC.DUMMY_DATA_TABLE_v02;

DROP TABLE IF EXISTS DW_STAGE.PUBLIC.DUMMY_DATA_TABLE_v03;

--------------------------------------------------------
-- Checking If Tables are Dropped
--------------------------------------------------------
SELECT * 
FROM DW_STAGE.INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME ILIKE 'DUMMY_DATA_TABLE'
        AND TABLE_SCHEMA = 'PUBLIC';

Другие вопросы по теме