CREATE SECURITY POLICY (Transact-SQL)
Se aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL Database Azure SQL Instancia administrada punto de conexión de SQL Analytics en Microsoft Fabric Warehouse en Microsoft Fabric
Crea una directiva de seguridad para la seguridad de nivel de filas.
Convenciones de sintaxis de Transact-SQL
Sintaxis
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 } } ]
Argumentos
security_policy_name
El nombre de la directiva de seguridad. Los nombres de directivas de seguridad deben seguir las reglas de los identificadores y deben ser únicos en la base de datos y para su esquema.
schema_name
Es el nombre del esquema al que pertenece la directiva de seguridad. schema_name es necesario debido a los enlaces de esquema.
[ FILTER | BLOCK ]
El tipo de predicado de seguridad de la función vinculada a la tabla de destino. Los predicados FILTER
filtran en modo silencioso las filas disponibles para leer operaciones. Los predicados BLOCK
bloquean explícitamente las operaciones de escritura que infringen la función del predicado.
tvf_schema_name.security_predicate_function_name
Es la función de valor de tabla insertada que se usará como predicado y que se aplicará en las consultas en una tabla de destino. Se puede definir, como máximo, un predicado de seguridad para una operación DML determinada en una tabla determinada. La función de valor de tabla insertada se debe haber creado con la opción SCHEMABINDING
.
{ nombre_columna | expresión }
El nombre de columna o la expresión que se usan como parámetros de la función de predicado de seguridad. Se puede utilizar cualquier columna de la tabla de destino. Una expresión solo puede incluir constantes, funciones escalares incorporadas, operadores y columnas de la tabla de destino. Es necesario especificar un nombre o expresión de columna para cada parámetro de la función.
table_schema_name.table_name
Es la tabla de destino a la que se aplicará el predicado de seguridad. Puede haber varias directivas de seguridad deshabilitadas que tengan como destino una sola tabla para una operación DML concreta, pero no puede haber varias de ellas habilitadas al mismo tiempo.
block_dml_operation
La operación DML determinada a la que se aplicará el predicado de bloqueo. AFTER
especifica que el predicado se va a evaluar en función de los valores de las filas después de que se haya realizado la operación DML (INSERT
o UPDATE
). BEFORE
especifica que el predicado se va a evaluar en función de los valores de las filas antes de que se haya realizado la operación DML (UPDATE
o DELETE
). Si no se especifica ninguna operación, el predicado se aplicará a todas las operaciones.
[ STATE = { ON | OFF } ]
Habilita o deshabilita la aplicación de los predicados de seguridad de la directiva de seguridad en las tablas de destino. Si no se especifica, se habilita la directiva de seguridad que se está creando.
[ SCHEMABINDING = { ON | OFF } ]
Indica si todas las funciones de predicado de la directiva se deben crear con la opción SCHEMABINDING
. De forma predeterminada, esta configuración es ON
y todas las funciones se deben crear con SCHEMABINDING
.
NOT FOR REPLICATION
Indica que la directiva de seguridad no debe ejecutarse cuando un agente de replicación modifica el objeto de destino. Para obtener más información, consulte Controlar el comportamiento de desencadenadores y restricciones durante la sincronización (programación de la replicación con Transact-SQL).
[ table_schema_name. ] table_name
Es la tabla de destino a la que se aplicará el predicado de seguridad. Puede haber varias directivas de seguridad deshabilitadas que tengan como destino una sola tabla, pero no puede haber varias de ellas habilitadas al mismo tiempo.
Comentarios
Al usar las funciones de predicado con tablas optimizadas para memoria, hay que incluir SCHEMABINDING
y usar la sugerencia de compilación WITH NATIVE_COMPILATION
.
Los predicados de bloqueo se evalúan después de ejecutar la operación DML correspondiente. Por lo tanto, existe el peligro de que una consulta READ UNCOMMITTED puede mostrar valores transitorios que se revertirán.
Permisos
Requiere el permiso ALTER ANY SECURITY POLICY y el permiso ALTER en el esquema.
Además, son necesarios los siguientes permisos para cada predicado que se agrega:
Los permisos SELECT y REFERENCES en la función que se utiliza como predicado.
El permiso REFERENCES en la tabla de destino que se enlaza a la directiva.
El permiso REFERENCES en todas las columnas de la tabla de destino que se utilizan como argumentos.
Ejemplos
Los ejemplos siguientes muestran el uso de la sintaxis CREATE SECURITY POLICY
. Para ver un ejemplo de un escenario completo de la directiva de seguridad, vea Seguridad de nivel de fila.
A Creación de una directiva de seguridad
La siguiente sintaxis crea una directiva de seguridad con un predicado de filtro para la tabla dbo.Customer
y deja deshabilitada la directiva de seguridad.
CREATE SECURITY POLICY [FederatedSecurityPolicy]
ADD FILTER PREDICATE [rls].[fn_securitypredicate]([CustomerId])
ON [dbo].[Customer];
B. Creación de una directiva que afecta a varias tablas
La siguiente sintaxis crea una directiva de seguridad con tres predicados de filtro en tres tablas diferentes y habilita la directiva de seguridad.
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. Creación de una directiva con varios tipos de predicados de seguridad
Agregue un predicado de filtro y un predicado de bloqueo a la tabla 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;