2012-06-26 3 views
3

우리는 많은 양의 큰 데이터베이스를 가지고 있습니다. 최근에 판매 및 출하 부서에서 고객의 신용 카드 번호를 공개하는 데 애플리케이션의 일부를 사용하고 있음을 알게되었습니다. 우리는 그걸 막을 수 있었지만 지금은 숫자가있는 수천 개의 행이 있습니다.신용 카드 번호 찾기 및 바꾸기

우리는 행의 16 자리 (대시 분리)에서 특정 열을 스캔하고이를 X로 바꾸는 방법을 알아 내려고하고 있습니다.

카드 번호가 많은 양의 텍스트에 저장되므로 간단한 UPDATE 문은 아닙니다. 지금까지 SQL Server가 정규식을 사용할 수 있는지 파악하지 못했습니다.

그 밖의 모든 것이 내가 제일 잘하는 것이기 때문에 PHP를 통해이 모든 것을 실패합니다.하지만 고통 스러울 것입니다.

+2

이것은 응용 프로그램 코드가 처리하기 쉬운 경향이있는 종류입니다. 당신 말이 맞아, 레 전의 길을가는 것 같아. 당신은 C#에서 그것을 할 수 있고 그것을 CLR에 저장된 proc에 넣어서 SSMS에서 쉽게 실행할 수 있습니다. 안타깝게도 텍스트 필드에 있기 때문에 잠재적으로 나쁜 레코드를 확인한 다음 다른 레코드를 수동으로 검사해야 할 수 있습니다. 결국 부품 번호도 올바른 숫자로 끝날 수 있습니다. 데이터 입력을 한 사람이 수동 검사를하는 사람이 아닌 것이 좋습니다. – HLGEM

+0

카드 번호가있는 레코드의 단서로 크레디트 카드, 카드 번호, CCN을 검색 할 수도 있습니다. – HLGEM

+0

나는 HLGEM에 동의합니다. 또한 향후 이러한 문제를 방지하려면 프런트 엔드에 유효성 검사를 추가하는 것이 좋습니다. 사용자에게 카드 번호가 입력되지 않았 음을 감지하고 배지 스캔 또는 감독관이 요구하는 것을 요구할 수 있습니다. 그렇게하면 나중에 문제가 될 가능성이 줄어 듭니다. –

답변

3

몇 가지 다른 형식. 모든 신용 카드 번호가 16 자리 숫자로되어있는 것은 아닙니다 (Amex는 15, Visa는 13 또는 16 등).

가능한 경우 다양한 정규 표현식을 검사하고 코드의 유효성을 검사하는 기능은 정리 작업 레벨에서 가장 잘 제공 될 수 있습니다.

3

PATINDEX를 WHERE LIKE 절과 함께 사용해야하는 것처럼 들립니다.

이와 비슷한 것. 비슷한 것을 가지고 저장된 proc 파일을 생성 한 다음, 모든 인스턴스를 대체 할 때까지 식별 한 여러 매개 변수 (@pattern & @patternlength the params)를 사용하여 호출하십시오.

declare @pattern varchar(100), @patternlength int 
set @pattern = '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' 
set @patternlength = 19 

update tableName 
set fieldName = 
    LEFT(fieldName, patindex('%'+ @pattern + '%', fieldName)-1) 
    + 'XXXX-XXXX-XXXX-XXXX' 
    + SUBSTRING(fieldName, PATINDEX('%'+ @pattern + '%', fieldName)[email protected], LEN(fieldName)) 
from tableName 
where fieldName like '%'+ @pattern + '%' 

비결은 적절한 패턴을 발견하고 해당 @patternlength 값을 설정하는 것입니다 (하지 작동하지 않습니다와 @pattern의 길이를!)

1

즉석의 답변입니다.

다음은 @maskPattern의 모든 항목을 @text에서 찾아 'x'로 바꿉니다. 예 : @maskPattern = XXXX-XXXX-XXXX-XXXX 인 경우 @text에서이 패턴을 찾아 모든 발생을 XXXX-XXXX-XXXX-XXXX로 바꿉니다. 발견되지 않으면 그대로 텍스트를 남겨 둡니다.

이 저장 프로 시저를 조작하여 maskPattern의 시작 부분의 3/4 만 마스크 할 수도 있습니다. 건배!

ALTER PROCEDURE [dbo].[SP_MaskCharacters] @text nvarchar(max), 
    @maskPattern nvarchar(500) 
    AS 
    BEGIN 
    DECLARE @numPattern nvarchar(max) = REPLACE(@maskPattern, 'x', '[0-9]') 
    DECLARE @patternLength int = LEN(@maskPattern) 
    WHILE (@text IS NOT NULL) 
    BEGIN 
    IF PATINDEX('%' + @numPattern + '%', @text) = 0 BREAK; 
    SET @text = 
    LEFT(@text, PATINDEX('%' + @numPattern + '%', @text)-1) --Get beginning chars of the input text until first occurance of pattern is found 
    + @maskPattern --Append aasking pattern 
    + SUBSTRING(@text, PATINDEX('%' + @numPattern + '%', @text) + @patternLength, LEN(@text)) -- Get & append rest of the text found after masking attern 
    END 
    SELECT @text 
END