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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM