Ошибка: Целевая таблица снимка не является таблицей снимков
Если вы видите следующую ошибку при попытке выполнить команду snapshot:
Целевая таблица снимка не является таблицей снимков (отсутствуют
dbt_scd_id
,dbt_valid_from
,dbt_valid_to
)
Убедитесь, что вы случайно не заставили ваш снимок вести себя как материализация таблицы, установив его конфигурацию materialized
в значение table
. До версии dbt 1.4 было возможно создать снимок следующим образом:
{% snapshot snappy %}
{{ config(materialized = 'table', ...) }}
...
{% endsnapshot %}
dbt обрабатывал снимки как таблицы (выполняя команды create or replace table ...
) без предупреждения, вместо того чтобы фактически создавать снимки данных (SCD2 через команды insert
/ merge
). При обновлении до версий dbt 1.4 и выше, dbt теперь выдает ошибку разбора (вместо того чтобы молча обрабатывать снимки как таблицы), которая гласит:
Снимок должен иметь значение materialized 'snapshot'
Это указывает на необходимость изменить конфигурацию materialized
на snapshot
. Но когда вы вносите это изменение, вы можете столкнуться с сообщением об ошибке, указывающим на отсутствие таких полей, как dbt_scd_id
. Эта ошибка возникает потому, что ранее, когда dbt обрабатывал снимки как таблицы, он не включал необходимые мета-поля снимков в вашу целевую таблицу. Поскольку эти мета-поля отсутствуют, dbt правильно определяет, что вы пытаетесь создать снимок в таблице, которая на самом деле не является снимком.
Когда это происходит, вам нужно начать с нуля — повторно создать снимок ваших исходных данных, как если бы это было в первый раз, удалив ваш "снимок", который не является настоящей таблицей снимков. Затем dbt snapshot создаст новый снимок и вставит мета-поля снимка, как и ожидалось.