100 DATALENGTH(@real_01) / 2 - @procNameLength) + '*/ END'
101 ELSE
102 IF @objtype = 'V'
103 SET @fake_01 = 'Create view ' + @procedure + ' WITH ENCRYPTION AS select 1 as col
104 /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
105 DATALENGTH(@real_01) / 2 - @procNameLength) + '*/'
106 ELSE
107 IF @objtype = 'TR'
108 SET @fake_01 = 'Create trigger ' + @procedure + ' ON ' + @parentname + 'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
109 /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
110 DATALENGTH(@real_01) / 2 - @procNameLength) + '*/'
111 --开始计数
112 SET @intProcSpace = 1
113 --使用字符填充临时变量
114 SET @real_decrypt_01 = REPLICATE(CAST('A' AS NVARCHAR(MAX)),
115 ( DATALENGTH(@real_01) / 2 ))
116 --循环设置每一个变量,创建真正的变量
117 --每次一个字节
118 SET @intProcSpace = 1
119 --如有必要,遍历每个@real_xx变量并解密
120 WHILE @intProcSpace <= ( DATALENGTH(@real_01) / 2 )
121 BEGIN
122 --真的和假的和加密的假的进行异或处理
123 SET @real_decrypt_01 = STUFF(@real_decrypt_01, @intProcSpace, 1,
124 NCHAR(UNICODE(SUBSTRING(@real_01,
125 @intProcSpace, 1)) ^ ( UNICODE(SUBSTRING(@fake_01,
126 @intProcSpace, 1)) ^ UNICODE(SUBSTRING(@fake_encrypt_01,
127 @intProcSpace, 1)) )))
128 SET @intProcSpace = @intProcSpace + 1
129 END
130 --通过sp_helptext逻辑向表#output里插入变量
131 INSERT #output ( real_decrypt )
132 SELECT @real_decrypt_01
133 --select real_decrypt AS '#output chek' from #output --测试
134 -- -------------------------------------
135 --开始从sp_helptext提取
136 -- -------------------------------------
137 DECLARE @dbname SYSNAME ,
138 @BlankSpaceAdded INT ,
139 @BasePos INT ,
140 @CurrentPos INT ,
141 @TextLength INT ,
142 @LineId INT ,
143 @AddOnLen INT ,
144 @LFCR INT --回车换行的长度
145 ,
146 @DefinedLength INT ,
147 @SyscomText NVARCHAR(MAX) ,
148 @Line NVARCHAR(255)
149 SELECT @DefinedLength = 255
150 SELECT @BlankSpaceAdded = 0 --跟踪行结束的空格。注意Len函数忽略了多余的空格
151 CREATE TABLE #CommentText
153 LineId INT ,
154 Text NVARCHAR(255) COLLATE database_default
155 )
156 --使用#output代替sys.sysobjvalues
157 DECLARE ms_crs_syscom CURSOR LOCAL
158 FOR
159 SELECT real_decrypt
160 FROM #output
161 ORDER BY ident FOR READ ONLY
162 --获取文本
163 SELECT @LFCR = 2
164 SELECT @LineId = 1
165 OPEN ms_crs_syscom
166 FETCH NEXT FROM ms_crs_syscom INTO @SyscomText
167
168 WHILE @@fetch_status >= 0
169 BEGIN
170 SELECT @BasePos = 1
171 SELECT @CurrentPos = 1
172 SELECT @TextLength = LEN(@SyscomText)
173 WHILE @CurrentPos != 0
174 BEGIN
175 --通过回车查找行的结束
176 SELECT @CurrentPos = CHARINDEX(CHAR(13) + CHAR(10),
177 @SyscomText, @BasePos)
178 --如果找到回车
179 IF @CurrentPos != 0
180 BEGIN
181 --如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
182 WHILE ( ISNULL(LEN(@Line), 0) + @BlankSpaceAdded + @CurrentPos - @BasePos + @LFCR ) > @DefinedLength
183 BEGIN
184 SELECT @AddOnLen = @DefinedLength - ( ISNULL(LEN(@Line),
185 0) + @BlankSpaceAdded )
186 INSERT #CommentText
187 VALUES ( @LineId,
188 ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
189 @BasePos,
190 @AddOnLen), N'') )
191 SELECT @Line = NULL, @LineId = @LineId + 1,
192 @BasePos = @BasePos + @AddOnLen,
193 @BlankSpaceAdded = 0
194 END
195 SELECT @Line = ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
196 @BasePos,
197 @CurrentPos - @BasePos + @LFCR),
198 N'')
199 SELECT @BasePos = @CurrentPos + 2
200 INSERT #CommentText
201 VALUES ( @LineId, @Line )
202 SELECT @LineId = @LineId + 1
203 SELECT @L