sql - 始终加密不适用于存储过程
问题描述
我在 Sql 2016 中使用 Always Encrypt 选项。我已经使用 MVC 应用程序将 SQL 与实体框架连接起来。我已按照以下链接中的说明加密了该列。 https://www.codeproject.com/Articles/1110564/Always-Encrypted-feature-in-SQL-Server 我可以通过实体框架使用插入查询插入数据。但我无法使用存储过程插入数据。
表格详情如下。
create table Team(Id int not null primary key identity, Name nvarchar(100))
注意:如果我们将列长度更改为 nvarchar(max) 存储过程可以正常工作。
我们有一个现有的数据库。我们不应该更改现有数据库中的任何内容。在不影响 GDPR 合规性的现有数据库结构的情况下,使用 Always 加密的最佳方式是什么?
代码示例
存储过程
USE [EncryptTest]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Insert_Team]
@full_name nvarchar(100)
As
BEGIN
INSERT INTO Team (Name)
VALUES (@full_name)
END
在职的
using (var cont = new EncryptTestEntities())
{
Teamt = new EncrypTTest.Team();
t.Name = "Melody";
t.Email = "melody@gmail.com";
cont.Teams.Add(t);
cont.SaveChanges();
}
不工作
using (var cont = new EncryptTestEntities())
{
cont.Insert_Team("Melody");
}
通过存储过程插入数据时出错
Operand type clash: nvarchar(4000) encrypted with
(encryption_type = 'DETERMINISTIC', encryption_algorithm_name =
'Algorithm Name', column_encryption_key_name = 'keyName',
column_encryption_key_database_name = 'SampleEncryption') is
incompatible with nvarchar(100) encrypted with (encryption_type =
'DETERMINISTIC', encryption_algorithm_name = 'Algorithm Name',
column_encryption_key_name = 'keyName',
column_encryption_key_database_name = 'SampleEncryption')
解决方案
当您创建存储过程以支持始终加密时,您必须确保在创建存储过程中遵循以下内容
存储过程参数的数据类型和大小应与表的列相同 例如:参数@full_name的数据类型和大小应与列名称相同
您必须将参数值重新分配给新参数,并将新参数用于 SP,如下例所示。前任:
ALTER PROCEDURE [dbo].[Insert_Team] @full_name nvarchar(100) As BEGIN DECLARE @full_name_ nvarchar(100) = @full_name INSERT INTO Team (Name) VALUES (@full_name_) END
推荐阅读
- python-3.x - (Python 3 / OpenCV) cv2.imwrite 返回一个布尔值而不是图像对象
- svg - SVG textPath 中的文本在 iOS 浏览器中不可见
- java - 如何让我的 Android Room 数据库重新填充?
- php - 有没有办法在 Laravel 模板中嵌套 {{}} 表达式?
- c - 在c中生成条形码BMP
- c# - 返回一个数组在 C# 中操作原始值
- java - 获取数据库中另一个User类型的userId
- macos - 无法使用 pypy3 在 macOS 上编译 wxpython-cffi
- spring-batch - 弹簧分区未按预期执行
- css - 渐变动画 - 防止“跳过”