Delen via


BEVEILIGINGSBELEID MAKEN (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 FabricSQL-database in Microsoft Fabric Preview

Hiermee maakt u een beveiligingsbeleid voor beveiliging op rijniveau.

Transact-SQL syntaxis-conventies

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

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

Is 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

Is de inline-tabelwaardefunctie die wordt gebruikt als predicaat en die wordt afgedwongen bij query's voor een doeltabel. Maximaal één beveiligingspredicaat kan worden gedefinieerd voor een bepaalde DML-bewerking voor een bepaalde tabel. De inline-tabelwaardefunctie moet zijn gemaakt met behulp van de SCHEMABINDING optie.

{ column_name | expression }

Een kolomnaam of expressie die wordt gebruikt als parameter voor de functie beveiligingspredicaat. Elke kolom in de doeltabel kan worden gebruikt. Een expressie kan alleen constanten bevatten, ingebouwde scalaire functies, operators en kolommen uit de doeltabel. Voor elke parameter van de functie moet een kolomnaam of expressie worden opgegeven.

table_schema_name.table_name

Is de doeltabel waarop het beveiligingspredicaat wordt toegepast. 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 waarvoor het blokpredicaat wordt toegepast. AFTER geeft aan dat het predicaat wordt geëvalueerd op de waarden van de rijen nadat de DML-bewerking is uitgevoerd (INSERT of UPDATE). BEFORE geeft aan dat het predicaat wordt geëvalueerd op de waarden van de rijen voordat de DML-bewerking wordt uitgevoerd (UPDATE of DELETE). Als er geen bewerking is opgegeven, is het predicaat van toepassing op alle bewerkingen.

[ STATUS = { AAN | 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.

[ SCHEMABINDING = { ON | UIT } ]

Hiermee wordt aangegeven of alle predicaatfuncties in het beleid moeten worden gemaakt met de SCHEMABINDING optie. Deze instelling is ON standaard en alle functies moeten worden gemaakt met SCHEMABINDING.

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

Is de doeltabel waarop het beveiligingspredicaat wordt toegepast. Meerdere uitgeschakelde beveiligingsbeleidsregels kunnen zich richten op één tabel, maar er kan op elk gewenst moment slechts één worden ingeschakeld.

Remarks

Wanneer u predicaatfuncties gebruikt met tabellen die zijn geoptimaliseerd voor geheugen, moet u de WITH NATIVE_COMPILATION hint voor compilatie opnemen SCHEMABINDING en gebruiken.

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

Permissions

Vereist de machtiging ALTER ANY SECURITY POLICY en ALTER-machtiging voor het schema.

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

  • SELECT- en VERWIJZINGEN-machtigingen voor de functie die wordt gebruikt als predicaat.

  • VERWIJZINGEN-machtiging voor de doeltabel die is gebonden aan het beleid.

  • DE MACHTIGING VERWIJZINGEN voor elke kolom uit de doeltabel die als argumenten wordt gebruikt.

Examples

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

A. Een beveiligingsbeleid maken

Met de volgende syntaxis maakt u een beveiligingsbeleid met een filterpredicaat voor de dbo.Customer tabel en blijft het beveiligingsbeleid uitgeschakeld.

CREATE SECURITY POLICY [FederatedSecurityPolicy]   
ADD FILTER PREDICATE [rls].[fn_securitypredicate]([CustomerId])   
ON [dbo].[Customer];  

B. Een beleid maken dat van invloed is op meerdere tabellen

Met de volgende syntaxis maakt u een beveiligingsbeleid met drie filterpredicaten in drie verschillende tabellen en schakelt u het beveiligingsbeleid in.

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. Een beleid maken met meerdere typen beveiligingspredicaten

Zowel een filterpredicaat als een blokpredicaat toevoegen aan de dbo.Sales tabel.

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;