Instrucción Restrict

La instrucción restrict limita el conjunto de entidades de tabla y vista que son visibles para las instrucciones de consulta que la siguen. Por ejemplo, en una base de datos que incluye dos tablas (A, B), la aplicación puede impedir que el resto de la consulta acceda B a y solo "vea" una forma limitada de tabla A mediante una vista.

El escenario principal de la instrucción restrict es para las aplicaciones de nivel intermedio que aceptan consultas de usuarios y quieren aplicar un mecanismo de seguridad de nivel de fila sobre esas consultas. La aplicación de nivel intermedio puede prefijar la consulta del usuario con un modelo lógico, un conjunto de instrucciones let que definen vistas que restringen el acceso del usuario a los datos, por ejemplo ( T | where UserId == "..."). A medida que se agrega la última instrucción, restringe el acceso del usuario solo al modelo lógico.

Nota

La instrucción restrict se puede usar para restringir el acceso a las entidades de otra base de datos o clúster (los caracteres comodín no se admiten en los nombres de clúster).

Syntax

restrictaccessto(EntitySpecifiers)

Obtenga más información sobre las convenciones de sintaxis.

Parámetros

Nombre Tipo Requerido Descripción
EntitySpecifiers string ✔️ Uno o varios especificadores de entidad separados por comas. Los valores posibles son:
: un identificador definido por una instrucción let como una vista tabular.
- Una referencia de tabla o función, similar a una usada por una instrucción union.
- Un patrón definido por una declaración de patrón

Nota

  • Todas las tablas, vistas tabulares o patrones que no especifica la instrucción restrict se vuelven "invisibles" en el resto de la consulta.
  • Las instrucciones let, set y tabular se agrupan o separan por punto y coma; de lo contrario, no se considerarán parte de la misma consulta.

Ejemplos

Instrucción Let

En el ejemplo siguiente se usa una instrucción let que aparece antes restrict de la instrucción .

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

Tablas o funciones

En el ejemplo siguiente se usan referencias a tablas o funciones definidas en los metadatos de la base de datos.

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

Patrones

En el ejemplo siguiente se usan patrones comodín que pueden coincidir con múltiplo de instrucciones let o tablas/funciones.

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'

Impedir que el usuario consulte otros datos de usuario

En el ejemplo siguiente se muestra cómo una aplicación de nivel intermedio puede anteponer la consulta de un usuario con un modelo lógico que impide que el usuario consulte los datos de cualquier otro usuario.

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

Esta funcionalidad no se admite en Azure Monitor.