CREATE SECURITY POLICY (Transact-SQL)
Область применения: SQL Server 2016 (13.x) и более поздние версии База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL в хранилище Microsoft Fabric в 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);
C. Создание политики с несколькими типами предикатов безопасности
Добавление предиката фильтра и предиката блока в таблицу 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;