如何使用SqlBulkCopy填充数据库中的加密列?

时间:2016-04-17 11:55:49

标签: c# sql-server database encryption sqlbulkcopy

我正在使用SqlBulkCopySystem.Data.Datatable将数据插入我的数据库。我正在做这样的事情:

var table = new DataTable();

// Creating table schema
var newRow = table.NewRow();
newRow["FirstName"] = Parser.Parse(values[0])
newRow["LastName"] = Parser.Parse(values[1])
...
newRos["SSN"] = //here I need to encrypt by db certificate value[5] before set it to this row value

简单复制到db代码:

using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
    bulkCopy.BatchSize = 100;
    bulkCopy.DestinationTableName = "dbo.Member";
    try
    {    
        bulkCopy.WriteToServer(table);
    }
    catch (Exception)
    {
        transaction.Rollback();
        connection.Close();
        throw;
    }
}

当然我可以稍后使用数据库中的存储过程设置加密列,但我想在一个事务中执行此操作。是否可以使用代码中的数据库加密string值?

提前致谢!

1 个答案:

答案 0 :(得分:1)

正如我所看到的,您可以选择以下选项之一(应该很容易实现):

使用C#代码进行加密

由于您拥有所有数据,因此可以使用.NET Framework相关类在那里进行加密。您可以测试它并确保获得相同的结果。

使用AFTER INSERT触发器

添加值后,您将修改并添加加密数据。触发器将是同一事务的一部分。只需使用CREATE TRIGGER语句创建一个新的触发器,检查该值是否为NULL,然后使用SQL语句放入加密值。

例如:

CREATE TRIGGER [dbo].[myTrigger]
   ON  [dbo].[Members] 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    UPDATE Members
    SET [EncryptedSSN] = EncryptByKey(Key_GUID('SSN_Key'), inserted.SSN)
    FROM inserted 
    INNER JOIN dbo.Members On inserted.id = Members.id
END 

希望这有帮助。