Compartir a través de


CREATE SECURITY POLICY (Transact-SQL)

Applies to: SQL Server 2016 (13.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed InstanceSQL analytics endpoint in Microsoft FabricWarehouse en Microsoft FabricSQL en Microsoft Fabric

Crea una directiva de seguridad para seguridad de nivel derow en sql Motor de base de datos.

La seguridad de nivel de fila en Fabric Data Warehouse funciona de forma similar a otros productos de SQL Motor de base de datos. Para obtener más información y ejemplos de seguridad de nivel de fila en Fabric Data Warehouse o el punto de conexión de SQL Analytics, consulte Seguridad de nivel de fila en Fabric almacenamiento de datos.

Transact-SQL convenciones de sintaxis

Syntax

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 } } ]  

Arguments

security_policy_name

El nombre de la directiva de seguridad. Los nombres de directiva de seguridad deben seguir las reglas de los identificadores y ser únicos dentro de la base de datos y su esquema.

schema_name

Nombre del esquema al que pertenece la directiva de seguridad. schema_name es necesario debido a los enlaces de esquema.

[ FILTRO | BLOQUEO ]

Tipo de predicado de seguridad para la función que se va a enlazar 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

Función de valor de tabla insertada que se usará como predicado y que se aplicará a 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 integradas, 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

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.

[ ESTADO = { ON | APAPAGADO } ]

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 | APAPAGADO } ]

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.

NO PARA REPLICACIÓN

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, vea Control the Behavior of Triggers and Constraints During Synchronization (Replication Transact-SQL Programming).

[ table_schema_name. ] table_name

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.

Remarks

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 READ UNCOMMITTED consulta pueda ver valores transitorios que se revertirán.

Permissions

Requiere el ALTER ANY SECURITY POLICY permiso y ALTER el permiso 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 usa 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 usan como argumentos.

Examples

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;