Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные № 7-8

.docx
Скачиваний:
9
Добавлен:
06.02.2022
Размер:
122.06 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Ордена Трудового Красного Знамени

Федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»

Кафедра «Интеллектуальные системы в управлении и автоматизации»

Отчет по лабораторным работам №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