打开sqlserver proc 存储过程错误:属性 TextHeader 不可用于 StoredProcedure“[dbo].[x]”。该对象可能没有此属性,也可能是访问权限不足而无法检索。  该文本已加密。 (Microsoft.SqlServer.Smo),提示如下图错误:

注:本文基于SQLserver 2008R2,其他版本没有测试过

解决方法:

1、使用原有数据库从新导出非加密脚本重新建立数据库(略过)

2、使用解密proc方式从新生成proc脚本

步骤整理:

1、使用sql dac功能登录数据库,首先要启用dac,否则会报错:不支持专用管理员连接

1
2
3
4
5
6
7
USE master;
GO
SP_CONFIGURE'remote admin connections';
SP_CONFIGURE 'remote admin connections', 1; --0 表示仅允许本地连接使用 DAC,1表示允许远程连接使用 DAC
GO
RECONFIGURE WITH OVERRIDE;
GO

选择新建连接->数据库引擎查询,然后输入admin:机器名登录即可。

连接中可能出现如下错误:

这说明已经连接过并成功,不能再次连接,也可以使用sql配置管理器重启sqlserver服务,从新来过

2、成功使用DAC功能登录后,如下图:

3、选择要解密操作的数据库

4、创建解密存储表

1
2
3
4
5
6
7
8
9
CREATE TABLE [dbo].[SQL_DECODE]
    (
      [ID] [INT] IDENTITY(1, 1)
                 NOT NULL ,
      [SQLTEXT] [NVARCHAR](MAX) NOT NULL ,
      CONSTRAINT [ID] PRIMARY KEY CLUSTERED ( [ID] ASC )
    )
ON  [PRIMARY]
GO

5、创建解密proc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
CREATE PROCEDURE [dbo].[DECODE_PROC]
    (
      @PROC_NAME SYSNAME = NULL
    )
AS
    SET NOCOUNT ON
    DECLARE @PROC_NAME_LEN INT    --存储过程名长度
    DECLARE @MAX_COL_ID SMALLINT    --最大列ID
    SELECT  @MAX_COL_ID = MAX(subobjid)
    FROM    sys.sysobjvalues
    WHERE   objid = OBJECT_ID(@PROC_NAME)
    GROUP BY imageval
    SELECT  @PROC_NAME_LEN = DATALENGTH(@PROC_NAME) + 29
    DECLARE @REAL_01 NVARCHAR(MAX)    --真实加密存储过程数据
    DECLARE @FACK_01 NVARCHAR(MAX)    --修改为假的存储过程,长度(40003 - 存在过程名长度),原理不明?
    DECLARE @FACK_ENCRYPT_01 NVARCHAR(MAX)    --伪加密存储过街程数据
    DECLARE @REAL_DECRYPT_01 NVARCHAR(MAX)    --最终解密后的数据,初始化为原始加密长度的一半的“A”,原理不明?
    SET @REAL_01 = ( SELECT imageval
                     FROM   sys.sysobjvalues
                     WHERE  objid = OBJECT_ID(@PROC_NAME)
                            AND valclass = 1
                            AND subobjid = 1
                   )
    DECLARE @REAL_DATA_LEN BIGINT
    SET @REAL_DATA_LEN = DATALENGTH(@REAL_01)
--PRINT @REAL_DATA_LEN
    DECLARE @FACK_LEN BIGINT
    SET @FACK_LEN = @REAL_DATA_LEN * 10    --改造:假的长度在原真实数据长度上放大10倍
--此处需将NVARCHAR显示转换成NVARCHAR(MAX),不然将只能产生4K长度
    SET @FACK_01 = 'ALTER PROCEDURE ' + @PROC_NAME + ' WITH ENCRYPTION AS '
        + REPLICATE(CONVERT(NVARCHAR(MAX), '-'), @FACK_LEN - @PROC_NAME_LEN)
--PRINT '@FACK_01 = ' + STR(LEN(@FACK_01))
    EXECUTE (@FACK_01)
    SET @FACK_ENCRYPT_01 = ( SELECT imageval
                             FROM   sys.sysobjvalues
                             WHERE  objid = OBJECT_ID(@PROC_NAME)
                                    AND valclass = 1
                                    AND subobjid = 1
                           )
    SET @FACK_01 = 'CREATE PROCEDURE ' + @PROC_NAME + ' WITH ENCRYPTION AS '
        + REPLICATE(CONVERT(VARCHAR(MAX), '-'), @FACK_LEN - @PROC_NAME_LEN)
    SET @REAL_DECRYPT_01 = REPLICATE(CONVERT(NVARCHAR(MAX), N'A'),
                                     ( DATALENGTH(@REAL_01) / 2 ))
--PRINT 'LEN(@REAL_DECRYPT_01) = ' + STR(LEN(@REAL_DECRYPT_01))
--按位对 @REAL_01、 @FACK_01、 @REAL_DECRYPT_01 进行异或操作。
    DECLARE @INT_PROC_SPACE BIGINT
    SET @INT_PROC_SPACE = 1
    WHILE @INT_PROC_SPACE <= ( DATALENGTH(@REAL_01) / 2 )
        BEGIN
            SET @REAL_DECRYPT_01 = STUFF(@REAL_DECRYPT_01, @INT_PROC_SPACE, 1,
                                         NCHAR(UNICODE(SUBSTRING(@REAL_01,
                                                              @INT_PROC_SPACE,
                                                              1))
                                               ^ ( UNICODE(SUBSTRING(@FACK_01,
                                                              @INT_PROC_SPACE,
                                                              1))
                                                   ^ UNICODE(SUBSTRING(@FACK_ENCRYPT_01,
                                                              @INT_PROC_SPACE,
                                                              1)) )))
            SET @INT_PROC_SPACE = @INT_PROC_SPACE + 1
        END
--移除WITH ENCRYPTION
    SET @REAL_DECRYPT_01 = REPLACE(@REAL_DECRYPT_01, 'WITH ENCRYPTION', '')
    INSERT  INTO [SQL_DECODE]
    VALUES  ( @REAL_DECRYPT_01 )
--PRINT '@REAL_DECRYPT_01 = ' + @REAL_DECRYPT_01
--PRINT 'LEN(@REAL_DECRYPT_01) = ' + STR(LEN(@REAL_DECRYPT_01))
--删除原存储过程
    SET @FACK_01 = 'DROP PROCEDURE ' + @PROC_NAME
    EXEC(@FACK_01)
GO

6、执行解密proc

1
EXEC dbo.DECODE_PROC 'proc名称'

7、查询解密存储表,会发现已经存储了要解密的proc脚本

8、将脚本拷贝到查询窗口格式化后无误,执行创建即可,原加密proc被删除了已经,新的proc已经不带有加密锁标记了

参考整理:

SQLSERVER数据库管理员的专用连接DAC

SQL2005解密已经被加密的存储过程

[SQL Server 2005/2008]专用管理员连接(DAC)

sqlserver 属性 TextHeader 不可用于 StoredProcedure“[dbo].[x]”该对象可能没有此属性,也可能是访问权限不足而无法检索。 该文本已加密。相关推荐

  1. python如何对一个属性或方法进行封装_python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  2. 属性 Owner 不可用于 数据库...

    标题: Microsoft SQL Server Management Studio ------------------------------ 无法显示请求的对话框. -------------- ...

  3. SQL2005 属性 IsLocked 不可用于 登录[sa]

    SQL2005 属性 IsLocked 不可用于 登录[sa] 在SQL2005中查看登录名属性时提示如下错误: 属性 IsLocked 不可用于 登录"[sa]".该对象可能没有 ...

  4. python对象的三个属性_Python 对象属性的访问

    在 Python 中,一切皆对象.属性访问可以理解为是从一个已有的对象中获得另一个对象的方法.对象属性的访问涉及到对象的 __dict__ 属性.描述符等概念,以及 __getattribute__. ...

  5. vue数组双向绑定问题(数组更新检测、对象添加移除属性)

    例子:三个列表数字首次渲染依次为100,200,300,点击对应的后面的按钮,要实现数字乘十,此时使用 this.arr[index]=this.arr[index]*10;进行更改的方式不起作用,改 ...

  6. SQLServer错误:过程 sp_addextendedproperty,第 xxx 行对象无效。'dbo.xxx.xxx' 不允许有扩展属性,或对象不存在。...

    上传数据库到虚拟主机,在执行SQL脚本的时候出现以下的错误: 消息 15135,级别 16,状态 8,过程 sp_addextendedproperty,第 37 行 对象无效.'dbo.Messag ...

  7. fillstyle属性_html设置或返回用于填充绘画的颜色渐变或模式的属性fillStyle

    实例 定义用蓝色填充的矩形: JavaScript:var c=document.getElementById("myCanvas"); var ctx=c.getContext( ...

  8. spark sql读取sql server报错:com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name ‘dbo.st

    一.问题描述 Sparksql 读取sql server链接报错: Exception in thread "main" com.microsoft.sqlserver.jdbc. ...

  9. 《JAVA练习题目11》学生类有属性姓名(字符串类型)和选修课程信息(ArrayList<Course>对象)两个属性,和三个方法

    学生类有属性姓名(字符串类型)和选修课程信息(ArrayList对象)两个属性,和三个方法 一个用于初始化学生名字的构造方法:一个添加选修课程的addCourse方法:一个获取所有课程平均分的getA ...

最新文章

  1. 干货丨深度学习初学者必读:究竟什么是张量?
  2. 06.node类型设置
  3. struts2中dtd失效,代码不提示问题
  4. datatable移动一列的位置
  5. ibatise 没有大于等于吗_库里+杜兰特并没有大于等于2!或许他和库里搭配将更强...
  6. java 函数式编程_Java函数式编程:Javaslang入门
  7. Java通过Mybatis实现批量插入数据到Oracle中
  8. 与熊论道为什么解码不了_楼上熊孩子瞎蹦跳,楼下邻居投诉无果,一招吓哭“熊一家”...
  9. Linux 文件或文件夹重命名命令mv
  10. mysql优化之 EXPLAIN(一)
  11. 一到软考网络工程师试题
  12. 美团 | 搜索多业务商品排序探索与实践
  13. 如何优雅地使用迅雷下载百度云大文件?
  14. DevExpress WinForm 控件汉化方法 代码(一)
  15. Expandable实现方法
  16. gitlab . pre-receive hook declined
  17. 日本护照持有者可以免签进入全球193个目的地,创下历史记录
  18. 用python进行数据分析举例说明_《利用python进行数据分析》读书笔记 --第一、二章 准备与例子...
  19. 【数学】三角函数小题
  20. java的格式控制符_C语言的格式控制符

热门文章

  1. 你真的懂 MP4 格式吗?
  2. java常用文件工具类
  3. flask后端接受图片文件数据
  4. 推荐几个免费看动漫的网站
  5. 斯柯达支持Android auto吗,斯柯达在SUV的布局输了吗?看柯米克和柯珞克的现状就知道...
  6. open-vot:PyTorch 实现 Siamese-FC
  7. 五种网络I/O模型详解
  8. 局域网内的计算机拒绝访问,win10系统局域网拒绝访问的解决方法
  9. 重磅!道翰天琼破解认知智能核心秘密三大核心技术,机器人大脑API平台。
  10. php xampp教程,XAMPP如何下载及安装