我使用的是SQL Server 2008。
我想对查询的输出数据进行字符掩码。
这是我在执行select操作时从表中的列中获得的数据:
column1
384844033434
743423547878
111224678885我想要这样的输出:
column1
384xxxxxx434
743xxxxxx878
111xxxxxx885我该怎么做呢?
发布于 2012-12-13 05:45:13
您必须使用视图,并拒绝所有用户对基础表的SELECT访问。
您的视图将如下所示
SELECT
SUBSTRING(x.SecurityNumber,1,3) +
'xxxxx' +
SUBSTRING(x.SecurityNumber,LEN(x.SecurityNumber) - 2, LEN(x.SecurityNumber))
AS column1
FROM underlyingTable x然后,您可以授予用户对此视图的SELECT访问权限,并以您所描述的方式屏蔽输出。
如果希望客户端软件能够在该表中插入或更新数据,则可以使用INSTEAD OF insert或INSTEAD OF update触发器来更新基表。
发布于 2012-12-13 06:01:39
如果您知道您的数据字段将有多长,那么您可以使用另一个答案将生成的静态版本,但您始终可以创建一个函数来生成以下内容:
CREATE FUNCTION MixUpCharacters
(
@OrigVal varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
DECLARE @NewVal varchar(max)
DECLARE @OrigLen int
DECLARE @LoopCt int
DECLARE @Part varchar(max) = ''
Declare @PartLength int
SET @NewVal = ''
SET @OrigLen = DATALENGTH(@OrigVal)
SET @LoopCt = 1
SET @Part = SUBSTRING(@OrigVal, 4, len(@OrigVal)-6)
set @PartLength = LEN(@Part)
WHILE @LoopCt <= @PartLength
BEGIN
-- Current length of possible characters
SET @NewVal = @NewVal + 'X'
-- Advance the loop
SET @LoopCt = @LoopCt + 1
END
Return REPLACE(@OrigVal, @Part, @NewVal)
END对于此函数,您将传入要屏蔽的值。因此,您的查询将是:
declare @temp table
(
col1 varchar(50)
)
insert into @temp
values ('384844033434'), ('743423547878'), ('111224678885')
select dbo.MixUpCharacters(col1) col1
from @temp请参阅SQL Fiddle with Demo
结果将是:
| COL1 |
----------------
| 384XXXXXX434 |
| 743XXXXXX878 |
| 111XXXXXX885 |或者这里有一种使用递归CTE的方法:
;with data(col1) as
(
select '384844033434'
union all
select '7434235878'
union all
select '111224678885'
),
s1 (col1, repfull) as
(
select col1,
SUBSTRING(col1, 4, len(col1)-6) repfull
from data
),
s2 (col1, item, repfull, r) as
(
select col1,
cast('x' as varchar(max)),
right(repfull, LEN(repfull)-1),
repfull
from s1
union all
select col1,
'x'+ cast(item as varchar(max)),
right(repfull, LEN(repfull)-1),
r
from s2
where len(repfull) >0
)
select REPLACE(col1, r, item) newValue
from
(
select col1, item, R,
ROW_NUMBER() over(partition by col1 order by len(item) desc) rn
from s2
) src
where rn = 1请参阅SQL Fiddle with Demo
发布于 2012-12-13 05:40:15
一个简单的select查询将只返回表上的内容,而不管它是否加密。
所以,我认为你不能在数据库级别上这样做。
根据您的要求,您需要在应用程序中使用双向加密算法,因此您可以在将数据加密保存在数据库中之前对其进行加密,然后从数据库中获取加密信息并在应用程序中对其进行解密。
https://stackoverflow.com/questions/13848872
复制相似问题