ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования _____________________________________ ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Макурин Ю.Д. Сивохин А.В.
ПРОЕКТИРОВАНИЕ И РЕАЛИЗАЦИЯ БАЗ ДАННЫХ И КЛИЕНТСКИХ ПРИЛОЖЕНИЙ В СРЕДЕ MS VISUAL STUDIO.NET Учебное пособие
ПЕНЗА 2010
УДК 681.3
Макурин Ю.Д. Сивохин А. В. Проектирование и реализация баз данных и клиентских приложений в среде MS Visual Studio.NET. Учебное пособие. – Пенза: Частная типография Тугушева, 2010 – 230с. Рассматриваются вопросы применения визуальной объектноориентированной среды MS Visual Studio.NET для создания баз данных и клиентских приложений на основе технологии клиент-сервер. Изложение материала начинается с анализа предметной области, выделения ее сущностей, определения атрибутов этих сущностей, установления связей между ними и обоснования выбора реляционной модели данных. После анализа информационных задач, решаемых пользователями для данной предметной области, формулируются требования как к базе данных, так и к клиентскому приложению информационной системы, и строится сценарий ее поведеня. Далее дается подробное описание, как используя мощные средства проектирования, реализации и отладки, можно осуществить создание и функциональное тестирование проектов базы данных и клиентского приложения, а также всех компонент системы: таблиц, представлений, всевозможных запросов, хранимых процедур, триггеров различных категорий и графических интерфейсов серверного и клиенского уровней. В заключение определяется порядок конфигурирования информационной системы для обеспечения ее функциональной полноты, удобства использования и дальнейшего развития. Учебное пособие подготовлено на кафедре «Математическое обеспечение и применение ЭВМ» Пензенского Государственного университета и предназначено для студентов всех специальностей, где предусмотрено изучение дисциплин «Базы данных», «Системы управления базами данных» и «Информационные системы».
©В.П. Сивохина ©Оформление: Т.А. Макурина и Д.В. Макурин 2
Введение В настоящее время большое распространение получила новая технология построения информационных систем — технология «клиент-сервер». Эта технология дает ряд неоспоримых преимуществ по сравнению с технологией предыдущего поколения — технологией «файл-сервер». В частности, она предоставляет большие возможности по защите данных от несанкционированного обращения и разграничению прав доступа на уровне отдельных записей и полей, дает возможность работы с большими мультимедийными и нестандартными данными. Новая технология позволяет работать как в локальных, так и в глобальных сетях, а также в сети Internet. Системы, построенные по новой технологии «клиент-сервер», отличаются высокой степенью безопасности, территориально независимы и не требовательны к аппаратной мощности клиентских станций. Широкие возможности по поддержке этой технологии имеет визуальная объектно-ориентированная среда MS Visual Studio.NET, которая рассматривается в данном учебном пособии. Учебное пособие состоит из шести разделов. В первом разделе изложение материала начинается с анализа предметной области, выделения ее сущностей, определения атрибутов этих сущностей, установления связей между ними и обоснования выбора реляционной модели данных. После анализа информационных задач, решаемых пользователями для данной предметной области, формулируются требования как к базе данных, так и к клиентскому приложению информационной системы, и строится сценарий ее поведеня. Во втором разделе дается краткая характеристика инструментальных средств визуальной объектно-ориентированной среды MS Visual Studio.NET как для создания баз данных, так и для реализации клиентских приложений. В последующих разделах дается подробное описание того, как используя мощные средства проектирования, реализации и отладки, можно осуществить создание и функциональное тестирование проектов базы данных и клиентского приложения, а также всех компонент системы: таблиц, представлений, всевозможных запросов, хранимых процедур, триггеров различных категорий и графических интерфейсов серверного и клиенского уровней. В шестом разделе определяется порядок конфигурирования информационной системы для обеспечения ее функциональной полноты, удобства использования и дальнейшего развития. В приложениях приводятся экранные формы, скрипты, сценарии и модули информационной системы, которые позволяют выполнить те или иные процедуры по созданию компонент системы, вводу и отображению данных, настройке и функциональному тестированию, а также переносу и развертыванию системы на другом оборудовании или платформе.
3
1 Проектирование информационной системы “ Живопись, графика, фотография ” 1.1 Анализ предметной области и разработка модели данных Предметная область – это множество всех предметов, или объектов некоторой части реального мира, свойства которых и отношения между которыми рассматриваются в научной теории или в практической деятельности человека. Для сбора, хранения, поиска и выдачи информации о предметной области и ее объектов в настоящее время широко используются информационные системы, являющиеся комплексом аппаратных и программных средств. Рассмотрим, каким образом можно осуществить проектирование и реализацию упрощенной базы данных и несложного клиентского приложения информационной системы для предметной области “Живопись, графика, фотография” по обслуживанию хранилищ, музеев, выставок и аукционов. Живопись, графика и фотография отражают действительность в наглядных, зрительно воспринимаемых образах, в которых узнаются формы самой действительности. Благодаря методам обобщения, типизации и воображению художника они позволяют эстетически раскрывать временное развитие событий, духовный облик, переживания, мысли, взаимоотношения людей, воплощать общественные идеи. Жи́вопись — вид изобразительного искусства, связанный с передачей зрительных образов посредством нанесения красок на твёрдую или гибкую основу; созданием изображения с помощью цифровых технологий; а также произведения искусства, выполненные такими способами. Наиболее распространены произведения живописи, выполненные на плоских или почти плоских поверхностях, таких как натянутый на подрамник холст, дерево, картон, бумага, обработанные поверхности стен и т. д. В том числе к живописи относят и выполненные красками изображения на декоративных и церемониальных сосудах, поверхности которых могут иметь сложную форму. Живописец может создавать свои изображения на камне, штукатурке, холсте, шёлке, бумаге, металле, асфальте, бетоне и даже на коже (в том числе человеческой ⎯ татуировка). Живопись встречается и соседствует с пластическими искусствами, в том числе с архитектурой, скульптурой; она может участвовать в формировании искусственной и природной среды. Живопись, как и другие изобразительные искусства, иллюзорна: она — это имитация трёхмерного пространства в плоскости, достигаемая посредством линейной и цветовой перспективы. Но её визуальный и цветовой аспект (глаз воспринимает в одно мгновение практически бесконечную информацию) обуславливает исключительное место живописи среди всех изобразительных искусств.
4
Техники живописи практически неисчерпаемы. Всё, что оставляет какойлибо след на чём-то, строго говоря, является живописью: живопись создаётся природой, временем и человеком. Это уже отметил Леонардо да Винчи. Традиционные техники живописи: энкаустика, темперная (с яйцом), настенная (известковая), клеевая и других типов. С XV века становится популярной живопись масляными красками; в XX веке появляются синтетические краски со связующим веществом из полимеров (акрилик, винилик и др.). Краски могут приготовляться из натуральных и искусственных пигментов. Гуашь, акварель, китайскую тушь и полурисовальную технику (пастель) — также относят к живописи. Графика (греч. γραφικος — «письменный», от греч. γραφω — «пишу») — вид изобразительного искусства, использующий в качестве основных изобразительных средств линии, штрихи, пятна и точки. Цвет также может применяться, но в отличие от живописи, здесь он играет вспомогательную роль. При рисовании графикой обычно используют не больше одного цвета (кроме основного черного), в редких случаях — два. Кроме контурной линии в графическом искусстве широко используется штрих и пятно, также контрастирующие с белой (а в иных случаях также цветной, чёрной, или реже — фактурной) поверхностью бумаги — главной основой для графических работ. Сочетанием тех же средств могут создаваться тональные нюансы. Наиболее общий отличительный признак графики — особое отношение изображаемого предмета к пространству, роль которого в значительной мере выполняет фон бумаги (по выражению русского мастера графики В. А. Фаворского — «воздух белого листа»). В зависимости от предназначения графика подразделяется на несколько видов: а) Станковая графика (рисунок, гравюра, лубок). б) Книжная графика ⎯ один из видов графического искусства: книжные
иллюстрации, виньетки, заставки, буквицы, обложки, суперобложки и т. п. С рукописной книгой во многом связана история рисунка, а с печатной книгой ⎯ развитие гравюры и литографии. В древнем мире появился шрифт, также относимый к графике, поскольку сама по себе буква является графическим знаком. в) Журнальная и газетная графика. г) Компьютерная графика (также маши́нная гра́фика) — область деятель-
ности, в которой компьютеры используются как инструмент как для синтеза изображений, так и для обработки визуальной информации, полученной из реального мира. Также компьютерной графикой называют результат такой деятельности. Фотогра́фия (фр. photographie от др.-греч. φως / φωτος — свет и γραφω — пишу; светопись — техника рисования светом) — получение и сохранение 5
статичного изображения на светочувствительном материале (фотоплёнке или фотографической матрице) при помощи фотокамеры. Также фотографией или фотоснимком, или просто снимком называют конечное изображение, полученное в результате фотографического процесса и рассматриваемое человеком непосредственно (имеется в виду как кадр проявленной плёнки, так и изображение в электронном или печатном виде). Фотография основана на достижениях науки, прежде всего в области оптики, механики и химии. Развитие на нынешнем этапе цифровой фотографии происходит благодаря электронным и информационным технологиям. По своим выразительным возможностям фотография не уступает, а иногда даже превосходит традиционное изобразительное искусство. В зависимости от принципа работы светочувствительного материала фотографию принято делить на три больших подраздела: а) Плёночная фотография — основана на фотоматериалах, в которых происходят фотохимические процессы. б) Цифровая фотография — в процессе получения и сохранения изображения происходят перемещения электрических зарядов (обычно в результате фотоэффекта и при дальнейшей обработке), но не происходит химических реакций или перемещения вещества. Правильнее было бы называть такую фотографию электронной, так как в ряде устройств, традиционно относимых к «цифровым», происходят аналоговые процессы (такова самая первая камера с электронной матрицей Sony Mavica, таковы многие дешёвые телекамеры систем видеонаблюдения). в) Электрографические и иные процессы, в которых не происходит химических реакций, но происходит перенос вещества, образующего изображение. Специального общего названия для этого раздела не выработано, до появления цифровой фотографии часто употреблялся термин «бессеребряная фотография». Также употребляются следующие устойчивые словосочетания: а) Галогеносеребряная фотография для галогеносеребряного фотографического процесса. б) Бессеребряная фотография — для всех остальных фотографических процесссов. в) Аналоговая фотография — как синоним плёночной фотографии, в противопоставлении цифровой. г) Аналоговая печать, оптическая печать — получение фотоснимков путём оптического увеличения с негатива либо использования специального проектора (для оптической печати цифровых фотографий), в противопоставлении цифровым методам печати. Получение движущихся изображений, основанное на фотографических принципах, называется кинематографией. Проектирование программного обеспечения любой информационной системы включает следующие этапы: 6
1. Анализ предметной области и выработка требований к системе. 2. Логическое представление реальности. 3. Идентификация и проектирование видимых сущностей. 4. Разработка абстрактных (поддерживаемых) сущностей и концептуальной схемы базы данных. 5. Проектирование структуры приложения. Анализ предметной области начинается с выделения сущностей и определения их свойств атрибутов. Выделенные сущности могут быть двух типов: видимые сущности и поддерживаемые сущности. Видимые сущности представляют собой объекты предметной области, которые может распознать человек. Поддерживаемые сущности, или абстрактные сущности разрабатываются проектировщиком базы данных для физической поддержки общей логической модели. Выделим базовые сущности рассматриваемой предметной области и опишем их атрибуты. Авторы (Authors) – это создатели произведений живописи, графики или фотографий. Атрибутами сущности являются: а) код автора (Author Code); б) фамилия автора (Author Family Name); в) имя автора (Author First Name); г) отчество автора (Author Father Name); д) дата рождения автора (Author Birthdate); е) дата смерти автора (Author Deathdate); ж) код страны проживания автора (Country Code); з) место проживания автора (Author Place). Произведения (Creations) – это картины на бытовые и исторические темы, пейзажи, портреты, натюрморты, панно, панорамы, настенные росписи, гравюры, литографии, эстампы и художественные фотографии. Атрибутами сущности являются: а) код произведения (Creation Code); б) название произведения (Creation Name); в) код жанра (Genere Code); г) код средства создания (Tools Code); д) код автора (Author Code); е) дата создания (Creation Date); ж) код страны (Country Code); з) код места нахождения (Placement Code); и) цена (Price). Жанры (Generes) – это исторически сложившиеся внутренние подразделения во всех видах изобразительного искусства или фотографии. Атрибутами сущности являются: а) код жанра (Genere Code); 7
б) название жанра (Genere Name). Средства создания (Tools) – это наборы инструментов, приборов, красок и носителей, используемых для создания произведения живописи, графики или фотографий. Атрибутами сущности являются: а) код средств создания (Tools Code); б) описание средств создания (Tools Description). Страны (Countries) – это государства, на территории которых хранятся, выставляются или продаются произведения живописи, графики и фотографии. Атрибутами сущности являются: а) код страны (Country Code); б) название страны (Country Name). Места нахождения (Placements) – это места, где хранятся, выставляются или продаются произведения живописи, графики и фотографии. Атрибутами сущности являются: а) код места нахождения (Placement Code); б) название места нахождения (Placement Name).
Объекты реального мира, помимо непосредственных, прямых связей, имеют друг с другом иные, более сложные причинно-следственные связи. Эти связи и процессы должны каким-то образом отражаться в базе данных, если мы имеем в виду не статичное хранилище, а информационную модель части реального мира. Иными словами, в базе, помимо собственно данных и непосредственных связей между ними, должны храниться знания о данных, а она сама должна адекватно отражать процессы, происходящие в реальном мире. Следовательно, необходимо иметь средства хранения и управления такой информацией. Данные требования выливаются в решение следующих задач: а) необходимо, чтобы база данных в любой момент времени правильно отражала состояние предметной области – данные должны быть взаимно непротиворечивыми; б) база данных должна отражать правила предметной области, законы, по которым она функционирует (business rules); в) необходим постоянный контроль состояния базы данных, отслеживание всех изменений, и адекватная реакция на них; г) необходимо, чтобы возникновение некоторой ситуации в базе данных четко и оперативно влияло на ход выполнения прикладной программы, поэтому многие программы требуют оперативного оповещения о всех происходящих в базе изменениях. По способу установления связей между сущностями различают три модели: 1) Иерархическая модель данных представляет собой дерево, вершинами которого являются сущности, а дугами – отношения между ними. Достоинством этой модели данных является высокая эффективность. Недостатками являются отсутствие строгой математической основы; неоднородность структуры; 8
неполнота представления, так как не любую предметную область можно представить деревом; асимметрия отношений между сущностями и сложность реорганизации структуры данных. 2) Сетевая модель данных – это модель в виде графа произвольного вида, т.е. в виде совокупности поименных узлов, связанных произвольным образом поименными дугами. Узлами являются сущности, а дугами – разнообразные отношения между этими сущностями. Достоинствами сетевой модели являются адекватность представления предметной области и равноправие между данными (симметрия). Недостатки – это сложность, неоднородность структуры, отсутствие строгой математической основы, невысокая эффективность и сложная процедура реорганизации такой модели. 3) Реляционная модель данных – совокупность n-арных отношений, каждая из которых представляет соответствующую сущность предметной области. Имеется строгая математическая основа – реляционная алгебра (исчисление). Данные в отношениях (атрибуты) являются равноправными, и любые отношения легко реорганизовывать. Модель данных имеет много достоинств: простота, однородность, полнота представления предметной области. Недостатком такой модели является низкая эффективность вследствие разобщенности семантически взаимосвязанных данных. Для разработки базы данных выбираем реляционную модель данных ввиду ее широкой популярности. Реляционная модель для анализируемой предметной области представлена на рисунке 1. На физическом уровне отношения представляются таблицами, атрибуты ⎯ столбцами, а наборы значений атрибутов (кортежи) ⎯ строками. Таблица должна иметь уникальное в пределах базы данных имя, оно называет сущность предметной области, а каждая строка конкретный объект; столбец – совокупность значений конкретного атрибута рассматриваемых объектов. Эти значения выбираются из множества допустимых значений – домена. Каждый столбец имеет имя, уникальное в пределах таблицы. В отличие от полей строки не имеют имен, количество строк в таблице логически не ограничено. Любая таблица должна иметь один или несколько столбцов, значение которых однозначно идентифицируют каждую ее строку. Столбец или их комбинация, обладающая таким свойством, называется первичным ключом. Таким образом, он должен обладать свойством уникальности, другим его свойством должна быть минимальность, когда ни один из входящих в ключ столбцов не может быть исключен из него без нарушения свойства уникальности. Для поддержания связей между таблицами используются внешние ключи, когда в данной таблице используются поля, являющиеся первичными ключами для другой таблицы. 9
Рисунок 1 ─ Реляционная модель данных предметной области 10
Основные требования при физической реализации реляционной базы данных таковы: а) каждая таблица должна иметь уникальное в базе данных имя и состоять из однотипных строк; б) каждая таблица должна состоять из фиксированного числа столбцов и простых (не составных) значений в каждом столбце; в) ни в какой момент времени в таблице не должно быть двух строк, дублирующих друг друга; строки должны отличаться хотя бы одним значением, чтобы была возможность однозначно идентифицировать любую строку таблицы; г) каждому столбцу должно быть присвоено уникальное имя; д) полное информационное содержание базы данных должно быть представлено в виде явных значений самих данных и только таким образом, а не использованием указателей или ссылок; е) при обработке данных должно быть обеспечено свободное обращение к любой строке и столбцу. Для этих целей используется формальный аппарат ограничений на формирование таблиц. Этот аппарат называется нормализацией таблиц. Имеется несколько уровней нормализации: а) таблица находится в первой нормальной форме, когда она не содержит повторяющихся полей и составных значений полей; б) таблица находится во второй нормальной форме, когда она удовлетворяет требованиям первой нормальной формы и все ее поля, не входящие в первичный ключ, связаны полной функциональной зависимостью с первичным ключом; в) таблица находится в третьей нормальной форме, когда она удовлетворяет требованиям второй нормальной формы и ни одно из ее не ключевых полей функционально не зависит от любого другого не ключевого поля. Это объясняет независимые изменения любого не ключевого поля.
11
1.2 Анализ информационных задач и круга пользователей системы Информационная система создаётся для обслуживания художников, фотографов, журналистов, а также менеджеров и других сотрудников компаний, занимающихся хранением, выставками и продажей произведением живописи, графики и фотографий, представляющих художественную ценность. База данных должна содержать сведения об авторах произведений живописи и графики, фотографах, о жанре произведений искусства и средствах их создания, а также о месте и стране, где хранится или выставляется произведение. Графический интерфейс должен предоставлять максимум удобств для всех категорий пользователей этой системы. Сценарий ее работы представлен на рисунке 2. Информационная система должна решать следующие задачи: а) ставить на учет места хранения представляющие художественную ценность произведения живописи и графики, а также фотографии известных авторов; б) отслеживать перемещения произведений, вызванные сменой владельца, участием на выставке или аукционе; в) регулярно производить переоценку произведений; г) дополнять базу данных по мере создания новых произведений; д) отображать в удобном для пользователя виде сведения об авторах и их произведениях; е) обеспечивать строгую фильтрацию данных при их вводе; ж) предотвращать случайную потерю хранящихся сведений; з) производить обновление сведений; и) производить корректировку неточных сведений, хранящихся в базе; к) обеспечивать целостность и непротиворечивость данных в системе; л) после обновления базы данных осуществлять ее копирование на надежные носители информации; м) содержать на языке Transact-SQL сценарии для создания базы данных, всех ее объектов и ввода учтенных сведений об авторах и их произведениях; н) поддерживать по Интернет контакты с заинтересованными фирмами, группами и физическими лицами; о) составлять и отправлять отчеты во все инстанции, откуда поступил запрос на получение сведений о состоянии учетного фонда произведений; п) обеспечивать электронной документацией по работе и обслуживанию информационной системы.
12
1.3 Выработка требований и ограничений для системы В соответствии с характером предметной области, целью и задачами проектируемой информационной системы определяются следующие требования и ограничения: а) каждое произведение хранится только в одном месте; б) один автор может иметь несколько произведений, хранящихся в нескольких местах; в) цена произведений может изменяться со временем; г) данные об авторах и их произведениях предоставляются системе и хранятся только на русском языке; д) при вводе данных производится их контроль на наличие недопустимых символов; ж) произведения могут перемещаться в другие страны и места в связи со сменой владельца или участием в выставках и аукционах; з) для дат задается лишь верхняя грань, так как допустимая нижняя грань может быть только годом 1753 ⎯ годом принятия Григорианского календаря, причем задание верхней грани производится в канун Нового года; к) при использовании управляющих символов шаблона в качестве обычных следует использовать ключевое слово ESCAPE; л) некоторые данные об авторах и их произведениях могут отсутствовать.
13
Рисунок 2 ─ Сценарий работы информационной системы
14
2 Выбор инструментальных средств для проектирования и реализации информационной системы 2.1 Выбор инструментальных средств для проектирования и реализации базы данных Язык структурных запросов Transact-SQL и система управления базами данных Microsoft SQL Server, встроенные в визуальную объектноориентированную студию разработки Visual Studio.NET, позволяют создавать локальные, удаленные и распределенные базы данных и графический интерфейс для их проектирования, тестирования и использования. Студия обеспечивает также применение современных языков программирования для создания разнообразных приложений и информационных систем. Именно эти средства выбираются для физической реализации проектируемой базы данных. Система программирования SQL Server относится к классу командноинтерпретирующих систем сверхвысокого уровня. Единицами действий системы являются команды, исполняемые в режиме интерпретации сразу же по мере их поступления в сервер. Основой этой системы программирования является проблемно-ориентированный структурированный язык запросов Transact-SQL (Transaction Structured Query Language), который расширяет и развивает возможности стандарта языка ANSI SQL-92. Язык Transact-SQL включает следующие средства: данные различного типа баз данных и переменных; константы, стандартные и ограниченные идентификаторы; арифметические и логические выражения, включающие константы, переменные, имена столбцов таблиц, функции, подзапросы и условные выражения, а также выражения, взятые в круглые скобки; команды для создания, изменения и удаления баз данных и их объектов, а также для определения запросов на ввод, обработку и извлечение данных; управляющие программные структуры, определяющие условия и порядок выполнения команд в заданной последовательности или пакете команд; встроенные (системные) и определяемые пользователем функции; встроенные (системные) и определяемые пользователем хранимые процедуры. В системе могут храниться, помимо функций и процедур, последовательности (пакеты) команд, которые называются скриптами. Если скрипт описывает процесс создания базы данных или каких-либо ее объектов, то такой скрипт называется сценарием. Сценарии позволяют переносить структуру базы данных от одного сервера к другому, а также структуру таблиц и других объектов в различные базы данных. Скрипты хранятся в текстовых файлах. Функции и хранимые процедуры баз данных позволяют уменьшить объем запросов, передаваемых от клиента к серверу, что повышает общую производительность системы. Наличие исходного кода для этих объектов упрощают сопровождение программных комплексов и внесение изменений в них.
15
В языке Transact-SQL существует несколько способов передачи данных между командами. Одним из таких способов является передача данных через локальные переменные, объявляемые следующим образом: DECLARE {@имя локальной переменной тип данных}[,…n] Таким образом, знак @ является признаком имени локальной переменной. Этот же знак используется для определения имен параметров функций и хранимых процедур. Часть синтаксиса [,…n]означает повторение синтаксической конструкции, взятой в фигурные скобки. Примеры объявлений: DECLARE @Ivar int, DECLARE @IBit bit Значения переменным можно присвоить с помощью команд SET и SELECT. Командой SET можно присвоить значение только одной переменной: SET @Ivar = 5 SET @IBit = 0 Для присваивания значений нескольким переменным, вычисляемых с помощью выражений, следует использовать команду SELECT, которая выводит результаты в окно Grids: SELECT @Ivar = SUM (price) FROM titles _ _ см. окно Result. Для вывода значений переменных следует использовать ту же команду SELECT.
16
2.2 Выбор инструментальных средств для проектирования и реализации клиентского приложения .NET Framework — это платформа для построения и исполнения приложений. Ее основные компоненты — общеязыковая исполняющая среда (Common Language Runtime CLR) и библиотека классов .NET Framework (FCL). CLR абстрагирует сервисы ОС и служит механизмом для исполнения управляемых приложений (Managed Applications), любое действие которых должно получить одобрение со стороны CLR. FCL предоставляет объектноориентированный API, к которому обращаются управляемые приложения. При написании приложений для .NET Framework нет необходимости использовать Windows API, MFC, ATL, COM и другие инструменты и технологии. Каждый байт кода, написанный для этой инфраструктуры, либо исполняется CLR, либо получает ее разрешение на исполнение за ее пределами. Ничто не происходит без участия CLR. Программа CLR расположена поверх ОС и предоставляет виртуальную среду для управляемых приложений. При запуске управляемой программы CLR загружает содержащий ее модуль и исполняет его код. Код, предназначенный для CLR, называется управляемым кодом и состоит из команд псевдомашинного языка — общего промежуточного языка (Common Intermediate Language CIL). Команды CIL компилируются в машинный код (обычно код процессора x86) по запросу (just-in-time) в период выполнения. Обычно компиляция любого метода происходит лишь раз — при первом его вызове, и затем результат компиляции кэшируется в памяти, чтобы при повторном вызове он мог быть исполнен без задержки. Код, который никогда не вызывается, никогда и не компилируется. Хотя компиляция по запросу, несомненно, снижает производительность, эти накладные расходы компенсируются тем, что на протяжении исполнения приложения каждый метод компилируется не более раза, а также огромными усилиями разработчиков программы CLR сделать JIT-компилятор как можно быстрее и эффективнее. Выбор языка для среды CLR программирования становится практически вопросом личных предпочтений. «Общеязыковая» в словосочетании «общеязыковая исполняющая среда» указывает на то, что CLR безразлична к языкам программирования. В других средах язык, на котором написано приложение, неизбежно влияет на структуру и работу последнего. Так, в программе на Visual Basic сложно запускать новые потоки. Хуже того, современные языки, такие как Visual Basic и Visual C++, используют разные API, и поэтому знания, приобретенные вами при написании Windows-программ на Visual Basic, будут стоить весьма немного, когда потребуется написать DLL на C++. .NET Framework все меняет. Язык — это просто синтаксическое устройство для генерации CIL и за немногочисленными исключениями все, что 17
можно сделать на одном языке, возможно и на всех остальных. Более того, независимо от языка, на котором они написаны, все управляемые приложения используют один и тот же интерфейс прикладного программирования: API библиотеки классов .NET Framework. Перенос приложения Visual Basic на Visual C++ лишь немногим проще написания приложения с нуля. В то же время перенос приложения Visual Basic .NET на языке С# (или наоборот) гораздо проще. В прошлом несовершенство инструментов для преобразования программ из одного языка в другой делало их практически бесполезными. Визуальная объектно-ориентированная среда программирования Visual Studio 2005 и язык C# предоставляют полный набор указанных возможностей и позволяют быстро, эффективно и надежно реализовать все требования для клиентского приложения информационной системы.
18
3 Проектирование и реализация базы данных системы 3.1 Создание проектов и баз данных в среде Microsoft Visual Studio В среде Microsoft Visual Studio работа по созданию баз данных начинается с построения специального проекта типа Database, который выбирается в окне, открывающемся после исполнения команды среды File/New/Project. В приложении А приведены порядок построения проекта базы данных, автоматически создаваемые при этом папки и файлы, а также содержимое текстовых файлов для разрабатываемой информационной системы. Назначение папок и файлов вновь созданного проекта базы данных следующее (см. рисунки 3 и 4): а) Solution ‘MakurinDatabaseProject’ ⎯ папка решений проекта; б) папка MakurinDatabaseProject ⎯ для проектных файлов базы данных с расширениями *.sln, *.dbp, *.mdf и *.ldf; г) папка Change Scripts ⎯ для сценариев изменения базы данных и ее объектов, содержащая файлы с расширением *.sql; д) папка Create Scripts ⎯ для автоматически генерируемых сценариев построения объектов, созданных визуально и содержащая файлы с системными именами и расширением *.sql е) папка Queries ⎯ для построения запросов пользователя, содержащая файлы с расширением *.sql; ж) текстовый XML-файл MakurinDatabaseProject.sln ⎯ для описания решений проекта; з) текстовый XML-файл MakurinDatabaseProject.dbp ⎯ для описания папок и файлов проекта; и) основной двоичный файл MakurinDatabase.mdf ⎯ для хранения данных базы и сведений об ее объектах; к) двоичный файл MakurinDatabase_log.ldf ⎯ для журнала транзакций. Затем в этот проект могут быть добавлены в неограниченном количестве новые базы данных, папки, любые файлы и даже существующие проекты (см. разделы 4.2 и 6, а также приложение И). Новая пользовательская база данных создается с помощью той же команды File/New/Project… среды Microsoft Visual Studio.NET или SQL-командой CREATE DATABASE. В любом случае для создания базы данных и для ее обслуживания нужно иметь соответствующие права. По умолчанию такими правами обладают члены фиксированных ролей сервера sysadmin и dbcreator. При необходимости такие права можно предоставить и другим пользователям. Лицо, создающее базу данных, автоматически становится ее владельцем. Имя базы данных должно точно отражать ее назначение и создаваться по правилам построения системных идентификаторов. Длина имени не более 128 символов. При создании базы данных могут использоваться файлы трех типов: первичный (один), вторичный (ни одного или несколько) и для журнала 19
транзакций (один, причем если он не указан, то система создает его автоматически). Для удобства обслуживания и для повышения эффективности работы базы данных можно использовать группы файлов в качестве первичных, вторичных и для журнала транзакций. И при использовании групп первичный файл только один. Определив логическую структуру файлов и их имена, необходимо определить их физические характеристики: первоначальный размер, максимальный размер и приращение, если для файла предусматривается его рост по мере накопления данных. Приращение задается в мегабайтах. Затем следует указать папки и устройства, где наиболее целесообразно разместить файлы. Для обеспечения распараллеливания операций ввода-вывода файлы одной группы желательно размещать на различных устройствах. Для обеспечения максимальной защищенности от копирования информации соответствующие файлы данных следует размещать на не форматированных (сырых) разделах, которые создаются утилитой fdisk.exe MS-DOS. На таких разделах не существует файловой системы FAT или NTFS, и созданный сервером файл не доступен операционной системе. При работе системы необходимо следить за наличием свободного пространства в базе данных пользователя и в системной базе tempdb, при необходимости добавляя в них новые файлы. Эта возможность обеспечивается сервером SQL Server 2005.
Рисунок 3 ⎯ Состояние сервера после создания проектируемой базы данных 20
Рисунок 4 ⎯ Папки и файлы проекта созданной базы данных Помимо файлов при создании базы данных можно задать сопоставление знаков, которое будет использоваться при сортировках в этой базе по умолчанию. Если сопоставление не задать, тогда будет действовать сопоставление, указанное при установке сервера. Параметр FOR LOAD оставлен для обратной совместимости со старыми версиями. В процессе эксплуатации созданной базы данных возникает необходимость изменить либо физические параметры, либо логическую структуру этой базы. К управлению базой данных на физическом уровне относится вся работа по изменению имен, размера, количества, положения файлов базы данных, усечению базы данных и журнала транзакций, созданию групп файлов, изменению группы файлов по умолчанию, изменению имени и владельца базы данных. Большинство действий по изменению конфигурации базы данных выполняется с помощью команды ALTER DATABASE. Для уменьшения размера базы данных можно также использовать команды DBCC SHRINKDATABASE , DBCC SHRINKFILE и системная хранимая процедура sp_dboption. На логическом уровне изменяются такие параметры, как выполнение автоматического усечения журнала транзакций, автоматическое создание и обновление статистики, возможность выполнения вложенных триггеров и т.п. – всего 22 параметра. Изменять эти параметры можно командой ALTER DATABASE с параметром SET и процедурой sp_dboption. Сервер позволяет отсоединять (sp_detach) и присоединять (sp_attach_db) до 32767 баз данных, изменять владельца (sp_changedbowner), просматривать свойства (sp_dboption и DATABASEPROPERTY), получать справки (sp_helpdb) и т.д. В качестве примера создадим базу данных для учета продаж с именем Sales, используя один файл данных с именем Sales_dat и один файл для журнала транзакций с именем Sales_log, расположив их в папке, определяемой 21
спецификацией «D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. по СУБД\Учебные базы данных». Физические характеристики файлов таковы: Физическая характеристика Максимальный размер файла Приращение
Sales_dat 50 5
Sales_log 25 5
Одним из вариантов реализации этого задания с использованием языка TransactSQL может быть такой: USE master GO
-- эта системная база необходима при создании;
CREATE DATABASE Sales ON (NAME = Sales_dat, FILENAME = ‘D:\КУРСОВОЙ ПРОЕКТ СТУДЕНТА ГРУППЫ 07ВП1 МАКУРИНА Ю.Д. ПО СУБД\УЧЕБНЫЕ БАЗЫ ДАННЫХ\SALES_DAT.MDF’, SIZE = 10,
-- единица по умолчанию «МВ»;
MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON (NAME = Sales_log, FILENAME = ‘D:\КУРСОВОЙ ПРОЕКТ СТУДЕНТА ГРУППЫ 07ВП1 МАКУРИНА Ю.Д. ПО СУБД\УЧЕБНЫЕ БАЗЫ ДАННЫХ\SALES_LOG.LDF’, SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) GO В приложении Б, помимо рассмотренного, приведено еще несколько вариантов размещения баз данных на файлах и их группах: с использованием трех файлов данных и двух файлов для журнала транзакций; с указанием только файла данных; с указанием только имени и без задания первичного файла и файла журнала транзакций; с указанием только места расположения первичного файла; с использованием трех групп файлов, обычно размещаемых на различных устройствах для повышения производительности системы. Экранные формы приложения Б определяют также последовательность действий при создании и подключении указанных учебных баз. 22
3.2 Проектирование и реализация таблиц Данные баз данных хранятся в таблицах. Таблица представляет собой совокупность столбцов, в которых хранятся атрибуты объектов предметной области. Все значения атрибутов какого-либо объекта образуют строку. Любая пользовательская таблица создается либо командой Transact-SQL CREATE TABLE, либо с помощью конструктора среды Microsoft Visual Studio 2005. И в том, и в другом случае необходимо задать имя таблицы, перечислить имена столбцов, задать тип данных для каждого столбца, упорядоченность символов для сортировки символьных данных, значения по умолчанию, а также ограничения на столбцы или таблицу в целом. Основные системные типы данных для таблиц и виды ограничений в языке Transact-SQL таковы: BINARY(n) – двоичные данные фиксированной длины до 8000 байт; для n байтов выделяется n+4 байта памяти; значения задаются с помощью 16-ичных чисел 0x<шестнадцатеричные цифры>; функция DATALENGTH позволяет определить длину поля в байтах; дополнение нулевыми байтами производится справа. IMAGE – двоичные данные длиной до 231 – 1; место выделяется в виде цепочки страниц. CHAR(n) – строковый тип данных фиксированной длины без поддержки Unicode длиной до 8000 байтов; данные зависят от установленной кодовой страницы; если для столбца не задана опция NULL, то строка при необходимости будет дополняться справа пробелами; если эта опция задана, то дополнение пробелами будет иметь место при условии ANSI_PADDING=ON, в противном случае пробелы добавляться не будут. VARCHAR(n) – строковый тип, как и CHAR(n), но не с фиксированной длиной; если ANSI_PADDING=OFF, то будет выполняться удаление конечных пробелов, если ANSI_PADDING=ON, то удаление пробелов производиться не будет. NCHAR(n) – строковый тип как и char(n), но с поддержкой Unicode, поэтому максимальное количество символов составляет 4000; в этом случае для строковых констант надо задавать впереди букву N: N’ABC’. NVARCHAR(n) – строковый тип, как VARCHAR(n), но с поддержкой Unicode. TEXT – строковый тип без поддержки Unicode длиной до 2 Гбайт; память выделяется страницами по 8 Кбайт, связываемыми в цепочку; можно использовать встроенные функции: DATALENGTH, PATINDEX, SUBSTRING, TEXTPTR, TEXTVALID, READTEXT, SETTEXTSIZE, UPDATETEXT, WRITETEXT. NTEXT – строковый тип как и text, но с поддержкой Unicode, поэтому длина строки не более 1 Гбайта. INT – целый тип длиной в 4 байта и с диапазоном от –231 до 231-1. SMALLINT – целый тип длиной в 2 байта с диапазоном от –215 до 215-1. TINYINT – целый тип длиной в 1 байт и диапазоном от 0 до 255. 23
BIGINT – целый тип длиной в 8 байт и с диапазоном от -263 до 263-1. DECIMAL[(p[,s])] – десятичный двоично-кодированный тип с p десятичными разрядами, из которых s – дробных; максимальное значение p достигает 38, поэтому диапазон значений составляет от –(1038-1) до 1038-1. Numeric[(p[,s])] – тип, аналогичный типу decimal[(p[,s])]. FLOAT[(n)] – плавающий (приблизительный) тип длиной в 4 байта и с диапазоном от –1.79x10308 до 1.79x10308; значение n определяет количество бит для хранения мантиссы и может принимать значения от 1 до 53. REAL – плавающий тип, являющийся аналогом float(240). DATETIME – тип данных для хранения даты (4 первых байта) и времени (4 последних байта) в диапазоне от 1.1.1753 и до 31.12.9999 года; дата хранится в виде смещения относительно базовой даты 1.1.1753, а время является количеством миллисекунд после полуночи; формат для пользователя: MMM DD YYYY hh:mm. SMALLDATETIME – тип данных для хранения даты (первых 2 байта) и времени (последние 2 байта) в диапазоне от 1.1.1900г. до 6.6.2079г., время задается с точностью до минуты. MONEY – тип данных для хранения больших денежных величин с точностью до 4 знаков после запятой в диапазоне от –922 337 203 685 477.5808 до +922 337 203 685 477.5807; для хранения данных отводится 8 байт. SMALLMONEY – тип данных для хранения нормальных денежных величин с точностью до 4 знаков после запятой в диапазоне от –214 748.3648 до 214 748.3647; для хранения данных отводится 4 байта. BIT – битовый (логический) тип со значениями 0 и 1; для хранения выделяется 1 разряд байта памяти. TIMESTAMP – временный штамп для учета числа изменений данных в записи (версий строки row version); значение timestamp уникально в пределах базы данных и позволяет идентифицировать конкретное значение записи; тип аналогичен binary(8), если хранение NULL не разрешено и varbinary(8), если разрешено. UNIQUEIDENTIFIER – тип данных для хранения глобальных уникальных идентификаторов длиной в 16 байт, генерируемых функций NEWID и используемых для идентификации строк (записей); при генерации используется номер сетевой карты компьютера и текущее время. SYSNAME – тип данных для хранения имен объектов базы данных; аналог nvarchar (128). SQL_VARIANT –вариантный тип данных для хранения данных любого типа, кроме TEXT, NTEXT, IMAGE, TIMESTAMP; для получения информации о природе хранимых данных используется функция SQL_VARIANT_PROPERTY(). TABLE – тип таблицы для временного хранения наборов данных с использованием переменных.
24
При открытии папки Tables базы данных в окне Server Explorer появляется список таблиц со следующими атрибутами: имя таблицы, владелец (обычно владелец базы данных data base owner-dbo), тип (пользовательская или системная) и дата создания таблицы. Для просмотра самой таблицы следует дважды щелкнуть по ней или в ее контекстном меню исполнить команду Properties. В открывшемся окне представлены все свойства таблицы и ее столбцов. Кнопка Permission позволяет просмотреть и отредактировать права доступа к таблице: SELECT, INSERT, UPDATE, DELETE, EXES и DRI. Щелкнув по столбцу таблицы, можно просмотреть и отредактировать права доступа к столбцу. Если установлена на сервере служба MSSearch, то с помощью вкладки Full-text Indexing можно отредактировать параметры этой службы. При проектировании таблиц часто бывает необходимо обеспечить автоматическое генерирование уникальных значений. Для этих целей можно использовать один из следующих способов: а) для столбца задать ограничение целостности IDENTITY с двумя параметрами: начальное значение и шаг приращения; это обеспечит автоматическое создание нового значения при каждой очередной вставке строки; б) использовать столбцы со свойством timestamp, которое обеспечит для столбца генерирование значений, уникальных в пределах базы данных; в) задать для столбца свойство ROWQUIDCOL, что обеспечит генерирование для каждой новой строки глобального уникального идентификатора, занимающего 16 байт. Изменить структуру таблицы можно либо с помощью команды ALTER TABLE, либо с помощью Server Explorer, при этом следует соблюдать ряд ограничений: нельзя удалять столбцы с типом данных IMAGE, TEXT, NTEXT, TIMESTAMP, ROWQUIDCOL, вычисляемые столбцы, индексные столбцы и т.д. Командой DELETE TABLE и той же утилитой можно удалить любую таблицу. Но прежде, чем это сделать, необходимо удалить все объекты базы данных, которые ссылаются на данную таблицу, либо изменить их таким образом, чтобы они не ссылались на удаляемую таблицу. Для удаления таблицы средствами утилиты Server Explorer необходимо в контекстном меню таблицы, которую надо удалить, исполнить команду Delete, убедиться, что удаляемая таблица не имеет связей с какими-либо другими объектами базы данных, и затем удалить таблицу. Ограничения целостности Constraint представляют собой механизм, обеспечивающий автоматический контроль соответствия данных установленным условиям, или ограничениям целостности. Ограничения целостности имеют приоритет над триггерами, правилами и значениями по умолчанию. Имеется пять ограничений целостности, различающихся по функциональности и области применения: NULL – действует на уровне столбца и пользовательского типа данных и либо разрешает (NULL), либо запрещает (NOT NULL) хранение значений NULL. CHECK – действует на уровне столбца и ограничивает диапазон значений, которые могут быть сохранены в столбце, путем проверки логического условия 25
для вводимых данных. При вводе или изменении данных вводимое значение подставляется в условие. Если полученный результат TRUE, то изменения данных принимаются, иначе – отвергаются и генерируется сообщение об ошибке. Для одного столбца можно задать несколько ограничений типа CHECK (проверок): CONSTRAINT human_avance CHECK (human_ avance BEETWEEN 0 and 700)). UNIQUE (AK) – действует на уровне столбца и гарантирует уникальность в столбце вводимых значений. В отличии от ограничения PRIMARY KEY, это ограничение допускает хранение значений NULL. PRIMARY KEY (PK) – действует на уровне столбца или таблицы и гарантирует уникальность в пределах таблицы первичного ключа, состоящего из одного или нескольких столбцов. Ни для одного из столбцов ключа не должно быть установлено свойство NULL. Когда используется один столбец, то для него необходимо также задать и свойство UNIQUE. В таблице создается только один первичный ключ. При его выборе надо учитывать требования удобства и функциональности. FOREIGN KEY (FK) – действует на уровне таблицы и связывается с одним из кандидатов на первичный ключ в другой таблице. Таблица, в которой определен внешний ключ с помощью этого ограничения, называется зависимой, а таблица с кандидатом на первичный ключ – главной. В зависимую таблицу нельзя вставить строку, если внешний ключ не имеет соответствующего значения в главной таблице. Из главной таблицы нельзя удалить строку, если с ней связана хотя бы одна строка в зависимой таблице. Формат задания ограничения таков: FOREIGN KEY REFERENCES Имя главной таблицы (Первичный или альтернативный ключ) Умолчание Default представляет собой значение, которое будет присвоено элементу столбца таблицы при вставке строки (записи), если в команде вставки явно не указано значение для этого столбца. Умолчаниями могут быть константы, а также встроенные функции и математические выражения, возвращающие конкретные значения. Имя умолчания должно быть уникально для владельца. Рекомендуется задавать значения по умолчанию для столбцов таблицы с помощью команд CREATE TABLE и ALTER TABLE, а также проверять, не конфликтует ли созданное умолчание с правилом для соответствующего столбца. Если для столбца разрешено хранение значения NULL и определено значение по умолчанию, то при вставке строки будет использовано значение по умолчанию. Умолчание может быть создано только в текущей базе данных. Задание имени владельца не обязательно. Создание умолчания выполняется командой CREATE DEFAULT, а его удаление ⎯ командой DROP DEFAULT. Примеры команд для создания трех таблиц: CREATE TABLE jobs --Работы (job_id smallint IDENTITY (1,1) PRIMARY KEY CLUSTERED, job_desc varchar(50) NOT NULL 26
min_lul tinyint max_lul tinyint )
DEFAULT 'New Position – title not formalized jet', NOT NULL CHECK(min_lul > = 10), NOT NULL CHECK(max_lul < = 250)
CREATE TABLE publishers (pub_id char(4) NOT NULL CONSTRAINT PKL_pub_id PRIMARY KEY CLUSTERED CHECK(pub_id IN ('1389', '0736', '0877', '1622', '1756') OR pub_id LIKE '99[0-9][0-9]'), pub_name varchar(40) NULL, city varchar(20) NULL, state char(2) NULL, country varchar(30) NULL DEFAULT('USA') ) CREATE TABLE employee (emp_id varchar(20) CONSTRAINT UPK_emp_id PRIMARY KEY NONCLUSTERED CONSTRAINT CK_emp_id CHECK(emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][0-9][FM]'), fname varchar(20) NOT NULL, minit char(1) NULL, lname varchar(30) NOT NULL, job_id smallint NOT NULL DEFAULT (1) REFERENCES jobs(job_id), job_lul tinyint DEFAULT (10), pub_id char(4) NOT NULL DEFAULT('9952') REFERENCES publishers(pub_id), hire_date datetime NOT NULL DEFAULT(GETDATE()) ) GO
27
Таблица 1. Описание колонок для атрибутов сущности «Авторы»
Код автора
Тип данных int
Фамилия автора
char
20
Имя автора
char
20
Отчество автора
char
20
Дата рождения
datetime
8
Дата смерти
datetime
8
Код страны
int
4
CK_Country_Code: 1:99
NOT NULL
Место проживания
char
100
CK_Author_Place: А-я и «.,/ (:)ESCAPE-»
NOT NULL
Название столбца
Размер 4
Обозначение и вид ограничения CK_Author_Code: 1-99 CK_Author_Family_Name: А-Я и а-я CK_Author_First_Name: А-Я и а-я CK_Author_Father_Name: А-Я и а-я CK_Author_Birthdate: 01.01.1753-01.01.2010 CK_ Author_Deathdate: 01.01.1753-01.01.2010
NULL/NOT NULL NOT NULL
Вид ключа PK
NOT NULL
АК
NULL NULL NULL NULL FK
Таблица 2. Описание колонок для атрибутов сущности «Произведения» Название столбца
Тип данных
Размер
Обозначение и вид ограничения
NULL/NOT NULL
Вид ключа
4
CK_Creation_Code: 1-99
NOT NULL
PK
100
CK_Creation_Name: А-Я, а-я и «.(,)»
NOT NULL
АК
Код произведения
int
Название произведения
char
Код жанра
int
4
CK_Creation_Genere_Code: 1-99
NOT NULL
FK
Код средства создаint ния
4
CK_ Creation_Tools_Code: 1-99
NOT NULL
FK
Код автора
int
4
CK_Creation_Author_Code: 1-99
NOT NULL
FK
Дата создания
datetime
8
CK_Creation_Date: 01.01.1753-01.01.2010
Код страны
int
4
CK_ Creation_Country_Code: 1:99
NOT NULL
FK
Код места нахождения
int
4
CK_Creation_Placemtnt_Code: 1-99
NOT NULL
FK
Цена
real
4
CK_Price: 1-99999999 28
NULL
NULL
Таблица 3. Описание колонок для атрибутов сущности «Жанры» Название столбца
Тип данных
Код жанра
int
Название жанра
char
Размер
Обозначение и вид ограничения
NULL/NOT NULL
Вид ключа
4
CK_Genere_Code: 1-99
NOT NULL
PK
100
CK_ Genere _Name: А-Я и а-я
NOT NULL
Таблица 4. Описание колонок для атрибутов сущности «Средства создания» Название столбца
Тип данных
Код средств создания
int
Описание средств создания
char
Размер
Обозначение и вид ограничения
NULL/NOT NULL
Вид ключа
4
CK_Tools_Code: 1-99
NOT NULL
PK
100
CK_ Tools _Description: А-Я, а-я и «,»
NOT NULL
Таблица 5. Описание колонок для атрибутов сущности «Страны» Название столбца
Тип данных
Код страны
int
Название страны
char
Размер
Обозначение и вид ограничения
NULL/NOT NULL
Вид ключа
4
CK_Country_Code: 1-99
NOT NULL
PK
100
CK_ Country _Name: А-Я и а-я
NOT NULL
Таблица 6. Описание колонок для атрибутов сущности «Места нахождения» Название столбца
Тип данных
Код места нахождеint ния
Размер
Обозначение ограничения
NULL/NOT Вид ключа NULL
4
CK_Placement_Code: 1-99
NOT NULL
CK_ Placement _Name: Название места нахождения
char
А-Я, а-я и
100
« ,/,(.):;ESCAPE-» 29
NOT NULL
PK
Рисунок 5 ─ Диаграмма таблиц базы данных В приложении В приведена экранная форма после выполнения сценариев для таблиц jobs, publishers и employee. Описание колонок таблиц, представляющих сущности предметной области, содержатся в таблицах 1 ─ 6. На рисунке 5 представлена диаграмма таблиц проектируемой базы данных. Сценарии для создания всех таблиц также находятся в приложении В. В среде Visual Studio создание таблицы выполняется с помощью окна Add New Table (см. рисунок 6), для открытия которого достаточно в контекстном 30
меню папки Tables выбрать команду Add New Table и щелкнуть правой клавишей мыши. Далее следует задать имя таблицы, имена столбцов, тип данных для каждого столбца, упорядоченность символов для сортировки символьных данных, значения по умолчанию, а также ограничения на столбцы или таблицу в целом.
Рисунок 6 ⎯ Окно Add New Table для создания таблицы Окно Add New Table разделено на две части. С помощью верхней части формируется набор столбцов, из которых будет состоять таблица, а также указываются их основополагающие свойства. Самая верхняя строка соответствует первому столбцу таблицы, вторая строка – второму столбцу и т.д. Порядок перечисления столбцов очень важен. При вставке и выборке данных без указания столбцов сервер будет обрабатывать значения именно в той последовательности, в которой они были перечислены при создании таблицы. Рассмотрим назначение колонок, с помощью которых указываются базовые характеристики столбцов: Column Name – для задания имени столбца; Data Type – для выбора типа данных в столбце с помощью раскрывающегося списка; Allow Nulls – установка флажка в этой колонке разрешает хранение значений NULL; если столбец входит в первичный ключ, то хранение значений NULL для него разрешить нельзя. С помощью верхней части окна создания таблицы можно также определить первичный ключ таблиц. Для этого достаточно выделить один или более столбцов, из которых должен состоять первичный ключ. Затем щелкнуть 31
правой клавишей мыши и в открывшемся контекстном меню выбрать команду Set Primary Key. После этого слева от каждого столбца, включенного в первичный ключ, будет отображаться символ ключ. Содержимое нижней части окна Add New Table зависит от того, какой столбец выбран в верхней части. Здесь можно задать дополнительные свойства столбца: Description – это текстовое поле предназначено для ввода краткого описания столбца, которое не используется системой; Default Value – для задания значения, которое будет присваиваться столбцу по умолчанию; Length – здесь отображается фиксированный или установленный пользователем размер выбранного типа данных; Precision – в этом поле указывается максимальное количество цифр, в том числе после запятой, которое можно хранить в столбце; Scale – используется совместно с предыдущим полем и предназначено для указания количества цифр после запятой, которое будет хранить десятичный тип данных; значение в этом поле не может превышать величины, указанной в предыдущем поле; Is Identity – если в данном раскрывающемся списке выбрано значение Yes, то соответствующий столбец будет сконфигурирован как столбец-счетчик, т.е. его значение будет увеличиваться при переходе на новую строку во время ввода данных; Formula – для построения формулы, с помощью которой будет формироваться значение столбца; Collation – поле доступно только для типов данных, предназначенных для хранения символьных и текстовых данных, так как с помощью него указывается сопоставление при сортировке, которое будет использоваться для столбца; по умолчанию предлагается применять то же сопоставление, что было выбрано для базы данных, в которой создается таблица (значение
). Поле Precision доступно только для нецелочисленных типов данных с фиксированной точностью, называемых десятичными (decimal). К этим типам данных относятся numeric и decimal. Для нецелочисленных (или приблизительных) типов данных с фиксированной точностью, также называемых приблизительными (approximate number), таких, как real и float, значение в этом поле (24 и 53 соответственно) доступно только для чтения. Аналогичная ситуация и с целочисленными типами данных (tinyint, smallint, int и bigint); Если в поле Formula задано выражение, то соответствующий столбец будет являться вычисляемым столбцом (computed columns). Формула может включать ссылки на столбцы, функции, а также константы, которые связываются в одно выражение с помощью различных операторов. Для вычисляемых столбцов, помимо формулы, разрешается указывать только имя столбца. Все остальные параметры, такие, как тип данных, значение по умолчанию, возможность хранения значений NULL, описание и другие, блокируются; 32
Если свойство Is Identity для столбца задано, то тогда в нижней части окна Add New Table становятся доступными три следующих поля: Identity Seed – в этом поле указывается начальное значение, которое будет использовано для автоматического генерирования значений для столбцасчетчика; Identity Increment – с помощью этого поля можно указать величину, на которую станет увеличиваться значение в столбце-счетчике при вставке новой строки; RowGuid – этот раскрывающийся список, доступный только для типа данных uniqueidentifier, содержит всего два значения – Yes и No. При выборе первого из них столбец конфигурируется в качестве уникального глобального идентификатора строки, что соответствует указанию ключевого слова rowguidcol при описании столбца в команде CREATE TABLE. Автоматически в поле Default Value подставляется значение newid(). Таким образом, при добавлении в таблицу новой строки в соответствующий столбец будет автоматически помешаться уникальное значение. Только один столбец в таблице может быть сконфигурирован как уникальный глобальный идентификатор строки. Тем не менее, можно создавать множество столбцов с типом данных uniqueidentifier и значением по умолчанию newid(). После того как будут заданы параметры всех столбцов, необходимо сохранить построенную таблицу. Для этого достаточно закрыть окно Add New Table. При этом будет выведено окно Choose Name, где надо задать имя таблицы. Далее следует определить в таблице ограничения целостности, проиндексировать те или иные столбцы, а также указать в какой группе файлов должна быть расположена таблица. После щелчка левой клавишей мыши по верхней части окна открывается новое окно для задания этих дополнительных свойств (см. рисунки 7 и 8). Задав эти свойства, необходимо подтвердить сделанные дополнения. Упрощенные команды для создания таблиц проектируемой базы данных имеют следующий вид: CREATE TABLE [dbo].[Жанры]( [Код жанра] [int] NOT NULL, [Название жанра] [char](100) NOT NULL, CONSTRAINT [PK_Жанры] PRIMARY KEY CLUSTERED ( [Код жанра] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO
33
Рисунок 7 ⎯ Окно для задания свойств таблицы
Рисунок 8 ⎯ Окно для задания ограничений таблицы
34
CREATE TABLE [dbo].[Авторы]( [Код автора] [int] NOT NULL, [Фамилия автора] [char](20) NOT NULL, [Имя автора] [char](20) NULL, [Отчество автора] [char](20) NULL, [Дата рождения] [datetime] NULL, [Дата смерти] [datetime] NULL, [Код страны] [int] NULL, [Место проживания] [char](100) NOT NULL, CONSTRAINT [PK_Авторы] PRIMARY KEY CLUSTERED ( [Код автора] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO CREATE TABLE [dbo].[Места нахождения]( [Код места нахождения] [int] NOT NULL, [Название места нахождения] [char](120) NOT NULL, CONSTRAINT [PK_Места нахождения] PRIMARY KEY CLUSTERED ( [Код места нахождения] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO CREATE TABLE [dbo].[Произведения]( [Код произведения] [int] NOT NULL, [Название произведения] [char](100) NOT NULL, [Код жанра] [int] NOT NULL, [Код средств создания] [int] NOT NULL, [Код автора] [int] NOT NULL, [Дата создания] [datetime] NULL, [Код страны] [int] NOT NULL, [Код места нахождения] [int] NOT NULL, [Цена] [real] NULL, CONSTRAINT [AK_Creation_Name] PRIMARY KEY CLUSTERED ( [Код произведения] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO
35
CREATE TABLE [dbo].[Средства создания]( [Код средств создания] [int] NOT NULL, [Описание средств создания] [char](100) NOT NULL, CONSTRAINT [PK_Средства создания] PRIMARY KEY CLUSTERED ( [Код средств создания] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO
CREATE TABLE [dbo].[Страны]( [Код страны] [int] NOT NULL, [Название страны] [char](100) NOT NULL, CONSTRAINT [PK_Страны] PRIMARY KEY CLUSTERED ( [Код страны] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO
36
3.3 Сценарии и экранные формы для ввода данных в базу системы Ввод данных в базу производился командами INSERT, начиная с таблиц, которые не ссылаются на другие таблицы (первичные таблицы ⎯ Primary Tables). Формат этой команды следующий: INSERT [INTO] Имя модифицируемой таблицы [WITH (Уровень блокировки запроса)] {[(Список колонок модифицируемой таблицы)] {VALUES (Список значений новой строки)\ Команда SELECT}} | DEFAULT VALUES Содержимое базы данных приведено в таблицах 7-12. В приложении Г даны сценарии и экранные формы с результатами ввода данных в таблицы базы. Таблица 7. Авторы Код автора
Фамилия автора
Имя автора
Отчество автора
Дата рождения
Дата смерти
Код страны
Место проживания
1
Да Винчи
Леонардо
Ди сер Пьеро
01.01.1753 01.01.1753
3
Тоскана
2
Суриков
Василий
Иванович
24.01.1848 19.03.1916
1
Красноярск
3
Петров
Василий
Григорьевич
12.12.1833 29.05.1882
1
Тобольск
4
Айвазовский
Иван
Константинович
17.07.1817 02.04.1900
1
Феодосия
5
Шишкин
Иван
Иванович
13.01.1832 08.03.1898
1
Татарстан
6
Лоррен
Клод
Желле
01.01.1753 31.12.1682
2
Тулуза
7
Пикассо
Пабло
NULL
25.10.1881 08.04.1973
2
Малага
8
Имя
автора
неизвест-
01.01.1753 01.01.2010
8
Неизвестно
но
Стоимость произведений вводилась отдельно с помощью команд UPDATE, которые приведены также в приложении Г. Ввод или изменение данных можно выполнить в самой таблице, открыв ее командой Show Table Data (разделы Г8-13). 37
Таблица 8. Произведения Код произведения
Название произведения
Код жанра
Код средства создания
Код автора
Дата создания
Код страны
Код места нахождения
Цена
1
Гора Арарат
4
1
4
1885
3
3
NULL
2
Абсент
1
7
7
1753
1
6
NULL
3
Мона Лиза (Джоконда)
1
3
1
1753
2
7
NULL
4
Берег моря ночью
4
1
4
1837
1
5
NULL
5
Дама с горностаем
1
3
1
1753
7
8
NULL
6
В Крыму
4
2
5
1890
1
2
NULL
7
Витрувианский человек
5
4
1
1753
3
2
NULL
8
С гитарой (Портрет С.А. Кропоткиной)
1
5
2
1882
1
9
NULL
9
Хаос(Сотворение мира)
4
1
4
1841
3
3
NULL
10
Завоевание Сибири Ермаком
4
1
2
1895
1
9
NULL
11
Утопленница
4
1
3
1867
1
9
NULL
12
Неаполитанский залив
4
1
4
1841
1
4
NULL
13
Последний кабак у заставы
4
1
3
1868
1
9
NULL
14
Ураган на море
4
1
4
1889
1
5
NULL
15
В Сиверской
4
1
5
1896
1
10
NULL
16
Возвращение Одисея из страны фиаков
4
6
6
1753
6
1
NULL
Попытки ввода дат, которые меньше 1753-го года, когда был введен Григорианский календарь, не дали положительных результатов, поэтому исправить в таблицах даты, меньшие этого года, повидимому невозможно: UPDATE [Авторы] -- Команда не выполняется SET [Дата рождения] = '01.01.1452', [Дата смерти] = '01.01.1519' WHERE [Код автора] = 1 38
UPDATE [Авторы] -- Команда выполняется - проверьте результат SET [Дата рождения] = '01.01.1753', [Дата смерти] = '01.01.1753' WHERE [Код автора] = 1 Таблица 9. Жанры Код жанра
Название жанра
1
Портрет
2
Натюрморт
3
Архитектура
4
Пейзаж
5
Графика
6
Фотография
7
Жанр неизвестен
Таблица 10. Средства создания Код средств создания
Название средств создания
1
Холст, масло
2
Холст на картоне, масло
3
Дерево, масло
4
Бумага, мел
5
Бумага, акварель
6
Акварель
7
Средства создания неизвестны
Даже изменение ограничений на ввод дат, которое производилось с помощью команды ALTER TABLE, не позволило исправить даты: ALTER TABLE [Авторы] DROP CONSTRAINT CK_Author_Birthdate ALTER TABLE [Авторы]
39
Таблица 11. Страны Код страны
Название страны
1
Россия
2
Франция
3
Италия
4
Испания
5
Португалия
6
Англия
7
Польша
8
Страна неизвестна
Таблица 12. Места нахождения Код места нахождения
Название места нахождения
1
Лондон. Британский музей
2
Пенза. Пензенская областная картинная галерея
3
Венеция. Музей армянской конгрегации мхитаристов
4
Петергоф Ленинградской области. Дворцы-музеи и парки Петродворца
5
Феодосия. Феодосийская картинная галерея им. И. К. Айвазовского
6
Санкт-Петербург. Государственный Эрмитаж
7
Лувр. Картинная галерея
8
Краков. Музей Чарторыжских
9
Москва. Государственная Третьяковская галерея
10
Челябинск. Челябинская областная картинная галерея
11
Место нахождения произведения неизвестно
ADD CONSTRAINT CK_Author_Birthdate CHECK ([Дата смерти] <= '01.01.2010') ALTER TABLE [Авторы] NOCHECK CONSTRAINT CK_Author_Birthdate 40
3.4 Проектирование и программная реализация запросов SQL Server 2005 обеспечивает разнообразные механизмы управления данными, такие как ADO, OLE DB, ODBC, DB-Library и команды языка TransactSQL, являющегося фундаментом всех остальных технологий. Для добавления данных в языке используются команды INSERT и SELECT INTO, для изменения данных – команда UPDATE и для удаления строк из таблиц – команда DELETE. Команда SELECT позволяет реализовать многофункциональный механизм доступа к данным любой сложности. Команда INSERT позволяет вставить в таблицу одну или несколько строк. Упрощенный синтаксис этой команды таков: INSERT [INTO] Имя модифицируемой таблицы [WITH (Уровень блокировки запроса)] {[(Список колонок модифицируемой таблицы)] {VALUES (Список значений новой строки)| Команда SELECT}} | DEFAULT VALUES Если необходимо явно вставлять значения в столбца-счетчики, имеющие свойство IDENTITY, то для модифицируемой таблицы надо выполнить команду: SET IDENTITY_INSERT Имя модифицируемой таблицы ON Если список столбцов не задан, то сервер будет вставлять данные последовательно во все столбцы, начиная с первого. Для каждого столбца должен быть указан аргумент, имеющий соответствующий тип. Аргументами могут быть константы, выражения соответствующего типа, значение NULL и значение по умолчанию DEFAULT. В списке столбцов можно не указывать столбцы со свойством IDENTITY, столбцы допускающие значение NULL и столбцы типа timestamp. Если в команде задан источник данных DEFAULT VALUES, то строка будет содержать только значения по умолчанию или значения NULL. Если в данной команде вместо имени таблицы задать имя представления, то новая строка будет вставлена в представление, а точнее, в ту исходную таблицу, на основе которой было создано представление, при этом изменение данных через представление должно быть разрешено специальной командой. Для представления невозможно задать уровень блокировки. Если необходимо быстро создать таблицу, имеющую структуру, чтобы в ней можно было сохранить результат выполнения запроса, то следует использовать следующую команду: SELECT Список выбираемых колонок исходных таблиц INTO Имя автоматически создаваемой таблицы FROM Список исходных таблиц [Условия выбора значений из таблиц] Имена колонок новой таблицы либо совпадают с именами колонок исходных таблиц, либо задаются после ключевого слова AS, следующего за 41
именем столбца исходной таблицы. Имя создаваемой таблицы должно быть уникальным в пределах базы данных. Чаще всего эта команда используется для создания временных локальных (#) и глобальных (##) таблиц. Для любой базы данных использование команды SELECT… INTO запрещено. Для установки разрешения на ее использование необходимо выполнить команду: EXEC sp_dboption ‘Имя базы данных’, ‘select into/bulkcopy’, ‘on’ Наиболее часто доступ к данным реализуется командой SELECT, начиная от простой выборки всех строк одной таблицы и кончая сложными запросами, обрабатывающими десятками и сотнями тысяч строк в десятках таблиц. В большинстве случаев используется упрощенный вариант команды SELECT, имеющей следующий синтаксис: SELECT Опции выбора Список выбора [INTO Новая таблица] FROM Список исходных таблиц или представлений [WHERE Условие поиска] [GROUP BY Условие группировки] [HAVLNG Условия группового поиска] [ORDER BY Выражение для упорядочивания [AS\DESC]] Части этой команды называются разделами и должны записываться именно в данном порядке. Опции выбора определяют количественные характеристики запроса: ALL – все строки таблицы; DISTINCT – все несовпадающие строки таблицы; TOP n – первые n несовпадающие строки таблицы; TOP n PERCENT – первые n% несовпадающих строк; WITH TIES – разрешает вывод дублирующих строк для последних двух вариантов. Список выбора содержит имена столбцов различных таблиц для формирования результата. Столбцы могут переименовываться с помощью конструкции AS. Если в качестве списка выбора задана звездочка (*), то в запрос будут включены все столбцы всех таблиц и представлений, заданных в качестве источников данных. Если в списке задана конструкция имя.*, то это означает, что в список выбора надо включить все столбцы объекта с данным именем. В список выбора можно включить и выражения, тогда их значения будут вычисляться при формировании каждой строки. Этот столбец будет либо безымянной, либо будет иметь имя, заданной конструкцией AS, следующей после выражения. Элемент списка в виде имя.IDENTICOL [AS Имя счетчика] позволяет включить в результат столбец-счетчик объекта с данным именем. С помощью ключевого слова POWGVIDCOL аналогичным образом можно включить глобально уникальный идентификатор строк того или иного объекта. 42
Раздел INTO позволяет создать новую таблицу для хранения результатов запроса. Структура этой таблицы будет определяться списком выбора, т.е. динамически при выполнении запроса. Раздел FROM является обязательным в команде SELECT и определяет таблицы и представления для выборки данных. Если таблица одновременно является и источником данных, и получателем результатов, то ей необходимо задать псевдоним с помощью конструкции AS, что обеспечит правильную работу сервера. Для таблиц можно указывать уровни блокировок: HOLDLOCK, NOLOCK и т.д. В разделе FROM можно задавать связанные таблицы для формирования сложных запросов: Исходная таблица Тип связи Исходная таблица ON Условие поиска или Исходная таблица CROSS JOIN Исходная таблица При использовании ключевых слов CROSS JOIN или запятой происходит связывание каждой строки левой таблицы с каждой строкой правой таблицы, так что количество строк при выполнении запроса определяется как произведение количества строк первой таблицы на количество строк второй таблицы. При использовании ключевых слов INNER JOIN или пробела выбираются пары строк из связанных таблиц, для которых имеются строки, удовлетворяющие критерию связывания в обеих таблицах. Строки из левой таблицы, для которых не имеется пары в связанной таблице, в результат не включаются. Также не включаются строки правой таблицы, для которых нет соответствующей строки в левой таблице. При использовании ключевых слов LEFT [OUTER] JOIN в результат будут включены все строки левой таблицы, независимо от того, есть для них соответствующая строка в правой таблице или нет, при этом для соответствующих столбцов правой таблицы, включенных в запрос, при отсутствии соответствия будут заноситься значения NULL. При использовании ключевых слов RIGHT [OUTER] JOIN в результат будут включены все строки правой таблицы, независимо от того, есть для них соответствующие строки в левой таблице. В столбцах левой таблицы, для тех строк, для которых нет соответствия, запишутся значения NULL. При использовании ключевых слов FULL [OUTER] JOIN в результат будут включены все строки как правой, так и левой таблицы. Логическое условие связывания двух таблиц, которое записывается после ключевого слово ON, должно быть логическим выражением, включающим любые операторы сравнения: =, <, >, <=, >=,! =, <>. В ряде случаев в запросах используются опции оптимизации: LOOP, HASH, MERGE, REMOTE. Если эти опции не заданы, то оптимизацию запросов осуществляет сервер. С помощью раздела WHERE можно сузить количество обрабатываемых строк данных, написав одно или несколько логических условий: 43
WHERE Условие поиска или Имя столбца * = Имя столбца -- LEFT OUTER JOIN или Имя столбца * = Имя столбца -- RIGHT OUTER JOIN Логическое условие может быть произвольным, в том числе и не связанным с данными. Оно может включать логические операторы NOT, AND и OR. В ряде случаев, в особенности для сложных запросов предпочтительнее использовать условия связывания * = (аналог LEFT OUTER JOIN) или = * (аналог RIGHT OUTER JOIN), которые выполняются гораздо эффективнее. При формировании запросов очень часто используются специальные логические операторы, синтаксис которых записывают следующим образом: 1. Выражение {= | < > | ! = | > | >= | ! >|, = | !<} ALL подзапрос. Здесь скалярное выражение вычисляется и сравнивается с каждым значением, возвращаемым подзапросом. Если сравнение дает истину для всех возвращаемых подзапросом значений, то этот оператор возвращает истину. 2. Если вместо ALL записать SOME или ANY, то результатом будет истина, если хотя в одной строке будет выполняться заданное сравнение. 3. Выражение [NOT] BETWEEN вида «ExprL AND ExprH» возвращает истину, когда значение выражения лежит в диапазоне значений ExprLвыражения и ExprH-выражения (или не лежит). 4. Оператор EXISTS (Подзапрос) возвращает значение истина, если подзапрос возвращает хотя бы одну строку. 5. Выражение [NOT] IN (Подзапрос | Выражение [,…n]) возвращает значение истина, если значение левого выражения совпадает с одним из значений подзапроса или списка значений правых выражений (или не совпадает). 6. Выражение [NOT] LIKE «Шаблон[ESCAPEЗнак]» дает истину, если значение выражения соответствует или не соответствует шаблону, в котором “%” означает любое количество произвольных символов, “_” – один произвольный символ, “[символы]” – один из указанных в скобках, “[^ символы]” – все символы, кроме указанных. Знак после слова ESCAPE позволяет указать, что следующий за ним знак шаблона не является управляющим знаком шаблона, т.е. знаком “%”, “_” и т.д., а представляет обычный знак строки. Раздел GROUP BY позволяет выполнить группировку строк таблиц по определенным критериям. Для каждой группы можно выполнить специальные функции агрегирования, которые будут применены ко всем строкам группы: AVG (имя столбца) – среднее значение в группе; SUM (имя столбца) – сумма значений группы; MIN (имя столбца) – минимальное значение в группе; MAX (имя столбца) – максимальное значение в группе; COUNT (имя столбца) – число строк в группе с непустым значением; COUNT (*) – число строк в группе, включая и пустые (NULL). Синтаксис раздела следующий: GROUP BY Условие группировки --или BY ALL 44
[WITH CUBE или ROLLUP] --супергруппировка В качестве условия группировки задается имя одного или нескольких столбцов таблицы. Именно эти столбцы должны быть включены в запрос. Наличие других столбцов не допускается. Если в запросе было определено условие, сужающее диапазон группировки выбираемых строк, то включение слова ALL обеспечит вывод всех групп, но функции агрегирования для дополнительных групп выполняться не будут. Ключевое слово WITH CUBE инициирует суперагрегирование, когда в результат включаются строки, являющиеся результатом агрегирования уже агрегированных данных. В итоге получается многоуровневое агрегирование с итоговыми данными по всем уровням. Опция WITH ROLLUP позволяет устранить лишние строки при суперагрегировании. Раздел HAVING задает условия поиска при определении групп с помощью раздела GROUP BY: HAVING Условие поиска Этот раздел аналогичен разделу WHERE. Раздел UNION позволяет выполнить объединение данных из нескольких таблиц, имеющих одинаковый список столбцов, порядок их следования и свойства, при этом по умолчанию дублирующие строки не включаются, если не задано ключевое слово ALL: SELECT Список столбцов FROM Имя первой таблицы UNION [ALL] SELECT Список столбцов FROM Имя второй таблицы и т.д. Раздел ORDER BY используется, когда необходимо отсортировать данные в результирующем наборе: ORDER BY
Имя столбца в запросе [ASC или DESC], Имя столбца в запросе [ASC или DESC]…
Здесь ключевые слова ASC и DESC обеспечивают сортировку соответственно по возрастанию или убыванию значений в соответствующем столбце. Раздел COMPUTE позволяет применять к выбираемым столбцам функции агрегирования: COMPUTE Функция агрегирования (Имя столбца запроса) BY Имена для группировки Порядок использования столбцов в функциях агрегирования должен соответствовать порядку следования столбцов, указанному в разделе ORDER BY. Не допускается также использование ключевого слова DISTINCT. Изменение данных в таблицах или задание значений переменным производится командой UPDATE: 45
UPDATE Имя таблицы или Представления WITH Блокировка SET Имя столбца или Переменной = Выражение… FROM Имена исходных таблиц WHERE Условия поиска Удаление данных из таблиц производится командой DELETE: DELETE FROM Имя таблицы или представления или DELETE FROM Имя таблицы WHERE Условие поиска OPTION (Уровни блокировки) Составим несколько типовых запросов для проектируемой базы данных, используя команды INSERT, SELECT и UPDATE с различными вариантами записи их разделов и подразделов. Поскольку даже типовых запросов может быть очень много, будем их обозначать, учитывая структуру и содержание запроса. Первым знаком в обозначении будет буква Q от слова Query. Второй знак будет определять количество используемых таблиц: 0, 1, 2 и т. д. Далее, через знак подчеркивания буквами обозначаются сами таблицы: A ⎯ таблица «Авторы»; C ⎯ таблица «Страны»; G ⎯ таблица «Жанры»; P ⎯ таблица «Произведения»; M ⎯ таблица «Места нахождения»; T ⎯ таблица «Средства создания»; ALL ⎯ все таблицы. Например, запрос с использованием двух таблиц «Авторы» и «Произведения» будет иметь начало обозначения в виде Q2_AP. Обозначения столбцов, используемых в запросе, будут включаться вслед за обозначением таблиц через знак подчеркивания в виде одной или двух букв: AC ⎯ код автора; F ⎯ фамилия автора; I ⎯ имя автора; O ⎯ отчество автора; BD ⎯ день рождения автора; DD ⎯ день смерти автора; SC ⎯ код страны проживания автора; AP ⎯ место проживания автора; CC ⎯ код произведения; CN ⎯ название произведения; GC ⎯ код жанра; TC ⎯ код средства создания; 46
CD ⎯ дата создания; PR ⎯ цена; GN ⎯ название жанра; TD ⎯ описание средств создания; CN ⎯ название страны; MC ⎯ код места нахождения; MN ⎯ название места нахождения; ALL ⎯ все столбцы; NULL ⎯ без указания списка столбцов. Команды языка Transact-SQL обозначаются одной буквой: I (INSERT), S (SELECT) и U (UPDATE). Наконец, особенности структуры и содержание команды обозначаются словами кратко и отделяются также знаком подчеркивания. Для любой таблицы из N столбцов может быть два в степени N их комбинаций в запросе, включая и отсутствие столбцов. Если запрос использует две таблицы из N и M столбцов соответственно, таких комбинаций будет уже два в степени N*M. Если учесть различные варианты объединения таблиц и различные способы задания условий отбора, группировки и упорядочения, то число вариантов запросов даже для небольшой базы данных невозможно сосчитать. Поэтому ограничимся типовыми запросами, которые приведены в приложении Д. Здесь построим два варианта применительно к созданной базе данных: A) Простая вставка в таблицу «Авторы» без указания списка столбцов: -- A) Q1_A_NULL Без указания списка столбцов (см. рисунок 9) INSERT [Авторы] -- Список значений: VALUES (17, ‘Репин’, ’Илья’, ’Ефимович’, ’01.01.1876’, ’01.01.1930’, 1, ‘Москва’ ) GO B) Вставка в таблицу «Авторы» с указанием произвольной последовательности столбцов: -- B) Q1_A_F_I_O_AP_BD_SC_DD_AC_I Вставка в произвольные -столбцы (см. рисунок 10) INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (18, 'Да Винчи', 'Леонардо', 'Ди сер Пьеро', 1753, 1753, 3, 'Тоскана') GO 47
Рисунок 9 ─ Вставка без указания списка столбцов
Рисунок 10 ─ Вставка в произвольные столбцы
3.5 Проектирование и программная реализация представлений 48
Представление (View) для пользователей баз данных выглядит как таблица, но при этом она не содержит данных, а лишь представляет данные, расположенные в одной или нескольких таблицах. Таким образом, представления – это виртуальные таблицы, определяемые запросом на языке Transact-SQL. Подобно реальным таблицам представления содержат именованные столбцы и строки с данными, которые они динамически выбирают из таблиц и предлагают эти данные пользователю для просмотра. Представления часто применяются для ограничения доступа к конфиденциальным данным в таблицах баз данных. Когда в представление не включается столбец исходной таблицы, то считают, что на таблицу наложен вертикальный фильтр. Если в запросе SQL установлено одно или несколько условий для выборки строк, то считают, что на таблицу наложен горизонтальный фильтр. Представление может выбирать данные из других представлений, которые, в свою очередь, могут также основываться на представлениях или таблицах. Вложенность представлений не должна превышать 32. Представления можно создавать, используя базы данных одного сервера (текущего). Максимальное количество столбцов в представлении равно 1024. Представление не может ссылаться на временные таблицы. Кроме того, нельзя создавать временное представление. Для представления нельзя определить ограничения целостности, триггеры, правила или умолчания, а также создать обычный или полнотекстовый индекс. В основном, представления используются для выборки данных. Однако с помощью представлений можно выполнять и изменение данных в таблицах, на основе которых построено представление, при этом требуется соблюдение ряда правил: представление должно содержать, как минимум, одну таблицу в параметре FROM команды SELECT, не разрешается использование функций агрегирования и др. Как и для таблиц, для представлений можно определить следующие права доступа: SELECT – просмотр данных; INSERT – добавление данных через представления; UPDATE – изменение данных в исходных таблицах; DELETE – удаление данных в исходных таблицах. Чтобы иметь возможность создавать представления, надо обладать правами владельца баз данных и иметь соответствующие разрешения для любых таблиц или представлений, упомянутых в запросе на создание этого представления.
49
Для создания представления используется следующая команда TransactSQL: CREATE VIEW [Имя базы данных.] [Имя владельца.] Имя представления [(Имя колонки [,... n])] [WITH{ENCRYPITION | SHEMABINDING | VIEW_METADATA}] AS Команда SELECT [WITH CHECK OPTION] Если в команде не заданы имена колонок представления, то они определяются по именам выбираемых колонок в команде SELECT. Параметр ENCRYPTION скрывает код создания этого представления, а параметр SHEMABINDING обеспечивает контроль структуры исходных объектов, к которым обращается оператор SELECT. Опция WITH CHEC OPTION не позволяет изменять строки таким образом, чтобы они исчезли при отборе командой SELECT. Очень удобно для создания представлений использовать графические средства среды Visual Studio. Это обеспечивает быстрое и наглядное создание представлений любой сложности. Для создания нового представления достаточно выбрать в контекстном меню папки Views команду Add New View (Новое представление). На рисунке 3 показано, каким образом конструируется представление: а) выбираются из списка таблиц и представлений выбранной базы данных те таблицы или представления, на основе которых будет создаваться новое представление; б) в каждой таблице отмечаются столбцы, которые должны быть включены в представление, при этом автоматически формируется запрос (см. рисунок 4), а затем и команда CREATE VIEW; в) если необходимо запрос дополняется нужными разделами, используя объединение (JOIN) и слияние (UNION) данных, различные выражения, группировку, агрегирование и логические условия; г) с помощью команды Execute SQL контекстного меню команда проверяется и затем исполняется. После обновления Refresh и открытия представлений Views можно просмотреть данные, отображаемые этим представлением (см. рисунок 5). Список представлений, имеющихся в выбранной базе данных, находится в этой папке. Как видно из рисунка 5, для рассматриваемого представления отображаются данные в столбцах, которые были указаны при конструировании. В приложении Е приведены сценарии и экранные формы создания представлений «Стоимость произведений и их авторы», «Авторские произведения» и «Полные сведения об авторах». Выбираемые таблицы, столбцы, а также особенности структуры каждого представления содержатся в соответствующих сценариях. 50
Рисунок 11 ⎯ Конструирование представления
Рисунок 12 ⎯ Формирование запроса для команды
51
Рисунок 13 ⎯ Отображение данных в представлении Тексты сценариев следующие: 1. Стоимость произведений и их авторы CREATE VIEW [Стоимость произведений и их авторы] AS SELECT [Авторы].[Фамилия автора], [Произведения].[Название произведения], [Произведения].[Цена] FROM [Авторы] INNER JOIN [Произведения] ON [Авторы].[Код автора] = [Произведения].[Код автора] GO 2. Авторские произведения CREATE VIEW [Авторские произведения] AS SELECT [Авторы].[Фамилия автора], [Произведения].[Название произведения], [Произведения].[Цена], [Страны].[Название страны] FROM [Авторы] INNER JOIN [Произведения] ON [Авторы].[Код автора] = [Произведения].[Код автора] INNER JOIN [Страны] ON [Авторы].[Код страны] = [Страны].[Код страны] GO 52
3. Полные сведения о произведениях CREATE VIEW [Полные сведения о произведениях] AS SELECT [Авторы].[Фамилия автора], [Произведения].[Название произведения], [Произведения].[Дата создания], [Жанры].[Название жанра], [Произведения].[Цена], [Страны].[Название страны], [Средства создания].[Описание средств создания] FROM [Авторы] INNER JOIN [Произведения] ON [Авторы].[Код автора] = [Произведения].[Код автора] INNER JOIN [Страны] ON [Авторы].[Код страны] = [Страны].[Код страны] INNER JOIN [Жанры] ON [Произведения].[Код жанра] = [Жанры].[Код жанра] INNER JOIN [Средства создания] ON [Произведения].[Код средств создания] = [Средства создания].[Код средств создания] GO
53
3.6 Проектирование и программная реализация хранимых процедур и функций Функции и хранимые процедуры используются в SQL Server 2000 для реализации на языке Transact-SQL сложных часто используемых алгоритмов обработки данных или различных административных действий создания учетных записей, получения информации об объектах базы данных, управления свойствами сервера и баз данных, управления подсистемой репликации и автоматизации и т.д. Они хранятся в виде исходного текста и являются программными модулями, существующими независимо от таблиц или каких либо других объектов баз данных. Исключением являются расширенные хранимые процедуры, которые хранятся в двоичном формате в виде динамически подключаемых библиотек типа *.dll и создаются с помощью других языков программирования с использованием интерфейса SQL Server Open Data Services API. Такие процедуры подключаются, отключаются и выгружаются специальными командами. Хранение функций и хранимых процедур в виде исходных модулей языка Transact-SQL на сервере и в соответствующих базах данных позволяет уменьшить размер запроса, посылаемого по сети от клиента на сервер, а следовательно и нагрузку на сеть, что повышает общую производительность системы. Это также позволяет упростить сопровождение программных комплексов и внесение изменений в исходный текст модулей, причем большинство изменений не отразится на работоспособности клиентских приложений. Значительная часть функций и хранимых процедур поставляются в составе SQL Server 2005. Они называются системными, или встроенными (built-in). Кроме того, пользователю предоставляется возможность разрабатывать и включать в свою базу данных собственные, или пользовательские (user-defined) функции и хранимые процедуры, реализующие специальные алгоритмы обработки данных. Таким образом, пользовательские функции и хранимые процедуры становятся объектами той базы данных, в которой они создавались. Поэтому при их создании, если необходимо, требуемую базу данных следует сделать текущей с помощью команды USE имя базы данных. Системные же функции хранятся на экземпляре сервера, а системные хранимые процедуры – в базе master этого же экземпляра сервера. В SQL Server 2005 можно создавать и так называемые временные хранимые процедуры в базе данных tempdb экземпляра сервера, которые существуют лишь некоторое время, после чего автоматически уничтожаются сервером. Они бывают локальными и глобальными. Локальные хранимые процедуры должны иметь имя, начинающееся с символа #, и могут быть вызваны только из того соединения, в котором они были созданы. Они автоматически удаляются при отключении пользователя, перезапуске или остановке сервера. Глобальные хранимые процедуры должны иметь имя, начинающееся с символов ##, и доступны для любых соединений с экземпляром сервера, на котором они были созданы. Они 54
удаляются либо при закрытии соединения, в контексте которого они были созданы, либо автоматически – при перезапуске или остановке сервера. Функции и хранимые процедуры могут быть вызваны клиентскими программами, другими функциями или хранимыми процедурами, а также триггерами. В любом случае необходимо указать имя функции или хранимой процедуры и список аргументов, которые сопоставляются параметрам соответствующей функции или хранимой процедуры, при этом типы аргументов и параметров должны совпадать или допускать автоматические преобразования типов. Если для некоторого параметра задано значение по умолчанию и это значение подходит для данного вызова, то соответствующий аргумент может быть опущен. Поскольку функция возвращает значение, она используется в качестве операнда некоторого выражения в виде вызова функций, состоящего из имени этой функции и списка аргументов, заключенного в круглые скобки, при этом в качестве аргументов могут быть любые выражения языка Transact-SQL, дающие в результате значения требуемых типов. Аргументы в вызове функции отделяются запятыми. Если список аргументов пуст, то круглые скобки после имени функции, как правило, задаются. Исключения составляют некоторые системные функции, для которых круглые скобки не задаются, когда нет аргументов. Хранимые процедуры могут вызываться только командой EXECUTE, или сокращенно EXEC. За этой командой должны быть указаны имя процедуры и через пробел список аргументов, если вызывается процедура с параметрами. Аргументы разделяются запятой. Если для параметра задано значение по умолчанию, то соответствующий аргумент либо совсем не задается (в конце списка), либо используется слово DEFAULT(в середине списка). Процедура может возвращать результаты только через параметры с ключевым словом OUTPUT, при этом и аргумент должен быть задан с таким же ключевым словом. Создание, изменение и удаление функций и хранимых процедур производится соответственно командами: CREATE FUNCTION, CREATE PROCEDURE , ALTER FUNCTION, ALTER PROCEDURE, DROP FUNCTION, DROP PROCEDURE. При создании функции указывается тип возвращаемого значения и в теле функции обязательно задается команда RETURN, за которой следует выражения для вычисления возвращаемого значения. В теле процедуры использование команды RETURN (конечно, без последующего выражения) вовсе не обязательно. Когда этой команды нет, выход из процедуры будет происходить после исполнения последней команды процедуры. Тело как функции, так и хранимой процедуры начинается ключевым словом AS. Поскольку каждая из них хранится как отдельный объект, то для указания конца тела не требуется записывать какое-либо специальное ключевое слово или знак. За командами создания функции или хранимой процедуры перечисляются имена параметров, начинающиеся с символа @, и их типы, а также возможно значение по умолчанию. Для функции этот список заключается в круглые скобки, после которых записывается ключевое слово RETURNS (возвращает) и тип возвращаемого значения. Для хранимой процедуры круглые скобки не используются, и задавать тип возвращаемого значения не требуется. Для тела 55
функции часто используют ключевое слово BEGIN после ключевого слова AS и ключевое слово END в конце тела. Дополнительные опции функции или хранимой процедуры задаются ключевым словом WITH до начала тела. Например, опция ENCRYPTION позволяет зашифровать исходный текст функции или хранимой процедуры и сделать его, таким образом, нечитабельным. Опция функции SCHEMABINDING запрещает производить какие-либо изменения в объектах базы данных. Опция хранимой процедуры RECOMPILE обеспечивает повторную компиляцию исходного текста процедуры при каждом её вызове. Наконец, опция FOR REPLICATION указывает, что данная хранимая процедура будет использоваться при репликации данных. При создании однотипных хранимых процедур можно использовать для них одно групповое имя. В этом случае конкретная процедура в группе идентифицируется своим номером, который должен задаваться как при создании, так и при вызове процедуры сразу же после группового имени и отделяться от него точкой с запятой. В SQL Server 2005 можно создавать функции трех классов: SCALAR – возвращают обычное скалярное значение; INLINE – возвращают таблицу динамической структуры, создаваемую единственной командой тела функции SELECT; MULTISTATEMENT – возвращает обычную таблицу заданной структуры, при этом количество команд в теле функции не ограничивается. Шаблон процедуры создается с помощью команды Add Stored New Procedure, которая находится в контекстном меню для папки Stored Procedure: CREATE PROCEDURE dbo.StoredProcedure1 – Имя процедуры /* Число и тип параметров могут быть произвольными ( @parameter1 int = 5, -- Значение по умолчанию @parameter2 datatype OUTPUT -- Выходной параметр ) */ AS Команды языка Transact-SQL RETURN Напишем сценарии для создания и тестирования двух хранимых процедур и одной функции. Первая процедура InsertAuthorProcedure производит включение в базу данных нового автора, вторая процедура InsertCreationProcedure расширяет список произведений живописи, графики и фотографий, учитываемых в базе данных. Функция PriceAverageFunction рассчитывает и вовращает в место вызова среднюю цену всех произведений базы данных. Тексты сценариев создания и проверки процедур и функции следующие: --1 Процедура InsertAuthorProcedure предназначена для включения -- в базу данных нового автора; 56
CREATE PROCEDURE InsertAuthorProcedure ( @Author_Code int, @Author_Family_Name char(20), @Author_First_Name char(20), @Author_Father_Name char(20), @Author_Birthdate datetime, @Author_Deathdate datetime, @Country_Code int, @Author_Place char(100) ) AS INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES ( @Author_Code, @Author_Family_Name, @Author_First_Name, @Author_Father_Name, @Author_Birthdate, @Author_Deathdate, @Country_Code, @Author_Place ) RETURN GO --2 Вызов процедура InsertAuthorProcedure производит включение -- в базу данных нового автора; EXECUTE InsertAuthorProcedure -- Открывающая скобка не требуется 10, -- @Author_Code int 'Репин', -- @Author_Family_Name char(20) 'Илья', -- @Author_First_Name char(20) 'Ефимович', -- @Author_Father_Name char(20) '01.01.1844', -- @Author_Birthdate datetime '01.01.1930', -- @Author_Deathdate datetime 1, -- @Country_Code int 'Москва' -- @Author_Place char(100) 57
-- Закрывающая скобка не требуется --3 Процедура InsertCreationProcedure предназначена для -- включения в базу данных нового произведения; CREATE PROCEDURE InsertCreationProcedure ( @Creation_Code int, @Creation_Name char(100), @Genere_Code int, @Tools_Code int, @Author_Code int, @Creation_Date datetime, @Country_Code int, @Placement_Code int, @Price real ) AS INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES ( @Creation_Code, @Creation_Name, @Genere_Code, @Tools_Code, @Author_Code, @Creation_Date, @Country_Code, @Placement_Code, @Price ) RETURN GO --4 Вызов процедура InsertCretionProcedure производит включение -- в базу данных нового произведения; EXECUTE InsertCreationProcedure 58
17, -- @Creation_Code int, 'Бурлаки на волге', -- @Creation_Name char(100), 4, -- @Genere_Code int, 6, -- @Tools_Code int, 10, -- @Author_Code int, '01.01.1898', -- @Creation_Date datetime, 1, -- @Country_Code int, 9, -- @Placement_Code int, 989 -- @Price real --5 Функция PriceAverageFunction предназначена для расчета -- средней цены произведениий, хранящихся в базе данных; CREATE FUNCTION PriceAverageFunction ( ) RETURNS real AS BEGIN RETURN (SELECT AVG([Цена]) FROM [Произведения]) END --6 Вызов функции PriceAverageFunction расчитывает и возвращает -- среднюю цену произведениий, хранящихся в базе данных; PRINT dbo.PriceAverageFunction()
59
3.7 Проектирование и программная реализация триггеров Триггер базы данных сервера SQL Server 2005 – это специальный тип хранимых процедур, которые запускаются сервером автоматически при выполнении тех или иных действий с данными таблицы. Триггеры различаются по типу команд, на которые они реагируют: INSERT TRIGGER – запускаются при попытке вставить данные с помощью команды INSERT; UPDATE TRIGGER – запускаются при попытке изменения данных с помощью команды UPDATE; DELETE TRIGGER – запускаются при попытке удаления данных с помощью команды DELETE. Параметры FOR, AFTER и INSTEAD OF, указываемые при создании триггера, определяют его поведение следующим образом: FOR – запуск триггера при выполнении заданной в этом списке команды; AFTER – запуск триггера после успешного выполнения команд списка; INSTEAD OF – триггеры вызывается вместо выполнения команд списка. Можно определить несколько AFTER-триггеров для каждой операции INSERT, UPDATE и DELETE. По умолчанию все триггеры являются AFTERтриггерами. Триггеры нельзя создавать для временных или системных таблиц. Команда создания триггера должна быть первой в пакете и применяться только к одной таблице. Ее формат следующий: CREATE TRIGGER Имя триггера ON {Имя таблицы | Имя представления} {FOR | AFTER | INSTEAD OF} {[INSERT] | [UPDATE] | [DELETE]} AS SQL-операторы -- тело триггера Команда ALTER TRIGGER позволяет изменить параметры и тело триггера. С помощью команды DROP TRIGGER можно удалить любой триггер базы данных. Переименовать триггер можно системной хранимой процедурой sp_rename, а получить информацию о триггере можно при помощи системных хранимых процедур sp_helptext и sp_helptrigger. Внутри триггера допускается использование любых команд языка TransactSQL с некоторыми ограничениями. Также допускается и вызов хранимых процедур, в том числе системных. Сценарии создания триггеров для всех команд и всех видов запуска следующие: --1 Триггер OnCriationForDeleteTrigger запускается до команды -- удаления данных DELETE CREATE TRIGGER OnCriationForDeleteTrigger 60
ON [Произведения] FOR DELETE AS PRINT 'OnCriationForDeleteTrigger' GO --2 Триггер OnCriationAfterDeleteTrigger запускается после -- команды удаления данных DELETE CREATE TRIGGER OnCriationAfterDeleteTrigger ON [Произведения] AFTER DELETE AS PRINT 'OnCriationAfterDeleteTrigger' GO --3 Триггер OnCriationInsteadOfDeleteTrigger запускается вместо -- команды удаления данных DELETE CREATE TRIGGER OnCriationInsteadOfDeleteTrigger ON [Произведения] INSTEAD OF DELETE AS PRINT 'OnCriationInsteadOfDeleteTrigger' GO --4 Триггер OnCriationForInsertTrigger запускается до команды -- вставки данных INSERT CREATE TRIGGER OnCriationForInsertTrigger ON [Произведения] FOR INSERT AS PRINT 'OnCriationForInsertTrigger' GO --5 Триггер OnCriationAfterInsertTrigger запускается после -- команды вставки данных INSERT CREATE TRIGGER OnCriationAfterInsertTrigger ON [Произведения] AFTER INSERT AS PRINT 'OnCriationAfterInsertTrigger' GO --6 Триггер OnCriationInsteadOfInsertTrigger запускается вместо -- команды вставки данных INSERT 61
CREATE TRIGGER OnCriationInsteadOfInsertTrigger ON [Произведения] INSTEAD OF INSERT AS PRINT 'OnCriationInsteadOfInsertTrigger' GO --7 Триггер OnCriationForUpdateTrigger запускается до команды -- изменения данных UPDATE CREATE TRIGGER OnCriationForUpdateTrigger ON [Произведения] FOR UPDATE AS PRINT 'OnCriationForUpdateTrigger' GO --8 Триггер OnCriationAfterUpdateTrigger запускается после -- команды изменения данных UPDATE CREATE TRIGGER OnCriationAfterUpdateTrigger ON [Произведения] AFTER UPDATE AS PRINT 'OnCriationAfterUpdateTrigger' GO --9 Триггер OnCriationInsteadOfUpdateTrigger запускается вместо -- команды изменения данных UPDATE CREATE TRIGGER OnCriationInsteadOfUpdateTrigger ON [Произведения] INSTEAD OF UPDATE AS PRINT 'OnCriationInsteadOfUpdateTrigger' GO Для отладки все триггеры выдают на экран сообщения об их запуске. В дальнейшем при тестировании в тело триггера могут быть вставлены любые команды. Чтобы проверить, например, запуск тригера OnCriationForInsertTrigger и его работу, надо исполнить следующие команды, удаляя предворительно все остальные триггеры: DELETE [Произведения] -- "Бурлаки на Волге" Репина И.Е. WHERE [Код произведения] = 17 DELETE [Произведения] -- "Бурлаки на Волге" Репина И.Е. WHERE [Код произведения] = 18 INSERT INTO [Произведения] 62
--Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES ( 18, 'Бурлаки на волге', 4, 6, 10, '01.01.1898', 1, 9, 989 ) Сценарий триггера дополним командой включения строки с другим кодом произведения (см. рисунки 14 и 15): CREATE TRIGGER OnCriationForInsertTrigger ON [Произведения] FOR INSERT AS BEGIN PRINT 'OnCriationForInsertTrigger' INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES ( 17, 'Бурлаки на волге', 4, 6, 10, '01.01.1898', 1, 9, 989 ) END GO 63
Рисунок 14 ⎯ Состояние до запуска триггера OnCreationForInsertTrigger
Рисунок 15 ⎯ Состояние после запуска триггера OnCreatioForInsertTrigger 64
4 Проектирование и реализация клиентского приложения системы 4.1 Проектирование клиентского приложения системы В настоящее время основной технологией, используемой при создании информационных систем, является технология "клиент-сервер". "Клиент-сервер" ⎯ это модель взаимодействия компьютеров в сети. Как правило, компьютеры не являются равноправными. Каждый из них имеет свое, отличное от других, назначение, играет определенную роль. Некоторые компьютеры в сети владеют и распоряжаются информационно-вычислительными ресурсами, такими как процессоры, файловая система, почтовая служба, служба печати, база данных. Другие имеют возможность обращаться к этим службам, пользуясь услугами первых. Компьютер, управляющий тем или иным ресурсом, принято называть сервером этого ресурса, а компьютер, желающий им воспользоваться ⎯ клиентом. Конкретный сервер определяется видом ресурса, которым он владеет. Так, если ресурсом являются базы данных, то речь идет о сервере баз данных, назначение которого ⎯ обслуживать запросы клиентов, связанные с обработкой данных; если ресурс ⎯ это файловая система, то говорят о файловом сервере или файл-сервере и т.д. В сети один и тот же компьютер может выполнять как роль клиента, так и роль сервера. Например, в информационной системе, включающей персональные компьютеры, большую ЭВМ и мини-компьютер под управлением Windows, последний может выступать как в качестве сервера базы данных, обслуживая запросы от клиентов ⎯ персональных компьютеров, так и в качестве клиента, направляя запросы большой ЭВМ. Этот же принцип распространяется и на взаимодействие программ. Если одна из них выполняет некоторые функции, предоставляя другим соответствующий набор услуг, то такая программа рассматривается в качестве сервера. Программы, которые пользуются этими услугами, принято называть клиентами. Так, ядро реляционной SQL-ориентированной СУБД часто называют сервером базы данных или SQL-сервером, а программу, обращающуюся к нему за услугами по обработке данных ⎯ SQL-клиентом. Первоначально СУБД имели централизованную архитектуру. В ней сама СУБД и прикладные программы, которые работали с базами данных, функционировали на центральном компьютере (большая ЭВМ или миникомпьютер). Там же располагались базы данных. К центральному компьютеру были подключены терминалы, выступавшие в качестве рабочих мест пользователей. Все процессы, связанные с обработкой данных: поддержка ввода, осуществляемого пользователем, формирование, оптимизация и выполнение запросов, обмен с устройствами внешней памяти и т.д., выполнялись на центральном компьютере, что предъявляло жесткие требования к его производительности. Особенности СУБД первого поколения напрямую связаны с архитектурой больших ЭВМ и мини-компьютеров и адекватно отражают все их преимущества и недостатки. 65
В настоящее время фактическим стандартом для многопользовательских СУБД, стала архитектура "клиент-сервер". Если предполагается, что проектируемая информационная система (ИС) будет построена по технологии "клиент-сервер", то это означает, что прикладные программы, реализованные в ее рамках, будут иметь распределенный характер. Иными словами, часть функций прикладной программы (или, проще, приложения) будет реализована в программе-клиенте, другая ⎯ в программесервере, причем для их взаимодействия будет определен некоторый протокол. Основной принцип технологии "клиент-сервер" заключается в разделении функций стандартного интерактивного приложения на четыре группы, имеющие различную природу. Первая группа ⎯ это функции ввода и отображения данных. Вторая группа объединяет чисто прикладные функции, характерные для данной предметной области. К третьей группе относятся фундаментальные функции хранения и управления информационными ресурсами (базами данных, файловыми системами и т.д.). Наконец, функции четвертой группы ⎯ служебные, играющие роль связок между функциями первых трех групп. В соответствии с этим в любом приложении выделяются следующие логические компоненты: а) компонент представления, реализующий функции ввода и отображения данных; б) прикладной компонент, поддерживающий прикладные функции; в) компонент хранения и доступа к информационным ресурсам; г) протокол взаимодействия. Различия в реализациях технологии "клиент-сервер" определяются четырьмя факторами. Во-первых, тем, в какие виды программного обеспечения интегрирован каждый из этих компонентов. Во-вторых, тем, какие механизмы программного обеспечения используются для реализации функций всех четырех групп. В-третьих ⎯- как логические компоненты распределяются между компьютерами в сети. В-четвертых, какие механизмы используются для связи компонентов между собой. Выделяются четыре подхода, реализованные в следующих моделях: а) модель файлового сервера (File Server ⎯ FS); б) модель доступа к удаленным данным (Remote Data Access ⎯ RDA); в) модель сервера базы данных (DataBase Server ⎯ DBS); г) модель сервера приложений (Application Server ⎯ AS). FS-модель является базовой для локальных сетей персональных компьютеров. В соответствии с этой моделью один из компьютеров в сети считается файловым сервером и предоставляет услуги по обработке файлов другим компьютерам. Файловый сервер работает под управлением сетевой операционной системы и играет роль компоненты доступа к информационным ресурсам (т.е. к файлам). На других компьютерах в сети функционирует приложение, в кодах которого совмещены компонент представления и 66
прикладной компонент. Протокол обмена представляет собой набор низкоуровневых вызовов, обеспечивающих приложению доступ к файловой системе на файл-сервере. Модель файлового сервера представлена на рисунке 16. Клиент Компонент представления
Файлы
Прикладной компонент
Сервер Компонент доступа к ресурсам
Рисунок 16⎯ Модель файлового сервера FS-модель послужила фундаментом для расширения возможностей персональных СУБД в направлении поддержки многопользовательского режима. В таких системах на нескольких персональных компьютерах выполняется как прикладная программа, так и копия СУБД, а базы данных содержатся в разделяемых файлах, которые находятся на файловом сервере. Когда прикладная программа обращается к базе данных, СУБД направляет запрос на файловый сервер. В этом запросе указаны файлы, где находятся запрашиваемые данные. В ответ на запрос файловый сервер направляет по сети требуемый блок данных. СУБД, получив его, выполняет над данными действия, которые были декларированы в прикладной программе. К технологическим недостаткам модели относят: а) высокий сетевой трафик (передача множества файлов, необходимых приложению); б) узкий спектр операций манипулирования данными ("данные ⎯ это файлы"); в) отсутствие адекватных средств безопасности доступа к данным (защита только на уровне файловой системы) и т.д. Все перечисленные недостатки ⎯ следствие внутренне присущих FSмодели ограничений, определяемых ее характером. Более технологичная RDA-модель существенно отличается от FS-модели характером компонента доступа к информационным ресурсам. Это, как правило, SQL-сервер. В RDA-модели коды компонента представления и прикладного компонента совмещены и выполняются на компьютере-клиенте. Последний поддерживает как функции ввода и отображения данных, так и чисто прикладные функции. Доступ к информационным ресурсам обеспечивается либо операторами специального языка (языка SQL, если речь идет о базах данных) или вызовами функций специальной библиотеки (если имеется соответствующий интерфейс прикладного программирования ⎯ API). Модель доступа к удаленным данным представлена на рисунке 17. 67
Клиент Компонент представления
SQL
Прикладной компонент
Сервер Компонент доступа к ресурсам
Рисунок 17 ⎯ Модель доступа к удаленным данным Клиент направляет запросы к информационным ресурсам (например, к базам данных) по сети удаленному компьютеру. На нем функционирует ядро СУБД, которое обрабатывает запросы, выполняя предписанные в них действия, и возвращает клиенту результат, оформленный как блок данных. При этом инициатором манипуляций с данными выступают программы, выполняющиеся на компьютерах-клиентах, в то время как ядру СУБД отводится пассивная роль ⎯ обслуживание запросов и обработка данных. RDA-модель избавляет от недостатков, присущих как системам с централизованной архитектурой, так и системам с файловым сервером. Прежде всего, перенос компонента представления и прикладного компонента на компьютеры-клиенты существенно разгружает сервер БД, уменьшая общее число процессов операционной системы. Сервер БД освобождается от несвойственных ему функций; процессор или процессоры сервера целиком загружаются операциями обработки данных, запросов и транзакций. Это становится возможным благодаря отказу от терминалов и оснащению рабочих мест компьютерами, которые обладают собственными локальными вычислительными ресурсами, полностью используемыми программами переднего плана. С другой стороны, резко уменьшается загрузка сети, так как по ней передаются от клиента к серверу не запросы на ввод-вывод (как в системах с файловым сервером), а запросы на языке SQL, а их объем существенно меньше. Основное достоинство RDA-модели заключается в унификации интерфейса "клиент-сервер" в виде языка SQL. Действительно, взаимодействие прикладного компонента с ядром СУБД невозможно без стандартизованного средства общения. Запросы, направляемые программой ядру, должны быть понятны обеим сторонам. Для этого их следует сформулировать на специальном языке. Но в СУБД уже существует язык SQL, о котором речь шла выше. Поэтому было бы целесообразно использовать его не только в качестве средства доступа к данным, но и как стандарта общения клиента и сервера. К сожалению, RDA-модель не лишена ряда недостатков. Во-первых, взаимодействие клиента и сервера посредством SQL-запросов существенно загружает сеть. Во-вторых, удовлетворительное администрирование приложений в RDA-модели практически невозможно из-за совмещения в одной программе различных по своей природе функций (функции представления и прикладные функции). 68
Наряду с RDA-моделью все большую популярность приобретает перспективная DBS-модель. Последняя реализована в некоторых реляционных СУБД (Informix, Ingres, Sybase, Oracle, InterBase). Ее основу составляет механизм хранимых процедур ⎯ средство программирования SQL-сервера. Процедуры хранятся в словаре базы данных, разделяются между несколькими клиентами и выполняются на том же компьютере, где функционирует SQL-сервер. Язык, на котором разрабатываются хранимые процедуры (SQL/PTL), представляет собой процедурное расширение языка запросов SQL и уникален для каждой конкретной СУБД. В DBS-модели компонент представления выполняется на компьютереклиенте, в то время как прикладной компонент оформлен как набор хранимых процедур и функционирует на компьютере-сервере БД. Там же выполняется компонент доступа к данным, то есть ядро СУБД. Достоинствами DBS-модели являются: а) возможность централизованного выполнения прикладных функций; б) снижение трафика (вместо SQL-запросов по сети направляются вызовы хранимых процедур); в) возможность разделения процедуры между несколькими приложениями; г) экономия ресурсов компьютера за счет использования единожды созданного плана выполнения процедуры. К недостаткам можно отнести ограниченность средств, используемых для написания хранимых процедур, которые представляют собой разнообразные процедурные расширения SQL, не выдерживающие сравнения по функциональным возможностям с языками третьего поколения, такими как C# или Delphi. Сфера их использования ограничена конкретной СУБД, в большинстве СУБД отсутствуют возможности отладки и тестирования разработанных хранимых процедур. Модель сервера баз данных представлена на рисунке 18. Клиент Компонент представления
Вызовы API
Сервер Прикладной компонент
Компонент доступа к ресурсам
Рисунок 18 ⎯ Модель сервера баз данных. На практике часто используется смешанные модели, когда поддержка целостности базы данных и некоторые простейшие прикладные функции выполняются хранимыми процедурами (DBS-модель), а более сложные функции реализуются непосредственно в прикладной программе, которая работает на компьютере-клиенте (RDA-модель). Так или иначе, современные 69
многопользовательские СУБД опираются на RDA- и DBS-модели и при создании информационной системы, предполагающей использование только СУБД, выбирают одну из этих двух моделей, либо их разумное сочетание. В AS-модели процесс, выполняющийся на компьютере-клиенте, отвечает, как обычно, за интерфейс с пользователем (то есть реализует функции первой группы). Обращаясь за выполнением услуг к прикладному компоненту, этот процесс играет роль клиента приложения (Application Client ⎯ AC). Прикладной компонент реализован как группа процессов, выполняющих прикладные функции, и называется сервером приложения (Application Server ⎯ AS). Все операции над информационными ресурсами выполняются соответствующим компонентом, по отношению к которому AS играет роль клиента. Из прикладных компонентов доступны ресурсы различных типов ⎯ базы данных, очереди, почтовые службы и др. Модель сервера приложений представлена на рисунке 19. Клиент Компонент представления
Вызовы API
Сервер Прикладной компонент
SQL
Сервер Компонент доступа к ресурсам
Рисунок 19 ⎯ Модель сервера приложений. RDA- и DBS-модели опираются на двухзвенную схему разделения функций. В RDA-модели прикладные функции приданы программе-клиенту, в DBS-модели ответственность за их выполнение берет на себя ядро СУБД. В первом случае прикладной компонент сливается с компонентом представления, во втором ⎯ интегрируется в компонент доступа к информационным ресурсам. В AS-модели реализована трехзвенная схема разделения функций, где прикладной компонент выделен как важнейший изолированный элемент приложения. Для его определения используются универсальные механизмы многозадачной операционной системы, и стандартизованы интерфейсы с двумя другими компонентами. AS-модель является фундаментом для мониторов обработки транзакций (Transaction Processing Monitors ⎯ TPM), или, проще, мониторов транзакций, которые выделяются как особый вид программного обеспечения.
70
4.2 Конфигурирование клиентского интерфейса с помощью среды Visual Studio Информация, хранящаяся в базе данных, должна быть представлена в удобном формате для повседневных операций и анализа пользователями, их группами и процессами. Для решения этой задачи среда Visual Studio.NET имеет богатые возможности: автоматическое построение диаграммы базы данных; конструирование таблиц и представлений; программирование на языке TransactSQL хранимых процедур, функций и триггеров; наконец, дерево решений с многочисленными папками, запросами и файлами различных типов, при загрузке которых автоматически вызываются связанные с ними программы обработки. К тому же проекты обеспечивают включение новых деревьев решений с точно такими же возможностями. Рассмотрим конфигурирование каждого из перечисленных элементов интерфейса. Диаграмма базы данных ⎯ это путеводитель по ее текущему состоянию. Она включает поименованные таблицы, названия столбцов, первичные и внешние ключи, а также связи между таблицами. При каком-либо изменении структуры базы данных ее диаграмма может быть легко обновлена с помощью команды контекстного меню базы Add New Diagram. В открывающемся окне Add Table следует последовательно добавлять таблицы базы данных. После его закрытия диаграмма со всеми связями создается автоматически. При необходимости с помощью встроенного графического редактора ей можно придать любой желаемый вид. Таблицы обеспечивают отображение хранящихся в них данных, их корректировку и ввод новых данных. Для этих целей их надо открывать с помощью команды Show Table Data контекстного меню соответствующей таблицы. Тех же целей можно достичь и командами языка Transact-SQL SELECT, UPDATE и INSERT. Новая таблица может быть создана визуально с помощью команды Add New Table контекстного меню Table или командой CREATE TABLE языка запросов Transact-SQL. При необходимости структура таблицы может быть изменена без потери информации и целостности базы данных командой Open Table Definition контекстного меню либо командой ALTER TABLE языка Transact-SQL (см. раздел 3.2 и приложение В). Представления ⎯ это виртуальные таблицы, или формы для целевого отображения информации из одной или нескольких таблиц. Они реализуются командой SELECT (запросом) и конструируются с помощью команды Add New View контекстного меню Views или команды CREATE VIEW языка Transact-SQL (см. раздел 3.5 и приложение Е). Их модификация производится соответственно командами Open View Definition и ALTER VIEW. Информация отображается на экране после исполнения команды Show Result контекстного меню представления или команды Execute SQL в окне конструктора представления. Представления должны иметь выразительные и простые названия, связанные с предметной областью и характером отображаемой информации. С помощью 71
многоступенчатой нумерации их можно сгруппировать в соответствии с требованиями пользователя. По мере необходимости легко могут создаваться новые запросы, расширяющие функциональность системы. Вновь созданные представления могут затем использоваться в любых запросах. Хранимые процедуры и функции реализуют часто используемые виды обработки, которые желательно выполнять на стороне сервера (см. раздел 3.6 и приложение Ж). При конфигурировании интерфейса в дереве решений могут быть созданы запросы со сценариями вызова хранимых процедур и функций, которые обеспечат требуемую обработку данных и желаемую форму результатов. По требованию заказчика сценарии запросов, как и сами процедуры и функции могут быть легко изменены, поскольку они всегда хранятся на языке TransactSQL. Для формирования удобного интерфейса значительную роль могут сыграть триггеры. Триггеры ⎯ это сценарии, запускаемые до выполнения, вместо или после выполнения команд INSERT, UPDATE или DELETE (см. раздел 3.7 и приложение З). Они реализуют контекстную зависимость обработки текстов на языке Transact-SQL и предоставляют пользователю дополнительную возможность ввода, корректировки, отображения, обработки и контроля данных, а также событийно-зависимые средства управления самой системой. Состав триггеров и их функции могут изменяться по желанию пользователя и в соответствии с накапливаемым опытом эксплуатации системы. Большие возможности по созданию удобного пользовательского интерфейса предоставляет окно дерева решений Solution Explorer среды Visual Studio.NET. В минимальном размере окно образуется автоматически при создании того или иного проекта, а затем формируется пользователем с помощью специальных команд включения существующих (Add Existing Item…) или добавления новых (Add New Item…) файлов различного типа, папок и даже проектов среды. В итоге создается иерархическая система файлов, папок и проектов, являющихся новыми или включенными из любых папок файловой системы Windows. Новые папки можно располагать в соответствии с иерархией объектов предметной области, а файлам давать такие названия, которые удобны и понятны пользователям системы. В итоге для разрабатываемой информационной системы был создан интерфейс в виде дерева объектов базы данных и дерева принятых решений, который соответствует цели и задачам проекта.
72
4.3 Реализация клиентского приложения с помощью проекта на языке C# В среде Microsoft Visual Studio.NET работа по созданию клиентского приложения начинается с построения проекта для выбранного языка программирования, который выбирается в окне, открывающемся после исполнения команды среды File/New/Project. В приложении И приведены порядок построения проекта приложения на языке C#, автоматически создаваемые при этом папки и файлы, а также содержимое текстовых файлов для разрабатываемой информационной системы (см. рисунки 20 и 21).
Рисунок 20 ⎯ Состояние среды после создания проекта приложения
73
Рисунок 21 ⎯ Папки и файлы проекта клиентского приложения Назначение папок и файлов вновь созданного проекта клиентского приложения следующее: а) Solution ‘MakurinClientApplication’ ⎯ папка решений проекта приложения; б) XML-файл MakurinClientApplication.sln ⎯ для описания параметров решения; в) XML-файл MakurinClientApplication.csproj ⎯ для описания параметров проекта; г) папка Properties ⎯ для хранения свойств проекта; д) папка References ⎯ для ссылок на системные библиотеки; е) папка MakurinMainClientForm ⎯ для автоматически генерируемых модулей главной формы приложения; ж) файл MakurinClientProgram.cs ⎯ корневой модуль приложения; з) файл MakurinMainClientForm.cs ⎯ для исходного кода главной формы; и) файл MakurinMainClientForm.cs ⎯ для создания главной формы; к) файл MakurinMainClientForm.resx ⎯ для описания ресурсов главной формы. Во время отладки проекта среда Visual Studio.NET создает дополнительные папки и файлы, в которых хранятся тексты на промежуточном языке IL и другая системная информация: папки bin, Debug, obj, исполнительный файл MakurinClientApplication.exe и т.д. На главной форме размещаем управляющий элемент DataGridView, чтобы показать порядок создания форм для работы с таблицами. Затем создаем отдельную форму для каждой таблицы, открывая их с помощью кнопок главной формы. Порядок создания форм и работа приложения показана на следующих экранных формах:
74
75
76
77
78
79
80
81
82
83
84
85
5 Отладка и тестирование информационной системы Одним из важных достоинств среды Visual Studio.NET является высокий уровень и разнообразие отладочных средств. Команды, сценарии, запросы и хранимые подпрограммы языка Transact-SQL подвергаются тщательному синтаксическому анализу с выдачей сообщений об ошибках и местах предполагаемого их нахождения. Еще более строгий синтаксический контроль имеет место при разработке модулей клиентского приложения на языке C#. Логический и семантический контроль информационной системы производился на всех этапах ее проектирования. Тщательно выбирались базовые сущности и определялись их атрибуты, определялись табличные представления и типы данных, устанавливались виды ограничений на столбцы и связи между таблицами (см. таблицы 1-6), подбирались тестовые наборы данных и вводились в базу данных с учетом установленных ограничений (см. таблицы 7-12). Например, сначала заполнялись первичные таблицы, а затем таблицы, которые ссылались на них, при этом использовались допустимые значения внешних ключей. Возможность открытия таблиц в режиме редактирования с помощью команды Show Table Data контекстного меню той или иной таблицы позволило проверить все наложенные на данные ограничения. Например, было установлено, что даты, меньшие 01.01.1773 (года ввода Григорианского календаря), не допускаются в базах данных, из-за проблем их сравнения, так как в разных странах был свой учет времени (см. раздел 3.3). Для хранимых процедур и функций написаны и включены в папку решений сценарии их вызова с целью проверки правильности их функционирования. То же самое было сделано и для триггеров. Выяснилось, что для проверки какого-либо триггера следует удалять все остальные, чтобы не было противоречий в их действиях. Клиентское приложение отлаживалось с помощью отладочных средств, которыми располагает среда языка C#: пошаговое исполнение методов классов, начиная от установленного положения курсора, контроль значений атрибутов классов и т.д. Взаимодействие клиентского приложения и базы данных производилось с помощью разработанных форм, позволяющих отображать таблицы и представления, корректировать отображаемые данные и вводить новые данные, а также удалять строки в таблицах. Таким образом, с помощью специально подготовленных тестовых данных проверена заданная функциональность системы и подтверждена ее готовность работать в реальных условиях эксплуатации. Вместе с тем благодаря наличию сценариев на языке Transact-SQL, исходных модулей на языке C# и богатым возможностям среды разработки всегда можно усовершенствовать как базу данных, так и клиентский интерфейс созданной информационной системы.
86
6 Конфигурирование информационной системы Требования к информационным системам все возрастают и меняются как со временем, так и с опытом эксплуатации. Чтобы производить необходимые в связи с этим изменения в системе, ее снабжают графическими средствами для модификации интерфейса и собственными системами программирования для адаптации компонент по обработке данных. Эти средства называют конфигуратором системы, так что система может работать либо в режиме конфигурирования, когда специалист производит необходимые усовершенствования, либо в исполнительном режиме, когда пользователь выполняет предписанные ему функции с использованием этой системы. Примером системы с конфигуратором является промышленная и очень популярная система 1С:Предприятие, на базе которой фирма 1С, создавшая эту систему, с помощью конфигуратора выпустила систему для бухгалтерского учета 1С:Бухгалтерия, систему для учета складского хозяйства и многие другие системы для автоматизации финансовой и хозяйственной деятельности предприятий вплоть до оперативного учета. Среда разработки Visual Studio.NET предоставляет пользователям универсальные средства для создания конфигурируемых, или адаптируемых систем, встраиваемых в эту среду, что делает ее высокоуровневым и многофункциональным инструментом разработки и реализации коммерческих, так и неоценимым пособием в учебном процессе. Возможность создания конфигурируемых систем в среде Visual Studio.NET обеспечивается: а) наличием высокоуровневого языка структурных запросов Trasact-SQL; б) удобными графическими средствами построения баз данных и их объектов: таблиц, пользовательских форм (представлений), хранимых процедур и функций ⎯ библиотеки подпрограмм на языке Trasact-SQL для специальной обработки данных, триггеров и запросов, обеспечивающих желаемую функциональность системы; в) простой и надежной системой ввода и корректировки данных с графическим интерфейсом; г ) иерархическим интерфейсом в виде дерева решений, обеспечивающим доступ и активное взаимодействие как со средствами проектирования (конфигуратором системы), так и с исполнительными компонентами проектируемой системы (приложением базы данных); д) визуальными объектно-ориентированными средствами создания клиентских приложений с использованием целого набора интегрированных в единую систему объектно-ориентированных языков программирования; е) включением новых папок на любом уровне иерархии и существующих файлов любых типов и способностью автоматически запускать приложенияобработчики этих файлов. 87
Чтобы выполнить конфигурирование спроектированной информационной системы на новой установке заказчика, где имеется среда Visual Studio.NET, необходимо выполнить следующие этапы: 1. Создание проекта базы данных (см. раздел 3.1 и приложения А и Б); 2. Создание таблиц с помощью разработанных сценариев на языке TrasactSQL(см. раздел 3.2 и приложение В); 3. Создание представлений с помощью разработанных сценариев на языке Trasact-SQL (см. раздел 3.5 и приложение Е); 4. Создание хранимых процедур и функций с помощью разработанных сценариев на языке Trasact-SQL (см. раздел 3.6 и приложение Ж); 5. Создание триггеров с помощью разработанных сценариев на языке Trasact-SQL (см. раздел 3.7 и приложение З); 6. Заполнение базы тестовыми данными (см. раздел 3.3 и приложение Г); 7. Построение дерева решений (см. раздел 4.2); 8. Включение проекта клиентского приложения со всеми необходимыми модулями и формами (см. раздел 4.3 и приложение Д); 9. Включение справочных, графических, аудио- и видио-файлов, обеспечивающих пользователя документальными и инструктивными материалами , которые создают комфортные условия для работы пользователей различной категории(см. раздел 4.2); 10. Создание и включение запросов, расширяющих функциональность системы и учитывающих специальные требования заказчика(см. раздел 3.4 и приложение Д);
88
Заключение Учебное пособие может использоваться для подготовки лекций по базам данных, проведения лабораторных занятий и курсового проектирования. К нему придается компакт-диск, на котором помимо самого пособия записаны следующие методические и программные материалы: а) полный проект базы данных, рассмотренный в пособии; б) проект несложного клиетского приложения на языке C#; в) пояснительная записка прототипа курсового проекта учебной информационной системы; г) справочная информация по форматам команд языка структурных запросов Transact-SQL; д) описание десяти предметных областей вместе с диаграммами, таблицами и вариантами запросов для построения объектов баз данных ; е) описание вариантов заданий для курсового проектирования; ж) учебные пособия и книги по базам данных и языку C#.
Список использованных источников 1. Грофф Дж., Вайнберг П. SQL: Полное руководство./ 2-е изд. – К., 2001. 2. Нильсен П. Microsoft SQL Server 2005. Библия пользователя.: Пер. с англ. – М.: ООО «И. Д. Вильямс», 2008. – 1232 с. 3. Сивохин А.В., Шибанов С.В., Самуйлов С.В. Разработка и сопровождение БД в среде MS SQL Server (Текстовый документ). - Пенза, 2005. 4. Сивохин А.В. Конспект лекций по дисциплине: Разработка и администрирование баз данных в среде СУБД MS SQL SERVER 5. Мартин Г. Понимание SQL. – Лори, 2006. 6. Мартин Г. SQL. Справочное руководство. – Лори, 2006. 7. Шкарина Л. Язык SQL: учебный курс, - СПб.: Питер, 2001, - 592 с. 8. Нильсен П. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. ⎯ М. : ООО «И.Д.Вильямс», 2008. ⎯ 1232с. : ил. ⎯ Парал. тит. англ.
89
Приложение А Экранные формы для создания проекта базы данных в среде Microsoft Visual Studio 2005
90
1. Создание проекта базы данных в среде Microsoft Visual Studio 2005 1.1. Создание папки для проекта
1.2. Выбор команды для создания проекта
91
1.3. Выбор типа проекта и ввод его имени
92
1.4. Задание имени базы данных и подключение к серверу
1.5. Выбор сервера
1.6. Выбор пути для базы данных и задание его имени 93
1.7. Завершение создания базы данных 94
1.8. Контроль завершения создания базы данных
95
96
97
98
1.9. Выбор проекта базы данных и открытие рабочих окон
99
2. Содержание проектного файла «D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. по СУБД\MakurinDatabaseProject\MakurinDatabaseProject.sln» Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{4F174C21-8C12-11D0-8340-0000F80270F8}") = "MakurinDatabaseProject", "MakurinDatabaseProject.dbp", "{F25606A0-3C14-494CA629-9B3FCCC7094B}" EndProject Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal
3. Содержание проектного файла «D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. по СУБД\MakurinDatabaseProject\MakurinDatabaseProject.dbp» # Microsoft Developer Studio Project File - Database Project Begin DataProject = "MakurinDatabaseProject" MSDTVersion = "80" DefDBRef = "MakurinDatabase.mdf" Begin Folder = "Change Scripts" End Begin Folder = "Create Scripts" End Begin DBRefFolder = "Database References" Begin DBRefNode = "MakurinDatabase.mdf" ConnectStr = "|Data Source=.\SQLEXPRESS;AttachDbFilename=""D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. по СУБД\MakurinDatabaseProject\MakurinDatabase.mdf"";Integrated Security=True;Connect Timeout=30;User Instance=True|004400610074006100200053006f0075007200630065003d002e005c005 30051004c0045005800500052004500530053003b00410074007400610063006800440 06200460069006c0065006e0061006d0065003d00220044003a005c041a044304400441 043e0432043e04390020043f0440043e0435043a0442002004410442044304340435043 d044204300020043304400443043f043f044b0020003000370412041f00310020041c04 30043a044304400438043d04300020042e002e0414002e0020043f043e0020042104230 4110414005c004d0061006b007500720069006e00440061007400610062006100730065 100
00500072006f006a006500630074005c004d0061006b007500720069006e00440061007 400610062006100730065002e006d006400660022003b0049006e007400650067007200 61007400650064002000530065006300750072006900740079003d0054007200750065 003b0043006f006e006e006500630074002000540069006d0065006f00750074003d003 30030003b005500730065007200200049006e007300740061006e00630065003d005400 7200750065" Provider = "{91510608-8809-4020-8897-FBA057E22D54}" Colorizer = 6 End End Begin Folder = "Queries" End End
4. Созданный проект базы данных вместе с новыми базами данных, включенными проектами, папками и файлами
101
Приложение Б Сценарии и экранные формы вариантов создания баз данных
102
1. Сценарии вариантов создания баз данных --1.1. Создание базы данных для учета продаж с именем Sales и использованием -- одного файла данных Sales_dat и одного файла для журнала транзакций -- Sales_log в папке, определяемой спецификацией -- «D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. по СУБД -- \Учебные базы данных». Максимальные размеры файлов 50 и 25 мегабайт -- соответственно, а их приращения составляют 5 мегабайт. -- Команды языка Transact-SQL таковы: USE master--Эта системная база необходима при создании баз данных пользоватея -- Указание серверу о необходимости выполнения команды или скрипта: GO DROP DATABASE Sales GO CREATE DATABASE Sales ON PRIMARY (NAME = Sales_dat, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\Sales_dat.mdf', SIZE = 10,-- Единица памяти по умолчанию мегабайт «МВ»(см. ниже) MAXSIZE = 50,-- Единица памяти по умолчанию мегабайт «МВ»(см. ниже) FILEGROWTH = 5 -- Единица памяти по умолчанию мегабайт «МВ»(см. -ниже) ) LOG ON (NAME = Sales_log, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\Sales_log.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) GO
103
--1.2. Создание баз данных с именем Archive и использованием трех файла -- данных по 10 Мбайт и одного файлов для журнала транзакций также по 10 Мбайт -- с помощью следующих команд Transact-SQL: USE master GO DROP DATABASE Archive GO CREATE DATABASE Archive ON PRIMARY (NAME = Arch1_dat, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\Arch1_dat.mdf', SIZE = 10MB, MAXSIZE = 20MB, FILEGROWTH = 2MB ), (NAME = Arch2_dat, -- вторичные файлы *.mdf: FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\Arch2_dat.mdf', SIZE = 10MB, MAXSIZE = 20MB, FILEGROWTH = 2MB ), (NAME = Arch3_dat, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\Arch3_dat.mdf', SIZE = 10MB, MAXSIZE = 20MB, FILEGROWTH = 2MB ) LOG ON (NAME = Arch1_log, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. 104
-SIZE = 10MB, MAXSIZE = 20MB, FILEGROWTH = 2MB )
по СУБД\Учебные базы данных\Arch1_log.ldf',
GO --1.3. Создание базы данных с именем Products и указанием только файла -- данных Product_dat размером в 4 Мбайт с помощью следующих команд: USE master GO DROP DATABASE Products GO CREATE DATABASE Products ON (NAME = Products_dat, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\Products_dat.mdf', SIZE = 4, MAXSIZE = 10, FILEGROWTH = 1 ) GO --1.4. Создание базы данных с именем MyTest и без указания ни первичного -- файла данных, ни файла для журнала транзакций с помощью следующих -- команд: USE master GO DROP DATABASE MyTest GO
105
CREATE DATABASE MyTest --
--Создание в папке, используемой по умолчанию, например, «C:\Мои документы»
GO --1.5. Создание базы данных с именем ProductsNew и без указания физических -- характеристик файла данных и файла для журнала транзакций с помощью -- следующих команд: USE master GO DROP DATABASE ProductsNew GO CREATE DATABASE ProductsNew ON (NAME = Product2_dat, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\ProductNew_dat.mdf' ) GO --1.6. Создание базы данных с именем GroupSales и использованием трех групп файлов -- с помощью следующих команд: USE master GO DROP DATABASE GroupSales GO CREATE DATABASE GroupSales ON PRIMARY (NAME = GroupSalesPrim1_dat, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. 106
-по СУБД\Учебные базы данных\GroupSalesPrim1_dat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ),
(NAME = GroupSalesPrim2_dat, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\GroupSalesPrim2_dat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ), FILEGROUP SalesGroup1 (NAME = SalesGrp1Fil1_dat , FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\SalesGrp1Fil1_dat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), (NAME = SalesGrp1Fil2_dat, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\SalesGrp1Fil2_dat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), FILEGROUP SalesGroup2 (NAME = SalesGrp2Fil1_dat , FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\SalesGrp2Fil1_dat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), 107
(NAME = SalesGrp2Fil2_dat , FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\SalesGrp2Fil2_dat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON (NAME = GroupSales_log, FILENAME = 'D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. -по СУБД\Учебные базы данных\GroupSales_log.ldf', SIZE = 5, MAXSIZE = 25, FILEGROWTH = 5 ) GO
2. Экранные формы вариантов создания баз данных 2.1. Состояние сервера до создания учебных баз
108
2.2. Содержание папки до создания учебных баз
2.3. Выполнение команд создания шести учебных баз
109
110
111
2.4. Выбор команды для соединения с учебной базой
2.5. Выбор источника данных для учебной базы 112
2.6. Выбор учебной базы (первичного файла)
113
2.7. Соединение с сервером выбранной учебной базы
2.8. Содержание папки после создания учебных баз 114
2.9.Состояние сервера после создания учебных баз
115
Приложение В Сценарии и экранные формы для создания таблиц
116
1. Экранная форма создания учебных таблиц
--
2. Сценарий создания таблицы «Авторы»
/****** Object: Table [dbo].[Авторы] Script Date: 11/24/2009 15:11:07 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Авторы]') AND type in (N'U')) DROP TABLE [dbo].[Авторы] GO /****** Object: Table [dbo].[Авторы] Script Date: 11/24/2009 15:11:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Авторы]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Авторы]( [Код автора] [int] NOT NULL, [Фамилия автора] [char](20) NOT NULL, [Имя автора] [char](20) NULL, [Отчество автора] [char](20) NULL, 117
[Дата рождения] [datetime] NULL, [Дата смерти] [datetime] NULL, [Код страны] [int] NULL, [Место проживания] [char](100) NOT NULL, CONSTRAINT [PK_Авторы] PRIMARY KEY CLUSTERED ( [Код автора] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO /****** Object: Index [PK_ Author_Family_Name] Script Date: 11/24/2009 15:11:07 ******/ IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[Авторы]') AND name = N'PK_ Author_Family_Name') CREATE NONCLUSTERED INDEX [PK_ Author_Family_Name] ON [dbo].[Авторы] ( [Фамилия автора] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Авторы_Страны]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [FK_Авторы_Страны] FOREIGN KEY([Код страны]) REFERENCES [dbo].[Страны] ([Код страны]) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Author_Deathdate]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_ Author_Deathdate] CHECK (('01.01.1753'<=[Дата смерти] AND [Дата смерти]<='01.01.2010')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Author_Family_Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_ Author_Family_Name] CHECK (([Фамилия автора] like '[А-Яа-я ][А-Яа-я ][А-Яа-я 118
][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Author_Father_Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_ Author_Father_Name] CHECK (([Отчество автора] like '[А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Author_First_Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_ Author_First_Name] CHECK (([Имя автора] like '[А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яая ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Author_Birthdate]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_Author_Birthdate] CHECK (('01.01.1753'<=[Дата рождения] AND [Дата рождения]<='01.01.2010')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Author_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_Author_Code] CHECK (((1)<=[Код автора] AND [Код автора]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Author_Place]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_Author_Place] CHECK (([Место проживания] like '[А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9119
][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Country_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_Country_Code] CHECK (((1)<=[Код страны] AND [Код страны]<=(99))) GO --
3. Сценарий создания таблицы «Жанры»
/****** Object: Table [dbo].[Жанры] Script Date: 11/24/2009 15:11:51 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Жанры]') AND type in (N'U')) DROP TABLE [dbo].[Жанры] GO /****** Object: Table [dbo].[Жанры] Script Date: 11/24/2009 15:11:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Жанры]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Жанры]( [Код жанра] [int] NOT NULL, [Название жанра] [char](100) NOT NULL, CONSTRAINT [PK_Жанры] PRIMARY KEY CLUSTERED ( [Код жанра] ASC 120
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Genere _Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Жанры]')) ALTER TABLE [dbo].[Жанры] WITH CHECK ADD CONSTRAINT [CK_ Genere _Name] CHECK (([Название жанра] like '[А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Genere_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Жанры]')) ALTER TABLE [dbo].[Жанры] WITH CHECK ADD CONSTRAINT [CK_Genere_Code] CHECK (((1)<=[Код жанра] AND [Код жанра]<=(99))) GO --
4. Сценарий создания таблицы «Места нахождения»
/****** Object: Table [dbo].[Места нахождения] Script Date: 11/24/2009 15:12:18 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Места нахождения]') AND type in (N'U')) DROP TABLE [dbo].[Места нахождения] GO /****** Object: Table [dbo].[Места нахождения] Script Date: 11/24/2009 15:12:18 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON 121
GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Места нахождения]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Места нахождения]( [Код места нахождения] [int] NOT NULL, [Название места нахождения] [char](120) NOT NULL, CONSTRAINT [PK_Места нахождения] PRIMARY KEY CLUSTERED ( [Код места нахождения] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Placement _Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Места нахождения]')) ALTER TABLE [dbo].[Места нахождения] WITH CHECK ADD CONSTRAINT [CK_ Placement _Name] CHECK (([Название места нахождения] like '[А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я 122
.,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Placement_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Места нахождения]')) ALTER TABLE [dbo].[Места нахождения] WITH CHECK ADD CONSTRAINT [CK_Placement_Code] CHECK (((1)<=[Код места нахождения] AND [Код места нахождения]<=(99))) GO --
5. Сценарий создания таблицы «Произведения»
/****** Object: Table [dbo].[Произведения] Script Date: 11/24/2009 15:12:49 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Произведения]') AND type in (N'U')) DROP TABLE [dbo].[Произведения] GO /****** Object: Table [dbo].[Произведения] Script Date: 11/24/2009 15:12:49 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Произведения]') AND type in (N'U')) BEGIN 123
CREATE TABLE [dbo].[Произведения]( [Код произведения] [int] NOT NULL, [Название произведения] [char](100) NOT NULL, [Код жанра] [int] NOT NULL, [Код средств создания] [int] NOT NULL, [Код автора] [int] NOT NULL, [Дата создания] [datetime] NULL, [Код страны] [int] NOT NULL, [Код места нахождения] [int] NOT NULL, [Цена] [real] NULL, CONSTRAINT [AK_Creation_Name] PRIMARY KEY CLUSTERED ( [Код произведения] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Авторы]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Авторы] FOREIGN KEY([Код автора]) REFERENCES [dbo].[Авторы] ([Код автора]) GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Жанры]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Жанры] FOREIGN KEY([Код жанра]) REFERENCES [dbo].[Жанры] ([Код жанра]) GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Места нахождения]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Места нахождения] FOREIGN KEY([Код места нахождения]) REFERENCES [dbo].[Места нахождения] ([Код места нахождения]) GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Средства создания]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) 124
ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Средства создания] FOREIGN KEY([Код средств создания]) REFERENCES [dbo].[Средства создания] ([Код средств создания]) GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Страны]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Страны] FOREIGN KEY([Код страны]) REFERENCES [dbo].[Страны] ([Код страны]) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Author_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Author_Code] CHECK (((1)<=[Код автора] AND [Код автора]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Code] CHECK (((1)<=[Код произведения] AND [Код произведения]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Country_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Country_Code] CHECK (((1)<=[Код страны] AND [Код страны]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Date]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Date] CHECK (('01.01.1753'<=[Дата создания] AND [Дата создания]<='01.01.2010')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Genere_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Genere_Code] CHECK (((1)<=[Код жанра] AND [Код жанра]<=(99))) 125
GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Name] CHECK (([Название произведения] like '[А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Placemtnt_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Placemtnt_Code] CHECK (((1)<=[Код места нахождения] AND [Код места нахождения]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Tools_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Tools_Code] CHECK (((1)<=[Код средств создания] AND [Код средств создания]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Price]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Price] CHECK (((1)<=[Цена] AND [Цена]<=(99999999))) GO
126
--
6. Сценарий создания таблицы «Средства создания»
/****** Object: Table [dbo].[Средства создания] Script Date: 11/24/2009 15:13:21 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Средства создания]') AND type in (N'U')) DROP TABLE [dbo].[Средства создания] GO /****** Object: Table [dbo].[Средства создания] Script Date: 11/24/2009 15:13:21 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Средства создания]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Средства создания]( [Код средств создания] [int] NOT NULL, [Описание средств создания] [char](100) NOT NULL, CONSTRAINT [PK_Средства создания] PRIMARY KEY CLUSTERED ( [Код средств создания] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Tools _Description]') AND parent_object_id = OBJECT_ID(N'[dbo].[Средства создания]')) ALTER TABLE [dbo].[Средства создания] WITH CHECK ADD CONSTRAINT [CK_ Tools _Description] CHECK (([Описание средств создания] like '[А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А127
Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Tools_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Средства создания]')) ALTER TABLE [dbo].[Средства создания] WITH CHECK ADD CONSTRAINT [CK_Tools_Code] CHECK (((1)<=[Код средств создания] AND [Код средств создания]<=(99))) GO --
7. Сценарий создания таблицы «Страны»
/****** Object: Table [dbo].[Страны] Script Date: 11/24/2009 15:13:47 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Страны]') AND type in (N'U')) DROP TABLE [dbo].[Страны] GO /****** Object: Table [dbo].[Страны] Script Date: 11/24/2009 15:13:47 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Страны]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Страны]( [Код страны] [int] NOT NULL, [Название страны] [char](100) NOT NULL, CONSTRAINT [PK_Страны] PRIMARY KEY CLUSTERED ( [Код страны] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[5CK_Prim_Country_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Страны]')) 128
ALTER TABLE [dbo].[Страны] WITH CHECK ADD CONSTRAINT [5CK_Prim_Country_Code] CHECK (((1)<=[Код страны] AND [Код страны]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Country _Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Страны]')) ALTER TABLE [dbo].[Страны] WITH CHECK ADD CONSTRAINT [CK_ Country _Name] CHECK (([Название страны] like '[А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO
129
Приложение Г Сценарии и экранные формы для ввода данных в базу
130
--
1. Сценарий заполнения таблицы «Авторы»
INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (1, 'Да Винчи', 'Леонардо', 'Ди сер Пьеро', 1753, 1753, 3, 'Тоскана') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (2, 'Суриков', 'Василий', 'Иванович', '01.24.1848', '03.19.1916', 1, 'Красноярск') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (3, 'Петров', 'Василий', 'Григорьевич', '12.12.1833', '05.29.1882', 1, 'Тобольск') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (4, 'Айвазовский', 'Иван', 'Константинович', '07.17.1817', '04.02.1900', 'Феодосия') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (5, 'Шишкин', 'Иван', 'Иванович', '01.13.1832', '03.08.1898', 1, 'Татарстан') 131
1,
INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (6, 'Лоррен', 'Клод', 'Желле', '01.01.1753', '12.31.1753', 2, 'Тулуза') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (7,'Пикассо', 'Пабло', NULL, '10.25.1881', '04.08.1973', 2, 'Малага') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (8,'Имя', 'автора', 'неизвестно', '01.01.1753', '01.01.2010', 8, 'Неизвестно') --
2. Сценарий заполнения таблицы «Жанры»
INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (1, 'Портрет') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (2, 'Натюрморт') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: 132
VALUES (3, 'Архитектура') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (4, 'Пейзаж') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (5, 'Графика') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (6, 'Фотография') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (7, 'Жанр неизвестен') --
3. Сценарий заполнения таблицы «Места нахождения»
INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (1, 'Лондон. Британский музей') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES 133
(2,
'Пенза. Пензенская областная картинная галерея')
INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (3, 'Венеция. Музей армянской конгрегации мхитаристов') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (4, 'Петергоф Ленинградской области. Дворцы-музеи и парки Петродворца') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (5, 'Феодосия. Феодосийская картинная галерея им. И. К. Айвазовского') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (6, 'Санкт-Петербург. Государственный Эрмитаж') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (7, 'Лувр. Картинная галерея') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES 134
(8,
'Краков. Музей Чарторыжских')
INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (9, 'Москва. Государственная Третьяковская галерея') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (10, 'Челябинск. Челябинская областная картинная галерея') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (11, 'Место нахождения неизвестно') --
4. Сценарий заполнения таблицы «Произведения»
INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (1, 'Гора Арарат', 4, 1, 4, '1885', 3, 3, INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (2, 'Абсент', 1, 6, 7, 1753, 1, 6, NULL) INSERT INTO [Произведения] --Список столбцов: 135
NULL)
([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (3, 'Мона Лиза (Джоконда)', 1, 3, 1, '1753', NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (4, 'Берег моря ночью', 4, 1, 4, '1837', 1, INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (5, 'Дама с горностаем', 1, 3, 1, '1753', 7, 8, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (6, 'В Крыму', 4, 2, 5, '1890', 1, 2, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (7, 'Витрувианский человек', 5, 4, 1, '1753', 3, 1, NULL) 136
2,
7,
5,
NULL)
INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (8, 'С гитарой (Портрет С.А. Кропоткиной)', 1, 5, 2, '1882', 1, 9, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (9, 'Хаос(Сотворение мира)', 4, 1, 4, '1841', 3, 3, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (10, 'Завоевание Сибири Ермаком', 4, 1, 2, 1895, 1, 9, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (11, 'Утопленница', 4, 1, 3, '1867', 1, 9, INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (12, 'Неаполитанский залив', 4, 1, 4, '1841', 1, 4, NULL) 137
NULL)
INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (13, 'Последний кабак у заставы', 4, 1, 3, '1868', 1, 9, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (14, 'Ураган на море', 4, 1, 4, '1889', 1, 5, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (15, 'В Сиверской', 4, 1, 5, '1896', 1, 10, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (16, 'Возвращение Одисея из страны фиаков', 4, 7, 6, 1753, 6, 1, NULL) --
5. Сценарий заполнения таблицы «Средства создания»
INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (1, 'Холст, масло') 138
INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (2, 'Холст на картоне, масло') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (3, 'Дерево, масло') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (4, 'Бумага, мел') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (5, 'Бумага, акварель') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (6, 'Акварель') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (7, 'Средства создания неизвестны') --
6. Сценарий заполнения таблицы «Страны»
INSERT INTO [Страны] 139
--Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (1, 'Россия') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (2, 'Франция') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (3, 'Италия') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (4, 'Испания') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (5, 'Португалия') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (6, 'Англия') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) 140
--Список значений: VALUES (7, 'Польша') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (8, 'Страна неизвестна') --
7. Ввод стоимости в таблицу «Произведения»
UPDATE [Произведения] -- Гора Арарат Айвазовского И.К. SET [Цена] = 836 WHERE [Код произведения] = 1 UPDATE [Произведения] -- Абсент Пабло Пикассо SET [Цена] = 548 WHERE [Код произведения] = 2 UPDATE [Произведения] -- Мона Лиза (Джоконда) Леонардо Да Винчи SET [Цена] = 936 WHERE [Код произведения] = 3 UPDATE [Произведения] -- Берег моря ночью Айвазовского И.К. SET [Цена] = 768 WHERE [Код произведения] = 4 UPDATE [Произведения] -- Дама с горностаем Леонардо Да Винчи SET [Цена] = 978 WHERE [Код произведения] = 5 UPDATE [Произведения] -- В Крыму Шишкина И.И. SET [Цена] = 536 WHERE [Код произведения] = 6 UPDATE [Произведения] -- Витрувианский человек Леонардо Да Винчи SET [Цена] = 865 WHERE [Код произведения] = 7 UPDATE [Произведения] -- С гитарой (Портрет С.А. Кропоткиной) Сурикова В.И. SET [Цена] = 348 WHERE [Код произведения] = 8 141
UPDATE [Произведения] -- Хаос(Сотворение мира) Айвазовского И.К. SET [Цена] = 669 WHERE [Код произведения] = 9 UPDATE [Произведения] -- Завоевание Сибири Ермаком Сурикова В.И. SET [Цена] = 874 WHERE [Код произведения] = 10 UPDATE [Произведения] -- Утопленница Петрова SET [Цена] = 338 WHERE [Код произведения] = 11
В.Г.
UPDATE [Произведения] -- Неаполитанский залив Айвазовского И.К. SET [Цена] = 453 WHERE [Код произведения] = 12 UPDATE [Произведения] -- Последний кабак у заставы Петрова В.Г. SET [Цена] = 276 WHERE [Код произведения] = 13 UPDATE [Произведения] -- Ураган на море Айвазовского И.К. SET [Цена] = 539 WHERE [Код произведения] = 14 UPDATE [Произведения] -- В Сиверской Шишкина И.И. SET [Цена] = 647 WHERE [Код произведения] = 15 UPDATE [Произведения] -- Возвращение Одисея из страны фиаков Клода Лорена SET [Цена] = 548 WHERE [Код произведения] = 16
142
8. Данные таблицы «Авторы»
9. Данные таблицы «Произведения»
143
10. Данные таблицы «Жанры»
11. Данные таблицы «Средства создания»
144
12. Данные таблицы «Страны»
13. Данные таблицы «Места нахождения»
145
--
14. Изменение ограничений на даты в таблицах
ALTER TABLE [Авторы] DROP CONSTRAINT CK_Author_Birthdate ALTER TABLE [Авторы] ADD CONSTRAINT CK_Author_Birthdate CHECK ([Дата смерти] <= '01.01.2010') ALTER TABLE [Авторы] NOCHECK CONSTRAINT CK_Author_Birthdate ALTER TABLE [Авторы] DROP CONSTRAINT CK_Author_Deathdate ALTER TABLE [Авторы] ADD CONSTRAINT CK_Author_Deathdate CHECK ([Дата смерти] <= '01.01.2010') ALTER TABLE [Произведения] DROP CONSTRAINT CK_Creation_Date ALTER TABLE [Произведения] ADD CONSTRAINT CK_Creation_Date '01.01.2010') --
CHECK
15. Исправление дат в таблицах 146
([Дата
создания]
<=
-- 1. Ввод недопустимых дат, которые меньше 1753-го года - года ввода -- Григорианского календаря UPDATE [Авторы] -- Команда не выполняется SET [Дата рождения] = '01.01.1452', [Дата смерти] = '01.01.1519' WHERE [Код автора] = 1 UPDATE [Авторы] -- Команда выполняется - проверьте результат SET [Дата рождения] = '01.01.1753', [Дата смерти] = '01.01.1753' WHERE [Код автора] = 1 -- 2. Вывод - исправить в таблицах даты, меньшие 1773-го года, невозможно
Приложение Д Варианты построения запросов 147
148
Проверить запросы и преобразовать их применительно к проектируемой базе данных C)Использование нулевых значений и значений по умолчанию: Create Table TabC(Col1 int IDENTITY, Col2 varchar(30) CONSTRAINT default_name DEFAULT('Значение TabC.Col2'), Col3 int NULL, Col4 varchar(40)) Insert Into TabC(Col4) Values('Значение 1 TabC.Col4') Insert Into TabC(Col2,Col4) Values('Явное значение TabC.Col2','Значение 2 TabC.Col4') Insert Into TabC(Col2,Col3,Col4) Values('SAV',44, 'ABC') Select * From TabC D) Явное задание значения для колонки-счетчика (с ограничением IDENTITY): Create Table TabD(Col1 int IDENTITY, Col2 varchar(30)) Insert Into TabD Values('Счетчик изменяется автоматически') Insert Into TabD(Col2) Values('Вторая строка') Set IDENTITY_INSERT TabD ON Insert Into TabD(Col1,Col2) Values(-99, 'Явное значение') Select * From TabD E)Использование представления для занесения значений в таблицу: Create Table TabE(Col1 int,Col2 varchar(30)) GO Create View ViewE AS Select Col2,Col1 From TabE GO Insert Into ViewE Values('Строка 1',1) -- порядок ViewE Select * From TabE -- порядок TablE F)Использование опции DEFAULT VALUES: Create Default bound_default2 AS 'Col4' GO Create Table TabF(Col1 int IDENTITY, Col2 varchar(30) CONSTRAINT Fdefault_name DEFAULT('Значение TabF.Col2'), Col3 timestamp, Col4 varchar(30), Col5 int NULL ) GO 149
EXEC sp_bindefault 'bound_default2','TabF.Col4' GO USE InsertDB Insert Into TabF DEFAULT VALUES Select * From TabF G1)Использование команды SELECT для копирования данных в таблицу: Create Table TabG(Col1 int IDENTITY, Col2 varchar(50)) GO Set IDENTITY_INSERT TabG ON GO Insert Into TabG (Col1,Col2) Select Col1,Col2 From TabD GO Select * From TabG GO G2)Использование команды SELECT для копирования данных из таблицы: Create Table TabG(Col1 int IDENTITY, Col2 varchar(30)) Set IDENTITY_INSERT TabG ON Insert Into TabG Select * From TabD Select * From TabG H)Копирование таблиц из базы данных Northwind в базу данных НордОст: USE НордОст [Set IDENTITY_INSERT имя таблиц из НордОст ON] Insert Into имя таблицы из НордОст Select * From Northwind.dbo. Имя таблицы из Northwind I)Использование команды SELECT...INTO: EXEC sp_dboption ‘InsertDB’, ‘select into/bulkCopy’, ‘on’ SELECT Col1 AS Счетчик, Col2 AS Имя, Col3 AS Версия, Col5 AS Номер Into Новая_TabF From TabF 150
J)Выборка начальных строк таблицы: USE Northwind Select Top 7 * From Territories --различные Select Top 10 Percent * From Territories --различные упорядоченные по TerritoryID Select Order By TerritoryID With Ties * From Territories --все 7 Select All * From Territories --все строки таблицы Select Distinct * From Territories -- все без дублирующих K)Использование псевдонимов в запросе: USE Pubs Select Top 10 au_id, au_fname AS [Фамилия], au_lname From Authors --имя 2-го столбца изменено L)Включение в результат дополнительного столбца-выражения: Select Top 7 NewID() AS Глобальный_уникальный_номер, '--', au_id, DatePart (ms,GetDate()) From Authors --три колонки являются выражениями,из них двебезыменные M)Использование подзапроса,возвращающего одну строку: Select Top 5 (Select au_fname From authors --значение подзапроса определяется Where au_id='527-72-3246') AS Подзапрос, --заново для каждой строки title_id From Titles N)Включение столбца-счетчика: Select Top 50 Percent jobs.IDENTITYCOL AS Number, job_id, job_desc From jobs -- для одной таблицы задание ее имени для счетчика необязательно, т.е.jobs необязательно O)Использование ключевых слов CROSS JOIN для связывания двух таблиц: USE Pubs SELECT discounts.stor_id, discounts. discounttype, stores.stor_name FROM discounts CROSS JOIN stores --3*6=18 строк -- убедиться, что CROSS JOIN можно заменить запятой P)Использование ключевых слов INNER JOIN для связывания двух таблиц: 151
SELECT authors.au_lname, authors.au_fname, titleauthor.au_ord, titleauthor.royaltyper FROM authors INEER JOIN titleauthor ON authors.au_id = titleauthor.au_id WHERE authors.sate = 'CA' -- убедиться, что можно INNER JOIN заменить пробелом Q)Использование ключевых слов LEFT OUTER JOIN для связывания двух таблиц: SELECT authors.au_lname, authors.au_fname, titleauthor.royaltyper FROM authors LEFT OUTER JOIN titleauthor ON authors.au_id = titleauthor.au_id WHERE (authors.state = 'CA') --19 строк R)Использование ключевых слов RIGHT OUTER JOIN для связывания двух таблиц: SELECT titleauthor.au_ord, titleauthor.royaltyper, authors.au_lname, authors.au_fname FROM titleauthor RIGHT OUTER JOIN authors ON titleauthor.au_id = authors.au_id WHERE (authors.state = 'CA') --19 строк S)Использование ключевых слов FULL OUTER JOIN для связывания двух таблиц: SELECT discounts.stor_id, discounts.discounttype, stores.stor_name FROM discounts FULL OUTER JOIN stores ON discounts.stor_id = stores.stor_id --8 строк -- убедиться, что в примерах Q,R и S слово OUTER можно опустить T)Использование раздела WHERE оператора SELECT: Select * From authors Where 3=6 --0 строк Select * From authors Where state <> 'CA'--Калифорния Declare @@Var1 int Set @@Var1 = 4095 Slect title_id, type, pub_id, price From titles Where ((ytd_sales = @@Var1) OR (price BETWEEN 5 AND 15)) --9 строк -- заменить OR на AND и убедиться, что получится одна строка Select discounts.stor_id, discounts.discounttype, stores.stor_name From discounts, stores --здесь”,”-это CROSS JOIN Where disscounts.stor_id = stores.stor_id --1 строка --это уже INNER OUTER JOIN -- Аналог этой команды следующий: 152
Select discounts/stor_id, discounts.discounttype, stores.stor_name From discounts INEER JOIN stores ON discounts.stor_id = stores.stor_id -- этот запрос эффективнее предшествующего. Select discounts.stor_id, discounts.discounttype, stores.stor_name From discounts, stores Where discounts.stor_id, *= stores.stor_id --3 строки -- это - аналог LEFT OUTER JOIN: Select discounts.stor_id, discounts.disconttype, stores.stor_name From discounts LEFT OUTER JOIN stores ON discounts.stor_id = stores.stor_id --3 строки Select discounts.stor_id, discounts.discounttype, stores.stor_name Where discounts.stor_id =* stores.stor_id -- это - аналог RIGHT OUTER JOIN Select discounts.stor_id, discounts.discounttype, stores.stor_name From discounts RIGHT OUTER JOIN stores ON discounts.stor_id = stores.stor_id --6 строк U)Использование разделов GROUP BY и HAVING: Select type, SUM(price), COUNT(*) From titles -- type-тип изданий Group By type --6 строк -- выдается колонка type, колонка SUM и счетчик COUNT Select type, SUM(price), count = COUNT(*) -- имя столбца Form titles Where type < 'ps' Group BY type --3 строки Select type, SUM(price), count = COUNT(*) -- имя счетчика count From titles Where type < 'ps' Group By ALL type --6 строк -- строки с type >= 'ps'- без агрегирования Select type, pub_id, SUM(price), COUNT(*) From titles Where price <> 0 Group By type, pub_id --7 агрегированных строк Select type, pub_id, SUM(price), COUNT(*) From titles Where price <> 0 Group By type, pub_id With Cube --суперагрегирование Select type, pub_id, SUM(price), COUNT(*) 153
From titles Where price <> 0 Group By type, pub_id With ROLLUP
--13 строк
V)Объединение таблиц с помощью раздела UNION: USE Northwind Select City, Phone Info #Tab1 From customers Where contacttitle = 'Marketing Assistant' Select City, Phone Info #Tab 2 From Customers Where contacttitle = 'Sales Associate' Selest City, Phone From #Tab1 UNION Select City, Phone From #Tab2 W)Использование раздела ORDER BY: USE Northwind Select ContactTitle, City From Customers Where ContactTitle IN ('Marketing Assistant' 'Sales Agent' 'Sales Associate') Order By ContactTitle,City --18 строк X)Использование раздела COMPUTE: Select title_id, price From Titles Where (type = 'bisiness') OR (type = 'mod_cook') Compute SUM(price), COUNT(price) --6строк и -- SUM -- ===== --77.9000 -- CNT -- ===== -- 6
--всего 7 строк
Select title_id, price From Titles Where (type = 'business') OR (type = 'mod_cook') Order By type Compute Count(price), Sum(Price) By type Y)Обработка данных с помощью команды UPDATE: Declare @@Var1 int SET @@Var1 = 0 Update #TempTableAuthors SET @@Var1 = @@Var1 + 1 Where Contact = 0 154
Select @@Var1 GO Declare @@Var2 varchar(40) Update #TempTableAuthors SET @@Var2 = au_lname = au_lname + '__NO CONTRACT__' Where Contact = 0 Select au_id, au_lname, phone From #TempTableAuthors --2 строки Where Contract = 0 Select @@Var2 AS 'Значение переменной @@Var2' --1строка Z)Использование команды DELETE: Delete From #TempTableAuthors Select * From #TempTableAuthors
155
--0 строк
Приложение Е Сценарии и экранные формы для реализации представлений
156
1. Порядок создания представлений Для создания нового представления достаточно выбрать в контекстном меню папки Views команду Add New View (Новое представление) и выполнить следующие действия: а) выбрать из списка таблиц и представлений выбранной базы данных те таблицы или представления, на основе которых будет создаваться новое представление; б) в каждой таблице отметить столбцы, которые должны быть включены в представление, при этом автоматически формируется запрос (см. рисунок 23 и 24), а затем и команда CREATE VIEW; в) если необходимо дополнить запрос нужными разделами, используя объединение (JOIN) и слияние (UNION) данных, различные выражения, группировку, агрегирование и логические условия; г) проверить, а затем исполнить запрос с помощью команды Execute SQL контекстного меню; д) после обновления Refresh и открытия представлений Views просмотреть данные, отображаемые этим представлением (см. рисунок 24). Список представлений, имеющихся в выбранной базе данных, находится в этой папке. Как видно из рисунка 24, для рассматриваемого представления отображаются данные в столбцах, которые были указаны при конструировании.
Рисунок 22 ⎯ Конструирование представления 157
Рисунок 23 ⎯ Формирование запроса для команды
Рисунок 24 ⎯ Отображение данных в представлении
158
2. Сценарии и экранные формы создания представлений
159
160
161
162
163
164
165
Приложение Ж Сценарии и экранные формы для реализации хранимых процедур и функций
166
1.Сценарии и экранные формы для InsertAuthorProcedure
167
168
2.Сценарии и экранные формы для InsertCreationProcedure
169
170
3.Сценарии и экранные формы для PriceAverageFunction
171
172
Приложение З Сценарии и экранные формы для реализации триггеров
173
1. Структура таблицы «Произведения» до создания триггеров
2 Создание всех триггеров для всех видов запуска --1 Триггер OnCriationForDeleteTrigger запускается до команды -- удаления данных DELETE CREATE TRIGGER OnCriationForDeleteTrigger ON [Произведения] FOR DELETE AS PRINT 'OnCriationForDeleteTrigger' GO --2 Триггер OnCriationAfterDeleteTrigger запускается после -- команды удаления данных DELETE CREATE TRIGGER OnCriationAfterDeleteTrigger ON [Произведения] AFTER DELETE AS PRINT 'OnCriationAfterDeleteTrigger' GO 174
--3 Триггер OnCriationInsteadOfDeleteTrigger запускается вместо -- команды удаления данных DELETE CREATE TRIGGER OnCriationInsteadOfDeleteTrigger ON [Произведения] INSTEAD OF DELETE AS PRINT 'OnCriationInsteadOfDeleteTrigger' GO --4 Триггер OnCriationForInsertTrigger запускается до команды -- вставки данных INSERT CREATE TRIGGER OnCriationForInsertTrigger ON [Произведения] FOR INSERT AS PRINT 'OnCriationForInsertTrigger' GO --5 Триггер OnCriationAfterInsertTrigger запускается после -- команды вставки данных INSERT CREATE TRIGGER OnCriationAfterInsertTrigger ON [Произведения] AFTER INSERT AS PRINT 'OnCriationAfterInsertTrigger' GO --6 Триггер OnCriationInsteadOfInsertTrigger запускается вместо -- команды вставки данных INSERT CREATE TRIGGER OnCriationInsteadOfInsertTrigger ON [Произведения] INSTEAD OF INSERT AS PRINT 'OnCriationInsteadOfInsertTrigger' GO --7 Триггер OnCriationForUpdateTrigger запускается до команды -- изменения данных UPDATE 175
CREATE TRIGGER OnCriationForUpdateTrigger ON [Произведения] FOR UPDATE AS PRINT 'OnCriationForUpdateTrigger' GO --8 Триггер OnCriationAfterUpdateTrigger запускается после -- команды изменения данных UPDATE CREATE TRIGGER OnCriationAfterUpdateTrigger ON [Произведения] AFTER UPDATE AS PRINT 'OnCriationAfterUpdateTrigger' GO --9 Триггер OnCriationInsteadOfUpdateTrigger запускается вместо -- команды изменения данных UPDATE CREATE TRIGGER OnCriationInsteadOfUpdateTrigger ON [Произведения] INSTEAD OF UPDATE AS PRINT 'OnCriationInsteadOfUpdateTrigger' GO 3 Команды для проверки запуска триггеров DELETE [Произведения] -- "Бурлаки на Волге" Репина И.Е. WHERE [Код произведения] = 17 INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES ( 17, 'Бурлаки на волге', 4, 6, 176
10, '01.01.1898', 1, 9, 989 ) UPDATE [Произведения] -- "Бурлаки на Волге" Репина И.Е. SET [Цена] = 999 WHERE [Код произведения] = 17
3. Структура таблицы «Произведения» после создания триггеров
177
Приложение И Модули и экранные формы для реализации клиентского приложения информационной системы
178
1. Создание проекта клиентского приложения в среде Microsoft Visual Studio 2005 1.1. Создание папки для проекта
1.2. Выбор команды для создания проекта
179
1.3. Выбор типа проекта и ввод его имени
1.4. Контроль завершения создания проекта клиентского приложения
180
1.5. Выбор проекта клиентского приложения и открытие рабочих окон 181
2. Содержание проектного файла «D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. по СУБД\MakurinClientApplicationProject\ MakurinClientApplication.sln» Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MakurinClientApplication", "MakurinClientApplication.csproj", "{D6F9D3A5-26E9-40EF-BD49-CE93B0DE2ED3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {D6F9D3A5-26E9-40EF-BD49-CE93B0DE2ED3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D6F9D3A5-26E9-40EF-BD49-CE93B0DE2ED3}.Debug|Any CPU.Build.0 = Debug|Any CPU {D6F9D3A5-26E9-40EF-BD49-CE93B0DE2ED3}.Release|Any CPU.ActiveCfg = Release|Any CPU {D6F9D3A5-26E9-40EF-BD49-CE93B0DE2ED3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal 182
3. Содержание проектного файла «D:\Курсовой проект студента группы 07ВП1 Макурина Ю.Д. по СУБД\MakurinClientApplicationProject\ MakurinClientApplication.csproj» Debug AnyCPU 8.0.50727 <SchemaVersion>2.0 {D6F9D3A5-26E9-40EF-BD49-CE93B0DE2ED3} WinExe <AppDesignerFolder>Properties MakurinClientApplication MakurinClientApplication true full false bin\Debug\ DEBUG;TRACE <ErrorReport>prompt <WarningLevel>4 pdbonly true bin\Release\ TRACE <ErrorReport>prompt <WarningLevel>4 <SubType>Form Form1.cs 183
<EmbeddedResource Include="Properties\Resources.resx"> ResXFileCodeGenerator Resources.Designer.cs <SubType>Designer True Resources.resx SettingsSingleFileGenerator Settings.Designer.cs True Settings.settings True
4. Созданный проект клиентского приложения вместе с новыми базами данных, включенными проектами, папками и файлами 184
5. Модули клиентского приложения на языке C# using System; using System.Collections.Generic; using System.Windows.Forms; namespace MakurinClientApplication { static class Program { /// <summary> /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainClientForm()); 185
} } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MakurinClientApplication { public partial class MainClientForm : Form { private AuthorForm authorForm; private CountryForm countryForm; private GenereForm genereForm; private PlacementForm placementForm; private ProductionForm productionForm; private ToolForm toolForm; public MainClientForm() { InitializeComponent(); } private void AutherButton_Click(object sender, EventArgs e) { authorForm = new AuthorForm(); authorForm.Visible = true; } private void CountryButton_Click(object sender, EventArgs e) { countryForm = new CountryForm(); countryForm.Visible = true; } private void GenereButton_Click(object sender, EventArgs e) { genereForm = new GenereForm(); genereForm.Visible = true; } private void ProductionButton_Click(object sender, EventArgs e) { productionForm = new ProductionForm(); 186
productionForm.Visible = true; } private void ToolButton_Click(object sender, EventArgs e) { toolForm = new ToolForm(); toolForm.Visible = true; } private void PlacementButton_Click(object sender, EventArgs e) { placementForm = new PlacementForm(); placementForm.Visible = true; } } } namespace MakurinClientApplication { partial class MainClientForm { /// <summary> /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// /// <param name="disposing">true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.AutherButton = new System.Windows.Forms.Button(); this.PlacementButton = new System.Windows.Forms.Button(); this.ToolButton = new System.Windows.Forms.Button(); this.ProductionButton = new System.Windows.Forms.Button(); 187
this.CountryButton = new System.Windows.Forms.Button(); this.GenereButton = new System.Windows.Forms.Button(); this.SuspendLayout(); // // AutherButton // this.AutherButton.BackColor = System.Drawing.Color.Yellow; this.AutherButton.Font = new System.Drawing.Font("Monotype Corsiva", 25.8F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(204))); this.AutherButton.Location = new System.Drawing.Point(28, 29); this.AutherButton.Name = "AutherButton"; this.AutherButton.Size = new System.Drawing.Size(377, 107); this.AutherButton.TabIndex = 0; this.AutherButton.Text = "Авторы"; this.AutherButton.UseVisualStyleBackColor = false; this.AutherButton.Click += new System.EventHandler(this.AutherButton_Click); // // PlacementButton // this.PlacementButton.BackColor = System.Drawing.Color.Yellow; this.PlacementButton.Font = new System.Drawing.Font("Monotype Corsiva", 25.8F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(204))); this.PlacementButton.Location = new System.Drawing.Point(440, 331); this.PlacementButton.Name = "PlacementButton"; this.PlacementButton.Size = new System.Drawing.Size(383, 113); this.PlacementButton.TabIndex = 1; this.PlacementButton.Text = "Места нахождения"; this.PlacementButton.UseVisualStyleBackColor = false; this.PlacementButton.Click += new System.EventHandler(this.PlacementButton_Click); // // ToolButton // this.ToolButton.BackColor = System.Drawing.Color.Yellow; this.ToolButton.Font = new System.Drawing.Font("Monotype Corsiva", 25.8F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(204))); this.ToolButton.Location = new System.Drawing.Point(440, 179); this.ToolButton.Name = "ToolButton"; this.ToolButton.Size = new System.Drawing.Size(383, 106); this.ToolButton.TabIndex = 2; this.ToolButton.Text = "Средства создания"; this.ToolButton.UseVisualStyleBackColor = false; this.ToolButton.Click += new System.EventHandler(this.ToolButton_Click); // // ProductionButton // this.ProductionButton.BackColor = System.Drawing.Color.Yellow; this.ProductionButton.Font = new System.Drawing.Font("Monotype Corsiva", 25.8F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(204))); 188
this.ProductionButton.Location = new System.Drawing.Point(440, 29); this.ProductionButton.Name = "ProductionButton"; this.ProductionButton.Size = new System.Drawing.Size(383, 107); this.ProductionButton.TabIndex = 3; this.ProductionButton.Text = "Произведения"; this.ProductionButton.UseVisualStyleBackColor = false; this.ProductionButton.Click += new System.EventHandler(this.ProductionButton_Click); // // CountryButton // this.CountryButton.BackColor = System.Drawing.Color.Yellow; this.CountryButton.Font = new System.Drawing.Font("Monotype Corsiva", 25.8F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(204))); this.CountryButton.Location = new System.Drawing.Point(28, 331); this.CountryButton.Name = "CountryButton"; this.CountryButton.Size = new System.Drawing.Size(377, 113); this.CountryButton.TabIndex = 4; this.CountryButton.Text = "Страны"; this.CountryButton.UseVisualStyleBackColor = false; this.CountryButton.Click += new System.EventHandler(this.CountryButton_Click); // // GenereButton // this.GenereButton.BackColor = System.Drawing.Color.Yellow; this.GenereButton.Font = new System.Drawing.Font("Monotype Corsiva", 25.8F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(204))); this.GenereButton.Location = new System.Drawing.Point(28, 179); this.GenereButton.Name = "GenereButton"; this.GenereButton.Size = new System.Drawing.Size(377, 106); this.GenereButton.TabIndex = 5; this.GenereButton.Text = "Жанр"; this.GenereButton.UseVisualStyleBackColor = false; this.GenereButton.Click += new System.EventHandler(this.GenereButton_Click); // // MainClientForm // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.Cyan; this.ClientSize = new System.Drawing.Size(853, 494); this.Controls.Add(this.GenereButton); this.Controls.Add(this.CountryButton); this.Controls.Add(this.ProductionButton); this.Controls.Add(this.ToolButton); this.Controls.Add(this.PlacementButton); this.Controls.Add(this.AutherButton); this.Name = "MainClientForm"; this.Text = "Главная форма для работы с таблицами"; this.ResumeLayout(false); 189
} #endregion private System.Windows.Forms.Button AutherButton; private System.Windows.Forms.Button PlacementButton; private System.Windows.Forms.Button ToolButton; private System.Windows.Forms.Button ProductionButton; private System.Windows.Forms.Button CountryButton; private System.Windows.Forms.Button GenereButton; } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MakurinClientApplication { public partial class AuthorForm : Form { public AuthorForm() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'makurinDatabaseDataSet.Авторы' table. You can move, or remove it, as needed. this.авторыTableAdapter.Fill(this.makurinDatabaseDataSet.Авторы); } } } namespace MakurinClientApplication { partial class AuthorForm { /// <summary> /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. 190
/// /// <param name="disposing">true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.AuthorDataGridView = new System.Windows.Forms.DataGridView(); this.кодАвтораDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.фамилияАвтораDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.имяАвтораDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.отчествоАвтораDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.датаРожденияDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.датаСмертиDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.кодСтраныDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.местоПроживанияDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.авторыBindingSource = new System.Windows.Forms.BindingSource(this.components); this.makurinDatabaseDataSet = new MakurinClientApplication.MakurinDatabaseDataSet(); this.авторыTableAdapter = new MakurinClientApplication.MakurinDatabaseDataSetTableAdapters.АвторыTableAdapter(); ((System.ComponentModel.ISupportInitialize)(this.AuthorDataGridView)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.авторыBindingSource)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.makurinDatabaseDataSet)).BeginInit(); this.SuspendLayout(); // // AuthorDataGridView // this.AuthorDataGridView.AutoGenerateColumns = false; this.AuthorDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 191
this.AuthorDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.кодАвтораDataGridViewTextBoxColumn, this.фамилияАвтораDataGridViewTextBoxColumn, this.имяАвтораDataGridViewTextBoxColumn, this.отчествоАвтораDataGridViewTextBoxColumn, this.датаРожденияDataGridViewTextBoxColumn, this.датаСмертиDataGridViewTextBoxColumn, this.кодСтраныDataGridViewTextBoxColumn, this.местоПроживанияDataGridViewTextBoxColumn}); this.AuthorDataGridView.DataSource = this.авторыBindingSource; this.AuthorDataGridView.Location = new System.Drawing.Point(-4, 1); this.AuthorDataGridView.Name = "AuthorDataGridView"; this.AuthorDataGridView.RowTemplate.Height = 24; this.AuthorDataGridView.Size = new System.Drawing.Size(821, 420); this.AuthorDataGridView.TabIndex = 0; // // кодАвтораDataGridViewTextBoxColumn // this.кодАвтораDataGridViewTextBoxColumn.DataPropertyName = "Код автора"; this.кодАвтораDataGridViewTextBoxColumn.HeaderText = "Код автора"; this.кодАвтораDataGridViewTextBoxColumn.Name = "кодАвтораDataGridViewTextBoxColumn"; // // фамилияАвтораDataGridViewTextBoxColumn // this.фамилияАвтораDataGridViewTextBoxColumn.DataPropertyName = "Фамилия автора"; this.фамилияАвтораDataGridViewTextBoxColumn.HeaderText = "Фамилия автора"; this.фамилияАвтораDataGridViewTextBoxColumn.Name = "фамилияАвтораDataGridViewTextBoxColumn"; // // имяАвтораDataGridViewTextBoxColumn // this.имяАвтораDataGridViewTextBoxColumn.DataPropertyName = "Имя автора"; this.имяАвтораDataGridViewTextBoxColumn.HeaderText = "Имя автора"; this.имяАвтораDataGridViewTextBoxColumn.Name = "имяАвтораDataGridViewTextBoxColumn"; // // отчествоАвтораDataGridViewTextBoxColumn // this.отчествоАвтораDataGridViewTextBoxColumn.DataPropertyName = "Отчество автора"; this.отчествоАвтораDataGridViewTextBoxColumn.HeaderText = "Отчество автора"; this.отчествоАвтораDataGridViewTextBoxColumn.Name = "отчествоАвтораDataGridViewTextBoxColumn"; // // датаРожденияDataGridViewTextBoxColumn // this.датаРожденияDataGridViewTextBoxColumn.DataPropertyName = "Дата рождения"; + this.датаРожденияDataGridViewTextBoxColumn.HeaderText = "Дата рождения"; this.датаРожденияDataGridViewTextBoxColumn.Name = "датаРожденияDataGridViewTextBoxColumn"; // 192
// датаСмертиDataGridViewTextBoxColumn // this.датаСмертиDataGridViewTextBoxColumn.DataPropertyName = "Дата смерти"; this.датаСмертиDataGridViewTextBoxColumn.HeaderText = "Дата смерти"; this.датаСмертиDataGridViewTextBoxColumn.Name = "датаСмертиDataGridViewTextBoxColumn"; // // кодСтраныDataGridViewTextBoxColumn // this.кодСтраныDataGridViewTextBoxColumn.DataPropertyName = "Код страны"; this.кодСтраныDataGridViewTextBoxColumn.HeaderText = "Код страны"; this.кодСтраныDataGridViewTextBoxColumn.Name = "кодСтраныDataGridViewTextBoxColumn"; // // местоПроживанияDataGridViewTextBoxColumn // this.местоПроживанияDataGridViewTextBoxColumn.DataPropertyName = "Место проживания"; this.местоПроживанияDataGridViewTextBoxColumn.HeaderText = "Место проживания"; this.местоПроживанияDataGridViewTextBoxColumn.Name = "местоПроживанияDataGridViewTextBoxColumn"; // // авторыBindingSource // this.авторыBindingSource.DataMember = "Авторы"; this.авторыBindingSource.DataSource = this.makurinDatabaseDataSet; // // makurinDatabaseDataSet // this.makurinDatabaseDataSet.DataSetName = "MakurinDatabaseDataSet"; this.makurinDatabaseDataSet.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema; // // авторыTableAdapter // this.авторыTableAdapter.ClearBeforeFill = true; // // AuthorForm // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(818, 419); this.Controls.Add(this.AuthorDataGridView); this.Name = "AuthorForm"; this.Text = "Форма для таблицы <<Авторы>>"; this.Load += new System.EventHandler(this.Form2_Load); ((System.ComponentModel.ISupportInitialize)(this.AuthorDataGridView)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.авторыBindingSource)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.makurinDatabaseDataSet)).EndInit(); this.ResumeLayout(false); } 193
#endregion private System.Windows.Forms.DataGridView AuthorDataGridView; private MakurinDatabaseDataSet makurinDatabaseDataSet; private System.Windows.Forms.BindingSource авторыBindingSource; private MakurinClientApplication.MakurinDatabaseDataSetTableAdapters.АвторыTableAdapter авторыTableAdapter; private System.Windows.Forms.DataGridViewTextBoxColumn кодАвтораDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn фамилияАвтораDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn имяАвтораDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn отчествоАвтораDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn датаРожденияDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn датаСмертиDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn кодСтраныDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn местоПроживанияDataGridViewTextBoxColumn; } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MakurinClientApplication { public partial class ProductionForm : Form { public ProductionForm() { InitializeComponent(); } private void Form4_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'makurinDatabaseDataSet2.Произведения' table. You can move, or remove it, as needed. this.произведенияTableAdapter.Fill(this.makurinDatabaseDataSet2.Произведения); } } 194
} namespace MakurinClientApplication { partial class ProductionForm { /// <summary> /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// /// <param name="disposing">true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.ProductionDataGridView = new System.Windows.Forms.DataGridView(); this.кодПроизведенияDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.названиеПроизведенияDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.кодЖанраDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.кодСредствСозданияDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.кодАвтораDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.датаСозданияDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.кодСтраныDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.кодМестаНахожденияDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); 195
this.ценаDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.произведенияBindingSource = new System.Windows.Forms.BindingSource(this.components); this.makurinDatabaseDataSet2 = new MakurinClientApplication.MakurinDatabaseDataSet2(); this.произведенияTableAdapter = new MakurinClientApplication.MakurinDatabaseDataSet2TableAdapters.ПроизведенияTableAdapter(); ((System.ComponentModel.ISupportInitialize)(this.ProductionDataGridView)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.произведенияBindingSource)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.makurinDatabaseDataSet2)).BeginInit(); this.SuspendLayout(); // // ProductionDataGridView // this.ProductionDataGridView.AutoGenerateColumns = false; this.ProductionDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.ProductionDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.кодПроизведенияDataGridViewTextBoxColumn, this.названиеПроизведенияDataGridViewTextBoxColumn, this.кодЖанраDataGridViewTextBoxColumn, this.кодСредствСозданияDataGridViewTextBoxColumn, this.кодАвтораDataGridViewTextBoxColumn, this.датаСозданияDataGridViewTextBoxColumn, this.кодСтраныDataGridViewTextBoxColumn, this.кодМестаНахожденияDataGridViewTextBoxColumn, this.ценаDataGridViewTextBoxColumn}); this.ProductionDataGridView.DataSource = this.произведенияBindingSource; this.ProductionDataGridView.Location = new System.Drawing.Point(-4, 0); this.ProductionDataGridView.Name = "ProductionDataGridView"; this.ProductionDataGridView.RowTemplate.Height = 24; this.ProductionDataGridView.Size = new System.Drawing.Size(855, 428); this.ProductionDataGridView.TabIndex = 0; // // кодПроизведенияDataGridViewTextBoxColumn // this.кодПроизведенияDataGridViewTextBoxColumn.DataPropertyName = "Код произведения"; this.кодПроизведенияDataGridViewTextBoxColumn.HeaderText = "Код произведения"; this.кодПроизведенияDataGridViewTextBoxColumn.Name = "кодПроизведенияDataGridViewTextBoxColumn"; // // названиеПроизведенияDataGridViewTextBoxColumn // this.названиеПроизведенияDataGridViewTextBoxColumn.DataPropertyName = "Название произведения"; this.названиеПроизведенияDataGridViewTextBoxColumn.HeaderText = "Название произведения"; this.названиеПроизведенияDataGridViewTextBoxColumn.Name = "названиеПроизведенияDataGridViewTextBoxColumn"; // 196
// кодЖанраDataGridViewTextBoxColumn // this.кодЖанраDataGridViewTextBoxColumn.DataPropertyName = "Код жанра"; this.кодЖанраDataGridViewTextBoxColumn.HeaderText = "Код жанра"; this.кодЖанраDataGridViewTextBoxColumn.Name = "кодЖанраDataGridViewTextBoxColumn"; // // кодСредствСозданияDataGridViewTextBoxColumn // this.кодСредствСозданияDataGridViewTextBoxColumn.DataPropertyName = "Код средств создания"; this.кодСредствСозданияDataGridViewTextBoxColumn.HeaderText = "Код средств создания"; this.кодСредствСозданияDataGridViewTextBoxColumn.Name = "кодСредствСозданияDataGridViewTextBoxColumn"; // // кодАвтораDataGridViewTextBoxColumn // this.кодАвтораDataGridViewTextBoxColumn.DataPropertyName = "Код автора"; this.кодАвтораDataGridViewTextBoxColumn.HeaderText = "Код автора"; this.кодАвтораDataGridViewTextBoxColumn.Name = "кодАвтораDataGridViewTextBoxColumn"; // // датаСозданияDataGridViewTextBoxColumn // this.датаСозданияDataGridViewTextBoxColumn.DataPropertyName = "Дата создания"; this.датаСозданияDataGridViewTextBoxColumn.HeaderText = "Дата создания"; this.датаСозданияDataGridViewTextBoxColumn.Name = "датаСозданияDataGridViewTextBoxColumn"; // // кодСтраныDataGridViewTextBoxColumn // this.кодСтраныDataGridViewTextBoxColumn.DataPropertyName = "Код страны"; this.кодСтраныDataGridViewTextBoxColumn.HeaderText = "Код страны"; this.кодСтраныDataGridViewTextBoxColumn.Name = "кодСтраныDataGridViewTextBoxColumn"; // // кодМестаНахожденияDataGridViewTextBoxColumn // this.кодМестаНахожденияDataGridViewTextBoxColumn.DataPropertyName = "Код места нахождения"; this.кодМестаНахожденияDataGridViewTextBoxColumn.HeaderText = "Код места нахождения"; this.кодМестаНахожденияDataGridViewTextBoxColumn.Name = "кодМестаНахожденияDataGridViewTextBoxColumn"; // // ценаDataGridViewTextBoxColumn // this.ценаDataGridViewTextBoxColumn.DataPropertyName = "Цена"; this.ценаDataGridViewTextBoxColumn.HeaderText = "Цена"; this.ценаDataGridViewTextBoxColumn.Name = "ценаDataGridViewTextBoxColumn"; // 197
// произведенияBindingSource // this.произведенияBindingSource.DataMember = "Произведения"; this.произведенияBindingSource.DataSource = this.makurinDatabaseDataSet2; // // makurinDatabaseDataSet2 // this.makurinDatabaseDataSet2.DataSetName = "MakurinDatabaseDataSet2"; this.makurinDatabaseDataSet2.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema; // // произведенияTableAdapter // this.произведенияTableAdapter.ClearBeforeFill = true; // // ProductionForm // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(854, 422); this.Controls.Add(this.ProductionDataGridView); this.Name = "ProductionForm"; this.Text = "Форма для таблицы <<Произведеня>>"; this.Load += new System.EventHandler(this.Form4_Load); ((System.ComponentModel.ISupportInitialize)(this.ProductionDataGridView)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.произведенияBindingSource)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.makurinDatabaseDataSet2)).EndInit(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.DataGridView ProductionDataGridView; private MakurinDatabaseDataSet2 makurinDatabaseDataSet2; private System.Windows.Forms.BindingSource произведенияBindingSource; private MakurinClientApplication.MakurinDatabaseDataSet2TableAdapters.ПроизведенияTableAdapter произведенияTableAdapter; private System.Windows.Forms.DataGridViewTextBoxColumn кодПроизведенияDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn названиеПроизведенияDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn кодЖанраDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn кодСредствСозданияDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn кодАвтораDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn датаСозданияDataGridViewTextBoxColumn; 198
private System.Windows.Forms.DataGridViewTextBoxColumn кодСтраныDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn кодМестаНахожденияDataGridViewTextBoxColumn; private System.Windows.Forms.DataGridViewTextBoxColumn ценаDataGridViewTextBoxColumn; } }
199
Приложение К Сценарии создания и заполнения базы данных
200
---
1. Сценарии создания базы данных 1.1. Сценарий создания таблицы «Авторы»
/****** Object: Table [dbo].[Авторы] Script Date: 11/24/2009 15:11:07 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Авторы]') AND type in (N'U')) DROP TABLE [dbo].[Авторы] GO /****** Object: Table [dbo].[Авторы] Script Date: 11/24/2009 15:11:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Авторы]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Авторы]( [Код автора] [int] NOT NULL, [Фамилия автора] [char](20) NOT NULL, [Имя автора] [char](20) NULL, [Отчество автора] [char](20) NULL, [Дата рождения] [datetime] NULL, [Дата смерти] [datetime] NULL, [Код страны] [int] NULL, [Место проживания] [char](100) NOT NULL, CONSTRAINT [PK_Авторы] PRIMARY KEY CLUSTERED ( [Код автора] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO /****** Object: Index [PK_ Author_Family_Name] Script Date: 11/24/2009 15:11:07 ******/ IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[Авторы]') AND name = N'PK_ Author_Family_Name') CREATE NONCLUSTERED INDEX [PK_ Author_Family_Name] ON [dbo].[Авторы] 201
( [Фамилия автора] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Авторы_Страны]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [FK_Авторы_Страны] FOREIGN KEY([Код страны]) REFERENCES [dbo].[Страны] ([Код страны]) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Author_Deathdate]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_ Author_Deathdate] CHECK (('01.01.1753'<=[Дата смерти] AND [Дата смерти]<='01.01.2010')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Author_Family_Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_ Author_Family_Name] CHECK (([Фамилия автора] like '[А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Author_Father_Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_ Author_Father_Name] CHECK (([Отчество автора] like '[А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Author_First_Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_ Author_First_Name] CHECK (([Имя автора] like '[А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яая ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO
202
IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Author_Birthdate]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_Author_Birthdate] CHECK (('01.01.1753'<=[Дата рождения] AND [Дата рождения]<='01.01.2010')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Author_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_Author_Code] CHECK (((1)<=[Код автора] AND [Код автора]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Author_Place]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_Author_Place] CHECK (([Место проживания] like '[А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][АЯ а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я ая.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-][А-Я а-я.,/(:)0-9-]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Country_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Авторы]')) 203
ALTER TABLE [dbo].[Авторы] WITH CHECK ADD CONSTRAINT [CK_Country_Code] CHECK (((1)<=[Код страны] AND [Код страны]<=(99))) GO -1.2. Сценарий создания таблицы «Жанры» /****** Object: Table [dbo].[Жанры] Script Date: 11/24/2009 15:11:51 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Жанры]') AND type in (N'U')) DROP TABLE [dbo].[Жанры] GO /****** Object: Table [dbo].[Жанры] Script Date: 11/24/2009 15:11:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Жанры]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Жанры]( [Код жанра] [int] NOT NULL, [Название жанра] [char](100) NOT NULL, CONSTRAINT [PK_Жанры] PRIMARY KEY CLUSTERED ( [Код жанра] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Genere _Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Жанры]')) ALTER TABLE [dbo].[Жанры] WITH CHECK ADD CONSTRAINT [CK_ Genere _Name] CHECK (([Название жанра] like '[А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А204
Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Genere_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Жанры]')) ALTER TABLE [dbo].[Жанры] WITH CHECK ADD CONSTRAINT [CK_Genere_Code] CHECK (((1)<=[Код жанра] AND [Код жанра]<=(99))) GO --
1.3. Сценарий создания таблицы «Места нахождения»
/****** Object: Table [dbo].[Места нахождения] Script Date: 11/24/2009 15:12:18 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Места нахождения]') AND type in (N'U')) DROP TABLE [dbo].[Места нахождения] GO /****** Object: Table [dbo].[Места нахождения] Script Date: 11/24/2009 15:12:18 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Места нахождения]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Места нахождения]( [Код места нахождения] [int] NOT NULL, [Название места нахождения] [char](120) NOT NULL, CONSTRAINT [PK_Места нахождения] PRIMARY KEY CLUSTERED ( [Код места нахождения] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO
205
IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Placement _Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Места нахождения]')) ALTER TABLE [dbo].[Места нахождения] WITH CHECK ADD CONSTRAINT [CK_ Placement _Name] CHECK (([Название места нахождения] like '[А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я 206
.,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-][А-Яа-я .,(:)/;ESCAPE-]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Placement_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Места нахождения]')) ALTER TABLE [dbo].[Места нахождения] WITH CHECK ADD CONSTRAINT [CK_Placement_Code] CHECK (((1)<=[Код места нахождения] AND [Код места нахождения]<=(99))) GO --
1.4. Сценарий создания таблицы «Произведения»
/****** Object: Table [dbo].[Произведения] Script Date: 11/24/2009 15:12:49 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Произведения]') AND type in (N'U')) DROP TABLE [dbo].[Произведения] GO /****** Object: Table [dbo].[Произведения] Script Date: 11/24/2009 15:12:49 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Произведения]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Произведения]( [Код произведения] [int] NOT NULL, [Название произведения] [char](100) NOT NULL, [Код жанра] [int] NOT NULL, [Код средств создания] [int] NOT NULL, [Код автора] [int] NOT NULL, [Дата создания] [datetime] NULL, [Код страны] [int] NOT NULL, [Код места нахождения] [int] NOT NULL, [Цена] [real] NULL, CONSTRAINT [AK_Creation_Name] PRIMARY KEY CLUSTERED ( [Код произведения] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] 207
END GO SET ANSI_PADDING OFF GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Авторы]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Авторы] FOREIGN KEY([Код автора]) REFERENCES [dbo].[Авторы] ([Код автора]) GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Жанры]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Жанры] FOREIGN KEY([Код жанра]) REFERENCES [dbo].[Жанры] ([Код жанра]) GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Места нахождения]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Места нахождения] FOREIGN KEY([Код места нахождения]) REFERENCES [dbo].[Места нахождения] ([Код места нахождения]) GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Средства создания]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Средства создания] FOREIGN KEY([Код средств создания]) REFERENCES [dbo].[Средства создания] ([Код средств создания]) GO IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Произведения_Страны]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [FK_Произведения_Страны] FOREIGN KEY([Код страны]) REFERENCES [dbo].[Страны] ([Код страны]) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Author_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Author_Code] CHECK (((1)<=[Код автора] AND [Код автора]<=(99))) 208
GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Code] CHECK (((1)<=[Код произведения] AND [Код произведения]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Country_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Country_Code] CHECK (((1)<=[Код страны] AND [Код страны]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Date]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Date] CHECK (('01.01.1753'<=[Дата создания] AND [Дата создания]<='01.01.2010')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Genere_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Genere_Code] CHECK (((1)<=[Код жанра] AND [Код жанра]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Name] CHECK (([Название произведения] like '[А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а209
я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я а-я(.)][А-Я ая(.)]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Placemtnt_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Placemtnt_Code] CHECK (((1)<=[Код места нахождения] AND [Код места нахождения]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Creation_Tools_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Creation_Tools_Code] CHECK (((1)<=[Код средств создания] AND [Код средств создания]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Price]') AND parent_object_id = OBJECT_ID(N'[dbo].[Произведения]')) ALTER TABLE [dbo].[Произведения] WITH CHECK ADD CONSTRAINT [CK_Price] CHECK (((1)<=[Цена] AND [Цена]<=(99999999))) GO --
1.5. Сценарий создания таблицы «Средства создания»
/****** Object: Table [dbo].[Средства создания] Script Date: 11/24/2009 15:13:21 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Средства создания]') AND type in (N'U')) DROP TABLE [dbo].[Средства создания] GO /****** Object: Table [dbo].[Средства создания] Script Date: 11/24/2009 15:13:21 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Средства создания]') AND type in (N'U')) 210
BEGIN CREATE TABLE [dbo].[Средства создания]( [Код средств создания] [int] NOT NULL, [Описание средств создания] [char](100) NOT NULL, CONSTRAINT [PK_Средства создания] PRIMARY KEY CLUSTERED ( [Код средств создания] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Tools _Description]') AND parent_object_id = OBJECT_ID(N'[dbo].[Средства создания]')) ALTER TABLE [dbo].[Средства создания] WITH CHECK ADD CONSTRAINT [CK_ Tools _Description] CHECK (([Описание средств создания] like '[А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][АЯа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,][А-Яа-я ,]')) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_Tools_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Средства создания]')) ALTER TABLE [dbo].[Средства создания] WITH CHECK ADD CONSTRAINT [CK_Tools_Code] CHECK (((1)<=[Код средств создания] AND [Код средств создания]<=(99))) GO --
1.6. Сценарий создания таблицы «Страны»
/****** Object: Table [dbo].[Страны] Script Date: 11/24/2009 15:13:47 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Страны]') AND type in (N'U')) DROP TABLE [dbo].[Страны] 211
GO /****** Object: Table [dbo].[Страны] Script Date: 11/24/2009 15:13:47 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Страны]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Страны]( [Код страны] [int] NOT NULL, [Название страны] [char](100) NOT NULL, CONSTRAINT [PK_Страны] PRIMARY KEY CLUSTERED ( [Код страны] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_PADDING OFF GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[5CK_Prim_Country_Code]') AND parent_object_id = OBJECT_ID(N'[dbo].[Страны]')) ALTER TABLE [dbo].[Страны] WITH CHECK ADD CONSTRAINT [5CK_Prim_Country_Code] CHECK (((1)<=[Код страны] AND [Код страны]<=(99))) GO IF NOT EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[CK_ Country _Name]') AND parent_object_id = OBJECT_ID(N'[dbo].[Страны]')) ALTER TABLE [dbo].[Страны] WITH CHECK ADD CONSTRAINT [CK_ Country _Name] CHECK (([Название страны] like '[А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А212
Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][АЯа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ][А-Яа-я ]')) GO -2. Сценарии заполнения базы данных --
2.1. Сценарий заполнения таблицы «Авторы»
INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (1, 'Да Винчи', 'Леонардо', 'Ди сер Пьеро', 1753, 1753, 3, 'Тоскана') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (2, 'Суриков', 'Василий', 'Иванович', '01.24.1848', '03.19.1916', 1, 'Красноярск') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (3, 'Петров', 'Василий', 'Григорьевич', '12.12.1833', '05.29.1882', 1, 'Тобольск') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (4, 'Айвазовский', 'Иван', 'Константинович', '07.17.1817', '04.02.1900', 'Феодосия') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) 213
1,
--Список значений: VALUES (5, 'Шишкин', 'Иван', 'Иванович', '01.13.1832', '03.08.1898', 1, 'Татарстан') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (6, 'Лоррен', 'Клод', 'Желле', '01.01.1753', '12.31.1753', 2, 'Тулуза') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (7,'Пикассо', 'Пабло', NULL, '10.25.1881', '04.08.1973', 2, 'Малага') INSERT INTO [Авторы] --Список столбцов: ([Код автора], [Фамилия автора], [Имя автора], [Отчество автора], [Дата рождения], [Дата смерти], [Код страны], [Место проживания]) --Список значений: VALUES (8,'Имя', 'автора', 'неизвестно', '01.01.1753', '01.01.2010', 8, 'Неизвестно') --
2.2. Сценарий заполнения таблицы «Жанры»
INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (1, 'Портрет') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (2, 'Натюрморт') INSERT INTO [Жанры] 214
--Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (3, 'Архитектура') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (4, 'Пейзаж') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (5, 'Графика') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (6, 'Фотография') INSERT INTO [Жанры] --Список столбцов: ([Код жанра], [Название жанра]) --Список значений: VALUES (7, 'Жанр неизвестен') --
2.3. Сценарий заполнения таблицы «Места нахождения»
INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (1, 'Лондон. Британский музей') INSERT INTO [Места нахождения] --Список столбцов: 215
([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (2, 'Пенза. Пензенская областная картинная галерея') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (3, 'Венеция. Музей армянской конгрегации мхитаристов') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (4, 'Петергоф Ленинградской области. Дворцы-музеи и парки Петродворца') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (5, 'Феодосия. Феодосийская картинная галерея им. И. К. Айвазовского') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (6, 'Санкт-Петербург. Государственный Эрмитаж') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (7, 'Лувр. Картинная галерея') INSERT INTO [Места нахождения] --Список столбцов: 216
([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (8, 'Краков. Музей Чарторыжских') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (9, 'Москва. Государственная Третьяковская галерея') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (10, 'Челябинск. Челябинская областная картинная галерея') INSERT INTO [Места нахождения] --Список столбцов: ([Код места нахождения], [Название места нахождения]) --Список значений: VALUES (11, 'Место нахождения неизвестно') --
2.4. Сценарий заполнения таблицы «Произведения»
INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (1, 'Гора Арарат', 4, 1, 4, '1885', 3, 3, INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (2, 'Абсент', 1, 6, 7, 1753, 1, 6, NULL) 217
NULL)
INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (3, 'Мона Лиза (Джоконда)', 1, 3, 1, '1753', NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (4, 'Берег моря ночью', 4, 1, 4, '1837', 1, INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (5, 'Дама с горностаем', 1, 3, 1, '1753', 7, 8, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (6, 'В Крыму', 4, 2, 5, '1890', 1, 2, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: 218
2,
7,
5,
NULL)
VALUES (7, 'Витрувианский человек', 5, 4, 1, '1753', 3, 1, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (8, 'С гитарой (Портрет С.А. Кропоткиной)', 1, 5, 2, '1882', 1, 9, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (9, 'Хаос(Сотворение мира)', 4, 1, 4, '1841', 3, 3, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (10, 'Завоевание Сибири Ермаком', 4, 1, 2, 1895, 1, 9, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (11, 'Утопленница', 4, 1, 3, '1867', 1, 9, INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) 219
NULL)
--Список значений: VALUES (12, 'Неаполитанский залив', 4, 1, 4, '1841', 1, 4, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (13, 'Последний кабак у заставы', 4, 1, 3, '1868', 1, 9, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (14, 'Ураган на море', 4, 1, 4, '1889', 1, 5, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (15, 'В Сиверской', 4, 1, 5, '1896', 1, 10, NULL) INSERT INTO [Произведения] --Список столбцов: ([Код произведения], [Название произведения], [Код жанра], [Код средств создания], [Код автора], [Дата создания], [Код страны], [Код места нахождения], [Цена]) --Список значений: VALUES (16, 'Возвращение Одисея из страны фиаков', 4, 7, 6, 1753, 6, 1, NULL) --
2.5. Сценарий заполнения таблицы «Средства создания»
INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) 220
--Список значений: VALUES (1, 'Холст, масло') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (2, 'Холст на картоне, масло') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (3, 'Дерево, масло') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (4, 'Бумага, мел') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (5, 'Бумага, акварель') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (6, 'Акварель') INSERT INTO [Средства создания] --Список столбцов: ([Код средств создания], [Описание средств создания]) --Список значений: VALUES (7, 'Средства создания неизвестны') 221
--
2.6. Сценарий заполнения таблицы «Страны»
INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (1, 'Россия') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (2, 'Франция') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (3, 'Италия') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (4, 'Испания') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (5, 'Португалия') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (6, 'Англия') 222
INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (7, 'Польша') INSERT INTO [Страны] --Список столбцов: ([Код страны], [Название страны]) --Список значений: VALUES (8, 'Страна неизвестна') 2.7. Ввод стоимости в таблицу «Произведения» UPDATE [Произведения] -- Гора Арарат Айвазовского И.К. SET [Цена] = 836 WHERE [Код произведения] = 1 UPDATE [Произведения] -- Абсент Пабло Пикассо SET [Цена] = 548 WHERE [Код произведения] = 2 UPDATE [Произведения] -- Мона Лиза (Джоконда) Леонардо Да Винчи SET [Цена] = 936 WHERE [Код произведения] = 3 UPDATE [Произведения] -- Берег моря ночью Айвазовского И.К. SET [Цена] = 768 WHERE [Код произведения] = 4 UPDATE [Произведения] -- Дама с горностаем Леонардо Да Винчи SET [Цена] = 978 WHERE [Код произведения] = 5 UPDATE [Произведения] -- В Крыму Шишкина И.И. SET [Цена] = 536 WHERE [Код произведения] = 6 UPDATE [Произведения] -- Витрувианский человек Леонардо Да Винчи SET [Цена] = 865 WHERE [Код произведения] = 7 UPDATE [Произведения] -- С гитарой (Портрет С.А. Кропоткиной) Сурикова В.И. 223
SET [Цена] = 348 WHERE [Код произведения] = 8 UPDATE [Произведения] -- Хаос(Сотворение мира) Айвазовского И.К. SET [Цена] = 669 WHERE [Код произведения] = 9 UPDATE [Произведения] -- Завоевание Сибири Ермаком Сурикова В.И. SET [Цена] = 874 WHERE [Код произведения] = 10 UPDATE [Произведения] -- Утопленница Петрова SET [Цена] = 338 WHERE [Код произведения] = 11
В.Г.
UPDATE [Произведения] -- Неаполитанский залив Айвазовского И.К. SET [Цена] = 453 WHERE [Код произведения] = 12 UPDATE [Произведения] -- Последний кабак у заставы Петрова В.Г. SET [Цена] = 276 WHERE [Код произведения] = 13 UPDATE [Произведения] -- Ураган на море Айвазовского И.К. SET [Цена] = 539 WHERE [Код произведения] = 14 UPDATE [Произведения] -- В Сиверской Шишкина И.И. SET [Цена] = 647 WHERE [Код произведения] = 15 UPDATE [Произведения] -- Возвращение Одисея из страны фиаков Клода Лорена SET [Цена] = 548 WHERE [Код произведения] = 16
224
СОДЕРЖАНИЕ
Введение…………….……………………...………………………………................. 3
1 Проектирование информационной системы “ Живопись, графика, фотография ” ……………………………………………………………. 4
1.1 Анализ предметной области и разработка модели данных.………………. 4 1.2 Анализ информационных задач и круга пользователей системы ………. 12 1.3 Выработка требований и ограничений для системы……………………… 1
2 Выбор инструментальных средств для проектирования и реализации информационной системы…………………….……….... 1
2.1 Выбор инструментальных средств для проектирования и реалиизации базы данных…………………………………………………………………….. 1 2.2 Выбор инструментальных средств для проектирования и реалиизации клиентского приложения……………………………………………………... 1
3 Проектирование и реализация базы данных системы……….…….. 1
3.1 Создание проектов и баз данных в среде Microsoft Visual Studio………… 3.2 Проектирование и реализация таблиц…………………………...…….…..…. 3.3 Сценарии и экранные формы для ввода данных в базу системы…………. 3 3.4 Проектирование и программная реализация запросов……..….................... 4 3.5 Проектирование и программная реализация представлений ..……………. 3.6 Проектирование и программная реализация хранимых процедур и функций…………………………………………………………………………… 5 3.7 Проектирование и программная реализация триггеров…………………….
4 Проектирование и реализация клиентского приложения системы..
4.1 Проектирование клиентского приложения системы ……………………….. 4.2 Конфигурирование клиентского интерфейса с помощью среды Visual Studio.NET ……………………………………….……………………….. 7 4.3 Реализация клиентского приложения с помощью проекта на языке C#.... 5 Отладка и тестирование информационной системы …………...…… 8
6 Конфигурирование информационной системы ……………………… 8
Заключение…………………………………………………………..………………... 8
Список использованных источников…………………………….……….…. 89
Приложение А Экранные формы для создания проекта базы данных в среде Microsoft Visual Studio 2005 ……….……………………….... 9 225
Приложение Б Сценарии и экранные формы для создания баз данных............ 1
Приложение В Сценарии и экранные формы вариантов создания таблиц…… 1
Приложение Г Сценарии и экранные формы для ввода данных в базу……...... 1
Приложение Д Варианты построения запросов…………………..……………… 1
Приложение Е Сценарии и экранные формы для реализации представлений.……………………………………………….….…. 1
Приложение Ж Сценарии и экранные формы для реализации хранимых процедур и функций…………………………………………….…. 16
Приложение З Сценарии и экранные формы для реализации триггеров ......... 1
Приложение И Модули и экранные формы для реализации клиентского приложения информационной системы………………………… 1
Приложение К Сценарий создания и заполнения базы данных ………………. 1
226
Подписано к печати 26.01.2010г. Бумага ксероксная. Формат 60x84 1/16. Печать RISO. Усл. печ. л. 11,5. Заказ 26/01. Тираж 100 экз. Отпечатано с готового оригинал-макета в частной типографии Тугушева 440400, г. Пенза, ул. Моковская, 74, к. 220, тел.: 56-37-16 227