Каскадное мягкое удаление

У SQL всегда была отличная возможность: каскадные удаления. Вы планируете это заранее, и когда пришло время что-то удалить, BAM! Не нужно беспокоиться обо всех этих зависимых записях.

Однако в настоящее время он почти запрещает фактически удалять что-либо. Вы отмечаете его как удаленное и прекратите показывать его. К сожалению, я не смог найти твердого решения для этого, когда есть зависимые записи. Я всегда вручную кодировал сложную сеть мягких удалений.

Есть ли лучшее решение, которое я полностью пропустил?

Ответ 1

Мне очень жаль это говорить, но триггеры специально разработаны для такого рода вещей.

(Часть ненависти объясняется тем, что хорошие триггеры очень трудно писать и, конечно же, нельзя отлаживать)

Ответ 2

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

Ответ 3

Я думаю, что преимущество мягких удалений обычно заключается в том, что не каждая таблица имеет флаг soft-delete, поэтому количество вещей, необходимых для каскадирования, невелико. Строки просто не используются в базе данных, но не потеряны - на них просто ссылаются только удаленные строки.

Как и все, это зависит от вашей модели.

Ответ 4

Не уверен, о каком бэкэнд вы говорите, но вы можете нажать на свой флаг "delete" и изменить каскад с помощью триггера.