З а д а н и е № 5. По курсовому проекту: Данный этап проекта оформляется, как и два предыдущих этапа проекта. Домашнее задание сдается в письменном виде. 1. Для каждого отношения из вашей базы данных определите: (a) Подходящий ключ. (b) Если возможно, какое-либо ограничение «внешнего ключа», которое, повашему, должно выполняться для отношения. Измените схему (структуру) вашей базы, включив в нее определения ключей для каждого отношения и определение, по крайней мере, одного внешнего ключа (даже, если вы решили, что ограничений «внешнего ключа» не нужны - мы считаем, что практически любая база данных имеет естественные «внешние ключи»). Покажите структуру базы данных, после добавления ключей, и результаты выполнения команд определения ключей. 2. Добавьте два ограничения CHECK, одно связанное со столбцом, другое – со строкой. Помните, что это ограничение имеет некоторые особенности в Oracle, по сравнению с SQL. Покажите измененную структуру базы, результаты определения ограничений и ответы Oracle на попытку добавить информацию, не удовлетворяющую ограничениям. Этот пункт задания можно объединить с пунктом (1), чтобы не приводить несколько раз структуру базы данных. 3. Напишите 3 программы на языке PL/SQL (см. Методические материалы по Oracle «Использование PL/SQL») для выполнения некоторых действий над данными из вашей базы. Программы должны быть нетривиальными, т.е. они должны продемонстрировать такие возможности языка, как циклы, ветвления, работу с локальными переменными, использование курсоров. Какую обработку данных будут выполнять ваши программы придумайте сами, но, если возникнут затруднения, то воспользуйтесь следующими советами: a) Вычислите некоторое значение (например, среднее, сумму, количество и т.п.) по данным из одной таблицы и воспользуйтесь этим значением при модификации этой или любой другой таблицы. b) Создайте новую таблицу и заполните ее значениями, полученными из одной или нескольких таблиц базы. c) Разработайте ограничение для поиска и выдачи нарушений в данных. Представьте тексты программ и сценарий, демонстрирующий их работу. Продемонстрировать работу программ можно, например, следующим образом: выполнить запрос к таблице (таблицам) до работы программы и после работы программы, если эта программа модифицирует данные в этой таблице (таблицах). 4. Напишите 2 хранимые PL/SQL процедуры или подпрограммы. По крайней мере, одна из них должна содержать больше одной SQL команды, но использование «нетривиальных» возможностей языка, как в (1) не обязательно. Каждая процедура (подпрограммы) должна иметь один или несколько параметров. Представьте тексты процедур (подпрограмм) и сценарий, показывающий, как они вызываются, и демонстрирующий результат их выполнения (например, какие-либо запросы к таблицам до и после выполнения процедур (подпрограмм)). 5. Напишите 2 триггера Oracle. О триггерах Oracle см. Методические материалы по Oracle «Использование PL/SQL». Представьте тексты триггеров, сценарий, показывающий объявление триггеров, сценарий демонстрирующий работу триггеров на двух модификациях данных базы (одна из модификаций должна вызывать работу триггера, другая – нет). В сценарий включите запросы к базе, демонстрирующие эффект от работы триггера в первом случае и отсутствие эффекта – во втором. Домашнее задание: 1) Пусть есть база со следующими отношениями (4 балла): Команды(имя, страна, уровень_фанатов) Игроки(имя, страна, имя_команды, оклад) Игры(имя_команды1, колво_голов1, имя_команды2, колво_голов2, дата) Голы(Имя_игрока, колво_голов, дата) Напишите структуру базы на языке SQL, предусмотрев в ней следующие ограничения: a) Название команды - уникально. b) Атрибут «уровень_фанатов» может принимать одно из двух значений «умеренный» или «дикий». c) Все команды из Англии имеют только «диких» фанатов. d) Если игрок присутствует в таблице Голы, то он должен присутствовать и в таблице Игроки (можно рассматривать, что имя, как ключ таблицы Игроки). e) Игрок играет только в одной команде. f) Приглашенный (иностранный) игрок (его(ее) страна отличается от страны команды) имеет оплату на 20% больше, чем любой не приглашенный игрок, играющий в этой же команде. g) Все игры – игры между разными командами. h) Две команды могут сыграть более одной игры, но в разное время (дату). i) В отношении Голы хранится информация об игроках, которые поразили цель, по крайней мере, один раз на эту дату. j) Все голы представляются в отношение Голы, то есть, число голов, выигранных командой на определенную дату должно равняться сумме числа голов, выигранных игроками на эту же дату. 2) (4 балла) Напишите сценарий, в котором результат последовательности модификаций базы данных (вставка, удаление и изменения) не будет зависеть от политики ограничения целостности, но промежуточные результаты отличаются в зависимости от этой политики. В сценарий надо включить: SQL определение базы данных, по крайней мере, с одним ограничением целостности. начальное состояние вашей базы данных. последовательность изменений базы данных. состояние базы данных после каждой модификации базы данных для трех возможных способов обработки нарушения ограничения целостности (запрет, каскадирование, установка NULL значений) 3) (4 балла) Используя структуру базы в задании 1, напишите на языке PL/SQL: a) Процедуру Продажа(Игрок, команда1, команда 2), которая проверяет, что если игрок Игрок в настоящее время играет в команде команда 1, и если это так, то заменяет название команды на команда 2, и назначает 10% надбавку к окладу. b) Используя отношение Голы, напишите процедуру, для выявления игроков, которые имеют по два гола в один день, и добавления им $ 1000 к окладу; по три гола в один день - $ 10,000, и по четыре и больше - $ 2,000. Обратите внимание: в этом задании надо использовать курсор, даже если можно обойтись без него. 4) (3 балла) Пусть есть база данных с отношениями: ПРОДАВЕЦ(Имя, зарплата) ЗАКАЗ(Номер, Имя покупателя, Имя продавца, Сумма) ПОКУПАТЕЛЬ(Имя, Город, ТипПромышленности) Напишите команды модификации структуры и данных: 1. Сформулируйте команду изменения схемы отношения ПРОДАВЕЦ с целью добавления атрибута Процент_от_заказа для хранения бонуса к зарплате. 2. В отношении ЗАКАЗ преобразовать значения суммы заказа в рублях в суммы заказа в у.е. (1 у.е.=31.0 руб.). 3. Удалить информацию обо всех продавцах, насчитывающих менее трех заказов. 4. Удалить из отношения ПОКУПАТЕЛЬ сведения о покупателях, которые не совершили ни одного заказа. 5) (3 балла) Напишите на языке PL/SQL процедуру для вставки нового заказа в отношение ЗАКАЗ. Процедура, в качестве входных параметров принимает 2 значения – Имя покупателя и Имя продавца, который будет работать с этой фирмой. П р и м е ч а н и е: Значение атрибута Сумма принимается по умолчанию, а значение атрибута Номер ваша процедура должна каким-либо образом получить на основе имеющейся в базе информации.