проверка физического наличия файла для бекапа

SomethingWrong
Дата: 13.09.2006 07:45:30
Доброго времени суток!
Прошу помощи с данной байдой:

SQL2005 9.00.2047 Enterprise

база данных бекапится по джобу раз в сутки
при этом необходимо обеспечить следующее условие
если файл, указанный в TSQL инструкции как
BACKUP DATABASE [xxx] TO DISK = N'C:\xxx.BAK'
физически существует, то выполнить differential backup,
если же нет, то выполнить полный бекап базы,
и в дальнейшем использовать этот файл для diff бекапов.

уперся с проверкой наличия файла
проверяю таким образом

BEGIN TRY
RESTORE VERIFYONLY  FROM  DISK = @FILENAME WITH CONTINUE_AFTER_ERROR  
END TRY
BEGIN CATCH
  IF (@@Error=0) GOTO GetDiffsBAK ELSE GOTO GetFullBAK
END CATCH
GO

GetDiffsBAK:
...

GetFullBAK:
...

если выполняю вручную, как запрос, все нормально создается
однако всеравно с ошибкой

Msg 3201, Level 16, State 2, Line 2
Cannot open backup device 'C:\xxx.bak'. Operating system error 2(error not found).


вполне ожидаемо, и это ошибка идет в виндусовый Event
джоб же в таких раскладах не выполняется вообще
мне нужно исключить ее вообще приняв в обработку catch
короче, получется не то что нужно
другого способа не нашел, копал BOL
BACKUP INIT|SKIP тоже не то, мне нужно получить статус файла - есть,нет
и исходя из этого выполнить дальнейшие действия

подозреваю что изобретаю велосипед
помогите с вектором копания в рамках условия

сенькс
Горилла с Нижнего Тагила
Дата: 13.09.2006 08:51:20
Может
xp_fileexist
поможет?
SomethingWrong
Дата: 13.09.2006 09:20:59
Горилла с Нижнего Тагила
Может
xp_fileexist
поможет?


О! Канеш! Спасибо тебе большое!!! :)
Как я и думал, все очень просто оказалось!

Только эта сволочь недокументированная,
поэтому про другие способы тоже хотелось бы услышать
Полюбому ж можно както извратиться в рамках документации.
Задача то на первый взгляд тривиальная до невозможности...

Так что если у кого еще какие идеи...?
-=DiM@n=-
Дата: 13.09.2006 09:27:49
DECLARE @Result int
EXEC @Result = xp_cmdshell 'dir C:\1.txt'
IF @Result = 0
   PRINT 'Существует :0)'
ELSE
   PRINT 'Не существует :0('

Robert G
Дата: 13.09.2006 09:53:02
EXEC master..xp_cmdshell 'IF EXIST имя_файла. ELSE echo имя_файла. отсутствует'
SomethingWrong
Дата: 13.09.2006 10:24:49
имеет место такая конструкция! работает!

требует включения опции
xp_cmdshell
ConfigurationTools-SurfaceAreaConfigurationForFeatures

но мне больше понравилась xp_fileexist
хоть и не документированная, а cmd шелл для SQLя закрыт

спасибо, уважаемые, за помощь! респекты вам
Crimean
Дата: 13.09.2006 10:31:24
чой-то как-то сложно это все...
я в подобной ситуации системные таблицы из msdb подключаю
и смотрю на dir каталога, куда бакаплюсь
хотя может и зря
во-первых каждый бакап - только в свой файл
во-вторых, если не смог найти какой-то из промежуточных файлов - сразу фулл бакап...
SomethingWrong
Дата: 13.09.2006 11:10:06
Crimean
чой-то как-то сложно это все...
я в подобной ситуации системные таблицы из msdb подключаю
и смотрю на dir каталога, куда бакаплюсь
хотя может и зря
во-первых каждый бакап - только в свой файл
во-вторых, если не смог найти какой-то из промежуточных файлов - сразу фулл бакап...


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

фишка хороша для ручного восстановления данных
подключая файл при ресторе я могу выбрать привязанную
по времени версию для восстановления, хоть последнюю, хоть фулл-начальную, они все передо мной в одном файле

я загнал все это дело в процедуру, и вызываю ее, передавая ей имя диска и названия баз, файл для каждой базы создается автоматически и содержит в себе все версии откатов этой базы за месяц, и начальный фулл-бекап

это позволио мне автоматизировать нудную работу
по каждодневному бекапу нескольких баз
SomethingWrong
Дата: 13.09.2006 12:12:26
EXEC xp_cmdshell 'ping www.ru'
хыхы
MSSQLUral
Дата: 13.09.2006 12:15:56
SomethingWrong
EXEC xp_cmdshell 'ping www.ru'
хыхы

а ты так попробуй!
EXEC xp_cmdshell 'ping www.ru -t'
Удачи! =)