- •Аннотация
- •Содержание
- •Введение
- •Безопасность.
- •Индексы.
- •Руководство пользователя (администратора).
- •1. Описание предметной области
- •2. Проектирование базы данных
- •2.1. Схема базы данных
- •2.2. Концептуальное проектирование
- •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: стратегия резервного копирования
Часть 1: оптимизация (индексы)
Анализ плана выполнения запросов показал необходимость
следующих индексов для ускорения JOIN и WHERE.
============================================= */
PRINT 'Создание индексов... ' + CONVERT(VARCHAR(30), GETDATE(), 120);
GO
-- 1. Уникальный индекс для Артикула
-- Обоснование: Часто используется в WHERE PartNumber = ... и для проверки дубликатов.
-- Тип: UNIQUE NONCLUSTERED
IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name = 'IX_Components_PartNumber')
CREATE UNIQUE NONCLUSTERED INDEX [IX_Components_PartNumber]
ON [Stock].[Components](PartNumber);
GO
-- 2. Покрывающий индекс (Covering Index) для Производителя
-- Обоснование: Часто используется JOIN по ManufacturerID.
-- INCLUDE позволяет получить IsActive без обращения к основной таблице (Key Lookup).
IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name = 'IX_Components_ManufacturerID_Includes')
CREATE NONCLUSTERED INDEX [IX_Components_ManufacturerID_Includes]
ON [Stock].[Components](ManufacturerID)
INCLUDE (IsActive, CategoryID);
GO
/* =============================================
Часть 2: безопасность (без dbo)
Создание Логинов (Server Level) и Пользователей (DB Level)
Пароль: 123
Логика: Удаляем старых (если есть) -> Создаем новых
============================================= */
PRINT 'Настройка пользователей... ' + CONVERT(VARCHAR(30), GETDATE(), 120);
GO
-- 1. Сначала удаляем Пользователей в БД, чтобы освободить Логины
USE CircuitDB;
GO
IF EXISTS (SELECT name FROM sys.database_principals WHERE name = 'Manager')
DROP USER Manager;
IF EXISTS (SELECT name FROM sys.database_principals WHERE name = 'Engineer')
DROP USER Engineer;
GO
-- 2. Переключаемся в master и пересоздаем Логины
USE master;
GO
-- Удаляем старые логины, если они есть
IF EXISTS (SELECT name FROM sys.server_principals WHERE name = 'User_Manager')
DROP LOGIN User_Manager;
IF EXISTS (SELECT name FROM sys.server_principals WHERE name = 'User_Engineer')
DROP LOGIN User_Engineer;
GO
-- Создаем заново с простым паролем '123'
-- CHECK_POLICY = OFF позволяет использовать короткие пароли (отключает проверку Windows)
CREATE LOGIN User_Manager WITH PASSWORD = '123', CHECK_POLICY = OFF;
CREATE LOGIN User_Engineer WITH PASSWORD = '123', CHECK_POLICY = OFF;
GO
-- 3. Возвращаемся в базу и создаем Пользователей
USE CircuitDB;
GO
CREATE USER Manager FOR LOGIN User_Manager;
CREATE USER Engineer FOR LOGIN User_Engineer;
GO
/* =============================================
Часть 3: ролевая модель (schema permissions)
Используем права на уровне СХЕМ, а не таблиц.
============================================= */
PRINT 'Настройка прав доступа на СХЕМЫ... ' + CONVERT(VARCHAR(30), GETDATE(), 120);
GO
-- 3.1. Роль "Менеджер" (Только чтение отчетов)
IF NOT EXISTS (SELECT name FROM sys.database_principals WHERE name = 'Role_SeeReports')
CREATE ROLE Role_SeeReports;
-- Даем права: Менеджер может читать ВСЁ в схеме Stock (там лежат Views)
GRANT SELECT ON SCHEMA::[Stock] TO Role_SeeReports;
-- И читать справочники
GRANT SELECT ON SCHEMA::[Ref] TO Role_SeeReports;
-- Добавляем пользователя
ALTER ROLE Role_SeeReports ADD MEMBER Manager;
-- 3.2. Роль "Инженер" (Выполнение процедур)
IF NOT EXISTS (SELECT name FROM sys.database_principals WHERE name = 'Role_ComponentEditor')
CREATE ROLE Role_ComponentEditor;
-- Даем права: Выполнение любых процедур в схеме Stock
GRANT EXECUTE ON SCHEMA::[Stock] TO Role_ComponentEditor;
-- Чтение справочников (нужно для работы процедур поиска)
GRANT SELECT ON SCHEMA::[Ref] TO Role_ComponentEditor;
-- Инженер также должен видеть отчеты
ALTER ROLE Role_SeeReports ADD MEMBER Engineer;
ALTER ROLE Role_ComponentEditor ADD MEMBER Engineer;
GO
/* =============================================
