Ist es möglich, eine Spalte immutable
in MSSQL zu markieren?
Scheint so, als wäre es eine nützliche DDL-Funktion; Sobald ein Wert in einer Zeile gesetzt ist ('Zeile' ist definiert als eine spezifische Beziehung von Werten zu einem Primärschlüssel), kann er nicht ohne Löschen der Zeile geändert werden.
Offensichtlich (wie die meisten Dinge) ist dies in der Anwendungsebene mehr als machbar, aber der halbe Spaß von SQL DDL ist die Fehlerprüfung Ihres Anwendungscodes.
Wenn der Benutzer, der die DML ausführt, nicht Eigentümer der Objekte und nicht "db_owner" in der Datenbank selbst ist, können Sie nur die Berechtigung "Einfügen" gewähren, aber nicht die Berechtigung für diese Tabelle aktualisieren:
Annahme einer Tabelle mit id, col1, col2
Mit diesen Berechtigungen kann der Benutzer Zeilen einfügen und Werte für alle drei Spalten angeben. Er kann auch die Spalten id
und col2
aktualisieren, nicht jedoch die Spalte col1
.
Der db_owner (und möglicherweise der Ersteller / Eigentümer der Tabelle) kann immer alle Spalten aktualisieren. Ich weiß nicht, ob es eine Möglichkeit gibt, dieses Privileg von diesen Rollen zu widerrufen.
Nein, es gibt keine solche Funktion in SQL Server.
Das nächste, worüber ich nachdenken kann, ist ein Aktualisierungstrigger für die Tabelle, der prüft, ob die Werte in der spezifischen Spalte für die logischen Tabellen INSERTED
und DELETED
identisch sind und die Aktualisierungen für die geänderten Zeilen ablehnen.
Nach meinem Wissen ist dies mit DDL nicht möglich. Sie können jedoch BEFORE UPDATE-Trigger implementieren, um Ihre Anforderung zu erfüllen. Im BEFORE UPDATE-Trigger können Sie eine Ausnahme auslösen oder tun, was immer Sie möchten, anstatt die Zeile zu aktualisieren.
Es ist möglich, einen UPDATE TRIGGER wie folgt zu verwenden:
%Vor%(Hinweis: Die Tabelle hat eine Primärschlüsselspalte namens ID).
Ich lehne das Update nur ab, wenn sich der Wert von AssetTypeID ändert. So könnte die Spalte in einem Update vorhanden sein und wenn sie den alten Wert angegeben hat, als würde sie passieren. (Ich brauchte diesen Weg)
Tags und Links sql sql-server sql-server-2008 ddl