我将一个SQL Server数据库从一个系统复制到下一个相同的设置,但完全不同的物理计算机。我使用了Norton Ghost并手动恢复了文件,例如,重新安装SQL Server 2008 Express之后,在c:\ Program Files中找到了整个SQL Server 2008文件夹。
我的一个数据库对其多个表之一的列启用了AES_256加密。我重设了IIS7,并尝试运行访问数据库的应用程序,在检索数据时,出现以下错误:
“ /”应用程序中的服务器错误。在执行此操作之前,请在数据库中创建一个主密钥或在会话中打开该主密钥。说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。 异常详细信息:System.Data.SqlClient.SqlException:请在执行此操作之前在数据库中创建一个主密钥或在会话中打开该主密钥。 源错误: 当前Web请求的执行期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来标识有关异常的来源和位置的信息。
“ /”应用程序中的服务器错误。在执行此操作之前,请在数据库中创建一个主密钥或在会话中打开该主密钥。说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。
异常详细信息:System.Data.SqlClient.SqlException:请在执行此操作之前在数据库中创建一个主密钥或在会话中打开该主密钥。
源错误:
当前Web请求的执行期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来标识有关异常的来源和位置的信息。
我已经读了一些书,发现了一些有关AES加密如何与机器密钥链接的链接,但是对于如何将其复制到新系统上却一无所知。也许事实并非如此。
注意:我尝试删除对称密钥,证书和主密钥,然后重新创建它们。这样可以消除错误,但是不会显示通过AES_256加密的数据。但是,未加密的列会这样做。
任何帮助将非常感激。提前致谢!
使用服务器主密钥对数据库主密钥进行加密,该服务器主密钥特定于安装SQL Server的计算机。将数据库移动到另一台服务器时,您将失去自动解密和打开数据库主密钥的能力,因为本地服务器密钥很可能会有所不同。如果无法解密数据库主密钥,则无法解密依赖于该数据库的其他任何密钥(证书,对称密钥等)。
基本上,您想使用新的服务器密钥对数据库主密钥进行重新加密,可以使用以下脚本(使用管理员权限)完成该操作:
-- Reset database master key for server (if database was restored from backups on another server) OPEN MASTER KEY DECRYPTION BY PASSWORD = '---your database master key password---' ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY GO
请注意,在创建数据库主密钥时,还应始终提供密码,以便在无法使用服务主密钥的情况下可以使用该密码打开密钥-希望您已将该密码存储在某处!
或者,您可以还原数据库主密钥的备份-但您需要为目标服务器而非源服务器创建的备份。
如果您既没有备份也没有密码,那么我不确定您是否能够在新服务器上恢复加密数据,因为您将不得不删除并使用新密码重新创建数据库主密钥,这将杀死所有相关的键和数据。