
- •Курсовой проект на тему
- •Дисциплина
- •Введение
- •1. Постановка задачи
- •1.1 Описание предметной области
- •1.2 Функциональные требования
- •2.Физическая модель
- •2.1. Фрагмент бд "Учет водоисточников"
- •2.2. Фрагмент бд "Учет неисправностей"
- •2.3. Фрагмент бд "Учет отправленных писем"
- •2.4.Используемая субд
- •3.Обеспечение целостности бд
- •4. Создание таблиц и ограничений.
- •5.Хранимые процедуры
- •6. Выходные формы
- •7. Обеспечение безопасности
- •8. Оптимизация
- •9. Тестирование
- •Заключение
- •Библиографический список
- •Приложение 6 – создание ограничений на таблицы
- •Приложение 7 –процедуры добавления
- •Приложение 8 – процедуры обновления
- •Приложение 9 – процедуры удаления
- •Приложение 10 – триггеры
- •Приложение 11 – отчетные формы
- •Приложение 12 – безопасность Роли
- •Праванароли
- •Пользователи
- •Добавлениепользователейкролям
- •Приложение 13 – оптимизация
- •Приложение 14 – тестирование
Приложение 9 – процедуры удаления
CREATEPROCPHydrantDelete
@IDWSINT
AS
DELETE FROM Hydrant
WHERE IDWaterSource=@IDWS
CREATE PROC PPondDelete
@IDWS INT
AS
DELETE FROM Pond
WHERE IDWaterSource=@IDWS
CREATE PROC PStreetDelete
@IDStr INT
AS
DELETE FROM Street
WHERE IDStreet=@IDStr
CREATE PROC PToOrganozationDelete
@IDTypeOfOrganization INT
AS
DELETE FROM TypeOfOrganization
WHERE IDTypeOfOrganization=@IDTypeOfOrganization
CREATE PROC POrganizationDelete
@IDOrg INT
AS
DELETE FROM Organization
WHERE IDOrganization=@IDOrg
CREATE PROC PWaterSourceDelete
@IDWS INT
AS
DELETE FROM WaterSource
WHERE IDWaterSource=@IDWS
CREATE PROC PInspectionDelete
@IDIn INT
AS
DELETE FROM Inspection
WHERE IDInspection=@IDIn
CREATE PROC PDefectDelete
@IDDef INT
AS
DELETE FROM Defect
WHERE IDDefect=@IDDef
CREATE PROC PLetterDelete
@IDLet INT
AS
DELETE FROM Letter
WHERE IDLetter=@IDLet
CREATE PROC PTestDefectDelete
@IDDefect INT,
@IDInspection INT,
@IDLetter INT
AS
DELETE FROM TestDefect
WHERE (IDDefect=@IDDefect AND IDInspection=@IDInspection AND IDLetter=@IDLetter)
Приложение 10 – триггеры
CREATE TRIGGER TrDefect
ON Defect FOR UPDATE
AS
IF EXISTS
(SELECT 'TRUE'
FROM inserted i LEFT JOIN TestDefect T
ON i.IDDefect=T.IDDefect
LEFT JOIN Inspection Ins
ON T.IDInspection=Ins.IDInspection
LEFT JOIN Letter L
ON Ins.IDInspection=L.IDInspection
WHERE (L.IDLetter IS NOT NULL))
BEGIN
RAISERROR ('Нельзя изменять данные о неисправности!Отправлено письмо!',1,1)
ROLLBACK TRAN
END
CREATE TRIGGER TrLetter
ON Letter
FOR INSERT,UPDATE
AS
IF EXISTS
(SELECT 'TRUE'
FROM Letter L LEFT JOIN Inspection I
ON L.IDInspection=I.IDInspection
WHERE (L.DataSend<I.DateInspection))
BEGIN
RAISERROR ('Дата отправки должна быть не раньше даты проверки!',1,1)
ROLLBACK TRAN
END
CREATE TRIGGER TrLetter2
ON Letter
FOR INSERT,UPDATE
AS
IF EXISTS
(SELECT 'TRUE'
FROM Letter L LEFT JOIN Inspection I
ON L.IDInspection=I.IDInspection
LEFT JOIN TestDefect T
ON I.IDInspection=T.IDInspection
LEFT JOIN Defect D
ON T.IDDefect=D.IDDefect
WHERE (L.DateNextInspection<DATEADD(dd,D.RepairTime,I.DateInspection)))
BEGIN
RAISERROR ('Дата следующей проерки должна быть больше, чем даты проверки и время, отведенное на ремонт!',1,1)
ROLLBACK TRAN
END
Приложение 11 – отчетные формы
CREATE FUNCTION PlanProverki (@DAT DATE)
RETURNS @Result TABLE (
NameWaterSource VARCHAR (10),
NameStreet VARCHAR(40),
Building VARCHAR(10),
NameDefect VARCHAR(100),
RepairTime INT,
DateInspection DATE)
AS
BEGIN
declare @IDDP TABLE (
IDWaterSource INT,
DateP DATE)
INSERT INTO @IDDP
SELECT
WS.IDWaterSource,
MAX(DateInspection) [DP]
FROM WaterSource WS INNER JOIN Street S
ON WS.IDStreet=S.IDStreet
INNER JOIN Inspection I
ON WS.IDWaterSource=I.IDWaterSource
INNER JOIN TestDefect TD
ON TD.IDInspection=I.IDInspection
INNER JOIN Defect D
ON D.IDDefect=TD.IDDefect
GROUP BY
WS.IDWaterSource
INSERT INTO @Result
SELECT
WS.NameWaterSource [Название],
S.NameStreet [Улица],
WS.Building [Дом],
D.NameDefect [Неисправность],
D.RepairTime [Время на устранение],
I.DateInspection [Датапроверки]
FROM WaterSource WS INNER JOIN Street S
ON WS.IDStreet=S.IDStreet
INNER JOIN Inspection I
ON WS.IDWaterSource=I.IDWaterSource
INNER JOIN TestDefect TD
ON TD.IDInspection=I.IDInspection
INNER JOIN Defect D
ON D.IDDefect=TD.IDDefect
INNER JOIN @IDDP IDDP
ON IDDP.IDWaterSource=WS.IDWaterSource
WHERE ((IDDP.DateP=I.DateInspection) AND (D.NameDefect='исправен') AND (DATEADD(dd,30,IDDP.DateP)<=@DAT))
INSERT INTO @Result
SELECT
WS.NameWaterSource [Название],
S.NameStreet [Улица],
WS.Building [Дом],
D.NameDefect [Неисправность],
D.RepairTime [Время на устранение],
I.DateInspection [Датапроверки]
FROM WaterSource WS INNER JOIN Street S
ON WS.IDStreet=S.IDStreet
INNER JOIN Inspection I
ON WS.IDWaterSource=I.IDWaterSource
INNER JOIN TestDefect TD
ON TD.IDInspection=I.IDInspection
INNER JOIN Defect D
ON D.IDDefect=TD.IDDefect
INNER JOIN @IDDP IDDP
ON IDDP.IDWaterSource=WS.IDWaterSource
INNER JOIN Letter L
ON L.IDLetter=TD.IDLetter
WHERE ((IDDP.DateP=I.DateInspection) AND (D.NameDefect!='исправен') AND (L.DateNextInspection<=@DAT))
RETURN;
END
CREATE PROC PPlanProverki(@Dat DATE)
AS
SELECT
NameWaterSource [Название],
NameStreet [Улица],
Building [Дом],
NameDefect [Неисправность],
RepairTime [Время на устранение],
DateInspection [Дата предыдущей проверки]
FROM PlanProverki(@Dat)
EXEC PPlanProverki '21-01-2012'
CREATE FUNCTION LetterToOrganization (@WS INT)
RETURNS
@Result TABLE (
NameWaterSource VARCHAR (10),
NameStreet VARCHAR(40),
Building VARCHAR(10),
NameDefect VARCHAR(100),
RepairTime INT,
DateInspection DATE)
AS
BEGIN
declare @temp1 TABLE (
IDD INT IDENTITY,
IDWaterSource INT,
DateP DATE,
IDDef INT,
Def VARCHAR(100))
INSERT INTO @temp1
SELECT
WS.IDWaterSource,
I.DateInspection,
D.IDDefect,
D.NameDefect
FROM WaterSource WS INNER JOIN Street S
ON WS.IDStreet=S.IDStreet
INNER JOIN Inspection I
ON WS.IDWaterSource=I.IDWaterSource
INNER JOIN TestDefect TD
ON TD.IDInspection=I.IDInspection
INNER JOIN Defect D
ON D.IDDefect=TD.IDDefect
WHERE WS.IDWaterSource=@WS
declare @temp2 TABLE (
IDD INT,
IDWaterSource INT,
DateP DATE,
IDDef INT,
Def VARCHAR(100))
INSERT INTO @temp2
SELECT top 2 *
FROM @temp1
order by IDD desc
IF ((SELECT DISTINCT COUNT (Def) FROM @temp2 WHERE Def!='исправен')=1)
BEGIN
INSERT INTO @Result
SELECT
WS.NameWaterSource [Название],
S.NameStreet [Улица],
WS.Building [Дом],
D.NameDefect [Неисправность],
D.RepairTime [Время на устранение],
I.DateInspection [Датапроверки]
FROM WaterSource WS INNER JOIN Street S
ON WS.IDStreet=S.IDStreet
INNER JOIN Inspection I
ON WS.IDWaterSource=I.IDWaterSource
INNER JOIN TestDefect TD
ON TD.IDInspection=I.IDInspection
INNER JOIN Defect D
ON D.IDDefect=TD.IDDefect
INNER JOIN @temp2 t2
ON t2.IDDef=D.IDDefect
WHERE D.IDDefect=(SELECT MAX(IDDef) FROM @temp2)
END;
RETURN;
END
CREATE PROC PLetterToOrganization(@WS INT)
AS
SELECT
NameWaterSource [Название],
NameStreet [Улица],
Building [Дом],
NameDefect [Неисправность],
RepairTime [Время на устранение],
DateInspection [Датапроверки]
FROM LetterToOrganization(@WS)
EXEC PLetterToOrganization 1
CREATE FUNCTION LetterToGPN (@WS INT)
RETURNS
@Result TABLE (
NameWaterSource VARCHAR (10),
NameStreet VARCHAR(40),
Building VARCHAR(10),
NameOrg VARCHAR(50))
AS
BEGIN
declare @temp1 TABLE (
IDD INT IDENTITY,
IDWaterSource INT,
DateP DATE,
IDDef INT,
Def VARCHAR(100))
INSERT INTO @temp1
SELECT
WS.IDWaterSource,
I.DateInspection,
D.IDDefect,
D.NameDefect
FROM WaterSource WS INNER JOIN Street S
ON WS.IDStreet=S.IDStreet
INNER JOIN Inspection I
ON WS.IDWaterSource=I.IDWaterSource
INNER JOIN TestDefect TD
ON TD.IDInspection=I.IDInspection
INNER JOIN Defect D
ON D.IDDefect=TD.IDDefect
WHERE WS.IDWaterSource=@WS
declare @temp2 TABLE (
IDD INT,
IDWaterSource INT,
DateP DATE,
IDDef INT,
Def VARCHAR(100))
INSERT INTO @temp2
SELECT top 2 *
FROM @temp1
order by IDD desc
IF ((SELECT DISTINCT COUNT (Def) FROM @temp2 WHERE Def!='исправен')>1)
BEGIN
INSERT INTO @Result
SELECT
WS.NameWaterSource [Название],
S.NameStreet [Улица],
WS.Building [Дом],
O.NameOrganization [Названиеорганизации]
FROM WaterSource WS INNER JOIN Street S
ON WS.IDStreet=S.IDStreet
INNER JOIN Inspection I
ON WS.IDWaterSource=I.IDWaterSource
INNER JOIN TestDefect TD
ON TD.IDInspection=I.IDInspection
INNER JOIN Defect D
ON D.IDDefect=TD.IDDefect
INNER JOIN @temp2 t2
ON t2.IDDef=D.IDDefect
INNER JOIN Organization O
ON WS.IDOrganization=O.IDOrganization
WHERE D.IDDefect=(SELECT MAX(IDDef) FROM @temp2)
END;
RETURN;
END
CREATE PROC PLetterToGosPN(@WS INT)
AS
SELECT
NameWaterSource [Название],
NameStreet [Улица],
Building [Дом],
NameOrg [Название организации]
FROM LetterToGPN(@WS)
CREATE PROC PWSFind(@NStreet VARCHAR(40), @Build VARCHAR(10))
AS
SELECT
WS.IDWaterSource [ID],
NameWaterSource [Название],
NameStreet [Улица],
Building [Дом],
NameOrganization [Организация],
NameDefect [Неисправность],
DateInspection [Датапроверки]
FROM WaterSource WS INNER JOIN Hydrant H
ON WS.IDWaterSource=H.IDWaterSource
INNER JOIN Street S
ON WS.IDStreet=S.IDStreet
INNER JOIN Organization O
ON WS.IDOrganization=O.IDOrganization
INNER JOIN Inspection I
ON WS.IDWaterSource=I.IDWaterSource
INNER JOIN TestDefect TD
ON I.IDInspection=TD.IDInspection
INNER JOIN Defect D
ON D.IDDefect=TD.IDDefect
WHERE NameStreet LIKE @NStreet AND Building=@Build
EXEC PWSFind 'Стахановская','40'