SQLServer 2008 存储过程WithEncryption解密方法

需积分: 50 22 下载量 92 浏览量 更新于2024-09-09 收藏 20KB DOCX 举报
"这篇内容是关于SQL Server 2008中使用`WITH ENCRYPTION`选项加密的存储过程的解密方法。作者提供了一个名为`sp__windbi$decrypt`的存储过程来帮助解密已加密的存储过程。这个存储过程由王成辉翻译整理,并警告用户在执行解密前应确保有数据库备份,因为该过程可能会删除并重建原始的存储过程。" 在SQL Server中,`WITH ENCRYPTION`是一个创建或修改存储过程、函数、触发器和视图时可选的选项,用于保护这些对象的定义不被用户查看。当对象被加密时,其源代码在系统表中以二进制格式存储,而不是文本格式,从而增加了安全性。 `sp__windbi$decrypt`存储过程的参数如下: 1. `@proceduresysname`: 需要解密的存储过程的系统名称。 2. `@revflint`: 一个标志,默认为1,如果设置为1,存储过程会显示警告信息并返回,不会执行解密操作。设置为0时,才会执行解密。 存储过程的工作原理大致如下: 1. 首先检查`sys.sysobjvalues`系统表,找到与目标存储过程相关的加密二进制数据。 2. 然后,它会处理这些二进制数据,尝试将其解密回原始的T-SQL源代码。 3. 存储过程声明了多个变量,如`@intProcSpace`, `@tbigint`, `@maxColID`, `@intEncrypted`等,用于存储过程中不同阶段的数据处理。 4. 使用`DECLARE CURSOR`语句遍历加密的二进制数据,并进行解密操作。 5. 解密后的源代码将存储在变量中,然后可能使用`ALTER PROCEDURE`语句重新创建未加密的存储过程。 请注意,此过程可能不适用于所有类型的加密对象,例如函数、触发器和视图,尽管其注释中提到会进一步关注这些对象的解密。 然而,解密加密的数据库对象通常需要谨慎操作,因为它可能违反数据库的安全策略。此外,微软官方并不支持或推荐解密`WITH ENCRYPTION`对象的方法,因为这可能破坏数据库的合规性和安全性。如果需要访问存储过程的源代码,最佳做法是在创建时不要加密,或者确保有权限访问源代码的版本控制系统。