Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3к5с Современные технологии управления базами данных / Контрольная рекламное агентство.docx
Скачиваний:
12
Добавлен:
27.11.2024
Размер:
398.74 Кб
Скачать

СОДЕРЖАНИЕ

Y

2. РАЗРАБОТКА КОНЦЕПТУАЛЬНОЙ МОДЕЛИ БАЗЫ ДАННЫХ 3

ЗАКЛЮЧЕНИЕ 25

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 26

  1. Анализ предметной области

База данных предназначена для автоматизации информационных процессов рекламного агентства. Она реализует этап оформления заказа клиента на оказание услуг рекламной компанией. В основном входные данные приходят в виде звонков или заявок с сайта, которые обрабатывает и заполняет карточку заказа оператор рекламного агентства

База данных должна обеспечивать автоматизацию следующих процессов: регистрация заказов клиентов оператором. Внесения новых клиентов, новых сотрудников рекламного агентства, новых услуг и их цен или их редактирования. Также выводить информацию о горящих сроках заказов за 2 недели до их окончания.

При этом база данных обеспечивает: входной контроль данных с использованием триггеров, помощь при вводе данных в виде списков подстановки и масок ввода, подстановку значений по умолчанию и так далее.

  1. Разработка концептуальной модели базы данных

Концептуальное (инфологическое) проектирование – построение семантической модели предметной области, то есть информационной модели наиболее высокого уровня абстракции.

Целью концептуального проектирования является обеспечение наиболее естественных для человека способов сбора и представления той информации, которую предполагается хранить в создаваемой базе данных. Поэтому инфологическую модель данных пытаются строить по аналогии с естественным языком.

Основными конструктивными элементами инфологических моделей являются сущности, связи между ними и их свойства (атрибуты). Такая модель создаётся без ориентации на какую-либо конкретную СУБД и модель данных. Термины «семантическая модель», «концептуальная модель» и «инфологическая модель» являются синонимами [8].

Проведённый анализ предметной области позволяет построить её концептуальную модель, которая строится либо в виде диаграммы «Сущность-Связь» (Entity-Relationship-диаграммы, ER-диаграммы), либо записывается на языке концептуального(инфологического) моделирования (ЯКМ, ЯИМ).

Сущность Клиенты имеет следующие основные атрибуты:

- Код клиента

- Наименование компании

- ФИО клиента

- ИНН

- Адрес

- Индекс

- Город

- Телефон

Сущность Заказы имеет следующие основные атрибуты:

- Номер заказа

- Код клиента

- Код услуги

- Номер договора

- Наименование заказа

- Дата заказа

- Срок выполнения

- Код сотрудника

Сущность Услуги имеет следующие основные атрибуты:

- Код услуги

- Наименование услуги

- Цена услуги

Сущность Сотрудники имеет следующие основные атрибуты:

- Код сотрудника

- ФИО сотрудника

- ИНН

- Адрес

- Телефон

Сущность Заказ/Договор имеет следующие атрибуты (свойства):

- Номер договора

- Дата договора

- Сумма по договору

Изобразим это в виде диаграммы «Сущность-Связь» (ER-диаграммы), представленной на рисунке 1.

Рисунок 1 – ER-диаграмма базы данных

Все связи у сущностей «один ко многим».

  1. Физическое проектирование базы данных

Физическое проектирование – создание базы данных в среде SQL Server Management Studio 2017 средствами универсального компьютерного языка SQL, применяемого для создания, модификации и управления данными в реляционных базах данных.

Запрос на создание базы данных:

CREATE DATABASE REKLAMNOEAGENSTVO;4.1 Создание таблиц

3.1 СОЗДАНИЕ ТАБЛИЦ

Запрос на создание таблицы «Заказы»:

CREATE TABLE zakazi

(

KOD_ZAK int PRIMARY KEY NOT NULL IDENTITY (1,1),

KOD_KL int NOT NULL,

NOM_DOG int NOT NULL UNIQUE,

KOD_USLUG int NOT NULL,

NAIMEN_ZAK varchar(50) NOT NULL,

DATA date NOT NULL,

KOD_SR date NOT NULL,

KOD_ISP int NOT NULL DEFAULT 1

);

Из этой инструкции следует следующее описание структуры таблицы:

  1. KOD_ZAK – «Номер заказа», тип int, отражает номер заказа, данное поле является первичным и является счетчиком;

  2. KOD_KL – «Код клиента», тип int, данное поле является внешним ключем связи таблицы «Клиенты» поля «Код клиента»;

  3. NOM_DOG – «Номер договора», тип int, данное поле является внешним ключем связи таблицы «Заказ/Договор» поля «Номер договора»;

  4. KOD_USLUG – «Код услуги», тип int, данное поле является внешним ключем связи таблицы «Услуги» поля «Код услуги»;

  5. NAIMEN_ZAK – «Наименование заказа», тип varchar(50), данное поля для краткой информации о наименовании заказа;

  6. DATA – «Дата заказа», тип date, отражает дату заказа;

  7. KOD_SR – «Срок выполнения», тип date, отражает срок выполнения;

  8. KOD_ISP– «Код сотрудника», тип int, данное поле является внешним ключем связи таблицы «Услуги» поля «Код услуги».

Запрос на создание таблицы «Клиенты»:

CREATE TABLE klienti

(

KOD_KL int PRIMARY KEY NOT NULL IDENTITY (1,1),

NAZV_KOMP varchar(50) NOT NULL,

FIO_KL varchar(40) NOT NULL,

INN int NOT NULL,

ADDRESS_KL varchar(40) NOT NULL,

INDEX_KL int NOT NULL,

CITY varchar(30) NOT NULL,

TEL bigint NOT NULL

);

Из этой инструкции следует следующее описание структуры таблицы:

  1. KOD_KL – «Код клиента», тип int, отражает код клиент, данное поле является первичным и является счетчиком;

  1. NAZV_KOMP – «Наименование компании», тип varchar(50), отражает наименование компании;

  2. FIO_KL – «ФИО клиента», тип varchar(40),отражает фамилию имя отчество клиента;

  3. INN – «ИНН», тип int, отражает ИНН клиента;

  4. ADDRESS_KL – «Адрес», varchar(40) – отражает адрес клиента;

  5. INDEX_KL – «Индекс», тип int, отражает почтовый индекс клиента;

  6. CITY – «Город», тип varchar(30), отражает город клиента;

  7. TEL – «Телефон» тип bigint, отражает телефонный номер клиента.

Запрос на создание таблицы «Услуги»:

CREATE TABLE uslugi

(

KOD_USLUG int PRIMARY KEY NOT NULL IDENTITY (1,1),

NAME_USLUG varchar(30) NOT NULL,

CENA_USLUG bigint NOT NULL

);

Из этой инструкции следует следующее описание структуры таблицы:

  1. KOD_USLUG – «Код услуги», тип int, отражает код услуги, данное поле является первичным и является счетчиком;

  1. NAME_USLUG – «Наименование услуги», тип varchar(30), отражает наименование услуги;

  2. CENA_USLUG – «Цена услуги», тип int, отражает цену услуг.

Запрос на создание таблицы «Сотрудники»:

CREATE TABLE sotrudniki

(

KOD_SOTRUD int PRIMARY KEY NOT NULL IDENTITY (1,1),

FIO_SOTRUD varchar(40) NOT NULL,

INN int NOT NULL,

ADDRESS_SOTRUD varchar(40) NOT NULL,

TEL bigint NOT NULL

);

Из этой инструкции следует следующее описание структуры таблицы:

  1. KOD_SOTRUD – «Код сотрудника», тип int, отражает код сотрудника, данное поле является первичным и является счетчиком;

  1. FIO_SOTRUD – «ФИО сотрудника», тип varchar(40), отражает фамилию имя отчество сотрудника;

  2. ADDRESS_SOTRUD – «Адрес», varchar(40) – отражает адрес сотрудника;

  3. TEL – «Телефон» тип bigint, отражает телефонный номер сотрудника.

Запрос на создание таблицы «Заказ/Договор»:

CREATE TABLE zakaz_dogovor

(

NOM_DOG int PRIMARY KEY NOT NULL,

DATE_ZD date NOT NULL,

SUMMA_ZD bigint NOT NULL

);

Из этой инструкции следует следующее описание структуры таблицы:

  1. NOM_DOG – «Код сотрудника», тип int, номер договора, данное поле является первичным;

  1. DATE_ZD – «Дата договора», тип date, отражает дату договора;

  2. SUMMA_ZD – «Сумма по договору», тип bigint, отражает сумму по договору.

Создание связей между таблицами:

ALTER TABLE zakazi ADD CONSTRAINT c_klienti FOREIGN KEY (KOD_KL) REFERENCES klienti(KOD_KL) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE zakazi ADD CONSTRAINT c_zakazdogovor FOREIGN KEY (NOM_DOG) REFERENCES zakaz_dogovor(NOM_DOG) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE zakazi ADD CONSTRAINT c_kodisp_kodsotrud FOREIGN KEY (KOD_ISP) REFERENCES sotrudniki(KOD_SOTRUD) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;

ALTER TABLE zakazi ADD CONSTRAINT c_koduslug_zakusl FOREIGN KEY (KOD_USLUG) REFERENCES uslugi(KOD_USLUG) ON DELETE NO ACTION ON UPDATE NO ACTION;

3.2 СОЗДАНИЕ ЗАПРОСОВ

  1. Заполним таблицу «Клиенты» через команду insert:

INSERT INTO klienti( NAZV_KOMP, FIO_KL, INN, ADDRESS_KL, INDEX_KL, CITY, TEL)

VALUES

('ООО Рога и Копыта', 'Алексеев Алексей Алексеевич', 644000001, 'ул.Шевченко д.1', 413840, 'Москва', 89990000001),

('ООО Сибастьян', 'Тритонов Тритон Тритонович', 644000002, 'ул.Шевченко д.2', 413840, 'Санкт-Петербург', 89990000002),

('ООО Край света', 'Максимильян Максим Максимильянович', 644000003, 'ул.Шевченко д.3', 413840, 'Балашов', 89990000003),

('ООО Мозгопилпроминвест', 'Рогов Олег Владимирович', 644000004, 'ул.Шевченко д.4', 413840, 'Саратов', 899990000004),

('ООО Дыра на берегу', 'Древентий Борис Кирович', 644000005, 'ул.Шевченко д.5', 413840, 'Красноярск', 899990000005),

('ООО Автопромсветгаз', 'Пирогов Василий Евгеньевич', 644000006, 'ул.Шевченко д.6', 413840, 'Казань', 899990000006),

('ООО Мясоводахлебкомбинат', 'Молодинский Кирилл Евгеньевич', 644000007, 'ул.Шевченко д.7', 413840, 'Уфа', 89990000007),

('ООО Бременские музыканты', 'Петухов Олег Борисович', 644000007, 'ул.Шевченко д.8', 413840, 'Балаково', 89990000008);

Результат заполнения таблицы «Клиенты» представлен на рисунке 2.

Рисунок 2 – табличное представление таблицы «Клиенты»

  1. Заполним таблицу «Сотрудники» через команду insert:

INSERT INTO sotrudniki (FIO_SOTRUD, INN ,ADDRESS_SOTRUD,TEL)

VALUES

('Сейфетдинов Руслан Халимович', 644000011,'ул. Шевченко д.22 кв.56',89999882296),

('Архипов Роман Алексеевич', 644000012,'ул. Лобачевского д.120 кв.19',89271002030);

Результат заполнения таблицы «Сотрудники» представлен на рисунке 3.

Рисунок 3 – табличное представление таблицы «Сотрудники»

  1. Заполним таблицу «Услуги» через команду insert:

INSERT INTO uslugi ( NAME_USLUG, CENA_USLUG)

VALUES

('Разработка лендинга', 20000),

('Разработка сайта каталога', 30000),

('Разработка интернет магазина', 80000),

('Разработка Фирменного стиля', 50000);

Результат заполнения таблицы «Услуги» представлен на рисунке 4.

Рисунок 4 – табличное представление таблицы «Услуги»

  1. Заполним таблицу «Заказ/Договор» через команду insert:

INSERT INTO zakaz_dogovor (NOM_DOG,DATE_ZD,SUMMA_ZD)

VALUES

(100101,'18-11-01',20000),

(100102,'18-11-03',20000),

(100103,'18-11-05',30000),

(100104,'18-11-07',30000),

(100105,'18-11-09',80000),

(100106,'18-11-11',80000),

(100107,'18-11-13',50000),

(100108,'18-11-15',50000);

Результат заполнения таблицы «Заказ/Договор» представлен на рисунке 5.

Рисунок 5 – табличное представление таблицы «Заказ/Договор»

  1. Заполним таблицу «Заказы» через команду insert:

INSERT INTO zakazi (KOD_KL,NOM_DOG,KOD_USLUG,NAIMEN_ZAK,DATA,KOD_SR,KOD_ISP)

VALUES

(1,100101,1, 'Разработать лендинг ASAP', '2018-11-01', '2018-12-05',1),

(2,100102,1, 'Разработать лендинг ASAP', '2018-11-03', '2018-12-05',2),

(3,100103,2, 'Разработать каталог ASAP', '2018-11-05', '2018-12-05',1),

(4,100104,2, 'Разработать каталог ASAP', '2018-11-07', '2018-12-05',2),

(5,100105,3, 'Разработать интернет магазин ASAP', '2018-11-09', '2018-12-05',1),

(6,100106,3, 'Разработать интернет магазин ASAP', '2018-11-11', '2018-12-05',2),

(7,100107,4, 'Разработать корп стиль ASAP', '2018-11-13', '2018-12-05',1),

(8,100108,4, 'Разработать корп стиль ASAP', '2018-11-15', '2018-12-05',2);

Результат заполнения таблицы «Заказы» представлен на рисунке 6.

Рисунок 6 – табличное представление таблицы «Заказы»

    1. Создание запросов

Запросы на вывод всех созданных таблиц:

SELECT * FROM klienti

SELECT * FROM sotrudniki

SELECT * FROM uslugi

SELECT * FROM zakaz_dogovor

SELECT * FROM zakazi

Результат работы запросов можно посмотреть на рисунке 9.

Рисунок 10 – вывод всех созданных таблиц

Запрос на вывод таблицы «Заказы» в более информативной форме, с использованием связей и подстановок столбцов из других таблиц:

SELECT zakazi.KOD_ZAK, klienti.NAZV_KOMP, zakazi.NOM_DOG, uslugi.NAME_USLUG, zakazi.NAIMEN_ZAK, zakazi.DATA, zakazi.KOD_SR, sotrudniki.FIO_SOTRUD

FROM zakazi

INNER JOIN

klienti ON zakazi.KOD_ZAK = klienti.KOD_KL

INNER JOIN

uslugi ON zakazi.KOD_USLUG = uslugi.KOD_USLUG

INNER JOIN

sotrudniki ON zakazi.KOD_ISP = sotrudniki.KOD_SOTRUD

Результат работы запроса можно посмотреть на рисунке 10.

Рисунок 10 – вывод таблицы «Заказы» в информативной форме

Запрос на вывод горящих сроков по проектам на предстоящей 1 неделе:

SELECT klienti.NAZV_KOMP, uslugi.NAME_USLUG, zakazi.KOD_SR, sotrudniki.FIO_SOTRUD

FROM zakazi

INNER JOIN

klienti ON zakazi.KOD_ZAK= klienti.KOD_KL

INNER JOIN

uslugi ON zakazi.KOD_USLUG = uslugi.KOD_USLUG

INNER JOIN

sotrudniki ON zakazi.KOD_ISP = sotrudniki.KOD_SOTRUD

WHERE zakazi.KOD_SR BETWEEN GETDATE() AND DATEADD(D, 7, GETDATE())

Результат работы запроса можно посмотреть на рисунке 11.

Рисунок 11 – вывод запроса горящих сроков по проектам

Запрос на вывод всех цен на услуги по убыванию:

SELECT uslugi.NAME_USLUG, uslugi.CENA_USLUG FROM uslugi ORDER BY CENA_USLUG DESC

Результат работы запроса можно посмотреть на рисунке 12.

Рисунок 12 – вывод запроса цен на услуги по убыванию

Запрос прибыли рекламного агентства за последний месяц от каждого сотрудника:

SELECT SUM(uslugi.CENA_USLUG) AS SUM_SOTRUD, sotrudniki.FIO_SOTRUD

FROM zakazi

INNER JOIN

klienti ON zakazi.KOD_ZAK= klienti.KOD_KL

INNER JOIN

uslugi ON zakazi.KOD_USLUG = uslugi.KOD_USLUG

INNER JOIN

sotrudniki ON zakazi.KOD_ISP = sotrudniki.KOD_SOTRUD

WHERE zakazi.KOD_SR BETWEEN DATEADD(M, -1, GETDATE()) AND GETDATE()

GROUP BY sotrudniki.FIO_SOTRUD

Результат работы запроса можно посмотреть на рисунке 13.

Рисунок 13 – запрос прибыли рекламного агентства за последний месяц от каждого сотрудника

    1. Создание представлений

Создадим представления по 3 последним запросам которые мы сделали:

  1. Запрос на вывод заказов в информативной форме

create view ZAPROS_ZAKAZI_VIVOD_V_INFORMATIVNOY_FORME as (

SELECT zakazi.KOD_ZAK, klienti.NAZV_KOMP, zakazi.NOM_DOG, uslugi.NAME_USLUG, zakazi.NAIMEN_ZAK, zakazi.DATA, zakazi.KOD_SR, sotrudniki.FIO_SOTRUD

FROM zakazi

INNER JOIN

klienti ON zakazi.KOD_ZAK = klienti.KOD_KL

INNER JOIN

uslugi ON zakazi.KOD_USLUG = uslugi.KOD_USLUG

INNER JOIN

sotrudniki ON zakazi.KOD_ISP = sotrudniki.KOD_SOTRUD)

  1. Запрос на вывод горящих сроков на предстоящей неделе

create view ZAPROS_GORYASHIH_SROKOV_1_NEDELYA as (

SELECT klienti.NAZV_KOMP, uslugi.NAME_USLUG, zakazi.KOD_SR, sotrudniki.FIO_SOTRUD

FROM zakazi

INNER JOIN

klienti ON zakazi.KOD_ZAK= klienti.KOD_KL

INNER JOIN

uslugi ON zakazi.KOD_USLUG = uslugi.KOD_USLUG

INNER JOIN

sotrudniki ON zakazi.KOD_ISP = sotrudniki.KOD_SOTRUD

WHERE zakazi.KOD_SR BETWEEN GETDATE() AND DATEADD(D, 7, GETDATE()))

  1. Запрос прибыли рекламного агентства за месяц от каждого сотрудника

create view ZAPROS_PRIBILI_AGENSTVA_ZA_MESYAC_OT_SOTRUDNIKA as (

SELECT SUM(uslugi.CENA_USLUG) AS SUM_SOTRUD, sotrudniki.FIO_SOTRUD

FROM zakazi

INNER JOIN

klienti ON zakazi.KOD_ZAK= klienti.KOD_KL

INNER JOIN

uslugi ON zakazi.KOD_USLUG = uslugi.KOD_USLUG

INNER JOIN

sotrudniki ON zakazi.KOD_ISP = sotrudniki.KOD_SOTRUD

WHERE zakazi.KOD_SR BETWEEN DATEADD(M, -1, GETDATE()) AND GETDATE()

GROUP BY sotrudniki.FIO_SOTRUD)

  1. Запрос цен услуг по убыванию

create view ZAPROS_CEN_USLUG_PO_UBIVANIY as (

SELECT uslugi.NAME_USLUG, uslugi.CENA_USLUG FROM uslugi ORDER BY CENA_USLUG DESC)

4.5 Создание транзакций

Транзакция – это одна или несколько последовательных команд языка Transact - SQL, выполняемых как единое целое, образуя логически завершённый пакет.

Если по какой-либо причине хотя бы одна из команд пакета не выполняется, то происходит откат системы к состоянию, в котором она была до начала транзакции, и транзакция считается не выполненной. По умолчанию каждая команда выполняется, как самостоятельная транзакция. При необходимости в пакете можно явно указать начало и конец транзакции.

Транзакция должна выполняться, не нарушая атомарность, согласованность, изолированность и долговечность.

Атомарность – правило, при котором изменения выполняемые транзакции либо все выполняются, либо все не выполняются.

Согласованность – правило, при котором все данные после выполнения транзакции должны находиться в согласованном состоянии с соблюдением всех правил и ограничений целостности.

Изолированность – правило, при котором изменения данных различными транзакциями, выполняемыми одновременно, должны быть изолированы.

Долговечность – правило, при котором после завершения транзакции ничто не может вернуть систему в состояние, в котором она была до начала транзакции.

Пример создания транзакции в базе данных «Рекламное агенство»: Создание транзакции для изменения номера договора в двух таблицах

Создадим транзакцию, где запишем старый и новый номер договора в двух таблицах и выведем эти таблицы для проверки. Результат работы кода предоставлен на рисунке 15.

USE REKLAMNOEAGENSTVO;

BEGIN TRANSACTION

ALTER TABLE zakazi DROP CONSTRAINT c_zakazdogovor

UPDATE zakaz_dogovor

SET NOM_DOG = 100109

WHERE NOM_DOG = 100108

IF (@@error <> 0)

ROLLBACK

UPDATE zakazi

SET NOM_DOG = 100109

WHERE NOM_DOG = 100108

IF (@@error <> 0)

ROLLBACK

ALTER TABLE zakazi

ADD CONSTRAINT c_zakazdogovor

FOREIGN KEY (NOM_DOG)

REFERENCES zakaz_dogovor(NOM_DOG)

ON DELETE NO ACTION ON UPDATE NO ACTION;

COMMIT

SELECT * FROM zakaz_dogovor

SELECT * FROM zakazi

Рисунок 15 – Результат выполнения транзакции

4.6 Создание процедуры для смены номера договора

create procedure SMENA_DOGOVORA (@STARIY_DOGOVOR int,@NOVIY_DOGOVOR int) as

BEGIN TRANSACTION

ALTER TABLE zakazi DROP CONSTRAINT c_zakazdogovor

UPDATE zakaz_dogovor

SET NOM_DOG = @NOVIY_DOGOVOR

WHERE NOM_DOG = @STARIY_DOGOVOR

IF (@@error <> 0)

ROLLBACK

UPDATE zakazi

SET NOM_DOG = @NOVIY_DOGOVOR

WHERE NOM_DOG = @STARIY_DOGOVOR

IF (@@error <> 0)

ROLLBACK

ALTER TABLE zakazi

ADD CONSTRAINT c_zakazdogovor

FOREIGN KEY (NOM_DOG)

REFERENCES zakaz_dogovor(NOM_DOG)

ON DELETE NO ACTION ON UPDATE NO ACTION;

COMMIT

SELECT * FROM zakaz_dogovor

SELECT * FROM zakazi

Вызов процедуры для зачисления денежных средств: execute SMENA_DOGOVORA 100102, 100112 предоставлен на рисунке 16.

Рисунок 16 – результат работы процедуры

Триггер, который автоматически записывает в таблицу HISTORY_NOM_DOG старое и новое значение номера договора и время произведенного изменения. Создадим таблицу HISTORY_NOM_DOG

CREATE TABLE HISTORY_NOM_DOG

(Id INT IDENTITY PRIMARY KEY,

STARIY INT NOT NULL,

NOVIY INT NOT NULL,

DATA_RED DATETIME NOT NULL DEFAULT GETDATE(),);

Создадим тригер

CREATE TRIGGER IZM_DOG

ON zakaz_dogovor

AFTER UPDATE

AS

INSERT INTO HISTORY_NOM_DOG (STARIY, NOVIY)

SELECT DELETED.NOM_DOG, inserted.NOM_DOG from DELETED, INSERTED

После создания тригера воспользуемся процедурой SMENA_DOGOVORA 100102, после отработки процедуры зайдем в таблицу HISTORY_NOM_DOG и посмотрим на созданные записи тригером рисунок 17.

Рисунок 17 – результат работы триггера

4.7 Создание ролей

Для упрощения управления правами пользователя SQL Server предоставляет роли, которые похожи на группы системы безопасности Windows. Можно поместить отдельных логически связанных пользователей в одну роль, а затем назначить этой роли набор соответствующих прав доступа.

В базе данных «Рекламное агенство» выделено две группы пользователей:

  1. Администраторы «administrators», которые будут иметь право просматривать информацию, изменять информацию, добавлять информацию.

  2. Операторы «operators», которые могут просматривать информацию, в поисках нужной конкретно им информации.

Изменять структуру самой базы данных ни клиенты, ни администраторы не могут.

Создание ролей и прав в базе данных «Рекламное агенство»:

create role administrators

grant insert on HISTORY_NOM_DOG to administrators

grant insert on klienti to administrators

grant insert on zakaz_dogovor to administrators

grant insert on zakazi to administrators

grant insert on uslugi to administrators

grant insert on sotrudniki to administrators

create role operators

create role operators

grant select on HISTORY_NOM_DOG to operators

grant select on klienti to operators

grant select on zakaz_dogovor to operators

grant select on zakazi to operators

grant select on uslugi to operators

grant select on sotrudniki to operators

Рисунок 18 – Список существующих ролей