Ich bin eine Client-Anwendung erstellt, die alle Werte verschlüsseln und entschlüsseln mit Always Encryption.Einfügen in Tabelle über gespeicherte Prozedur von Client-Anwendung mit immer verschlüsselten AzureKey-Vault
Ich habe Azure Key Vault verwendet, um meine Schlüssel zu speichern. Ich habe this gefolgt. Es funktionierte für mich in Ordnung mit der fest codierten Abfrage (INSERT INTO ....)
Aber wenn ich mit einer gespeicherten Prozedur versuchte, hat es nicht funktioniert. Ich habe bereits auf diese Stack Post verwiesen. Aber die Lösung/Antwort hat meine Probleme leider nicht gelöst. Also habe ich beschlossen, eine neue Frage zu öffnen.
Dies ist mein C# -Code
SqlCommand cmd = _sqlconn.CreateCommand();
// Use parameterized SQL to insert the data
cmd.CommandText = @"INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (@SSN, @FirstName, @LastName, @BirthDate);";
SqlParameter paramSSN = cmd.CreateParameter();
paramSSN.ParameterName = @"@SSN";
paramSSN.SqlDbType = SqlDbType.Char;
paramSSN.DbType = DbType.AnsiStringFixedLength;
paramSSN.Direction = ParameterDirection.Input;
paramSSN.Value = ssn;
paramSSN.Size = 11;
cmd.Parameters.Add(paramSSN);
SqlParameter paramFirstName = cmd.CreateParameter();
paramFirstName.ParameterName = @"@FirstName";
paramFirstName.DbType = DbType.String;
paramFirstName.Direction = ParameterDirection.Input;
paramFirstName.Value = firstName;
paramFirstName.Size = 50;
cmd.Parameters.Add(paramFirstName);
SqlParameter paramLastName = cmd.CreateParameter();
paramLastName.ParameterName = @"@LastName";
paramLastName.DbType = DbType.String;
paramLastName.Direction = ParameterDirection.Input;
paramLastName.Value = lastName;
paramLastName.Size = 50;
cmd.Parameters.Add(paramLastName);
SqlParameter paramBirthdate = cmd.CreateParameter();
paramBirthdate.ParameterName = @"@BirthDate";
paramBirthdate.SqlDbType = SqlDbType.Date;
paramBirthdate.Direction = ParameterDirection.Input;
paramBirthdate.Value = birthdate;
cmd.Parameters.Add(paramBirthdate);
cmd.ExecuteNonQuery();
Als ich für die Verwendung der gespeicherten Prozedur ein wenig verändert. Es wirft Fehler wie
Zusätzliche Informationen: Operand Typ Zusammenstoß: char mit VARCHAR inkompatibel ist (20), verschlüsselt mit (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = ‚TestDB ‚) collation_name = 'SQL_Latin1_General_CP1_CI_AS'
string execute = @"[dbo].[insertsp]";
SqlCommand cmd = new SqlCommand(execute, _sqlconn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter paramSSN = cmd.CreateParameter();
paramSSN.ParameterName = @"@SSN";
paramSSN.SqlDbType = SqlDbType.Char;
paramSSN.DbType = DbType.AnsiStringFixedLength;
paramSSN.Direction = ParameterDirection.Input;
paramSSN.Value = ssn;
paramSSN.Size = 11;
cmd.Parameters.Add(paramSSN);
SqlParameter paramFirstName = cmd.CreateParameter();
paramFirstName.ParameterName = @"@FirstName";
paramFirstName.DbType = DbType.String;
paramFirstName.Direction = ParameterDirection.Input;
paramFirstName.Value = firstName;
paramFirstName.Size = 50;
cmd.Parameters.Add(paramFirstName);
SqlParameter paramLastName = cmd.CreateParameter();
paramLastName.ParameterName = @"@LastName";
paramLastName.DbType = DbType.String;
paramLastName.Direction = ParameterDirection.Input;
paramLastName.Value = lastName;
paramLastName.Size = 50;
cmd.Parameters.Add(paramLastName);
SqlParameter paramBirthdate = cmd.CreateParameter();
paramBirthdate.ParameterName = @"@BirthDate";
paramBirthdate.SqlDbType = SqlDbType.Date;
paramBirthdate.Direction = ParameterDirection.Input;
paramBirthdate.Value = birthdate;
cmd.Parameters.Add(paramBirthdate);
cmd.ExecuteNonQuery();
das ist mein Schema nach der Verschlüsselung
CREATE TABLE [dbo].[patients]
(
[ssn] [varchar](20) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
[FirstName] [varchar](50) NULL,
[LastName] [varchar](50) NULL,
[BirthDate] [datetime] NULL
)
aktiviert
(PS: Ich habe bereits die Spaltenverschlüsselungseinstellung = aktiviert in meiner Verbindungszeichenfolge aktiviert. Auch versucht mit EXEC sys.sp_refresh_parameter_encryption @name = '[dbo].[sp]'
- funktioniert nicht für mich)