Delen via


Dynamische gegevensmaskering

van toepassing op: SQL Server 2016 (13.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL-database in Microsoft Fabric

diagram van dynamische gegevensmaskering.

Dynamische gegevensmaskering (DDM) beperkt de blootstelling van gevoelige gegevens door deze te maskeren voor niet-gemachtigde gebruikers. Het kan worden gebruikt om het ontwerp en de codering van beveiliging in uw toepassing aanzienlijk te vereenvoudigen.

Deze inhoud is van toepassing op concepten voor dynamische gegevensmaskering in het algemeen en specifiek voor SQL Server. Inhoud die specifiek is voor andere platforms is beschikbaar:

Overzicht van dynamische gegevensmaskering

Dynamische gegevensmaskering helpt onbevoegde toegang tot gevoelige gegevens te voorkomen door klanten in staat te stellen op te geven hoeveel gevoelige gegevens moeten worden weergegeven met minimaal effect op de toepassingslaag. DDM kan worden geconfigureerd op aangewezen databasevelden om gevoelige gegevens in de resultatensets van query's te verbergen. Met DDM worden de gegevens in de database niet gewijzigd. DDM is eenvoudig te gebruiken met bestaande toepassingen, omdat maskeringsregels worden toegepast in de queryresultaten. Veel toepassingen kunnen gevoelige gegevens maskeren zonder bestaande query's te wijzigen.

  • Een centraal beleid voor gegevensmaskering werkt rechtstreeks op gevoelige velden in de database.
  • Bevoegde gebruikers of rollen aanwijzen die wel toegang hebben tot de gevoelige gegevens.
  • DDM bevat volledige maskerings- en gedeeltelijke maskeringsfuncties en een willekeurig masker voor numerieke gegevens.
  • Eenvoudige Transact-SQL opdrachten definiëren en beheren maskers.

Het doel van dynamische gegevensmaskering is om de blootstelling van gevoelige gegevens te beperken, waardoor gebruikers die geen toegang tot de gegevens mogen hebben, deze niet mogen bekijken. Dynamische gegevensmaskering is niet bedoeld om te voorkomen dat databasegebruikers rechtstreeks verbinding maken met de database en uitgebreide query's uitvoeren die delen van de gevoelige gegevens beschikbaar maken. Dynamische gegevensmaskering is een aanvulling op andere SQL Server-beveiligingsfuncties (controle, versleuteling, beveiliging op rijniveau, enzovoort) en het wordt ten zeerste aanbevolen om deze met deze functies te gebruiken om de gevoelige gegevens in de database beter te beveiligen.

Dynamische gegevensmaskering is beschikbaar in SQL Server 2016 (13.x) en Azure SQL Database en is geconfigureerd met behulp van Transact-SQL opdrachten. Zie Aan de slag met dynamische gegevensmaskering (Azure Portal)voor meer informatie over het configureren van dynamische gegevensmaskering met behulp van Azure Portal.

Notitie

Microsoft Entra ID voorheen Azure Active Directory (Azure AD) werd genoemd.

Een dynamisch gegevensmasker definiëren

Een maskeringsregel kan worden gedefinieerd voor een kolom in een tabel om de gegevens in die kolom te verdoezelen. Er zijn vijf soorten maskers beschikbaar.

Functie Beschrijving Voorbeelden
Verstek Volledige maskering op basis van de gegevenstypen van de aangewezen velden.

Gebruik voor tekenreeksgegevenstypen XXXX (of minder) als de grootte van het veld minder is dan 4 tekens (teken, nchar, varchar, nvarchar, tekst, ntext).

Voor numerieke gegevenstypen wordt een nulwaarde gebruikt (bigint, bit, decimaal, int, money, numeric, smallint, smallmoney, tinyint, float, real).

Gebruik voor datum- en tijdgegevenstypen 1900-01-01 00:00:00.0000000 (datum, datum/tijd2, datum/tijd, datetimeoffset, smalldatetime, tijd).

Voor binaire gegevenstypen gebruikt u één byte van ASCII-waarde 0 (binaire, varbinaire, afbeelding).
Syntaxis van voorbeeldkolomdefinitie: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

Voorbeeld van syntaxis wijzigen: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
E-mail Maskeringsmethode waarmee de eerste letter van een e-mailadres en het constante achtervoegsel '.com' wordt weergegeven, in de vorm van een e-mailadres. aXXX@XXXX.com. Syntaxis van voorbeelddefinitie: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

Voorbeeld van syntaxis wijzigen: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
Willekeurig Een functie voor willekeurige maskering voor gebruik op elk numeriek type om de oorspronkelijke waarde te maskeren met een willekeurige waarde binnen een opgegeven bereik. Syntaxis van voorbeelddefinitie: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')

Voorbeeld van syntaxis wijzigen: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
Aangepaste tekenreeks Maskeringsmethode waarmee de eerste en laatste letters worden weergegeven en een aangepaste opvullingstekenreeks in het midden wordt toegevoegd. prefix,[padding],suffix

Als de oorspronkelijke waarde te kort is om het hele masker te voltooien, wordt een deel van het voor- of achtervoegsel niet weergegeven.
Syntaxis van voorbeelddefinitie: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

Voorbeeld van syntaxis wijzigen: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

Dit verandert een telefoonnummer zoals 555.123.1234 in 5XXXXXXX.

Aanvullend voorbeeld:

ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)')

Dit verandert een telefoonnummer zoals 555.123.1234 in 555.1XXXXXXX.
Datum/tijd van toepassing op: SQL Server 2022 (16.x)

Maskeringsmethode voor kolom gedefinieerd met gegevenstype datum/tijd, datetime2, datum, tijd, datetimeoffset, smalldatetime. Het helpt bij het maskeren van de year => datetime("Y"), month=> datetime("M"), day=>datetime("D"), hour=>datetime("h"), minute=>datetime("m")of seconds=>datetime("s") gedeelte van de dag.
Voorbeeld van het maskeren van het jaar van de datum/tijd waarde:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")')

Voorbeeld van het maskeren van de maand van de datum/tijd waarde:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")')

Voorbeeld van het maskeren van de minuut van de datum/tijd waarde:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")')

Machtigingen

Gebruikers met SELECT-machtiging voor een tabel kunnen de tabelgegevens bekijken. Kolommen die zijn gedefinieerd als gemaskeerd, geven de gemaskeerde gegevens weer. Verleen de UNMASK- toestemming aan een gebruiker zodat zij ongedekte gegevens kunnen ophalen uit de kolommen waarvoor maskering is gedefinieerd.

Gebruikers en rollen met beheerdersrechten kunnen altijd niet-gemaskeerde gegevens weergeven via de machtiging CONTROL, die zowel de ALTER ANY MASK als UNMASK machtiging bevat. Gebruikers met beheerdersrechten of rollen, zoals sysadmin of db_owner beschikken over CONTROL-machtigingen voor de database en kunnen onmaskerde gegevens weergeven.

U hebt geen speciale machtiging nodig om een tabel met een dynamisch gegevensmasker te maken, alleen de standaard CREATE TABLE en ALTER voor schemamachtigingen.

Het toevoegen, vervangen of verwijderen van het masker van een kolom vereist de toestemming ALTER ANY MASK en de toestemming ALTER op de tabel. Het is geschikt om ALTER ANY MASK aan een beveiligingsfunctionaris toe te kennen.

Notitie

De UNMASK-machtiging heeft geen invloed op zichtbaarheid van metagegevens: het alleen verlenen van UNMASK geeft geen metagegevens weer. UNMASK moet altijd vergezeld gaan van een SELECT-machtiging om enig effect te hebben. Voorbeeld: het verlenen van UNMASK voor databasebereik en het verlenen van SELECT aan een afzonderlijke tabel heeft het resultaat dat de gebruiker alleen de metagegevens van de afzonderlijke tabel kan zien waaruit ze kunnen selecteren, niet andere. Zie ook zichtbaarheidsconfiguratie voor metagegevens.

Best practices en veelvoorkomende gebruiksvoorbeelden

  • Het maken van een masker op een kolom voorkomt geen updates voor die kolom. Hoewel gebruikers gemaskeerde gegevens ontvangen bij het uitvoeren van query's op de gemaskeerde kolom, kunnen dezelfde gebruikers de gegevens bijwerken als ze schrijfmachtigingen hebben. Er moet nog steeds een goed toegangsbeheerbeleid worden gebruikt om updatemachtigingen te beperken.

  • Als u SELECT INTO of INSERT INTO gebruikt om gegevens uit een gemaskeerde kolom naar een andere tabel te kopiëren, worden gemaskeerde gegevens in de doeltabel weergegeven (ervan uitgaande dat deze worden geëxporteerd door een gebruiker zonder UNMASK- bevoegdheden).

  • Dynamische gegevensmaskering wordt toegepast bij het uitvoeren van SQL Server Import en Export. Een database met gemaskeerde kolommen resulteert in een geëxporteerd gegevensbestand met gemaskeerde gegevens (ervan uitgaande dat deze door een gebruiker wordt geëxporteerd zonder UNMASK- bevoegdheden) en de geïmporteerde database bevat statisch gemaskeerde gegevens.

Query uitvoeren op gemaskeerde kolommen

Gebruik de weergave sys.masked_columns om een query uit te voeren op tabelkolommen waarop een maskeringsfunctie is toegepast. Deze weergave neemt over van de sys.columns weergave. Hiermee worden alle kolommen in de sys.columns weergave geretourneerd, plus de kolommen is_masked en masking_function, waarmee wordt aangegeven of de kolom is gemaskeerd en welke maskeringsfunctie is gedefinieerd. In deze weergave worden alleen de kolommen weergegeven waarop een maskeringsfunctie is toegepast.

SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function
FROM sys.masked_columns AS c
JOIN sys.tables AS tbl
    ON c.[object_id] = tbl.[object_id]
WHERE is_masked = 1;

Beperkingen en beperkingen

Gebruikers met CONTROL SERVER of CONTROL op databaseniveau kunnen gemaskeerde gegevens weergeven in de oorspronkelijke vorm. Dit omvat beheerdersgebruikers of rollen zoals sysadmin, db_owner enzovoort.

Er kan geen maskeringsregel worden gedefinieerd voor de volgende kolomtypen:

  • Versleutelde kolommen (Always Encrypted)

  • FILESTREAM

  • COLUMN_SET of een sparse kolom die deel uitmaakt van een kolomset.

  • Een masker kan niet worden geconfigureerd voor een berekende kolom, maar als de berekende kolom afhankelijk is van een kolom met een MASKER, retourneert de berekende kolom gemaskeerde gegevens.

  • Een kolom met gegevensmaskering kan geen sleutel zijn voor een FULLTEXT-index.

  • Een kolom in een PolyBase externe tabel.

Voor gebruikers zonder de machtiging UNMASK werken de afgeschafte READTEXT-, UPDATETEXT-en WRITETEXT--bewerkingen niet goed op een kolom die is geconfigureerd voor dynamische gegevensmaskering.

Het toevoegen van een dynamisch gegevensmasker wordt geïmplementeerd als een schemawijziging in de onderliggende tabel en kan daarom niet worden uitgevoerd op een kolom met afhankelijkheden (bijvoorbeeld kolom waarnaar wordt verwezen door berekende kolom). Als u een dynamisch gegevensmasker probeert toe te voegen aan kolommen met afhankelijkheid, resulteert dit in een fout, ALTER TABLE ALTER COLUMN _columnname_ failed because one or more objects access this column. Als u deze beperking wilt omzeilen, kunt u eerst de afhankelijkheid verwijderen, vervolgens het dynamische gegevensmasker toevoegen en vervolgens de afhankelijkheid opnieuw maken. Als de afhankelijkheid bijvoorbeeld wordt veroorzaakt door een index die afhankelijk is van die kolom, kunt u de index verwijderen, het masker toevoegen en vervolgens de afhankelijke index opnieuw maken.

Wanneer u een expressie projecteert die verwijst naar een kolom waarvoor een functie voor gegevensmaskering is gedefinieerd, wordt de expressie ook gemaskeerd. Ongeacht de functie (standaard, e-mail, willekeurige, aangepaste tekenreeks) die wordt gebruikt om de kolom waarnaar wordt verwezen te maskeren, wordt de resulterende expressie altijd gemaskeerd met de standaardfunctie.

Query's voor meerdere databases die betrekking hebben op twee verschillende Azure SQL-databases of -databases die worden gehost op verschillende SQL Server-exemplaren, en waarbij een vergelijkings- of joinbewerking op MASKED-kolommen geen juiste resultaten oplevert. De resultaten die worden geretourneerd van de externe server zijn al in MASKED-vorm en zijn lokaal niet geschikt voor enige vorm van vergelijking of samenvoegbewerking.

Notitie

Dynamische gegevensmaskering wordt niet ondersteund wanneer naar de onderliggende basistabel wordt verwezen in een geïndexeerde weergave.

Beveiligingsnotitie: maskering omzeilen met behulp van deductie- of brute-force-technieken

Dynamische gegevensmaskering is ontworpen om de ontwikkeling van toepassingen te vereenvoudigen door de blootstelling van gegevens te beperken in een set vooraf gedefinieerde query's die door de toepassing worden gebruikt. Hoewel dynamische gegevensmaskering ook handig kan zijn om onbedoelde blootstelling van gevoelige gegevens te voorkomen bij het rechtstreeks openen van een productiedatabase, is het belangrijk om te weten dat onbevoegde gebruikers met ad-hocquerymachtigingen technieken kunnen toepassen om toegang te krijgen tot de werkelijke gegevens. Als er ad hoc toegang moet worden verleend, moet auditing worden gebruikt om alle databaseactiviteit te bewaken en dit scenario te beperken.

Denk bijvoorbeeld aan een database-principal met voldoende bevoegdheden voor het uitvoeren van ad-hocquery's op de database en probeert de onderliggende gegevens te 'raden' en uiteindelijk de werkelijke waarden af te leiden. Stel dat er een masker is gedefinieerd in de kolom [Employee].[Salary] en dat deze gebruiker rechtstreeks verbinding maakt met de database en begint met het raden van waarden, waardoor hij uiteindelijk de [Salary] waarde in de Employees tabel afleidt.

SELECT ID, Name, Salary FROM Employees
WHERE Salary > 99999 and Salary < 100001;
Legitimatiebewijs Naam Salaris
62543 Jane Doe 0
91245 John Smith 0

Dit laat zien dat dynamische gegevensmaskering niet alleen mag worden gebruikt om gevoelige gegevens volledig te beveiligen van gebruikers die ad-hocquery's uitvoeren op de database. Het is geschikt voor het voorkomen van onbedoelde blootstelling van gevoelige gegevens, maar beschermt niet tegen schadelijke bedoelingen om de onderliggende gegevens af te leiden.

Het is belangrijk om de machtigingen voor de database goed te beheren en altijd het minimale vereiste machtigingsprincipe te volgen. Vergeet ook niet om controle ingeschakeld te hebben om alle activiteiten bij te houden die plaatsvinden in de database.

Gedetailleerde machtigingen geïntroduceerd in SQL Server 2022

Vanaf SQL Server 2022 (16.x) kunt u onbevoegde toegang tot gevoelige gegevens voorkomen en controle verkrijgen door deze te maskeren voor een onbevoegde gebruiker op verschillende niveaus van de database. U kunt UNMASK machtiging verlenen of intrekken op databaseniveau, schemaniveau, tabelniveau of op kolomniveau voor een gebruiker, databaserol, Microsoft Entra-identiteit of Microsoft Entra-groep. Deze verbetering biedt een gedetailleerdere manier om onbevoegde toegang tot gegevens die zijn opgeslagen in de database te beheren en te beperken en het beheer van gegevensbeveiliging te verbeteren.

Voorbeelden

Een dynamisch gegevensmasker maken

In het volgende voorbeeld wordt een tabel gemaakt met drie verschillende typen dynamische gegevensmaskers. In het voorbeeld wordt de tabel gevuld en wordt ervoor gekozen het resultaat weer te geven.

-- schema to contain user tables
CREATE SCHEMA Data;
GO

-- table with masked columns
CREATE TABLE Data.Membership (
    MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
    FirstName VARCHAR(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
    LastName VARCHAR(100) NOT NULL,
    Phone VARCHAR(12) MASKED WITH (FUNCTION = 'default()') NULL,
    Email VARCHAR(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
    DiscountCode SMALLINT MASKED WITH (FUNCTION = 'random(1, 100)') NULL
);

-- inserting sample data
INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode)
VALUES
('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10),
('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5),
('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50),
('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40);
GO

Er wordt een nieuwe gebruiker gemaakt en de SELECT machtiging verleend voor het schema waarin de tabel zich bevindt. Query's die worden uitgevoerd als de MaskingTestUser gemaskeerde gegevens weergeven.

CREATE USER MaskingTestUser WITHOUT LOGIN;

GRANT SELECT ON SCHEMA::Data TO MaskingTestUser;
  
-- impersonate for testing:
EXECUTE AS USER = 'MaskingTestUser';

SELECT * FROM Data.Membership;

REVERT;

Het resultaat toont de maskers door de gegevens te wijzigen van:

1 Roberto Tamburello 555.123.4567 RTamburello@contoso.com 10

in:

1 Rxxxxxo Tamburello xxxx RXXX@XXXX.com 91

waarbij het getal in DiscountCode willekeurig is voor elk queryresultaat.

Een masker aan een bestaande kolom toevoegen of bewerken

Gebruik de instructie ALTER TABLE om een masker toe te voegen aan een bestaande kolom in de tabel of om het masker in die kolom te bewerken.
In het volgende voorbeeld wordt een maskeringsfunctie toegevoegd aan de kolom LastName:

ALTER TABLE Data.Membership
ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"xxxx",0)');

In het volgende voorbeeld wordt een maskeringsfunctie in de kolom LastName gewijzigd:

ALTER TABLE Data.Membership
ALTER COLUMN LastName VARCHAR(100) MASKED WITH (FUNCTION = 'default()');

Machtigingen verlenen om niet-gemaskeerde gegevens weer te geven

Als u de UNMASK machtiging verleent, kan MaskingTestUser de gegevens onzichtbaar zien.

GRANT UNMASK TO MaskingTestUser;

EXECUTE AS USER = 'MaskingTestUser';

SELECT * FROM Data.Membership;

REVERT;
  
-- Removing the UNMASK permission
REVOKE UNMASK TO MaskingTestUser;

Een dynamisch gegevensmasker verwijderen

Met de volgende verklaring wordt het masker verwijderd van de LastName-kolom die in het vorige voorbeeld is gemaakt:

ALTER TABLE Data.Membership
ALTER COLUMN LastName DROP MASKED;

Voorbeelden van granulaire machtigingen

  1. Maak een schema dat gebruikerstabellen bevat:

    CREATE SCHEMA Data;
    GO
    
  2. Tabel maken met gemaskeerde kolommen:

    CREATE TABLE Data.Membership (
        MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
        FirstName VARCHAR(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
        LastName VARCHAR(100) NOT NULL,
        Phone VARCHAR(12) MASKED WITH (FUNCTION = 'default()') NULL,
        Email VARCHAR(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
        DiscountCode SMALLINT MASKED WITH (FUNCTION = 'random(1, 100)') NULL,
        BirthDay DATETIME MASKED WITH (FUNCTION = 'default()') NULL
    );
    
  3. Voorbeeldgegevens invoegen:

    INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode, BirthDay)
    VALUES
    ('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10, '1985-01-25 03:25:05'),
    ('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5, '1990-05-14 11:30:00'),
    ('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50, '2004-02-29 14:20:10'),
    ('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40, '1990-03-01 06:00:00');
    
  4. Schema maken voor het bevatten van servicetabellen:

    CREATE SCHEMA Service;
    GO
    
  5. Servicetabel maken met gemaskeerde kolommen:

    CREATE TABLE Service.Feedback (
        MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
        Feedback VARCHAR(100) MASKED WITH (FUNCTION = 'default()') NULL,
        Rating INT MASKED WITH (FUNCTION = 'default()'),
        Received_On DATETIME
        );
    
  6. Voorbeeldgegevens invoegen:

    INSERT INTO Service.Feedback(Feedback, Rating, Received_On)
    VALUES
    ('Good', 4, '2022-01-25 11:25:05'),
    ('Excellent', 5, '2021-12-22 08:10:07'),
    ('Average', 3, '2021-09-15 09:00:00');
    
  7. Maak verschillende gebruikers in de database:

    CREATE USER ServiceAttendant WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceLead WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceManager WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceHead WITHOUT LOGIN;
    GO
    
  8. Leesmachtigingen verlenen aan de gebruikers in de database:

    ALTER ROLE db_datareader ADD MEMBER ServiceAttendant;
    
    ALTER ROLE db_datareader ADD MEMBER ServiceLead;
    
    ALTER ROLE db_datareader ADD MEMBER ServiceManager;
    
    ALTER ROLE db_datareader ADD MEMBER ServiceHead;
    
  9. Verschillende UNMASK-machtigingen verlenen aan gebruikers:

    --Grant column level UNMASK permission to ServiceAttendant
    GRANT UNMASK ON Data.Membership(FirstName) TO ServiceAttendant;
    
    -- Grant table level UNMASK permission to ServiceLead
    GRANT UNMASK ON Data.Membership TO ServiceLead;
    
    -- Grant schema level UNMASK permission to ServiceManager
    GRANT UNMASK ON SCHEMA::Data TO ServiceManager;
    GRANT UNMASK ON SCHEMA::Service TO ServiceManager;
    
    --Grant database level UNMASK permission to ServiceHead;
    GRANT UNMASK TO ServiceHead;
    
  10. Voer een query uit op de gegevens in de context van gebruiker ServiceAttendant.

    EXECUTE AS USER = 'ServiceAttendant';
    
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    
    REVERT;
    
  11. Voer een query uit op de gegevens in de context van gebruiker ServiceLead.

    EXECUTE AS USER = 'ServiceLead';
    
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    
    REVERT;
    
  12. Voer een query uit op de gegevens in de context van gebruiker ServiceManager.

    EXECUTE AS USER = 'ServiceManager';
    
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    
    REVERT;
    
  13. Vragen op de gegevens in de context van gebruiker ServiceHead

    EXECUTE AS USER = 'ServiceHead';
    
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    
    REVERT;
    
  14. Als u UNMASK-machtigingen wilt intrekken, gebruikt u de volgende T-SQL-instructies:

    REVOKE UNMASK ON Data.Membership(FirstName) FROM ServiceAttendant;
    
    REVOKE UNMASK ON Data.Membership FROM ServiceLead;
    
    REVOKE UNMASK ON SCHEMA::Data FROM ServiceManager;
    
    REVOKE UNMASK ON SCHEMA::Service FROM ServiceManager;
    
    REVOKE UNMASK FROM ServiceHead;