Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПО АИС.doc
Скачиваний:
5
Добавлен:
10.11.2019
Размер:
637.95 Кб
Скачать

8.3.События alerts

Описания событий, на которые должен реагировать SQL Server Agent.

После наступления события SQL Server Agent выдает сообщение одному или нескольким операторам об обнаружении неполадок в работе сервера. События SQL Server охватывают все стороны деятельности экземпляров СУБД.

Таким образом, оператору нет необходимости постоянно находиться рядом с сервером, чтобы знать о параметрах его работы.

Информация обо всех объектах SQL Server Agent хранится в БД MSDB. При каждом запуске SQL Server Agent он проверяет журнал событий и проверяет просроченные задания.

Настройка оповещения

SQL Server позволяет создавать оповещение и настраивать реакцию системы на их срабатывание. Служба SQL Server Agent просматривает журнал приложений ОС Windows и сравнивает все зарегистрированные в нем события SQL Server Agent с имеющимися оповещениями.

Если какое-либо событие не соответствует сообщения, то срабатывает оповещение, связанное с этим событием. Кроме того SQL Server Agent может устанавливать значения счетчиков объектов SQL Server и запускать оповещение тогда, когда их значение будет меньше или равно указанному значению.

Для создания оповещения нужно быть sysadmin.

Информация хранится в таблице sysmessages БД MASTER.

Создать новое оповещение можно с помощью Enterprise Manager либо хранимой процедурой sp_addmessage.

Таблица sysmessages позволяет добавлять пользовательские сообщения об ошибках, при этом события и сообщения SQL Server Agent имеют атрибуты:

  • Номер ошибки;

  • Строка сообщения – диагностическая информация об источнике ошибки;

  • Уровень значимости – чем меньше значение, тем меньше ошибка;

  • Код состояния – используется для распоряжения исходного кода;

  • Имя хранимой процедуры, при выполнении которой возникла ошибка;

  • Номер строки, где расположена ошибка.

В журнал сообщения SQL Server события и сообщения могут быть занесены:

  • Все ошибки SQL Server с уровнем значимости выше 19 регистрируются автоматически;

  • Автоматическая регистрация конкретной ошибки возможно с помощью хранимой процедуры sp_altermessage;

  • Приложение может принудительно занести ошибку в журнал с помощью оператора RAISERROR WITH LOG, который регистрирует код ошибки в протоколе ошибок, или с помощью хранимой процедуры sp_logevent.

Оператор RAISERROR возвращает сообщение об ошибке и с помощью системной функции @@error устанавливает флаг регистрации ошибки

RAISERROR (msg_id | msg_str, severity, state)

msg_id – сообщение об ошибке определяет пользователь, сохраняется в таблице sysmessages

msg_str – специальное сообщение формата аналогично printf, содержит текст ошибки

severity – уровень строгости определяет пользователь, связанный с этим сообщением. Уровни от 0 до 18 могут использоваться любыми пользователями. Уровни 19-25 только членами роли sysadmin

state – число 1-127, которое определяет состояние вызова ошибки (по умолчанию 1)

declare @DBID int set @DBID = DB_ID()

declare @DBNAME NVARCHAR(128) set @DBNAME = DB_NAME()

RAISERROR (‘текущая БД имеет номер ID: %d, имя базы: %s’, 16, 1, @DBID, @DBNAME)

Для БД STUD результат имеет вид: текущая БД имеет номер ID: 10, имя базы: STUD

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

Create TRIGGER qq ON dbo.vrach instead of INSERT AS

Declare @fam char(20), @nom int

Declare @DBNAME char(10) set @DBNAME = DB_NAME()

Declare @len int set @len=COL_LENGTH(‘vrach’, ‘fam’)

Select @fam=ins.fam from inserted ins

If exists (select * from vrach where fam=@fam)

RAISERROR (‘в БД %s в таблице VRACH уже существует запись %s’, 16, 1, @DSNAME, @fam)

Else

If len(@fam)>14

RAISERROR (‘в таблицу VRACH значение %s не может быть занесено, т.к. превышает размер поля %d’, 16, 1, @fam, @len) with LOG

Else begin

Select @nom=max(k_vr) from vrach

Insert vrach (k_vr, fam) values(@nom+1, @fam) end

Результат:

Insert vrach(k_vr, fam) values(0, ‘Петров’)

в БД klinika в таблице VRACH уже существует запись ‘Петров’

Insert vrach(k_vr, fam) values(0, ‘Петровский П.П.’)

в таблицу VRACH значение Петровский П.П. не может быть занесено, т.к. превышает размер поля 15

Для этих же целей используется хранимая процедура sp_addmessage

Exec sp_addmessage 50001, 16, N’в таблице VRACH размер поля fam=15. Повторите ввод с правильными данными’

58