2012-12-12 19 views
7

पर कैरेक्टर मास्क आउटपुट डेटा मैं SQL Server 2008 का उपयोग कर रहा हूं।चुनिंदा

मैं क्वेरी के आउटपुट डेटा को मास्क करना चाहता हूं।

column1 

384xxxxxx434 

743xxxxxx878 

111xxxxxx885 

मैं यह कैसे कर सकते हैं:

column1 

384844033434 

743423547878 

111224678885 

मैं इस तरह एक आउटपुट चाहते हैं:

यह एक मेज पर एक स्तंभ से अपने डेटा जब एक का चयन कर रही है?

+2

लग रहा है जैसे आप [चरित्र मास्किंग] के बारे में बात कर रहे हैं (http: //www.simple-talk।एन्क्रिप्शन –

+0

हाँ के बजाय com/sql/डेटाबेस-प्रशासन/obfuscating-your-sql-server-data /) हाँ मास्किंग – pyram

उत्तर

7

आपको एक दृश्य का उपयोग करना होगा, और सभी उपयोगकर्ताओं को अंतर्निहित तालिका तक पहुंच का चयन करना होगा।

आपका दृश्य की तरह

SELECT 
    SUBSTRING(x.SecurityNumber,1,3) + 
    'xxxxx' + 
    SUBSTRING(x.SecurityNumber,LEN(x.SecurityNumber) - 2, LEN(x.SecurityNumber)) 
    AS column1 
FROM underlyingTable x 

कुछ ऐसा दिखाई देगा फिर आप बाहर जिस तरह से आप वर्णित में नकाबपोश सिर्फ इस देखने के लिए चुनें पहुँच अपने उपयोगकर्ताओं को अनुदान और हो सकता था।

यदि आप चाहते थे कि आपका क्लाइंट सॉफ़्टवेयर इस तालिका में डेटा डालने या अपडेट करने में सक्षम हो, तो आप आधार तालिका को अपडेट करने के लिए INSTEAD INSTERT या अद्यतन ट्रिगर के इंस्टॉलेशन का उपयोग करेंगे।

+0

धन्यवाद और उत्तर के लिए सभी को धन्यवाद! – pyram

+0

मैं SQL सर्वर 2008 के लिए sqlcmd का उपयोग कर रहा हूं और पाया कि ऑफसेट अलग हैं। सही आउटपुट के लिए, मैंने 'सबस्ट्रिंग (x.SecurityNumber, 1,3) + 'xxxxx' + सबस्ट्रिंग (x.SecurityNumber, LEN (x.SecurityNumber) - 2, LEN (x.SecurityNumber))' – David

+0

धन्यवाद @ डेविड का उपयोग किया। तदनुसार संपादित करें। –

1

एक साधारण चयन क्वेरी तालिका पर जो कुछ भी है, वह वापस आ जाएगी, इससे कोई फर्क नहीं पड़ता कि यह एन्क्रिप्ट किया गया है या नहीं।

तो, मुझे लगता है कि आप इसे डेटाबेस स्तर पर नहीं कर सकते हैं।

आपकी आवश्यकता के लिए, आप अपने आवेदन में उपयोग करने के लिए एक द्विदिश एन्क्रिप्शन एल्गोरिथ्म की जरूरत है ताकि आप बचत यह डेटाबेस पर एन्क्रिप्टेड से पहले डेटा एन्क्रिप्ट कर सकते हैं, और डेटाबेस से एन्क्रिप्टेड जानकारी प्राप्त करने और अपने applicaition पर उसे डिक्रिप्ट जाएगा।

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 with Demo

परिणाम होगा:

;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 

:

|   COL1 | 
---------------- 
| 384XXXXXX434 | 
| 743XXXXXX878 | 
| 111XXXXXX885 | 

या यहाँ पुनरावर्ती CTE के साथ यह करने के लिए एक रास्ता है देखें SQL Fiddle with Demo

1

बहुत सरल भाई

SELECT CONCAT (SUBSTR('Your string',1,3),LPAD(SUBSTR('Your string',-3),LENGTH('Your string')-1,'*')) RESULT FROM dual 

उत्पादन:

आप

ing ******* अगर यह होता है num प्रकार char

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 
0

SQL Server 2016+ से आप Dynamic Data Masking सुविधा का उपयोग कर सकते हैं।

गतिशील डेटा मास्किंग गैर-विशेषाधिकार प्राप्त उपयोगकर्ताओं को मुखौटा करके संवेदनशील डेटा एक्सपोजर को सीमित करता है। गतिशील डेटा मास्किंग ग्राहकों को यह निर्धारित करने के लिए संवेदनशील डेटा तक अनधिकृत पहुंच को रोकने में मदद करता है कि कितना संवेदनशील डेटा एप्लिकेशन परत पर न्यूनतम प्रभाव के साथ प्रकट होता है। यह एक डेटा सुरक्षा सुविधा है जो निर्दिष्ट डेटाबेस फ़ील्ड पर क्वेरी के परिणाम सेट में संवेदनशील डेटा को छुपाती है, जबकि डेटाबेस में डेटा नहीं बदला जाता है। डायनामिक डेटा मास्किंग मौजूदा अनुप्रयोगों के साथ उपयोग करना आसान है, क्योंकि मास्किंग नियम क्वेरी परिणामों में लागू होते हैं। कई एप्लिकेशन मौजूदा प्रश्नों को संशोधित किए बिना संवेदनशील डेटा मास्क कर सकते हैं।

CREATE TABLE #tab(ID INT IDENTITY(1,1), column1 VARCHAR(12)); 

INSERT INTO #tab(column1) 
VALUES('384844033434'),('743423547878'),('111224678885'); 

SELECT * FROM #tab; 

आउटपुट:

╔════╦══════════════╗ 
║ ID ║ column1 ║ 
╠════╬══════════════╣ 
║ 1 ║ 384844033434 ║ 
║ 2 ║ 743423547878 ║ 
║ 3 ║ 111224678885 ║ 
╚════╩══════════════╝ 

ALTER TABLE #tab 
ALTER COLUMN column1 VARCHAR(12) MASKED WITH (FUNCTION = 'partial(3,"xxxxxx",3)'); 

SELECT * FROM #tab; 

आउटपुट:

╔════╦══════════════╗ 
║ ID ║ column1 ║ 
╠════╬══════════════╣ 
║ 1 ║ 384xxxxxx434 ║ 
║ 2 ║ 743xxxxxx878 ║ 
║ 3 ║ 111xxxxxx885 ║ 
╚════╩══════════════╝ 

LiveDemo

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^