MsSql数据库存储过程加密解密

mac2022-06-30  68

 

-- ------------------------------------------------------------------------------ -- ------------------------------------------------------------------------------ 存储过程、存储函数的加密: WITH ENCRYPTION < ! -- [if !supportLineBreakNewLine]--> < ! -- [endif]--> CREATE procedure dbo.sp_XML_main @table_name nvarchar ( 260 ) = '' , @dirname nvarchar ( 20 ) = '' WITH ENCRYPTION as begin .................................................... end go -- ------------------------------------------------------------------------------ -- ------------------------------------------------------------------------------ -- 解密指定存储过程 exec sp_decrypt ' 存储过程名 ' create PROCEDURE sp_decrypt( @objectName varchar ( 50 )) AS begin begin tran declare @objectname1 varchar ( 100 ), @orgvarbin varbinary ( 8000 ) 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 , @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 ' set @sql1 = ' ALTER TRIGGER ' + @objectname + ' ON ' + OBJECT_NAME ( @parentid ) + ' WITH ENCRYPTION FOR INSERT AS PRINT 1 ' 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 ' set @q = len ( @sql1 ) set @sql1 = @sql1 + REPLICATE ( ' - ' , 4000 - @q ) 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 ( @sql1 + @sql2 + @sql3 + @sql4 + @sql5 + @sql6 + @sql7 + @sql8 + @sql9 + @sql10 ) 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 ' set @OrigSpText2 = ' CREATE TRIGGER ' + @objectname + ' ON ' + OBJECT_NAME ( @parentid ) + ' WITH ENCRYPTION FOR INSERT AS PRINT 1 ' if @type = ' V ' set @OrigSpText2 = ' CREATE VIEW ' + @objectname + ' WITH ENCRYPTION AS SELECT 1 ' set @q = 4000 - len ( @OrigSpText2 ) set @OrigSpText2 = @OrigSpText2 + 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 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 -- execute( @resultsp) set @n = @n + 1 end end set @k = @k + 1 end drop table # temp rollback tran end GO

 

 

 

转载于:https://www.cnblogs.com/xiebin1986/archive/2010/02/02/1661518.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)