【sql】加密所有的存储程式

2024-08-21 03:52

本文主要是介绍【sql】加密所有的存储程式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因项目管理规定,所有的存储程式(SP)都需要加密。

如何批量加密所有的SP呢?

在网上找到了参考的代码,然后发现除SP外连同View,Trigger,Function等也可以一并处理!

参考资料: https://download.csdn.net/download/xiaojie449/12171480

如下是在原作基础上略作补充的方法:


create procedure sp_EncryptObject 
(@Object sysname='All'
)
as
/*当@Object=All的时候,对所有的函数,存储过程,视图和触发器进行加密调用方法:1. Execute sp_EncryptObject 'All'2. Execute sp_EncryptObject 'ObjectName'
*/
beginset nocount onif @Object <>'All'beginif not exists(select 1 from sys.objects a where a.object_id=object_id(@Object) And a.type in('P','V','TR','FN','IF','TF'))begin--SQL Server 2008--raiserror 50001 N'无效的加密对象!加密对象必须是函数,存储过程,视图或触发器。'--SQL Server 2012--throw 50001, N'无效的加密对象!加密对象必须是函数,存储过程,视图或触发器。',1  --SQL Server 2016raiserror ('无效的加密对象!加密对象必须是函数,存储过程,视图或触发器。',16,1)returnendif exists(select 1 from sys.sql_modules a where a.object_id=object_id(@Object) and a.definition is null)begin--SQL Server 2008--raiserror 50001 N'对象已经加密!'--SQL Server 2012--throw 50001, N'对象已经加密!',1  --SQL Server 2016raiserror ('无效的加密对象!加密对象必须是函数,存储过程,视图或触发器。',16,1)returnendenddeclare @sql nvarchar(max),@C1 nchar(1),@C2 nchar(1),@type nvarchar(50),@Replace nvarchar(50)set @C1=nchar(13)set @C2=nchar(10)declare cur_Object cursor for select object_name(a.object_id) As ObjectName,a.definition from sys.sql_modules a  inner join sys.objects b on b.object_id=a.object_idand b.is_ms_shipped=0and not exists(select 1 from sys.extended_properties xwhere x.major_id=b.object_idand x.minor_id=0and x.class=1and x.name='microsoft_database_tools_support')where b.type in('P','V','TR','FN','IF','TF')and (b.name=@Object or @Object='All')--and ( b.name like'%abc_%' or b.name like'%_20240820%'  )and b.name <>'sp_EncryptObject'and a.definition is not null                    order by Case when b.type ='V' then 1 when b.type ='TR' then 2when b.type in('FN','IF','TF') then 3 else 4 end,b.create_date,b.object_idopen cur_Objectfetch next from cur_Object into @Object,@sqlwhile @@fetch_status=0beginBegin Try  if objectproperty(object_id(@Object),'ExecIsAfterTrigger')=0 set @Replace='As' ; else set @Replace='For ';if (patindex('%'+@C1+@C2+@Replace+@C1+@C2+'%',@sql)>0)beginset @sql=Replace(@sql,@C1+@C2+@Replace+@C1+@C2,@C1+@C2+'With Encryption'+@C1+@C2+@Replace+@C1+@C2)endelse if(patindex('%'+@C1+@Replace+@C1+'%',@sql)>0)begin set @sql=Replace(@sql,@C1+@Replace+@C1,@C1+'With Encryption'+@C1+@Replace+@C1)endelse if(patindex('%'+@C2+@Replace+@C2+'%',@sql)>0)begin set @sql=Replace(@sql,@C2+@Replace+@C2,@C2+'With Encryption'+@C2+@Replace+@C2)endelse if(patindex('%'+@C2+@Replace+@C1+'%',@sql)>0)begin set @sql=Replace(@sql,@C2+@Replace+@C1,@C1+'With Encryption'+@C2+@Replace+@C1)endelse if(patindex('%'+@C1+@C2+@Replace+'%',@sql)>0)begin set @sql=Replace(@sql,@C1+@C2+@Replace,@C1+@C2+'With Encryption'+@C1+@C2+@Replace)endelse if(patindex('%'+@C1+@Replace+'%',@sql)>0)begin set @sql=Replace(@sql,@C1+@Replace,@C1+'With Encryption'+@C1+@Replace)endelse if(patindex('%'+@C2+@Replace+'%',@sql)>0)begin set @sql=Replace(@sql,@C2+@Replace,@C2+'With Encryption'+@C2+@Replace)endset @type =case when object_id(@Object,'P')>0 then 'Proc'when object_id(@Object,'V')>0 then 'View'when object_id(@Object,'TR')>0  then 'Trigger'when object_id(@Object,'FN')>0 or object_id(@Object,'IF')>0 or object_id(@Object,'TF')>0 then 'Function'endset @sql=Replace(@sql,'Create '+@type,'Alter '+@type)Begin Transactionexec(@sql)            print N'已完成加密对象('+@type+'):'+@Object            Commit TransactionEnd TryBegin CatchDeclare @Error nvarchar(2047)Set @Error='Object: '+@Object+@C1+@C2+'Error: '+Error_message()Rollback Transaction          print @Errorprint @sql   End Catchfetch next from cur_Object into @Object,@sqlendclose cur_Objectdeallocate cur_Object        
endGo
exec sp_ms_marksystemobject 'sp_EncryptObject' --标识为系统对象
go

这篇关于【sql】加密所有的存储程式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092050

相关文章

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I