Sql server 2008 具有数据加密功能的Sql Server 2008R2企业版-备份和恢复
我有一个数据库,在它上启用了对称加密,以加密某些列。 在从脚本创建DB后,我创建了一个SP以启用加密,如下所示Sql server 2008 具有数据加密功能的Sql Server 2008R2企业版-备份和恢复,sql-server-2008,encryption-symmetric,Sql Server 2008,Encryption Symmetric,我有一个数据库,在它上启用了对称加密,以加密某些列。 在从脚本创建DB后,我创建了一个SP以启用加密,如下所示 CREATE PROCEDURE [dbo].[sys_EnableSymmetricEncryption] AS BEGIN --If there is no master key, create one now. IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101) C
CREATE PROCEDURE [dbo].[sys_EnableSymmetricEncryption]
AS
BEGIN
--If there is no master key, create one now.
IF NOT EXISTS
(SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
CREATE MASTER KEY ENCRYPTION BY
PASSWORD = '9809u0ij989oih9o8yyo98yyo89uyp9p9'
CREATE CERTIFICATE My_Certificate
WITH SUBJECT = 'My Database';
CREATE SYMMETRIC KEY My_Key_01
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE My_Certificate;
END
所以,在我从脚本创建db之后,我运行这个,然后我可以将数据存储在加密列中与 并使用
OPEN SYMMETRIC KEY My_Key_01
DECRYPTION BY CERTIFICATE My_Certificate;
SELECT [CardID]
,CONVERT(nvarchar, DecryptByKey([CardNumber])) as 'CardNumber'
,CONVERT(nvarchar, DecryptByKey([CardSecurityCode])) as 'CardSecurityCode'
,CONVERT(nvarchar, DecryptByKey([CardExpirationDate])) as 'CardExpirationDate'
,CONVERT(nvarchar, DecryptByKey([NameOnCard])) as 'NameOnCard'
FROM [Cards]
在我备份数据库并尝试在另一台服务器上恢复备份之前,所有这些都可以正常工作
还原后,当我尝试运行Select(如上所述)时,我会出现此错误
执行此操作之前,请在数据库中创建主密钥或在会话中打开主密钥。
所以我试着用
IF NOT EXISTS
(SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
CREATE MASTER KEY ENCRYPTION BY
PASSWORD = '9809u0ij989oih9o8yyo98yyo89uyp9p9'
但是在选择时仍然会得到相同的错误。
如果我尝试运行上面显示的第一个Sp,以创建主密钥、证书和对称密钥,则会出现错误
Msg 15581,第16级,状态3,程序系统启用对称加密,第11行
执行此操作之前,请在数据库中创建主密钥或在会话中打开主密钥。
Msg 15282,16级,状态1,程序系统启用对称加密,第14行
名为“OneTest\u key\u 01”或用户定义的唯一标识符的密钥已存在,或者您没有创建的权限
也许我应该在创建证书和对称密钥之前删除它们,但我不知道它们在哪里
你知道怎么处理吗
谢谢
PS如果我在同一台服务器上恢复,即使是作为不同的数据库,所有都可以正常运行尝试运行:
ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '9809u0ij989oih9o8yyo98yyo89uyp9p9';
尝试运行:
ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '9809u0ij989oih9o8yyo98yyo89uyp9p9';
当我运行此命令时,会出现以下错误:
Msg 15329,级别16,状态20,第1行当前主密钥无法解密。如果这是数据库主密钥,则在执行此操作之前,应尝试在会话中打开它。强制选项可用于忽略此错误并继续操作,但由旧主密钥加密的数据将丢失。
有什么想法吗?不幸的是,没有其他想法。我只能分享我在网上找到的东西:当我运行这个程序时,我得到以下错误:
Msg 15329,16级,状态20,第1行当前主密钥无法解密。如果这是数据库主密钥,则在执行此操作之前,应尝试在会话中打开它。强制选项可用于忽略此错误并继续操作,但由旧主密钥加密的数据将丢失。
有什么想法吗?不幸的是,没有其他想法。我只能分享我在网上找到的东西: