- •Аннотация
- •Содержание
- •Введение
- •1. Формулировка задания
- •1.1. Задание
- •1.2. Структура идз
- •Описание предметной области
- •Проектирование базы данных
- •Создание бАзы данных
- •Создание таблиц и ограничений целостности
- •Заполнение таблиц данными
- •Заполнение таблицы «Staff» (Сотрудники)
- •Заполнение таблицы «Tables» (Столы):
- •Заполнение таблицы «Categories» (Категории)
- •Заполнение таблицы «MenuItems» (Меню)
- •Заполнение таблицы «Orders» (Заказы)
- •Заполнение таблицы «OrderItems» (Позиции заказа)
- •Заполнение таблицы «Payments» (Платежи)
- •Разработка объектов промежуточного слоя
- •Хранимые процедуры
- •Процедура «CreateOrder» для создания нового заказа
- •Процедура «AddItemToOrder» для добавления позиций в заказ
- •Процедура «SetOrderWaitingForPayment» для перевода заказа в статус ожидания оплаты
- •Процедура «PayOrder» для оплаты заказа
- •Представления
- •Представление «ActiveOrders» для просмотра активных заказов
- •Представление «WaiterDailyRevenue», показывающее выручку, принесённую каждым из официантов
- •Представление «DailyOrderStats», показывающее по дням заработок ресторана, оплаченные заказы, средний чек
- •Представление «OrdersByWaiterStatus», показывающее количество заказов, обслуженных каждым из официантов по статусам заказа
- •Функции
- •Скалярная функция «OrderTotal» для подсчета стоимости заказа
- •Табличная функция «GetOrdersWithTotal», которая возвращает блюда по заказам
- •Табличная функция «GetMenuItemsByAvailability», показывающая оставшиеся блюда
- •Табличная функция «GetLastOrderItems» возвращающая последние блюда в заказах
- •Скалярная функция «MenuItemSalesPaid» для подсчета проданных позиций блюд в день
- •Разработка триггеров
- •Триггер «InsertWaiterTable» для вставки в таблицу WaiterTables, когда происходит заказ
- •Триггер «CheckStock», уменьшающий количество блюд в MenuItems и предупреждающий, если блюда закончились
- •Триггер «PreventWaitingPaymentWithoutItems», проверяющий пустой заказ
- •Разработка стратегии резервного копирования и восстановления
- •Процедура полного резервного копирования
- •Процедура дифференциального резервного копирования
- •Процедура резервного копирования журнала транзакций
- •Процедура тестирования всех бэкапов
- •Автоматизация через sql server agent
- •Процедура восстановления
- •Заключение
- •Список использованных источников
Процедура «AddItemToOrder» для добавления позиций в заказ
В данной процедуре мы указываем заказ, блюдо из меню и количество блюд. Процедура проверяет параметры и в случае корректного ввода добавляет позиции в заказ. Помимо проверки параметров процедура следит за тем, чтобы заказ имел статус «Принят».
Запрос:
ALTER PROCEDURE rest.AddItemToOrder
@OrderID INT,
@ItemID INT,
@Quantity INT
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM rest.Orders WHERE OrderID = @OrderID)
BEGIN
PRINT 'Ошибка: заказ не найден.';
RETURN;
END
DECLARE @CurrentStatus NVARCHAR(50);
SELECT @CurrentStatus = Status
FROM rest.Orders
WHERE OrderID = @OrderID;
IF @CurrentStatus <> 'Принят'
BEGIN
PRINT 'Ошибка: блюда можно добавлять только в заказы со статусом "Принят".';
RETURN;
END
IF NOT EXISTS (SELECT 1 FROM rest.MenuItems WHERE ItemID = @ItemID)
BEGIN
PRINT 'Ошибка: блюдо не найдено.';
RETURN;
END
DECLARE @Stock INT;
DECLARE @IsAvailable BIT;
DECLARE @Price DECIMAL(10,2);
SELECT
@Stock = Stock,
@IsAvailable = IsAvailable,
@Price = Price
FROM rest.MenuItems
WHERE ItemID = @ItemID;
IF @IsAvailable = 0
BEGIN
PRINT 'Ошибка: блюдо недоступно для заказа.';
RETURN;
END
IF @Quantity > @Stock
BEGIN
PRINT 'Ошибка: недостаточно порций. Остаток: ' + CAST(@Stock AS VARCHAR(10));
RETURN;
END
INSERT INTO rest.OrderItems (OrderID, ItemID, Quantity, UnitPrice)
VALUES (@OrderID, @ItemID, @Quantity, @Price);
PRINT 'Блюдо успешно добавлено в заказ.';
END
GO
Примеры использования
Добавляем блюдо в несуществующий заказ
Напишем запрос, в котором попытаемся добавить блюда в несуществующий заказ:
EXEC rest.AddItemToOrder
@OrderID = 20,
@ItemID = 7,
@Quantity = 6;
Увидим соответствующую ошибку выполнения запроса (рис. 22).
Рисунок 22. Выполнение запроса
Добавляем в заказ несуществующее блюдо
Напишем запрос, в котором добавляем в заказ несуществующее блюдо:
EXEC rest.AddItemToOrder
@OrderID = 6,
@ItemID = 20,
@Quantity = 6;
Ошибка выполнения (рис. 23).
Рисунок 23. Выполнение запроса
Добавляем в заказ слишком много порций
Поскольку у каждого блюда есть запас, мы не можем добавить в заказ количество, превышающее это число. Напишем запрос, в котором добавляем 10 порций блюда, запас которого равен 8:
EXEC rest.AddItemToOrder
@OrderID = 6,
@ItemID = 1,
@Quantity = 10;
Соответствующая ошибка (рис. 24).
Рисунок 24. Выполнение запроса
Добавляем блюдо в оплаченный заказ
Если заказ уже оплачен или ожидает оплаты, мы не можем добавить в него какие-то блюда. Запрос для оплаченного заказа:
EXEC rest.AddItemToOrder
@OrderID = 8,
@ItemID = 2,
@Quantity = 1;
Видим ошибку выполнения (рис. 25).
Рисунок 25. Выполнение запроса
Правильный запрос
EXEC rest.AddItemToOrder
@OrderID = 6,
@ItemID = 1,
@Quantity = 6;
Блюдо успешно добавлено в заказ (рис. 26). Также видим предупреждение об ограниченном количестве порций для указанного блюда. Это значит, что порции еще есть, но их осталось меньше, чем указано в выполненном запросе.
Рисунок 26. Выполнение запроса
