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


CREATE SECURITY POLICY (Transact-SQL)

Область применения: SQL Server 2016 (13.x) и более поздние версии База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL в хранилище Microsoft Fabric в базе данных Microsoft Fabric SQL в Microsoft Fabric

Создает политику безопасности для безопасности на уровне строк.

Соглашения о синтаксисе Transact-SQL

Синтаксис

CREATE SECURITY POLICY [schema_name. ] security_policy_name    
    { ADD [ FILTER | BLOCK ] } PREDICATE tvf_schema_name.security_predicate_function_name   
      ( { column_name | expression } [ , ...n] ) ON table_schema_name. table_name    
      [ <block_dml_operation> ] , [ , ...n] 
    [ WITH ( STATE = { ON | OFF }  [,] [ SCHEMABINDING = { ON | OFF } ] ) ]  
    [ NOT FOR REPLICATION ] 
[;]  
  
<block_dml_operation>  
    [ { AFTER { INSERT | UPDATE } }   
    | { BEFORE { UPDATE | DELETE } } ]  

Аргументы

security_policy_name

Имя политики безопасности. Имена политик безопасности должны удовлетворять правилам построения идентификаторов и должны быть уникальными в пределах базы данных и схемы.

schema_name

Имя схемы, которой принадлежит политика безопасности. Аргумент schema_name необходим из-за привязки к схеме.

[ FILTER | BLOCK ]

Тип предиката безопасности для функции, которая привязывается к целевой таблице. FILTER предикаты автоматически фильтруют строки, доступные для операций чтения. BLOCK предикаты явно блокируют операции записи, которые нарушают функцию предиката.

tvf_schema_name.security_predicate_function_name

Это встроенная функция, возвращающая табличное значение, которое будет использоваться в качестве предиката и применяться при запросах к целевой таблице. Для конкретной операции DML в определенной таблице можно задать не более одного предиката безопасности. Встроенная функция табличного значения должна быть создана с помощью SCHEMABINDING параметра.

{ имя_столбца | выражение }

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

table_schema_name.table_name

Представляет целевую таблицу, к которой будет применяться предикат безопасности. Для одной таблицы для конкретной операции DML могут быть предназначены несколько отключенных политик безопасности, но только одна может быть включена в любой момент времени.

block_dml_operation

Конкретная операция DML, для которой применяется предикат блокировки. AFTER указывает, что предикат будет оцениваться по значениям строк после выполнения операции DML (INSERT или UPDATE). BEFORE указывает, что предикат будет вычисляться по значениям строк перед выполнением операции DML (UPDATE или DELETE). Если операция не указана, предикат будет применяться ко всем операциям.

[ STATE = { ON | OFF } ]

Включает или отключает политику безопасности для обеспечения применения ее предикатов безопасности в отношении целевых таблиц. Если этот аргумент не указан, создаваемая политика безопасности будет отключена.

[ SCHEMABINDING = { ON | OFF } ]

Указывает, должны ли создаваться все функции предиката в политике с параметром SCHEMABINDING . По умолчанию этот параметр предназначен ON для создания SCHEMABINDINGвсех функций.

NOT FOR REPLICATION

Указывает, что политика безопасности не должна выполняться, когда агент репликации изменяет целевой объект. Дополнительные сведения см. в статье Управление поведением триггеров и ограничений во время синхронизации (программирование репликации на языке Transact-SQL).

[ table_schema_name. ] table_name

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

Замечания

При использовании функций предиката с оптимизированными для памяти таблицами необходимо включить SCHEMABINDING и использовать подсказку WITH NATIVE_COMPILATION компиляции.

Предикаты блокировки вычисляются после выполнения соответствующей операции DML. Поэтому существует опасность того, что запрос READ UNCOMMITTED может видеть временные значения, которые будут откатированы.

Разрешения

Требуется разрешение ALTER ANY SECURITY POLICY и разрешение ALTER в схеме.

Кроме того, для каждого добавляемого предиката требуются следующие разрешения:

  • РазрешенияSELECT и REFERENCES для функции используются как предикат.

  • РазрешениеREFERENCES для целевой таблицы, которая привязывается к политике.

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

Примеры

В следующих примерах показано использование синтаксиса CREATE SECURITY POLICY . Пример полного сценария политики безопасности см. в разделе "Безопасность на уровне строк".

А. Создание политики безопасности

Следующий синтаксис создает политику безопасности с предикатом фильтра для dbo.Customer таблицы и оставляет политику безопасности отключенной.

CREATE SECURITY POLICY [FederatedSecurityPolicy]   
ADD FILTER PREDICATE [rls].[fn_securitypredicate]([CustomerId])   
ON [dbo].[Customer];  

B. Создание политики, которая влияет на несколько таблиц

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

CREATE SECURITY POLICY [FederatedSecurityPolicy]   
ADD FILTER PREDICATE [rls].[fn_securitypredicate1]([CustomerId])   
    ON [dbo].[Customer],  
ADD FILTER PREDICATE [rls].[fn_securitypredicate1]([VendorId])   
    ON [dbo].[ Vendor],  
ADD FILTER PREDICATE [rls].[fn_securitypredicate2]([WingId])   
    ON [dbo].[Patient]  
WITH (STATE = ON);  

В. Создание политики с несколькими типами предикатов безопасности

Добавление предиката фильтра и предиката блока в таблицу dbo.Sales .

CREATE SECURITY POLICY rls.SecPol  
    ADD FILTER PREDICATE rls.tenantAccessPredicate(TenantId) ON dbo.Sales,  
    ADD BLOCK PREDICATE rls.tenantAccessPredicate(TenantId) ON dbo.Sales AFTER INSERT;