SQL扫描并执行文件夹里的sql脚本

简介: 原文:SQL扫描并执行文件夹里的sql脚本场景:项目数据库操作全部使用存储过程实现。每天都会有很多存储过程更新/增加,人工对测试环境中存储过程更新,会有一定概率出现遗漏,也麻烦!所以,需要一个工具将文件夹中所有存         储过程执行一次。
原文: SQL扫描并执行文件夹里的sql脚本

场景:项目数据库操作全部使用存储过程实现。每天都会有很多存储过程更新/增加,人工对测试环境中存储过程更新,会有一定概率出现遗漏,也麻烦!所以,需要一个工具将文件夹中所有存         储过程执行一次。
实现:首先想到的是用c#,很简单,而且功能强大。
        但是,我想尝试一下使用sql实现同样的功能,然后就发现了xp_cmdshell这个强大而又危险的东西!查询分析器执行,无需传入数据库用户名、密码,传入目录,就会按照脚本文件名排         序执行 (感谢@OK_008提醒有些情况是需要按顺序执行的。)。
原理:利用xp_cmdshell扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。实现扫描文件夹,并执行存储过程。
未解决:我实现的还只是扫面一个文件夹里的存储过程,这样如果存储过程被分放到几个文件夹,就需要执行几次,很不方便。如果有大神知道,怎么扫描子文件夹里的存储过程,请赐教!
嘿嘿!平时比较懒,很多东西想记录下来,却没有去做,只能写下这样比较省时间的啦!

 1 USE [xxxx]
 2 GO
 3 IF OBJECTPROPERTY(OBJECT_ID(N'ExecDirPro'), N'IsProcedure') = 1
 4     DROP PROCEDURE dbo.ExecDirPro 
 5 GO
 6 --------------------------------------------------------------------------------------------
 7 -- Name:            ExecDirPro
 8 -- Purpose:            出入目录,执行目录下所有sql脚本。注意传入的目录有中文时,前面加N
 9 -- Location:        Lottery
10 -- Excecution Example:    EXEC dbo.ExecDirPro 
11 -- Authorized to:    
12 --
13 -- Author:                clq
14 -- Create date:            2014-6-26
15 -- Alter:  
16 -------------------------------------------------------------------------------------------- 
17 CREATE PROCEDURE [dbo].[ExecDirPro]
18     @dirPath nvarchar(200)    
19 AS
20 begin try
21     --开启xp_cmdshell,完成以后关闭。保持开启很危险
22     EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
23     CREATE TABLE #T([filename] nvarchar(1024));
24 
25     declare @path nvarchar(300)
26     set @path='dir '+@dirPath+' /b'
27 
28     INSERT #T EXEC xp_cmdshell @path
29 
30     DELETE #T WHERE [filename] IS NULL;
31     
32     DECLARE @FILENAME NVARCHAR(1024);
33 
34     DECLARE cur CURSOR FOR SELECT [filename] FROM #T order by [filename];
35 
36     OPEN cur;
37 
38     DECLARE @sql NVARCHAR(1000);
39     FETCH NEXT FROM cur INTO @FILENAME;
40 
41     WHILE @@FETCH_STATUS=0
42         BEGIN
43            SET @sql=N'sqlcmd -E -i '+@dirPath+@FILENAME;           
44            EXEC xp_cmdshell @sql;           
45            FETCH NEXT FROM cur INTO @FILENAME;
46         END
47     CLOSE cur;
48     DEALLOCATE cur;
49     --关闭xp_cmdshell
50     EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
51     EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
52 end try
53 BEGIN CATCH
54     --关闭xp_cmdshell
55     EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
56     EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
57     SELECT ERROR_NUMBER() AS ErrorNumber;
58 END CATCH;
59 GO
60   

利用xp_cmdshell扩展,调用执行系统shell脚本。没错,开启xp_cmdshell之后,可以执行shell脚本,可以干很多坏事!嘿嘿!如果你的数据库权限被人拿到,并且有开启xp_cmdshell的权限,这是极其危险的!xp_cmdshell一直开着不关,更是要不得的!请一定记住,完毕以后关闭xp_cmdshell!

目录
相关文章
|
2月前
|
SQL 测试技术 数据库
SQL注入,跨站脚本,跨站请求伪造,傻傻分不清楚
SQL注入,跨站脚本,跨站请求伪造,傻傻分不清楚
|
5月前
|
SQL 数据库
PowerDesigner导出SQL脚本运行注释出现乱码问题
PowerDesigner导出SQL脚本运行注释出现乱码问题
114 0
|
8月前
|
SQL
利用Ant 执行SQL 脚本
利用 Ant 的SQL Task来实现执行SQL 脚本的功能
132 0
|
9月前
|
SQL 数据库
PowerDesigner16(PDM)pd生成数据库sql脚本
今天使用PowerDesigner16软件生成数据库脚本的时候遇到了一些问题,但是经过不懈努力最终修成正果,下面将小编的经历以及错误解决方案与大家分享。
|
5月前
|
SQL 关系型数据库 MySQL
MySql数据库中的视图,索引与数据库sql脚本如何导入与导出---(详细介绍)
MySql数据库中的视图,索引与数据库sql脚本如何导入与导出---(详细介绍)
244 0
|
SQL 数据库
使用PD(PowerDesigner)图如何快速生成创建数据库表的SQL脚本并生成表在数据库
使用PD(PowerDesigner)图如何快速生成创建数据库表的SQL脚本并生成表在数据库
422 0
使用PD(PowerDesigner)图如何快速生成创建数据库表的SQL脚本并生成表在数据库
|
2月前
|
SQL 开发框架 .NET
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
33 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
112 0
|
4月前
|
SQL 关系型数据库 Shell
postgresql|数据库|批量执行SQL脚本文件的shell脚本
postgresql|数据库|批量执行SQL脚本文件的shell脚本
124 0
|
11月前
|
SQL 关系型数据库 Linux
Postgres SQL 做备份脚本批处理
每次手动备份太麻烦了,工作上需要,决定使用自动备份,所以写个博客来记录一次,本次备份功能是无密码通过批处理来执行定时备份的,如果是windows server r2服务器的话大家可以搭配任务计划程序来做定时执行,如果是linux内核的系统可以用crontab插件,crontab 插件大家可以自行百度,从而形成定时备份数据。
127 0