T-SQL将数据插入加密列
基于大量研究,我下面的存储过程似乎可以工作。但是,无论是直接在SQLServer17中调用还是通过ADO连接调用,我都会遇到此错误 从数据类型varchar到varchar(255)加密的隐式转换 使用(加密类型='DETERMINISTIC',加密算法名称= “AEAD_AES_256_CBC_HMAC_SHA_256”,列\u加密\u密钥\u名称= “AutoStripes\u Machine\u CEK”,列\u encryption\u key\u database\u name= “AutoStripes”)排序规则\u name='SQL\u Latin1\u General\u CP1\u CI\u AS'不可用 允许 我启用了T-SQL将数据插入加密列,sql,sql-server,encryption,ado,Sql,Sql Server,Encryption,Ado,基于大量研究,我下面的存储过程似乎可以工作。但是,无论是直接在SQLServer17中调用还是通过ADO连接调用,我都会遇到此错误 从数据类型varchar到varchar(255)加密的隐式转换 使用(加密类型='DETERMINISTIC',加密算法名称= “AEAD_AES_256_CBC_HMAC_SHA_256”,列\u加密\u密钥\u名称= “AutoStripes\u Machine\u CEK”,列\u encryption\u key\u database\u name= “A
Column Encryption Setting=Enabled
,并为始终加密的签入查询选项启用参数化,并且我在使用的机器上有密钥
存储过程如下所示。我使用游标是因为不可能对临时表AFAIK进行加密,所以我想参数化VIN和插入记录后对这些字段执行update语句的位置条件
USE AutoSTripes;
GO
CREATE PROCEDURE [dbo].[loadVehicles] (@xmlString XML)
AS
BEGIN
DECLARE @tempVehs TABLE
(
[ProductNo] [bigint],
[VersionNo] [bigint],
[DateAdded] [smalldatetime],
[UserID] [varchar](255),
[VehicleYear] [varchar](255),
[Make] [varchar](255),
[Model] [varchar](255),
[VINNumber] [varchar](255), -- matches column that is encrypted
-- .... more columns
[VehicleSeqNo] [bigint],
[CollDed] [varchar](255)
)
INSERT INTO @tempVehs
SELECT
XD.xTbl.value('./Product[1]', 'bigint') as ProductNo
,XD.xTbl.value('./Version[1]', 'bigint') as VersionNo
,XD.xTbl.value('./DateAdded[1]', 'smalldatetime') as DateAdded
,XD.xTbl.value('./UserID[1]', 'varchar(255)') as UserID
,XD.xTbl.value('./VehYear[1]', 'varchar(255)') as VehiclYear
,XD.xTbl.value('./Make[1]', 'varchar(255)') as Make
,XD.xTbl.value('./Model[1]', 'varchar(255)') as Model
,XD.xTbl.value('./Vin[1]', 'varchar(255)') as VinNumber
-- ... more columns
,XD.xTbl.value('./SeqNo[1]', 'bigint') as VehicleSeqNo
,XD.xTbl.value('./CollDed[1]', 'varchar(255)') as CollDed
FROM
@xmlString.nodes('//VehicleList/Vehicle') AS XD(xTbl)
INSERT INTO dbo.tVehicle
(ProductNo, VersionNo, DateAdded, UserID, VehicleYear, Make, Model, GLCity, GLState, GLZip, VehicleType, Radius, Class, VehicleSeqNo, PIP, AddlPIP, MedPay, UMUIM, UMPD, OTCCov, OTCDed, ACVorStated, CollCov, CollDed)
SELECT
ProductNo, VersionNo, DateAdded, UserID, VehicleYear, Make, Model, GLCity, GLState, GLZip, VehicleType, Radius, Class, VehicleSeqNo, PIP, AddlPIP, MedPay, UMUIM, UMPD, OTCCov, OTCDed, ACVorStated, CollCov, CollDed
FROM
@tempVehs
-- loop temp table and update VIN for each unique record
DECLARE @vin varchar(255)
DECLARE @product bigint
DECLARE @version bigint
DECLARE @sequence bigint
DECLARE @curs CURSOR
BEGIN
SET @curs = CURSOR FOR SELECT ProductNo, VersionNo, VinNumber, VehicleSeqNo FROM @tempVehs
OPEN @curs
FETCH NEXT FROM @curs INTO @product, @version, @vin, @sequence
Set @product = @product
Set @version = @version
Set @vin = @vin
Set @sequence = @sequence
UPDATE dbo.tVehicle SET VINNumber = @vin WHERE ProductNo = @product AND VersionNo = @version and VehicleSeqNo = @sequence
END
close @curs
deallocate @curs
END
GO
我错过了什么?还是根本不可能?您的XML文档是否包含加密数据?如果没有,那么它就不会工作。SQL Server无法在本地加密/解密数据(这项技术的全部要点),因为它不包含加密数据@alex。谢谢我认为这就是答案。您的XML文档是否包含加密数据?如果没有,那么它就不会工作。SQL Server无法在本地加密/解密数据(这项技术的全部要点),因为它不包含加密数据@alex。谢谢我觉得这就是答案。