--当前已存在的表,且有数据,结果如下:
CREATE TABLE [dbo].[tmp_ms_xx_Province1] (
[ProvinceId] INT NOT NULL,
[ProvinceName] NVARCHAR (60) NOT NULL,
[Alias] VARCHAR (10) NULL
);
-- 原有的表字段加密前,先把字段长度加长(注意!)
ALTER TABLE Province ALTER COLUMN ProvinceName NVARCHAR(1000);
GO
/*【更注意】加密当前表的字段过程中,会把原来的表删掉替换,如果有特殊作用需谨慎!加密过程如下:
--1.创建同名表
CREATE TABLE [dbo].[tmp_ms_xx_Province1] (
[ProvinceId] INT NOT NULL,
[ProvinceName] NVARCHAR (1000) COLLATE latin1_general_BIN2 ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = [CEK01],
ALGORITHM = N'AEAD_AES_256_CBC_HMAC_SHA_256',
ENCRYPTION_TYPE = RANDOMIZED
) NULL,
[Alias] VARCHAR (10) COLLATE Chinese_PRC_CI_AS NULL,
[tceGuidCol1] UNIQUEIDENTIFIER CONSTRAINT [tmp_ms_xx_constraint_tceGuidCol1_Province_dbo1] UNIQUE
);
--2.原表增加一个字段 并 更新默认值
ALTER TABLE [dbo].[Province] ADD tceGuidCol1 UNIQUEIDENTIFIER;
--3.导入主要字段到新表
insert bulk [dbo].[tmp_ms_xx_Province1] ([ProvinceId] Int, [ProvinceName] VarBinary(2065), [tceGuidCol1] UniqueIdentifier)
with (TABLOCK, FIRE_TRIGGERS)
--4.按guid更新数据到新表
UPDATE [dbo].[tmp_ms_xx_Province1]
SET [dbo].[tmp_ms_xx_Province1].[Alias] = [dbo].[Province].[Alias]
FROM [dbo].[Province]
WHERE [dbo].[Province].[tceGuidCol1] = [dbo].[tmp_ms_xx_Province1].[tceGuidCol1];
--5.删除原表,更名新表
DROP TABLE [dbo].[Province];
EXECUTE sp_rename N'[dbo].[tmp_ms_xx_Province1]', N'Province';
--6.删除之前添加的多余字段
ALTER TABLE [dbo].[Province] DROP CONSTRAINT [tmp_ms_xx_constraint_tceGuidCol1_Province_dbo1], COLUMN [tceGuidCol1];
*/
-- 加密成功后查看,该字段都是加密字符。
SELECT * FROM Province
-- 若要查看解密内容,重新连接,连接选项中添加此参数:Column Encryption Setting=Enabled
-- 连接进来后直接查看,可看到明文数据
SELECT * FROM Province
SELECT * FROM Province WHERE ProvinceName = N'北京直辖市'
-- 查询和添加数据呢?? 这样是报错的!!!
SELECT * FROM Province WHERE ProvinceName = N'北京直辖市'
INSERT INTO Province(ProvinceId,ProvinceName,Alias) VALUES(35,N'测试' ,N'测试') --字符都使用Unicode
GO
/*
消息 206,级别 16,状态 2,第 143 行
操作数类型冲突: nvarchar 与 nvarchar(4000) encrypted with (encryption_type = 'DETERMINISTIC',
encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK01',
column_encryption_key_database_name = 'test') 不兼容
*/
/*
那就用存储过程中的参数插入吧!!两个地方可设置当前连接的客户端使用参数化:
查询——>>查询选项——>>执行——>>高级——>>勾选“启用 Always Encrtpted 参数化”
工具——>>选项——>>执行查询——>>SQL Server——>>高级——>>勾选“启用 Always Encrtpted 参数化”
*/
-- 查询,正常!
DECLARE @ProvinceName NVARCHAR(60) = N'北京直辖市'
SELECT * FROM Province WHERE ProvinceName = @ProvinceName
GO
-- 添加,正常!
DECLARE @ProvinceId INT = 35
DECLARE @ProvinceName NVARCHAR(60) = N'测试'
DECLARE @Alias VARCHAR(10) = N'测试'
INSERT INTO dbo.Province(ProvinceId,ProvinceName,Alias) VALUES (@ProvinceId,@ProvinceName ,@Alias)
GO
/* 以下两种写法则报错(奇怪?):
DECLARE @ProvinceId INT
DECLARE @ProvinceName NVARCHAR(60)
DECLARE @Alias VARCHAR(10)
SET @ProvinceId = 36
SET @ProvinceName = N'测试'
SET @Alias = N'测试'
INSERT INTO dbo.Province(ProvinceId,ProvinceName,Alias) VALUES (@ProvinceId,@ProvinceName ,@Alias)
GO
DECLARE @ProvinceId INT,@ProvinceName NVARCHAR(60) ,@Alias VARCHAR(10)
SET @ProvinceId = 35
SET @ProvinceName = N'测试'
SET @Alias = N'测试'
INSERT INTO dbo.Province(ProvinceId,ProvinceName,Alias) VALUES (@ProvinceId,@ProvinceName ,@Alias)
GO
消息 33299,级别 16,状态 6,第 183 行
加密方案不匹配列/变量 '@ProvinceName'。列/变量的加密方案为 (encryption_type = 'PLAINTEXT'),
行“9”附近的表达式预期其为 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256'
, column_encryption_key_name = 'CEK01', column_encryption_key_database_name = 'test') (或更弱)。
*/
SELECT * FROM Province