2012-01-27 3 views
1

クレジットカードを隠すために100万件以上のレコードを持つテーブルを更新する必要があります。sqlのクレジットカードをマスクする方法は?

私は最後の4桁を保持しなければならず、残りはXになるはずです。

私がこれまで

BEGIN TRAN 
-- SQL update in batches of 10,000 
WHILE (2 > 1) 
    BEGIN 
    BEGIN TRANSACTION 
    UPDATE TOP (10000) tblMyTable 
    SET creditCardNumber = 'XXXXXX' + RIGHT(creditCardNumber, 4) 
    WHERE myDate < '2010-Feb-02' 

    IF @@ROWCOUNT = 0 
     BEGIN 
     COMMIT TRANSACTION 
     BREAK 
     END 
    COMMIT TRANSACTION 
    -- 1 second delay 
    WAITFOR DELAY '00:00:01' 
    END -- WHILE 
GO 
ROLLBACK 

この思い付くこのかかわらの問題は、明らかに偽のクレジットカードで、でも4桁の数字を持っていない可能性があり、データベース内のレコードが存在しています。基本的にこれを更新する必要があるのは、同じ数のXを追加して最後の4桁を保持することです。 4桁未満の場合は、Xをもう少し追加します。パッドを左

唯一の問題は、いくつかの数字が4文字未満の場合には例

1242 would turn into XXXXXX1242 
12 would turn into XXXXXXXX12 
1234567890 would turn into XXXXXX7890 
+5

表を私に送信してください。私は喜んでお手伝いします:) –

+0

@MikeChristensen LOL。私は無料でお手伝いできるたくさんのロシアのサイトを見つけることができると思います! – Bohemian

+0

あなたが部分文字列を使用してそれを達成できるか疑問に思う。たとえば、最大数の 'xxxx'文字列を作成します。 rihgt(creditcardnumber、4)に長さと部分文字列を使用するよりも簡単です。あなたが思うこと? – AJP

答えて

2
Declare @xx VARCHAR(20) 
DECLARE @length INT 

SET @length = 17 
SET @xx = 'XXXXXXXXXXXXXXXX' 

UPDATE TOP (10000) tblMyTable 
    SET creditCardNumber = SUBSTRING(@xx, 0, @length - len(RIGHT(creditCardNumber, 4))) + RIGHT(creditCardNumber, 4) 
    WHERE myDate < '2010-Feb-02' 

これが解決するかどうかを確認してください。

3

、?

はどのように

右( 'XXXXXXXXXXXX' +の@str、@n)

作品の説明についてはMost efficient T-SQL way to pad a varchar on the left to a certain length?

を参照してください。

+0

これは私の唯一の問題だと思います。私はまだそれがエンドレスループであるかどうかはわかりません。私はそれを実行し、それは私がそこにあると言われた行の数を越えるように見えた。私は実際にIF @@ ROWCOUNT = 0 がループから抜け出すのに満足しているかどうかは確かです。 – chobo2

1
select 
    stuff(account_no,1,len(account_no)-4,REPLICATE('X', LEN(account_no)-4)), 
    account_no, 
    stuff(routing_no,1,len(routing_no)-3,REPLICATE('X', LEN(routing_no)-3)), 
    routing_no 
from dbo.PAYER_BANK_DETAIL