Проектирование многопользовательской информационной системы 'Университетская библиотека'

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    932,66 Кб
  • Опубликовано:
    2012-09-18
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Проектирование многопользовательской информационной системы 'Университетская библиотека'

Введение

Университеты - это самые крупные высшие учебные заведения в Республике Беларусь. Современная высшая школа характеризуется высокой степенью дифференциации содержания образования и организации учебного процесса. В условиях непрерывно подготовки специалистов важным фактором совершенствования является исследовательская работа студентов, помогающая решать задачи соединения науки, образования и практики, готовить специалистов с повышенным творческим потенциалом. Своевременно сформированные навыки работы с книгой облегчают, вхождение в научно-исследовательскую работу, в которой и происходит обучение всех студентов азам исследовательской работы.

Каждую минуту в мире появляется до 2000 страниц печатной продукции, в год до миллиона новых книг. Найти нужные книги в этой лавине информации - нелегкая задача. Все более или менее крупные библиотеки имеют справочно-библиографические отделы. Или же их функцию выполняет библиотекарь. До недавнего времени наиболее распространенными были карточные каталоги, в которых сведения занесены на стандартные карточки.

Однако последнее время в крупных библиотеках внедрены или внедряются новые информационные технологии, позволяющие переходить от карточных к электронным каталогам, использовать компьютеры в информационном обеспечении. Внедрение автоматизированной информационно-поисковой системы позволяет значительно облегчить не только работу библиотекарей, но также доступ к информации и её поиск.

С этой целью библиотеками разрабатываются и приобретаются базы данных на компьютерных дисках, и читателю предоставляется возможность осуществления поиска нужной информации через электронный каталог.

Электронные каталоги предпочтительнее карточных, так как позволяют вести многоаспектовый, комбинированный поиск, за меньшее время найти больший объем информации, дают возможность распечатки результатов поиска на принтере и перенос на дискету. Написание серьезной работы исследовательского характера только выигрывает от использования электронных каталогов.

Целью данного курсового проекта является спроектировать и реализовать на основе клиент / серверных технологий базу данных вузовской библиотеки, а также реализовать все необходимые для поиска и работы с литературой запросы и отчеты.

.       
Техническое задание

 

.1 Анализ предметной области

Общие сведения

Объект автоматизации - университетская библиотека.

Документы, на основании которых создается система:

·        систематический каталог:

·        алфавитный каталог;

·        библиотечно-библиографическая классификация (ББК);

·        предметный каталог;

·        Должностные инструкции;

·        Правила пользования библиотечным фондом;

·        Инструкции по сохранению книжного фонда;

·        Правила пользования библиотекой;

·        Акты на списание литературы.

Назначение и цели создания системы

Назначение системы

Проектирование многопользовательской информационной системы. Систему предполагается использовать на рабочих местах библиотекарей для увеличения скорости обслуживания читателей. Система позволит облегчить процесс поиска книг, т.к. он будет вестись автоматизировано. При её применении станет легче подбирать литературу, проверять наличие книг в фонде, а также будет легче следить за сохранностью книжного фонда. Процесс заказа литературы будет осуществляться быстрее, так как это можно будет осуществить прямо с рабочего места.

Цели создания системы

Систему предполагается создать для улучшения качества обслуживания читателей, обслуживания большего числа читателей и ускорения работы библиотекаря.

Система позволит увеличить скорость обслуживания читателей, а также уменьшить вероятность утери информации о книгах, которыми пользуются студенты, вероятность неправильного закрепления книг за читателем.

Характеристика объектов автоматизации

Краткие сведения

Университетская библиотека включает следующие отделы:

·        отделы обслуживания (абонемент учебной литературы, абонемент научной литературы, читальный залы);

·        отдел периодики;

·        отдел комплектования;

·        справочно-библиографический отдел.

В университете обучаются студенты с 1 по 5 курс дневного и заочного отделения и с 1 по 6 курс заочного отделения. Отделы обслуживания работают с читателями дневного отделения по читательским билетам, заочного - по зачетной книжке. Количество выдаваемых в каждом году читательских соответствует числу набранных на первый курс студентов дневного отделения. Каждому студенту выдается читательский билет, имеющий свой уникальный номер. Номер читательского билета соответствует номеру формуляра, который хранит информацию о книгах, которыми пользовался студент.

После каждого курса студент должен сдать все книги, которые он не будет использовать в дальнейшем процессе обучения. По завершении обучения в университете студент должен сдать все книги, которыми они пользовались, подписывает обходной лист.

Библиотекой также могут пользоваться преподаватели - сотрудники университета. Им также присваивается читательский номер. Кроме того, преподаватели могут заказывать учебную литературу.

Каждый отдел библиотеки выполняет свои функции.

Отдел комплектования осуществляет следующие функции:

·    Заказ литературы по тематическим планам издательств;

·    Обработка новой литературы;

·        Классификация литературы по библиотечно-библиографической классификации (ББК);

·        Списание ветхой, устаревшей литературы;

·        Замена утерянных книг на новую литературу.

Для обеспечения этих функций необходима следующая информация: инвентарный номер книги (шифр), автор, название, издательство, год издания, цена книги, отдел, где хранится книга.

Справочно-библиографический отдел выполняет следующее:

·        Обработка каталожных карточек;

·        Расстановка карточек по ББК в систематический каталог, алфавитный и предметный каталог:

·        Тематический подбор для читателей:

·        Работа в Интернете по поиску книг;

·        Проведение библиотечных мероприятий (проведение занятий со студентами, издание тематических списков литературы, составление описаний статей),

·        Выдача справочной литературы.

Для обеспечения этих функций необходима следующая информация: инвентарный номер книги (шифр), автор, название, издательство, год издания, цена книги, отдел, где хранится книга.

В функции абонементов входит:

·        Запись новых читателей в библиотеку;

·        Выдача книг читателям и прием книг;

·        Расстановка фонда и работа с ним;

·        Ведение картотек читателей.

Для обеспечения этих функций необходима следующая информация: номер читательского билета, имя и фамилия читателя, для студентов - год поступления, год окончания (отчисления), номер приказа, если отчислен, факультет и специальность, форма обучения (дневная или заочная), для преподавателей - должность.

Пользователями будущей системы будут директор библиотеки, библиотекари и читатели

В функции директора входит:

·        координация полной работы всех отделов библиотеки;

·        прием и увольнение сотрудников, перевод их в другие отделы;

·        составление отчетности и плана работы библиотеки.

Для обеспечения функций директора может потребоваться следующая информация: имя и фамилия сотрудника, табельный номер, отдел, в котором работает, дата рождения, должность.

В функции библиотекаря входит:

·        запись читателей в библиотеку;

·        выдача и прием книг.

·        Оформление платных услуг;

·        Обработка заказов на литературу.

Для обеспечения функций библиотекаря может потребоваться следующая информация: данные читателей, сведения о книгах (ISBN, шифр, автор, название, издательство, год издания, цена книги, отдел, где хранится книга).

В функции читателя входит поиск книг и периодических изданий. Для читателя необходима следующая информация: ISBN и шифр книги, её автор и название, а также издательство, год издания, цена книги, отдел, где хранится книга, название периодического издания, его инвентарный номер, номер статьи, ключевые слова статьи, её номер, название и предметная область.

Сведения об условиях эксплуатации объекта автоматизации и характеристиках окружающей среды.

В библиотеке работают служащие с высшим образованием и средним специальным.

Систему предполагается использовать на рабочих местах библиотекарей: в отделах обслуживания и периодики - для поиска книг в книжном фонде, для поиска читателей по читательским номерам, просмотра их задолжностей, внесение сведений о книгах, которые берет читатель.

В отделе комплектования система будет использоваться для внесения информации о новой, списанной и утерянной литературе, а также для фиксации заказов на новую литературу.

В справочно-библиографическом отделе система будет использоваться для составления картотеки, поиска книг для читателей, для составления тематических списков литературы.

.1.5. Требования к системе.

.1.5.1. Требования к системе в целом.

Система должна удовлетворять следующим требованиям:

·        Надежности;

·        Безопасности;

·        Требования к защите информации от несанкционированного доступа. Должна быть предусмотрена защита от несанкционированного доступа к данным, ввода данных, их удаления

·        Данные должны хранить в соответствии с имеющимися документами (ББК и др.).

·        Система должна быть доступна с любого компьютера в библиотечной сети.

·        Информация хранящаяся в системе должна быть защищена от аварийных ситуаций, влияния внешних воздействий (радиоэлектронная защита).

·        Квалификация персонала. Персонал должен быть обучен правилам работы с системой, при этом не обязательно наличие специального технического образования

.1.5.2. Требования к функциям (задачам), выполняемым системой.

Функции, выполняемые подсистемами объекта автоматизации:

         выдача информации о книгах, которыми пользуется студент, сотрудник. Без использования автоматизированной системы поиск формуляров читателей занимает значительное время, кроме того, из-за ошибок библиотекарей формуляры читателей могут теряться и вместе с ними исчезает информация о книгах, которые находятся у читателя. Восстановить эту информацию невозможно. И для хранения самих формуляров необходимы дополнительные площади. Автоматизированная система хранит эту информацию сколь угодно долго, поиск осуществляется за считанные секунды, исключены ошибки библиотекарей, не требуется дополнительная площадь.

         Запись новых читателей в библиотеку, проверка их данных. При использовании автоматизированной системы запись читателей будет осуществляться легко и быстро. В начале каждого учебного года в базу студентов добавляется информация о первокурсниках и каждому из них присваивается сразу же читательский номер. Присутствия самих читателей не требуется. Это позволит избежать очередей в библиотеке, путаницы при присвоении новых читательских номеров.

         Проверка книг, закрепленных за читателем. Читатель также сможет распечатать в библиотеке список книг, закрепленных за ним.

         Проверка на наличие книг в книжном фонде, необходимого количества экземпляров. Чтобы выдать книгу читателю, необходимо её наличие. Без использования автоматизированной системы поиск книги занимает значительное время. В автоматизированной системе для поиска будет необходимо только ввести название книги (автора или шифр) и информация о наличии книги будет готова.

         Заказ книг по заявкам преподавателей, сотрудников университета. С помощью автоматизированной системы сотрудник университета сможет прямо на рабочем месте ввести свой заказ и передать информацию о нем в библиотеку. Библиотекарям же не нужно будет ходить к преподавателям и собирать заказы. Кроме того, преподаватели смогут быстро получить информацию о том, что заказ принят.

         Списание старой и замена утерянной литературы. При списании или замене литературы информация о ней, о причинах списания, замене, о сотрудниках, принявших решение о списании или замене, должна храниться достаточно долго. Обычно она хранится в документах (актах о замене или актах о списании), но в результате может быть потеряна. Новая автоматизированная система позволит избежать потери информации и надежно и долго хранить её. Экземплярам будет автоматически ставится отметка о замене или списании.

         Внесение новых книг в каталог библиотеки, присвоение им инвентарного номера. Для внесения новых книг в каталоги библиотекарям необходимо заполнить много разных документов, проверить правильность их заполнения. При использовании автоматизированной системы проверка и заполнение будет осуществляться одновременно. Автоматически будет осуществляться проверка правильности присвоенного инвентарного номера, правильность закрепления книг за отделами.

         Внесение журналов и газет в каталог, присвоение им инвентарного номера. Для внесения новых газет и журналов в каталоги библиотекарям необходимо заполнить много разных документов, проверить правильность их заполнения. При использовании автоматизированной системы проверка будет осуществляться автоматически. При поиске необходимых статей очень часто приходится просматривать большое количество периодических изданий. Нередко такой поиск оказывается неудачным. Если же присвоить статьям ключевые фразы и осуществлять поиск по этим фразам, то вероятность удачного поиска резко возрастет.

Требования к видам обеспечения.

Программное обеспечение системы не должно зависеть от аппаратных средств компьютера. Необходимое программное обеспечение:

MS ACCESS 2000, MS Word 2000, MS SQL Server 2000.

Состав и содержание работ по созданию системы.

Функциональная модель -18.06.08

Контекстная диаграмма и диаграммы детализации процессов.

Диаграмма дерева узлов.

Информационная модель.

Идентификация сущностей и связей. - 18.02.07диаграмма физического уровня. Ограничения доменов. Ограничения ссылочной целостности. Переопределение триггеров. Индексирование отношений. - 18.02.07

Определение представлений, хранимых процедур серверной компоненты. ER-диаграмма в режиме отображения представлений. - 28.02.07

Верификация спроектированной логической модели. - 28.02.07

Реализация системы - 15.04.07.

Миниспецификации процессов диаграмм нижнего уровня функциональной модели в терминах псевдокода.

T-SQL-определения регламентированных запросов.

T-SQL-определения триггеров.

T-SQL-определения хранимых процедур.

T-SQL-определения курсоров.

Описание клиентских приложений. (Реализуются средствами ACCESS и VBA).

Проектирование системы безопасности. Управление авторизацией, управление ролями, управление разрешениями средствами Transact SQL. - 25.04.07.

Прокомментированный скрипт создания базы данных. - 1.05.07

Результаты тестирования информационной системы. - 8.05.07

Требования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие

·    Заполнение созданной базы;

·        обеспечение персонала необходимыми техническими средствами;

·        обучение персонала правилам работы с системой.

Источники разработки.

Гост 34.602-89. Государственный стандарт союза ССР. Информационная технология. Комплекс стандартов на автоматизированные системы. Техническое задание на создание автоматизированной системы

 

1.2 Постановка задачи


При деятельности университетской библиотеки неизбежно происходит увеличение числа экземпляров книг, увеличивается количество данных о читателях, появляются новые журналы и новые газеты. В результате чего работникам приходится обрабатывать все большие объемы информации, связанной с книгами и читателями. При работе с бумажной документацией неизбежны огромные затраты времени, что непозволительно. Поэтому проблема организации электронного хранилища данных, обеспечивающего быстрый и удобный доступ к информации, является достаточно актуальной для ее разработки.

Создание базы данных позволит автоматизировать процесс получения:

1)   информации о книгах, журналах и газетах. Отчет будет содержать библиографические сведения об изданиях, а также номер отдела, где они хранятся. Эта информация необходима читателям и сотрудникам библиотеки для поиска книг и периодических изданий.

2)   отчетов о пользовании библиотекой. Информация необходима для директора библиотеки, который составляет ежегодный отчет о пользовании библиотекой. В отчете содержится информация о количестве выданных и принятых книг.

3)   отчётов о заказах на книги. Отчет содержит данные преподавателей, заказавших литературу, сведения о заказанных книгах, их количестве, о стоимости заказа. Информация необходима для директора библиотеки.

4)   Очет о книгах, которыми пользуется читатель. Он содержит список книг, которые были выданы читателю. Информация необходима читателю и библиоткарю.


2. Технический проект информационной системы

 

.1 Функциональная модель

 

Контекстная диаграмма и диаграммы детализации процессов

Первая диаграмма в иерархии диаграмм IDEF0 изображает функционирование в целом. Такие диаграммы называются контекстными. В контекстные диаграммы входит описание цели моделирования, области (описания того, что будет рассматриваться в качестве компонента системы, а что в качестве внешнего воздействия) и точки зрения (позиции, с которой будет строиться модель).

После того как контекст описан, проводится построение следующих диаграмм в иерархии. Каждая последующая диаграмма является более подробным описанием (декомпозицией) одной из работ на диаграмме вышестоящего уровня.

Контекстная диаграмма представляет собой схему организации работы библиотеки. Входными данными является информация о сотрудниках, фонде, студентах, новых книгах. Результатом функционирования являются различные отчеты: о проведенных библиотечных мероприятиях, о посещаемости, о платных услугах, о выданных книгах, об изменениях книжного фонда. (Рис. 1)

Рисунок 1 - Контекстная диаграмма

серверный база данные библиотека

Рисунок 2 - декомпозиция процесса AO «Организовать работу библиотеки»

В дальнейшем диаграмма разбивается на уровни. Первый уровень - это диаграмма (рис. 2), с помощью которой производится детализация основного процесса, находящегося на контекстной диаграмме. Контекстную диаграмму разбиваем на 4 блока в соответствии с имеющимися в библиотеке отделами.

Полученные блоки - «Организовать работу отдела периодики» и «Организовать работу справочно-библиографического отдела» - также подлежат дальнейшей детализации в соответствии с функциями, которые выполняют отделы (рис. 3, 4).

Рисунок 3 - декомпозиция процесса A3 «Организовать работу отдела периодики»

Рисунок 4 - декомпозиция процесса A4 «Организовать работу справочно-библиографического отдела»

Блок «Организовать работу отдела обслуживания» разбиваем на 2 блока в соответствии с имеющимися в нем подотделами - «Организовать работу абонемента» и «Организовать работу читального зала и книгохранилища». Полученные блоки подлежат дальнейшей детализации в соответствии с функциями, которые выполняют подотделы. (Рис. 5, 6, 7)

Блок «Организовать работу отдела комплектования» разбиваем на блоки в соответствии с его функциями (Рис. 8). Функция «Обработать литературу» требует также детализации, поэтому мы также разбиваем её на блоки (рис. 9).

Рисунок 5 - декомпозиция процесса A2 «Организовать работу отдела обслуживания»

Рисунок 6 - декомпозиция процесса A2.1 «Организовать работу абонемента»

Рисунок 7 - Декомпозиция процесса A2.2 «Организовать работу читального зала и книгохранилища»

Рисунок 8 - декомпозиция процесса A1 «Организовать работу отдела комплектования»

Рисунок 9 - декомпозиция процесса A1.3 «Обработать литературу»

Диаграмма дерева узлов

Диаграмма дерева узлов показывает иерархию процессов в модели и позволяет рассмотреть всю модель целиком, но не показывает взаимосвязи между процессами. Она имеет вид традиционного иерархического дерева, где верхний узел (прямоугольник) соответствует работе с контекстной диаграммы, а последующие нижние узлы представляют собой дочерние уровни декомпозиции. Можно также создать диаграмму дерева узлов лишь для некоторой части модели.

На диаграмме дерево узлов нижний уровень детализации представляется в виде списка, остальные процессы в виде прямоугольников.

Диаграмма дерева узлов проектируемой базы данных представлена в приложении1 (рисунок 10).

Рисунок 10 - Диаграмма дерева узлов

2.2 Информационная модель

 

Идентификация сущностей и связей. ER-диаграмма логического уровня

Erwin имеет два уровня представления модели - логический и физический. Логический уровень - это абстрактный взгляд на данные. Объекты модели, представляемые на нем, называются сущностями и атрибутами. Логическая модель данных является универсальной, т.к. не зависит от конкретной СУБД.

Для отображения информационной модели рассматриваемого процесса на логической модели используются следующие сущности:

«Отделы» - для фиксации информации об отделах библиотеки. Содержит номер отдела, его название, табельный номер и фамилию начальника отдела;

«СотрудникиБиблиотеки» - для хранения информации о сотрудниках, которые работают в библиотеке;

«Студенты» - запись информации о студентах, которые пользуются библиотекой;

«Экземпляр» - книги, зарегистрированные в отделах библиотеки;

«ЗаменаЭкземпляров» хранит информацию о протоколах замены книг;

«Преподаватели» - информация о преподавателях-пользователях библиотеки;

«Периодические издания» - информация о газетах, журналах, которые имеются в библиотеке;

«Списанные экземпляры» хранит информацию о протоколах списания книг;

«Книга»;

«Заказы» - заказы преподавателей на новую литературу.

Для однозначного определения записей в каждом из отношений выделен первичный ключ (простой или составной).

Внешние ключи для отношений БД:

в отношениях «Экземпляр» и «Заказы» - это ключ «ISBN»;

в отношениях «ЗаменаЭкземпляров» и «Списанные экземпляры» - это ключ «Шифр»

В отношениях «Экземпляр» и «Сотрудники» - это ключ «Номер отдела»

На логическом уровне проектирования в моделируемой базе данных присутствуют следующие типы связей между описанными сущностями:

·        неиденцифицирующие связи;

·        иденцифицирующие связи;

·        связи многие-ко-многим

Связь между сущностями «Отделы» и «Сотрудники библиотеки» неидентифицирующая, не разрешающая присутствие нулей, т.к. каждый сотрудник закреплен за определенным отделом. Тип связи 1 ко многим, т.к. в одном отделе могут работать много сотрудников.

Связь между сущностями «Отделы» и «Экземпляр» неидентифицирующая, не разрешающая присутствие нулей, т.к. каждый экземпляр закреплен за определенным отделом. Тип связи 1 ко многим, т.к. в одном отделе могут храниться много экземпляров.

Связь между сущностями «Отделы» и «Периодические издания» неидентифицирующая, не разрешающая присутствие нулей, т.к. каждое издание закреплено за определенным отделом. Тип связи 1 ко многим, т.к. в одном отделе могут храниться много изданий.

Связь между сущностями «Книга» и «Экземпляр» неидентифицирующая, не разрешающая присутствие нулей, т.к. каждый экземпляр это зарегистрированная книга. Тип связи 1 ко многим, т.к. в одна книга может быть зарегистрирована как несколько экземпляров.

Связь между сущностями «Замена экземпляров» и «Экземпляр» идентифицирующая, т.к. для замены экземпляров необходима информация о нем. Тип связи 1 к одному, т.к. замена осуществляется для одного экземпляра.

Связь между сущностями «Списание экземпляров» и «Экземпляр» идентифицирующая, т.к. для списания экземпляров необходима информация о нем. Тип связи 1 к одному, т.к. списание осуществляется для одного экземпляра.

Связь между сущностями «Преподаватели» и «Заказы» идентифицирующая, т.к. для заказа книг необходима информация о заказчике. Тип связи 1 ко многим, т.к. один преподаватель может заказать много книг.

Связь между сущностями «Книги» и «Заказы» идентифицирующая, т.к. для заказа книг необходима информация о заказе. Тип связи 1 ко многим, т.к. одна книга может быть во многих заказах.

Связь между сущностями «Преподаватели» и «Экземпляр» многие-ко-многим, т.к. один преподаватель может пользоваться многими экземплярами, а один экземпляр может быть поочередно у многих преподавателей.

Связь между сущностями «Студенты» и «Экземпляр» многие-ко-многим, т.к. один студент может пользоваться многими экземплярами, а один экземпляр может быть поочередно у многих студентов.

Связь между сущностями «Сотрудники библиотеки» и «Экземпляр» многие-ко-многим, т.к. один сотрудник библиотеки может пользоваться многими экземплярами, а один экземпляр может быть поочередно у многих сотрудников библиотеки.

ER-диаграмма логического уровня представлена в приложении2 (рисунок 11).

Рисунок 11 - ER-диаграмма логического уровня

ER-диаграмма физического уровня. Ограничения доменов. Ограничения ссылочной целостности. Переопределение триггеров. Индексирование отношений

Физическая модель данных зависит от конкретной СУБД. В ней содержится информация обо всех объектах БД. Одной и той же логической модели может соответствовать несколько разных физических. В физической модели важно описать всю информацию о конкретных физических объектах - таблицах, колонках, индексах, процедурах.

Проверим, удовлетворяют ли все имеющиеся отношения соответствующим наборам ограничений.

Первая нормальная форма требует, чтобы значения всех атрибутов отношения были атомарными. При рассмотрении информационной модели было отмечено, что значения атрибутов всех отношений логически разделить на элементы нельзя и, следовательно, они удовлетворяют условию первой нормальной формы. Пример, рассмотрим таблицу «Преподаватели». Ключевой аттрубут в ней - «читательский_номер» не может быть разделен на элементы. Не ключевые аттрубуты - «Имя», «фамилия», «отчество», «должность» также являются атомарными.

Вторая нормальная форма требует, чтобы отношение находилось в первой нормальной форме, и каждый не ключевой атрибут функционально полно зависел от первичного ключа. И это требование также выполняется в рассматриваемой модели. Пример, рассмотрим таблицу «Преподаватели». Ключевой аттрубут в ней - «читательский_номер». Не ключевые аттрубуты - «Имя», «фамилия», «отчество», «должность» зависят функционально полно только от первичного ключа.

Для нормализации схем отношений к третьей нормальной форме необходимо чтобы каждый детерминант (любой атрибут, от которого функционально полно зависит некоторый другой атрибут) является возможным ключом. В рассматриваемой модели это условие соблюдается. Пример, рассмотрим таблицу «Преподаватели». Как было отмечено выше, все неключевые атрибуты функционально полно зависят от первичного ключа, т.е. первичный ключ является детерминантом.

Реализация ссылочной целостности:

·        При изменении информации о каком-либо отделе из таблицы «Отделы» в таблицах «Сотрудники библиотеки», «Периодические издания» и «Экземпляры» информация будет автоматически меняться (каскадное обновление), удалять записи из таблицы «Отделы» запрешено;

·        При изменении информации о каком-либо сотруднике из таблицы «Сотрудники» в таблице «Пользование библиотекой» информация будет автоматически изменяться (каскадное обновление);

·        В таблице «Книга» разрешено изменение записей (каскадное обновление), удаление данных из этой таблицы запрещается специальным триггером (запрет удаления), т.к. эта таблица содержит информацию обо всех книгах, которые были когда-либо изданы;

·        В таблице «Экземпляр» разрешено изменение записей (каскадное обновление), удаление данных из этой таблицы запрещается (запрет удаления), т.к. информация обо всех экземплярах книг должна храниться постоянно, независимо от того, имеется ли экземпляр в наличии или он был списан;

·        В таблице «Студенты» при изменении информации о студенте происходит каскадное обновление данных. Разрешается удаление информации только в случае, когда на данную информацию нет ссылок в других связанных таблицах (это означает, что за студентом не числится никаких книг). Проверку осуществляет специальный триггер;

·        В таблице «Преподаватели» при изменении данных происходит каскадное обновление. Разрешается удаление информации только в случае, когда на данную информацию нет ссылок в других связанных таблицах (это означает, что за студентом не числится никаких книг). Проверку осуществляет специальный триггер;

·        В таблицах «Списанные экземпляры» и «Замена экземпляров» не разрешается удаление и изменение записей, т.к. информация из этих таблиц используется для отчета об изменении книжного фонда;

·        В таблице «Заказы» разрешается обновление записей. Удаление записей не допускается, т.к. данные этой таблицы используются для построения итоговых отчетов о работе библиотеки.

·        В таблице «Периодическая литература» разрешено изменение записей (каскадное обновление), удаление данных из этой таблицы запрещается (запрет удаления), т.к. информация обо всех экземплярах книг должна храниться постоянно, независимо от того, имеется ли издание в наличии или нет;

Типы данных

. Рассмотрим таблицу «Книга». Ключевое поле этой таблицы ISBN содержит номер книг. Номер представляет собой набор цифр и разделяющих их дефисов (например, 5-414-524316-41). Следовательно, тип данных поля ISBN должен быть строковым с длиной не менее 15 символов. Выбираем тип varchar(20).

. В таблице «Пользование библиотекой» имеется поле «Дата выдачи». Это поле содержит число, месяц, год даты, когда была выдана книга. Тип данных для неё - datetime.

. Рассмотрим таблицу «Сотрудники библиотеки». Ключевое поле этой таблицы (табельный номер) представляет собой номер, который присваивают каждому сотруднику при принятии на работу. Он представляет собой набор цифр (например, 2431). Следовательно, тип данных поля табельный номер должен быть числовым целым. Выбираем тип int.

Для приложения были разработаны следующие триггеры:срабатывает при вставке нового элемента в таблицу «Отделы». Он проверяет номер отдела, который должен быть больше 9 и меньше 15;проверяет права на удаление пользователем записи из таблицы «Пользование_библиотекой2». Если пользователь не является владельцем базы данных, то прав на удаление он не имеет. Запись удалена не будет;запрещает добавлять записи в таблицу «Пользование_библиотекой2» в воскресение;записывает в отдельную таблицу информацию о записях, добавленных в таблицу «Сотрудники библиотеки», чтобы было легче проследить за процессом изменения данных в таблице;записывает в отдельную таблицу информацию о записях, добавленных в таблицу «Студенты», чтобы было легче проследить за процессом изменения данных в таблице;записывает в отдельную таблицу информацию о записях, добавленных в таблицу «Преподаватели», чтобы было легче проследить за процессом изменения данных в таблице;_otchislenia_Studentov запрещает изменять запись о студенте, у которого год отчисления больше значения текущего года;записывает в отдельную таблицу информацию о записях, удаленных из таблицы «Преподаватели»;записывает в отдельную таблицу информацию о записях, удаленных из таблицы «Сотрудники библиотеки»

ER-диаграмма физического уровня показана в приложении 3 (рисунок 12).

Рисунок 12 - ER-диаграмма физического уровня

 

Определение представлений, хранимых процедур серверной компоненты. ER-диаграмма в режиме отображения представлений

Представление (View) для конечных пользователей выглядит как таблица, но при этом само не содержит данных, а лишь представляет данные, расположенные в таблице. Физически представление реализовано в виде SQL-запроса, на основе которого производится выборка данных из одной или нескольких таблиц или представлений.

Представление может выбирать данные из других представлений, которые, в свою очередь, могут также основываться на представлениях или таблицах. Вложенность представлений не должна превышать 32. Представление часто применяется для ограничения доступа пользователей к конфиденциальным данным в таблице.

Для приложения были разработаны следующие представления:

infoZamena информация о замене книг по какой-либо предметной области. Содержит информацию из таблиц «Книга», «Замена книг» и «Экземпляр»;информация о списании книг по программированию на Delphi. Содержит информацию из таблиц «Книга», «Списанные экземпляры» и «Экземпляр»;информация об отделах библиотеки, содержит информацию из талиц «Отделы» и «Сотрудники».информация о заказах. Содержит информацию из таблиц «Заказы» и «Преподаватели»;информация о книге и её экземплярах. Содержит информацию из таблиц «Книга» и «Экземпляр»;информация о наличии книг в библиотеке. Содержит информацию из таблиц «Книга», «Экземпляр» и «Пользование_библиотекой»;информация о наличии экземпляров книг в библиотеке. Содержит информацию из таблиц «Экземпляр» и «Пользование_библиотекой»;информация о том, кто и когда принял оплату платной услуги, Содержит информацию из таблиц «Платные_услуги», «Сотрудники_библиотеки» и «Пользование_библиотекой»;список книг, которыми пользуется преподаватель. Содержит информацию из таблиц «Книга», «Преподаватели», «Пользование библиотекой3» и «Экземпляр»;список книг, которыми пользуется библиотекарь. Содержит информацию из таблиц «Книга», «Сотрудники библиотеки», «Пользование библиотекой1» и «Экземпляр»;список книг, которыми пользуется студент. Содержит информацию из таблиц «Книга», «Студенты», «Пользование библиотекой2» и «Экземпляр»;информация о сотруднике. Содержит информацию из таблиц «Сотрудники библиотеки» и «Отделы»;информация о книге и её цене. Содержит информацию из таблицы «Книга»;полная информация об экземпляре.

Хранимые процедуры имеют много общего с обычными процедурами. Использование хранимых процедур позволяет значительно повысить скорость разработки приложений.

Для приложения были разработаны следующие хранимые процедуры:

для вставки новых данных:в таблицу «Заказы»;в таблицу «Списанные экземпляры»;в таблицу «Книга»;в таблицу «Отделы»;в таблицу «Периодические издания»;в таблицу «Пользование библиотекой1»;в таблицу «Студенты»;в таблицу «Экземпляр»;в таблицу «Преподаватели»;в таблицу «Пользование библиотекой3»;

для удаления данных:из таблицы «Преподаватели»;из таблицы «Сотрудники библиотеки»;

для обновления записей:таблица «Отделы»;

UpdatePrepod таблица «Преподаватели»:

UpdateCotpyd таблица «Сотрудники библиотеки»;

UpdateStudent таблица «Студенты»:

KolExzemplarov для подсчета количества экземпляров;

CpicokVidach формирует список книговыдач:

CpicokKnigCtudenta формирует список книг, которыми пользуется студент.

2.3 Верификация спроектированной логической модели

После разработки информационной модели ее следует связать с функциональной моделью. Такая связь гарантирует завершенность анализа, гарантирует, что есть источники данных (сущности) для всех работ. Связывание моделей способствует согласованности, корректности и завершенности анализа. Стрелки в функциональной модели обозначают некоторую информацию, использующуюся в моделируемой системе. В информационной модели на логическом уровне информация изображается в виде сущностей. Сущности состоят из совокупностей экземпляров сущностей (кортежи отношений). К информационной модели предъявляется требование нормализации, что должно обеспечить компактность и непротиворечивость хранения данных. Информация, которая моделируется одной стрелкой в функциональной модели, может содержаться в нескольких сущностях и атрибутах информационной модели. На функциональной модели могут присутствовать различные стрелки, изображающие одни и те же данные. Информация о таких стрелках находится в одних и тех же сущностях. Следовательно, одной и той же стрелке в функциональной модели могут соответствовать несколько сущностей в информационной модели и, наоборот, одной сущности может соответствовать несколько стрелок.

Работы в функциональной модели могут создавать или изменять данные, которые соответствуют входящим и выходящим стрелкам. Они могут воздействовать как целиком на сущности (создавая и модифицируя экземпляры сущности), так и на отдельные атрибуты сущности.

Таблица 1 - Отчет о верификации модели

Arrow Name

Entity Name

Attribute Name

Информация о новых книгах

Книга


Информация о сотрудниках

Преподаватели

Должность



Имя



Отчество



Фамилия



Читательский номер


Сотрудники библиотеки

дата рождения



должность



имя



номер отдела



Номер отдела



отчество



табельный номер



фамилия

Информация о студентах

Студенты

год окончания



год поступления



Имя



номер приказа



Отчество



специальность



факультет



Фамилия



форма обучения



Читательский номер

Информация о фонде

Периодические издания

Дата издания



Название



Номер отдела



Шифр периодики


Экземпляр

ISBN



Номер отдела



Отметка о замене



Отметка о списании



Предметная область



Шифр

Картотека периодических изданий

Периодические издания

Дата издания



Название



Номер отдела



Шифр периодики

Новая литература

Книга

ISBN



Автор



Год издания



Издательство



Кодичество страниц



Название



Цена

Отчет о выданных книгах

Экземпляр

ISBN



Номер отдела



Отметка о замене



Отметка о списании



Предметная область



Шифр

Отчет о платных услугах

Периодические издания

Дата издания



Название



Номер отдела



Шифр периодики


Студенты

год окончания



год поступления



Имя



номер приказа



Отчество



специальность



факультет



Фамилия



форма обучения



Читательский номер


Экземпляр

ISBN



Номер отдела



Отметка о замене



Отметка о списании



Предметная область



Шифр

Отчет о посещаемости

Преподаватели

Должность



Имя



Отчество



Фамилия



Читательский номер


Студенты

год окончания



год поступления



Имя



номер приказа



Отчество



специальность



факультет



Фамилия



Читательский номер


Экземпляр

ISBN



Номер отдела



Отметка о замене



Отметка о списании



Предметная область



Шифр

Отчет о проведении библиотечных мероприятий

Отделы

Название отдела



Номер отдела



табельный номер начальника



фамилия начальника отдела



Шифр периодики

Отчет об изменениях книжного фонда

Замена экземпляров

Номер акта замены



Шифр


Списанные книги

номер протокола списания



причина списания



Табельный номер списавшего



Шифр


Экземпляр

ISBN



Номер отдела



Отметка о замене



Отметка о списании



Предметная область



Шифр

Результат подбора литературы

Периодические издания

Дата издания



Название



Номер отдела



Шифр периодики


Экземпляр

ISBN



Номер отдела



Отметка о замене



Отметка о списании



Предметная область



Шифр

Результат поиска книг

Экземпляр

ISBN



Номер отдела



Отметка о замене



Отметка о списании



Предметная область



Шифр



3. Реализация системы

 

.1 Миниспецификации процессов диаграмм нижнего уровня функциональной модели в терминах псевдокода


Организовать работу абонемента

1. «Найти книги по списку»

@ВХОД= ИНФОРМАЦИЯ О ФОНДЕ

@ВЫХОД= РЕЗУЛЬТАТ ПОИСКА

@СПЕЦПРОЦ А2.1.1 НАЙТИ КНИГИ ПО СПИСКУ

ВЫПОЛНИТЬ потребовать СПИСОК

ВЫПОЛНИТЬ проверить наличие КНИГ в ФОНДЕ

ЕСЛИ КНИГИ есть в НАЛИЧИИ ТО

ВЫПОЛНИТЬ присвоить РЕЗУЛЬТАТ ПОИСКА =положительный

ИНАЧЕ

ВЫПОЛНИТЬ присвоить РЕЗУЛЬТАТ ПОИСКА =отрицательный

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

. «Выдать найденную литературу читателю»

@ВХОД= РЕЗУЛЬТАТ ПОИСКА

@ВХОД= ИНФОРМАЦИЯ О СОТРУДНИКАХ

@ВХОД= ИНФОРМАЦИЯ О СТУДЕНТАХ

@ВЫХОД= ОТЧЕТ О ПОСЕЩАЕМОСТИ

@ВЫХОД= ОТЧЕТ О ВЫДАННЫХ КНИГАХ

@ВЫХОД= СПИСОК ВЫДАННЫХ КНИГ

@СПЕЦПРОЦ А2.1.2 ВЫДАТЬ НАЙДЕННУЮ ЛИТЕРАТУРУ ЧИТАТЕЛЮ

ВЫПОЛНИТЬ потребовать ЧИТАТЕЛЬСКИЙ БИЛЕТ

ВЫПОЛНИТЬ проверить данные ЧИТАТЕЛЯ

ЕСЛИ ДАННЫЕ правильные И РЕЗУЛЬТАТ ПОИСКА=положительный ТО

ВЫПОЛНИТЬ выдать КНИГИ ЧИТАТЕЛЮ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ в ОТЧЕТЫ

ИНАЧЕ

ВЫПОЛНИТЬ отказать в ВЫДАЧе КНИГ

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

. «Прием литературы у читателя»

@ВХОД= ИНФОРМАЦИЯ О СОТРУДНИКАХ

@ВХОД= ИНФОРМАЦИЯ О СТУДЕНТАХ

@ВЫХОД= ОТЧЕТ О ПОСЕЩАЕМОСТИ

@СПЕЦПРОЦ А2.1.3 ПРИЕМ ЛИТЕРАТУРЫ У ЧИТАТЕЛЯ

ВЫПОЛНИТЬ потребовать ЧИТАТЕЛЬСКИЙ БИЛЕТ

ВЫПОЛНИТЬ проверить данные ЧИТАТЕЛЯ

ЕСЛИ ДАННЫЕ правильные И КНИГИ в наличии ТО

ВЫПОЛНИТЬ принять КНИГИ ЧИТАТЕЛЯ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ в ОТЧЕТЫ

ИНАЧЕ

ВЫПОЛНИТЬ отказать в ПРИЕМЕ КНИГ

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

Организовать работу отдела периодики

. «Подобрать периодическое издание»

@ВХОД=ИНФОРМАЦИЯ О ФОНДЕ

@ВЫХОД= РЕЗУЛЬТАТ ПОДБОРА ЛИТЕРАТУРЫ

@СПЕЦПРОЦ А 3.4 НАЙТИ ПЕРИОДИЧЕСКОЕ ИЗДАНИЕ

ВЫПОЛНИТЬ узнать тему

ВЫПОЛНИТЬ проверить наличие ПЕРИОДИЧЕСКИХ ИЗДАНИЙ ПО ТЕМЕ в ФОНДЕ

ЕСЛИ ПЕРИОДИЧЕСКОЕ ИЗДАНИЕ есть в НАЛИЧИИ ТО

ВЫПОЛНИТЬ присвоить РЕЗУЛЬТАТ ПОДБОРА ЛИТЕРАТУРЫ =положительный

ИНАЧЕ

ВЫПОЛНИТЬ присвоить РЕЗУЛЬТАТ ПОДБОРА ЛИТЕРАТУРЫ =отрицательный

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

. «Выдать читателю периодическое издание»

@ВХОД= РЕЗУЛЬТАТ ПОДБОРА ЛИТЕРАТУРЫ

@ВХОД= ИНФОРМАЦИЯ О СОТРУДНИКАХ

@ВХОД= ИНФОРМАЦИЯ О СТУДЕНТАХ

@ВЫХОД= ОТЧЕТ О ПОСЕЩАЕМОСТИ

@ВЫХОД= ОТЧЕТ О ВЫДАННЫХ КНИГАХ

@ВЫХОД= СПИСОК ВЫДАННОЙ ЛИТЕРАТУРЫ

@СПЕЦПРОЦ А3.3 ВЫДАТЬ НАЙДЕННУЮ ЛИТЕРАТУРУ ЧИТАТЕЛЮ

ВЫПОЛНИТЬ потребовать ЧИТАТЕЛЬСКИЙ БИЛЕТ

ВЫПОЛНИТЬ проверить данные ЧИТАТЕЛЯ

ЕСЛИ ДАННЫЕ правильные И РЕЗУЛЬТАТ ПОДБОРА ЛИТЕРАТУРЫ =положительный ТО

ВЫПОЛНИТЬ выдать ЛИТЕРАТУРУ ЧИТАТЕЛЮ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ в ОТЧЕТЫ

ИНАЧЕ

ВЫПОЛНИТЬ отказать в ВЫДАЧе ЛИТЕРАТУРЫ

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

Организовать работу читального зала и книгохранилища

. «Найти необходимую литературу»

@ВХОД= ИНФОРМАЦИЯ О ФОНДЕ

@ВЫХОД= РЕЗУЛЬТАТ ПОИСКА КНИГ

@СПЕЦПРОЦ А2.2.2 НАЙТИ НЕОБХОДИМУЮ ЛИТЕРАТУРУ

ВЫПОЛНИТЬ узнать тему

ВЫПОЛНИТЬ проверить наличие КНИГ в ФОНДЕ

ЕСЛИ КНИГИ есть в НАЛИЧИИ ТО

ВЫПОЛНИТЬ присвоить РЕЗУЛЬТАТ ПОИСКА КНИГ =положительный

ИНАЧЕ

ВЫПОЛНИТЬ присвоить РЕЗУЛЬТАТ ПОИСКА КНИГ =отрицательный

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

. «Выдать книги читателю»

@ВХОД= РЕЗУЛЬТАТ ПОДБОРА ЛИТЕРАТУРЫ

@ВХОД= ИНФОРМАЦИЯ О СОТРУДНИКАХ

@ВХОД= ИНФОРМАЦИЯ О СТУДЕНТАХ

@ВЫХОД= ОТЧЕТ О ПОСЕЩАЕМОСТИ

@ВЫХОД= ОТЧЕТ О ВЫДАННЫХ КНИГАХ

@ВЫХОД= ОТЧЕТ О ПЛАТНЫХ УСЛУГАХ

@СПЕЦПРОЦ А2.2.1 ВЫДАТЬ КНИГИ ЧИТАТЕЛЮ

ВЫПОЛНИТЬ потребовать ЧИТАТЕЛЬСКИЙ БИЛЕТ

ВЫПОЛНИТЬ проверить данные ЧИТАТЕЛЯ

ЕСЛИ ДАННЫЕ правильные И РЕЗУЛЬТАТ ПОИСКА КНИГ =положительный КНИГИ ВЫДАЮТСЯ НА ВРЕМЯ ТО

ВЫПОЛНИТЬ выдать КНИГИ ЧИТАТЕЛЮ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ в ОТЧЕТЫ

ИНАЧЕ

ЕСЛИ ДАННЫЕ правильные И РЕЗУЛЬТАТ ПОИСКА КНИГ =положительный КНИГИ ВЫДАЮТСЯ ПЛАТНО ТО

ВЫПОЛНИТЬ выдать КНИГИ ЧИТАТЕЛЮ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ в ОТЧЕТЫ

ВЫПОЛНИТЬ принять оплату

ИНАЧЕ

ВЫПОЛНИТЬ отказать в ВЫДАЧе ЛИТЕРАТУРЫ

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

. «Принять книги»

@ВХОД= ИНФОРМАЦИЯ О СОТРУДНИКАХ

@ВХОД= ИНФОРМАЦИЯ О СТУДЕНТАХ

@ВЫХОД= ОТЧЕТ О ПОСЕЩАЕМОСТИ

@ВЫХОД= ОТЧЕТ О ПЛАТНЫХ УСЛУГАХ

@СПЕЦПРОЦ А2.2.3 ПРИНЯТЬ КНИГИ

ВЫПОЛНИТЬ проверить КНИГИ

ЕСЛИ КНИГИ в наличии ТО

ВЫПОЛНИТЬ принять КНИГИ ЧИТАТЕЛЯ

ВЫПОЛНИТЬ отдать ЧИТАТЕЛЬСКИЙ БИЛЕТ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ в ОТЧЕТЫ

ИНАЧЕ

ВЫПОЛНИТЬ отказать в ПРИЕМЕ КНИГ

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

Организовать работу отдела комплектования

 

9. «Списать книги»

@ВХОД= ИНФОРМАЦИЯ О ФОНДЕ

@ВЫХОД= ОТЧЕТ О ИЗМЕНЕНИИ КНИЖНОГО ФОНДА

@СПЕЦПРОЦ А1.3.1 СПИСАТЬ КНИГИ

ВЫПОЛНИТЬ проверить КНИГИ

ЕСЛИ КНИГИ устарели ТО

ВЫПОЛНИТЬ составить акт СПИСАНИЯ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ в ОТЧЕТ

ИНАЧЕ

ВЫПОЛНИТЬ отказать в СПИСАНИИ КНИГИ

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

. «Заменить книгу»

@ВХОД= ИНФОРМАЦИЯ О ФОНДЕ

@ВЫХОД= ОТЧЕТ О ИЗМЕНЕНИИ КНИЖНОГО ФОНДА

@СПЕЦПРОЦ А1.3.3 ЗАМЕНИТЬ КНИГИ

ВЫПОЛНИТЬ проверить КНИГИ

ЕСЛИ ЗАМЕНА равноценная ТО

ВЫПОЛНИТЬ составить акт ЗАМЕНЫ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ в ОТЧЕТ

ИНАЧЕ

ВЫПОЛНИТЬ отказать в ЗАМЕНЕ КНИГИ

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

«Обработать новую книгу»

@ВХОД= ИНФОРМАЦИЯ О ФОНДЕ

@ВЫХОД= ОТЧЕТ О ИЗМЕНЕНИИ КНИЖНОГО ФОНДА

@СПЕЦПРОЦ А1.3.2 ОБРАБОТАТЬ НОВУЮ КНИГУ

ВЫПОЛНИТЬ получить КНИГУ

ВЫПОЛНИТЬ присвоить КНИГЕ шифр

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ О КНИГЕ в каталоги

ВЫПОЛНИТЬ отправить КНИГУ в отдел

@КОНЕЦ СПЕЦПРОЦ

«Организовать работу справочно-библиографического отдела»

. «Составить картотеку периодических изданий»

@ВХОД= ИНФОРМАЦИЯ О ФОНДЕ

@ВЫХОД= КАРТОТЕКА ПЕРИОДИЧЕСКИХ ИЗДАНИЙ

@СПЕЦПРОЦ А4.4 СОСТАВИТЬ КАРТОТЕКУ ПЕРИОДИЧЕСКИХ ИЗДАНИЙ

ВЫПОЛНИТЬ получить ИНФОРМАЦИЮ О ПЕРИОДИЧЕСКИХ ИЗДАНИЯХ

ВЫПОЛНИТЬ получить шифры ПЕРИОДИЧЕСКИХ ИЗДАНИЙ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ О ПЕРИОДИЧЕСКИХ ИЗДАНЯХ в каталоги

@КОНЕЦ СПЕЦПРОЦ

13. «Найти литературу в каталоге»

@ВХОД= ИНФОРМАЦИЯ О ФОНДЕ

@ВХОД= КАРТОТЕКА ПЕРИОДИЧЕСКИХ ИЗДАНИЙ

@ВЫХОД= ОТЧЕТ О ПОСЕЩАЕМОСТИ

@СПЕЦПРОЦ А4.НАЙТИ ЛИТЕРАТУРУ В КАТАЛОГЕ

ВЫПОЛНИТЬ получить информацию о ЛИТЕРАТУРЕ

ЕСЛИ ИНФОРМАЦИЯ правильная ТО

ВЫПОЛНИТЬ выдать ИНФОРМАЦИЮ об месте хранения ЛИТЕРАТУРЫ

ВЫПОЛНИТЬ занести ИНФОРМАЦИЮ в ОТЧЕТ

ИНАЧЕ

ВЫПОЛНИТЬ отказать а выдаче ИНФОРМАЦИИР об месте хранения ЛИТЕРАТУРЫ

КОНЕЦЕСЛИ

@КОНЕЦ СПЕЦПРОЦ

3.2 T-SQL-определения регламентированных запросов


1. Вывод ограниченной информации о студентах с фамилией, оканчивающейся на «ов».

CREATE VIEW infoStudent                              /*Указываем имя представления*/SELECT              /*Указываем, какие поля будут выведены*/

Студенты. Имя, Студенты. Фамилия, Студенты.факультет, Студенты.специальность

FROM Студенты                  /*Из какой таблицы*/

WHERE Студенты. Фамилия LIKE ‘[] ов’

 

. Информация о замене экземпляров по программированию на С++.

CREATE VIEW infoZamena

AS              /*Указываем, какие поля, из каких таблиц будут выведены*/

Книга. Автор, Книга. Название, Экземпляр. Шифр, Замена_экземпляров. Номер_акта_замены             /*Указываем таблицу, и связанные с ней при помощи оператора INNER JOIN таблицы, из которых выбираются связанные данные. После операнда ON указываем, по каким полям связаны две таблицы*/

(Книга INNER JOIN Экземпляр ON Книга.ISBN =Экземпляр.ISBN)JOIN Замена_экземпляров ON Экземпляр. Шифр = Замена_экземпляров. ШифрКнига. Название LIKE ' % C++'                 /*Выбираются только                                                      те книги, в названии которых присутствует «C++» */

 

. Информация о списанных экземплярах по программированию на Delphi.

CREATE VIEW infoCpicanie                   /*Указываем, какие поля, из каких таблиц будут выведены*/

Книга. Автор, Книга. Название, Экземпляр. Шифр, Списанные_книги. причина_списания, Списанные_книги. номер_протокола_списания, Списанные_книги. Табельный_номер_списавшего                                                    /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Книга INNER JOIN (Экземпляр INNER JOIN Списанные_книги ON Экземпляр. Шифр = Списанные_книги. Шифр) ON Книга.ISBN = Экземпляр.ISBNКнига. Название LIKE ' % Delphi'                    /*Выбираются только                                                                те книги, в названии которых присутствует «Delphi */

4. Информация о преподавателях и их заказах на литературу, количество книг должно быть от 10 до 20 или от 25 до 30.

CREATE VIEW infoZakazi             /*Объявляем имя представления*/

AS                       /*Указываем, какие поля таблиц будут выведены*/

Преподаватели. Фамилия, Преподаватели. Имя, Преподаватели. Отчество, Книга. Автор, Книга. Название, Заказы. Количество                                                                                     /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Книга INNER JOIN (Преподаватели INNER JOIN Заказы ON Преподаватели. Читательский_номер = Заказы. Читательский_номер)Книга.ISBN = Заказы.ISBN

WHERE (Заказы. Количество BETWEEN 10 AND 20) OR (Заказы. Количество BETWEEN 25 AND 30)                          /* 10<количество заказов<20 или                                                                                     25<количество заказов<30 */

 

. Информация о книгах, которыми пользуется студент, и табельный номер сотрудника отдела обслуживания выдавшего книги. Номер отдела обслуживания 11.

CREATE VIEW infoOPolzovaniiStudentov                                  /*Указываем, какие поля таблиц будут выведены*/

Студенты. Имя, Студенты. Фамилия, Книга. Автор, Книга. Название, Сотрудники_библиотеки. табельный_номер                               /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

(((Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN) INNER JOIN

Пользование_библиотекой2 ON Экземпляр. Шифр = Пользование_библиотекой2. Шифр) INNER JOIN

Студенты ON Пользование_библиотекой2. Читательский_номер = Студенты. Читательский_номер) INNER JOIN

Сотрудники_библиотеки ON Пользование_библиотекой2. Табельный_номер = Сотрудники_библиотеки. табельный_номер

WHERE Сотрудники_библиотеки. табельный_номер LIKE '10 []'     /*Табельный номер сотрудников должен начинаться с «11»*/

6. Информация о книгах, которыми пользуется преподаватель и табельный номер сотрудника отдела обслуживания выдавшего книги. Номер отдела обслуживания 11.

CREATE VIEW infoOPolzovaniiPrepodovatelej        /*Указываем, какие поля таблиц будут выведены*/

Преподаватели. Имя, Преподаватели. Фамилия, Книга. Автор, Книга. Название, Сотрудники_библиотеки. табельный_номер/*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

(((Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN) INNER JOIN

Пользование_библиотекой3 ON Экземпляр. Шифр = Пользование_библиотекой3. Шифр) INNER JOIN

Преподаватели ON Пользование_библиотекой3. Читательский_номер = Преподаватели. Читательский_номер) INNER JOIN

Сотрудники_библиотеки ON Пользование_библиотекой3. Табельный_номер = Сотрудники_библиотеки. табельный_номер

WHERE Сотрудники_библиотеки. табельный_номер LIKE '10 []'     /*Табельный номер сотрудников должен начинаться с «11»*/

7. Информация о отделах 11 и 12 и работающих в них сотрудниках.

CREATE VIEW Otdeli /*Указываем какие поля будут выбраны*/

Отделы.номер_отдела, Отделы.название_отдела, Сотрудники_библиотеки. фамилия,

Сотрудники_библиотеки. имя, Сотрудники_библиотеки. отчество/*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Отделы INNER JOIN Сотрудники_библиотеки ON Отделы. Номер_отдела = Сотрудники_библиотеки. Номер_отдела

GROUP BY номер. отдела            /*По какому полю будут сгруппированы поля*/

WHERE Отделы.номер_отдела BETWEEN 10 AND 13    /*Выбираются отделы, номер которых находится между 10 и 13*/

8. Информация о месте хранения периодических изданий название которых содержит в себе слово «вестник», но при этом д.б. исключены периодические издания, первое слово которых начинается на «Э», например «Экономический вестник».

CREATE VIEW INFOPeriodika               /*Указываем какие поля будут выбраны*/

Периодические_издания. Название, Периодические_издания. Дата_издания, Отделы. Название_отдела, Отделы. Номер_отдела          /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Отделы INNER JOIN Периодические_издания ON Отделы. Номер_отдела = Периодические_издания. Номер_отдела

WHERE Периодические_издания. Название LIKE '[^Э]%вестник % '        

/*[^Э] запрещает начинаться первому слову на «Э», % вестник% - указывает на то, что оставшаяся часть названия должна содержать слово «вестник»*/

9. Полная информация об экземпляре, который был издан с 2000 до текущего года

CREATE VIEW FullInfoEkzemplar                  /*Указываем какие поля будут выбраны*/

Экземпляр.шифр, Книга. Автор, Книга. Название, Книга. Год_издания, Книга. Издательство, Экземпляр. Предметная_область, Экземпляр. Номер_отдела, Экземпляр. Отметка_о_списании, Экземпляр. Отметка_о_замене                /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN

WHERE Книга. Год_издания BETWEEN 2000 AND YEAR (GETDATE())

/*GETDATE() возвращает текущую дату, YEAR (<дата>) - год <даты>*/

10. Информация о наличии книги в библиотеке

CREATE VIEW InfoAboutBook                       /*Указываем какие поля будут выбраны*/

Книга.ISBN, Экземпляр. Шифр, Экземпляр. Номер_отдела,

Пользование_библиотекой2. Дата_выдачи, Пользование_библиотекой2. Дата_приема                /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

(Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN) INNER JOIN

Пользование_библиотекой2 ON Экземпляр. Шифр = Пользование_библиотекой2. Шифр

WHERE Пользование_библиотекой2. Дата_приема BETWEEN Пользование_библиотекой2. Дата_выдачи AND GETDATE()           /*Если книгу сдали, т.е. она в наличии в библиотеке, то дата приема будет между датой выдачи и текущей датой*/

11. Информация о месте хранения книги.

CREATE VIEW BooksКнига. Автор, Книга. Название, Книга. Год_издания, Книга. Количество_страницКнига

12. Информация о ценах на книги.

CREATE VIEW CenaКнига. Автор, Книга. Название, Книга. Цена

FROM Книга

13. Информация о сотрудниках.

CREATE VIEW Sotrudnik

ASСотрудники_библиотеки. имя, Сотрудники_библиотеки. фамилия,

Сотрудники_библиотеки. отчество, Сотрудники_библиотеки. дата_рождения, Сотрудники_библиотеки. должность

FROM Сотрудники_библиотеки

14. Информация о пользовании библиотекой студентами.

CREATE VIEW infoOPolzovaniiStudentovСтуденты. Имя, Студенты. Фамилия, Книга. Автор, Книга. Название, Сотрудники_библиотеки. табельный_номер(((Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN) INNER JOIN

Пользование_библиотекой2 ON Экземпляр. Шифр = Пользование_библиотекой2. Шифр) INNER JOIN

Студенты ON Пользование_библиотекой2. Читательский_номер = Студенты. Читательский_номер) INNER JOIN

Сотрудники_библиотеки ON Пользование_библиотекой2. Табельный_номер = Сотрудники_библиотеки. табельный_номерСотрудники_библиотеки. табельный_номер LIKE '11 []'

15. Информация о пользовании библиотекой её сотрудниками.

CREATE VIEW InfoOPolzovaniiCotrydnikovСотрудники_библиотеки. имя, Сотрудники_библиотеки. фамилия, Книга. Автор, Книга. НазваниеСотрудники_библиотеки INNER JOIN ((Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN)JOIN Пользование_библиотекой1 ON Экземпляр. Шифр = Пользование_библиотекой1. Шифр)Сотрудники_библиотеки. табельный_номер = Пользование_библиотекой1.табельный_номер

3.3 T-SQL-определения триггеров


1. Триггер, который будет запрещать удаление записей таблицы «Пользование библиотекой», если текущий пользователь не владелец базы данных и если поле «дата выдачи» содержит какое-либо значение.

CREATE TRIGGER udalenie                                     /*Обьявляем имя триггера*/

ON Пользование_библиотекой2 /*Указываем имя таблицы, с которой будет связан триггер*/

FOR DELETE /*Указываем операцию, на кот. будет срабатывать триггер (здесь на удаление)*/

AS

IF (SELECT count(*)                                                                               /*проверяет записи из таблицы «Пользование библиотекой»*/Пользование_библиотекой2

where Пользование_библиотекой2.дата_выдачи is not null)>0 /*условие проверяет наличие записи в поле «дата выдачи». Если count возвращает значение отличное от нуля (означает, что запись есть) то первое условие IF не выполнено*/

AND (CURRENT_USER <> 'dbo') /*вызывается функция определения имени текущего пользователя и проверяется, владелец ли он*/

BEGIN       «у вас нет прав на удаление этой записи»      /*выдача сообщения о неудаче операции*/

ROLLBACK TRANSACTION                                    /*откат (отмена) транзакции*/

END

2. Проверяет правильность номера отдела. Существует лишь 5 отделов, которым присваиваются номера от 10 до 14 включительно.

CREATE TRIGGER dobavlenieОтделыINSERT

DECLARE @@f int                                  /*Объявляем переменную*/

Set @@f=10                                              /*Присваиваем ей значение*/

IF NOT EXISTS (SELECT * FROM Отделы, inserted Отделы. Номер_отдела = inserted. Номер_отдела)@@f=0EXISTS (SELECT * FROM Отделы, insertedinserted. Номер_отдела>14 OR inserted. Номер_отдела<10) /*Если номер отдела не >14 или <10, то такой отдел не существует*/

Set @@f=0                           /*Меняем значение переменной*/

If @@f=0                     /*если f=0, значит были ошибки*/

BEGIN

PRINT «Неверно введены данные»                  /*выдача сообщения о неудаче операции*/

ROLLBACK TRANSACTION                /*откат (отмена) транзакции*/

END

/*inserted - временная таблица, куда заносятся добавляемые данные*/

3. Триггер, который записывает при удалении записей из таблицы «Преподаватели» в отдельную таблицу информацию о дате удаления, пользователе,

Перед созданием такого триггера необходимо создать таблицу DeletedItems, куда будет производится запись:

CREATE TABLE DeletedItem (

[Читательский_номер] [int] NOT NULL, /*объявляем поля таблицы*/

[имя] [varchar] (25) NULL,

[отчество] [varchar] (75) NULL,

[фамилия] [varchar] (25) NULL,

[должность] [varchar] (35) NULL,

[Имя_пользователя] [varchar] (50) NULL,

[Дата_удаления] [datetime] NULL

) ON [PRIMARY]

CREATE TRIGGER deletedby

ON Преподаватели                        /*Связываем триггер с таблицей Преподаватели*/

FOR DELETEINTO DeletedItem            

(Читательский_номер, имя, отчество,    /*указываем, какие поля нужно вставить*/

фамилия, должность, Имя_пользователя, Дата_удаления)Читательский_номер, имя, отчество, фамилия, должность,

SYSTEM_USER,                                      /*функция определяет текущего пользователя*/

getdate()                                           /*функция возвращает текущую дату*/

FROM deleted     /*deleted - временная таблица, куда заносятся удаляемые данные*/

4. Триггер, который записывает при добавлении записей в таблицы «Сотрудники_Библиотеки» в отдельную таблицу информацию о дате удаления, пользователе.

Перед созданием такого триггера необходимо создать таблицу InsertedItemSotrydniki, куда будет производится запись:

CREATE TABLE InsertedItemSotrydniki

(

[табельный_номер] [int] NOT NULL, /*объявляем поля таблицы*/

[фамилия] [varchar] (25) NULL,

[имя] [varchar] (25) NULL,

[отчество] [varchar] (75) NULL,

[Дата_рождения] [datetime] NULL,

[должность] [varchar] (35) NULL,

[Имя_пользователя] [varchar] (50) NULL,

[Дата_добавления] [datetime] NULL

) ON [PRIMARY]

Сам триггер выглядит следующим образом;

CREATE TRIGGER infoInsertSotrud

ON Сотрудники_библиотеки         /*Связываем триггер с таблицей Сотрудники_библиотеки */

FOR INSERT

AS

INSERT INTO InsertedItemSotrydniki (Табельный_номер, /*указываем, какие поля нужно вставить*/

фамилия, имя, отчество, Дата_рождения,       должность, Имя_пользователя, Дата_добавления)Табельный_номер, фамилия, имя, отчество, Дата_рождения, должность,_USER,                                           /*функция определяет текущего пользователя*/

getdate()                                                              /*функция возвращает текущую дату*/

FROM inserted /*inserted - временная таблица, куда заносятся добавляемые данные*/

5. Триггер, который записывает при изменении записей в таблице «Студенты» в отдельную таблицу информацию о дате удаления, пользователе.

Перед созданием такого триггера необходимо создать таблицу UpdatedStudents, куда будет производится запись:

CREATE TABLE UpdatedStudents

(

[читательский_номер] [int] NOT NULL,

[фамилия] [varchar] (25) NULL,

[Имя_пользователя] [varchar] (50) NULL,

[Дата_добавления] [datetime] NULL

) ON [PRIMARY]

Триггер выглядит следующем образом:

CREATE TRIGGER infoUpdateStudent

ON Студенты                                 /*Связываем с таблицей*/

FOR UPDATE

AS

INSERT INTO UpdatedStudents (Читательский_номер, /*указываем, какие поля нужно вставить*/

фамилия, Имя_пользователя, Дата_добавления)Читательский_номер, фамилия,                    /*указываем откуда*/_USER,                                   /*функция определяет текущего пользователя*/

getdate()                                                    /*функция возвращает текущую дату*/

FROM updated                      /*updated - временная таблица, куда заносятся данные*/

6. Триггер запрещает изменять в таблице «Пользование_библиотекой2» запись полей «дата_приема» и «дата выдачи» в воскресенье.

ALTER TRIGGER proverka ON Пользование_библиотекой2 UPDATE

AS

IF UPDATE (дата_приема)                               /*Проверяет, какое поле обновляется*/

AND datename (dw, GETDATE()) in ('Sunday')         /*Проверяет, является ли день воскресеньем*/

BEGIN'В воскресение нельзя принимать книги'TRANSACTION

IF UPDATE (дата_выдачи)                               /*Проверяет, какое поле обновляется*/

AND datename (dw, GETDATE()) in ('Sunday')         /*Проверяет, является ли день воскресеньем*/

BEGIN'В воскресение нельзя принимать книги'TRANSACTION

/* datename (dw, GETDATE()) - GETDATE() получает текущую дату, datename (dw,<дата>) получает название дня недели*/

7. Триггер, который записывает при удалении записей из таблицы «Сотрудники_библиотеки» в отдельную таблицу информацию о дате удаления, пользователе,

Перед созданием такого триггера необходимо создать таблицу DeletedSotrudLibrary, куда будет производится запись:

CREATE TABLE DeletedSotrudLibrary (

[Табельный_номер] [int] NOT NULL, /*объявляем поля таблицы*/

[имя] [varchar] (25) NULL,

[фамилия] [varchar] (25) NULL,

[отчество] [varchar] (75) NULL,

[дата_рождения] [datetime] NULL,

[должность] [varchar] (35) NULL,

[номер_отдела] [int] NOT NULL,

[Имя_пользователя] [varchar] (50) NULL,

[Дата_удаления] [datetime] NULL

) ON [PRIMARY]

Триггер:

CREATE TRIGGER deletesotrud Сотрудники_библиотеки        /*Связываем с таблицей*/                  

FOR DELETE

AS

INSERT INTO DeletedSotrudLibrary      /*Указываем таблицу, куда будет производиться запись*/      

(Табельный_номер, имя, фамилия, отчество, дата_рождения, /*Пречисляем поля таблицы*/должность, номер_отдела, Имя_пользователя, Дата_удаления)

SELECT                                                                       /*Причисляем вносимые значения*/

Табельный_номер, имя, фамилия, отчество, дата_рождения, должность, номер_отдела,_USER,         getdate()                                           deleted       /*deleted - временная таблица, куда заносятся удаляемые данные*/

8. Триггер, который записывает при добавлении записей в таблицы «Преподаватели» в отдельную таблицу информацию о дате удаления, пользователе.

Перед созданием такого триггера необходимо создать таблицу InsertedItemPrepdavateli, куда будет производится запись

CREATE TABLE InsertedItemPrepdavateli

(

[Читательский_номер] [int] NOT NULL, /*объявляем поля таблицы*/

[имя] [varchar] (25) NULL,

[отчество] [varchar] (75) NULL,

[фамилия] [varchar] (25) NULL,

[должность] [varchar] (35) NULL,

[Имя_пользователя] [varchar] (50) NULL,

[Дата_удаления] [datetime] NULL

) ON [PRIMARY]

Триггер:

CREATE TRIGGER infoInsertPredПреподавателиINSERTINTO InsertedItemPrepdavateli

(Читательский_номер, имя, отчество, фамилия, должность, Имя_пользователя, Дата_удаления)Читательский_номер, имя, отчество, фамилия, должность,_USER, getdate()inserted

9. Триггер, запрещающий ввод значения в поле «год_поступления», если оно превышает номер текущего года.

CREATE TRIGGER proverka_Studentov ON Студенты FOR INSERT

DECLARE @@t int                                  /*Объявляем переменную*/@@t=5                                              /*Присваиваем ей значение*/

IF NOT EXISTS (SELECT * FROM Студенты, inserted

WHERE Студенты.год_поступления = inserted.год_поступления)

Set @@t=0EXISTS (SELECT * FROM Студенты, inserted inserted.год_поступления>YEAR (GETDATE()))     /*Проверяем, больше ли значения вводимого года, чем у текущего*/

Set @@t=0                           /*Если да, то меняем значение переменной*/@@t=0                             /*если f=0, значит были ошибки*/

BEGIN«Неверно введен год поступления»              /*выдача сообщения о неудаче операции*/

ROLLBACK TRANSACTION                /*откат (отмена) транзакции*/

END

10. Триггер, запрещающий обновление значения в поле «год_отчисления», если оно превышает номер текущего года.

CREATE TRIGGER proverka_otchislenia_StudentovСтудентыUPDATE@@t int                              /*Объявляем переменную*/

Set @@t=5                                      /*Присваиваем ей значение*/

IF NOT EXISTS (SELECT * FROM Студенты, inserted

WHERE Студенты.год_окончания = inserted.год_окончания)

Set @@t=0EXISTS (SELECT * FROM Студенты, inserted inserted.год_окончания>YEAR (GETDATE()))        /*Проверяем, больше ли значения вводимого года, чем у текущего*/

Set @@t=0                           /*Меняем значение переменной*/@@t=0                          /*если f=0, значит были ошибки*/«Неверно введен год отчисления»           /*выдача сообщения о неудаче операции*/TRANSACTION            /*откат (отмена) транзакции*/

3.4 T-SQL-определения хранимых процедур

. Список выдач книг за текущий день.

CREATE PROCEDURE CpicokVidach/*Перечисляем поля, которые будут выведены в результате запроса */

Пользование_библиотекой2. Табельный_номер, COUNT (Пользование_библиотекой2. Дата_выдачи)  /*указываем имя таблицы из которых выбираются записи*/

Пользование_библиотекой2/*задаем условие отбора*/

Пользование_библиотекой2. Дата_выдачи=(SELECT GETDATE())BY /*производится группировка по указанному полю*/

Табельный_номер

/*SELECT GETDATE() позволяет получить текущую дату (год, месяц, число)(<поле>) возвращает количество записей какого-либо поля*/

2. Количество экземпляров какой-либо книги.

CREATE PROCEDURE KolExzemplarov

/*Объявляем необходимые переменные*/

@ISBN varchar(20)

AS

/* Следующая конструкция проверяет, существуют ли записи в таблице «Книги» с заданным ISBN*/

IF not EXISTS (SELECT * FROM Книга WHERE ISBN = @ISBN) 0 /*Вызывает конец процедуры KolExzemplarov */

SELECT Экземпляр.ISBN

INTO TEMP1 /*Сохраняет выбранные поля во временной таблице Temp1*/

FROM Экземпляр

WHERE ISBN = @ISBN

SELECT COUNT(ISBN) /*Count подсчитывает количество неповторяющихся записей поля ISBN*/

FROM TEMP1

3. Список книг, которыми пользовался какой-либо студент

CREATE PROCEDURE CpicokKnigCtudenta

@Chit_nom int    /*Объявляем необходимые переменные*/

AS SELECT Студенты. Имя, Студенты. Фамилия, Пользование_библиотекой2. Шифр, Книга. Автор, Книга. Название

FROM /*указываем имена таблиц, из которых выбираются записи*/

Книга, Экземпляр, Студенты, Пользование_библиотекой2

WHERE (Студенты. Читательский_номер = Пользование_библиотекой2. Читательский_номер) AND (Экземпляр. Шифр = Пользование_библиотекой2. Шифр) AND (Экземпляр.ISBN =Книга.ISBN)

/* AND позволяет задать в операторе WHERE несколько условий, которые должны выполняться одновременно*/

4. Удаление из таблицы «Студенты». Допустимо, если в таблице «Пользование библиотекой2» нет ссылающихся записей.

CREATE PROCEDURE DeleteStudent

@Chit_nom int             /*Объявляем необходимые переменные*/

AS             /*Проверяем, если ссылающиеся записи, если записей нет, разрешается удаление.*/

IF not EXISTS (SELECT * FROM Пользование_библиотекой2 WHERE Читательский_номер=@Chit_nom)        /*Оператор удаления*/

FROM Студенты         /*Имя таблицы, откуда нужно удалить*/

WHERE /*Условие удаления - удаляем строку, для которой значение поля Читательский_номер совпадает с нужным*/

Читательский_номер=@Chit_nom

5. Вставка в таблицу «Заказы». Разрешена, если в таблицах «Книга» и «Преподаватели» есть записи, на которые будет ссылаться новая запись.

PROCEDURE NewZakaz

@Kolvo int,                            /*Объявляем необходимые переменные*/

@data_zakaza datetime,

@Chit_nomer int,

@ISBN varchar(20)      /*Проверяем, есть ли запись в таблице «Заказы» с такими же значениями ключевых полей, как у новой записи*/

IF EXISTS (SELECT * FROM Заказы WHERE ISBN = @ISBN AND Читательский_номер=@Chit_nomer) 0 /*Если есть, завершаем выполнение процедуры*/

IF EXISTS (SELECT * FROM Преподаватели WHERE Читательский_номер = @Chit_nomer)

/*Проверили, есть ли в «Преподаватели» соответствующая запись*/

IF EXISTS (SELECT * FROM Книга WHERE ISBN = @ISBN)

/*Проверили, есть ли в «Книга» соответствующая запись*/

INSERT INTO Заказы /*Указываем таблицу, куда вставляем запись*/

VALUES (@Kolvo,@data_zakaza,@Chit_nomer, @ISBN)          /*Указываем какие значения*/

6. Обновление таблицы «Студенты». Изменение фамилии студента.

CREATE PROCEDURE UpdateStudent

@Chit_nom int,                                        /*Объявляем необходимые переменные*/

@Fam varchar(20)

AS

IF EXISTS (SELECT * FROM Студенты                  /*Проверяем, существуют ли студенты,*/

WHERE Читательский_номер = @Chit_nom)          /*читательский номер которых равен искомому*/

UPDATE Студенты                                          /*Если такие есть обновляем «Студенты»

SET Фамилия=@Fam                              /*полю фамилия присваиваем новое значение*/Читательский_номер = @Chit_nom /*если читательский номер записи равен искомому*/

7. Вставка в таблицу «Пользование библиотекой2». Разрешается, если есть в таблицах «Студенты», «Сотрудники_библиотеки» и «Экземпляр» соответствующие записи.

ALTER PROCEDURE NewPolzovanieStydentov

@Chit_nomer int,                                     /*Объявляем необходимые переменные*/

@data_vidachi datetime,

@data_priema datetime,

@tab_nomer int,

@Shifr varchar(20)

IF EXISTS (SELECT * FROM Пользование_библиотекой2 /*Проверяем, нет ли уже в таблице */

WHERE Шифр = @Shifr AND                         /*записи с таким же значением первичного ключа*/

Читательский_номер=@Chit_nomer)

RETURN 0                                                        /*если есть, завершается процедура*/

IF EXISTS (SELECT * FROM Студенты                  /*проверяем наличие соответствующей записи в*/

WHERE Читательский_номер = @Chit_nomer)                 /*таблице «Студенты»*/

IF EXISTS (SELECT * FROM Экземпляр                 /*проверяем наличие соответствующей записи в*/

WHERE Шифр = @Shifr)                                           /*таблице «Экземпляр»*/

IF EXISTS (SELECT * FROM Сотрудники_библиотеки /*проверяем наличие соответствующей */

WHERE табельный_номер = @tab_nomer)     /* записи в таблице «Сотрудники_библиотеки»*/                                                      /*если условия выполняются, добавляем*/

INTO Пользование_библиотекой2                  /*в таблицу новые значения*/

VALUES (@Chit_nomer,@data_vidachi,@data_priema,@tab_nomer,@Shifr)

8. Вставка в таблицу «Сотрудники_библиотеки». Проверяется, наличие соответствующей записи в поле номер-отдела в таблице «Отделы».

CREATE PROCEDURE NewSotrudnik

@Tab_nom int,                                /*Объявляем необходимые переменные*/

@Fam varchar(20),

@Name varchar(20),

@Sec_name varchar(20),

@data_rogd datetime,

@Dolgn varchar(20),

@Nom_otd int

AS

IF EXISTS (SELECT * FROM Сотрудники_библиотеки            /*Проверяем, нет ли уже в таблице */

WHERE Табельный_номер = @Tab_nom)      /*записи с таким же значением первичного ключа*/

RETURN 0                                                                           /*если есть, завершается процедура*/

IF EXISTS (SELECT * FROM Отделы             /*Проверяем, есть ли уже в таблице «Отделы» */

WHERE Номер_отдела = @Nom_otd)            /*записи с таким же значением поля номер_отдела*/                                                          /*если условие выполняется, добавляем*/

INTO Сотрудники_библиотеки                                                   /*в таблицу новые значения*/

VALUES (@Tab_nom,@Fam, @Name, @Sec_name, @data_rogd, @Dolgn, @Nom_otd)

9. Сколько существует должностей в библиотеке.

CREATE PROCEDURE KolDolgnSELECT COUNT (DISTINCT Сотрудники_библиотеки. должность) Сотрудники_библиотеки        /*COUNT (DISTINCT <поле>) подсчитывает количество разноименных значений какого-либо поля в таблице*/

10. Обновление таблицы «Отделы». Изменился начальник отдела.

ALTER PROCEDURE UpdateOtdel

@Nom_otdela int,

@Fam_New_Nach_otd varchar(20),

@Tab_Nom_New_Nach_otd int not EXISTS (SELECT * FROM Сотрудники_библиотеки     /*Условие проверяет, есть ли в */

WHERE табельный_номер = @Tab_Nom_New_Nach_otd        /* библиотеке сотрудник с искомыми*/

AND фамилия=@Fam_New_Nach_otd)                                       /*фамилией и табельным номером*/

RETURN 0                                                                           /*если нет, завершается процедура*/

IF EXISTS (SELECT * FROM Отделы                      /*Условие проверяет, есть ли в библиотеке*/

WHERE Номер_отдела = @Nom_otdela)                                                       /*искомый номер отдела*/

UPDATE Отделы

SET фамилия_начальника_отдела=@Fam_New_Nach_otd       /*меняем значение поля «фамилия начальника отдела» на новое*/

UPDATE Отделы

SET табельный_номер_начальника=@Tab_Nom_New_Nach_otd /*меняем значение поля «табельный номер начальника отдела» на новое*/Номер_отдела = @Nom_otdela                    /*меняем только для записи, у которой значение «номер_отдела» равно искомому*/

11. Вставка в таблицу «Списание экземпляров»

CREATE PROCEDURE NewCpicanExzemplar

@Prichina varchar(20),

@Nom_act int,

@tab_nomer int,

@Shifr varchar(20)EXISTS (SELECT * FROM Списанные_книги WHERE Шифр = @Shifr)0EXISTS (SELECT * FROM Экземпляр WHERE Шифр = @Shifr)EXISTS (SELECT * FROM Сотрудники_библиотеки WHERE табельный_номер = @tab_nomer) INTO Списанные_книги VALUES (@Prichina, @Nom_act,@tab_nomer,@Shifr)

12. Вставка в таблицу «Пользование библиотекой2»

CREATE PROCEDURE NewPolzovanieBibliotekarej

@Tab_nomer int,

@data_vidachi datetime,

@data_priema datetime,

@Shifr varchar(20)EXISTS (SELECT * FROM Пользование_библиотекой1 WHERE Шифр = @Shifr AND Табельный_номер=@Tab_nomer)0EXISTS (SELECT * FROM Экземпляр WHERE Шифр = @Shifr)EXISTS (SELECT * FROM Сотрудники_библиотеки WHERE табельный_номер = @tab_nomer) INTO Пользование_библиотекой1 VALUES (@tab_nomer, @data_vidachi, @data_priema, @Shifr)

13. Вставка в таблицу «Экземпляры»

CREATE PROCEDURE NewExzemplar

@ISBN varchar(20),

@otm_o_cpicanii varchar(20),

@otm_o_zamene varchar(20),

@predmet varchar(20),

@Nom_otd int,

@Shifr varchar(20)EXISTS (SELECT * FROM Экземпляр WHERE Шифр = @Shifr)0EXISTS (SELECT * FROM Отделы WHERE Номер_отдела = @Nom_otd) AND EXISTS (SELECT * FROM Книга WHERE ISBN = @ISBN)INTO Экземпляр VALUES (@ISBN, @otm_o_cpicanii, @otm_o_zamene, @predmet, @Nom_otd, @Shifr)

14. Обновление таблицы «Сотрудники_библиотеки»

CREATE PROCEDURE UpdateCotpyd

@Tab_nom int,

@Fam varchar(20)EXISTS (SELECT * FROM Сотрудники_библиотеки WHERE табельный_номер = @Tab_nom)Сотрудники_библиотеки SET фамилия=@Fam табельный_номер = @Tab_nom

15. Вставка в таблицу «Сотрудники_библиотеки»

PROCEDURE NewSotrudnik

@Tab_nom int,

@Fam varchar(20),

@Name varchar(20),

@Sec_name varchar(20),

@data_rogd datetime,

@Dolgn varchar(20),

@Nom_otd intEXISTS (SELECT * FROM Сотрудники_библиотеки WHERE Табельный_номер = @Tab_nom)0EXISTS (SELECT * FROM Отделы WHERE Номер_отдела = @Nom_otd)

INSERT INTO Сотрудники_библиотеки VALUES (@Tab_nom,@Fam, @Name, @Sec_name, @data_rogd, @Dolgn, @Nom_otd)

3.5 T-SQL-определения курсоров


1. Курсор для просмотра информации о студентах и выдача информации об их количестве.

DECLARE curs1 CURSOR

GLOBAL             /*Создается глобальный курсор, который будет существовать до закрытия данного соединения*/

SCROLL             /*Создает прокручиваемый курсор*/

KEYSET             /*Будет создан ключевой курсор*/

TYPE_WARNING

FOR

SELECT              /*Какие поля будут показаны в курсоре*/

Студенты. Читательский_номер, Студенты. Имя, Студенты. Фамилия, Студенты. Отчество, Студенты.год_поступления,

Студенты.год_окончания, Студенты.факультет, Студенты.специальность, Студенты.форма_обучения, Студенты.номер_приказа

FROM Студенты                  /*Из какой таблицы выбираются данные*/

FOR READ ONLY                /*Только для чтения*/

open global curs1                   /*открываем глобальный курсор*/

DECLARE                   /*объявляем переменную*/

@@Counter int

SET @@Counter =@@CURSOR_ROWS                  /*присваиваем ей число рядов курсора*/

Select @@Counter                                             /*выводим результат на экран*/

CLOSE curs1                                                     /*закрываем курсор*/

DEALLOCATE curs1                               /*освобождаем курсор*/

2. Курсор для просмотра заказов и подсчета общего количества заказанных книг.

DECLARE curs2 CURSORSCROLL KEYSET

TYPE_WARNING       /*Сервер будет информировать пользователя о неявном изменении типа курсора, если он несовместим с запросом SELECT*/

FOR                     /*Что будет показано в курсоре*/

Преподаватели. Фамилия, Преподаватели. Имя, Преподаватели. Отчество, Книга. Автор, Книга. Название, Заказы. Количество, Книга. ЦенаКнига INNER JOIN (Преподаватели INNER JOIN Заказы ON Преподаватели. Читательский_номер = Заказы. Читательский_номер)

ON Книга.ISBN = Заказы.ISBN

FOR UPDATE    /*Курсор для обновления*/

open global curs2

@@Fam varchar(20),

@@Name varchar(20),

@@Sec_name varchar(20),

@@Autor varchar(20),

@@Nazv varchar(20),

@@Kolvo int,

@@Cena int,

@@Counter int,

@@Var1 int@@Counter = 1 @@Var1 = 0

WHILE @@COUNTER< @@CURSOR_ROWS /*Пока счетчик просмотренных строк меньше их общего числа*/

BEGIN

FETCH curs2 INTO @@Fam,@@Name,@@Sec_name,@@Autor,@@Nazv,@@Kolvo          /*Просматриваем строки и значения*/

SET @@Counter =@@Counter +1                   /*Меняем значение счетчика при переходе к другой строке*/

SET @@Var1=@@Var1+@@Kolvo *@@Cena        /*Суммируем стоимости заказанных книг*/

END

Select @@Var1 /*выводим сумму на экран*/

CLOSE curs2curs2

3. Удаление преподавателя.

DECLARE curs5 CURSORSCROLL KEYSET SELECT          Преподаватели.читательский_номер,

Преподаватели. Имя, Преподаватели. Отчество, Преподаватели. Фамилия, Преподаватели.должность

FROM       Преподаватели

FOR UPDATE

open curs5

@@Chit_nom int,

@@Name varchar(20),

@@Sec_name varchar(20),

@@Fam varchar(20),

@@Dolgn varchar(20),

@@Counter int@@Counter = 0@@COUNTER< @@CURSOR_ROWScurs5@@Chit_nom=NULL@@Name=NULL@@Sec_name=NULL@@Fam=NULL@@Dolgn=NULLCURRENT OF curs5@@Counter =@@Counter +1curs5

3.      Пользование студентов

DECLARE curs1 CURSORSCROLL KEYSET TYPE_WARNING

SELECT

Студенты. Читательский_номер, Студенты. Имя, Студенты. Фамилия, Студенты. Отчество, Студенты.год_поступления,

Студенты.год_окончания, Студенты.факультет, Студенты.специальность, Студенты.форма_обучения, Студенты.номер_приказа

FROM СтудентыREAD ONLYglobal curs1

@@Counter int@@Counter =@@CURSOR_ROWS@@Countercurs1curs1 

5. Информация о студентах и их количестве

DECLARE curs1 CURSORSCROLL KEYSET TYPE_WARNING

FOR

Студенты. Читательский_номер, Студенты. Имя, Студенты. Фамилия, Студенты. Отчество, Студенты.год_поступления,

Студенты.год_окончания, Студенты.факультет, Студенты.специальность, Студенты.форма_обучения, Студенты.номер_приказа

FROM СтудентыREAD ONLYglobal curs1

@@Counter int@@Counter =@@CURSOR_ROWS@@Countercurs1curs1 

 

3.6 Описание клиентских приложений

При разработке клиентского приложения были созданы следующие формы.

При запуске приложения появляется форма «Регистрация» (рис. 13). на форме присутствует кнопк «Вход», нажатие на которую открывает другие формы. Код кнопки:Sub Вход_Click()stDocName As StringstLinkCriteria As String(Группа26. Value = 1 And Поле9. Value = «Директор») Then. OpenForm «Директор»

Поле9. Value = «»(Группа26. Value = 2 And Поле9. Value = «Библиотекарь») Then. OpenForm «Выбор»

Поле9. Value = «»(Группа26. Value = 3) Then. OpenForm «Поиск»

Поле9. Value = «»

Else: MsgBox «Неправильный пароль»IfSub

Рисунок 13 - Форма «Регистрация»

Для пользователя «Директор», открывается одноименная форма - рисунок 14. На ней присутствуют следующие кнопки: «Работа с сотрудниками библиотеки», «Информация о посетителях библиотеки», «Отчеты о работе библиотеки».

Рисунок 14 - Форма «Директор»

После нажатия на кнопку «Работа с сотрудниками библиотеки» появится форма «Работа с сотрудниками библиотеки» - рисунок 15. На форме присуетсвуют кнопки «Уволить сотрудника», «Информация о сотруднике», «Принять на работу сотрудника».

При нажатии кнопки «Уволить сотрудника», будет уволен выбранный сотрудник. Код обработки нажатия кнопки:

Private Sub Кнопка5_Click()

Dim stDocName As String

Dim dbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Stringstrdate As Stringdbs = CurrentDb

ПолеСоСписком³.SetFocus= ПолеСоСписком³.Text= «DELETE FROM dbo_Сотрудники_библиотеки WHERE табельный_номер=» + strdate. QueryDefs. Delete («my»)qdf = dbs. CreateQueryDef («my», strSQL)dbs = Nothing

При нажатии кнопки «Информация о сотруднике» - будет показан отчет, содеожащий информацию о библиотекаре. Код обработки нажатия кнопки:

Private Sub Кнопка6_Click()

Dim stDocName As String

Dim dbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Stringstrdate As Stringdbs = CurrentDb

ПолеСоСписком³.SetFocus= ПолеСоСписком³.Text = «SELECT dbo_Сотрудники_библиотеки. табельный_номер, dbo_Сотрудники_библиотеки. имя, dbo_Сотрудники_библиотеки. фамилия, dbo_Сотрудники_библиотеки. отчество, dbo_Сотрудники_библиотеки. дата_рождения, dbo_Сотрудники_библиотеки. должность, dbo_Сотрудники_библиотеки. Номер_отдела FROM dbo_Сотрудники_библиотеки WHERE табельный_номер=» + strdate

DoCmd. OpenReport «my1», acPreview

Если нажать на кнопку «Принять на работу сотрудника», то откроется форма «dbo_Cотрудники_библиотеки», на которой необходимо будет внести информацию о новом сотруднике.

Если же на форме «Директор» нажать кнопку «Информация о посетителях библиотеки, то появится форма «Посетители» - рисунок 17, а если кнопку «Отчеты о работе библиотеки», то форма «Информация» - рисунок 18.

На форме «Посетители» располагается кнопка «Получить информацию». Она предназначена для вызова хранимой процедуры, которая формирует отчет, содержащий информацию о студентах или преподавателях. Код обработки нажатия кнопки:

Private Sub Кнопка11_Click()

Dim stDocName As String

Dim dbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Integer, strdate As Stringdbs = CurrentDbГруппа0. Value = 1 Then

ПолеСоСписком16. SetFocus= ПолеСоСписком16. Text= «SELECT dbo_Студенты. Читательский_номер, dbo_Студенты. Фамилия, dbo_Студенты. Имя, dbo_Студенты. Отчество, dbo_Студенты.год_поступления, dbo_Студенты.год_окончания, dbo_Студенты.факультет, dbo_Студенты.специальность, dbo_Студенты.факультет, dbo_Студенты.специальность, dbo_Студенты.форма_обучения, dbo_Студенты.номер_приказа FROM dbo_Студенты WHERE dbo_Студенты. Читательский_номер=» + strdate

dbs. QueryDefs. Delete («999»)

Set qdf = dbs. CreateQueryDef («999», strSQL)

Set dbs = Nothing. OpenReport «999», acPreviewIfГруппа0. Value = 2 Then ПолеСоСписком18. SetFocus= ПолеСоСписком18. Text= «SELECT dbo_Преподаватели. Читательский_номер, dbo_Преподаватели. Имя, dbo_Преподаватели. Отчество, dbo_Преподаватели. Фамилия, dbo_Преподаватели. Должность FROM dbo_Преподаватели WHERE dbo_Преподаватели. Читательский_номер=» + strdate

dbs. QueryDefs. Delete («333»)

Set qdf = dbs. CreateQueryDef («333», strSQL)

Set dbs = Nothing. OpenReport «333», acPreview

End If

End Sub

Если пользователь зарегистрировался как «Библиотекарь», то после формы «Регистрация» следующей появится форма «Выбор».

При нажатии на кнопку «Работа с фондом» появится форма «Фонд», на которой также после нажатия на соответствующую кнопку появятся следующие пользовательские формы:

«dbo_Книга» при нажатии на кнопку «Обработка новых книг»;

«Экземпляр» при нажатии на кнопку «Обработка новых экземпляров»;

«Списанные_книги» при нажатии на кнопку «Списание книги»;

«Замена_экземпляров» при нажатии на кнопку «Замена книг»;

На форме «dbo_Книга» присутствуют кнопки с изображением стрелок, которые служат для добавления новых записей в таблицу «Книга», а также кнопка «Добавить новый экземпляр», которая открывает форму «Экземпляр».

На форме «Экземпляр» расположены кнопки с изображением стрелок, которые служат для добавления новых записей в таблицу «Экземпляр», кнопка «Добавить новую книгу» для перехода на форму «dbo_Книга», и кнопка «Информация об экземплярах книг», нажатие на которую выводит список книг библиотеки.

На форме «dbo_списанные_книги» располагается кнопка с изображением стрелки, которая вызывает процедуру добавления записей в таблицу «Списанные книги», и кнопка «Информация о списанных книгах». Она предназначена для вызова хранимой процедуры, которая формирует отчет, содержащий информацию о книгах списанных по протоколу списания, номер которого вводится в поле рядом с кнопкой. Код обработки нажатия кнопки «Информация о списанных книгах»:

Private Sub Кнопка13_Click()

Dim stDocName As Stringdbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Integerstrdate As Stringdbs = CurrentDb

Поле23. SetFocus= Поле23. Text= «SELECT dbo_Книга. Автор, dbo_Книга. Название, dbo_Списанные_книги. номер_протокола_списания, dbo_Сотрудники_библиотеки. фамилия, dbo_Списанные_книги. дата_списания FROM dbo_Сотрудники_библиотеки INNER JOIN ((dbo_Книга INNER JOIN dbo_Экземпляр ON dbo_Книга.ISBN = dbo_Экземпляр.ISBN) INNER JOIN dbo_Списанные_книги ON dbo_Экземпляр. Шифр = dbo_Списанные_книги. Шифр) ON dbo_Сотрудники_библиотеки. табельный_номер = dbo_Списанные_книги. Табельный_номер_списавшего WHERE dbo_Списанные_книги. номер_протокола_списания=» + strdate

dbs. QueryDefs. Delete («списание»)qdf = dbs. CreateQueryDef («списание», strSQL). OpenReport «списание», acPreview dbs = Nothing

End Sub

На форме «Замена_экземпляров» располагается кнопка с изображением стрелки, которая вызывает процедуру добавления записей в таблицу «Замена_экземпляров», и кнопка «Просмотр». Она предназначена для вызова хранимой процедуры, которая формирует отчет, содержащий информацию о книгах, которые заменили по акту замены. Номер акта замены вводится в поле рядом с кнопкой. Код обработки нажатия кнопки «Просмотр»:

Private Sub Просмотр _Click()stDocName As Stringdbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Integerstrdate As Stringdbs = CurrentDb

Поле13. SetFocus= Поле13. Text= «SELECT dbo_Книга. Автор, dbo_Книга. Название, dbo_Экземпляр. Шифр, dbo_Замена_экземпляров. Номер_акта_замены FROM (dbo_Экземпляр INNER JOIN dbo_Книга ON dbo_Экземпляр.ISBN = dbo_Книга.ISBN) INNER JOIN dbo_Замена_экземпляров ON dbo_Экземпляр. Шифр = dbo_Замена_экземпляров. Шифр WHERE (dbo_Замена_экземпляров. Номер_акта_замены)=» + strdate

dbs. QueryDefs. Delete («замена3»)qdf = dbs. CreateQueryDef («замена3», strSQL). OpenReport «замена3», acPreview dbs = NothingSub

Если на форма «Выбор» была нажата кнопка «Работа с посетителями», то появится следующей форма «Работа с посетителями».

После нажатия на соответствующую кнопку на форме «Работа с посетителями» появятся следующие пользовательские формы:

«Студенты» при нажатии на «Записать читателя в бибилитеку»;

«dbo_Пользование_библиотекой2» при нажатии на «Выдать книги»;

«Принять книги» при нажатии на «Принять книги».

«dbo_Платные услуги» при нажатии на «Платные услуги».

На форме «Студенты» располагается кнопка с изображением стрелки, которая вызывает стандартную процедуру добавления записей в таблицу «Студенты».

На форме «dbo_Пользование_библиотекой2» располагается кнопка с изображением стрелки, которая вызывает стандартную процедуру добавления записей в таблицу «dbo_Пользование_библиотекой2».

На форме «Принять книги» располагается кнопка с изображением стрелки, которая вызывает стандартную процедуру добавления записей в таблицу «dbo_Пользование_библиотекой2».

На форме «dbo_Платные_услуги» располагается кнопка с изображением стрелки, которая вызывает процедуру добавления записей в таблицу «Платные_услуги», и две кнопки «Показать отчет». Они предназначена для вызова хранимой процедуры, которая формирует отчет, содержащий информацию о платных услугах библиотеки, которые были оказаны в отчетном месяце или году. Номер акта замены вводится в поле рядом с кнопкой. Код обработки нажатия кнопки «Показать_отчет» (за год):

Private Sub Кнопка53_Click()stDocName As Stringdbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Integer, strdate As Stringdbs = CurrentDb

Поле29. SetFocus= Поле29. Text

'strdate = «» + strdat + «"»= «SELECT dbo_Платные_услуги. табельный_номер, dbo_Платные_услуги. Сумма, dbo_Платные_услуги. читательский_номер, dbo_Платные_услуги. Дата_услуги FROM dbo_Платные_услуги WHERE Year (dbo_Платные_услуги. Дата_услуги)=» + strdate. QueryDefs. Delete («услуги»)qdf = dbs. CreateQueryDef («услуги», strSQL)

DoCmd. OpenReport «услуги», acPreview

Set dbs = NothingSub

За месяц:Sub Кнопка27_Click()stDocName As Stringdbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Integerstrdate As Stringdbs = CurrentDb

ПолеСоСписком²5. SetFocus= ПолеСоСписком²5. Text

strSQL = «SELECT dbo_Платные_услуги. табельный_номер, dbo_Платные_услуги. Сумма, dbo_Платные_услуги. читательский_номер, dbo_Платные_услуги. Дата_услуги FROM dbo_Платные_услуги WHERE Month (dbo_Платные_услуги. Дата_услуги)=» + strdate

dbs. QueryDefs. Delete («услуги»)

Set qdf = dbs. CreateQueryDef («услуги», strSQL)

DoCmd. OpenReport «услуги», acPreviewdbs = Nothing

End Sub

Форма «Поиск» является общей для пользователя «Библиотекарь» и «Посетитель» и появляется соответственно либо при нажатии на форме «Выбор» кнопки «Поиск литературы» либо при входе пользователя с формы «Регтстрация». Если на ней выбрать кнопку «Поиск книг», то появится форма «Форма_поиска» (рисунок 32), а если кнопку - «Поиск перидических изданий», то форма «Поиск периодики» (рисунок 33).

На форме «Форма_поиска» располагается кнопка «Список книг», нажатие на которую показывает отчет, содержащий список всех книг библиотеки», и кнопка «Найти». Она предназначена для вызова хранимой процедуры, которая формирует отчет, содержащий информацию о книгах, которые удовлетворяют критериям поиска. Критерий поиска задается пользователем. Код обработки нажатия кнопки «Найти»:

Private Sub Кнопка13_Click()

Dim stDocName As Stringdbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Stringstrdate As Stringdbs = CurrentDb

ПолеСоСписком11. SetFocus= ПолеСоСписком11. Text= «'» + strdat + «'»= «SELECT dbo_Книга.ISBN, dbo_Книга. Автор, dbo_Книга. Название, dbo_Книга. Год_издания, dbo_Книга. Издательство, dbo_Книга. Кодичество_страниц, dbo_Книга. Цена, dbo_Экземпляр. Шифр, dbo_Экземпляр. Отметка_о_замене, dbo_Экземпляр. Отметка_о_списании FROM dbo_Книга INNER JOIN dbo_Экземпляр ON dbo_Книга.ISBN = dbo_Экземпляр.ISBN WHERE (dbo_Экземпляр. Шифр)=» + strdate. QueryDefs. Delete («поиск книги»)qdf = dbs. CreateQueryDef («поиск книги», strSQL)

DoCmd. OpenReport «поиск книги», acPreviewdbs = Nothing

End Sub

На форме «Поиск периодики» располагается кнопка «Список периодических изданий», нажатие на которую показывает отчет, содержащий список всех периодических изданий библиотеки», и кнопки «Найти».

Кнопка «Найти» в разделе «Поиск изданий» предназначена для вызова хранимой процедуры, которая формирует отчет, содержащий информацию о периодических изданиях, которые удовлетворяют критериям поиска. Критерий поиска задается пользователем. Код обработки нажатия кнопки «Найти»:

Private Sub Кнопка10_Click()

Dim stDocName As Stringdbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Stringstrdate As Stringdbs = CurrentDb

ПолеСоСписком8. SetFocus= ПолеСоСписком8. Text= «'» + strdat + «'»= «SELECT dbo_Периодические_издания. Шифр_периодики, dbo_Периодические_издания. Название, dbo_Периодические_издания. Дата_издания, dbo_Периодические_издания. Номер_отдела FROM dbo_Периодические_издания WHERE (dbo_Периодические_издания. Шифр_периодики)=» + strdate

dbs. QueryDefs. Delete («шифр поиск период»)

Set qdf = dbs. CreateQueryDef («шифр поиск период», strSQL)

DoCmd. OpenReport «шифр поиск период», acPreview

Set dbs = NothingSub

Кнопка «Найти» в разделе «Поиск статей» предназначена для вызова хранимой процедуры, которая формирует отчет, содержащий информацию о статьях, которые удовлетворяют критериям поиска. Критерий поиска задается пользователем. Код обработки нажатия кнопки «Найти»:

Private Sub Кнопка29_Click()

Dim stDocName As Stringdbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Stringstrdate As Stringdbs = CurrentDb

ПолеСоСписком²1. SetFocus= ПолеСоСписком²1. Text= «'» + strdat + «'»= ChrW(100) & ChrW(98) & ChrW(111) & ChrW(95) & ChrW(1055) & ChrW(1077) & ChrW(1088) & ChrW(1080) & ChrW(1086) & ChrW(1076) & ChrW(1080) & ChrW(1095) & ChrW(1077) & ChrW(1089) & ChrW(1082) & ChrW(1080) & ChrW(1077) & ChrW(95) & ChrW(1080) & ChrW(1079) & ChrW(1076) & ChrW(1072) & ChrW(1085) & ChrW(1080) & ChrW(1103) = «SELECT dbo_Периодические_издания. Шифр_периодики, dbo_Периодические_издания. Название, dbo_Периодические_издания. Дата_издания, dbo_Статьи. Номер_статьи, dbo_Статьи. Название, dbo_Статьи. Тема, dbo_Статьи. Предметная_область FROM dbo_Статьи INNER JOIN dbo_Периодические_издания ON dbo_Статьи. Шифр_периодики = dbo_Периодические_издания. Шифр_периодики WHERE dbo_Статьи. Номер_статьи=» + strdate

dbs. QueryDefs. Delete («Статьи»)

Set qdf = dbs. CreateQueryDef («Статьи», strSQL)

DoCmd. OpenReport «Статьи», acPreview

Set dbs = NothingSub

Кнопка «Найти» в разделе «Поиск по ключевым» предназначена для вызова хранимой процедуры, формирующей отчет о статьях, которые содержат указанные ключевые слова. Код обработки нажатия кнопки «Найти»:

Private Sub Кнопка38_Click()

Dim stDocName As String

Dim dbs As Database, qdf As QueryDef, strSQL As Stringstrdat As Stringstrdate As Stringdbs = CurrentDb

ПолеСоСписком²5. SetFocus= ПолеСоСписком²5. TextПереключатель36. Value = True Then= strdat +», %'»= «SELECT dbo_Периодические_издания. Шифр_периодики, dbo_Периодические_издания. Название, dbo_Периодические_издания. Дата_издания, dbo_Статьи. Номер_статьи, dbo_Статьи. Название, dbo_Статьи. Тема, dbo_Статьи. Предметная_область FROM dbo_Статьи INNER JOIN dbo_Периодические_издания ON dbo_Статьи. Шифр_периодики = dbo_Периодические_издания. Шифр_периодики WHERE dbo_Статьи. Тема LIKE '%» + strdate. QueryDefs. Delete («Статьи»)qdf = dbs. CreateQueryDef («Статьи», strSQL). OpenReport «Статьи», acPreviewdbs = Nothing= strdat + «%'»

strSQL = «SELECT dbo_Периодические_издания. Шифр_периодики, dbo_Периодические_издания. Название, dbo_Периодические_издания. Дата_издания, dbo_Статьи. Номер_статьи, dbo_Статьи. Название, dbo_Статьи. Тема, dbo_Статьи. Предметная_область FROM dbo_Статьи INNER JOIN dbo_Периодические_издания ON dbo_Статьи. Шифр_периодики = dbo_Периодические_издания. Шифр_периодики WHERE dbo_Статьи. Тема LIKE '%» + strdate. QueryDefs. Delete («Статьи»)qdf = dbs. CreateQueryDef («Статьи», strSQL). OpenReport «Статьи», acPreviewdbs = NothingIf_Кнопка38_Click:

End Sub

Последняя форма «dbo_Заказы» появляется при нажатии кнопки «Заказ литературы» на форме «Выбор». Кнопка с изображением стрелки на форме «dbo_Заказы» служит для добавления записей в таблицу «Заказы».

4. Проектирование системы безопасности. Управление авторизацией, управление ролями, управление разрешениями средствами Transact SQL

Система безопасности базы данных контролирует выполняемые действия и определяет информацию, доступную для просмотра и модификации. Надежная система безопасности гарантирует защиту данных независимо от того, как пользователи получают доступ к базе данных.

Чтобы пользовательское учетное имя получило доступ к БД, одного ввода имени пользователя и пароля недостаточно. Должно быть разрешение на исполнение SQL-выражений или на работу с объектами.

Назначение разрешений каждому пользователю в отдельности занимает много времени при сопровождении БД со средним и большим числом пользователей. Для облегчения операций по назначению разрешений пользователям SQL Server 2000 поддерживает роли SQL Server.

Роли создаются и сопровождаются в рамках SQL Server. Существует два типа ролей: стандартные и прикладные. Стандартным ролям (standard roles) назначаются привилегии, которые могут наследоваться пользователями, получающими членство в роли. Стандартные роли могут содержать все типы учетных имен: учетные записи пользователей и групп Windows, идентификаторы SQL Server и другие стандартные роли.

Для упрощения администрирования БД и самого сервера в SQL Server предусмотрен ряд стандартных предопределенных ролей. В основном их можно разделить на две категории: фиксированные роли на уровне сервера, или серверные роли (fixed server role), и фиксированные роли на уровне БД (fixed database role). Членство в фиксированных ролях на уровне сервера дает возможность администрирования сервера. Члены фиксированных ролей на уровне БД могут администрировать некоторые БД.

Прикладные роли разработаны для управления привилегиями пользователей, обращающихся к БД через некоторое приложение.

5. Прокомментированный скрипт создания базы данных

TABLE Заказы // Создание таблицы «Заказы»

(

Количество int NULL,

Дата_заказа datetime NULL,

Читательский_номер int NOT NULL,

ISBN varchar(20) NOT NULL

)TABLE Заказы // Изменение таблицы «Заказы»

ADD PRIMARY KEY (Читательский_номер, ISBN)

goTABLE Замена_экземпляров (

Номер_акта_замены int NULL,

Шифр varchar(20) NOT NULL

)

go

ALTER TABLE Замена_экземпляров // Изменение таблицы «Замена_экземпляров»

ADD PRIMARY KEY (Шифр)TABLE Книга ( // Создание таблицы «Книга»varchar(20) NOT NULL,

Автор varchar(20) NULL,

Название varchar(20) NULL,

Год_издания int NULL,

Издательство varchar(20) NULL,

Кодичество_страниц int NULL,

Цена int NULL

)

go

ALTER TABLE Книга // Изменение таблицы «Книга»

ADD PRIMARY KEY (ISBN)

go

CREATE TABLE Отделы ( // Создание таблицы «Отделы»

Номер_отдела int NOT NULL,

фамилия_начальника_отдела varchar(20) NULL,

Название_отдела varchar(20) NULL,

табельный_номер_начальника int NULL

)

go

ALTER TABLE Отделы // Изменение таблицы «Отделы»

ADD PRIMARY KEY (Номер_отдела)

goTABLE Периодические_издания ( // Создание таблицы «Периодические_издания»

Шифр_периодики varchar(20) NOT NULL,

Название varchar(20) NULL,

Дата_издания datetime NULL,

Номер_отдела int NULL

)TABLE Периодические_издания // Изменение таблицы «Периодические_издания»

ADD PRIMARY KEY (Шифр_периодики)

go

TABLE Пользование_библиотекой1 ( // Создание таблицы «Пользование_библиотекой1»

табельный_номер int NOT NULL,

Дата_выдачи datetime NULL,

Дата_приема char(18) NULL,

Шифр varchar(20) NOT NULL

)

go

ALTER TABLE Пользование_библиотекой1 // Изменение таблицы «Пользование_библиотекой1»PRIMARY KEY (табельный_номер, Шифр)TABLE Пользование_библиотекой2 ( // Создание таблицы «Пользование_библиотекой2»

Читательский_номер int NOT NULL,

Дата_выдачи datetime NULL,

Дата_приема datetime NULL,

Табельный_номер int NULL,

Шифр varchar(20) NOT NULL

)

go

ALTER TABLE Пользование_библиотекой2 // Изменение таблицы «Пользование_библиотекой2»

ADD PRIMARY KEY (Читательский_номер, Шифр)TABLE Пользование_библиотекой3 ( // Создание таблицы «Пользование_библиотекой3»

Читательский_номер int NOT NULL,

Дата_выдачи datetime NULL,

Дата_приема datetime NULL,

Табельный_номер int NULL,

Шифр varchar(20) NOT NULL

)

go

ALTER TABLE Пользование_библиотекой3 // Изменение таблицы «Пользование_библиотекой3

ADD PRIMARY KEY (Читательский_номер, Шифр)TABLE Преподаватели // Создание таблицы «Преподаватели»

(

Читательский_номер int NOT NULL,

Имя varchar(20) NULL,

Отчество varchar(20) NULL,

Фамилия varchar(20) NULL,

Должность varchar(20) NULL

)

go

ALTER TABLE Преподаватели // Изменение таблицы «Преподаватели»

ADD PRIMARY KEY (Читательский_номер)

go

CREATE TABLE Сотрудники_библиотеки ( // Создание таблицы «Сотрудники_библиотеки»

табельный_номер int NOT NULL,

имя varchar(20) NULL,

фамилия varchar(20) NULL,

отчество varchar(20) NULL,

дата_рождения datetime NULL,

должность varchar(20) NULL,

Номер_отдела int NOT NULL

)

go

ALTER TABLE Сотрудники_библиотеки // Изменение таблицы «Сотрудники_библиотеки»

ADD PRIMARY KEY (табельный_номер) TABLE Списанные_книги (/ /Создание таблицы «Списанные_книги»

//

причина_списания varchar(20) NULL,

номер_протокола_списания int NULL,

Табельный_номер_списавшего int NULL,

Шифр varchar(20) NOT NULL

)

go

ALTER TABLE Списанные_книги / /Изменение таблицы «Списанные_книги»

ADD PRIMARY KEY (Шифр)

go

CREATE TABLE Студенты (/ /Создание таблицы «Студенты»

Читательский_номер int NOT NULL,

Имя varchar(20) NULL,

Фамилия varchar(20) NULL,

Отчество varchar(20) NULL,

год_поступления int NULL,

год_окончания int NULL,

факультет varchar(20) NULL,

специальность varchar(20) NULL,

форма_обучения varchar(20) NULL,

номер_приказа int NULL

)

go

ALTER TABLE Студенты    / /Изменение таблицы «Студенты»PRIMARY KEY (Читательский_номер)

go

CREATE TABLE Экземпляр (/ /Создание таблицы «Экземпляр»

ISBN varchar(20) NOT NULL,

Отметка_о_списании varchar(20) NULL,

Отметка_о_замене varchar(20) NULL,

Предметная_область varchar(20) NULL,

Номер_отдела int NOT NULL,

Шифр varchar(20) NOT NULL

)

go

ALTER TABLE Экземпляр // Изменение таблицы «Экземпляр»

ADD PRIMARY KEY (Шифр)

go

ALTER TABLE Заказы // Изменение таблицы «Заказы»

ADD FOREIGN KEY (ISBN)КнигаDELETE NO ACTIONUPDATE NO ACTION

ALTER TABLE Заказы // Изменение таблицы «Заказы»

ADD FOREIGN KEY (Читательский_номер)

REFERENCES ПреподавателиDELETE NO ACTIONUPDATE NO ACTION

TABLE Замена_экземпляров

// Изменение таблицы «Замена_экземпляров»

ADD FOREIGN KEY (Шифр)

REFERENCES ЭкземплярDELETE NO ACTIONUPDATE NO ACTION

TABLE Периодические_издания

// Изменение таблицы «Периодические_издания»

ADD FOREIGN KEY (Номер_отдела)

REFERENCES Отделы

go

ALTER TABLE Пользование_библиотекой1

 // Изменение таблицы «Пользование_библиотекой1»

ADD FOREIGN KEY (Шифр)

REFERENCES ЭкземплярDELETE NO ACTIONUPDATE NO ACTION

TABLE Пользование_библиотекой1

// Изменение таблицы «Пользование_библиотекой1»FOREIGN KEY (табельный_номер)

REFERENCES Сотрудники_библиотекиDELETE NO ACTIONUPDATE NO ACTIONTABLE Пользование_библиотекой2

// Изменение таблицы «Пользование_библиотекой2»

ADD FOREIGN KEY (Шифр)

REFERENCES ЭкземплярDELETE NO ACTIONUPDATE NO ACTIONTABLE Пользование_библиотекой2

// Изменение таблицы «Пользование_библиотекой2»FOREIGN KEY (Читательский_номер)

REFERENCES СтудентыDELETE NO ACTIONUPDATE NO ACTION

TABLE Пользование_библиотекой3

// Изменение таблицы «Пользование_библиотекой3»FOREIGN KEY (Читательский_номер)

REFERENCES ПреподавателиDELETE NO ACTIONUPDATE NO ACTIONTABLE Пользование_библиотекой3

// Изменение таблицы «Пользование_библиотекой3»

ADD FOREIGN KEY (Шифр)

REFERENCES ЭкземплярDELETE NO ACTIONUPDATE NO ACTIONTABLE Сотрудники_библиотеки

// Изменение таблицы «Сотрудники_библиотеки»

ADD FOREIGN KEY (Номер_отдела)

REFERENCES ОтделыDELETE NO ACTIONUPDATE NO ACTIONTABLE Списанные_книги

// Изменение таблицы «Списанные_книги»

ADD FOREIGN KEY (Шифр)

REFERENCES ЭкземплярDELETE NO ACTIONUPDATE NO ACTIONTABLE Экземпляр

// Изменение таблицы «Экземпляр»FOREIGN KEY (ISBN)КнигаDELETE NO ACTIONUPDATE NO ACTION

TABLE Экземпляр

// Изменение таблицы «Экземпляр»

ADD FOREIGN KEY (Номер_отдела)

REFERENCES ОтделыDELETE NO ACTIONUPDATE NO ACTIONtrigger tD_Заказы on Заказы for DELETE as

// Создание триггера на удаление из таблицы «Заказы»

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Заказы */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Книга Заказы ON CHILD DELETE NO ACTION */exists (select * from deleted, Книга

/* deleted.ISBN = Книга.ISBN */.ISBN = Книга.ISBN andexists (* from Заказы

/* Заказы.ISBN = Книга.ISBN */

Заказы.ISBN = Книга.ISBN

)

)@errno = 30010,

@errmsg = 'Cannot DELETE last Заказы because Книга exists.' error

end

// Создание триггера на удаление из таблицы «Преподаватели»

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Преподаватели Делают Заказы ON CHILD DELETE NO ACTION */exists (select * from deleted, Преподаватели

where

/* deleted. Читательский_номер = Преподаватели. Читательский_номер */. Читательский_номер = Преподаватели. Читательский_номер and

not exists (

select * from Заказы

/* Заказы. Читательский_номер = Преподаватели. Читательский_номер */

Заказы. Читательский_номер = Преподаватели. Читательский_номер

)

)@errno = 30010,

@errmsg = 'Cannot DELETE last Заказы because Преподаватели exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

trigger tU_Заказы on Заказы for UPDATE as

// Создание триггера на обновление таблицы «Заказы»

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Заказы */

declare @numrows int, // объявление переменных

@nullcnt int,

@validcnt int,

@insЧитательский_номер int,

@insISBN varchar(20),

@errno int,

@errmsg varchar(255)

@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Книга Заказы ON CHILD UPDATE NO ACTION */

/* update(ISBN) */(ISBN)@nullcnt = 0@validcnt = count(*)inserted, Книга

/* inserted.ISBN = Книга.ISBN */.ISBN = Книга.ISBN

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Заказы because Книга does not exist.' error

end

end

// Создание триггера на обновление таблицы «Преподаватели»

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Преподаватели Делают Заказы ON CHILD UPDATE NO ACTION */

/* update (Читательский_номер) */(Читательский_номер)

begin@nullcnt = 0@validcnt = count(*)inserted, Преподаватели

/* inserted. Читательский_номер = Преподаватели. Читательский_номер */. Читательский_номер = Преподаватели. Читательский_номер

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Заказы because Преподаватели does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на удаление из таблицы «Замена_экземпляров»

create trigger tD_Замена_экземпляров on Замена_экземпляров for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Замена_экземпляров */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр Заменили Замена_экземпляров ON CHILD DELETE NO ACTION */exists (select * from deleted, Экземпляр

/* deleted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр andexists ( * from Замена_экземпляров

where

/* Замена_экземпляров. Шифр = Экземпляр. Шифр */

Замена_экземпляров. Шифр = Экземпляр. Шифр

)

)

begin

select @errno = 30010,

@errmsg = 'Cannot DELETE last Замена_экземпляров because Экземпляр exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на обновление таблицы «Замена_экземпляров»

create trigger tU_Замена_экземпляров on Замена_экземпляров for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Замена_экземпляров */@numrows int,

@nullcnt int,

@validcnt int,

@insШифр varchar(20),

@errno int,

@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр Заменили Замена_экземпляров ON CHILD UPDATE NO ACTION */

/* update(Шифр) */(Шифр)@nullcnt = 0@validcnt = count(*)inserted, Экземпляр

/* inserted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр

/* */

@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Замена_экземпляров because Экземпляр does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на удаление таблицы «Книга»

create trigger tD_Книга on Книга for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Книга */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Книга зарегестрировали в Экземпляр ON PARENT DELETE NO ACTION */exists (* from deleted, Экземпляр

/* Экземпляр.ISBN = deleted.ISBN */

Экземпляр.ISBN = deleted.ISBN

)@errno = 30001,

@errmsg = 'Cannot DELETE Книга because Экземпляр exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Книга Заказы ON PARENT DELETE NO ACTION */exists (* from deleted, Заказы

/* Заказы.ISBN = deleted.ISBN */

Заказы.ISBN = deleted.ISBN

)@errno = 30001,

@errmsg = 'Cannot DELETE Книга because Заказы exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на обновление таблицы «Книга»

create trigger tU_Книга on Книга for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Книга */@numrows int,

@nullcnt int,

@validcnt int,

@insISBN varchar(20),

@errno int,

@errmsg varchar(255)@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Книга зарегестрировали в Экземпляр ON PARENT UPDATE NO ACTION */

/* update(ISBN) */(ISBN)exists (* from deleted, Экземпляр

/* Экземпляр.ISBN = deleted.ISBN */

Экземпляр.ISBN = deleted.ISBN

)@errno = 30005,

@errmsg = 'Cannot UPDATE Книга because Экземпляр exists.' error

end

end

// Создание триггера на обновление таблицы «Заказы»

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Книга Заказы ON PARENT UPDATE NO ACTION */

/* update(ISBN) */(ISBN)exists (* from deleted, Заказы

/* Заказы.ISBN = deleted.ISBN */

Заказы.ISBN = deleted.ISBN

)@errno = 30005,

@errmsg = 'Cannot UPDATE Книга because Заказы exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

 // Создание триггера на удаление из таблицы «Отделы»

create trigger tD_Отделы on Отделы for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Отделы */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы находятся в Периодические_издания ON PARENT DELETE SET NULL */ Периодические_издания

/* Периодические_издания. Номер_отдела = NULL */

Периодические_издания. Номер_отдела = NULLПериодические_издания, deleted

/* Периодические_издания. Номер_отдела = deleted. Номер_отдела */

Периодические_издания. Номер_отдела = deleted. Номер_отдела

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы Экземпляр ON PARENT DELETE NO ACTION */exists (* from deleted, Экземпляр

where

/* Экземпляр. Номер_отдела = deleted. Номер_отдела */

Экземпляр. Номер_отдела = deleted. Номер_отдела

)@errno = 30001,

@errmsg = 'Cannot DELETE Отделы because Экземпляр exists.' error

end

// Создание триггера на удаление из таблицы «Сотрудники_библиотеки»

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы Сотрудники_библиотеки ON PARENT DELETE NO ACTION */exists (* from deleted, Сотрудники_библиотеки

where

/* Сотрудники_библиотеки. Номер_отдела = deleted. Номер_отдела */

Сотрудники_библиотеки. Номер_отдела = deleted. Номер_отдела

)@errno = 30001,

@errmsg = 'Cannot DELETE Отделы because Сотрудники_библиотеки exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на удаление из таблицы «Отделы»

create trigger tU_Отделы on Отделы for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Отделы */@numrows int,

@nullcnt int,

@validcnt int,

@insНомер_отдела int,

@errno int,

@errmsg varchar(255)@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы находятся в Периодические_издания ON PARENT UPDATE SET NULL */

if

/* update (Номер_отдела) */(Номер_отдела)Периодические_издания

/* Периодические_издания. Номер_отдела = NULL */

Периодические_издания. Номер_отдела = NULLПериодические_издания, deleted

/* Периодические_издания. Номер_отдела = deleted. Номер_отдела */

Периодические_издания. Номер_отдела = deleted. Номер_отдела

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы Экземпляр ON PARENT UPDATE NO ACTION */

if

/* update (Номер_отдела) */(Номер_отдела)

beginexists (* from deleted, Экземпляр

where

/* Экземпляр. Номер_отдела = deleted. Номер_отдела */

Экземпляр. Номер_отдела = deleted. Номер_отдела

)@errno = 30005,

@errmsg = 'Cannot UPDATE Отделы because Экземпляр exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы Сотрудники_библиотеки ON PARENT UPDATE NO ACTION */

if

/* update (Номер_отдела) */(Номер_отдела)

beginexists (* from deleted, Сотрудники_библиотеки

where

/* Сотрудники_библиотеки. Номер_отдела = deleted. Номер_отдела */

Сотрудники_библиотеки. Номер_отдела = deleted. Номер_отдела

)@errno = 30005,

@errmsg = 'Cannot UPDATE Отделы because Сотрудники_библиотеки exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на вставку в таблицу «Периодические_издания»

create trigger tI_Периодические_издания on Периодические_издания for INSERT as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* INSERT trigger on Периодические_издания */@numrows int,

@nullcnt int,

@validcnt int,

@errno int,

@errmsg varchar(255)

@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы находятся в Периодические_издания ON CHILD INSERT SET NULL */

/* update (Номер_отдела) */(Номер_отдела)Периодические_издания

/* Периодические_издания. Номер_отдела = NULL */

Периодические_издания. Номер_отдела = NULLПериодические_издания, inserted

/* Периодические_издания. Шифр_периодики = inserted. Шифр_периодики */

Периодические_издания. Шифр_периодики = inserted. Шифр_периодики andexists (* from Отделы

/* inserted. Номер_отдела = Отделы. Номер_отдела */. Номер_отдела = Отделы. Номер_отдела

)

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

 // Создание триггера на обновление таблицы «Периодические_издания»

create trigger tU_Периодические_издания on Периодические_издания for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Периодические_издания */@numrows int,

@nullcnt int,

@validcnt int,

@insШифр_периодики varchar(20),

@errno int,

@errmsg varchar(255)@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы находятся в Периодические_издания ON CHILD UPDATE SET NULL */

if

/* update (Номер_отдела) */(Номер_отдела)Периодические_издания

/* Периодические_издания. Номер_отдела = NULL */

Периодические_издания. Номер_отдела = NULLПериодические_издания, inserted

/* Периодические_издания. Шифр_периодики = inserted. Шифр_периодики */

Периодические_издания. Шифр_периодики = inserted. Шифр_периодики andexists (* from Отделы

/* inserted. Номер_отдела = Отделы. Номер_отдела */. Номер_отдела = Отделы. Номер_отдела

)

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на на удаление из таблицы «Пользование_библиотекой1»

create trigger tD_Пользование_библиотекой1 on Пользование_библиотекой1 for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Пользование_библиотекой1 */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/16 Пользование_библиотекой1 ON CHILD DELETE NO ACTION */exists (select * from deleted, Экземпляр

/* deleted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр andexists (

select * from Пользование_библиотекой1

/* Пользование_библиотекой1. Шифр = Экземпляр. Шифр */

Пользование_библиотекой1. Шифр = Экземпляр. Шифр

)

)

begin

select @errno = 30010,

@errmsg = 'Cannot DELETE last Пользование_библиотекой1 because Экземпляр exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Сотрудники_библиотеки R/15 Пользование_библиотекой1 ON CHILD DELETE NO ACTION */

if exists (select * from deleted, Сотрудники_библиотеки

where

/* deleted.табельный_номер = Сотрудники_библиотеки. табельный_номер */.табельный_номер = Сотрудники_библиотеки. табельный_номер and

not exists (* from Пользование_библиотекой1

where

/* Пользование_библиотекой1.табельный_номер = Сотрудники_библиотеки. табельный_номер */

Пользование_библиотекой1.табельный_номер = Сотрудники_библиотеки. табельный_номер

)

)@errno = 30010,

@errmsg = 'Cannot DELETE last Пользование_библиотекой1 because Сотрудники_библиотеки exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на обновление таблицы «Пользование_библиотекой1»

create trigger tU_Пользование_библиотекой1 on Пользование_библиотекой1 for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Пользование_библиотекой1 */@numrows int,

@nullcnt int,

@validcnt int,

@insтабельный_номер int,

@insШифр varchar(20),

@errno int,

@errmsg varchar(255)@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/16 Пользование_библиотекой1 ON CHILD UPDATE NO ACTION */

/* update(Шифр) */(Шифр)@nullcnt = 0@validcnt = count(*)inserted, Экземпляр

/* inserted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Пользование_библиотекой1 because Экземпляр does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Сотрудники_библиотеки R/15 Пользование_библиотекой1 ON CHILD UPDATE NO ACTION */

/* update (табельный_номер) */(табельный_номер)

begin@nullcnt = 0@validcnt = count(*)

from inserted, Сотрудники_библиотеки

/* inserted.табельный_номер = Сотрудники_библиотеки. табельный_номер */.табельный_номер = Сотрудники_библиотеки. табельный_номер

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Пользование_библиотекой1 because Сотрудники_библиотеки does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на на удаление из таблицы «Пользование_библиотекой2»

create trigger tD_Пользование_библиотекой2 on Пользование_библиотекой2 for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Пользование_библиотекой2 */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/13 Пользование_библиотекой2 ON CHILD DELETE NO ACTION */exists (select * from deleted, Экземпляр

/* deleted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр andexists (

select * from Пользование_библиотекой2

/* Пользование_библиотекой2. Шифр = Экземпляр. Шифр */

Пользование_библиотекой2. Шифр = Экземпляр. Шифр

)

)

begin

select @errno = 30010,

@errmsg = 'Cannot DELETE last Пользование_библиотекой2 because Экземпляр exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Студенты R/12 Пользование_библиотекой2 ON CHILD DELETE NO ACTION */exists (select * from deleted, Студенты

where

/* deleted. Читательский_номер = Студенты. Читательский_номер */. Читательский_номер = Студенты. Читательский_номер and

not exists (

select * from Пользование_библиотекой2

/* Пользование_библиотекой2. Читательский_номер = Студенты. Читательский_номер */

Пользование_библиотекой2. Читательский_номер = Студенты. Читательский_номер

)

)

begin

select @errno = 30010,

@errmsg = 'Cannot DELETE last Пользование_библиотекой2 because Студенты exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на обновление таблицы «Пользование_библиотекой1»

create trigger tU_Пользование_библиотекой2 on Пользование_библиотекой2 for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Пользование_библиотекой2 */@numrows int,

@nullcnt int,

@validcnt int,

@insЧитательский_номер int,

@insШифр varchar(20),

@errno int,

@errmsg varchar(255)

@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/13 Пользование_библиотекой2 ON CHILD UPDATE NO ACTION */

/* update(Шифр) */(Шифр)@nullcnt = 0@validcnt = count(*)inserted, Экземпляр

/* inserted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Пользование_библиотекой2 because Экземпляр does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Студенты R/12 Пользование_библиотекой2 ON CHILD UPDATE NO ACTION */

/* update (Читательский_номер) */(Читательский_номер)

begin@nullcnt = 0@validcnt = count(*)inserted, Студенты

/* inserted. Читательский_номер = Студенты. Читательский_номер */. Читательский_номер = Студенты. Читательский_номер

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Пользование_библиотекой2 because Студенты does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на удаление из таблицы «Пользование_библиотекой3»

create trigger tD_Пользование_библиотекой3 on Пользование_библиотекой3 for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Пользование_библиотекой3 */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Преподаватели R/11 Пользование_библиотекой3 ON CHILD DELETE NO ACTION */exists (select * from deleted, Преподаватели

where

/* deleted. Читательский_номер = Преподаватели. Читательский_номер */. Читательский_номер = Преподаватели. Читательский_номер and

not exists (

select * from Пользование_библиотекой3

/* Пользование_библиотекой3. Читательский_номер = Преподаватели. Читательский_номер */

Пользование_библиотекой3. Читательский_номер = Преподаватели. Читательский_номер

)

)

begin

select @errno = 30010,

@errmsg = 'Cannot DELETE last Пользование_библиотекой3 because Преподаватели exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/10 Пользование_библиотекой3 ON CHILD DELETE NO ACTION */exists (select * from deleted, Экземпляр

/* deleted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр andexists (

select * from Пользование_библиотекой3

/* Пользование_библиотекой3. Шифр = Экземпляр. Шифр */

Пользование_библиотекой3. Шифр = Экземпляр. Шифр

)

)

begin

select @errno = 30010,

@errmsg = 'Cannot DELETE last Пользование_библиотекой3 because Экземпляр exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на обновление таблицы «Пользование_библиотекой3»

create trigger tU_Пользование_библиотекой3 on Пользование_библиотекой3 for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Пользование_библиотекой3 */@numrows int,

@nullcnt int,

@validcnt int,

@insЧитательский_номер int,

@insШифр varchar(20),

@errno int,

@errmsg varchar(255)@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Преподаватели R/11 Пользование_библиотекой3 ON CHILD UPDATE NO ACTION */

if

/* update (Читательский_номер) */(Читательский_номер)

begin@nullcnt = 0@validcnt = count(*)inserted, Преподаватели

/* inserted. Читательский_номер = Преподаватели. Читательский_номер */. Читательский_номер = Преподаватели. Читательский_номер

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Пользование_библиотекой3 because Преподаватели does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/10 Пользование_библиотекой3 ON CHILD UPDATE NO ACTION */

/* update(Шифр) */(Шифр)@nullcnt = 0@validcnt = count(*)inserted, Экземпляр

/* inserted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Пользование_библиотекой3 because Экземпляр does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на удаление из таблицы «Преподаватели»

create trigger tD_Преподаватели on Преподаватели for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Преподаватели */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Преподаватели R/11 Пользование_библиотекой3 ON PARENT DELETE NO ACTION */exists (* from deleted, Пользование_библиотекой3

where

Пользование_библиотекой3. Читательский_номер = deleted. Читательский_номер

)

begin

select @errno = 30001,

@errmsg = 'Cannot DELETE Преподаватели because Пользование_библиотекой3 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Преподаватели Делают Заказы ON PARENT DELETE NO ACTION */exists (* from deleted, Заказы

where

/* Заказы. Читательский_номер = deleted. Читательский_номер */

Заказы. Читательский_номер = deleted. Читательский_номер

)

begin

select @errno = 30001,

@errmsg = 'Cannot DELETE Преподаватели because Заказы exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на обновление таблицы «Преподаватели»

create trigger tU_Преподаватели on Преподаватели for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Преподаватели */@numrows int,

@nullcnt int,

@validcnt int,

@insЧитательский_номер int,

@errno int,

@errmsg varchar(255)

@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Преподаватели R/11 Пользование_библиотекой3 ON PARENT UPDATE NO ACTION */

if

/* update (Читательский_номер) */(Читательский_номер)

beginexists (* from deleted, Пользование_библиотекой3

where

/* Пользование_библиотекой3. Читательский_номер = deleted. Читательский_номер */

Пользование_библиотекой3. Читательский_номер = deleted. Читательский_номер

)@errno = 30005,

@errmsg = 'Cannot UPDATE Преподаватели because Пользование_библиотекой3 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Преподаватели Делают Заказы ON PARENT UPDATE NO ACTION */

/* update (Читательский_номер) */(Читательский_номер)

beginexists (* from deleted, Заказы

where

/* Заказы. Читательский_номер = deleted. Читательский_номер */

Заказы. Читательский_номер = deleted. Читательский_номер

)

begin

select @errno = 30005,

@errmsg = 'Cannot UPDATE Преподаватели because Заказы exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на удаление из таблицы «Сотрудники_библиотеки»

create trigger tD_Сотрудники_библиотеки on Сотрудники_библиотеки for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Сотрудники_библиотеки */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Сотрудники_библиотеки R/15 Пользование_библиотекой1 ON PARENT DELETE NO ACTION */exists (* from deleted, Пользование_библиотекой1

where

/* Пользование_библиотекой1.табельный_номер = deleted.табельный_номер */

Пользование_библиотекой1.табельный_номер = deleted.табельный_номер

)@errno = 30001,

@errmsg = 'Cannot DELETE Сотрудники_библиотеки because Пользование_библиотекой1 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы Сотрудники_библиотеки ON CHILD DELETE NO ACTION */exists (select * from deleted, Отделы

where

/* deleted. Номер_отдела = Отделы. Номер_отдела */. Номер_отдела = Отделы. Номер_отдела andexists ( * from Сотрудники_библиотеки

/* Сотрудники_библиотеки. Номер_отдела = Отделы. Номер_отдела */

Сотрудники_библиотеки. Номер_отдела = Отделы. Номер_отдела

)

)@errno = 30010,

@errmsg = 'Cannot DELETE last Сотрудники_библиотеки because Отделы exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на обновление таблицы «Сотрудники_библиотеки»

create trigger tU_Сотрудники_библиотеки on Сотрудники_библиотеки for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Сотрудники_библиотеки */@numrows int,

@nullcnt int,

@validcnt int,

@insтабельный_номер int,

@errno int,

@errmsg varchar(255)@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Сотрудники_библиотеки R/15 Пользование_библиотекой1 ON PARENT UPDATE NO ACTION */

if

/* update (табельный_номер) */(табельный_номер)

beginexists (* from deleted, Пользование_библиотекой1

where

/* Пользование_библиотекой1.табельный_номер = deleted.табельный_номер */

Пользование_библиотекой1.табельный_номер = deleted.табельный_номер

)@errno = 30005,

@errmsg = 'Cannot UPDATE Сотрудники_библиотеки because Пользование_библиотекой1 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы Сотрудники_библиотеки ON CHILD UPDATE NO ACTION */

/* update (Номер_отдела) */(Номер_отдела)

begin@nullcnt = 0@validcnt = count(*)inserted, Отделы

/* inserted. Номер_отдела = Отделы. Номер_отдела */. Номер_отдела = Отделы. Номер_отдела

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Сотрудники_библиотеки because Отделы does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на удаление из таблицы «Списанные_книги»

create trigger tD_Списанные_книги on Списанные_книги for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Списанные_книги */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр Списали Списанные_книги ON CHILD DELETE NO ACTION */exists (select * from deleted, Экземпляр

/* deleted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр andexists (

select * from Списанные_книги

/* Списанные_книги. Шифр = Экземпляр. Шифр */

Списанные_книги. Шифр = Экземпляр. Шифр

)

)

begin

select @errno = 30010,

@errmsg = 'Cannot DELETE last Списанные_книги because Экземпляр exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера обновление таблицы «Списанные_книги»

create trigger tU_Списанные_книги on Списанные_книги for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Списанные_книги */@numrows int,

@nullcnt int,

@validcnt int,

@insШифр varchar(20),

@errno int,

@errmsg varchar(255)@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр Списали Списанные_книги ON CHILD UPDATE NO ACTION */

if

/* update(Шифр) */(Шифр)@nullcnt = 0@validcnt = count(*)inserted, Экземпляр

/* inserted. Шифр = Экземпляр. Шифр */. Шифр = Экземпляр. Шифр

/* */@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Списанные_книги because Экземпляр does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на удаление из таблицы «Студенты»

create trigger tD_Студенты on Студенты for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Студенты */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Студенты R/12 Пользование_библиотекой2 ON PARENT DELETE NO ACTION */exists (* from deleted, Пользование_библиотекой2

where

/* Пользование_библиотекой2. Читательский_номер = deleted. Читательский_номер */

Пользование_библиотекой2. Читательский_номер = deleted. Читательский_номер

)

begin

select @errno = 30001,

@errmsg = 'Cannot DELETE Студенты because Пользование_библиотекой2 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на обновление таблицы «Студенты»

create trigger tU_Студенты on Студенты for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Студенты */@numrows int,

@nullcnt int,

@validcnt int,

@insЧитательский_номер int,

@errno int,

@errmsg varchar(255)@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Студенты R/12 Пользование_библиотекой2 ON PARENT UPDATE NO ACTION */

/* update (Читательский_номер) */(Читательский_номер)

beginexists (* from deleted, Пользование_библиотекой2

where

/* Пользование_библиотекой2. Читательский_номер = deleted. Читательский_номер */

Пользование_библиотекой2. Читательский_номер = deleted. Читательский_номер

)

begin

select @errno = 30005,

@errmsg = 'Cannot UPDATE Студенты because Пользование_библиотекой2 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на удаление из таблицы «Экземпляр»

create trigger tD_Экземпляр on Экземпляр for DELETE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* DELETE trigger on Экземпляр */@errno int,

@errmsg varchar(255)

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/16 Пользование_библиотекой1 ON PARENT DELETE NO ACTION */exists (* from deleted, Пользование_библиотекой1

where

/* Пользование_библиотекой1. Шифр = deleted. Шифр */

Пользование_библиотекой1. Шифр = deleted. Шифр

)

begin

select @errno = 30001,

@errmsg = 'Cannot DELETE Экземпляр because Пользование_библиотекой1 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/13 Пользование_библиотекой2 ON PARENT DELETE NO ACTION */exists (* from deleted, Пользование_библиотекой2

where

/* Пользование_библиотекой2. Шифр = deleted. Шифр */

Пользование_библиотекой2. Шифр = deleted. Шифр

)

begin

select @errno = 30001,

@errmsg = 'Cannot DELETE Экземпляр because Пользование_библиотекой2 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/10 Пользование_библиотекой3 ON PARENT DELETE NO ACTION */exists (* from deleted, Пользование_библиотекой3

where

/* Пользование_библиотекой3. Шифр = deleted. Шифр */

Пользование_библиотекой3. Шифр = deleted. Шифр

)

begin

select @errno = 30001,

@errmsg = 'Cannot DELETE Экземпляр because Пользование_библиотекой3 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр Списали Списанные_книги ON PARENT DELETE NO ACTION */exists (* from deleted, Списанные_книги

/* Списанные_книги. Шифр = deleted. Шифр */

Списанные_книги. Шифр = deleted. Шифр

)@errno = 30001,

@errmsg = 'Cannot DELETE Экземпляр because Списанные_книги exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр Заменили Замена_экземпляров ON PARENT DELETE NO ACTION */exists (* from deleted, Замена_экземпляров

/* Замена_экземпляров. Шифр = deleted. Шифр */

Замена_экземпляров. Шифр = deleted. Шифр

)@errno = 30001,

@errmsg = 'Cannot DELETE Экземпляр because Замена_экземпляров exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Книга зарегестрировали в Экземпляр ON CHILD DELETE NO ACTION */exists (select * from deleted, Книга

/* deleted.ISBN = Книга.ISBN */.ISBN = Книга.ISBN andexists (* from Экземпляр

/* Экземпляр.ISBN = Книга.ISBN */

Экземпляр.ISBN = Книга.ISBN

)

)@errno = 30010,

@errmsg = 'Cannot DELETE last Экземпляр because Книга exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Отделы Экземпляр ON CHILD DELETE NO ACTION */exists (select * from deleted, Отделы

where

/* deleted. Номер_отдела = Отделы. Номер_отдела */. Номер_отдела = Отделы. Номер_отдела andexists (* from Экземпляр

/* Экземпляр. Номер_отдела = Отделы. Номер_отдела */

Экземпляр. Номер_отдела = Отделы. Номер_отдела

)

)@errno = 30010,

@errmsg = 'Cannot DELETE last Экземпляр because Отделы exists.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 */:@errno @errmsgtransaction

go

// Создание триггера на обновление таблицы «Экземпляр»

create trigger tU_Экземпляр on Экземпляр for UPDATE as

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* UPDATE trigger on Экземпляр */@numrows int,

@nullcnt int,

@validcnt int,

@insШифр varchar(20),

@errno int,

@errmsg varchar(255)@numrows = @@rowcount

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/16 Пользование_библиотекой1 ON PARENT UPDATE NO ACTION */

/* update(Шифр) */(Шифр)exists (* from deleted, Пользование_библиотекой1

where

/* Пользование_библиотекой1. Шифр = deleted. Шифр */

Пользование_библиотекой1. Шифр = deleted. Шифр

)

begin

select @errno = 30005,

@errmsg = 'Cannot UPDATE Экземпляр because Пользование_библиотекой1 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/13 Пользование_библиотекой2 ON PARENT UPDATE NO ACTION */

/* update(Шифр) */(Шифр)exists (* from deleted, Пользование_библиотекой2

where

/* Пользование_библиотекой2. Шифр = deleted. Шифр */

Пользование_библиотекой2. Шифр = deleted. Шифр

)

begin

select @errno = 30005,

@errmsg = 'Cannot UPDATE Экземпляр because Пользование_библиотекой2 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр R/10 Пользование_библиотекой3 ON PARENT UPDATE NO ACTION */

/* update(Шифр) */(Шифр)exists (* from deleted, Пользование_библиотекой3

where

/* Пользование_библиотекой3. Шифр = deleted. Шифр */

Пользование_библиотекой3. Шифр = deleted. Шифр

)

begin

select @errno = 30005,

@errmsg = 'Cannot UPDATE Экземпляр because Пользование_библиотекой3 exists.'

goto error

/* ERwin Builtin Tue May 29 17:12:41 2007 */

/* Экземпляр Списали Списанные_книги ON PARENT UPDATE NO ACTION */

/* update(Шифр) */(Шифр)exists (* from deleted, Списанные_книги

/* Списанные_книги. Шифр = deleted. Шифр */

Списанные_книги. Шифр = deleted. Шифр

)

begin@errno = 30005,

@errmsg = 'Cannot UPDATE Экземпляр because Списанные_книги exists.'error

/* Экземпляр Заменили Замена_экземпляров ON PARENT UPDATE NO ACTION *//* update(Шифр) */(Шифр)exists (* from deleted, Замена_экземпляров

/* Замена_экземпляров. Шифр = deleted. Шифр */

Замена_экземпляров. Шифр = deleted. Шифр

)

begin

select @errno = 30005,

@errmsg = 'Cannot UPDATE Экземпляр because Замена_экземпляров exists.'

goto error/* update(ISBN) */(ISBN)@nullcnt = 0@validcnt = count(*)inserted, Книга

/* inserted.ISBN = Книга.ISBN */.ISBN = Книга.ISBN@validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Экземпляр because Книга does not exist.'error

/* ERwin Builtin Tue May 29 17:12:41 2007 Отделы Экземпляр ON CHILD UPDATE NO ACTION */

if /* update (Номер_отдела) */(Номер_отдела)

begin@nullcnt = 0@validcnt = count(*)inserted, Отделы

/* inserted. Номер_отдела = Отделы. Номер_отдела */. Номер_отдела = Отделы. Номер_отдела

if @validcnt + @nullcnt!= @numrows@errno = 30007,

@errmsg = 'Cannot UPDATE Экземпляр because Отделы does not exist.'error:@errno @errmsgtransaction

go

6. Результат тестирования информационной системы

Для нормальной работы системы необходимо 256 Мбайт оперативной памяти, Windows NT/2000/XP и выше, Access2000 и выше.

Результатом тестирования в данном случае может послужить создание отчета, содержащего информацию о работе библиотеке.

После тестирования получили результаты:

Информационная система поддерживает многопользовательский режим.

Тестирование запросов прошло успешно.

В данном курсовом проекте разработана база данных с тремя клиентскими приложениями, которая хранится на SQL сервере. Для каждого пользователя составлены запросы формы и отчеты. Формы составлены на основе запросов и таблиц, и используются для занесения и модификации информации в базе данных.

Отчеты составлены на основе запросов и используются для получения информации и оформления документации.

Заключение

Прогресс, достигнутый за последние несколько лет во всех аспектах вычислительной техники, включая теорию, технологию и приложения, привели к значительному расширению области применения компьютеров и росту числа их пользователей. Существенной частью современного общества являются разнообразные системы доступа и хранения информации, которые являются неотъемлемой составляющей современного научно-технического прогресса. Существует много веских причин перевода существующей информации на компьютерную основу, т.к. более быстрая обработка данных и централизация их хранения с использованием клиент / серверных технологий позволяют сберечь значительные средства, а главное и время для получения необходимой информации, а также упрощает доступ и ведение.

Современные СУБД - многопользовательские системы управления базой данных, которые специализируется на управлении массивом информации одним или множеством одновременно работающих пользователей.

Во время выполнения курсовой работы было разработано многопользовательская информационная система «Университетская библиотека».

При создании ИС использовались СУБД Microsoft ACCESS 2000, средство моделирования баз данных All Fusion Data Modeler 4.1, средство моделирования бизнес-процессов All Fusion Process Modeler 4.1, сервер баз данных Microsoft SQL server 2000, язык баз данных T-SQL.

Функциональная модель ИС описывает три клиентских приложения. При разработке программного обеспечения использовались представления, хранимые процедуры с параметрами, триггеры, курсоры.

Все пункты курсового задания были выполнены, разработанная система выполняет поставленную перед ним задачу.

Список использованных литературных источников

1. Microsoft SQL Server 7 для профессионалов. - СПб.: Питер, 2000. - 896 с.

2.      Алан Бьюли, Энди Оппель. Изучаем SQL. - М.:Символ, 2007. - 312 с.

.        Жилинский А. Самоучитель Microsoft SQL Server 2005. - СПб:BHV, 2004. - 224 с.

.        Кишори Бхамидипати. SQL. Справочник программиста.-М.:Эком, 2003. - 304 с.

.        Конспект лекций «Базы данных»

.        Литвин П., Гетц К., Гунделой М. Разработка настольных приложений в Access 2002. Для профессионалов. - СПб.:Питер; К.: Издательская группа BHV, 2002. - 1008 с.

.        Литвин П., Гетц К., Гунделой М. Разработка корпоративных приложений в Access 2002. Для профессионалов. - СПб.:Питер; Киев: BHV, 2002. - 1008 с.

.        Роберт Виейра. Программирование баз данных Microsoft SQL Server 2005. Базовый курс. - М.:Вильямс, 2003. - 848 с.

.        Уилтон П., Колби Дж. SQL для начинающих. - М.: Вильямс, 2006. - 496 с.

.        Фленов М. Transact SQL в подлиннике. - СПб:BHV, 2006. - 576 с.

.        Практическое руководство по SQL. - М.: Вильямс, 2002. - 352 с.

.        Моисеенко С. SQL. Задачи и решения. СПб.: Питер, 2006. - 256 с.

Похожие работы на - Проектирование многопользовательской информационной системы 'Университетская библиотека'

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!