Unveränderbare SQL-Spalten

8

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.

    
Ben Mosher 28.08.2012, 19:50
quelle

5 Antworten

7

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

%Vor%

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.

    
a_horse_with_no_name 28.08.2012, 20:27
quelle
5

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.

    
Oded 28.08.2012 19:54
quelle
3

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.

    
Mark Sherretta 28.08.2012 19:54
quelle
3

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)

    
jaraics 25.03.2014 12:40
quelle
2

Ein anderer Ansatz besteht darin, die Aktualisierungsrechte für die Tabelle zu verweigern und eine gespeicherte Prozedur zu erstellen (zu der die Benutzer berechtigt sind), die das unveränderbare Feld nicht aktualisiert.

    
AR15Dude 28.08.2012 22:29
quelle