Триггеры

END

BEGIN

Еnd

Begin

Else

End

Begin

-- присвоение значений переменнным

-- @class_id, @sub_class_id, @group_id,

-- alphabetic_id @IerarhiID из

-- значений ячеек в столбцах таблицы

-- dbo.DISEASE_IERARHI

select @class_id=DISEASE_CLASS_ID, @sub_class_id=DISEASE_SUBCLASS_ID,

@group_id=DISEASE_GROUP_ID,

@alphabetic_id=ALPHABIT_ID,

@IerarhiID=ID

from dbo.DISEASE_IERARHI

where DISEASE_ID=@DiseaseID

-- Сравнение значения столбца ID из таблицы

-- dbo.DISEASE_IERARHI со значением из

-- подзапроса

and ID=

(

select MIN(ID) from dbo.DISEASE_IERARHI i

where i.DISEASE_ID=@DiseaseID

)

-- Присвоение значений переменным из первой строки

-- запроса.

select top 1 @class_id=DISEASE_CLASS_ID,

@sub_class_id=DISEASE_SUBCLASS_ID,

@group_id=@DiseaseGroupID,

@alphabetic_id=ALPHABIT_ID,

@IerarhiID=ID,

@DiseaseID=DISEASE_ID

from dbo.DISEASE_IERARHI

where DISEASE_GROUP_ID=@DiseaseGroupID

and ID=

(

select MIN(ID) from dbo.DISEASE_IERARHI i

where i.DISEASE_GROUP_ID=@DiseaseGroupID

)

В вышеупомянутом примере происходит присваивание значений переменным @class_id, @sub_class_id, @group_id, @alphabetic_id, @IerarhiID, @DiseaseID в зависимости от значений переменной @DiseaseID.

Блоки кода begin..end служат для указания границ инструкции if...else.

 

Инструкция while применяется для многократного выполнения блока кода до тех пор, пока заданное условие истинно. Далее приведен пример.

 

DECLARE @var1 INT,

@var2 VARCHAR(30)

SET @var1 = 1

WHILE @var1 <= 10

-- присваивается переменной

-- @var2 значение'Iteration #'+символьное значение

-- переменной @var1

SET @var2 = 'Iteration #' +

CAST(@var1 AS VARCHAR(2))

-- и печатается на экран значение переменной @var2

PRINT @var2

–- увеличивается значение переменной @var1 на 1

SET @var1 += 1

 

Важно!

Одна из самых распространенных ошибок, которую вы можете допустить при напи­сании блоков программного кода, использующих if или while, — забыть о том, что SQL Server выполняет только следующую инструкцию в соответствии с условием. Во избежание подобных ошибок настоятельно рекомендуется всегда применять конструкцию begin. . .end с инструкциями if или while, даже если вы намерены выполнить только одну строку кода, зависящую от условия. Это не только сделает код более понятным, но и поможет исключить ошибки при изменении программного кода в дальнейшем.

Инструкция break применяется вместе с циклом while. Если необходимо пре­рвать выполнение в теле цикла while, с помощью этой инструкции можно пре­рвать повторное выполнение цикла. После выполнения инструкции break вы­полняется строка программного кода, следующая за циклом while. Инструкция continue применяется в цикле while для того, чтобы заставить код продолжить выполнение с первой строки цикла.

 

Инструкции break и continue почти никогда не применяются. Цикл while заверша­ется, как только условие цикла while перестает быть истинным. Вместо встраива­ния в цикл дополнительной проверки вместе с инструкцией break обычно циклами while управляют с помощью подходящих условий циклов. Кроме того, цикл продол­жает выполняться, пока условие while равно true. Следовательно, не возникает необходимости в применении инструкции continue.

Инструкция waitfor позволяет сделать паузу в выполнении программного кода. У этой инструкции есть три варианта: waitfor delay, waitfor time и waitfor receive. Вариант waitfor receive используется в сочетании с Service Broker, изучение которого выходит за рамки данного курса. waitfor time прерывает выполнение программ­ного кода до наступления заданного момента времени. Вариант waitfor delay приостанавливает выполнение на заданный промежуток времени.

 

 

DECLARE @var1 int

DECLARE @var2 varchar (30)

SET @var1 = 1

--Пауза на 2 секунды

WAITFOR DELAY '00:00:02'

WHILE @var1 <= 10 BEGIN

SET @var2 = 'Iteration #' +

CAST(@var1 AS VARCHAR(2))

PRINT @var2

SET @var1 += 1

End

 

Инструкция goto позволяет передать выполнение на метку, встроенную в про­цедуру. Применение конструкций, подобных goto, не одобряется во всех языках программирования.

 

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

Триггер (trigger) — это специализированная программа Transact-SQL или среды CLR, которая автоматически выполняется при возникновении события в базе данных. SQL Server 2008 позволяет создавать два типа триггеров: DML(Data Management Language)-триггеры, которые выполняются при возникновении событий языка обработки данных (DML), и DDL(Data Definition Language)-триггеры, срабатывающие при выполнении инструкций языка определения данных (DDL). DML- триггеры выполняются при изменении данных в указанной таблице или представлении посредством инструкций INSERT, UPDATE или DELETE. DDL-триггеры, которые выполняются при возникновении на сервере таких DDL-событий, как создание, изменение или удаление объекта, используются для администрирования базы данных, например для аудита и управления доступом к объектам. В этой лекции вы научитесь создавать DML-триггеры AFTER(которые срабатывают после изменения данных в таблице) и INSTEAD OF(которые срабатывают вместо изменения данных в таблице), определять рекурсивные и вложенные триггеры, управлять ими и создавать DDL-триггеры для выполнения задач администрирования.