
- •Содержание
- •Введение
- •Спецификация требования
- •Концептуальное проектирование. Создание er-модели предметной области
- •Логическое проектирование. Построение и проверка реляционной модели данных
- •3.1. Исключение из концептуальной модели особенностей несовместимых с реляционной моделью
- •3.2. Формирование отношений
- •3.3. Определение ограничения целостности
- •Физическое проектирование и реализация базы данных в ms sql Server
- •4.1. Определение состава и структуры таблиц
- •4.2. Реализация ограничений целостности
- •4.3. Проектирование и разработка пользовательских представлений
- •4.3.1. Представление «Транспортное средство»
- •4.3.2. Представление «Протокол»
- •Заключение
- •Список использованных источников
4.2. Реализация ограничений целостности
В данном курсовом проекте ограничения целостности реализовывалось ниже приведенными способами:
Проверочные ограничения;
Первичные ключи;
Ограничения на уникальность;
Обеспечение целостности ссылок;
Каскадная ссылочная целостность.
Реализация проверочных ограничений:
[Kategoriya] like '[A-E]';
[INN] like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';
[RegZnak] like '[А, В, Е, К, М, Н, О, Р, С, Т, X, У][0-9][0-9][0-9]
[А, В, Е, К, М, Н, О, Р, С, Т, X, У][А, В, Е, К, М, Н, О, Р, С, Т, X, У]'.
4.3. Проектирование и разработка пользовательских представлений
4.3.1. Представление «Транспортное средство»
Для вывода транспортных средств было разработано пользовательское представление View_Transport:
CREATE VIEW [dbo].[View_Transport]
AS
SELECT dbo.Transport.RegZnak, dbo.Transport.IdTS, dbo.Marka.NameMarka, dbo.Model.NameModel, dbo.TipTS.NameTipTS, dbo.Transport.GodVypuska, dbo.Transport.N_Dvigatelya, dbo.Transport.N_Kuzova, dbo.Transport.Cvet, dbo.Transport.Seriya_TS, dbo.Transport.N_TS, dbo.Transport.IdModel, dbo.Marka.IdMarka, dbo.TipTS.IdTipTS
FROM dbo.Marka INNER JOIN
dbo.Model ON dbo.Marka.IdMarka = dbo.Model.IdMarka INNER JOIN
dbo.TipTS ON dbo.Model.IdTipTS = dbo.TipTS.IdTipTS INNER JOIN
dbo.Transport ON dbo.Model.IdModel = dbo.Transport.IdModel
GO
Реализация хранимых процедур и функций:
Постановка ТС на учет:
CREATE PROCEDURE [dbo].[sp_PostanovkaUchetTS]
@IdVladelec int,
@IdTS int
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT * FROM UchetTS WHERE IdTS = @IdTS)
INSERT INTO UchetTS (IdVladelec, IdOperatsiya, IdTS, DateOp)
VALUES (@IdVladelec, 1, @IdTS, GETDATE())
ELSE BEGIN
DECLARE @DatePost datetime
SELECT @DatePost = MAX(DateOp)
FROM UchetTS
WHERE (IdTS = @IdTS) AND (IdOperatsiya = 1)
IF EXISTS (SELECT * FROM UchetTS WHERE (IdTS = @IdTS) AND (IdOperatsiya = 2) AND (DateOp > @DatePost))
INSERT INTO UchetTS (IdVladelec, IdOperatsiya, IdTS, DateOp)
VALUES (@IdVladelec, 1, @IdTS, GETDATE())
ELSE
RAISERROR(Данное ТС уже зарегистрировано.', 16, 1)
END
END
GO
Снятие ТС с учета:
CREATE PROCEDURE [dbo].[sp_SnyatieUchetTS]
@IdVladelec int,
@IdTS int
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT IdTS FROM UchetTS WHERE IdTS = @IdTS)
RAISERROR('Данное ТС не зарегистрировано', 16, 1)
ELSE BEGIN
DECLARE
@DatePost datetime,
@Vladelec int
SELECT @DatePost = MAX(DateOp), @Vladelec = IdVladelec
FROM UchetTS
WHERE (IdTS = @IdTS) AND (IdOperatsiya = 1)
GROUP BY IdVladelec
IF (@IdVladelec <> @Vladelec)
RAISERROR('Данное ТС зарегистрирована на другово владельца, 16, 1)
ELSE
IF NOT EXISTS (SELECT * FROM UchetTS WHERE (IdTS = @IdTS) AND (IdOperatsiya = 2) AND (DateOp > @DatePost))
INSERT INTO UchetTS (IdVladelec, IdOperatsiya, IdTS, DateOp)
VALUES (@IdVladelec, 2, @IdTS, GETDATE())
ELSE
RAISERROR('Данное ТС не состоит на учете', 16, 1)
END
END
GO
Обновление учета:
CREATE PROCEDURE [dbo].[sp_UpdUchetTS]
@IdVladelec int, @IdOperatsiya int, @IdTS int, @DateReg date
AS
BEGIN
SET NOCOUNT ON;
UPDATE UchetTS SET IdVladelec = @IdVladelec, IdOperatsiya = @IdOperatsiya, IdTS = @IdTS, DateOp = GETDATE()
WHERE (IdVladelec = @IdVladelec) and (IdOperatsiya = @IdOperatsiya) and (IdTS = @IdTS) and (DateOp = @DateReg)
END
GO
Определение владельца ТС:
CREATE PROCEDURE [dbo].[sp_VladelecTS]
@IdTS int = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @T TABLE (tp int, vp int, dp datetime)
DECLARE @Where nvarchar(50)
DECLARE @query nvarchar(1024)
IF (@IdTS = 0) OR (@IdTS IS NULL)
SET @Where = ''
ELSE
SET @Where = ' and IdTS = ' + CONVERT(nvarchar(10), @IdTS)
SET @query = ('DECLARE @T1 TABLE (tp int, vp int, dp datetime)
INSERT INTO @T1
SELECT idTS, IdVladelec, DateOp
FROM UchetTS
WHERE IdOperatsiya = 1' + @Where + '
DECLARE @T2 TABLE (ts int, vs int, ds datetime)
INSERT INTO @T2
SELECT idTS, IdVladelec, DateOp
FROM UchetTS
WHERE IdOperatsiya = 2' + @Where + '
SELECT tp, vp, dp
FROM @T1 p LEFT JOIN
@T2 s ON (p.tp = s.ts) AND (p.vp = s.vs)
WHERE ts IS NULL')
INSERT INTO @T
EXEC sp_executesql @query
SELECT t.RegZnak, t.IdTS, t.NameMarka, t.NameModel, t.NameTipTS, t.GodVypuska, t.N_Dvigatelya, t.N_Kuzova, t.Cvet, t.Seriya_TS, t.N_TS, v.Familiya, v.Imya, v.Otchestvo, v.Adres, v.INN, u.DateOp
FROM UchetTS u INNER JOIN
@T up ON u.DateOp = up.dp INNER JOIN
View_Transport t ON t.IdTS = u.IdTS INNER JOIN
Vladelec v ON v.IdVladelec = u.IdVladelec
END
GO
Определяет модель и марку транспортного средства подвергающегося наибольшему количеству угона:
ALTER PROCEDURE [dbo].[sp_MaxUgonModel]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @temp TABLE (cnt int, idmodel int)
INSERT @temp
SELECT COUNT(IdModel), IdModel
FROM Ugon u INNER JOIN
View_Transport t ON t.IdTS = u.IdTS
GROUP BY t.IdModel
DECLARE @max int = (SELECT MAX(cnt) FROM @temp)
SELECT mr.NameMarka, md.NameModel
FROM @temp t INNER JOIN
Model md ON md.IdModel = t.idmodel INNER JOIN
Marka mr ON mr.IdMarka = md.IdMarka
WHERE cnt = @max
END
GO