Partilhar via


Declaração de restrição

Aplica-se a: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

A instrução restrict limita o conjunto de entidades de tabela/exibição que são visíveis para instruções de consulta que a seguem. Por exemplo, em um banco de dados que inclui duas tabelas (A, B), o aplicativo pode impedir que o restante da consulta acesse B e apenas "ver" uma forma limitada de tabela A usando um modo de exibição.

O cenário principal da instrução restrict é para aplicativos de camada intermediária que aceitam consultas de usuários e desejam aplicar um mecanismo de segurança em nível de linha sobre essas consultas. O aplicativo de camada intermediária pode prefixar a consulta do usuário com um modelo lógico , um conjunto de instruções let que definem modos de exibição que restringem o acesso do usuário aos dados, por exemplo ( T | where UserId == "..."). Como a última instrução que está sendo adicionada, ela restringe o acesso do usuário apenas ao modelo lógico.

Observação

A instrução restrict pode ser usada para restringir o acesso a entidades em outro banco de dados ou cluster (curingas não são suportados em nomes de cluster).

Sintaxe

restrict access to ( ) EntitySpecifiers

Saiba mais sobre convenções de sintaxe.

Parâmetros

Designação Tipo Necessário Descrição
EntitySpecifiers string ✔️ Um ou mais especificadores de entidade separados por vírgula. Os valores possíveis são:
- Um identificador definido por uma instrução let como uma exibição tabular
- Uma referência de tabela ou função, semelhante à usada por uma declaração sindical
- Um padrão definido por uma declaração de padrão

Observação

  • Todas as tabelas, exibições tabulares ou padrões que não são especificados pela instrução restrict tornam-se "invisíveis" para o restante da consulta.
  • As instruções Let, set e tabular são amarradas juntas/separadas por um ponto-e-vírgula, caso contrário, elas não serão consideradas parte da mesma consulta.

Exemplos

No cluster de ajuda, há um banco de dados Samples com uma tabela StormEvents.

Deixar declaração

O exemplo usa uma instrução let que aparece antes restrict instrução.

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

Tabelas ou funções

O exemplo usa referências a tabelas ou funções definidas nos metadados do banco de dados.

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

Padrões

O exemplo usa padrões curinga que podem corresponder a múltiplos de instruções let ou tabelas/funções.

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 o usuário consulte outros dados do usuário

O exemplo mostra como um aplicativo de camada intermediária pode preceder a consulta de um usuário com um modelo lógico que impede que o usuário consulte os dados de qualquer outro usuário.

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