it-swarm.com.de

Wie erzwinge ich eine einmal schreibgeschützte und dann schreibgeschützte Datenbanktabelle in SQL?

Ist es überhaupt möglich?

Mein Anwendungsfall ist eine Ledger-Tabelle mit der Anforderung, dass ein einmal erstellter Datensatz schreibgeschützt sein muss, d. H. Niemand darf ihn bearbeiten oder löschen können. Dies gilt nur für die Ledger-Tabelle und Tabellen mit direkter Beziehung dazu - es gibt andere Tabellen im selben Schema, die wie gewohnt aktualisiert/gelöscht werden.

Ich verstehe, dass aus Gründen der Datenintegrität diese Art von Einschränkungen auf Datenbankebene angewendet werden sollten, aber ich kann keinen sauberen, allgemein akzeptierten Weg finden, dies zu tun - ist dies ein Anwendungsfall, bei dem ich es einfach besser machen würde in der Anwendungsschicht?

Das Ideal wäre eine Möglichkeit, dies in einfachem SQL zu tun, um unabhängig davon zu sein, welche DB-Plattform verwendet wird, da sich dies möglicherweise ändern kann, aber mir ist klar, dass dies möglicherweise zu viel verlangt, wenn dies der Fall ist Um plattformabhängig zu sein, wird eine gewisse Variante von MySQL bevorzugt.

Vielen Dank!

28
altanqa

Ich sehe mindestens zwei Möglichkeiten, dies zu erreichen. Der erste Ansatz besteht darin, keine Berechtigungen für DELETE und UPDATE für diese einmal beschreibbaren Tabellen oder für alle anderen Berechtigungen außer INSERT und SELECT zu gewähren ], sodass nur Benutzer in sie einfügen oder aus ihnen auswählen können.

Eine andere Option besteht darin, die Trigger BEFORE UPDATE und BEFORE DELETE für diese Tabellen zu definieren und mit der Anweisung SIGNAL eine Ausnahme im Trigger-Body auszulösen, die Aktualisierungen bzw. Löschungen verhindern würde.

43
mustaccio

Berechtigungen scheinen die naheliegende Wahl zu sein - Sie können jedoch auch die ARCHIVE Storage Engine verwenden. Diese Tabellen-Engine zeichnet große Datenmengen auf, die sich nicht ändern:

Die ARCHIVE-Engine unterstützt INSERT, REPLACE und SELECT, jedoch nicht DELETE oder UPDATE. Es unterstützt ORDER BY-Operationen, BLOB-Spalten und im Grunde alle außer räumlichen Datentypen (siehe Abschnitt 11.5.1, „Geodatentypen“). Die ARCHIVE-Engine verwendet eine Sperre auf Zeilenebene.

Der Unterschied zu Berechtigungen besteht darin, dass jemand mit erweiterten Berechtigungen weiterhin Daten für die meisten anderen Tabellentypen ändern kann, während ARCHIVE es niemandem erlaubt, Daten zu ändern, die sich bereits in der Tabelle befinden.

10
iHaveacomputer

Schauen Sie in " Point in Time Architecture " oder " Temporal Database Architecture "

Datenbankdesign: Ein Zeitpunkt Architektur

In den meisten relationalen Datenbankimplementierungen. Befehle zum Aktualisieren und Löschen zerstören die Daten, die vor ihrer Ausgabe vorhanden waren. Einige Systeme erfordern jedoch, dass keine Informationen jemals physisch aus der Datenbank gelöscht oder aktualisiert werden. In diesem Artikel stellt Arthur Fuller eine Lösung für diese Anforderung in Form einer Point-in-Time-Architektur vor: Ein Datenbankdesign, mit dem ein Benutzer ein Bild der Datenbank erstellen kann, wie es zu einem früheren Zeitpunkt vorhanden war, ohne es zu zerstören das aktuelle Bild.

Zeitliche Datenbank

Aus Wikipedia, der freien Enzyklopädie
In der temporären Datenbank werden Daten gespeichert, die sich auf Zeitinstanzen beziehen. Es bietet zeitliche Datentypen und speichert Informationen zu Vergangenheit, Gegenwart und Zukunft.

Die Grundidee von beiden ist, dass Sie entweder Daten hinzufügen müssen, ohne sie zu löschen, oder Daten so speichern müssen, dass Sie die Daten abrufen können, wie sie aktuell vorhanden sind ... oder zu einem früheren Zeitpunkt vorhanden waren.

verwandte Frage hier: wie-man-einen-Zeitpunkt-Architektur-in-MySQL erstellt ,

7
WernerCD