Поделиться через


Инструкция restrict

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Инструкция ограничения ограничивает набор сущностей таблицы или представления, видимых для инструкций запроса, которые следуют за ним. Например, в базе данных с двумя таблицами (A, Bприложение может предотвратить доступ B к остальной части запроса и просмотреть только ограниченную форму таблицы A с помощью представления.

Основной сценарий инструкции ограничения предназначен для приложений среднего уровня, которые принимают запросы от пользователей и хотят применить механизм безопасности на уровне строк над этими запросами. Приложение среднего уровня может префиксировать запрос пользователя с помощью логической модели, набор инструкций let, определяющих представления, ограничивающие доступ пользователя к данным, например ( T | where UserId == "..."). По мере добавления последней инструкции он ограничивает доступ пользователя только к логической модели.

Примечание.

Инструкцию ограничения можно использовать для ограничения доступа к сущностям в другой базе данных или кластере (подстановочные знаки не поддерживаются в именах кластеров).

Синтаксис

restrictaccess to (EntitySpecifiers)

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Type Обязательно Описание
EntitySpecifiers string ✔️ Один или несколько описателей сущностей с разделителями-запятыми. Возможны следующие значения:
— идентификатор, определенный оператором let в виде табличного представления
— ссылка на таблицу или функцию, аналогичную одной, используемой оператором объединения.
— Шаблон, определенный объявлением шаблона

Примечание.

  • Все таблицы, табличные представления или шаблоны, не указанные оператором ограничения, становятся "невидимыми" для остальной части запроса.
  • Пусть, задать и табличные операторы тянутся вместе или разделены точкой с запятой, в противном случае они не будут считаться частью одного запроса.

Примеры

Инструкция let

В следующем примере используется инструкция let, отображаемая перед restrict оператором.

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

Таблицы или функции

В следующем примере используются ссылки на таблицы или функции , определенные в метаданных базы данных.

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

Шаблоны

В следующем примере используются подстановочные знаки, которые могут соответствовать нескольким операторам let или таблицам или функциям.

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'

Запретить пользователю запрашивать другие данные пользователя

В следующем примере показано, как приложение среднего уровня может заранее запросить запрос пользователя с помощью логической модели, которая запрещает пользователю запрашивать данные других пользователей.

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