WITH ENCRYPTION 저장 프로세스 복호화

7911 단어 encrypt
--1、      
create     PROCEDURE   sp_decrypt(@objectname   varchar(50))   

  AS   

  begin   

  set   nocount   on   

  --CSDN:j9988   copyright:2004.07.15     

  --V3.2     

  --        ,   SQLSERVER2000    ,  ,  ,      

  --     "     "           

  --    , E_MAIL:[email protected]   

  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<=@number     

  begin   

  if   exists(select   1   from   syscomments   where   id=object_id(@objectname)   and   number=@k)   

  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   id=@parent_obj   

  if   @tr_parent_xtype='V'   

  begin   

  set   @sql1='ALTER   TRIGGER   '+@objectname+'   ON   '+OBJECT_NAME(@parentid)+'   WITH   ENCRYPTION   INSTERD   OF   INSERT   AS   PRINT   1   '   

  end   

  else   

  begin   

  set   @sql1='ALTER   TRIGGER   '+@objectname+'   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   

  'ALTER   FUNCTION   '+   @objectname+'(@a   char(1))   returns   char(1)   with   encryption   as   begin   return   @a   end'   

  when   'IF'   then   

  'ALTER   FUNCTION   '+   @objectname+'(@a   char(1))   returns   table   with   encryption   as   return   select   @a   as   a'   

  end)   

    

  if   @type='V'   

  set   @sql1='ALTER   VIEW   '+@objectname+'   WITH   ENCRYPTION   AS   SELECT   1   as   f'   

    

  set   @q=len(@sql1)   

  set   @sql1=@sql1+REPLICATE('-',4000-@q)   

  select   @sql2=REPLICATE('-',8000)   

  set   @sql3='exec(@sql1'   

  select   @colid=max(colid)   from   #temp   where   number=@k     

  set   @n=1   

  while   @n<=CEILING(1.0*(@colid-1)/2)   and   len(@sql3)<=3996   

  begin     

  set   @sql3=@sql3+'+@'   

  set   @n=@n+1   

  end   

  set   @sql3=@sql3+')'   

  exec   sp_executesql   @sql3,N'@sql1   nvarchar(4000),@   varchar(8000)',@sql1=@sql1,@=@sql2   

    

  end   

  set   @k=@k+1   

  end   

    

  set   @k=0   

  while   @k<=@number     

  begin   

    

  if   exists(select   1   from   syscomments   where   id=object_id(@objectname)   and   number=@k)   

  begin   

  select   @colid=max(colid)   from   #temp   where   number=@k     

  set   @n=1   

    

  while   @n<=@colid   

  begin   

  select   @OrigSpText1=ctext,@encrypted=encrypted,@status=status   FROM   #temp     WHERE   colid=@n   and   number=@k   

    

  SET   @OrigSpText3=(SELECT   ctext   FROM   syscomments   WHERE   id=object_id(@objectname)   and   colid=@n   and   number=@k)   

  if   @n=1   

  begin   

  if   @type='P'   

  SET   @OrigSpText2=(case   when   @number>1   then   'CREATE   PROCEDURE   '+   @objectname   +';'+rtrim(@k)+'   WITH   ENCRYPTION   AS   '   

                                                else   'CREATE   PROCEDURE   '+   @objectname   +'   WITH   ENCRYPTION   AS   '   

                                                end)   

    

    

  if   @type='FN'   or   @type='TF'   or   @type='IF'   

  SET   @OrigSpText2=(case   @type   when   'TF'   then     

  'CREATE   FUNCTION   '+   @objectname+'(@a   char(1))   returns   @b   table(a   varchar(10))   with   encryption   as   begin   insert   @b   select   @a   return   end   '   

  when   'FN'   then   

  'CREATE   FUNCTION   '+   @objectname+'(@a   char(1))   returns   char(1)   with   encryption   as   begin   return   @a   end'   

  when   'IF'   then   

  'CREATE   FUNCTION   '+   @objectname+'(@a   char(1))   returns   table   with   encryption   as   return   select   @a   as   a'   

  end)   

    

  if   @type='TR'     

  begin   

    

  if   @tr_parent_xtype='V'   

  begin   

  set   @OrigSpText2='CREATE   TRIGGER   '+@objectname+'   ON   '+OBJECT_NAME(@parentid)+'   WITH   ENCRYPTION   INSTEAD   OF   INSERT   AS   PRINT   1   '   

  end   

  else   

  begin   

  set   @OrigSpText2='CREATE   TRIGGER   '+@objectname+'   ON   '+OBJECT_NAME(@parentid)+'   WITH   ENCRYPTION   FOR   INSERT   AS   PRINT   1   '   

  end   

    

  end   

    

  if   @type='V'   

  set   @OrigSpText2='CREATE   VIEW   '+@objectname+'   WITH   ENCRYPTION   AS   SELECT   1   as   f'   

    

  set   @q=4000-len(@OrigSpText2)   

  set   @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)   

  end   

  else   

  begin   

  SET   @OrigSpText2=REPLICATE('-',   4000)   

  end   

  SET   @i=1   

    

  SET   @resultsp   =   replicate(N'A',   (datalength(@OrigSpText1)   /   2))   

    

  WHILE   @i<=datalength(@OrigSpText1)/2   

  BEGIN   

    

  SET   @resultsp   =   stuff(@resultsp,   @i,   1,   NCHAR(UNICODE(substring(@OrigSpText1,   @i,   1))   ^   

                                                                  (UNICODE(substring(@OrigSpText2,   @i,   1))   ^   

                                                                  UNICODE(substring(@OrigSpText3,   @i,   1)))))   

    SET   @i=@i+1   

  END   

  set   @orgvarbin=cast(@OrigSpText1   as   varbinary(8000))   

  set   @resultsp=(case   when   @encrypted=1     

                                          then   @resultsp     

                                          else   convert(nvarchar(4000),case   when   @status&2=2   then   uncompress(@orgvarbin)   else   @orgvarbin   end)   

                                end)   

  print   @resultsp   

    

  set   @n=@n+1   

    

  end   

    

  end   

  set   @k=@k+1   

  end   

    

  drop   table   #temp   

  rollback   tran   

  end  


2、sp 사용decrypt (저장 프로세스 이름) 복호화

좋은 웹페이지 즐겨찾기