Перейти к содержимому

Корзина

Удалить строку можно тремя путями — с экрана таблицы, командой DELETE в SQL-редакторе или DBeaver, удалением источника, — и все они ведут в одну корзину.

Команда DELETE по таблице источника выполняется как есть: строки удаляются по-настоящему, никакой скрытой подмены команды нет. На каждой таблице источника висит обычный триггер Postgres «после удаления» — он кладёт удалённые строки партией в корзину и помечает их события в сырых данных удалёнными. Одна команда — одна партия; удаление, не задевшее ни строки, партии не заводит. Так же уходят в корзину удаление через ваше представление и MERGE … DELETE. TRUNCATE вашей роли не дан — он обошёл бы триггер; для этого есть «Очистить источник» с корзиной.

Корзину пишет функция платформы с её правами: у вашей роли прав на корзину нет, и подменить эту функцию своей нельзя.

Каждая строка — ровно такой, какой её удалили, со служебными столбцами. У партии — когда, сколько строк, каким путём (команда, экран таблицы, очистка или удаление источника, отмена загрузки файла), текст команды или фильтр.

Строки возвращаются в таблицу ровно такими, какими их удалили, а пометка в сырых данных снимается. Если с тех пор в таблице появился столбец, у возвращённых строк он пустой; если тип столбца расширился, значение приводится к нему. Если тип закрепили так, что старое значение в него не ложится, партия не возвращается целиком — лучше ничего, чем половина.

Партия удаляется сама — вместе с событиями в сырых данных и их повторными отправками. «Удалить окончательно сейчас» делает это сразу. Так вы удаляете и сырые данные: прямого права на них у вашей роли нет — только через корзину. От партии остаётся запись «когда и сколько» без данных.

Удаление источника уводит в корзину все строки его таблицы одной партией. Если в момент удаления событие ещё было в пути (тело грузилось, опрос работал), его строка появится чуть позже и уйдёт следом своей партией. Возвращённые строки остаются в таблице, сам источник остаётся удалённым, а таблица — на месте: на ней могут держаться ваши представления.

Корзина хранит строки, а не версии значений. UPDATE меняет значение на месте, и прежнего значения у платформы нет — таблица из сырых данных заново не строится (Путь данных). Исходное событие остаётся в raw.events: из него старое значение можно достать своим запросом. Перед большой правкой сделайте бэкап.