Partager via


Restrict, instruction

S’applique à : ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

L’instruction restrict limite l’ensemble d’entités de table/vue qui sont visibles pour les instructions de requête qui le suivent. Par exemple, dans une base de données qui comprend deux tables (A, ), Bl’application peut empêcher le reste de la requête d’accéder B et uniquement de « voir » une forme limitée de table A à l’aide d’une vue.

Le scénario principal de l’instruction restrict est destiné aux applications de niveau intermédiaire qui acceptent les requêtes des utilisateurs et souhaitent appliquer un mécanisme de sécurité au niveau des lignes sur ces requêtes. L’application de niveau intermédiaire peut préfixer la requête de l’utilisateur avec un modèle logique, un ensemble d’instructions let définissant des vues qui limitent l’accès de l’utilisateur aux données, par exemple ( ). T | where UserId == "..." À mesure que la dernière instruction est ajoutée, elle limite l’accès de l’utilisateur au modèle logique uniquement.

Remarque

L’instruction restrict peut être utilisée pour restreindre l’accès aux entités d’une autre base de données ou d’un autre cluster (les caractères génériques ne sont pas pris en charge dans les noms de cluster).

Syntaxe

restrictaccess to (EntitySpecifiers)

En savoir plus sur les conventions de syntaxe.

Paramètres

Nom Type Requise Description
EntitySpecifiers string ✔️ Un ou plusieurs spécificateurs d’entité séparés par des virgules. Les valeurs possibles sont les suivantes :
- Identificateur défini par une instruction let en tant qu’affichage tabulaire
- Référence de table ou de fonction, similaire à celle utilisée par une instruction union
- Modèle défini par une déclaration de modèle

Remarque

  • Toutes les tables, vues tabulaires ou modèles qui ne sont pas spécifiés par l’instruction restrict deviennent « invisibles » au reste de la requête.
  • Supposons que les instructions tabulaires soient regroupées/séparées par un point-virgule, sinon elles ne seront pas considérées comme faisant partie de la même requête.

Exemples

Let, instruction

L’exemple suivant utilise une instruction let qui apparaît avant restrict l’instruction.

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

Tables ou fonctions

L’exemple suivant utilise des références à des tables ou des fonctions définies dans les métadonnées de base de données.

// 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);

Modèles

L’exemple suivant utilise des modèles génériques qui peuvent correspondre à plusieurs instructions let ou tables/fonctions.

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'

Empêcher l’utilisateur d’interroger d’autres données utilisateur

L’exemple suivant montre comment une application de niveau intermédiaire peut prédéfini la requête d’un utilisateur avec un modèle logique qui empêche l’utilisateur d’interroger les données d’un autre utilisateur.

// 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