SQL扫描并执行文件夹里的sql脚本
场景:项目数据库操作全部使用存储过程实现。每天都会有很多存储过程更新/增加,人工对测试环境中存储过程更新,会有一定概率出现遗漏,也麻烦!所以,需要一个工具将文件夹中所有存 储过程执行一次。
实现:首先想到的是用c#,很简单,而且功能强大。
但是,我想尝试一下使用sql实现同样的功能,然后就发现了xp_cmdshell这个强大而又危险的东西!查询分析器执行,无需传入数据库用户名、密码,传入目录,就会按照脚本文件名排 序执行 (感谢@OK_008提醒有些情况是需要按顺序执行的。)。
原理:利用xp_cmdshell扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。实现扫描文件夹,并执行存储过程。
未解决:我实现的还只是扫面一个文件夹里的存储过程,这样如果存储过程被分放到几个文件夹,就需要执行几次,很不方便。如果有大神知道,怎么扫描子文件夹里的存储过程,请赐教!
嘿嘿!平时比较懒,很多东西想记录下来,却没有去做,只能写下这样比较省时间的啦!
USE [xxxx]
GO
IF OBJECTPROPERTY(OBJECT_ID(N'ExecDirPro'), N'IsProcedure') = 1
DROP PROCEDURE dbo.ExecDirPro
GO
--------------------------------------------------------------------------------------------
-- Name: ExecDirPro
-- Purpose: 出入目录,执行目录下所有sql脚本。注意传入的目录有中文时,前面加N
-- Location: Lottery
-- Excecution Example: EXEC dbo.ExecDirPro
-- Authorized to:
--
-- Author: clq
-- Create date: 2014-6-26
-- Alter:
--------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[ExecDirPro]
@dirPath nvarchar(200)
AS
begin try
--开启xp_cmdshell,完成以后关闭。保持开启很危险
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
CREATE TABLE #T([filename] nvarchar(1024)); declare @path nvarchar(300)
set @path='dir '+@dirPath+' /b' INSERT #T EXEC xp_cmdshell @path DELETE #T WHERE [filename] IS NULL; DECLARE @FILENAME NVARCHAR(1024); DECLARE cur CURSOR FOR SELECT [filename] FROM #T order by [filename]; OPEN cur; DECLARE @sql NVARCHAR(1000);
FETCH NEXT FROM cur INTO @FILENAME; WHILE @@FETCH_STATUS=0
BEGIN
SET @sql=N'sqlcmd -E -i '+@dirPath+@FILENAME;
EXEC xp_cmdshell @sql;
FETCH NEXT FROM cur INTO @FILENAME;
END
CLOSE cur;
DEALLOCATE cur;
--关闭xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
end try
BEGIN CATCH
--关闭xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
SELECT ERROR_NUMBER() AS ErrorNumber;
END CATCH;
GO
利用xp_cmdshell扩展,调用执行系统shell脚本。没错,开启xp_cmdshell之后,可以执行shell脚本,可以干很多坏事!嘿嘿!如果你的数据库权限被人拿到,并且有开启xp_cmdshell的权限,这是极其危险的!xp_cmdshell一直开着不关,更是要不得的!请一定记住,完毕以后关闭xp_cmdshell!
SQL扫描并执行文件夹里的sql脚本的更多相关文章
- su认证失败&文件夹里打开终端的方法&atom安装
很久没用笔记本上的ubuntu,用不顺手,比在公司调教了半年多的电脑差远了.一步一步来.先解决最不顺手的三件事 1.su认证失败. 新安装的ubuntu系统是无法切换到root账户的,得做一番修改 s ...
- apache环境下禁止某文件夹内运行PHP脚本、禁止访问文件或目录执行权限的设置方法
apache环境下禁止某文件夹内运行PHP脚本.禁止访问文件或目录执行权限的设置方法 首先我们来看两段对上传目录设置无权限的列子,配置如下: <Directory "要去掉PHP执 ...
- OpenCV玩耍(一)批量resize一个文件夹里的所有图像
鉴于用caffe做实验的时候,里面牵扯到一个问题是必须将训练集和测试集都转成256*256的图像,而官网给出的代码又不会用,所以我用opencv转了.其实opencv只转一幅图会很简单,关键在于“批量 ...
- 将Temporary文件夹里的Logo文件转移到Logo文件夹
/// <summary> /// 将Temporary文件夹里的Logo文件转移到Logo文件夹 /// </summary> /// <param name=&quo ...
- [SQL Server]一次执行资料夹内的.sql 指令码
原文:[SQL Server]一次执行资料夹内的.sql 指令码 初始资料库时,我们Developers们会准备很多.sql指令码来建立资料表.检视甚至初始资料,那麽要怎麽一次执行资料夹内的*.sql ...
- MyEclipse里项目部署到tomcat上之后,tomcat webpps文件夹里为什么找不到这个项目
今天在MyEclipse中部署了一个java web项目,然后发现报404错误,跑到tomcat目录下的webapps文件夹里并发现没有这个项目,才发现MyEclipse没有写入webapp ...
- diff两个文件夹里的东西
diff --help -x, --exclude=PAT exclude files that match PAT 排除某个类型的文件 -u, -U NUM, --uni ...
- jq和js插件的各个文件夹里放置的内容
1. demo文件夹,存放各种实例. 2. dist文件夹,全称是distribution.在某些框架中,因为开发和发布的内容或者代码形式是不一样的(比如利用Grunt压缩等等),这时候就需要一个存放 ...
- 使用everything把一个文件夹里(包含子目录)的所有图片拷贝到另一个文件夹
最近在找数据集,想要预览数据集里面的全部图片,而因为一些数据集的数据存储方式使得图片都分布在若干层后的子文件里,所以就需要一个如题所示的功能. 找了一堆XCOPY命令的使用方法,差点要撸起袖子写代码干 ...
随机推荐
- 服务器中判断客户端socket断开连接的方法
1, 如果服务端的Socket比客户端的Socket先关闭,会导致客户端出现TIME_WAIT状态,占用系统资源. 所以,必须等客户端先关闭Socket后,服务器端再关闭Socket才能避免TIME_ ...
- C# 中对WinForm窗体中的控件快速设置TableIndex次序
点击“视图”--“Tab键顺序”,然后便可设置.
- [转]Linux下which、whereis、locate、find 命令的区别
转自:http://312788172.iteye.com/blog/730280 我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索.这些是从网上找到的资料,因为有 ...
- 分享我的PL/SQL的优化设置,为开发全面提速
打开[工具]–[首选项]: 1.登陆历史:勾选[存储历史]和[带口令存储],方便下次登陆,免去每次都输入密码的烦恼: 2.编辑器: a.勾选[语法高亮]允许: b.关键词大小写选择大写: c.配置自动 ...
- 30+简约时尚的Macbook贴花
当Macbooks Pro电脑在他们的设计之下仍然漂亮.独一无二时,我想说,他们已经成为相当的主流了.有时候如果你回忆过去的很美好的日子,当人们偷偷欣赏你的技术装备 的时候,大概是为你的外表增加亮点的 ...
- TopFreeTheme精选免费模板【20130629】
今天给大家推荐9款最新精选的WordPress主题,它们涵盖了新闻.杂志.博客.房地产方面的主题.有些是商业模板,但现在都可以免费下载. GeoPlaces v4.6.2 – 来自Templatic的 ...
- sphinx下的max_matches取值对SetLimits的影响
使用PHP在客户端执行 $s -> SetLimits(0, 15, 1200); 传递的第三个参数,是服务器端设定当前查询的结果集大小为1200,但是运行结果,确实$s最终查询得到的结果为空值 ...
- WS之cxf处理的复杂类型(Map)
一.服务端: 1.创建接口: package cn.tdtk.ws.dao; import java.util.List;import java.util.Map; import javax.jws. ...
- Visual Studio Profiler 跟踪检查每个exe dll 性能 执行时间 CPU占用情况的方法
- 怎么监视跟踪一个进程(Process)中的MS Unit Test DLL的详细性能(performance)【asp.net C#】
Sample This tutorial will show how to instrument a unit test DLL for performance profiling. Visual S ...