ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.02.2024
Просмотров: 17
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«Сибирский государственный университет телекоммуникаций и информатики» (СибГУТИ)
Институт информатики и вычислительной техники
09.03.01 "Информатика и вычислительная техника" профиль "Программное обеспечение средств вычислительнойтехникииавтоматизированныхсистем"
Кафедра прикладной математики и кибернетики
Расчетно-графическая работа по дисциплине
«Сетевые базы данных»
Вариант - 3
Выполнил:
Студент гр. ИП-913
«»2023 г.
/Долгушин А.Е./
ФИО студента
Проверил:
Ст. препод. каф. ПМиК /Дьячкова И.С./
ФИО преподавателя
«»2023 г. Оценка
Новосибирск 2023 г.
Требуется обрабатывать данные о Банках и Банкоматах. Любой банк может иметь несколько банкоматов. Процедура должна удалять банкомат. Триггер должен запрещать удаления для пользователя, не являющегося владельцем таблицы. Включить в пакет еще одну процедуру, которая выводит количество банкоматов для каждого банка, кроме банка, указанного в параметре. Выборку данных производить в ассоциативный массив.
Создать две таблицы, каждая из которых должна иметь первичный ключ и, по крайней мере, один столбец с ограничением
NOT NULL. Таблицы должны быть связаны внешним ключом; тип связи
- "один-ко-многим". Создать пакет, содержащий процедуру начального заполнения таблиц данными (по 7-10 записей в таблице) и процедуру
очистки таблиц (удаления записей).
Для одной из таблиц разработать триггер для обеспечения дополнительных ограничений на изменение данных таблицы (см. свой вариант задания).
Создать представление, которое позволяет запрашивать данные из обеих (связанных) таблиц. Представление должно ограничивать доступ к данным по столбцам и строкам.
Написать второй пакет, в состав которого включить вызовы процедур из первого пакета. В пакет также поместить процедуру изменения данных в таблицах (см. свой вариант задания).
Значения изменяемых данных должны передаваться в процедуру как параметры. В процедурах предусмотреть обработку исключений.
Обеспечить подтверждение транзакций при их успешном выполнении и откат - в случае возникновения исключительной ситуации.
Предоставить привилегии всем пользователям базы данных Oracle на использование представления для просмотра данных. Предоставить привилегию конкретному пользователю на выполнение процедуры изменения данных.
Код сценария
DROP TABLE BANK;
DROP TABLE BANK_MACHINE;
CREATE TABLE BANK
(
BANK_ID NUMBER(4),
BANK_NAME VARCHAR2(100) NOT NULL,
CONSTRAINT bank_pk PRIMARY KEY (BANK_ID)
);
CREATE TABLE BANK_MACHINE
(
MACHINE_ID NUMBER(4),
BANK_ID NUMBER(4),
MACHINE_NAME VARCHAR2(100) NOT NULL,
CONSTRAINT bank_machine_pk PRIMARY KEY (MACHINE_ID),
CONSTRAINT bank_machine_fk FOREIGN KEY (BANK_ID) REFERENCES BANK(BANK_ID) ON DELETE CASCADE
);
/
DROP SEQUENCE BANK_SEQUENCE;
DROP SEQUENCE BANK_MACHINE_SEQUENCE;
CREATE SEQUENCE BANK_SEQUENCE START WITH 1;
CREATE SEQUENCE BANK_MACHINE_SEQUENCE START WITH 1;
/
CREATE OR REPLACE PACKAGE Pack_1 IS
PROCEDURE Bank_tables_init;
PROCEDURE Bank_tables_delete;
END Pack_1;
/
CREATE OR REPLACE PACKAGE BODY Pack_1 IS
PROCEDURE Bank_tables_init IS
BEGIN
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'Альфа');
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'ВТБ');
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'Сбер');
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'Тинькофф');
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'Райффейзен');
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'Открытие');
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'УРАЛСИБ');
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'Левобережный');
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'Россельхоз');
INSERT INTO BANK VALUES (BANK_SEQUENCE.NEXTVAL, 'Промсвязь');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 1, 'Альфа-банкомат №1');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 3, 'Сбер-банкомат №1');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 4, 'Тинькофф-банкомат');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 7, 'УРАЛСИБ-банкомат');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 10, 'Промвязь-банкомат');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 2, 'ВТБ-банкомат');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 1, 'Альфа-банкомат №2');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 3, 'Сбер-банкомат №2');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 6, 'Открытие-банкомат');
INSERT INTO BANK_MACHINE VALUES (BANK_MACHINE_SEQUENCE.NEXTVAL, 5, 'Райффайзен-банкомат');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
ROLLBACK;
END;
PROCEDURE Bank_tables_delete IS
BEGIN
DELETE FROM BANK;
DELETE FROM BANK_MACHINE;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
ROLLBACK;
END;
END Pack_1;
/
CREATE OR REPLACE TRIGGER delete_trigger
BEFORE DELETE ON BANK_MACHINE FOR EACH ROW
DECLARE
owner_of_table VARCHAR2(100);
BEGIN
SELECT OWNER INTO owner_of_table FROM ALL_TABLES WHERE TABLE_NAME = 'BANK_MACHINE';
IF user != owner_of_table THEN
DBMS_OUTPUT.PUT_LINE(user || ' ' || owner_of_table);
raise_application_error(-20001, 'WRONG USER');
END IF;
END;
/
CREATE OR REPLACE PACKAGE Pack_2 IS
PROCEDURE Bank_tables_init_call;
PROCEDURE Bank_tables_delete_call;
PROCEDURE Bankomat_delete(num IN NUMBER);
PROCEDURE Bank_show(name1 IN VARCHAR2);
END Pack_2;
/
CREATE OR REPLACE PACKAGE BODY Pack_2 IS
PROCEDURE Bank_tables_init_call AS
BEGIN
Pack_1.Bank_tables_init;
END Bank_tables_init_call;
PROCEDURE Bank_tables_delete_call AS
BEGIN
Pack_1.Bank_tables_delete;
END Bank_tables_delete_call;
PROCEDURE Bankomat_delete(num IN NUMBER) AS
BEGIN
DELETE FROM BANK_MACHINE
WHERE MACHINE_ID = num;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
ROLLBACK;
END Bankomat_delete;
PROCEDURE Bank_show(name1 IN VARCHAR2) AS
CURSOR cur(bank_show VARCHAR2) IS
SELECT BANK_NAME, count(MACHINE_ID) AS count_bankomat FROM BANK JOIN BANK_MACHINE
ON BANK.BANK_ID = BANK_MACHINE.BANK_ID AND BANK_NAME <> bank_show GROUP BY BANK_NAME;
BEGIN
FOR item IN cur(name1) LOOP
DBMS_OUTPUT.PUT_LINE(item.BANK_NAME || ' ' || item.count_bankomat);
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
ROLLBACK;
END Bank_show;
END Pack_2;
/
CREATE OR REPLACE VIEW BANK_VIEW AS
SELECT BANK_NAME AS Банк, MACHINE_NAME AS Банкомат FROM BANK, BANK_MACHINE
WHERE BANK.BANK_ID = BANK_MACHINE.BANK_ID AND BANK_NAME != 'Левобережный';
/
BEGIN
Pack_2.Bank_tables_delete_call;
Pack_2.Bank_tables_init_call;
END;
/
SELECT * FROM BANK;
SELECT * FROM BANK_MACHINE;
/
SELECT * FROM BANK_VIEW;
/
BEGIN
Pack_2.Bank_show('Сбер');
END;
/
BEGIN
Pack_2.Bankomat_delete(2);
END;
/
SELECT * FROM BANK_MACHINE;
/
grant select on BANK_VIEW to public;
grant execute on WKSP_SBDLABS.Pack_2 to WKSP_REITAR;
select * from user_tab_privs;
revoke execute on WKSP_SBDLABS.Pack_2 from WKSP_REITAR;
revoke select on BANK_VIEW from public;
select * from user_tab_privs;
Результаты работы сценария
Рис.1-2Созданиеизаполнениетаблиц
Рис.3-4Работапроцедуры удаления банкоматов
Рис.5Работатриггера,которыйнепозволяет удалять другим пользователям
Рис.6Выводданныхпредставления
Рис.7Выдачапривилегий
Рис.8 Работа процедуры вывода банка и количества банкоматов