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

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

Ограничения целостности были реализованы следующим способом:

book_lending (CK_book_lending):

USE [Library]

GO

ALTER TABLE [dbo].[book_lending] WITH CHECK ADD CONSTRAINT [CK_book_lending] CHECK (([lending_date]<[delivery_date_fact] OR [delivery_date_fact]=NULL))

GO

ALTER TABLE [dbo].[book_lending] CHECK CONSTRAINT [CK_book_lending]

GO

book_lending (CK_book_lending_1):

USE [Library]

GO

ALTER TABLE [dbo].[book_lending] WITH CHECK ADD CONSTRAINT [CK_book_lending_1] CHECK (([lending_date]<[delivery_date_plan] OR [delivery_date_plan]=NULL))

GO

ALTER TABLE [dbo].[book_lending] CHECK CONSTRAINT [CK_book_lending_1]

GO

edition (DF_edition_edition_format_id):

USE [Library]

GO

ALTER TABLE [dbo].[edition] ADD CONSTRAINT [DF_edition_edition_format_id] DEFAULT ((1)) FOR [edition_format_id]

GO

edition (DF_edition_edition_genre_id):

USE [Library]

GO

ALTER TABLE [dbo].[edition] ADD CONSTRAINT [DF_edition_edition_genre_id] DEFAULT ((3)) FOR [edition_genre_id]

GO

edition (DF_edition_edition_number):

USE [Library]

GO

ALTER TABLE [dbo].[edition] ADD CONSTRAINT [DF_edition_edition_number] DEFAULT ((0)) FOR [edition_number]

GO

edition (DF_edition_edition_pubhouse_id):

USE [Library]

GO

ALTER TABLE [dbo].[edition] ADD CONSTRAINT [DF_edition_edition_pubhouse_id] DEFAULT ((1)) FOR [edition_pubhouse_id]

GO

edition_format (CK_edition_format):

USE [Library]

GO

ALTER TABLE [dbo].[edition_format] WITH CHECK ADD CONSTRAINT [CK_edition_format] CHECK (([format_penalty]>=(0)))

GO

ALTER TABLE [dbo].[edition_format] CHECK CONSTRAINT [CK_edition_format]

GO

library_card (CK_library_card_reader_pass_n):

USE [Library]

GO

ALTER TABLE [dbo].[library_card] WITH CHECK ADD CONSTRAINT [CK_library_card_reader_pass_n] CHECK (([reader_pass_n] like '[0-9][0-9][0-9][0-9][0-9][0-9]'))

GO

ALTER TABLE [dbo].[library_card] CHECK CONSTRAINT [CK_library_card_reader_pass_n]

GO

library_card (CK_library_card_reader_pass_s):

USE [Library]

GO

ALTER TABLE [dbo].[library_card] WITH CHECK ADD CONSTRAINT [CK_library_card_reader_pass_s] CHECK (([reader_pass_s] like '[0-9][0-9][0-9][0-9]'))

GO

ALTER TABLE [dbo].[library_card] CHECK CONSTRAINT [CK_library_card_reader_pass_s]

GO

Проектирование и разработка пользовательских представлений.

В ходе физического моделирования были спроектированы 3 пользовательских представления:

  • view_book_lending (Номер читательского билета, Фамилия, Имя, Отчество, Издание, Автор, Жанр, Формат издания, Издательство, Дата выдачи, Дата приёма (фактическая), Дата приёма (плановая), Пени) — данные о выдаче изданий пользователям на руки.

  • view_edition (Название издания, Автор, Год издания, Общее количество, Оставшееся количество, Библиографические особенности, Жанр, Формат, Издательство, Номер издания) — список изданий библиотеки.

  • view_library_card (Номер читательского билета, Фамилия, Имя, Отчество, Адрес, Телефон, Серия паспорта, Номер паспорта) — данные о читателях.

Реализованы данные представления были следующим образом.

view_book_lending

SELECT TOP (100) PERCENT dbo.library_card.library_card_number AS [Номер читательского билета], dbo.library_card.reader_surname AS Фамилия,

dbo.library_card.reader_first_name AS Имя, dbo.library_card.reader_middle AS Отчество, dbo.edition.edition_name AS Издание,

dbo.edition.edition_author AS Автор, dbo.genre.genre_name AS Жанр, dbo.edition_format.format_name AS [Формат издания],

dbo.publishing_house.pubhouse_name AS Издательство, book_lending_1.lending_date AS [Дата выдачи],

book_lending_1.delivery_date_fact AS [Дата приёма (фактическая)], book_lending_1.delivery_date_plan AS [Дата приёма (плановая)],

book_lending_1.penalty AS Пени, dbo.edition.edition_id AS [ID издания]

FROM dbo.book_lending AS book_lending_1 INNER JOIN

dbo.edition ON book_lending_1.edition_id = dbo.edition.edition_id INNER JOIN

dbo.edition_format ON dbo.edition.edition_format_id = dbo.edition_format.format_id INNER JOIN

dbo.genre ON dbo.edition.edition_genre_id = dbo.genre.genre_id INNER JOIN

dbo.library_card ON book_lending_1.library_card_id = dbo.library_card.library_card_id INNER JOIN

dbo.publishing_house ON dbo.edition.edition_pubhouse_id = dbo.publishing_house.pubhouse_id

view_edition

SELECT dbo.edition.edition_name AS [Название издания], dbo.edition.edition_author AS Автор, dbo.edition.edition_year AS [Год издания], dbo.edition.edition_count AS [Общее количество], dbo.edition.edition_count -

(SELECT COUNT(*) AS Expr1

FROM dbo.book_lending

WHERE (delivery_date_fact IS NULL) AND (edition_id = dbo.edition.edition_id)) AS [Оставшееся количество], dbo.edition.edition_biblfeatures AS [Библиографические особенности], dbo.genre.genre_name AS Жанр, dbo.edition_format.format_name AS Формат, dbo.publishing_house.pubhouse_name AS Издательство, dbo.edition.edition_number AS [Номер издания]

FROM dbo.edition INNER JOIN

dbo.edition_format ON dbo.edition.edition_format_id = dbo.edition_format.format_id INNER JOIN

dbo.genre ON dbo.edition.edition_genre_id = dbo.genre.genre_id INNER JOIN

dbo.publishing_house ON dbo.edition.edition_pubhouse_id = dbo.publishing_house.pubhouse_id

view_library_card

SELECT library_card_number AS [Номер читательского билета], reader_surname AS Фамилия, reader_first_name AS Имя, reader_middle AS Отчество, reader_address AS Адрес, reader_phone AS Телефон, reader_pass_s AS [Серия пасспорта], reader_pass_n AS [Номер пасспорта]

FROM dbo.library_card

Для выполнения всех необходимых транзакций, были созданы следующие хранимые процедуры, связанные с этими представлениями:

view_book_lending

  • booklendinginsert — добавление записи о выдачи издания на руки читателю:

ALTER PROCEDURE [dbo].[booklendinginsert]

@librarycardid int,

@editionid int,

@lendingdate datetime,

@deliverydatefact datetime,

@deliverydateplan datetime,

@penalty money

AS

BEGIN

SET @lendingdate = SYSDATETIME()

if (

(select edition_count from edition where edition_id = @editionid) -

(select count(*) from book_lending where (edition_id=@editionid) and (delivery_date_fact <> 0))

)>0

INSERT INTO book_lending VALUES (@librarycardid, @editionid, @lendingdate, @deliverydatefact, @deliverydateplan, @penalty)

ELSE BEGIN RETURN @@ERROR END

SELECT @librarycardid = @@IDENTITY

END

  • booklendingupd — обновление записи о выдаче книги читателю с добавлением даты возврата и добавлением суммы пени (если книга сдана с опозданием):

ALTER PROCEDURE [dbo].[booklendingupd]

@booklendingid int,

@deliverydatefact datetime

AS

BEGIN

UPDATE book_lending SET

delivery_date_fact = @deliverydatefact,

penalty = CASE

WHEN delivery_date_fact > delivery_date_plan THEN

(-DATEDIFF(day, delivery_date_fact, delivery_date_plan))*(select format_penalty from edition_format ef

inner join edition ed on ef.format_id=ed.edition_format_id

inner join book_lending bl on ed.edition_id=bl.edition_id

where bl.book_lend_id=@booklendingid)

ELSE NULL

END

WHERE book_lend_id = @booklendingid

END

  • booklendingdel – удаление записи о выдаче издания читателю:

ALTER PROCEDURE [dbo].[booklendingdel]

@booklendingid int

AS

BEGIN

DELETE FROM book_lending WHERE book_lend_id = @booklendingid

END

  • dolzhniki – возврат списка читателей, не сдавших издание или имеющих неуплаченное пени

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER FUNCTION dolzhniki()

RETURNS TABLE

AS

RETURN

(

SELECT * FROM view_book_lending

WHERE ([Дата приёма (плановая)]<[Дата приёма (фактическая)]) OR ([Дата приёма (фактическая)] is NULL)

)

GO

  • bookkeepersreturn – возвращение записей о выдаче книги по её номеру (экземпляры, находящиеся на руках):

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE FUNCTION bookkeepersreturn

(

@editionid int

)

RETURNS TABLE

AS

RETURN

(

SELECT * FROM view_book_lending

WHERE ([ID издания]=@editionid) and ([Дата приёма (фактическая)] is not NULL)

)

GO

  • booklendingreturn – возвращение истории выдачи конкретного издания:

USE [Library]

GO

/****** Object: UserDefinedFunction [dbo].[bookkeepersreturn] Script Date: 14.06.2012 12:23:27 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER FUNCTION [dbo].[booklendingreturn]

(

@editionid int

)

RETURNS TABLE

AS

RETURN

(

SELECT * FROM view_book_lending

WHERE ([ID издания]=@editionid)

  • booklendonday – возвращение списка выданных изданий по дате:

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE FUNCTION booklendonday

(

@date date

)

RETURNS TABLE

AS

RETURN

(

SELECT * FROM view_book_lending

WHERE cast([Дата выдачи] as date) = @date

)

GO

view_edition

  • editioninsert – добавление издания в список изданий библиотеки:

ALTER PROCEDURE [dbo].[editioninsert]

@editionid int,

@editionname varchar(50),

@editionauthor varchar(50),

@editiongenreid int,

@editionformatid int,

@editionpubhouseid int,

@editionyear date,

@editioncount int,

@editionbiblfutures varchar(100),

@editionnumber int

AS

BEGIN

INSERT INTO edition VALUES (@editionname, @editionauthor, @editiongenreid, @editionformatid,

@editionpubhouseid, @editionyear, @editioncount, @editionbiblfutures, @editionnumber)

SELECT @editionid = @@IDENTITY

IF @@ERROR <>0

PRINT 'Ошибка:'+ltrim(str(@@error))

END

  • editionupd – редактирование информации об издании:

ALTER PROCEDURE [dbo].[editionupd]

@editionid int,

@editionname varchar(50),

@editionauthor varchar(50),

@editiongenreid int,

@editionformatid int,

@editionpubhouseid int,

@editionyear date,

@editioncount int,

@editionbiblfutures varchar(100),

@editionnumber int

AS

BEGIN

UPDATE edition SET

edition_name = @editionname,

edition_author = @editionauthor,

edition_genre_id = @editiongenreid,

edition_format_id = @editionformatid,

edition_pubhouse_id = @editionpubhouseid,

edition_year = @editionyear,

edition_count = @editioncount,

edition_biblfeatures = @editionbiblfutures,

edition_number = @editionnumber

WHERE edition_id = @editionid

IF @@ERROR <>0

PRINT 'Ошибка:'+ltrim(str(@@error))

END

  • editiondel — удаление издания из списка изданий:

ALTER PROCEDURE [dbo].[editiondel]

@editionid int

AS

BEGIN

DELETE FROM edition WHERE edition_id = @editionid

END

  • editionbydate – возвращение списка изданий, изданных:

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE FUNCTION editionbydate

(

@datea date,

@dateb date

)

RETURNS TABLE

AS

RETURN

(

SELECT * FROM view_edition

WHERE ([Год издания]>@datea) and ([Год издания]<@dateb)

)

GO

Таким образом реализованы основные хранимые процедуры и функции, используемые для решения требуемых от ИС «Библиотека» задач.