2016-04-17 11 views
0

Ich verwende SqlBulkCopy und System.Data.Datatable, um Daten in meine Datenbank einzufügen. Ich mache so etwas wie dieses:Wie füllt man verschlüsselte Spalten in der Datenbank mit SqlBulkCopy?

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 

Und einfache Kopie Code 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; 
    } 
} 

Natürlich habe ich später verschlüsselte Spalte kann eine gespeicherte Prozedur in der Datenbank, aber ich tun möchte, dies in einer Transaktion. Ist es möglich, string Wert mit meinem Zertifikat aus der Datenbank in Code zu verschlüsseln?

Vielen Dank im Voraus!

+0

Warum können Sie den Wert nicht verwenden, um ihn in Ihrem C# -Code zu verschlüsseln? Warum können Sie der DataTable den Wert nicht hinzufügen, nachdem dieser verschlüsselt wurde? –

+0

@Shahar Ich habe einen Hauptschlüssel, Zertifikat mit einem Algorithmus in db. Sind Sie sicher, dass Daten, die aus dem Code verschlüsselt werden, mit Daten kompatibel sind, die mit der Prozedur db entschlüsselt wurden? – user3818229

Antwort

1

Während ich dies sehen Sie eine der folgenden Möglichkeiten wählen (die sowohl einfach zu implementieren sein sollte):

Sie die Verschlüsselung in C# -Code

Da Sie alle haben Daten Dort können Sie die Verschlüsselung mit den relevanten Klassen von .NET Framework vornehmen. Sie können es testen und sicherstellen, dass Sie das gleiche Ergebnis erhalten.

Verwendung AFTER INSERT-Trigger

Nach dem Wert hinzufügen, werden Sie die verschlüsselten Daten ändern und hinzufügen. Der Auslöser wird Teil derselben Transaktion sein. Verwenden Sie einfach die CREATE TRIGGER-Anweisung, um einen neuen Trigger zu erstellen, überprüfen Sie, ob der Wert NULL ist, und legen Sie dann den verschlüsselten Wert mithilfe von SQL-Anweisungen ab.

Beispiel:

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 

Hoffnung, das hilft.

+0

Wenn ich durch den zweiten Weg gehen, meinst du so etwas wie dieses ?: CREATE TRIGGER trigAddMember ON dbo.Member FÜR INSERT AS SET NOCOUNT ON BEGIN; UPDATE [dbo]. [Member] DECLARE @NewSSN VARCHAR (100) SELECT @NewSSN = (SELECT SSN FROM INSERTED-) SET [EncryptedSSN] = EncryptByKey (Key_GUID ('SSN_Key'), i.SSN) UPDATE [ dbo.Member] SET i.SSN = NULL END'? – user3818229

+0

@ user3818229 Ich glaube, Sie haben die UPDATE-Anweisung am Ende vergessen. Sie sollten auch etwas wie UPDATE hinzufügen dbo.Member SET EncryptedSSN = @ NewSSN FROM eingefügt INNER JOIN dbo.Members ON insert.ID = members.ID –

+0

oh sorry, habe es nicht zuerst gesehen. Ja, aber Sie sollten WHERE zur UPDATE-Klausel ass. –

Verwandte Themen