Лабораторные № 7-8
.docx
Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра «Интеллектуальные системы в управлении и автоматизации»
Отчет по лабораторным работам №7-8
по дисциплине «Технологии баз данных»
Выполнил: Кондратьев И.В
Студент группы БСТ1851
Триггеры
Триггеры в Oracle — это процедуры на языке Java или SQL, которые вызываются при выполнении определенных действий с базой данных. Oracle поддерживает несколько типов триггеров: одни запускаются командами SQL, создающими в базе данных новые структуры, например таблицы, другие запускаются единожды на уровне таблицы, когда происходит изменение строк таблицы, третьи запускаются по одному разу для каждой измененной строки. Последние называются строчными триггерами (row triggers); их мы и будем рассматривать здесь. Oracle поддерживает три вида триггеров: предваряющие (триггеры BEFORE), завершающие (триггеры AFTER) и замещающие (триггеры INSTEAD OF).
Создать новый столбец AskingPrice
alter table TRANSACTION
add AskingPrice Number(7,2);
Создать Предваряющий триггер New_Price
CREATE OR REPLACE TRIGGER New_Price
BEFORE INSERT OR UPDATE of Acquisitionprice ON TRANSACTION
FOR EACH ROW
/* Устанавливаем новое значение AskingPrice перед вставкой или обновлением */
BEGIN
:new.AskingPrice := :new.AcquisitionPrice * 2;
END;
select * from TRANSACTION;
update TRANSACTION
set acquisitionprice=acquisitionprice
where acquisitionprice is not null;
select * from transaction;
Создать завершающий триггер On_Work_lnsert
CREATE OR REPLACE TRIGGER On_WORK_Insert
AFTER INSERT ON WORK
FOR EACH ROW
DECLARE
rowcount integer(2);
BEGIN
/* Считаем доступные строки */
SELECT Count (*) INTO rowcount
FROM TRANSACTION
WHERE CustomerID IS NULL AND WorkID=:new.WorkID;
IF rowcount > 0 Then /* Строка существует, ничего непредпринимаем */
DBMS_OUTPUT.PUT_LINE ('Подходящая строка в таблице
TRANSACTION существует -- никаких действий не предпринято.');
RETURN;
ELSE /* Нужно добавить новую строку */
INSERT INTO TRANSACTION (TransactionID, DateAcqulred,WorkID)
VALUES (TransID.NextVal, SysDate, :new.WorkID);
END IF;
END;
insert into WORK (WorkID, Title, Copy, ArtistID)
values (WorkID.NextVal, '11FORTEST','1',7);
select WORKID,TITLE,COPY,ARTISTID,DESCRIPTION from WORK;
Определение представления CustomerPurchases
CREATE or replace VIEW CustomerPurchases AS
SELECT CUSTOMER.Name CustName, Copy, Title, ARTIST.Name
FROM CUSTOMER, TRANSACTION, WORK, ARTIST
WHERE CUSTOMER.CustomerID = TRANSACTION.CustomerID AND
TRANSACTION.WorkID = WORK.WorkID AND
WORK.ArtistID = ARTIST.ArtistID;
Создать замещающий триггер Title_Update
CREATE OR REPLACE TRIGGER Title_Update
INSTEAD OF UPDATE ON CustomerPurchases
FOR EACH ROW
BEGIN
/* Ничего не делаем, кроме случая, когда обновляется столбец Title */
IF :new.Title = :old.Title THEN
RETURN;
END IF;
UPDATE WORK
SET Title = :new.Title
WHERE Title = :old.Title;
END;
SELECT * FROM CustomerPurchases;
update CustomerPurchases SET Title='123Q' where title='pic1';
SELECT * FROM CustomerPurchases;
Москва 2021