Microsoft SQL Server
Sicherheit auf Zeilenebene
Suche…
RLS-Filterprädikat
SQL Server 2016+ und Azure SQL-Datenbank können Sie Zeilen, die in der select-Anweisung zurückgegeben werden, mithilfe eines Prädikats automatisch filtern. Diese Funktion wird als Sicherheit auf Zeilenebene bezeichnet .
Zunächst benötigen Sie eine Tabellenwertfunktion, die ein Prädikat enthält, das die Bedingung beschreibt, unter der Benutzer Daten aus einer Tabelle lesen können:
DROP FUNCTION IF EXISTS dbo.pUserCanAccessCompany
GO
CREATE FUNCTION
dbo.pUserCanAccessCompany(@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (
SELECT 1 as canAccess WHERE
CAST(SESSION_CONTEXT(N'CompanyID') as int) = @CompanyID
)
In diesem Beispiel sagt das Prädikat aus, dass nur Benutzer, die einen Wert in SESSION_CONTEXT haben, der mit dem Eingabeargument übereinstimmt, auf das Unternehmen zugreifen können. Sie können eine beliebige andere Bedingung festlegen, z. B. die Datenbankrolle oder die Datenbank-ID des aktuellen Benutzers usw.
Der größte Teil des obigen Codes ist eine Vorlage, die Sie kopieren und einfügen. Das einzige, was sich hier ändern wird, sind der Name und die Argumente des Prädikats und der Bedingung in der WHERE-Klausel. Jetzt erstellen Sie eine Sicherheitsrichtlinie, die dieses Prädikat auf einige Tabellen anwendet.
Jetzt können Sie eine Sicherheitsrichtlinie erstellen, die das Prädikat auf einige Tabellen anwendet:
CREATE SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
WITH (State=ON)
Diese Sicherheitsrichtlinie weist der Firmentabelle ein Prädikat zu. Immer wenn jemand versucht, Daten aus der Company-Tabelle zu lesen, wendet die Sicherheitsrichtlinie in jeder Zeile ein Prädikat an, übergibt die Spalte CompanyID als Parameter des Prädikats. Das Prädikat wird ausgewertet, falls diese Zeile im Ergebnis der SELECT-Abfrage zurückgegeben wird.
RLS-Sicherheitsrichtlinie ändern
Die Sicherheitsrichtlinie ist eine Gruppe von Prädikaten, die Tabellen zugeordnet sind, die gemeinsam verwaltet werden können. Sie können Vergleichselemente hinzufügen, entfernen oder die gesamte Richtlinie aktivieren / deaktivieren.
Sie können in der vorhandenen Sicherheitsrichtlinie weitere Vergleichselemente für Tabellen hinzufügen.
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
Sie können einige Prädikate aus der Sicherheitsrichtlinie entfernen:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
DROP FILTER PREDICATE ON dbo.Company
Sie können die Sicherheitsrichtlinie deaktivieren
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );
Sie können die deaktivierte Sicherheitsrichtlinie aktivieren:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );
Aktualisieren mit RLS-Blockprädikat verhindern
Mithilfe der Sicherheit auf Zeilenebene können Sie einige Prädikate definieren, die steuern, wer Zeilen in der Tabelle aktualisieren kann. Zuerst müssen Sie eine Tabellenwertfunktion definieren, die das Prädikat darstellt, das die Zugriffsrichtlinie steuert.
FUNKTION ERSTELLEN
dbo.pUserCanAccessProduct (@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (SELECT 1 als canAccess WHERE)
CAST (SESSION_CONTEXT (N'CompanyID ') als int) = @CompanyID
) In diesem Beispiel sagt das Prädikat aus, dass nur Benutzer, die einen Wert in SESSION_CONTEXT haben, der mit dem Eingabeargument übereinstimmt, auf das Unternehmen zugreifen können. Sie können eine beliebige andere Bedingung festlegen, z. B. die Datenbankrolle oder die Datenbank-ID des aktuellen Benutzers usw.
Der größte Teil des obigen Codes ist eine Vorlage, die Sie kopieren und einfügen. Das einzige, was sich hier ändern wird, sind der Name und die Argumente des Prädikats und der Bedingung in der WHERE-Klausel. Jetzt erstellen Sie eine Sicherheitsrichtlinie, die dieses Prädikat auf einige Tabellen anwendet.
Jetzt können wir Sicherheitsrichtlinien mit dem Prädikat erstellen, die Aktualisierungen der Produkttabelle blockieren, wenn die Spalte CompanyID in der Tabelle das Prädikat nicht erfüllt.
SICHERHEITSPOLITIK ERSTELLEN dbo.ProductAccessPolicy ADD BLOCK PREDICATE dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product
Dieses Prädikat wird auf alle Operationen angewendet. Wenn Sie ein Prädikat auf eine Operation anwenden möchten, können Sie Folgendes schreiben:
SICHERHEITSPOLITIK ERSTELLEN dbo.ProductAccessPolicy ADD BLOCK PREDICATE dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product AFTER INSERT
Mögliche Optionen, die Sie nach der Definition des Blockprädikats hinzufügen können, sind:
[{AFTER {INSERT | UPDATE}}
| {VORNEHMEN {UPDATE | LÖSCHEN}}]