with encryption进行加密的存储过程---解密

先加密:

create proc P_jiami
with   encryption --加密
as 
begin
select * from cc
end

--exec    sp_decrypt    'P_jiami'   --解密


SQL Server中用with encryption进行加密的存储过程,可以用下面过程解密! 


2007年11月01日 08:42
--如果是用    with    encryption    进行加密,可以用下面过程解密   
   --exec    sp_decrypt    '自定义函数名'   
    
   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<=@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   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值