SQL Server xp_cmdshell

时间:2008-11-13 20:04:24

标签: sql-server tsql

他们是否可以通过除

之外的T-SQL获取文件名列表

INSERT INTO @backups(文件名) EXEC master.sys.xp_cmdshell'DIR / b c:\某些带有sql备份的文件夹

我正在尝试从要恢复的文件夹中获取sql备份文件列表,出于明显的安全原因,我不想使用xp_cmdshell。

4 个答案:

答案 0 :(得分:1)

如果您可以访问备份文件的服务器,则可以使用系统表查找您喜欢的备份文件。

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

您会对备份表感兴趣。

答案 1 :(得分:1)

三种选择,具体取决于您的环境和需求:

  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. 如果您的环境可以实现,那么在SQL Server之外的Windows中运行的快速脚本可能是您最好的选择。如果需要,您可以将其设置为计划任务。例如,您可以每15分钟运行一次,检查自上次脚本运行以来是否出现过文件,并将任何文件插入SQL Server中的表中。我在Perl,Ruby和VBScript中完成了类似的任务。它也可以用批处理文件完成。同样,我不知道你的确切需求或技能,但如果我只是需要完成这项工作,并且不是100%需要它从SQL Server中运行,我可能只是编写一个脚本。

答案 2 :(得分:1)

我确实知道这个帖子已经有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;

答案 3 :(得分:0)

xp_cmdshell的替代方法我出现在下面:

我的情况有点独特,因为我正在尝试一个穷人的原木运输。我有一个文件夹(不是默认的SQL备份位置),其中从远程服务器存放事务日志。我正在编写一个循环遍历该目录的c#app,并使用路径创建逗号分隔的文件名字符串(例如FooA.txn,FooB.txn,FooC.txn)。然后我将此字符串提供给我编写的存储过程,该存储过程解析字符串并将文件名插入临时表。然后我循环遍历临时表,按顺序恢复每个事务日志。

基本上C#应用程序取代了xp_cmdshell,我可以从应用程序中调用存储过程。