SQL Server xp_cmdshell - PullRequest
       9

SQL Server xp_cmdshell

0 голосов
/ 13 ноября 2008

Есть ли другой способ получить список имен файлов через T-SQL, кроме

INSERT INTO @backups (имя файла) EXEC master.sys.xp_cmdshell 'DIR / b c: \ некоторая папка с резервными копиями sql

Я пытаюсь получить список файлов резервных копий sql из папки для восстановления, и я НЕ хочу использовать xp_cmdshell по очевидным причинам безопасности.

Ответы [ 4 ]

1 голос
/ 05 мая 2013

Я понимаю, что этой теме уже 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;
1 голос
/ 14 ноября 2008

Три варианта, в зависимости от вашей среды и потребностей:

  1. Если вы используете SQL2005 или 2008, вы почти наверняка можете написать хранимую процедуру CLR для выполнения этой работы. Если вы раньше этого не делали, возможно, это больше работы, чем вы ожидаете, но, поскольку у меня уже есть проект, к которому я мог бы добавить это, это, вероятно, то, что я бы сделал, если бы мне действительно нужно было иметь возможность читать SQL из каталога.
  2. Как говорит Сэм, если у вас есть доступ к источнику резервных копий, вы можете запросить таблицы в базе данных MSDB. Я могу предложить запрос msdb.dbo.backupmediafamily.physical_device_name, чтобы получить список файлов, которые могут быть доступными для вас, а затем проверить, существуют ли они, используя: RESTORE FILELISTONLY disk='FULL_PATH_TO_YOUR_FILE'. Это приводит к нефатальной ошибке, если файл не существует. Вы можете проверить наличие ошибок в T-SQL, проверив, является ли @@ error ненулевым.
  3. Если ваша среда делает это возможным, лучшим сценарием может быть быстрый запуск сценариев в Windows вне SQL Server. Вы можете настроить его как запланированное задание, если вам нужно. Например, вы можете запускать его каждые 15 минут, проверять, появился ли файл с момента последнего запуска сценария, и вставлять любые файлы в таблицу в SQL Server. Я выполнил достаточно похожие задачи в Perl, Ruby и VBScript. Возможно, это можно сделать и с помощью командного файла. Опять же, я не знаю ваших точных потребностей или навыков, но если бы мне просто нужно было это сделать, и мне не нужно было на 100% запускать его из SQL Server, я бы, вероятно, просто написал скрипт.
1 голос
/ 14 ноября 2008

Если у вас есть доступ к серверу, который выполняет резервное копирование файлов , вы можете использовать системные таблицы для поиска файлов резервных копий, которые вы предпочитаете.

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

Вас заинтересуют резервные таблицы.

0 голосов
/ 14 ноября 2008

Альтернатива xp_cmdshell, которую я придумал, приведена ниже:

Моя ситуация немного уникальна, потому что я пытаюсь отправить бревно бедному человеку. У меня есть папка (не папка резервного копирования SQL по умолчанию), где журналы транзакций хранятся на удаленном сервере. Я пишу приложение на c #, которое перебирает этот каталог и создает разделенную запятыми строку имен файлов с путями (например, FooA.txn, FooB.txn, FooC.txn). Затем я передаю эту строку в написанную мной хранимую процедуру, которая анализирует строку и вставляет имена файлов во временную таблицу. Затем я перебираю временную таблицу, восстанавливая каждый журнал транзакций по порядку.

В основном приложение C # заменяет xp_cmdshell, и из приложения я могу вызвать хранимую процедуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...