繁体   English   中英

在SQL Server 2008中匿名化ID值的最佳方法是什么

[英]What is the best way to anonymize ID values in sql server 2008

我在SQL 2008中有2张表

Table1
Id    Name Surname City   
1000  Alex White   London
1001  John Brown   Brussels
..

Table2
Id  Surgeon  Room  aId
1   Mike J.  A104  1000
2   Jack S.  C144  1001
...

我有一个查询,如:

Select a.Id,b.Id,
       a.Name,a.Surname,a.City,b.Surgeon,b.Room
into #results
from Table1 a
inner join Table2 b on a.Id = b.aId

我想要做的是通过使用虚拟值而不是真实值来匿名化a.Id和b.Id值的隐私。 我之前添加了随机数学运算,例如:

Select aId = a.Id * 22 / 5 + 14 * 2
      ,bId = b.Id * 12 / 4 + 7 * 3
       ...

但老实说,我对自己在这里所做的事情并不满意,我正在寻找一种更专业的方法来提供此服务。 任何意见,将不胜感激。

如果不需要确保匿名ID是唯一的,并且不需要基于匿名ID查找真实的ID,则可以将CheckSum()HashBytes()函数与Table1和表2:

Select aId = CheckSum(a.Name + a.Surname) % 10000
      ,bId = HashBytes('SHA1', b.Surgeon) % 10000
      ,a.Name,a.Surname,a.City,b.Surgeon,b.Room
into #results
from Table1 a
inner join Table2 b on a.Id = b.aId

如果需要确保表中的每个Id值都有唯一的值,并且还需要基于匿名ID查找真实的ID,则可以按以下方式构造查找表:

CREATE TABLE Anon
    (
    ID        INTEGER NOT NULL PRIMARY KEY,
    AnonID    UNIQUEIDENTIFIER DEFAULT NewID()
    );

然后可以在不返回实际ID的查询中使用它:

Select aID = Anona.AnonID,
       bID = Anonb.AnonID,
       a.Name,a.Surname,a.City,b.Surgeon,b.Room
   into #results
   from Table1 a inner join Table2 b on a.Id = b.aId
   inner join Anon Anona on a.Id = Anona.Id
   inner join Anon Anonb on b.Id = Anonb.Id

将需要维护Anon表,以确保它包含表1和表2中的所有ID。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM