Удаление без удаления
Добавлено: 28 окт 2004, 18:44
Вопрос в том, как реализовать удаление без удаления? Т.е. так чтобы при удалении, например, срабатывал триггер который, вставляя новую и апдейтя старую запись ничего не удалял из таблицы?
Если интересно - предыстория:
Есть самоссылочные таблицы со след. структурой:
CREATE TABLE "TObject" (
"ObjectID" "TableID" NOT NULL, // Сериальник на генераторе
... информационные поля ....
"CreateTime" "DateTime" NOT NULL, // Дата создания информации
"ChangeTime" "DateTime", // Дата перехода инф-ции в действительное состояние
"CreatedByUserID" "GuideID" NOT NULL, // Пользователь создавший информацию
"ActualID" "NullableTableID"); // Ссылка на действительную информацию в этой же таблице
ALTER TABLE "TObject" ADD CONSTRAINT "PK_TObject" PRIMARY KEY ("ObjectID");
При появлении нового объекта добавляется новая запись, в которой автоматически заполняются поля: ObjectID, CreateTime, CreatedByUserID
При изменении информации об объекте добавляется новая запись (новый сериальник) в которую переносится вся старая информация об объекте + поля: CreateTime, CreatedByUserID; а также у нее (у новой записи) заполняются поля ChangeTime, ActualID. Где ActualID ссылка на старый сериальник. А старая запись заполняется новой информацией, в том числе меняются поля: CreateTime, CreatedByUserID (ChangeTime и ActualID остаются пустыми)
При удалении объекта добавляется новая запись (новый сериальник) в которую переносится вся информация об объекте + поля: CreateTime, CreatedByUserID; а также у нее (у новой записи) заполняются поля ChangeTime, ActualID. Где ActualID ссылка на старый сериальник. А в старой записи меняются поля: CreateTime, CreatedByUserID, ChangeTime и ActualID. Где ChangeTime = CreatedByUserID, а ActualID ссылается на саму себя. Такие сложности при удалении связаны с тем, что нам необходимо хранить, кто удалил объект. Если мы просто у старой записи бы поставили ActualID равен своему же сериальнику и проапдейтили CreatedByUserID и ChangeTime, то потеряли бы информацию о том пользователе, который делал последние перед удалением изменения.
Для чего это сделано:
1. Сохранять всю историю информации с сохранением кто и когда менял.
2. Не создаем дополнительной таблицы истории, что позволяет нам делать запросы по информации актуальной на произвольный момент времени.
Если интересно - предыстория:
Есть самоссылочные таблицы со след. структурой:
CREATE TABLE "TObject" (
"ObjectID" "TableID" NOT NULL, // Сериальник на генераторе
... информационные поля ....
"CreateTime" "DateTime" NOT NULL, // Дата создания информации
"ChangeTime" "DateTime", // Дата перехода инф-ции в действительное состояние
"CreatedByUserID" "GuideID" NOT NULL, // Пользователь создавший информацию
"ActualID" "NullableTableID"); // Ссылка на действительную информацию в этой же таблице
ALTER TABLE "TObject" ADD CONSTRAINT "PK_TObject" PRIMARY KEY ("ObjectID");
При появлении нового объекта добавляется новая запись, в которой автоматически заполняются поля: ObjectID, CreateTime, CreatedByUserID
При изменении информации об объекте добавляется новая запись (новый сериальник) в которую переносится вся старая информация об объекте + поля: CreateTime, CreatedByUserID; а также у нее (у новой записи) заполняются поля ChangeTime, ActualID. Где ActualID ссылка на старый сериальник. А старая запись заполняется новой информацией, в том числе меняются поля: CreateTime, CreatedByUserID (ChangeTime и ActualID остаются пустыми)
При удалении объекта добавляется новая запись (новый сериальник) в которую переносится вся информация об объекте + поля: CreateTime, CreatedByUserID; а также у нее (у новой записи) заполняются поля ChangeTime, ActualID. Где ActualID ссылка на старый сериальник. А в старой записи меняются поля: CreateTime, CreatedByUserID, ChangeTime и ActualID. Где ChangeTime = CreatedByUserID, а ActualID ссылается на саму себя. Такие сложности при удалении связаны с тем, что нам необходимо хранить, кто удалил объект. Если мы просто у старой записи бы поставили ActualID равен своему же сериальнику и проапдейтили CreatedByUserID и ChangeTime, то потеряли бы информацию о том пользователе, который делал последние перед удалением изменения.
Для чего это сделано:
1. Сохранять всю историю информации с сохранением кто и когда менял.
2. Не создаем дополнительной таблицы истории, что позволяет нам делать запросы по информации актуальной на произвольный момент времени.