ALTER SECURITY POLICY (Transact-SQL)

Se aplica a: SQL Server 2016 (13.x) y las versiones posteriores Azure SQL DatabaseAzure SQL Managed InstancePunto de conexión de análisis SQL en Microsoft FabricAlmacenamiento de Microsoft Fabric

Modifica una directiva de seguridad.

Convenciones de sintaxis de Transact-SQL

Sintaxis

ALTER SECURITY POLICY schema_name.security_policy_name   
    (  
        { ADD { FILTER | BLOCK } PREDICATE tvf_schema_name.security_predicate_function_name   
           ( { column_name | arguments } [ , ...n ] ) ON table_schema_name.table_name   
           [ <block_dml_operation> ]  }   
        | { ALTER { FILTER | BLOCK } PREDICATE tvf_schema_name.new_security_predicate_function_name   
             ( { column_name | arguments } [ , ...n ] ) ON table_schema_name.table_name   
           [ <block_dml_operation> ] }  
        | { DROP { FILTER | BLOCK } PREDICATE ON table_schema_name.table_name }   
        | [ <additional_add_alter_drop_predicate_statements> [ , ...n ] ]  
    )    [ WITH ( STATE = { 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. Cree la función de valor de tabla insertada con la opción SCHEMABINDING.

{ column_name | arguments }

El nombre de columna o la expresión que se usan como parámetros de la función de predicado de seguridad. Todas las columnas de la tabla de destino pueden utilizarse como argumentos de la función de predicado. Pueden utilizarse expresiones que incluyen literales, builtins y expresiones que usan operadores aritméticos.

table_schema_name.table_name

Es la tabla de destino del 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.

No puede modificar la operación a la que se va a aplicar un predicado de bloqueo, ya que la operación se utiliza para identificar el predicado de forma única. En cambio, debe quitar el predicado y agregar uno nuevo para la operación nueva.

WITH ( 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.

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 del predicado de seguridad aplicado. 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.

Observaciones

La instrucción ALTER SECURITY POLICY está en el ámbito de una transacción. Si se revierte la transacción, también se revierte la instrucción.

Al utilizar las funciones de predicado con tablas optimizadas para memoria, las directivas de seguridad deben incluir SCHEMABINDING y utilizar la sugerencia de compilación WITH NATIVE_COMPILATION. El argumento SCHEMABINDING no se puede intercambiar por la instrucción ALTER porque se aplica a todos los predicados. Para cambiar la vinculación del esquema, debe quitar y volver a crear la directiva de seguridad.

Los predicados de bloqueo se evalúan después de ejecutar la operación DML correspondiente. Por lo tanto, existe el riesgo de que una consulta READ UNCOMMITTED pueda mostrar valores transitorios que se revertirán.

Permisos

Requiere el permiso ALTER ANY SECURITY POLICY.

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.

Ejemplos

Los ejemplos siguientes muestran el uso de la sintaxis ALTER SECURITY POLICY. Para ver un ejemplo de un escenario completo de la directiva de seguridad, vea Seguridad de nivel de fila.

A Agregar un predicado adicional a una directiva

La siguiente sintaxis modifica una directiva de seguridad y agrega un predicado de filtro a la tabla mytable.

ALTER SECURITY POLICY pol1   
    ADD FILTER PREDICATE schema_preds.SecPredicate(column1)   
    ON myschema.mytable;  

B. Habilitar una directiva existente

En el ejemplo siguiente, se utiliza la sintaxis de ALTER para habilitar una directiva de seguridad.

ALTER SECURITY POLICY pol1 WITH ( STATE = ON );  

C. Agregar y anular varios predicados

La sintaxis siguiente modifica una directiva de seguridad, agrega predicados de filtro a las tablas mytable1 y mytable3 y quita el predicado de filtro de la tabla mytable2.

ALTER SECURITY POLICY pol1  
ADD FILTER PREDICATE schema_preds.SecPredicate1(column1)   
    ON myschema.mytable1,  
DROP FILTER PREDICATE   
    ON myschema.mytable2,  
ADD FILTER PREDICATE schema_preds.SecPredicate2(column2, 1)   
    ON myschema.mytable3;  

D. Cambiar el predicado en una tabla

La sintaxis siguiente cambia el predicado de filtro existente en la tabla myschema.mytable para que sea la función SecPredicate2.

ALTER SECURITY POLICY pol1  
    ALTER FILTER PREDICATE schema_preds.SecPredicate2(column1)  
        ON myschema.mytable;  

E. Cambiar un predicado de bloqueo

Cambiar la función de predicado de bloqueo por una operación en una tabla.

ALTER SECURITY POLICY rls.SecPol  
    ALTER BLOCK PREDICATE rls.tenantAccessPredicate_v2(TenantId) 
    ON dbo.Sales AFTER INSERT;