您可以使用动态数据屏蔽。
动态数据屏蔽通过屏蔽列输出给没有权限的用户来工作。以下示例已根据此处提供的演示在 2016 年进行了测试:探索 SQL Server 2016 动态数据屏蔽 - 第一部分 - 创建使用动态数据屏蔽的表
--create a table
CREATE TABLE ClientInfo
(ClientID int IDENTITY,
FirstName varchar(65),
LastName varchar(65),
PhoneNum bigint
MASKED WITH (FUNCTION = 'default()'),
EmailAddr varchar(100)
MASKED WITH (FUNCTION = 'email()'),
CreditCardNum varchar(19) MASKED
WITH (FUNCTION = 'partial(0,"XXXX-XXXX-XXXX-",4)'),
BirthDT date MASKED
WITH (FUNCTION = 'default()'));
INSERT Clientinfo (FirstName, LastName, PhoneNum, EmailAddr,CreditCardNum,BirthDT) VALUES
('George', 'Washington', 5555814441,
'GeorgeW@datanbasejournal.com', '0123-4567-8901-2345','02/22/1732'),
('Thomas', 'Jefferson', 5559841298,
'ThomasJ@datanbasejournal.com', '9999-9999-9999-9999', '04/13/1743'),
('Abraham', 'Lincoln', 5554070123,
'AbrahamL@datanbasejournal.com','0000-1111-2222-3333', '02/12/1809');
现在尝试只选择并查看数据,因为您是管理员,您将看到所有数据
select * from clientinfo
现在尝试限制您想要限制查看的用户的权限
CREATE USER user1 WITHOUT LOGIN;
GRANT SELECT ON ClientInfo TO user1;
现在让我们尝试以该用户身份执行
EXECUTE AS USER = 'AppReader';
SELECT * FROM ClientInfo;
REVERT;
执行上面的查询,不会显示所有数据,并且会根据被屏蔽的函数进行不同的屏蔽。见下面的截图
要向用户提供访问权限,您可以使用以下查询
CREATE USER AppAdmin WITHOUT LOGIN;
GRANT SELECT ON ClientInfo TO AppAdmin;
GRANT UNMASK TO AppAdmin;