`
sjk2013
  • 浏览: 2185077 次
文章分类
社区版块
存档分类
最新评论

分享:将存储过程批量进行加密.可保证95%以上成功率

 
阅读更多
USE MyTargetDB 
go 
IF object_id ('wfp_before_add_password_backup') IS NULL 
SELECT  o.name AS proc_name ,
        s.definition
INTO    tempdb.dbo.wfp_before_add_password_backup
FROM    sys.sql_modules s ,
        sys.objects o
WHERE   o.object_id = s.object_id and s.definition is not null 
        AND o.type = 'P'

IF OBJECT_ID('tempdb.dbo.new_definition_error') IS NOT NULL 
    DROP TABLE  tempdb.dbo.new_definition_error 
    --执行中,出现错误的收集到本表中
CREATE  TABLE tempdb.dbo.new_definition_error
    (
      proc_name NVARCHAR(128) ,
      errmsg NVARCHAR(MAX) ,
      remark CHAR(1)
    )
IF OBJECT_ID('tempdb.dbo.wfp_before_add_password_with_new_definition') IS NOT NULL 
    DROP TABLE    tempdb.dbo.wfp_before_add_password_with_new_definition
SELECT  o.name AS proc_name ,
        s.definition ,
        CAST(NULL AS NVARCHAR(MAX)) add_password_definition
INTO    tempdb.dbo.wfp_before_add_password_with_new_definition --   将加密前的过程代码,备份;以防不测
FROM    sys.sql_modules s ,
        sys.objects o
WHERE   o.object_id = s.object_id
        AND o.type = 'P'
        AND o.name LIKE 'pr_%'
		and s.definition is not null ;--加密的过滤除去





DECLARE @definition NVARCHAR(MAX) ,
    @proc_name NVARCHAR(128) ,
    @new_definition NVARCHAR(MAX)
DECLARE @newline VARCHAR(2)
SET @newline = CHAR(13) + CHAR(10)
--游标,每个过程单独处理
DECLARE c CURSOR
FOR
    SELECT  proc_name ,
            definition
    FROM    tempdb.dbo.wfp_before_add_password_with_new_definition

OPEN c 
FETCH NEXT FROM c INTO @proc_name, @definition
WHILE @@FETCH_STATUS = 0 
    BEGIN 
		--将)AS  处理掉
        SET @definition = REPLACE(SUBSTRING(@definition, 1, 500), ')AS', ') AS') + SUBSTRING(@definition, 501, 99999999)
        DECLARE @c1 NVARCHAR(MAX) ---参数串
        SET @c1 = '%' + ( SELECT    name + '%'
                          FROM      sys.parameters
                          WHERE     object_id = OBJECT_ID(@proc_name)
                          ORDER BY  parameter_id ASC
                        FOR
                          XML PATH('')
                        )
        --PRINT '@c1 = ' + @c1 ---找到第一个参数位置
        DECLARE @position1 INT 
        SELECT  @position1 = PATINDEX(@c1, @definition) 
        --PRINT '参数最开始的位置:@position1 = ' + CAST(@position1 AS VARCHAR) 

        DECLARE @end_parameter NVARCHAR(128) ,
            @len_end_parameter INT 
        SET @end_parameter = ISNULL(( SELECT TOP 1
                                                name
                                      FROM      sys.parameters
                                      WHERE     object_id = OBJECT_ID(@proc_name)
                                      ORDER BY  parameter_id DESC
                                    ), '')
        DECLARE @position_end INT 
        DECLARE @position_split INT 


        --PRINT REPLICATE('*', 100)
        SET @position_end = PATINDEX('%' + @end_parameter + '%AS%', @definition)

		--- 定位到最后一个参数末尾位置
        SET @position_end = @position_end + LEN(@end_parameter)
        --- 确定分隔位置
        SET @position_split = CHARINDEX('as', @definition, @position_end)
        SET @new_definition = SUBSTRING(@definition, 1, @position_split - 1) + @newline + ' WITH ENCRYPTION ' + @newline + 
	SUBSTRING(@definition, @position_split, 99999999)
        --PRINT @new_definition
        BEGIN TRY 
        ----保证语句执行错误后,可以保留原不能替换语句,加事务
            BEGIN TRAN new_definition
            IF @new_definition IS NOT NULL 
                BEGIN 
                    EXEC (' drop proc [' + @proc_name + ']' )--先DROP
                    EXEC (@new_definition) --再CREATE 
                    UPDATE  tempdb.dbo.wfp_before_add_password_with_new_definition
                    SET     add_password_definition = @new_definition -- 将新定义的语句,收集起来
                    WHERE   proc_name = @proc_name
                END 
            IF @new_definition IS  NULL  -- 拼串时发生错误时 NULL ,new_definition_error 查找原因
                BEGIN 
                    INSERT  INTO tempdb.dbo.new_definition_error
                            ( proc_name, remark )
                            SELECT  @proc_name ,
                                    '1'
                END 
            COMMIT TRAN new_definition
        END TRY 
        BEGIN CATCH 
            ROLLBACK TRAN new_definition
            INSERT  INTO tempdb.dbo.new_definition_error  --发生错误时,回滚;收集错误信息
                    ( proc_name, errmsg )
                    SELECT  @proc_name ,
                            ERROR_MESSAGE()
        END CATCH 

        FETCH NEXT FROM c INTO @proc_name, @definition
    END 
CLOSE c 
DEALLOCATE c 

--存在未加密成功的过程,强制人为返回错误
IF EXISTS ( SELECT  *
			FROM    sys.sql_modules s ,
					sys.objects o
			WHERE   o.object_id = s.object_id
					AND o.type = 'P'
					AND o.name LIKE 'pr_%'
					and s.definition is not null ) 
    BEGIN 
        select  '本次加密操作未完全成功!请手动执行加密
		SELECT  OBJECT_NAME(a.object_id) ,
				a.definition
		FROM    wfp.sys.sql_modules a ,
				wfp.sys.objects b
		WHERE   a.definition IS NOT NULL and b.name LIKE ''pr_%''
				AND a.object_id = b.object_id
				AND b.type = ''P''
        查看失败过程,然后手工操作 
		' as error_msg 
      
    END 


分享到:
评论

相关推荐

    乘风广告联盟系统 v4.1 (acc).rar

    1.采用Mssql数据库,存储过程、事务编写,支持百万级以上的需求,内核十分强健。 2.网友,网站主和广告主都有后台可以对广告效果一目了然。 3.要以单独对广告或单独对某个用户设置扣点率。 4.可以整合你网站本身的...

    乘风广告联盟系统 v6.5

    乘风广告联盟系统单台服务器每天至少可负载五千万以上PV流量,更支持多台服务器负载均衡,适用普通广告联盟、手机广告联盟等,支持CPC、CPV、CPA、CPS等计费方式,支持富媒体广告、混合广告、直链广告等各类广告效果...

    乘风广告联盟系统 v5.0 ASP MSSQL.rar

    采用Mssql数据库,存储过程、事务编写,支持百万级以上的需求,内核十分强健。2.网友,网站主和广告主都有后台可以对广告效果一目了然。3.要以单独对广告或单独对某个用户设置扣点率。4.可以整合你网站本身的注册用户...

    乘风广告联盟系统 v5.0 ASP ACCESS.rar

    采用Mssql数据库,存储过程、事务编写,支持百万级以上的需求,内核十分强健。2.网友,网站主和广告主都有后台可以对广告效果一目了然。3.要以单独对广告或单独对某个用户设置扣点率。4.可以整合你网站本身的注册用户...

    乘风广告联盟系统 v6.4

    13.程序核心使用数据库存储过程处理,银行级的负载和安全性能,无需做主从数据库单个数据库默认就实现了读写分离,数据库在高负载下绝不会损坏更不会丢失数据 14.前台页面可以开启伪静态,更利于搜索引擎收录,更有...

    乘风广告联盟系统 v6.4.zip

    13.程序核心使用数据库存储过程处理,银行级的负载和安全性能,无需做主从数据库单个数据库默认就实现了读写分离,数据库在高负载下绝不会损坏更不会丢失数据 14.前台页面可以开启伪静态,更利于搜索引擎收录,更有...

    EXCEL集成工具箱V6.0

    【批量名称图片批注】 可批量将图片依对应名称生成带图片背景的批注。 【显示与隐藏批注】 显示或隐藏工作表中选中区域的批注。 【可视化批注】 可视化地窗体操作添加与修改注解完整功能。 安全工具 【工作表解密...

    EXCEL集成工具箱V8.0完整增强版(精简)

    【批量名称图片批注】 可批量将图片依对应名称生成带图片背景的批注。 【显示与隐藏批注】 显示或隐藏工作表中选中区域的批注。 【可视化批注】 可视化地窗体操作添加与修改注解完整功能。 安全工具 【工作表...

    乘风广告联盟系统

    乘风广告联盟系统单台服务器每天至少可负载五千万以上PV流量,更支持多台服务器负载均衡,适用普通广告联盟、手机广告联盟等,支持CPC、CPV、CPA、CPS等计费方式,支持富媒体广告、混合广告、直链广告等各类广告效果...

    好压解压缩软件V4.0正式版

    网上下载的压缩包往往因头部受损的问题导致不能打开,而使用2345好压后,只须单击界面中的“修复”按钮就可轻松修复,成功率极高! 针对7Z格式独创注释功能 好压压缩软件(HaoZip)针对7z格式,独创了7z文件注释功能...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例052 使用位运算对数字进行加密和解密 83 2.3 包含语句 84 实例053 提高代码重用率 84 实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾文件 87 实例057 包含网站的主文件 88 2.4 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例052 使用位运算对数字进行加密和解密 83 2.3 包含语句 84 实例053 提高代码重用率 84 实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾文件 87 实例057 包含网站的主文件 88 2.4 ...

Global site tag (gtag.js) - Google Analytics