Ich habe eine Tabelle so strukturiert (vereinfacht)
Name, EMail, LastLoggedInAt
Ich habe einen Benutzer in SQL Server (RemoteUser), der nur Daten sehen kann (über eine ausgewählte Abfrage), bei denen das Feld LastLoggdInAt nicht null ist.
Es sieht so aus, als könnte ich das schaffen? Ist es möglich?
Antworten:
Mit dem SQL Server-Sicherheitsmodell können Sie Zugriff auf eine Ansicht gewähren, ohne Zugriff auf die zugrunde liegenden Tabellen zu gewähren.
Da Beispielcode eine hervorragende Möglichkeit ist, ein Konzept
LoginDetails
anzuzeigen, sollten Sie Folgendes mit einer Tabelle und der entsprechenden Ansicht berücksichtigen :Wir erstellen ein Login und einen Benutzer und weisen diesem Benutzer dann die Rechte zu, Zeilen aus der Ansicht auszuwählen, ohne über Rechte zum Anzeigen der Tabelle selbst zu verfügen.
Jetzt fügen wir zwei Testzeilen ein:
Dies testet das Sicherheitsmodell. Die erste
SELECT
Anweisung ist erfolgreich, da sie aus der Ansicht ausgewählt wird, während die zweiteSELECT
Anweisung fehlschlägt, weil der Benutzer keinen direkten Zugriff auf die Tabelle hat.Beachten Sie, dass die Ergebnisse aus der Ansicht die Zeile ausschließen, in der sich der
LastLoggedInAt
Wert befindetNULL
, wie in Ihrer Frage erforderlich.Die zweite
SELECT
Anweisung für die zugrunde liegende Tabelle gibt einen Fehler zurück:Aufräumen:
Wenn Sie über SQL Server 2016 oder höher verfügen, können Sie alternativ ein Sicherheitsprädikat auf Zeilenebene verwenden, um zu verhindern, dass bestimmte Benutzer Zeilen mit einem NULL-
LastLoggedInAt
Wert sehen.Zuerst erstellen wir die Tabelle, ein Login, einen Benutzer für dieses Login und gewähren Zugriff auf die Tabelle:
Als nächstes fügen wir einige Beispielzeilen ein. Eine Zeile mit einer Null
LastLoggedInAt
und eine mit einem Wert ungleich Null für diese Spalte.Hier erstellen wir eine schemagebundene Tabellenwertfunktion, die abhängig vom Wert der
@LastLoggedInAt
und der@username
Variablen, die an die Funktion übergeben werden , eine Zeile mit 0 oder 1 zurückgibt . Diese Funktion wird von einem Filterprädikat verwendet, um die Zeilen zu entfernen, die wir vor bestimmten Benutzern verbergen möchten.Dies ist der Sicherheitsfilter, der Zeilen aus
SELECT
Anweisungen entfernt, die für diedbo.LoginDetails
Tabelle ausgeführt werden:Der obige Filter verwendet die
dbo.fn_LoginDetailsRemoteUserPredicate
Funktion, indem er den Namen des aktuellen Benutzers zusammen mit den Werten aus jeder Zeile für dieLastLoggedInAt
Spalte aus derdbo.LoginDetails
Tabelle übergibt .Wenn wir die Tabelle als normaler Benutzer abfragen:
wir sehen alle Zeilen:
Wenn wir jedoch Folgendes testen
RemoteUser
:Wir sehen nur "gültige" Zeilen:
Und wir räumen auf:
Beachten Sie, dass das Schema, das eine Funktion auf diese Weise an die Tabelle bindet, es unmöglich macht, die Definition der Tabelle zu ändern, ohne zuerst das Filterprädikat und die
dbo.fn_LoginDetailsRemoteUserPredicate
Funktion zu löschen.quelle
LastLoggedInAt
Spalte.