У меня возникла проблема, когда кто-то из моей команды несколько раз воссоздал таблицу, используя 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};
@NickW Спасибо за ссылку, Ник! да, его воссоздавали несколько раз. Я нашел ответ здесь Community.snowflake.com/s/article/… Однако ссылка, которой вы поделились, тоже полезна.


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