Entity Framework: Daten archivieren

Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Entity Framework: Daten archivieren

Im Artikel »Entity Framework: Gespeicherte Prozeduren« haben wir gezeigt, wie Sie gespeicherte Prozeduren für die Entitäten einer Anwendung anlegen und diese beim Ändern, Anlegen oder Löschen von Entitäten nutzen. Damit diese gespeicherten Prozeduren auch einen Mehrwert haben, zeigen wir im vorliegenden Artikel, wie Sie die gespeicherten Prozeduren so erweitern, dass Sie etwa vor dem Ändern eines Datensatzes eine Kopie dieses Datensatzes in einer für diesen Zweck vorgesehenen Tabelle anlegen, um später die Änderungen reproduzieren und wiederherstellen zu können.

Voraussetzung

Wir starten in diesem Artikel mit dem Beispielprojekt, das wir im Beitrag Entity Framework: Gespeicherte Prozeduren erstellt haben. Dieses enthält bereits die Entitäten unserer Bestellverwaltung und die Migrationsklassen, mit denen wir die Datenbank auf Basis der Entitäten erstellen und über die Seed-Methode mit Daten füllen können. Die Aufgabe ist nun, erstens eine Tabelle namens KundenArchiv zu erstellen, in der wir die alten Kundendaten speichern können. Dabei wollen wir den verwendeten Primärschlüsselwert des Datensatzes sichern sowie das Datum der Änderung. Danach wollen wir die gespeicherte Prozedur dbo.Kunden_Update so anpassen, dass vor dem Durchführen der Änderungen am Datensatz die alte Version des Datensatzes in der Tabelle dbo.Kunden_Update gespeichert wird. Außerdem soll auch die Tabelle zum Archivieren der Daten per Update-Database erstellt werden, sodass wir entsprechenden Code in einer Migrationsklasse anlegen müssen.

Gespeicherte Prozeduren anpassen

Wir wollen die gespeicherten Prozedur dbo.Kunden_Update so anpassen, dass diese in einer noch zu erstellenden Tabelle namens KundenArchiv die Version der Datensätze der Tabelle Kunden vor der Änderung speichert. Dazu benötigen wir zunächst eine solche Tabelle. Diese legen wir mit dem folgenden Skript an, das wir in einem neuen Abfragefenster für die aktuelle Datenbank ausführen. Das Abfragefenster öffnen wir, indem wir im SQL Server-Objekt-Explorer mit der rechten Maustaste auf den Eintrag für die Datenbank klicken und den Eintrag New Query... (deutsch Neue Abfrage...) betätigen. Da wir nur wenige Änderungen gegenüber der Originaltabelle Kunden durchführen wollen, können wir den Code zur Erstellung der Tabelle Kunden als Vorlage verwenden. Diesen erhalten Sie, indem Sie mit der rechten Maustaste auf die Tabelle Kunden klicken und aus dem Kontextmenü den Eintrag Skripterstellung als...|CREATE in|Neues Abfragefenster auswählen. Hier ändern Sie den Tabellennamen Kunden überall in KundenArchiv. Außerdem fügen wir das Feld GeaendertAm hinzu, welches das Änderungsdatum speichern soll. Das zweite neue Feld heißt OriginalID und soll die ID des Datensatzes enthalten, der geändert wurde:

CREATE TABLE [dbo].[KundenArchiv] (
     [ID]          INT            IDENTITY (1, 1) NOT NULL,
     [OriginalID]  INT            NOT NULL,
     [Firma]       NVARCHAR (255) NULL,
     [Vorname]     NVARCHAR (255) NOT NULL,
     [Nachname]    NVARCHAR (255) NOT NULL,
     [AnredeID]    INT            NOT NULL,
     [Strasse]     NVARCHAR (255) NOT NULL,
     [PLZ]         NVARCHAR (255) NOT NULL,
     [Ort]         NVARCHAR (255) NOT NULL,
     [Land]        NVARCHAR (255) NOT NULL,
     [EMail]       NVARCHAR (255) NOT NULL,
     [GeaendertAm] DATETIME       NOT NULL
);
GO
CREATE NONCLUSTERED INDEX [IX_AnredeID]
     ON [dbo].[KundenArchiv]([AnredeID] ASC);
GO
ALTER TABLE [dbo].[KundenArchiv]
     ADD CONSTRAINT [PK_dbo.KundenArchiv] PRIMARY KEY CLUSTERED ([ID] ASC);
GO
ALTER TABLE [dbo].[KundenArchiv]
     ADD CONSTRAINT [FK_dbo.KundenArchiv_dbo.Anreden_AnredeID] FOREIGN KEY ([AnredeID]) REFERENCES [dbo].[Anreden] ([ID]) ON DELETE CASCADE;

Führen Sie dieses Skript aus, indem Sie auf die Starten-Schaltfläche oben im Skriptfenster klicken (nicht zu verwechseln mit der Starten-Schaltfläche für das Projekt in der Symbolleiste von Visual Studio). Nach der Aktualisierung des Elements Tabellen im SQL Server-Objekt-Explorer erscheint dort die neue Tabelle KundenArchiv.

Gespeicherte Prozedur »Kunden_Update« anpassen

Nun müssen wir die gespeicherte Prozedur dbo.Kunden_Update so anpassen, dass nicht nur die Änderungen am aktuellen Datensatz gespeichert werden, sondern zuvor noch die aktuelle Version des Datensatzes in der Tabelle KundenArchiv archiviert wird. Diese Änderung könnten Sie zur Migration namens StoredProcedures hinzufügen, sofern Sie diese noch nicht ausgeführt haben. Allerdings können wir auch eine neue Migration anlegen und dort unseren Code einfügen. Dazu geben Sie einfach den folgenden Befehl in die Paketmanager-Konsole ein:

add-migration AlterStoredProcedure

Es erscheint eine leere Klasse. Diese hat wieder zwei Methoden – die Up- und die Down-Methode. Nochmal zur Verdeutlichung: Wenn Sie in der Paketmanager-Konsole Update-Database aufrufen, werden alle Up-Methoden der vorhandenen Migrationsklassen aufgerufen, die noch nicht ausgeführt wurden. Deshalb fügen wir den Aufruf der Methode AlterStoredProcedure, die zum Ändern einer gespeicherten Prozedur zum Einsatz kommt, für die Up-Methode ein:

Public Partial Class AlterStoredProcedure
     Inherits DbMigration
     Public Overrides Sub Up()
         AlterStoredProcedure(
             "dbo.Kunde_Update",
             Function(p) New With
                 {
                     .ID = p.Int(), .Firma = p.String(maxLength:=255), .Vorname = p.String(maxLength:=255),
                     .Nachname = p.String(maxLength:=255), .AnredeID = p.Int(), .Strasse = p.String(maxLength:=255),

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Neues aus unseren Magazinen
Listenfeld: Reihenfolge mehrerer Einträge...

Wir haben bereits in mehreren Beiträgen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle über den Inhalt eines Feldes etwa namens »ReihenfolgeID« einstellen können –... [mehr]

Diagramme mit gefilterten Daten

In Ausgabe 2/2019 haben wir in zwei Artikeln die modernen Diagramme von Access vorgestellt. Im vorliegenen Beitrag zeigen wir Ihnen, wie Sie diese abhängig von den in einem Formular angezeigten... [mehr]

Benutzerverwaltung mit verschlüsselten...

Wenn Sie in einer Access-Anwendung Benutzer verwalten wollen, die sich per Benutzername und Kennwort an die Anwendung anmelden, sollten Sie sehr sensibel mit den in der Anwendung gespeicherten... [mehr]

HTML-Tabellen mit fester Kopfzeile

In den vorherigen Ausgaben von Access im Unternehmen und in der aktuellen Ausgabe arbeiten wir in einigen Beiträgen mit dem Webbrowser-Steuerelement und stellen Daten, die wir mit den Bordmitteln... [mehr]

Flexible HTML-Tabellen mit fester Kopfzeile

Im Beitrag »HTML-Tabellen mit fester Kopfzeile« haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenköpfe oben fixiert... [mehr]

Berechtigungen per HTML verwalten

Im Beitrag »Benutzerverwaltung mit verschlüsselten Kennwörtern« stellen wir eine Lösung vor, in der wir die Berechtigungen von Benutzergruppen an Datenbankobjekten definieren. Dort benötigen wir... [mehr]

Benutzer und Berechtigungen ermitteln

In den Beiträgen »Benutzerverwaltung mit verschlüsselten Kennwörtern« und »Berechtigungen per HTML verwalten« haben wir die Voraussetzungen für eine Benutzerverwaltung geschaffen. Im vorliegenden... [mehr]

Zugriffsrechte mit Datenmakros

Es gibt verschiedene Möglichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die für ihn vorgesehenen Aktionen mit Daten durchführen darf – beispielsweise durch... [mehr]

Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu... [mehr]

Neuer Datensatz von Frontend zu Backend

Für manche Themen gibt es keine kurze, prägnante Überschrift. In diesem Fall wollen wir zeigen, wie Sie einen neuen Datensatz anlegen, der in einer temporären Tabelle im Frontend gespeichert wird,... [mehr]