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.