![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение выходного параметра [D6, MSSQL]
overstep © (2004-06-23 17:24:00)Добрый день. Подскажите пожалуйста. Выполняю комманду RESTORE VERIFYONLY, в лучшем случае она возвращает "The backup set is valid.", но как мне перехватить это сообщение и обработать, то есть при неудаче повторить резервирование.
overstep (2004-06-29 12:25:00) [1]Я нашел одну фичу - @@ERROR (возвращает код ошибки или ноль(если успешно) последнего выполненного Transact-SQL указателя (statement))
После неё проверка выглядет так:
EXEC('BACKUP DATABASE ['+@DBName+'] TO DISK = N'''+@BackupPath+@DBName+'_backup.BAK'''+' WITH INIT, NOUNLOAD, NAME = N'''+@DBName+' backup'''+', NOSKIP, STATS = 10, NOFORMAT')
EXEC('RESTORE VERIFYONLY FROM DISK = N'''+@BackupPath+@DBName+'_backup.BAK''')
IF (@@ERROR <> 0)
BEGIN
...
END
------------------------------------------------
Но становится другая проблема, переменная то глобальная, я не знаю как поведет она себя при многопользовательском режиме.
Смотрел примеры microsoft, так они добавляют @ReturnCode:
EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id.
Опять проблема, не смог получить @ReturnCode от EXEC('RESTORE VERIFYONLY FROM DISK = N'''+@BackupPath+@DBName+'_backup.BAK''').
Стало быть это работает с хранимы процедурами.
------------------------------------------------
А теперь по сути. После удачного RESTORE VERIFYONLY выдается сообщение "The backup set is valid." с кодом error=3262 из master.sysmessages. @@ERROR опять таки возвратит ноль, но как мне узнать, что такое сообщение было. Ведь даже в многопользовательской системе это делает только один пользователь. Вероятность ошибки будет очень мала.
>Напиши скриптом в DTS - вот и гибкость будет
bushmen подкинь пожалуйста ссылку или что нибудь про DTS. Я скрипты в нем никогда не пробовал
bushmen (2004-06-25 16:07:00) [2]>Да и гибкости по более.
Напиши скриптом в DTS - вот и гибкость будет :) А потом запускай ее уже из хранимой процедуры, а на выход передавай результат выполнения DTS.
Ega23 (2004-06-25 14:01:00) [3]Слушай, а @@FETCH_STATUS если проверять?
Как в этом примере:
WHILE (@@FETCH_STATUS <> -1)
BEGIN
/* A @@FETCH_STATUS of -2 means that the row has been deleted.
There is no need to test for this because this loop drops all
user-defined tables. */.
EXEC ('DROP TABLE ' + @tablename)
FETCH NEXT FROM tables_cursor INTO @tablename
END
Ega23 (2004-06-25 13:51:00) [4]Блин, вот ты озадачил! Полчаса бьюсь - и никак!
overstep (2004-06-25 12:51:00) [5]Далее приведен текст как это все организовано
-----------------------------------------------------------
--full backup all databases to separate archive files 'dbname_backup.rar'
DECLARE @DBName varchar(128),
@BackupPath varchar(29)
SET @BackupPath='D:\MSSQL\BACKUP\F_'+CONVERT(varchar(10),GETDATE(),126)+'\'
EXEC('xp_cmdshell ''mkdir '+@BackupPath+'''')
--declare main cursor
DECLARE main_cur CURSOR FOR
SELECT name
FROM sysdatabases
WHERE name<>'tempdb'
ORDER BY name
--backup all databases to archive files in main cursor
OPEN main_cur
FETCH NEXT FROM main_cur INTO @DBName
WHILE @@FETCH_STATUS=0
BEGIN
EXEC('BACKUP DATABASE ['+@DBName+'] TO DISK = N'''+@BackupPath+@DBName+'_backup.BAK'''+' WITH INIT, NOUNLOAD, NAME = N'''+@DBName+' backup'''+', NOSKIP, STATS = 10, NOFORMAT')
-- EXEC('RESTORE VERIFYONLY FROM DISK = N'''+@BackupPath+@DBName+'_backup.BAK''')
-- эта строка забанина потому как не знаю что делать с ответом
EXEC('xp_cmdshell ''C:\Program Files\WinRAR\WinRAR M -rr3p -ep -k '+@BackupPath+@DBName+'_backup.rar '+@BackupPath+@DBName+'_backup.BAK''')
FETCH NEXT FROM main_cur INTO @DBName
END
--close and deallocate main cursor
CLOSE main_cur
DEALLOCATE main_cur
------------------------------------------------------------
Базы backup-ятся в цикле все кроме tempdb, а потом архивируются и удаляются bak-файлы. Впринципе можно сделать, то что я хотел через job в SQL Server Agent, но прийдется переделывать, кучу шагов делать, а так я использовал бы только его шедулер и все. Да и гибкости по более.
Ega23 (2004-06-24 17:44:00) [6]Полный текст на TSQL можешь привести?
Ega23 (2004-06-24 17:42:00) [7]Стоп, это у тебя job такой написан, так?
overstep (2004-06-24 17:26:00) [8]Команда выполняется как задание SQL Server Agent-а, на сервере. Задача написана на Transact-SQL. Ответ всегда одинаковый в положительном случае. Заранее ответ неизвестен, да и потом я ж не буду сидеть и смотреть какой выдаст ответ. Это (решение дальнейших действий) должно происходить без моего участия.
bushmen (2004-06-24 16:42:00) [9]>что за ответ был после выполнения команды
какими компонентами пользуешься для доступа?
Ega23 (2004-06-24 16:23:00) [10]Ты откуда её выполняешь? С клиента?
overstep (2004-06-24 16:22:00) [11]Я ведь не знаю как это сделать, если кто знает подскажите пожалуйста. А именно я не знаю как определить, что за ответ был после выполнения команды.
bushmen (2004-06-24 13:30:00) [12]Если есть строка ответа, то заключить ее в цикл и поставить счетчик - не такое уж и сложное дело :)
overstep (2004-06-24 11:57:00) [13]Проблема в том, что я это сообщение вижу, но мне его надо обработать автоматически. То есть обратиться к какой-то переменнной, которая хранит последнее сообщение и сравнить её с “The backup set is valid.” Ну короче говоря если backup окончился неудачей то повторить его заново и не более 3-ех раз.
Ega23 (2004-06-23 17:45:00) [14]А в чём проблема?
If the backup is valid, Microsoft® SQL Server™ returns the message: “The backup set is valid.”