Триггеры
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-триггеры для выполнения задач администрирования.