簡體   English   中英

SQL Server xp_cmdshell

[英]SQL Server xp_cmdshell

除了T-SQL以外,還有其他方法可以獲取文件名列表嗎?

INSERT INTO @backups(filename)
EXEC master.sys.xp_cmdshell 'DIR /b c:\some folder with sql backups in it

我試圖從要還原的文件夾中獲取SQL備份文件的列表,出於明顯的安全原因,我不想使用xp_cmdshell

我確實意識到該線程已有5年歷史了,但我想我會發布另一個非xpCmdShell,非CLR替代方案。 詳細信息在下面的代碼中,它很簡單。

--===== Define the path and populate it.
     -- This could be a parameter in a proc
DECLARE @pPath VARCHAR(512);
 SELECT @pPath = 'C:\Temp';

--===== Create a table to store the directory information in
 CREATE TABLE #DIR
        (
        RowNum     INT IDENTITY(1,1),
        ObjectName VARCHAR(512),
        Depth      TINYINT,
        IsFile     BIT,
        Extension AS RIGHT(ObjectName,CHARINDEX('.',REVERSE(ObjectName))) PERSISTED
        )
;
--===== Get the directory information and remember it
 INSERT INTO #DIR
        (ObjectName,Depth,IsFile)
   EXEC xp_DirTree 'C:\Temp',1,1
;
--===== Now do whatever it is you need to do with it
 SELECT * FROM #DIR;

如果您有權訪問備份文件服務器,則可以使用系統表查找所需的備份文件。

http://msdn.microsoft.com/en-us/library/ms188062.aspx

您將對備份表感興趣。

三種選擇,取決於您的環境和需求:

  1. 如果您使用的是SQL2005或2008,則幾乎可以確定要編寫CLR存儲過程來完成這項工作。 如果您以前沒有做過,它的工作量可能會比您想做的要多,但是由於我已經有一個項目,可以將其添加到其中,如果我真的需要SQL才能讀取它,那可能就是我會做的從目錄。
  2. 正如Sam所建議的,如果您有權訪問備份源,則可以查詢MSDB數據庫中的表。 我的建議可能是查詢msdb.dbo.backupmediafamily.physical_device_name以獲取可能可用的文件列表,然后使用以下方法測試它們是否存在: RESTORE FILELISTONLY disk='FULL_PATH_TO_YOUR_FILE' 如果文件不存在,則會引發非致命錯誤。 您可以通過測試@@ error是否為非零來檢查T-SQL中的錯誤。
  3. 如果您的環境允許,在Windows中SQL Server外部運行的快速腳本可能是您的最佳選擇。 如果需要,可以將其設置為計划任務。 例如,您可以讓它每15分鍾運行一次,檢查自上次腳本運行以來是否已出現文件,然后將任何文件插入SQL Server的表中。 我已經在Perl,Ruby和VBScript中完成了類似的任務。 也可以使用批處理文件來完成。 同樣,我不知道您的確切需求或技能,但是如果我只需要完成此任務,而又不是100%需要在SQL Server中運行它,我可能只是寫一個腳本。

我提出的xp_cmdshell的替代方法如下:

我的情況有點特殊,因為我正在嘗試運送一個窮人的原木。 我有一個文件夾(不是默認的SQL備份位置),該文件是從遠程服務器存放事務日志的。 我正在寫一個ac#應用程序,該應用程序循環訪問該目錄並創建一個用逗號分隔的帶有路徑的文件名字符串(例如FooA.txn,FooB.txn,FooC.txn)。 然后,我將此字符串輸入到我編寫的存儲過程中,該過程將解析該字符串並將文件名插入到臨時表中。 然后,我遍歷臨時表,依次恢復每個事務日志。

基本上,C#應用程序替換了xp_cmdshell,並且可以從該應用程序調用存儲過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM