我想知道SQL客户端如何在向SQL Server发送数据之前知道要加密哪些列?毕竟,加密设置是在SQL Server中管理的。
在de-EF元数据中没有这些设置的痕迹。此外,我发现可以更改列的加密设置,而无需部署更新版本的应用程序。
上下文:
- 关于始终加密的Microsoft文档
- SQL Server 2017
- EF Core 3.1客户端
SQL Server Profiler揭示了客户端用来推断哪些列被加密的机制。
在这种情况下,我更新用户42的活动标志。
首先,客户端发送以下查询:
exec sp_describe_parameter_encryption N'SET NOCOUNT ON;
UPDATE [Users] SET [Active] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 bit'
这将返回两个加密上带有元数据的结果集:
第一个有以下列:
- column_encryption_key_ordinal
- 数据库id
- column_encryption_key_id
- column_encryption_key_version
- column_encryption_key_metadata_version
- 列加密密钥加密值
- column_master_key_store_provider_name
- column_master_key_path
- 列加密密钥加密算法名称
第二个有以下列:
- 参数_常规
- 参数名称
- 列加密算法
- 列加密类型
- column_encryption_key_ordinal
- column_encryption_nnormalization_rule_version
后面是实际的更新查询:
exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Users] SET [Active] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 bit',@p1=42,@p0=1
在我的情况下,这一列没有实际的加密,所以sp_describe_parameter_encryption
的结果不是很有趣,但机制很清楚。
SELECT查询前面没有这样的元查询。