Вопрос

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

Кто-нибудь знает, как сделать это с базой данных SQL Server?

Помощь очень ценится.

Это было полезно?

Решение

Продолжая идею Лукаша, столбец datetime тоже будет полезен.

  • NULL = текущий
  • Значение = при мягком удалении

Это добавляет простое управление версиями, чего не может сделать битовый столбец, что может работать лучше.

Другие советы

Вы можете добавить еще один столбец в таблицу " удалено " который имеет значение 0 или 1 и отображает только те записи с удаленным = 0.

ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0

Вы также можете создать представление, в котором будут только не восстановленные строки.

CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0

И ваша команда удаления будет выглядеть так:

UPDATE TheTable SET deleted = 1 WHERE id = ...

В большинстве случаев я бы предпочел заархивировать удаленные строки в архивную таблицу с триггером удаления. Таким образом, я также могу определить, кто удалил каждую строку, и удаленные строки не влияют на мою производительность. Затем вы можете создать представление, которое объединяет обе таблицы, когда вы хотите включить удаленные.

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

Альтернативным предложением было бы добавить дополнительное присвоение статуса, если существует уже существующий код состояния. Например, в приложении посещаемости класса, которое мы используем для внутреннего использования, запись о посещаемости может быть «Импортирована», «Зарегистрировано», «Завершено», «Не завершено» и т. Д. * - мы добавили «Удалено»; вариант для случаев, когда есть непреднамеренные дубликаты. Таким образом, у нас есть запись, и мы не просто добавляем новый столбец при проблеме.

* Это отображаемое имя для числового кода, используемого за кулисами. Просто уточняю. :)

Решение с триггерами

Если вы дружите с триггером БД, вы можете рассмотреть:

  • добавить DeletedAt and DeletedBy столбцы в ваши таблицы
  • создать представление для каждой таблицы (например:для стола Customer иметь CustomerView представление, которое будет отфильтровывать строки, имеющие DeletedAt не ноль (идея ГБН со столбцами даты)
  • все ваши операции CRUD выполняются как обычно, но не на Customer столе, но на CustomerView
  • добавлять INSTEAD OF DELETE триггер, который пометит строку как удаленную вместо ее физического удаления.
    • вы можете захотеть сделать там немного более сложные вещи, например гарантировать, что все ссылки FK на эту строку также «логически» удалены, чтобы все еще иметь логичный ссылочная целостность

Если вы решите использовать этот шаблон, я, вероятно, назову свои таблицы по-другому, например TCustomer, и просмотры просто Customer для ясности клиентского кода.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top