restrict-Anweisung

Die restrict-Anweisung schränkt den Satz von Tabellen-/Sichtentitäten ein, die für Abfrageanweisungen sichtbar sind, die darauf folgen. Beispielsweise kann die Anwendung in einer Datenbank, die zwei Tabellen (A, ) enthält, verhindern, Bdass der Rest der Abfrage auf eine eingeschränkte Form von Tabelle zugreift B und nur eine eingeschränkte Form von Tabelle A mithilfe einer Sicht "sieht".

Das Standard Szenario der restrict-Anweisung gilt für Anwendungen der mittleren Ebene, die Abfragen von Benutzern akzeptieren und einen Sicherheitsmechanismus auf Zeilenebene auf diese Abfragen anwenden möchten. Die Anwendung der mittleren Ebene kann der Abfrage des Benutzers ein logisches Modell voranstellen, einem Satz von let-Anweisungen, die Ansichten definieren, die den Zugriff des Benutzers auf Daten einschränken, z. B. ( T | where UserId == "..."). Als letzte hinzugefügte Anweisung schränkt sie den Zugriff des Benutzers auf das logische Modell ein.

Hinweis

Die restrict-Anweisung kann verwendet werden, um den Zugriff auf Entitäten in einer anderen Datenbank oder einem anderen Cluster einzuschränken (In Clusternamen werden keine Wildcards unterstützt).

Syntax

restrictaccessto(EntitySpecifiers)

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Typ Erforderlich BESCHREIBUNG
EntitySpecifiers string ✔️ Mindestens ein durch Trennzeichen getrennte Entitätsspezifizierer. Mögliche Werte:
– Ein Bezeichner, der durch eine let-Anweisung als tabellarische Ansicht definiert wird
– Ein Tabellen- oder Funktionsverweis, ähnlich dem, der von einer union-Anweisung verwendet wird
– Ein durch eine Musterdeklaration definiertes Muster

Hinweis

  • Alle Tabellen, tabellarischen Ansichten oder Muster, die nicht von der restrict-Anweisung angegeben werden, werden für den Rest der Abfrage "unsichtbar".
  • Let-, set- und tabellarische Anweisungen werden durch ein Semikolon miteinander verknüpft bzw. getrennt. Andernfalls werden sie nicht als Teil derselben Abfrage betrachtet.

Beispiele

let-Anweisung

Im folgenden Beispiel wird eine let-Anweisung verwendet, die vor restrict der Anweisung angezeigt wird.

// Limit access to 'Test' let statement only
let Test = () { print x=1 };
restrict access to (Test);

Tabellen oder Funktionen

Im folgenden Beispiel werden Verweise auf Tabellen oder Funktionen verwendet, die in den Datenbankmetadaten definiert sind.

// Assuming the database that the query uses has table Table1 and Func1 defined in the metadata, 
// and other database 'DB2' has Table2 defined in the metadata

restrict access to (database().Table1, database().Func1, database('DB2').Table2);

Muster

Im folgenden Beispiel werden Wildcardmuster verwendet, die mit Vielfachen von let-Anweisungen oder Tabellen/Funktionen übereinstimmen können.

let Test1 = () { print x=1 };
let Test2 = () { print y=1 };
restrict access to (*);
// Now access is restricted to Test1, Test2 and no tables/functions are accessible.

// Assuming the database that the query uses has table Table1 and Func1 defined in the metadata.
// Assuming that database 'DB2' has table Table2 and Func2 defined in the metadata
restrict access to (database().*);
// Now access is restricted to all tables/functions of the current database ('DB2' is not accessible).

// Assuming the database that the query uses has table Table1 and Func1 defined in the metadata.
// Assuming that database 'DB2' has table Table2 and Func2 defined in the metadata
restrict access to (database('DB2').*);
// Now access is restricted to all tables/functions of the database 'DB2'

Verhindern, dass Benutzer andere Benutzerdaten abfragen

Das folgende Beispiel zeigt, wie eine Anwendung der mittleren Ebene der Abfrage eines Benutzers ein logisches Modell voranstellen kann, das verhindert, dass der Benutzer die Daten eines anderen Benutzers abfragen kann.

// Assume the database has a single table, UserData,
// with a column called UserID and other columns that hold
// per-user private information.
//
// The middle-tier application generates the following statements.
// Note that "username@domain.com" is something the middle-tier application
// derives per-user as it authenticates the user.
let RestrictedData = view () { Data | where UserID == "username@domain.com" };
restrict access to (RestrictedData);
// The rest of the query is something that the user types.
// This part can only reference RestrictedData; attempting to reference Data
// will fail.
RestrictedData | summarize MonthlySalary=sum(Salary) by Year, Month
// Restricting access to Table1 in the current database (database() called without parameters)
restrict access to (database().Table1);
Table1 | count

// Restricting access to Table1 in the current database and Table2 in database 'DB2'
restrict access to (database().Table1, database('DB2').Table2);
union 
    (Table1),
    (database('DB2').Table2))
| count

// Restricting access to Test statement only
let Test = () { range x from 1 to 10 step 1 };
restrict access to (Test);
Test

// Assume that there is a table called Table1, Table2 in the database
let View1 = view () { Table1 | project Column1 };
let View2 = view () { Table2 | project Column1, Column2 };
restrict access to (View1, View2);

// When those statements appear before the command - the next works
let View1 = view () { Table1 | project Column1 };
let View2 = view () { Table2 | project Column1, Column2 };
restrict access to (View1, View2);
View1 |  count

// When those statements appear before the command - the next access is not allowed
let View1 = view () { Table1 | project Column1 };
let View2 = view () { Table2 | project Column1, Column2 };
restrict access to (View1, View2);
Table1 |  count

Diese Funktion wird in Azure Monitor nicht unterstützt.