Frage

Ich bin die Umsetzung CRUD auf meiner Silverlight-Anwendung, aber ich will nicht die Delete-Funktionalität in der traditionellen Weise implementieren, stattdessen würde ich die Daten setzen will, anstatt in der Datenbank ausgeblendet werden.

Kennt jemand eine Möglichkeit, dies zu tun, mit einer SQL Server-Datenbank?

Hilfe sehr geschätzt.

War es hilfreich?

Lösung

Erweitern von Lukasz‘Idee, eine Datetime-Spalte ist zu nützlich.

  • NULL = current
  • Wert = wenn weich gelöscht

Das fügt einfache Versionierung, die ein bisschen Spalte kann nicht, was besser funktionieren kann

Andere Tipps

Sie können eine andere Spalte der Tabelle „gelöscht“ hinzufügen, die Wert 0 oder 1 hat, und nur die Datensätze angezeigt werden mit gelöscht = 0 ist.

ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0

Sie können auch Ansicht erstellen, die nur undeleted Reihen nehmen.

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

Und Sie Befehl löschen würde wie folgt aussehen:

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

In den meisten Fällen würde ich eher zu archivieren, die gelöschten Zeilen in einer Archiv Tabelle mit einem DELETE-Trigger. So kann ich auch erfassen kann, die gelöscht jede Zeile und die gelöschten Zeilen werden meine Leistung nicht beeinträchtigen. Anschließend können Sie eine Ansicht erstellen, die Gewerkschaften beiden Tabellen zusammen, wenn Sie die gelöschten enthalten sein sollen.

Sie können tun, wie Lukasz Łysik schon sagt, und haben ein Feld, das für „gelöscht“ Zeilen, Filterung sie aus als Flag dient, wenn Sie sie nicht wollen, zeigt sich. Ich habe das in einer Reihe von Anwendungen verwendet werden.

Ein alternativer Vorschlag wäre eine zusätzliche Statusvergabe hinzufügen, wenn es ein bereits vorhandener Statuscode ist. Zum Beispiel in einer Klasse der Teilnahme App verwenden wir intern ein Besucherrekord „importiert“, „Hier“, „Abgeschlossen“, „Incomplete“ werden könnte, etc. * - fügten wir eine „Gelöscht“ Option für die Zeiten, in denen es zu unbeabsichtigten Duplikate . Auf diese Weise haben wir eine Aufzeichnung und wir nicht nur eine neue Spalte auf das Problem werfen.

* Das ist der Anzeigename für einen numerischen Code hinter den Kulissen verwendet. Nur zu klären. :)

Lösung mit Triggern

Wenn Sie Freunde mit DB-Trigger sind, dann könnten Sie betrachten:

  • fügen Sie ein DeletedAt and DeletedBy Spalten Ihrer Tabellen
  • Erstellen Sie eine Ansicht für jede Tabellen (zB: für Tisch Customer eine CustomerView Ansicht haben, die Zeilen herausfiltern würde, die DeletedAt nicht null (Idee von gbn mit Datum Spalten)
  • haben
  • all CRUD-Operationen durchführen, wie üblich, aber nicht auf dem Customer Tisch, sondern auf dem CustomerView
  • INSTEAD OF DELETE Trigger hinzuzufügen, die die Zeile markieren würde, anstatt physisch sie zu löschen löschen.
    • mögen Sie vielleicht ein wenig komplexe Dinge zu tun, wie sichergestellt wird, dass alle FK Verweise auf diese Zeile auch sind „logisch“ gestrichen, um noch zu haben logische referentielle Integrität

ich wählen Sie dieses Muster verwenden, würde ich wahrscheinlich anders meine Tabellen nennen wie TCustomer, und Ansichten nur für die Klarheit des Client-Code Customer.

Seien Sie mit dieser Art der Implementierung vorsichtig, weil weiche Löschungen referentielle Integrität zu brechen, und Sie haben Integrität in Ihren Entitäten erzwingen benutzerdefinierte Logik.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top