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

时间:2017-03-14 17:09:03

标签: sql sql-server 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
       ...
但老实说,我在这里做的并不是很开心,我正在寻找更专业的方式来提供这个。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您不需要确定匿名ID是唯一的,并且您不需要根据匿名ID找到真实ID,则可以使用CheckSum()或{{ 3}}使用Table1和Table2中的字符串函数:

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表以确保它包含Table1和Table2中的所有ID。