курсач / Наволоцкий_1302_v2
.pdf============================================================
====== */
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;
111
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
112
/*
============================================================
======
ЭТАП 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"
113
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();
114
-- Попытка 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
115
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
116
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"
117
