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}}]



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow