50428 (Особенности разработки триггеров и хранимых процедур в СУБД), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Особенности разработки триггеров и хранимых процедур в СУБД", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "50428"

Текст 3 страницы из документа "50428"

Нужно изменить имя процедуры в первой строке шаблона и ввести текст процедуры в соответствии с правилами языка Transact-SQL.

Если в теле процедуры нужно ввести инструкцию SQL SELECT, то можно воспользоваться для этого Конструктором запросов. Установите курсор на строке редактора, в которой должна быть введена инструкция SELECT и нажмите кнопку Вставить SQL (Insert SQL) на панели инструментов . Появится окно Конструктора запросов. После того как запрос будет создан, нужно закрыть это окно, подтвердив сохранение изменений инструкции SQL.

Пример использования хранимой процедуры в качестве источника записей вы увидите, если откроете отчет "2". В качестве источника записей в этом отчете используется одноименная хранимая процедура. В свойстве Входные параметры (Input Parameters) этого отчета описаны два параметра: @Beginning_date И @Ending_date.

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

SELECT данные.фамилия, данные.имя, данные.отчество, данные.образование

FROM данные LEFT JOIN оклады ON данные.[код оклада] = оклады.[код оклада]

WHERE (((оклады.[код оклада]) Is Null));

'данные' без подчиненных в 'оклады'

фамилия

имя

отчество

образование

СИДОРЧУК

Валентина

Викторовна

4. Триггеры

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

Существует три основных SQL-операции, применимые к данным, - INSERT/DELETE/UPDATE. А поскольку срабатывание триггера может происходить "до" (BEFORE)и "после"(AFTER) операции, то получается шесть возможных видов триггеров на таблицу - до и после каждой из трех возможных SQL-операций.

Триггер может быть активный (ACTIVE) и неактивный (INACTIVE).

  • Польза от применения триггеров.

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

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

- Автоматическая регистрация изменений в таблицах. Приложение может регистрировать с помощью триггера изменения в таблице.

- Автоматическая регистрация изменений в базе данных с помощью обработчиков событий в триггерах.

  • Примеры триггеров.

Триггер (англ. trigger «собачка, защёлка, спусковой крючок»):

в русском языке первоначально — термин из области радиосхем, позже электронной техники: пусковая схема, схема с несколькими устойчивыми состояниями, см. триггер (электроника); в последнее время заимствовались и другие значения английского оригинала:

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

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

Триггер срабатывает после удаления строки из таблицы DAN и записывает удаленную строку в таблицу UD_DAN.

SET TERM^;

CREATE TRIGGER CHRAN_UD_DAN FOR DAN

ACTIVE AFTER DELETE POSITION 0

AS

BEGIN

INSERT INTO UD_DAN

VALUES(OLD.TAB_NO,OLD.FAM,OLD.IMIA,OLD.OTSH,OLD.G_R,OLD.ADRES,OLD.TEL,OLD.DATA_P,OLD.DATA_U, OLD.OBRAZ,OLD.SEM_POLOJ, OLD.S_N_PASPORT, OLD.K_V, OLD.K_O, OLD.K_P);

END^

SET TERM;^

Теперь если выполнить команду

DELETE FROM DAN

WHERE TAB_NO=1014; // (и 1013)

произойдёт конечно удаление строки из таблицы DAN, сработает триггер и удаленная строка запишется в таблицу UD_DAN, которая собственно и предназначена для хранения удаленных данных.

Что бы отключить триггер следует выполнить команду

ALTER TRIGGER <имя триггера> INACTIVE;

Что бы включить триггер следует выполнить команду

ALTER TRIGGER <имя триггера> ACTIVE;

Что бы удалить триггер команда

DROP TRIGGER ;

Следующий триггер, срабатывает ДО ВСТАВКИ (BEFORE INSERT) в таблицу DAN и заполняет поле первичного ключа (TAB_NO).

SET TERM ^;

CREATE TRIGGER VS_T FOR DAN

ACTIVE BEFORE INSERT POSITION 0

AS

BEGIN

IF (NEW.TAB_NO IS NULL) THEN

NEW.TAB_NO=GEN_ID (TAB, 1);

END ^

SET TERM; ^

Для этого триггера потребуется генератор с начальным значением 1012, так как это максимальный табельный номер уже заполненной таблицы DAN и, новым сотрудникам, вносимым в таблицу, будут присвоены табельные номера, следующие за 1012.

CREATE GENERATOR TAB;

SET GENERATOR TAB TO 1012;

При вставки новой строки в таблицу DAN, даже не указав значение поля TAB_NO,

INSERT INTO DAN (FAM, IMIA, OTSH, G_R, ADRES, TEL, DATA_P, DATA_U, OBRAZ,

SEM_POLOJ, S_N_PASPORT, K_V, K_O, K_P)

VALUES ('Кротов', 'Андрей', 'Федорович', '12.08.1961', 'Кирова 52-124', '281344', '21.02.2008', '28.03.2008','среднее''холост', '9999 22', '900' , '50' , '1');

То есть триггер перед вставкой произвел проверку, указал ли пользователь значение поля TAB_NO, и не обнаружив такового, воспользовался генератором, увеличив его значение на 1, занес полученное в поле TAB_NO нового сотрудника.

Генератор, в свою очередь, теперь хранит значение 1014.

Кроме контекстной переменной NEW, существует переменная OLD. В отличие от NEW, OLD содержит старые значения записи, которые удаляются или изменяются. Например, можно использовать переменную OLD для получения значений записей, которые удаляются из таблицы.

Следующий триггер срабатывает ПОСЛЕ УДАЛЕНИЯ (AFTER DELETE) и записывает строки, удаленные из таблицы в отдельную таблицу.

Сначала необходимо создать таблицу для хранения удаленных данных.

CREATE TABLE DAN_D

(TAB_NO_D Float,

FAM_D Varchar (20),

IMIA _D Varchar (20),

OTSH_D Varchar (20),

G_R_D Date,

ADRES_D Varchar (20),

TEL_D Char (6) );

SET TERM ^;

CREATE TRIGGER DEL_DAN FOR DAN

ACTIVE AFTER DELETE POSITION 0

AS

BEGIN

INSERT INTO DAN_D

VALUES (OLD.TAB_NO, OLD.FAMILIA, OLD. IMIA E, OLD.OTSHO, OLD.GOD_R,

OLD.ADRES, OLD.TEL);

END ^

SET TERM; ^

Как только происходит удаление строки из таблицы DANNIE,

DELETE FROM DANNIE

WHERE TAB_NO=1013;

Так как, в данной БД при удалении строки из таблицы DAN удаляется и строка из таблицы NASH (начисления) с идентичным табельным номером (TAB_NO), уместно было бы создать триггер, который сохранял бы и данные из таблицы NASH. Чтобы не создавать лишние таблицы для хранения удаленных данных можно расширить уже созданную таблицу DAN_D.

ALTER TABLE DAN_D ALL KOD_Z_D FLOAT;

ALTER TABLE DAN_D ALL KOD_D_D FLOAT;

ALTER TABLE DAN_D ALL KOD_V_D FLOAT;

ALTER TABLE DAN_D ALL SLOJ_D FLOAT;

ALTER TABLE DAN_D ALL PAIK_D FLOAT;

Следующий триггер срабатывает после удаления строки из таблицы NASH.

SET TERM ^;

CREATE TRIGGER DEL_NASH FOR NASH

ACTIVE AFTER DELETE POSITION 0

AS

BEGIN

UPDATE DAN_D

SET KOD_Z_D=OLD.KOD_Z, KOD_D_D=OLD.KOD_D,

KOD_V_D=OLD.KOD_V, SLOJ_D=OLD.SLOJ,

PAIK_D=OLD.PAIK

WHERE TAB_NO_D=OLD.TAB_NO;

END ^

SET TERM; ^

Теперь после команды

DELETE FROM DAN

WHERE TAB_NO=1012;

произойдет следующее:

  1. Произойдет удаление строки с TAB_NO=1014 из таблицы DAN.

  2. Сработает триггер DEL_DAN, который запишет удаленную строку в таблицу DAN_D.

  3. Произойдет удаление строки с TAB_NO=1014 из таблицы NASH.

  4. Сработает триггер DEL_NASH и допишет в, уже наполовину заполненную строку таблицы DAN_D, данные из таблицы NASH, соответствующие этому сотруднику (WHERE TAB_NO_D=OLD.TAB_NO).

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

SET TERM ^;

CREATE TRIGGER Z_NASH FOR DANNIE

ACTIVE AFTER INSERT POSITION 0

AS

BEGIN

EXECUTE PROCEDURE VSTAV_NASH (NEW.TAB_NO);

END^

SET TERM;^

Хранимая процедура, вызываемая триггером.

SET TERM ^;

CREATE PROCEDURE VSTAV_NASH (T FLOAT)

AS

BEGIN

INSERT INTO NASH

VALUES (: T, 200, 307, 100, 0.5, 20);

END^

SET TERM; ^

При вставке строки

INSERT INTO DAN (FAM, IMIA,OTSH,G_R,ADRES,TEL)

VALUES ('Кротов', 'Андрей', 'Федорович', '12.08.1961', 'Кирова 52-124', '281344');

произойдет следующее:

  1. Сработает триггер VS_T, который присвоит новому сотруднику,

следующий по порядку, табельный номер.

  1. Заполнятся строка в таблице DANNIE соответствующими данными о новом сотруднике.

3. Срабатывает триггер Z_NASH, который вызывает ХП.

4. Хранимая процедура VSTAV_NASH вставляет в таблицу NASH данные (принятые по умолчанию) для нового сотрудника.

  • Управление состоянием триггера.

По умолчанию триггер создается активным, т. е. он будет срабатывать при осуществлении соответствующей операции. Состоянием триггера управляет ключевое слово ACTIVE в заголовке. Если же триггер сделать неактивным, то он не будет исполняться при возникновении операции. Это бывает полезным при осуществлении каких-либо внеплановых операций над данными, например массовой заливке данных или ручном исправлении данных. Чтобы отключить триггер, необходимо выполнить команду DDL:

ALTER TRIGGER INACTIVE;

  • Удаление триггеров.

Удаление триггера выполняется с помощью оператора DROP TRIGGER. Синтаксис оператора удаления таков:

DROP TRIGGER name;

Здесь name – имя триггера.

Это отдельная подпрограмма, связанная с таблицей или вьюером , которая автоматически выполняет действие, когда модифицируется таблица или вьюер на уровне строки. Они не вызываются напрямую, только при модификации таблиц или вьюеров.

//Триггер срабатывает после удаления строки из таблицы DAN и записывает удаленную строку в таблицу UD_DAN.

SET TERM^;

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5137
Авторов
на СтудИзбе
440
Средний доход
с одного платного файла
Обучение Подробнее