Sql server SQL Server xp\u cmdshell

Sql server SQL Server xp\u cmdshell,sql-server,tsql,Sql Server,Tsql,除了 INSERT INTO @backups(filename) EXEC master.sys.xp_cmdshell 'DIR /b c:\some folder with sql backups in it 我正试图从文件夹中获取要还原的SQL备份文件列表,出于明显的安全原因,我不想使用xp\u cmdshell。如果您有权访问备份文件的服务器,可以使用系统表查找您喜欢的备份文件 您将对备份表感兴趣 如果您有权访问备份文件的服务器,则可以使用系统表查找您喜欢的备份文件 您将对备份表

除了

INSERT INTO @backups(filename)
EXEC master.sys.xp_cmdshell 'DIR /b c:\some folder with sql backups in it
我正试图从文件夹中获取要还原的SQL备份文件列表,出于明显的安全原因,我不想使用
xp\u cmdshell

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

您将对备份表感兴趣

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


您将对备份表感兴趣

三个选项,取决于您的环境和需要:

  • 如果您使用的是SQL2005或2008,几乎可以肯定地编写一个CLR存储过程来完成这项工作。如果您以前没有做过,这可能比您希望做的要多,但由于我已经有了一个项目,我可以将其添加到其中,如果我真的需要SQL来读取目录,这可能就是我要做的
  • 正如Sam所建议的,如果您有权访问备份源,那么可以查询MSDB数据库中的表。我的建议可能是查询msdb.dbo.backupmediafamily.physical_device_name以获取可能存在的文件列表,然后使用以下方法测试这些文件是否存在:
    将FILELISTONLY disk='FULL\u路径\u还原到您的\u文件'
    。如果文件不存在,则会引发非致命错误。您可以通过测试@error是否为非零来检查T-SQL中的错误
  • 如果您的环境允许,那么在SQL Server之外的Windows中运行一个快速脚本可能是最佳选择。如果需要,可以将其设置为计划任务。例如,您可以让它每15分钟运行一次,检查自上次运行脚本以来是否出现了文件,并将任何文件插入SQL Server中的表中。我已经用Perl、Ruby和VBScript完成了足够多的类似任务。也可以使用批处理文件来完成。再说一次,我不知道您的确切需求或技能集,但如果我只是需要完成这项工作,而不是100%需要它在SQL Server中运行,我可能只需要编写一个脚本

  • 根据您的环境和需要,有三种选择:

  • 如果您使用的是SQL2005或2008,几乎可以肯定地编写一个CLR存储过程来完成这项工作。如果您以前没有做过,这可能比您希望做的要多,但由于我已经有了一个项目,我可以将其添加到其中,如果我真的需要SQL来读取目录,这可能就是我要做的
  • 正如Sam所建议的,如果您有权访问备份源,那么可以查询MSDB数据库中的表。我的建议可能是查询msdb.dbo.backupmediafamily.physical_device_name以获取可能存在的文件列表,然后使用以下方法测试这些文件是否存在:
    将FILELISTONLY disk='FULL\u路径\u还原到您的\u文件'
    。如果文件不存在,则会引发非致命错误。您可以通过测试@error是否为非零来检查T-SQL中的错误
  • 如果您的环境允许,那么在SQL Server之外的Windows中运行一个快速脚本可能是最佳选择。如果需要,可以将其设置为计划任务。例如,您可以让它每15分钟运行一次,检查自上次运行脚本以来是否出现了文件,并将任何文件插入SQL Server中的表中。我已经用Perl、Ruby和VBScript完成了足够多的类似任务。也可以使用批处理文件来完成。再说一次,我不知道您的确切需求或技能集,但如果我只是需要完成这项工作,而不是100%需要它在SQL Server中运行,我可能只需要编写一个脚本

  • 我提出的xp_cmdshell的替代方案如下:

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


    基本上,C#应用程序取代了xp#u cmdshell,我可以从该应用程序调用存储过程。

    我提出的xp#u cmdshell的替代方案如下:

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


    基本上,C#应用程序取代了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;
    

    我知道这个线程已经有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;
    

    这确实是MSDN的问题,但需要一些工作才能从链接中确定1)这些表在MSDB数据库中,2)它们在SQL2008和SQL2005中。这确实是MSDN的问题,但需要一些工作才能从链接中确定1)这些表在MSDB数据库中,2)它们都在SQL2008和SQL2005中。