Как реализовать ведение журнала и отчеты об ошибках в хранимых процедурах SQL? - PullRequest
3 голосов
/ 23 июля 2010

Фон

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

Вопрос

Как реализовать ведение журнала и создание отчетов об ошибках в хранимых процедурах SQL,быстро и надежно одновременно?

Ответы [ 4 ]

9 голосов
/ 23 июля 2010

В данный момент это не поможет, но может быть интересным для пользователей SQL Server 2008. В SQL Server 2008 XEvents можно использовать для регистрации всех сведений об ошибках (включая текст оператора) в центральном местоположении.

IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='ErrorLogger')
    DROP EVENT SESSION [ErrorLogger] ON SERVER;
CREATE EVENT SESSION [ErrorLogger]
ON SERVER
ADD EVENT sqlserver.error_reported(
     ACTION (sqlserver.sql_text)
     WHERE (([severity]>(10))))
ADD TARGET package0.asynchronous_file_target(
     SET filename='c:\temp\error_logger.xel', metadatafile='c:\temp\error_logger.xem')
WITH (MAX_MEMORY = 4096KB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS, 
MAX_DISPATCH_LATENCY = 30 SECONDS, MAX_EVENT_SIZE = 0KB, 
MEMORY_PARTITION_MODE = NONE, TRACK_CAUSALITY = OFF, STARTUP_STATE = ON)

ALTER EVENT SESSION [ErrorLogger] ON SERVER STATE = START

И для просмотра ошибок

SELECT CONVERT (XML, event_data) AS data
        FROM sys.fn_xe_file_target_read_file ('C:\Temp\error_logger*.xel', 'C:\Temp\error_logger*.xem', NULL, NULL)
4 голосов
/ 23 июля 2010

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

  1. Используйте try catch
  2. Начать транзакцию
  3. Перед каждым шагом регистрируйте шаг начиная в одном из таблицы переменные.
  4. Когда происходит ошибка, и вы нажимаете лови блок, ставь сообщение об ошибке в стол, доступный для и откат транзакции.
  5. Табличные переменные все еще доступно после отката, так затем вы вставляете эти данные в таблицы регистрации.
3 голосов
/ 23 июля 2010

IMO один из самых быстрых способов входа в систему - запись в таблицу.Мой старый администратор БД использовал для этой цели базу данных «Утилиты» на другом жестком диске, но с виртуальными машинами это уже не имеет значения.

Насколько это возможно, зайдитес моделью данных INSERT-ONLY для ваших журналов (новая строка вставляется каждый раз), в отличие от модели INSERT-UPDATE (вставлять строку, периодически обновлять состояние)

Для отслеживания ошибок для новых процедур или когда вы повторнонаписать старые, вы можете использовать TRY-CATCH

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

0 голосов
/ 23 июля 2010

Вот очень полная статья об обработке ошибок в Sql Server (хотя для версии 2000).Для новых процедур, как сказал Радж Мор, просто используйте try-catch.

...