2017-01-23 2 views
1

Wie kann ich sicherstellen, dass bestimmte Daten in der Datenbank nicht mehr geändert werden.Datenbankdatensätze schreibgeschützt machen

Wir arbeiten mit TSQL. In der Datenbank speichern wir Vertragsrevisionen. Diese haben einen Status: Entwurf/aktiv. Wenn der Status aktiv ist, darf die Revision nie mehr geändert werden. Eine Revision kann 8 aktive Module (jede mit einer eigenen Tabelle) mit jeweils eigenen Einstellungen und Untertabellen haben. Dadurch wird ein ganzer Baum von Tabellen mit Datensätzen erstellt, die sich möglicherweise nie mehr ändern, wenn die Vertragsrevision auf "Aktiv" gesetzt wurde.

Idealerweise würde ich diese Datensätze einfach als schreibgeschützt markieren. Aber so etwas gibt es heute nicht. Das nächste, was mir in den Sinn kommt, sind Trigger. Daher muss ich diese Trigger zu vielen Tabellen hinzufügen, die alle mit der Vertragsrevision in Zusammenhang stehen.

Jetzt gibt es vielleicht andere Ansätze, wie eine Datenbank nur für die Archivierung, auf der der Benutzer nur Einfügerechte hat. Wenn eine Vertragsrevision aktiv wird, wird sie daher von einem DB in die Archiv-DB verschoben (Einfügen ist erlaubt). Und kann nie mehr geändert werden (DENY UPDATE | DELETE).

Aber vielleicht gibt es andere geniale Optionen, an die ich nicht gedacht habe, und Sie haben. Vielleicht einschließlich der CLR oder was nicht.

Also wie kann ich eine Baumstruktur von Datensätzen innerhalb unserer TSQL-Datenbank effektiv nur lesbar machen, die am wartungsfreisten ist, leicht zu verstehen, schnell einzurichten und in einer generischen Weise angewendet werden kann?

+2

schränken Sie die Benutzerfähigkeiten ein, um Änderungen tatsächlich zu bewirken. Stellen Sie sicher, dass die Benutzer, die Zugriff auf die Tabellen haben, nur Berechtigungen zum Einfügen, Nichtlö- schen oder Aktualisieren haben. – Takarii

+0

Vielleicht kann diese Frage nützlich sein: http://stackoverflow.com/questions/11185932/how-can-i-disable-update-table-for-all-user –

+0

@Takarii Vielen Dank für Ihren Kommentar. Dies ist jedoch nicht das Problem, da wir auch verhindern wollen, dass Fehler in gespeicherten Prozeduren und EF die Daten nicht versehentlich ändern oder löschen können. Stellen Sie sich fehlerhafte Joins in einer UPDATE-Anweisung vor. Es gibt eine Menge Code in SQL und C#, die etwas mit einer Vertragsrevision oder einem ihrer Module zu tun hat. –

Antwort

1

Was immer Sie tun (Trigger, gewährten Rechte ...) könnte von einem Benutzer mit höheren Rechten überwunden werden, das Sie sicher wissen ...

Ist das nur diese Daten zu archivieren?

Eine Idee, die mir in den Sinn kam, war, ein verschachteltes XML mit allen Daten innerhalb einer großen Struktur zu erstellen und dieses irgendwo in eine Seitentabelle zu legen. Erstellen Sie eine INSTEAD OF UPDATE,DELETE TRIGGER, wo Sie nichts tun. Lassen Sie diese Tabellen 1:1-bezogen sein.

Sie können immer noch mit diesen Daten arbeiten, aber nicht so schnell wie aus physikalischen Tabellen gelesen werden.

Wenn Sie möchten, können Sie sogar das XML in eine Zeichenfolge konvertieren und Hash-Code berechnen, den Sie an einem anderen Ort speichern, um nach Manipulationen zu suchen.

Der gesamte Prozess könnte in einem einzigen Stored Procedure-Aufruf durchgeführt werden.

+0

Vielen Dank für Ihre Antwort. Speichere Hashes können mindestens Fehler melden. Großartige Idee! Ich werde in das XML schauen. Danke vielmals. –

Verwandte Themen