选择字符掩码输出数据

pyr*_*ram 8 sql t-sql sql-server sql-server-2008 data-masking

我正在使用SQL Server 2008.

我想掩盖查询的输出数据.

这是我在执行select时来自表中列的数据:

column1

384844033434

743423547878

111224678885
Run Code Online (Sandbox Code Playgroud)

我想要一个像这样的输出:

column1

384xxxxxx434

743xxxxxx878

111xxxxxx885
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Dav*_*kle 7

您必须使用视图,并拒绝所有用户对基础表的SELECT访问权限.

你的观点看起来像

SELECT 
     SUBSTRING(x.SecurityNumber,1,3) + 
     'xxxxx' + 
     SUBSTRING(x.SecurityNumber,LEN(x.SecurityNumber) - 2, LEN(x.SecurityNumber))
     AS column1
FROM underlyingTable x
Run Code Online (Sandbox Code Playgroud)

然后,您可以授予您的用户SELECT访问此视图的权限,并以您描述的方式屏蔽掉.

如果您希望客户端软件能够在此表中插入或更新数据,则可以使用INSTEAD OF INSERT或INSTEAD OF UPDATE触发器来更新基表.


Luk*_*zda 5

SQL Server 2016+您可以使用动态数据屏蔽功能。

动态数据屏蔽通过将敏感数据屏蔽给非特权用户来限制敏感数据的暴露。动态数据屏蔽使客户能够在对应用层影响最小的情况下指定要显示的敏感数据量,从而有助于防止对敏感数据的未授权访问。它是一种数据保护功能,可将查询结果集中的敏感数据隐藏在指定的数据库字段中,而数据库中的数据不会更改。由于在查询结果中应用了屏蔽规则,因此动态数据屏蔽很容易与现有应用程序一起使用。许多应用程序可以在不修改现有查询的情况下屏蔽敏感数据。

CREATE TABLE #tab(ID INT IDENTITY(1,1), column1 VARCHAR(12));

INSERT INTO #tab(column1)
VALUES('384844033434'),('743423547878'),('111224678885');

SELECT * FROM #tab;
Run Code Online (Sandbox Code Playgroud)

输出:

?????????????????????
? ID ?   column1    ?
?????????????????????
?  1 ? 384844033434 ?
?  2 ? 743423547878 ?
?  3 ? 111224678885 ?
?????????????????????

ALTER TABLE #tab
ALTER COLUMN column1 VARCHAR(12) MASKED WITH (FUNCTION = 'partial(3,"xxxxxx",3)');

SELECT * FROM #tab;
Run Code Online (Sandbox Code Playgroud)

输出:

?????????????????????
? ID ?   column1    ?
?????????????????????
?  1 ? 384xxxxxx434 ?
?  2 ? 743xxxxxx878 ?
?  3 ? 111xxxxxx885 ?
?????????????????????
Run Code Online (Sandbox Code Playgroud)

LiveDemo