Delen via


ALTER SECURITY POLICY (Transact-SQL)

Van toepassing op: SQL Server 2016 (13.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceSQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft Fabric

Wijzigt een beveiligingsbeleid.

Transact-SQL syntaxis-conventies

Syntaxis

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

Argumenten

security_policy_name

De naam van het beveiligingsbeleid. Namen van beveiligingsbeleid moeten voldoen aan de regels voor id's en moeten uniek zijn binnen de database en het bijbehorende schema.

schema_name

De naam van het schema waartoe het beveiligingsbeleid behoort. schema_name is vereist vanwege schemabinding.

[ FILTER | BLOCK ] **

Het type beveiligingspredicaat voor de functie die is gebonden aan de doeltabel. FILTER prediceert op de achtergrond de rijen die beschikbaar zijn voor leesbewerkingen. BLOCK prediceert expliciet schrijfbewerkingen die de predicaatfunctie schenden.

tvf_schema_name. security_predicate_function_name

De inline-tabelwaardefunctie die u als predicaat gebruikt en die u afdwingt bij query's voor een doeltabel. U kunt maximaal één beveiligingspredicaat definiëren voor een bepaalde DML-bewerking voor een bepaalde tabel. Maak de functie inlinetabelwaarde met behulp van de SCHEMABINDING optie.

{ column_name | argumenten }

De kolomnaam of expressie die wordt gebruikt als parameters voor de functie beveiligingspredicaat. Kolommen in de doeltabel kunnen worden gebruikt als argumenten voor de predicaatfunctie. Expressies die letterlijke, ingebouwde en expressies bevatten die gebruikmaken van rekenkundige operatoren, kunnen worden gebruikt.

table_schema_name.table_name

De doeltabel voor het beveiligingspredicaat. Meerdere uitgeschakelde beveiligingsbeleidsregels kunnen zich richten op één tabel voor een bepaalde DML-bewerking, maar er kan op elk gewenst moment slechts één worden ingeschakeld.

<block_dml_operation>

De specifieke DML-bewerking voor het toegepaste blokpredicaat. AFTER geeft aan dat het predicaat wordt geëvalueerd op de rijwaarden nadat de DML-bewerking is uitgevoerd (INSERT of UPDATE). BEFORE geeft aan dat het predicaat wordt geëvalueerd op de rijwaarden voordat de DML-bewerking wordt uitgevoerd (UPDATE of DELETE). Als er geen bewerking is opgegeven, is het predicaat van toepassing op alle bewerkingen.

U kunt de bewerking voor een toegepast blokpredicaat niet wijzigen omdat de bewerking wordt gebruikt om het predicaat uniek te identificeren. In plaats daarvan moet u het predicaat verwijderen en een nieuwe toevoegen voor de nieuwe bewerking.

WITH ( STATE = { ON | UIT } )

Hiermee kunt u het beveiligingsbeleid in- of uitschakelen om de beveiligingspredicaten af te dwingen voor de doeltabellen. Als het beveiligingsbeleid dat wordt gemaakt niet is opgegeven, is ingeschakeld.

NIET VOOR REPLICATIE

Geeft aan dat het beveiligingsbeleid niet moet worden uitgevoerd wanneer een replicatieagent het doelobject wijzigt. Zie Het gedrag van triggers en beperkingen tijdens synchronisatie beheren (replicatie Transact-SQL programmeren) voor meer informatie.

table_schema_name.table_name

De doeltabel voor het toegepaste beveiligingspredicaat. Meerdere uitgeschakelde beveiligingsbeleidsregels kunnen zich richten op één tabel, maar er kan op elk gewenst moment slechts één worden ingeschakeld.

Opmerkingen

De instructie ALTER SECURITY POLICY bevindt zich in het bereik van een transactie. Als de transactie wordt teruggedraaid, wordt de verklaring ook teruggedraaid.

Wanneer u predicaatfuncties gebruikt met tabellen die zijn geoptimaliseerd voor geheugen, moet het beveiligingsbeleid de WITH NATIVE_COMPILATION compilatiehint bevatten SCHEMABINDING en gebruiken. Het SCHEMABINDING argument kan niet worden gewijzigd met de ALTER instructie omdat het van toepassing is op alle predicaten. Als u schemabinding wilt wijzigen, moet u het beveiligingsbeleid verwijderen en opnieuw maken.

Blokpredicaten worden geëvalueerd nadat de bijbehorende DML-bewerking is uitgevoerd. Als zodanig is er een gevaar dat een READ UNCOMMITTED-query tijdelijke waarden kan zien die worden teruggedraaid.

Machtigingen

Hiervoor is de machtiging ALTER ANY SECURITY POLICY vereist.

Daarnaast zijn de volgende machtigingen vereist voor elk predicaat dat wordt toegevoegd:

  • SELECT en REFERENCES machtigingen voor de functie die wordt gebruikt als predicaat.
  • REFERENCES machtiging voor de doeltabel die is gebonden aan het beleid.
  • REFERENCES machtiging voor elke kolom uit de doeltabel die als argumenten wordt gebruikt.

Voorbeelden

In de volgende voorbeelden ziet u het gebruik van de ALTER SECURITY POLICY syntaxis. Zie Beveiliging op rijniveau voor een voorbeeld van een volledig beveiligingsbeleidsscenario.

Eén. Een extra predicaat toevoegen aan een beleid

Met de volgende syntaxis wordt een beveiligingsbeleid gewijzigd, waarbij een filterpredicaat wordt toegevoegd aan de mytable tabel.

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

B. Een bestaand beleid inschakelen

In het volgende voorbeeld wordt de syntaxis ALTER gebruikt om een beveiligingsbeleid in te schakelen.

ALTER SECURITY POLICY pol1 WITH ( STATE = ON );

C. Meerdere predicaten toevoegen en verwijderen

De volgende syntaxis wijzigt een beveiligingsbeleid, voegt filterpredicaten toe aan de mytable1 en tabellen en mytable3 verwijdert het filterpredicaat in de mytable2 tabel.

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. Het predicaat voor een tabel wijzigen

Met de volgende syntaxis wordt het bestaande filterpredicaat voor de myschema.mytable tabel gewijzigd in de SecPredicate2 functie.

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

E. Een blokpredicaat wijzigen

De blokpredicaatfunctie voor een bewerking in een tabel wijzigen.

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