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
分享到:
相关推荐
1.采用Mssql数据库,存储过程、事务编写,支持百万级以上的需求,内核十分强健。 2.网友,网站主和广告主都有后台可以对广告效果一目了然。 3.要以单独对广告或单独对某个用户设置扣点率。 4.可以整合你网站本身的...
乘风广告联盟系统单台服务器每天至少可负载五千万以上PV流量,更支持多台服务器负载均衡,适用普通广告联盟、手机广告联盟等,支持CPC、CPV、CPA、CPS等计费方式,支持富媒体广告、混合广告、直链广告等各类广告效果...
采用Mssql数据库,存储过程、事务编写,支持百万级以上的需求,内核十分强健。2.网友,网站主和广告主都有后台可以对广告效果一目了然。3.要以单独对广告或单独对某个用户设置扣点率。4.可以整合你网站本身的注册用户...
采用Mssql数据库,存储过程、事务编写,支持百万级以上的需求,内核十分强健。2.网友,网站主和广告主都有后台可以对广告效果一目了然。3.要以单独对广告或单独对某个用户设置扣点率。4.可以整合你网站本身的注册用户...
13.程序核心使用数据库存储过程处理,银行级的负载和安全性能,无需做主从数据库单个数据库默认就实现了读写分离,数据库在高负载下绝不会损坏更不会丢失数据 14.前台页面可以开启伪静态,更利于搜索引擎收录,更有...
13.程序核心使用数据库存储过程处理,银行级的负载和安全性能,无需做主从数据库单个数据库默认就实现了读写分离,数据库在高负载下绝不会损坏更不会丢失数据 14.前台页面可以开启伪静态,更利于搜索引擎收录,更有...
【批量名称图片批注】 可批量将图片依对应名称生成带图片背景的批注。 【显示与隐藏批注】 显示或隐藏工作表中选中区域的批注。 【可视化批注】 可视化地窗体操作添加与修改注解完整功能。 安全工具 【工作表解密...
【批量名称图片批注】 可批量将图片依对应名称生成带图片背景的批注。 【显示与隐藏批注】 显示或隐藏工作表中选中区域的批注。 【可视化批注】 可视化地窗体操作添加与修改注解完整功能。 安全工具 【工作表...
乘风广告联盟系统单台服务器每天至少可负载五千万以上PV流量,更支持多台服务器负载均衡,适用普通广告联盟、手机广告联盟等,支持CPC、CPV、CPA、CPS等计费方式,支持富媒体广告、混合广告、直链广告等各类广告效果...
网上下载的压缩包往往因头部受损的问题导致不能打开,而使用2345好压后,只须单击界面中的“修复”按钮就可轻松修复,成功率极高! 针对7Z格式独创注释功能 好压压缩软件(HaoZip)针对7z格式,独创了7z文件注释功能...
实例052 使用位运算对数字进行加密和解密 83 2.3 包含语句 84 实例053 提高代码重用率 84 实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾文件 87 实例057 包含网站的主文件 88 2.4 ...
实例052 使用位运算对数字进行加密和解密 83 2.3 包含语句 84 实例053 提高代码重用率 84 实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾文件 87 实例057 包含网站的主文件 88 2.4 ...