我在创建存储过程时加上了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