場景:項目數據庫操作全部使用存儲過程實現。每天都會有很多存儲過程更新/增加,人工對測試環境中存儲過程更新,會有一定概率出現遺漏,也麻煩!所以,需要一個工具將文件夾中所有存 儲過程執行一次。
實現:首先想到的是用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!
