- •Аннотация
- •Содержание
- •Введение
- •Безопасность.
- •Индексы.
- •Руководство пользователя (администратора).
- •1. Описание предметной области
- •2.2. Концептуальное проектирование
- •2. Проектирование базы данных
- •2.1. Схема базы данных
- •2.3. Обоснование нормализации (3нф)
- •3. Создание базы данных
- •4. Создание таблиц и ограничений целостности
- •5. Заполнение таблиц данными
- •6. Объекты промежуточного слоя
- •6.1. Пользовательские функции (udf)
- •6.2. Представления (Views)
- •6.3. Хранимые процедуры и подсистема xml
- •7. Стратегия резервного копирования
- •Часть 4: стратегия резервного копирования
- •8. Безопасность
- •8.1. Уровни аутентификации и авторизации
- •8.2. Ролевая модель разграничения доступа
- •8.3. Тестирование системы безопасности
- •9. Индексы
- •9.1. Кластеризованные индексы
- •9.2. Некластеризованные индексы
- •10. Руководство пользователя (администратора)
- •10.1. Установка и развертывание системы
- •10.2. Сценарии работы с данными
- •Заключение
- •Список используемых источников
- •Приложение а
- •Часть 1: оптимизация (индексы)
- •Часть 2: безопасность (без dbo)
- •Часть 3: ролевая модель (schema permissions)
- •Часть 4: стратегия резервного копирования
Часть 4: стратегия резервного копирования
Скрипт создает бэкап с ДАТОЙ в имени файла.
============================================= */
PRINT 'Выполнение резервного копирования... ' + CONVERT(VARCHAR(30), GETDATE(), 120);
GO
DECLARE @BackupName NVARCHAR(255);
DECLARE @BackupFile NVARCHAR(255);
DECLARE @CurrentDate NVARCHAR(20);
-- Формируем строку даты вручную для SQL 2012 (YYYYMMDD_HHmm)
SET @CurrentDate = CONVERT(VARCHAR(8), GETDATE(), 112) + '_' + REPLACE(CONVERT(VARCHAR(5), GETDATE(), 108), ':', '');
-- Путь к папке Backup (Стандартный для SQL Express)
SET @BackupFile = N'C:\Program Files (x86)\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\Backup\CircuitDB_' + @CurrentDate + '.bak';
SET @BackupName = N'CircuitDB-Full Database Backup';
-- Выполняем бэкап
BACKUP DATABASE [CircuitDB]
TO DISK = @BackupFile
WITH NOFORMAT, NOINIT,
NAME = @BackupName,
SKIP, NOREWIND, NOUNLOAD, STATS = 10;
PRINT 'Бэкап сохранен в: ' + @BackupFile;
GO
PRINT '=============================================================';
PRINT 'Скрипт 05 выполнен успешно. Настройка завершена.';
PRINT 'Время завершения: ' + CONVERT(VARCHAR(30), GETDATE(), 120);
PRINT '=============================================================';
GO
Demo_Presentation.sql
/* =================================================================================
ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ СИСТЕМЫ (DEMO)
================================================================================= */
USE CircuitDB;
GO
PRINT '=============================================================';
PRINT 'ЗАПУСК ДЕМОНСТРАЦИИ';
PRINT 'Время: ' + CONVERT(VARCHAR(30), GETDATE(), 120);
PRINT '=============================================================';
GO
/* ==================================================================
ЭТАП 1: СЛОЖНЫЕ ПРЕДСТАВЛЕНИЯ (VIEWS)
Демонстрация аналитики, CTE, Group By и Having
================================================================== */
PRINT '--- ЭТАП 1: ПРОСМОТР ОТЧЕТОВ ---';
USE CircuitDB;
GO
-- 1.1. Полный отчет (INNER JOIN 4 таблиц)
-- Добавляем GETDATE(), чтобы видеть время генерации прямо в таблице
SELECT TOP 5
*,
GETDATE() AS [ReportTime]
FROM [Stock].[v_FullComponentReport];
-- 1.2. Инженерный отчет (Фильтр по SPICE моделям)
SELECT
*,
GETDATE() AS [ReportTime]
FROM [Stock].[v_ActiveComponentsSpiceready];
-- 1.3. СЛОЖНАЯ АНАЛИТИКА (CTE + HAVING)
-- Показывает процент активных компонентов по категориям
SELECT
*,
GETDATE() AS [ReportTime]
FROM [Stock].[v_CategoryAnalytics];
GO
/* ==================================================================
ЭТАП 2: ПОИСК И ДИНАМИЧЕСКИЕ ДАННЫЕ
Демонстрация генерации даты "на лету" и работы индексов
================================================================== */
USE CircuitDB;
GO
PRINT '--- ЭТАП 2: ПОИСК ДАННЫХ ---';
-- 2.1. Поиск по части названия (Артикулу)
EXEC [Stock].[usp_SearchComponents] @Keyword = '555';
-- 2.2. Поиск по производителю (Используем ID из справочника Ref)
-- (Например, Texas Instruments = 1)
EXEC [Stock].[usp_SearchComponents] @ManufacturerID = 1;
GO
/* ==================================================================
ЭТАП 3: СОЗДАНИЕ ДАННЫХ (ТРАНЗАКЦИИ)
Демонстрация вставки с проверкой (TRY...CATCH)
================================================================== */
USE CircuitDB;
GO
PRINT '--- ЭТАП 3: СОЗДАНИЕ КОМПОНЕНТА ---';
DECLARE @NewID INT;
DECLARE @ManufID INT, @CatID INT, @PackID INT;
-- Получаем ID из справочников схемы [Ref]
SELECT TOP 1 @ManufID = ManufacturerID FROM [Ref].[Manufacturers];
SELECT TOP 1 @CatID = CategoryID FROM [Ref].[Categories];
SELECT TOP 1 @PackID = PackageID FROM [Ref].[PackageTypes];
-- Вызываем процедуру создания
EXEC [Stock].[usp_CreateComponent]
@PartNumber = 'DEMO-CHIP-FINAL',
@ManufacturerID = @ManufID,
@CategoryID = @CatID,
@PackageID = @PackID,
@Description = 'Создано на защите с использованием Транзакции',
@NewID = @NewID OUTPUT;
-- Проверяем результат
SELECT *, GETDATE() AS [ReportTime] FROM [Stock].[Components] WHERE ComponentID = @NewID;
GO
/* ==================================================================
ЭТАП 4: СЛОЖНЫЕ ФУНКЦИИ (UDF)
Демонстрация Multi-Statement Table-Valued Function
================================================================== */
PRINT '--- ЭТАП 4: ФУНКЦИИ (Data Quality Analysis) ---';
-- 4.1. Простая табличная функция (Параметры компонента)
USE CircuitDB;
GO
DECLARE @CompID INT = (SELECT TOP 1 ComponentID FROM [Stock].[Components]);
SELECT * FROM [Stock].[udf_GetComponentParams](@CompID);
-- 4.2. СЛОЖНАЯ функция (Расчет баллов качества заполнения)
-- Анализируем категорию 1 (Операционные усилители)
-- Функция сама считает баллы и выносит вердикт (Excellent/Poor)
USE CircuitDB;
GO
SELECT * FROM [Stock].[udf_GetComponentQualityReport](1);
GO
/* ==================================================================
ЭТАП 5: XML ИМПОРТ/ЭКСПОРТ
Демонстрация интеграции
================================================================== */
PRINT '--- ЭТАП 5: XML ОПЕРАЦИИ ---';
-- 5.1. Экспорт
USE CircuitDB;
GO
EXEC [Stock].[usp_ExportReportToXML];
SELECT GETDATE() AS [ReportTime]
-- 5.2. Импорт
-- Имитируем файл, пришедший от поставщика
USE CircuitDB;
GO
DECLARE @MyXML XML;
SET @MyXML = '
<CircuitReport>
<Component
Article="XML-IMPORT-TEST"
Manufacturer="Vishay"
Category="Resistors"
Package="0603"
Description="Loaded via XML Transaction"
/>
</CircuitReport>';
EXEC [Stock].[usp_ImportComponentsFromXML] @XmlData = @MyXML;
-- Проверка
SELECT TOP 1 * FROM [Stock].[Components] ORDER BY ComponentID DESC;
GO
SELECT GETDATE() AS [ReportTime]
/* ==================================================================
ЭТАП 6: БЕЗОПАСНОСТЬ (SCHEMAS)
Демонстрация запрета доступа
================================================================== */
PRINT '--- ЭТАП 6: ПРОВЕРКА БЕЗОПАСНОСТИ ---';
USE CircuitDB;
GO
-- 6.1. Заходим как МЕНЕДЖЕР (У него права только на чтение)
EXECUTE AS USER = 'Manager';
PRINT '>> Текущий пользователь: ' + USER_NAME();
-- Попытка 1: Удалить таблицу (Должна быть ошибка)
BEGIN TRY
DROP TABLE [Ref].[Manufacturers];
END TRY
BEGIN CATCH
PRINT 'ОШИБКА ДОСТУПА: ' + ERROR_MESSAGE();
END CATCH
-- Попытка 2: Создать компонент (Должна быть ошибка - нет прав EXECUTE)
BEGIN TRY
DECLARE @Dummy INT;
EXEC [Stock].[usp_CreateComponent] 'HACK', 1, 1, 1, 'Test', @Dummy;
END TRY
BEGIN CATCH
PRINT 'ОШИБКА ДОСТУПА: ' + ERROR_MESSAGE();
END CATCH
REVERT; -- Возвращаемся в админа
PRINT '>> Возврат к правам: ' + USER_NAME();
GO
Install_DB.bat:
@echo off
echo Installing CircuitDB...
echo.
echo 1. Creating Structure...
sqlcmd -S .\SQLEXPRESS -E -i "01_CreateStructure.sql"
echo 2. Inserting Data...
sqlcmd -S .\SQLEXPRESS -E -i "02_InsertData.sql"
echo 3. Creating Procedures...
sqlcmd -S .\SQLEXPRESS -E -i "03_Procedures.sql"
echo 4. Creating Views and Functions...
sqlcmd -S .\SQLEXPRESS -E -i "04_ViewsAndFunctions.sql"
echo 5. Configuring Security...
sqlcmd -S .\SQLEXPRESS -E -i "05_SecurityAndAdmin.sql"
echo.
echo Installation Complete!
pause
AutoBackup.bat:
sqlcmd -S .\SQLEXPRESS -E -Q "BACKUP DATABASE CircuitDB TO DISK='C:\Program Files (x86)\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\Backup\CircuitDB_Auto.bak' WITH INIT"
