12

SQL Server 2008 を使用しています。

クエリの出力データを文字マスクしたいと思います。

これは、選択を行うときのテーブルの列からの私のデータです:

column1

384844033434

743423547878

111224678885

次のような出力が必要です。

column1

384xxxxxx434

743xxxxxx878

111xxxxxx885

これどうやってするの?

4

9 に答える 9

10

ビューを使用し、基になるテーブルへのすべてのユーザーの 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-12T21:45:13.130 に答える
2

データのフィールドの長さがわかっている場合は、他の回答が生成する静的バージョンを使用できますが、これを生成する関数をいつでも作成できます。

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 を参照してください

于 2012-12-12T22:01:39.327 に答える
1

単純な選択クエリは、暗号化されているかどうかに関係なく、テーブルにあるものだけを返します。

したがって、データベースレベルでこれを行うことはできないと思います。

要件に応じて、アプリケーションで使用する双方向暗号化アルゴリズムが必要になるため、データベースに暗号化して保存する前にデータを暗号化し、データベースから暗号化された情報を取得してアプリケーションで復号化できます。

于 2012-12-12T21:40:15.397 に答える
1

フィールドの長さがわからないフィールドをマスクしたい場合。次のように 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
于 2016-01-13T09:04:45.480 に答える
0
concat('XXXXXXXXX',right(aadharno,4)) as aadharno

右から 4 番目の aadhar 番号をマスクします。

于 2022-02-21T05:44:16.673 に答える