Dela via


ÄNDRA SÄKERHETSPRINCIP (Transact-SQL)

Gäller för: SQL Server 2016 (13.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceSQL Analytics-slutpunkt i Microsoft FabricWarehouse i Microsoft Fabric

Ändrar en säkerhetsprincip.

Transact-SQL syntaxkonventioner

Syntax

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

Argumentpunkter

security_policy_name

Namnet på säkerhetsprincipen. Namn på säkerhetsprinciper måste uppfylla reglerna för identifierare och måste vara unika i databasen och för dess schema.

schema_name

Namnet på det schema som säkerhetsprincipen tillhör. schema_name krävs på grund av schemabindning.

[ FILTER | BLOCK ] **

Typ av säkerhetspredikat för funktionen som är bunden till måltabellen. FILTER predikat filtrerar tyst de rader som är tillgängliga för läsåtgärder. BLOCK predikat blockerar uttryckligen skrivåtgärder som bryter mot predikatfunktionen.

tvf_schema_name. security_predicate_function_name

Den infogade tabellvärdefunktion som du använder som predikat och som du framtvingar vid frågor mot en måltabell. Som mest kan du definiera ett säkerhetspredikat för en viss DML-åtgärd mot en viss tabell. Skapa funktionen infogat tabellvärde med hjälp av SCHEMABINDING alternativet .

{ column_name | argument }

Kolumnnamnet eller uttrycket som används som parametrar för funktionen för säkerhetspredikat. Alla kolumner i måltabellen kan användas som argument för predikatfunktionen. Uttryck som innehåller literaler, inbyggda uttryck och uttryck som använder aritmetiska operatorer kan användas.

table_schema_name.table_name

Måltabellen för säkerhetspredikatet. Flera inaktiverade säkerhetsprinciper kan rikta in sig på en enskild tabell för en viss DML-åtgärd, men endast en kan aktiveras vid en viss tidpunkt.

<block_dml_operation>

Den specifika DML-åtgärden för det tillämpade blockpredikatet. AFTER anger att predikatet utvärderas på radvärdena efter att DML-åtgärden utfördes (INSERT eller UPDATE). BEFORE anger att predikatet utvärderas på radvärdena innan DML-åtgärden utförs (UPDATE eller DELETE). Om ingen åtgärd anges gäller predikatet för alla åtgärder.

Du kan inte ändra åtgärden för ett tillämpat blockpredikat eftersom åtgärden används för att unikt identifiera predikatet. I stället måste du släppa predikatet och lägga till ett nytt för den nya åtgärden.

MED ( STATE = { ON | OFF } )

Aktiverar eller inaktiverar säkerhetsprincipen från att framtvinga dess säkerhetspredikat mot måltabellerna. Om inte anges är den säkerhetsprincip som skapas aktiverad.

INTE FÖR REPLIKERING

Anger att säkerhetsprincipen inte ska köras när en replikeringsagent ändrar målobjektet. Mer information finns i Kontrollera beteendet för utlösare och begränsningar under synkronisering (replikering Transact-SQL programmering).

table_schema_name.table_name

Måltabellen för det tillämpade säkerhetspredikatet. Flera inaktiverade säkerhetsprinciper kan riktas mot en enskild tabell, men endast en kan aktiveras vid en viss tidpunkt.

Anmärkningar

INSTRUKTIONEN ALTER SECURITY POLICY finns i en transaktions omfång. Om transaktionen återställs, återställs även instruktionen.

När du använder predikatfunktioner med minnesoptimerade tabeller måste säkerhetsprinciper inkludera SCHEMABINDING och använda kompileringstipset WITH NATIVE_COMPILATION . Argumentet SCHEMABINDING kan inte ändras med -instruktionen ALTER eftersom det gäller för alla predikat. Om du vill ändra schemabindningen måste du släppa och återskapa säkerhetsprincipen.

Blockpredikat utvärderas efter att motsvarande DML-åtgärd har körts. Därför finns det risk för att en READ UNCOMMITTED-fråga kan se tillfälliga värden som kommer att återställas.

Behörigheter

Kräver behörigheten ALTER ANY SECURITY POLICY.

Dessutom krävs följande behörigheter för varje predikat som läggs till:

  • SELECT och REFERENCES behörigheter för funktionen som används som predikat.
  • REFERENCES behörighet på måltabellen som är bunden till principen.
  • REFERENCES behörighet för varje kolumn från måltabellen som används som argument.

Exempel

I följande exempel visas hur syntaxen ALTER SECURITY POLICY används. Ett exempel på ett fullständigt säkerhetsprincipscenario finns i Säkerhet på radnivå.

A. Lägga till ytterligare ett predikat i en princip

Följande syntax ändrar en säkerhetsprincip och lägger till ett filterpredikat i mytable tabellen.

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

B. Aktivera en befintlig princip

I följande exempel används ALTER-syntaxen för att aktivera en säkerhetsprincip.

ALTER SECURITY POLICY pol1 WITH ( STATE = ON );

C. Lägga till och ta bort flera predikat

Följande syntax ändrar en säkerhetsprincip, lägger till filterpredikat för tabellerna mytable1 och mytable3 och tar bort filterpredikatet i mytable2 tabellen.

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. Ändra predikatet i en tabell

Följande syntax ändrar det befintliga filterpredikatet i myschema.mytable tabellen till funktionen SecPredicate2 .

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

E. Ändra ett blockpredikat

Ändra funktionen blockpredicate för en åtgärd i en tabell.

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