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

How to fill encrypted columns in database using 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

并简单复制到数据库代码:

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 值?

提前致谢!

据我所知,您可以选择以下选项之一(这两个选项都应该很容易实现):

在您的 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 

希望对您有所帮助。