Если удаление является относительно редким для данного конкретного типа объекта, я бы добавил к объекту флаг, чтобы пометить его как логически «удаленный», а не фактически удаляющий строку. В этом случае приложение должно обрабатывать сокрытие этих объектов при нормальных обстоятельствах.
Если это приведет к недопустимому количеству "несвежих" строк - я бы предложил что-то похожее на ответ Уотсона. В зависимости от точных требований, вы, вероятно, могли бы избежать регистрации удаленных данных и дополнительного поля «причина» где-то прямо из приложения. Использование перехватчиков более прозрачно и более приятно с точки зрения аудита, но отдельный журнал удаления (таблица, база данных, файл), вероятно, проще.