Dynamiczne maskowanie danych
Dotyczy: SQL Server 2016 (13.x) i późniejsze wersje Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analyticsbaza danych SQL w usłudze Microsoft Fabric
Dynamiczne maskowanie danych (DDM) ogranicza dostęp do poufnych danych, maskując je przed nieuprzywilejowanymi użytkownikami. Może służyć do znacznego uproszczenia projektowania i kodowania zabezpieczeń w aplikacji.
Ta zawartość dotyczy ogólnie pojęć dotyczących dynamicznego maskowania danych i specyficznych dla programu SQL Server. Dostępna jest zawartość specyficzna dla innych platform:
- Aby uzyskać dynamiczne maskowanie danych w usłudze Azure SQL Database, usłudze Azure SQL Managed Instance i usłudze Azure Synapse Analytics, zobacz Wprowadzenie do dynamicznego maskowania danych usługi SQL Database.
- Aby uzyskać informacje o dynamicznym maskowaniu danych w Microsoft Fabric, zobacz Dynamiczne maskowanie danych w hurtowni danych Fabric.
Omówienie dynamicznego maskowania danych
Dynamiczne maskowanie danych pomaga zapobiegać nieautoryzowanemu dostępowi do poufnych danych, umożliwiając klientom określenie, ile poufnych danych ma być ujawnianych przy minimalnym wpływie na warstwę aplikacji. DDM można skonfigurować na wyznaczonych polach bazy danych w celu ukrycia poufnych danych w zestawach wyników zapytań. W przypadku narzędzia DDM dane w bazie danych nie są zmieniane. Rozwiązanie DDM jest łatwe w użyciu z istniejącymi aplikacjami, ponieważ reguły maskowania są stosowane w wynikach zapytania. Wiele aplikacji może maskować poufne dane bez modyfikowania istniejących zapytań.
- Centralne zasady maskowania danych działają bezpośrednio na polach poufnych w bazie danych.
- Wyznaczanie uprzywilejowanych użytkowników lub ról, którzy mają dostęp do poufnych danych.
- Funkcja DDM oferuje pełne funkcje maskowania i częściowego maskowania oraz losową maskę dla danych liczbowych.
- Proste polecenia Transact-SQL definiują maski i zarządzają nimi.
Celem dynamicznego maskowania danych jest ograniczenie ujawnienia poufnych danych, co uniemożliwia użytkownikom, którzy nie powinni mieć dostępu do danych. Dynamiczne maskowanie danych nie ma na celu uniemożliwienia użytkownikom bazy danych bezpośredniego łączenia się z bazą danych i uruchamiania wyczerpujących zapytań, które uwidaczniają fragmenty poufnych danych. Dynamiczne maskowanie danych stanowi uzupełnienie innych funkcji zabezpieczeń programu SQL Server (inspekcja, szyfrowanie, zabezpieczenia na poziomie wiersza itp.) i zdecydowanie zaleca się używanie ich z nimi w celu lepszego ochrony poufnych danych w bazie danych.
Dynamiczne maskowanie danych jest dostępne w programie SQL Server 2016 (13.x) i usłudze Azure SQL Database oraz jest konfigurowane przy użyciu Transact-SQL poleceń. Aby uzyskać więcej informacji na temat konfigurowania dynamicznego maskowania danych przy użyciu witryny Azure Portal, zobacz Wprowadzenie do dynamicznego maskowania danych usługi SQL Database (Azure Portal).
Uwaga
microsoft Entra ID był wcześniej znany jako Azure Active Directory (Azure AD).
Definiowanie dynamicznej maski danych
Regułę maskowania można zdefiniować w kolumnie w tabeli, aby zaciemnić dane w tej kolumnie. Dostępnych jest pięć typów masek.
Funkcja | Opis | Przykłady |
---|---|---|
Domyślny | Pełne maskowanie zgodnie z typami danych wyznaczonych pól. W przypadku typów danych łańcuchowych użyj XXXX (lub mniej), jeśli długość pola jest mniejsza niż 4 znaki (znak, nchar, varchar, nvarchar, tekst, ntext).W przypadku typów danych liczbowych użyj wartości zerowej (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real). W przypadku typów danych daty i godziny użyj 1900-01-01 00:00:00.0000000 (data, datetime2, data/godzina, datetimeoffset, smalldatetime, godzina).W przypadku typów danych binarnych należy użyć pojedynczego bajtu wartości ASCII 0 (binarnych, obrazu). |
Przykładowa składnia definicji kolumny: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL Przykład składni zmiany: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()') |
Metoda maskowania, która uwidacznia pierwszą literę adresu e-mail i stały sufiks ".com", w postaci adresu e-mail.
aXXX@XXXX.com . |
Przykładowa składnia definicji: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL Przykład składni zmiany: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()') |
|
Losowy | Funkcja maskowania losowego do użycia w dowolnym typie liczbowym do maskowania oryginalnej wartości z losową wartością w określonym zakresie. | Przykładowa składnia definicji: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])') Przykład składni zmiany: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)') |
Ciąg niestandardowy | Metoda maskowania, która uwidacznia pierwsze i ostatnie litery oraz dodaje w środku ciąg o niestandardowym wypełnieniu. prefix,[padding],suffix Jeśli oryginalna wartość jest zbyt krótka, aby ukończyć całą maskę, część prefiksu lub sufiksu nie jest widoczna. |
Przykładowa składnia definicji: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL Przykład składni zmiany: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') Spowoduje to zmianę numeru telefonu, takiego jak 555.123.1234 na 5XXXXXXX . Dodatkowy przykład: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)') Spowoduje to zmianę numeru telefonu, takiego jak 555.123.1234 na 555.1XXXXXXX . |
Data i czas |
Dotyczy: SQL Server 2022 (16.x) Metoda maskowania dla kolumny zdefiniowanej przy użyciu typu danych datetime, datetime2, date, time, datetimeoffset, oraz smalldatetime. Pomaga w maskowaniu części dnia year => datetime("Y") , month=> datetime("M") , day=>datetime("D") , hour=>datetime("h") , minute=>datetime("m") lub seconds=>datetime("s") . |
Przykład maskowania roku wartości datetime:ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")') Przykład, jak zamaskować miesiąc daty i godziny wartości : ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")') Przykład maskowania minuty wartości datetime: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")') |
Uprawnienia
Użytkownicy z uprawnieniami SELECT w tabeli mogą wyświetlać dane tabeli. Kolumny zdefiniowane jako maskowane wyświetlają zamaskowane dane. Przyznaj użytkownikowi uprawnienia UNMASK, aby umożliwić im pobieranie niemaskowanych danych z kolumn, dla których zdefiniowano maskowanie.
Użytkownicy administracyjni i role zawsze mogą wyświetlać niezamaskowane dane dzięki uprawnieniu CONTROL, które obejmuje zarówno uprawnienie ALTER ANY MASK, jak i uprawnienie UNMASK. Użytkownicy administracyjni lub role, takie jak sysadmin lub db_owner, mają uprawnienia CONTROL do bazy danych z założenia i mogą wyświetlać niemaskowane dane.
Nie potrzebujesz żadnych specjalnych uprawnień do tworzenia tabeli z dynamiczną maską danych, tylko standardowych uprawnień do schematu CREATE TABLE i ALTER.
Dodanie, zastąpienie lub usunięcie maski kolumny wymaga uprawnienia ALTER ANY MASK i uprawnienia ALTER na tabeli. Należy przyznać ALTER ANY MASK oficerowi bezpieczeństwa.
Uwaga
Uprawnienie UNMASK nie ma wpływu na widoczność metadanych: przyznanie uprawnienia UNMASK samodzielnie nie ujawnia żadnych metadanych. UNMASK zawsze musi być połączone z uprawnieniem SELECT, aby mieć jakikolwiek efekt. Przykład: nadanie uprawnień UNMASK w zakresie bazy danych i uprawnień SELECT dla pojedynczej tabeli oznacza, że użytkownik może zobaczyć tylko metadane tej pojedynczej tabeli, z której mogą wybierać, a nie żadnych innych. Zobacz także Konfiguracja widoczności metadanych.
Najlepsze rozwiązania i typowe przypadki użycia
Utworzenie maski w kolumnie nie uniemożliwia aktualizacji tej kolumny. Mimo że użytkownicy otrzymują dane maskowane podczas wykonywania zapytań dotyczących zamaskowanej kolumny, ci sami użytkownicy mogą aktualizować dane, jeśli mają uprawnienia do zapisu. Należy nadal używać odpowiednich zasad kontroli dostępu w celu ograniczenia uprawnień aktualizacji.
Użycie
SELECT INTO
lubINSERT INTO
do skopiowania danych z maskowanej kolumny do innej tabeli powoduje, że dane pozostaną zamaskowane w tabeli docelowej (zakładając, że jest eksportowane przez użytkownika bez uprawnień do zdejmowania maskowania ).Dynamiczne maskowanie danych jest stosowane podczas uruchamiania funkcji importowania i eksportowania programu SQL Server. Baza danych zawierająca maskowane kolumny powoduje wyeksportowanie pliku danych z zamaskowanymi danymi (przy założeniu, że jest eksportowany przez użytkownika bez
uprawnienia UNMASK ), a zaimportowana baza danych będzie zawierać statycznie maskowane dane.
Zapytanie o kolumny maskowane
Użyj widoku sys.masked_columns
, aby wykonać zapytanie dotyczące kolumn tabeli, które mają zastosowaną funkcję maskowania. Ten widok dziedziczy z widoku sys.columns
. Zwraca wszystkie kolumny w widoku sys.columns
oraz kolumny is_masked
i masking_function
, wskazując, czy kolumny są maskowane, a jeśli tak, jaka funkcja maskowania jest zdefiniowana. Ten widok pokazuje tylko kolumny, w których zastosowano funkcję maskowania.
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;
Ograniczenia i ograniczenia
Użytkownicy z uprawnieniami CONTROL SERVER lub CONTROL na poziomie bazy danych mogą wyświetlać zamaskowane dane w ich oryginalnej formie. Obejmuje to użytkowników administratorów lub ról, takich jak sysadmin, db_owner itp.
Nie można zdefiniować reguły maskowania dla następujących typów kolumn:
Zaszyfrowane kolumny (Always Encrypted)
FILESTREAM
COLUMN_SET lub kolumna rozproszona, która jest częścią zestawu kolumn.
Nie można skonfigurować maski w obliczonej kolumnie, ale jeśli obliczona kolumna zależy od kolumny z maską, obliczana kolumna zwraca maskowane dane.
Kolumna z maskowaniem danych nie może być kluczem indeksu FULLTEXT.
W przypadku użytkowników bez uprawnień UNMASK przestarzałe instrukcje READTEXT, UPDATETEXTi instrukcje WRITETEXT nie działają prawidłowo w kolumnie skonfigurowanej do dynamicznego maskowania danych.
Dodanie dynamicznej maski danych jest implementowane jako zmiana schematu w tabeli bazowej i dlatego nie można jej wykonać na kolumnie z zależnościami (na przykład kolumny, do których odwołuje się kolumna obliczeniowa). Próba dodania dynamicznej maski danych względem kolumn z zależnością spowoduje błąd ALTER TABLE ALTER COLUMN _columnname_ failed because one or more objects access this column
. Aby obejść to ograniczenie, możesz najpierw usunąć zależność, a następnie dodać dynamiczną maskę danych, a następnie ponownie utworzyć zależność. Jeśli na przykład zależność jest spowodowana indeksem zależnym od tej kolumny, możesz usunąć indeks, dodać maskę, a następnie ponownie utworzyć indeks zależny.
Zawsze, gdy projektujesz wyrażenie odwołujące się do kolumny, dla której zdefiniowano funkcję maskowania danych, wyrażenie jest również maskowane. Niezależnie od funkcji (domyślnej, wiadomości e-mail, losowego, niestandardowego ciągu) używanej do maskowania przywoływanej kolumny wynikowe wyrażenie będzie zawsze maskowane za pomocą funkcji domyślnej.
Zapytania międzybazodanowe obejmujące dwie różne bazy danych Azure SQL Database lub bazy hostowane na różnych wystąpieniach SQL Server i zawierające jakiekolwiek operacje porównania lub sprzężenia na kolumnach zamaskowanych nie zapewniają poprawnych wyników. Wyniki zwrócone z serwera zdalnego są już w formie MASKED i nie nadają się do lokalnego porównania lub operacji łączenia.
Uwaga
Dynamiczne maskowanie danych nie jest obsługiwane, gdy podstawowa tabela bazowa jest przywoływana w widoku indeksowanym.
Uwaga dotycząca zabezpieczeń: Pomijanie maskowania przy użyciu technik wnioskowania lub ataków siłowych
Dynamiczne maskowanie danych zostało zaprojektowane w celu uproszczenia tworzenia aplikacji przez ograniczenie narażenia na dane w zestawie wstępnie zdefiniowanych zapytań używanych przez aplikację. Chociaż dynamiczne maskowanie danych może być również przydatne, aby zapobiec przypadkowemu narażeniu poufnych danych bezpośrednio podczas uzyskiwania dostępu do produkcyjnej bazy danych, należy pamiętać, że nieuprzywilejowani użytkownicy z uprawnieniami zapytań ad hoc mogą stosować techniki uzyskiwania dostępu do rzeczywistych danych. Jeśli istnieje potrzeba udzielenia takiego dostępu ad hoc, inspekcja powinna służyć do monitorowania wszystkich działań bazy danych i ograniczenia tego scenariusza.
Rozważmy na przykład użytkownika bazy danych, który ma wystarczające uprawnienia do uruchamiania zapytań ad hoc w bazie danych, i próbuje "odgadnąć" dane źródłowe i ostatecznie wydedukować rzeczywiste wartości. Załóżmy, że mamy maskę zdefiniowaną w kolumnie [Employee].[Salary]
, a ten użytkownik łączy się bezpośrednio z bazą danych i zaczyna zgadywać wartości, ostatecznie wywnioskowuje wartość [Salary]
w tabeli Employees
.
SELECT ID, Name, Salary FROM Employees
WHERE Salary > 99999 and Salary < 100001;
Id Nazwa Wynagrodzenie 62543 Jane Doe 0 91245 Jan Smith 0
Pokazuje to, że dynamiczne maskowanie danych nie powinno być używane samodzielnie w celu pełnego zabezpieczenia poufnych danych od użytkowników uruchamiających zapytania ad hoc w bazie danych. Jest to odpowiednie do zapobiegania przypadkowemu ujawnieniu poufnych danych, ale nie chroni przed złośliwym zamiarem wnioskowania danych źródłowych.
Ważne jest, aby prawidłowo zarządzać uprawnieniami w bazie danych i zawsze przestrzegać minimalnej wymaganej zasady uprawnień. Pamiętaj również, że włączono inspekcję, aby śledzić wszystkie działania wykonywane w bazie danych.
Szczegółowe uprawnienia wprowadzone w programie SQL Server 2022
Począwszy od programu SQL Server 2022 (16.x), można zapobiec nieautoryzowanemu dostępowi do poufnych danych i kontrolować, maskując go nieautoryzowanemu użytkownikowi na różnych poziomach bazy danych. Możesz przyznać lub odwołać uprawnienie UNMASK na poziomie bazy danych, schematu, tabeli lub kolumny dla użytkownika, roli bazy danych, tożsamości Microsoft Entra lub grupy Microsoft Entra. To ulepszenie zapewnia bardziej szczegółowy sposób kontrolowania i ograniczania nieautoryzowanego dostępu do danych przechowywanych w bazie danych oraz poprawy zarządzania zabezpieczeniami danych.
Przykłady
Tworzenie dynamicznej maski danych
Poniższy przykład tworzy tabelę z trzema różnymi typami dynamicznych masek danych. Przykład wypełnia tabelę i wybiera, aby wyświetlić wynik.
-- 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
Utworzono nowego użytkownika i przyznano mu uprawnienia SELECT do schematu, w którym znajduje się tabela. Zapytania wykonywane jako MaskingTestUser
wyświetlają maskowane dane.
CREATE USER MaskingTestUser WITHOUT LOGIN;
GRANT SELECT ON SCHEMA::Data TO MaskingTestUser;
-- impersonate for testing:
EXECUTE AS USER = 'MaskingTestUser';
SELECT * FROM Data.Membership;
REVERT;
Wynik pokazuje maski poprzez zmianę danych z:
1 Roberto Tamburello 555.123.4567 RTamburello@contoso.com 10
do:
1 Rxxxxxo Tamburello xxxx RXXX@XXXX.com 91
gdzie liczba w DiscountCode
jest losowa dla każdego wyniku zapytania.
Dodawanie lub edytowanie maski w istniejącej kolumnie
Użyj instrukcji ALTER TABLE
, aby dodać maskę do istniejącej kolumny w tabeli lub edytować maskę w tej kolumnie.
Poniższy przykład dodaje funkcję maskowania do kolumny LastName
:
ALTER TABLE Data.Membership
ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"xxxx",0)');
Poniższy przykład zmienia funkcję maskowania w kolumnie LastName
:
ALTER TABLE Data.Membership
ALTER COLUMN LastName VARCHAR(100) MASKED WITH (FUNCTION = 'default()');
Udzielanie uprawnień do wyświetlania niemaskowanych danych
Przyznanie UNMASK umożliwia MaskingTestUser
zobaczenie niezamaskowanych danych.
GRANT UNMASK TO MaskingTestUser;
EXECUTE AS USER = 'MaskingTestUser';
SELECT * FROM Data.Membership;
REVERT;
-- Removing the UNMASK permission
REVOKE UNMASK TO MaskingTestUser;
Usuwanie dynamicznej maski danych
Poniższa instrukcja usuwa maskę w kolumnie LastName
, utworzonej w poprzednim przykładzie.
ALTER TABLE Data.Membership
ALTER COLUMN LastName DROP MASKED;
Przykłady drobiazgowych uprawnień
Utwórz schemat zawierający tabele użytkowników:
CREATE SCHEMA Data; GO
Utwórz tabelę z zamaskowanych kolumn:
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 );
Wstaw przykładowe dane:
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');
Utwórz schemat zawierający tabele usług:
CREATE SCHEMA Service; GO
Utwórz tabelę usług z zamaskowanych kolumn:
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 );
Wstaw przykładowe dane:
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');
Utwórz różnych użytkowników w bazie danych:
CREATE USER ServiceAttendant WITHOUT LOGIN; GO CREATE USER ServiceLead WITHOUT LOGIN; GO CREATE USER ServiceManager WITHOUT LOGIN; GO CREATE USER ServiceHead WITHOUT LOGIN; GO
Udziel uprawnień do odczytu użytkownikom w bazie danych:
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;
Udziel innym użytkownikom uprawnień UNMASK:
--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;
Wykonaj zapytanie danych w kontekście użytkownika
ServiceAttendant
.EXECUTE AS USER = 'ServiceAttendant'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
Wykonaj zapytanie danych w kontekście użytkownika
ServiceLead
.EXECUTE AS USER = 'ServiceLead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
Wykonaj zapytanie danych w kontekście użytkownika
ServiceManager
.EXECUTE AS USER = 'ServiceManager'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
Zapytaj o dane w kontekście użytkownika
ServiceHead
EXECUTE AS USER = 'ServiceHead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
Aby odwołać uprawnienia UNMASK, użyj następujących instrukcji języka T-SQL:
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;