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;
限制事項
在資料庫層級具有 CONTROL SERVER 或 CONTROL 權限的使用者可以檢視其原始格式的遮罩資料。 這包括管理使用者或角色,例如 sysadmin、db_owner 等。
新增動態資料遮罩會實作為基礎資料表上的結構描述變更,因此無法在具有相依性的資料行上執行 (例如,計算資料行參考的資料行)。 試著針對具有相依性的資料行新增動態資料遮罩會導致錯誤 ALTER TABLE ALTER COLUMN _columnname_ failed because one or more objects access this column。 若要暫時解決這項限制,您可以先移除相依性,並新增動態資料遮罩,然後重新建立相依性。 例如,如果相依性是基於相依於該資料行索引,則您可以卸除索引,並新增遮罩,然後重新建立相依索引。
CREATE USER MaskingTestUser WITHOUT LOGIN;
GRANT SELECT ON SCHEMA::Data TO MaskingTestUser;
-- impersonate for testing:
EXECUTE AS USER = 'MaskingTestUser';
SELECT * FROM Data.Membership;
REVERT;
使用 ALTER TABLE 陳述式將遮罩加入資料表的現有資料行中,或在該資料行編輯遮罩。
下列範例會將遮罩函數新增至 LastName 資料行:
ALTER TABLE Data.Membership
ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"xxxx",0)');
以下範例會變更 LastName 資料行的遮罩函數:
ALTER TABLE Data.Membership
ALTER COLUMN LastName VARCHAR(100) MASKED WITH (FUNCTION = 'default()');
授與權限以檢視未遮蔽的資料
授與 UNMASK 權限可讓 MaskingTestUser 看見未遮罩的資料。
GRANT UNMASK TO MaskingTestUser;
EXECUTE AS USER = 'MaskingTestUser';
SELECT * FROM Data.Membership;
REVERT;
-- Removing the UNMASK permission
REVOKE UNMASK TO MaskingTestUser;
捨棄動態資料遮罩
以下陳述式會卸除先前範例中在 LastName 資料行建立的遮罩:
ALTER TABLE Data.Membership
ALTER COLUMN LastName DROP MASKED;
細微權限範例
建立結構描述以包含使用者資料表:
CREATE SCHEMA Data;
GO
建立具有遮罩資料行的資料表:
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
);
CREATE USER ServiceAttendant WITHOUT LOGIN;
GO
CREATE USER ServiceLead WITHOUT LOGIN;
GO
CREATE USER ServiceManager WITHOUT LOGIN;
GO
CREATE USER ServiceHead WITHOUT LOGIN;
GO
授與讀取權限給資料庫中的使用者:
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;
授與不同的 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;
在使用者 ServiceAttendant 的內容下查詢資料:
EXECUTE AS USER = 'ServiceAttendant';
SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
FROM Data.Membership;
SELECT MemberID, Feedback, Rating
FROM Service.Feedback;
REVERT;
在使用者 ServiceLead 的內容下查詢資料:
EXECUTE AS USER = 'ServiceLead';
SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
FROM Data.Membership;
SELECT MemberID, Feedback, Rating
FROM Service.Feedback;
REVERT;
在使用者 ServiceManager 的內容下查詢資料:
EXECUTE AS USER = 'ServiceManager';
SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
FROM Data.Membership;
SELECT MemberID, Feedback, Rating
FROM Service.Feedback;
REVERT;
在使用者 ServiceHead 的內容下查詢資料
EXECUTE AS USER = 'ServiceHead';
SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
FROM Data.Membership;
SELECT MemberID, Feedback, Rating
FROM Service.Feedback;
REVERT;
若要撤銷 UNMASK 權限,請使用下列 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;