当前位置: 代码迷 >> Sql Server >> 怎么查看自己加密的存储过程
  详细解决方案

怎么查看自己加密的存储过程

热度:69   发布时间:2016-04-27 15:07:21.0
如何查看自己加密的存储过程
我在创建存储过程时加上了WITH ENCRYPTION,现在想修改该存储过程都打不开了,怎么解决?谢谢! 


------解决方案--------------------
SQL code
alter PROCEDURE sp_decrypt(@objectName varchar(50))ASbeginbegin transactiondeclare @objectname1 varchar(100)declare @sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000),@sql5 nvarchar(4000),@sql6 nvarchar(4000),@sql7 nvarchar(4000),@sql8 nvarchar(4000),@sql9 nvarchar(4000),@sql10 nvarchar(4000)  DECLARE  @OrigSpText1 nvarchar(4000),  @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)declare  @i int , @t bigintdeclare @m int,@n int,@q intset @m=(SELECT max(colid) FROM syscomments  WHERE id = object_id(@objectName))set @n=1--get encrypted datacreate table  #temp(colid int,ctext varbinary(8000))insert #temp SELECT colid,ctext FROM syscomments  WHERE id = object_id(@objectName)set @sql1='ALTER PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '--set @sql1='ALTER PROCEDURE '+ @objectName +' WITH ENCRYPTION AS 'set @q=len(@sql1)set @[email protected]+REPLICATE('-',[email protected])select @sql2=REPLICATE('-',4000),@sql3=REPLICATE('-',4000),@sql4=REPLICATE('-',4000),@sql5=REPLICATE('-',4000),@sql6=REPLICATE('-',4000),@sql7=REPLICATE('-',4000),@sql8=REPLICATE('-',4000),@sql9=REPLICATE('-',4000),@sql10=REPLICATE('-',4000)exec(@[email protected][email protected][email protected][email protected][email protected][email protected][email protected][email protected][email protected])while @n<[email protected] begin  SET @OrigSpText1=(SELECT ctext FROM #temp  WHERE [email protected])  set @[email protected]+'_t'  SET @OrigSpText3=(SELECT ctext FROM syscomments WHERE id=object_id(@objectName) and [email protected])  if @n=1  begin  SET @OrigSpText2='CREATE PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '--  set @q=4000-len(@OrigSpText2)  set @[email protected]+REPLICATE('-',@q)  end  else  begin  SET @OrigSpText2=REPLICATE('-', 4000)  end  --start counter  SET @i=1  --fill temporary variable  SET @resultsp = replicate(N'A', (datalength(@OrigSpText1) / 2))    --loop  WHILE @i<=datalength(@OrigSpText1)/2  BEGIN  --reverse encryption (XOR original+bogus+bogus encrypted)  SET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^                                  (UNICODE(substring(@OrigSpText2, @i, 1)) ^                                  UNICODE(substring(@OrigSpText3, @i, 1)))))      SET @[email protected]+1  END  --drop original SP  --EXECUTE ('drop PROCEDURE '+ @objectName)  --remove encryption  --preserve case  SET @resultsp=REPLACE((@resultsp),'WITH ENCRYPTION', '')  SET @resultsp=REPLACE((@resultsp),'With Encryption', '')  SET @resultsp=REPLACE((@resultsp),'with encryption', '')  IF CHARINDEX('WITH ENCRYPTION',UPPER(@resultsp) )>0     SET @resultsp=REPLACE(UPPER(@resultsp),'WITH ENCRYPTION', '')  --replace Stored procedure without enryption  print @resultsp  --execute( @resultsp)  set @[email protected]+1 end   drop table #temprollback transactionend
------解决方案--------------------
SQL code
--下面是网上一个很流行的解密过程         create     PROCEDURE   sp_decrypt(@objectName   varchar(50))         AS         begin         set   nocount   on     begin   tran         declare   @objectname1   varchar(100),@orgvarbin   varbinary(8000)         declare   @sql1   nvarchar(4000),@sql2   varchar(8000),@sql3   nvarchar(4000),@sql4   nvarchar(4000)         DECLARE   @OrigSpText1   nvarchar(4000),   @OrigSpText2   nvarchar(4000)   ,   @OrigSpText3   nvarchar(4000),   @resultsp   nvarchar(4000)         declare   @i   int,@status   int,@type   varchar(10),@parentid   int         declare   @colid   int,@n   int,@q   int,@j   int,@k   int,@encrypted   int,@number   int         select   @type=xtype,@parentid=parent_obj   from   sysobjects   where   id=object_id(@ObjectName)                 create   table   #temp(number   int,colid   int,ctext   varbinary(8000),encrypted   int,status   int)         insert   #temp   SELECT   number,colid,ctext,encrypted,status   FROM   syscomments   WHERE   id   =   object_id(@objectName)         select   @number=max(number)   from   #temp         set   @k=0                 while   @k<[email protected]           begin         if   exists(select   1   from   syscomments   where   id=object_id(@objectname)   and   [email protected])         begin         if   @type='P'         set   @sql1=(case   when   @number>1   then   'ALTER   PROCEDURE   '+   @objectName   +';'+rtrim(@k)+'   WITH   ENCRYPTION   AS   '         else   'ALTER   PROCEDURE   '+   @objectName+'   WITH   ENCRYPTION   AS   '         end)                 if   @type='TR'         begin         declare   @parent_obj   varchar(255),@tr_parent_xtype   varchar(10)         select   @parent_obj=parent_obj   from   sysobjects   where   id=object_id(@objectName)         select   @tr_parent_xtype=xtype   from   sysobjects   where   [email protected]_obj         if   @tr_parent_xtype='V'         begin         set   @sql1='ALTER   TRIGGER   [email protected]+'   ON   '+OBJECT_NAME(@parentid)+'   WITH   ENCRYPTION   INSTERD   OF   INSERT   AS   PRINT   1   '         end         else         begin         set   @sql1='ALTER   TRIGGER   [email protected]+'   ON   '+OBJECT_NAME(@parentid)+'   WITH   ENCRYPTION   FOR   INSERT   AS   PRINT   1   '         end                 end         if   @type='FN'   or   @type='TF'   or   @type='IF'         set   @sql1=(case   @type   when   'TF'   then           'ALTER   FUNCTION   '+   @objectName+'(@a   char(1))   returns   @b   table(a   varchar(10))   with   encryption   as   begin   insert   @b   select   @a   return   end   '         when   'FN'   then
  相关解决方案