2010-07-23 1 views
2

В настоящее время я использую SMO, чтобы помочь автоматизировать исправление и/или обновление баз данных клиентов, находящихся в производстве. Я использую следующий кодОбъект управления SQL, Продолжить пока еще сообщение об ошибке

Public Sub RunScript(ByVal db As Database, ByVal scriptInfo As FileInfo) 
    If scriptInfo.Exists Then 

     RaiseEvent LogMessage("Executing Indicated Script: " & scriptInfo.Name) 
     Using sr As New StreamReader(scriptInfo.FullName) 
      Dim script As String = sr.ReadToEnd 
      Try 
       db.ExecuteNonQuery(script) 
      Catch ex As Exception 
       RaiseEvent LogMessage("ERROR: " & ex.Message.ToString) 
       db.ExecuteNonQuery(script, 
           Microsoft.SqlServer.Management.Common.ExecutionTypes.ContinueOnError) 
      End Try 
     End Using 

    End If 
End Sub 

Что я делаю регистрируя SQLConnection сообщения, поступающие прочь SQLConneciton, что я использую с Database части, которые дают мне достаточно упрощенных сообщения о том, что происходит. Я также регистрирую себя различными сообщениями через событие LogMessage(string), которое я создал.

Что бы я хотел сделать, это выполнить скрипты, чтобы продолжить, если есть ошибка, но все же регистрировать ошибку, не делая этого так, как я есть сейчас.

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

Есть ли способ продолжить выполнение сценария при ошибке, но все же записать сообщение об ошибке?

** Редактировать ** уточняющий за то, что два объекта, поступающие в

scriptInfo является FileInfo объект, который рассказывает StreamReader где загрузить скрипт SQL с.

db является SMO Database объект, который связан с SQLClient.Connection, что позволяет мне выполнить скрипт на базе данных, которая связана с db

Каротаж ошибка происходит на SqlClient.SqlConnections OnInfo события, или из LogMessage event

ответ

2

Предполагая, что вы используете SQL Server 2005 или выше, вы можете использовать различные блоки TRY/CATCH для каждого оператора в скрипте. Вот пример:

DECLARE @errorLog TABLE (
    row_id INT NOT NULL IDENTITY(1,1), 
    error_msg NVARCHAR(4000) 
) 

/** Create the table **/ 
BEGIN TRY 
    CREATE TABLE t1 (RowID INT NOT NULL) 
END TRY 

BEGIN CATCH 
    INSERT @errorLog (error_msg) 
    SELECT ERROR_MESSAGE() 
END CATCH 

/** Create the table again - will raise an error message **/ 
BEGIN TRY 
    CREATE TABLE t1 (RowID INT NOT NULL) 
END TRY 

BEGIN CATCH 
    INSERT @errorLog (error_msg) 
    SELECT ERROR_MESSAGE() 
END CATCH 

/** Create the index **/ 
BEGIN TRY 
    CREATE INDEX IX_t1 ON t1 (RowID) 
END TRY 

BEGIN CATCH 
    INSERT @errorLog (error_msg) 
    SELECT ERROR_MESSAGE() 
END CATCH 

/** Return the errors **/ 
IF EXISTS (SELECT * FROM @errorLog) 
    SELECT error_msg FROM @errorLog 

/** Confirm it worked **/ 
EXEC sp_help 't1' 

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

С другой стороны, такие вещи, как повторяющиеся ошибки индекса, могут быть легко обработаны в самом скрипте (т. Е. Проверить, существует ли объект уже существует). И поскольку это решение требует значительного количества изменений исходного сценария, это может быть предпочтительным выбором.

+0

Хмм-образная модификация скриптов не является проблемой, мы используем CodeSmith для генерации большинства наших скриптов, используемых этой программой. Что делает последняя строка 'EXEC sp_help 't1''? (googling, но было бы хорошо с ответом). Также мы используем столько, сколько существует, если существует, как мы можем. – msarchet

+0

Последняя строка только для того, чтобы показать, что скрипт работал, несмотря на ошибку. Команда sp_help показывает структуру, ограничения и индексы таблицы. – 8kb

0

То, что вы разместили, - это всего лишь ваш вызов выполнения для того, что имеет в нем «scriptinfo».

Что такое текст 'scriptinfo'? Вот где вам нужно искать/строить изящную обработку для неудачных CRUD/транзакций/и т. Д.

Если вы можете опубликовать «scriptinfo», возможно, я смогу дать вам некоторые идеи.

Смежные вопросы