Create trigger chran_ud_dan for DAN
⇐ ПредыдущаяСтр 3 из 3 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, который присвоит новому сотруднику, следующий по порядку, табельный номер. 2. Заполнятся строка в таблице DANNIE соответствующими данными о новом сотруднике. 3. Срабатывает триггер Z_NASH, который вызывает ХП. 4. Хранимая процедура VSTAV_NASH вставляет в таблицу NASH данные (принятые по умолчанию) для нового сотрудника. · Управление состоянием триггера. По умолчанию триггер создается активным, т. е. он будет срабатывать при осуществлении соответствующей операции. Состоянием триггера управляет ключевое слово ACTIVE в заголовке. Если же триггер сделать неактивным, то он не будет исполняться при возникновении операции. Это бывает полезным при осуществлении каких-либо внеплановых операций над данными, например массовой заливке данных или ручном исправлении данных. Чтобы отключить триггер, необходимо выполнить команду DDL: ALTER TRIGGER <trigger name> INACTIVE; · Удаление триггеров. Удаление триггера выполняется с помощью оператора DROP TRIGGER. Синтаксис оператора удаления таков: DROP TRIGGER name; Здесь name – имя триггера. Это отдельная подпрограмма, связанная с таблицей или вьюером, которая автоматически выполняет действие, когда модифицируется таблица или вьюер на уровне строки. Они не вызываются напрямую, только при модификации таблиц или вьюеров. //Триггер срабатывает после удаления строки из таблицы DAN и записывает удаленную строку в таблицу UD_DAN.
SET TERM^;
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|