2

セキュリティ要件を満たすために、データベースを開発者に提供する前に、 SSNを一意のランダムな 9 桁の数字に置き換える方法を見つける必要があります。SSN は、データベースのテーブルの列にあります。上記のテーブルには数万の行がある場合があります。番号にハイフンは必要ありません。私はSQLとプログラミング全般の初心者です。

特定のニーズに対する解決策を見つけることができませんでした。何も正しくないようです。しかし、私が見逃したスレッドを知っている場合は、お知らせください。

助けてくれてありがとう!

4

5 に答える 5

8

これが1つの方法です。

この更新は元に戻すことができないため、実際のデータのバックアップが既にあると想定しています。

以下では、テーブル名がPersonで、 ssn 列がSSNという名前であると想定しています。

UPDATE Person SET 
SSN = CAST(LEFT(CAST(ABS(CAST(CAST(NEWID() as BINARY(10)) as int)) as varchar(max)) + '00000000',9) as int)
于 2012-12-31T19:39:15.973 に答える
2

ランダムである必要がない場合は、昇順の数値に置き換えることができます。そうしないと、乱数を生成する必要があります。お気づきかもしれませんが、RAND 関数はクエリ ステートメント (select、update など) ごとに 1 つの値しか生成しません。これを回避するには、newid() 関数を使用します。この関数は、クエリによって生成された各行の GUID を生成します (SELECT newid() from MyTableこれを実行して動作を確認してください)。これを checksum() でラップして整数を生成します。SSN 範囲 (0 ~ 999,999,999) 内の値を取得するために 1,000,00,000 倍する係数。そして、それを char(9) プレフィックスとして先行ゼロで保存していると仮定します。

次のトリックは、テーブル内のすべての値に対して一意であることを確認することです。これはややこしいので、値を含む一時テーブルを設定し、値を入力してから、それらをコピーすることでそれを行います。賃借人は今…</p>

DECLARE @DummySSN as table
 (
   PrimaryKey  int      not null
  ,NewSSN      char(9)  not null
 )


--  Load initial values
INSERT @DummySSN 
 select
   UserId
  ,right('000000000' + cast(abs(checksum(newid()))%1000000000 as varchar(9)), 9)
 from Users

--  Check for dups
select NewSSN from @DummySSN group by NewSSN having count(*) > 1

--  Loop until values are unique
IF exists (SELECT 1 from @DummySSN group by NewSSN having count(*) > 1)
    UPDATE @DummySSN
     set NewSSN = right('000000000' + cast(abs(checksum(newid()))%1000000000 as varchar(9)), 9)
     where NewSSN in (select NewSSN from @DummySSN group by NewSSN having count(*) > 1)

--  Check for dups
select NewSSN from @DummySSN group by NewSSN having count(*) > 1

これは私が持っている小さなテーブルで機能し、大きなテーブルでも機能するはずです。これが無限ループに変わるとは思いませんが、それでも、10回の反復後にループを終了するチェックを追加したい場合があります。

于 2012-12-31T19:42:10.623 に答える
0

要件がデータベースを難読化することである場合、ルックアップや変換を行うことなく、出力の参照整合性を維持する任意のテーブル内の個別の SSN ごとに同じ一意の値が返されます。

       SELECT CAST(RAND(SSN)*999999999 AS INT)
于 2016-08-31T14:38:25.900 に答える
0

これで数百万回のテストを実行しましたが、ランダムな (URN) 9 桁の数字 (先行ゼロなし) を生成するようです。これを行うためのより効率的な方法は考えられません。

SELECT CAST(FLOOR(RAND(CHECKSUM(NEWID())) * 900000000 ) + 100000000 AS BIGINT)

使用したテスト。

;WITH Fn(N) AS
(
    SELECT CAST(FLOOR(RAND(CHECKSUM(NEWID())) * 900000000 ) + 100000000 AS BIGINT)
    UNION ALL
    SELECT CAST(FLOOR(RAND(CHECKSUM(NEWID())) * 900000000 ) + 100000000 AS BIGINT)
    FROM Fn
)
,Tester AS
(
    SELECT TOP 5000000 *
    FROM Fn
)
SELECT   LEN(MIN(N))
        ,LEN(MAX(N)) 
        ,MIN(N)
        ,MAX(N)
FROM Tester
OPTION (MAXRECURSION 0)
于 2012-12-31T20:03:04.520 に答える
0

それほど速くはありませんが、最も簡単です...いくつかのドットを追加しました...

DECLARE @tr NVARCHAR(40)
SET @tr = CAST(ROUND((888*RAND()+111),0) AS CHAR(3)) + '.' + 
    CAST(ROUND((8888*RAND()+1111),0) AS CHAR(4)) + '.' + CAST(ROUND((8888*RAND()+1111),0) AS
    CHAR(4)) + '.' + CAST(ROUND((88*RAND()+11),0) AS CHAR(2))
PRINT @tr
于 2014-06-16T13:28:04.407 に答える