SQL Server 2008 を使用しています。
クエリの出力データを文字マスクしたいと思います。
これは、選択を行うときのテーブルの列からの私のデータです:
column1
384844033434
743423547878
111224678885
次のような出力が必要です。
column1
384xxxxxx434
743xxxxxx878
111xxxxxx885
これどうやってするの?
SQL Server 2008 を使用しています。
クエリの出力データを文字マスクしたいと思います。
これは、選択を行うときのテーブルの列からの私のデータです:
column1
384844033434
743423547878
111224678885
次のような出力が必要です。
column1
384xxxxxx434
743xxxxxx878
111xxxxxx885
これどうやってするの?
ビューを使用し、基になるテーブルへのすべてのユーザーの 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 トリガーを使用してベース テーブルを更新します。
データのフィールドの長さがわかっている場合は、他の回答が生成する静的バージョンを使用できますが、これを生成する関数をいつでも作成できます。
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 を参照してください
結果は次のようになります。
| 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 を参照してください
単純な選択クエリは、暗号化されているかどうかに関係なく、テーブルにあるものだけを返します。
したがって、データベースレベルでこれを行うことはできないと思います。
要件に応じて、アプリケーションで使用する双方向暗号化アルゴリズムが必要になるため、データベースに暗号化して保存する前にデータを暗号化し、データベースから暗号化された情報を取得してアプリケーションで復号化できます。
フィールドの長さがわからないフィールドをマスクしたい場合。次のように bluefeet のコードをアップグレードできます。
ALTER FUNCTION MixUpCharacters
(
@OrigVal varchar(MAX)
)
RETURNS varchar(MAX)
AS
BEGIN
DECLARE @NewVal NVARCHAR(MAX)
DECLARE @OrigLen INT
DECLARE @LoopCt INT
DECLARE @Part NVARCHAR(MAX) = ''
DECLARE @PartLength INT -- MastLength
DECLARE @PartStartIndex INT -- MaskStartIndex
SET @NewVal = ''
SET @LoopCt = 1
SET @OrigLen = LEN(@OrigVal)
IF(@OrigLen = 1)
BEGIN
RETURN 'X'
END
IF(@OrigLen < 6)
BEGIN
SET @PartStartIndex = @OrigLen / 2
SET @PartLength = @OrigLen - @PartStartIndex
SET @Part = SUBSTRING(@OrigVal, @PartStartIndex, @PartLength)
END
ELSE IF(@OrigLen < 8)
BEGIN
SET @PartStartIndex = 3
SET @PartLength = @OrigLen - @PartStartIndex - 1
SET @Part = SUBSTRING(@OrigVal, @PartStartIndex, @PartLength)
END
ELSE
BEGIN
SET @PartStartIndex = 4
SET @PartLength = @OrigLen - @PartStartIndex - 2
SET @Part = SUBSTRING(@OrigVal, @PartStartIndex, @PartLength)
END
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
次のようにテストできます。
SELECT dbo.MixUpCharacters('1')
UNION ALL
SELECT dbo.MixUpCharacters('12')
UNION ALL
SELECT dbo.MixUpCharacters('123')
UNION ALL
SELECT dbo.MixUpCharacters('1234')
UNION ALL
SELECT dbo.MixUpCharacters('12345')
UNION ALL
SELECT dbo.MixUpCharacters('123456')
UNION ALL
SELECT dbo.MixUpCharacters('1234567')
UNION ALL
SELECT dbo.MixUpCharacters('12345678')
UNION ALL
SELECT dbo.MixUpCharacters('123456789')
UNION ALL
select dbo.MixUpCharacters('1234567890')
UNION ALL
select dbo.MixUpCharacters('12345678910')
結果:
X
X2
XX3
1XX4
1XXX5
12XX56
12XXX67
123XX678
123XXX789
123XXXX890
123XXXXX910
concat('XXXXXXXXX',right(aadharno,4)) as aadharno
右から 4 番目の aadhar 番号をマスクします。