• 解密加密了的SQL存储过程


    CREATE PROCEDURE [dbo].[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
     
  • 相关阅读:
    Oracle学习笔记:oracle的表空间管理和sqlserver的文件组对比
    Oracle学习笔记:一个特殊的ORA12541错误原因
    Oracle学习笔记:通过种子数据库设置dbid为指定值
    Oracle学习笔记:使用rman duplicate {to|for} 创建数据库
    Oracle学习笔记:利用rman数据库备份,手工创建clone数据库
    使用Cufon技术实现Web自定义字体
    分享七个非常有用的Android开发工具和工具包
    60佳灵感来自大自然的网页设计作品欣赏
    20个独一无二的图片滑动效果创意欣赏
    40个幻灯片效果在网页设计中的应用案例
  • 原文地址:https://www.cnblogs.com/liwenyan/p/3069008.html
Copyright © 2020-2023  润新知