Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект (2).doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1.32 Mб
Скачать

4.2. Реализация ограничений целостности

В данном курсовом проекте ограничения целостности реализовывалось ниже приведенными способами:

  1. Проверочные ограничения;

  2. Первичные ключи;

  3. Ограничения на уникальность;

  4. Обеспечение целостности ссылок;

  5. Каскадная ссылочная целостность.

Реализация проверочных ограничений:

  • [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