- •Аннотация
- •Содержание
- •Введение
- •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
- •Процедура восстановления
- •Заключение
- •Список использованных источников
Процедура дифференциального резервного копирования
Данный бэкап фиксируют только изменения, произошедшие с момента последнего полного бэкапа. Изоляция файлов достигается за счет хранения в отдельной папке D:\Backup\DIFF.
CREATE OR ALTER PROCEDURE dbo.sp_Restaurant_BackupDiff
AS
BEGIN
SET NOCOUNT ON;
DECLARE @BackupPath NVARCHAR(500);
SET @BackupPath = N'D:\Backup\DIFF\DataBase_Restaurant_DIFF_' +
REPLACE(CONVERT(NVARCHAR(20), GETDATE(), 120), ':', '-') + '.bak';
PRINT 'ДИФФЕРЕНЦИАЛЬНОЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ';
PRINT 'Файл: ' + @BackupPath;
BEGIN TRY
BACKUP DATABASE [DataBase_Restaurant]
TO DISK = @BackupPath
WITH DIFFERENTIAL,
FORMAT,
INIT,
NAME = N'Restaurant - Differential Backup',
STATS = 5,
COMPRESSION;
PRINT 'Дифференциальный бэкап создан!';
END TRY
BEGIN CATCH
PRINT 'Ошибка: ' + ERROR_MESSAGE();
RAISERROR('Не удалось создать дифференциальный бэкап.', 16, 1);
END CATCH
END;
GO
Процедура резервного копирования журнала транзакций
Изоляция файлов достигается за счет хранения в отдельной папке D:\Backup\LOG.
CREATE OR ALTER PROCEDURE dbo.sp_Restaurant_BackupLog
AS
BEGIN
SET NOCOUNT ON;
DECLARE @BackupPath NVARCHAR(500);
SET @BackupPath = N'D:\Backup\LOG\DataBase_Restaurant_LOG_' +
REPLACE(CONVERT(NVARCHAR(20), GETDATE(), 120), ':', '-') + '.trn';
PRINT 'РЕЗЕРВНОЕ КОПИРОВАНИЕ ЖУРНАЛА ТРАНЗАКЦИЙ';
PRINT 'Файл: ' + @BackupPath;
BEGIN TRY
BACKUP LOG [DataBase_Restaurant]
TO DISK = @BackupPath
WITH FORMAT,
INIT,
NAME = N'Restaurant - Transaction Log Backup',
STATS = 5,
COMPRESSION;
PRINT 'Бэкап журнала транзакций создан!';
END TRY
BEGIN CATCH
PRINT 'Ошибка: ' + ERROR_MESSAGE();
RAISERROR('Не удалось создать бэкап журнала транзакций.', 16, 1);
END CATCH
END;
GO
Процедура тестирования всех бэкапов
Данная процедура поочерёдно делает каждый из трёх бэкапов и выдаёт сообщение об окончании тестирования.
CREATE OR ALTER PROCEDURE dbo.sp_Restaurant_TestBackupSystem
AS
BEGIN
SET NOCOUNT ON;
PRINT 'ТЕСТИРОВАНИЕ СИСТЕМЫ РЕЗЕРВНОГО КОПИРОВАНИЯ';
PRINT 'Время начала: ' + CONVERT(NVARCHAR, GETDATE(), 120);
PRINT '';
PRINT '1. Тест полного бэкапа:';
BEGIN TRY
EXEC dbo.sp_Restaurant_BackupFull @RetryCount = 2;
PRINT 'Успешно';
END TRY
BEGIN CATCH
PRINT 'Ошибка: ' + ERROR_MESSAGE();
END CATCH
PRINT '';
PRINT '2. Тест дифференциального бэкапа:';
BEGIN TRY
EXEC dbo.sp_Restaurant_BackupDiff;
PRINT 'Успешно';
END TRY
BEGIN CATCH
PRINT 'Ошибка: ' + ERROR_MESSAGE();
END CATCH
PRINT '';
PRINT '3. Тест бэкапа журнала транзакций:';
BEGIN TRY
EXEC dbo.sp_Restaurant_BackupLog;
PRINT 'Успешно';
END TRY
BEGIN CATCH
PRINT 'Ошибка: ' + ERROR_MESSAGE();
END CATCH
PRINT '';
PRINT 'ТЕСТИРОВАНИЕ ЗАВЕРШЕНО';
END;
GO
Чтобы протестировать все бэкапы, выполним запрос с вызовом данной процедуры:
EXEC dbo.sp_Restaurant_TestBackupSystem;
Результат представлен на рисунке 46.
Рисунок 46. Тестирование всех бэкапов
Если зайти в папку Backup на диске D, можно увидеть там три файла с бэкапами FULL, DIFF, LOG в соответствующих папках (рис. 47).
Рисунок 47. Бэкапы, сделанные в 1:48
