Database Design on SQL Server 7. Экзамен 70 - 029

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

303 42 4MB

Russian Pages 290 Year 2000

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
Программа «Сертифицированный профессионал Microsoft» (MCP)......Page 2
Сдача сертификационного экзамена......Page 4
Получение статуса MCP......Page 5
Об этой книге......Page 6
Цели сертификации......Page 7
Сдача экзамена......Page 8
Оцените свою готовность......Page 9
Необходимые знания и приемы......Page 14
Как проходит тестирование......Page 15
Внешний вид тестов......Page 16
Стратегия сдачи экзаменов с фиксированным числом вопросов......Page 17
Стратегия работы с вопросами......Page 18
Дополнительные ресурсы......Page 19
Борьба с изменениями в Web......Page 20
Общие сведения......Page 21
Моделирование объектов......Page 22
Атрибуты......Page 23
Общие ключи......Page 24
Отношения......Page 25
Вторая нормальная форма......Page 27
Третья нормальная форма......Page 28
Пятая нормальная форма......Page 29
Обеспечение целостности......Page 30
Удобство сопровождения......Page 31
Примеры экзаменационных вопросов......Page 32
Необходимые знания и приемы......Page 34
Системные базы данных......Page 35
Системные таблицы......Page 36
Системные хранимые процедуры......Page 38
Примеры экзаменационных вопросов......Page 39
Необходимые знания и приемы......Page 40
Проблемы файлов и групп......Page 41
Создание базы данных......Page 42
Удаление базы данных......Page 43
Команда ALTER......Page 44
Уменьшение размера баз данных вручную......Page 45
Настройка параметров баз данных......Page 46
Просмотр сведений о базе данных......Page 47
Примеры экзаменационных вопросов......Page 48
Создание таблиц......Page 50
Модификация таблиц......Page 56
Примеры экзаменационных вопросов......Page 59
Необходимые знания и приемы......Page 61
Список выборки......Page 62
Псевдонимы таблиц......Page 64
Уточнение имен объектов......Page 65
Секция WHERE......Page 66
Секция LIKE......Page 67
Секция GROUP BY......Page 68
ROLLUP......Page 69
Сравнение CUBE с ROLLUP......Page 70
COMPUTE......Page 72
Скалярные функции......Page 73
Конструкция CASE......Page 75
Функции даты......Page 76
Преобразование типов данных......Page 77
Агрегатные функции......Page 79
Ортогональные объединения......Page 80
Расширенные объединения TSQL......Page 81
Объединения ANSI......Page 82
UNION......Page 83
Секция TOP......Page 84
Примеры экзаменационных вопросов......Page 85
INSERT......Page 93
Основные сведения об INSERTM......Page 94
Использование команды SELECT......Page 96
BULK INSERT......Page 98
UPDATE......Page 100
Работа с типами данных TEXT и IMAGE......Page 101
Примеры экзаменационных вопросов......Page 103
Необходимые знания и приемы......Page 106
Команды даты/времени......Page 107
Команды блокировки......Page 108
Разные команды......Page 109
Команды выполнения запросов......Page 110
Команды настройки SQL-92......Page 112
Команды вывода статистики......Page 114
Команды транзакций......Page 115
Просмотр пользовательских параметров конфигурации......Page 117
Пользовательские параметры конфигурации по умолчанию......Page 118
Примеры экзаменационных вопросов......Page 119
ГЛАВА9 Индексы......Page 120
Механизмы реализации кластерных индексов......Page 121
Механизмы реализации некластерных индексов......Page 122
Создание индексов......Page 123
Некоторые сведения об индексах......Page 124
Примеры экзаменационных вопросов......Page 125
Необходимые знания и приемы......Page 127
Связывание правила со столбцом......Page 128
Значения по умолчанию......Page 129
Ограничения для значений по умолчанию......Page 130
Представления......Page 131
Представления:вертикальная защита данных......Page 132
Представления и команды INSERT, UPDATE, DELETE......Page 133
Получение информации о представлениях......Page 134
Некоторые сведения о представлениях......Page 135
Примеры экзаменационных вопросов......Page 136
Ключевые термины......Page 139
Переменные......Page 140
Глобальные переменные......Page 141
RAISERROR......Page 142
Команды условного выполнения......Page 143
GOTO......Page 146
SET......Page 147
Типы курсоров T-SQL......Page 148
Объявление курсоров......Page 149
Выборка записей......Page 150
Модификация записей с помощью курсоров......Page 152
Хранимые процедуры......Page 153
Примеры экзаменационных вопросов......Page 156
Использование триггеров......Page 158
Срабатывание триггеров......Page 159
Создание триггеров......Page 160
Таблицы deleted и inserted......Page 161
Просмотр таблиц deleted и inserted......Page 162
Вставка и удаление нескольких записей......Page 163
Проверка столбцов при модификации......Page 164
Триггер вставки......Page 165
Триггер обновления......Page 166
Триггеры в транзакциях......Page 167
Использование точек сохранения в триггерах......Page 168
Просмотр триггеров......Page 169
Примеры экзаменационных вопросов......Page 170
Природа транзакций......Page 173
Команды управления транзакциями......Page 174
Последовательность выполнения транзакций......Page 176
Распределенные транзакции......Page 177
Блокировка в транзакциях......Page 178
Уровень изоляции по умолчанию......Page 179
Некоторые сведения о блокировках......Page 180
Примеры экзаменационных вопросов......Page 181
BCP......Page 183
Компоненты DTS......Page 186
DTS Package Designer......Page 187
Преобразования......Page 188
Утилита dtswiz......Page 190
Примеры экзаменационных вопросов......Page 191
Подготовка к полнотекстовому поиску......Page 193
Построение полнотекстового индекса......Page 194
Активизация таблицы для полнотекстового индекса......Page 195
CONTAINS......Page 196
Весовые коэффициенты в критериях поиска......Page 197
Примеры экзаменационных вопросов......Page 198
Необходимые знания и приемы......Page 200
SHOWPLAN_TEXT......Page 201
Обновление статистики......Page 202
Диагностика и решение проблем блокировки......Page 203
Взаимные блокировки......Page 205
Примеры экзаменационных вопросов......Page 207
RPC......Page 209
Связанный сервер......Page 211
Незапланированные распределенные запросы......Page 212
Распределенные транзакции......Page 213
SQL Server в распределенных транзакциях......Page 214
Примеры экзаменационных вопросов......Page 215
Выбор правильных ответов......Page 218
Тактика ответа на вопросы......Page 219
На экзамене......Page 220
ГЛАВА19 Ответы на вопросы экзамена......Page 239
Приложение А. База данных Pubs......Page 244
Приложение Б. Функции......Page 249
Условные обозначения......Page 260
BULK INSERT......Page 261
Секция WHERE......Page 262
Курсоры......Page 263
Индексы......Page 265
Полнотекстовый поиск......Page 268
Безопасность......Page 269
Команды SET......Page 270
Хранимые процедуры......Page 271
Триггеры......Page 273
Пользовательские типы данных......Page 274
Глоссарий......Page 275
Центры обучения и сертификации в СНГ......Page 284
Шпаргалка Database Design on SQL Server 7......Page 288
Recommend Papers

Database Design on SQL Server 7. Экзамен 70 - 029

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

converted to PDF by BoJIoc

Благодарности Я хотел бы поблагодарить всех людей, чьи время и поддержка сделали возможным создание этой книги: от моего агента, который нашел для нас издательство Coriolis, и до команды в Coriolis, которая смогла улучшить эту книгу. Более всего я бы хотел поблагодарить мою семью, которая предоставила мне время и место, чтобы я сделал эту работу. Спасибо вам за все. Джефф Гарбус Я хочу поблагодарить Джеффа Гарбуса за то, что он подключил меня к работе над этой книгой. Спасибо моим родителям Фрэнку и Ширли Паскузи, которые наделили меня жаждой знаний и научили меня разбираться в проблемах и находить решения. Особое спасибо моей чудесной жене Пауле, благодаря которой я смог писать эту книгу в дополнение к моей основной работе. Кроме того, спасибо моей дочери Бейли и сыну Коннеру за то, что они позволили папе работать над книжкой, когда им так хотелось играть. Дэвид Паскузи Спасибо Джеффу Гарбусу за то, что он предоставил мне возможность внести свой вклад в эту книгу. Спасибо Гэрри Туреллу, который прислушался ко мне, когда мне понадобился перерыв. Спасибо моему брату Бэзилу, чьи телефонные звонки поздно ночью хотя и увеличили мой счет за телефон, но сохранили мне здравый рассудок. И особое спасибо моим родителям Юлингу и Ючинг Чанг, которые когда-то усадили меня за компьютер в первый раз. Элвин Чанг

Об авторах Получив степень бакалавра в Политехническом институте города Ренселер, Джефф Гарбус ( Jeff Garbus) работал в самых разных областях — от PC к мэйнфреймам и обратно. Джефф имеет многолетний опыт работы с клиент-серверными системами и программами Sybase, особенно по оказанию помощи клиентам при их переходе на новые системы в рамках пилотных и крупномасштабных проектов. В течение многих лет Джефф выступал на конференциях пользователей, писал статьи и заметки для национальных и международных изданий, а также написал около 10 книг, среди которых издающаяся в настоящее время в серии «Сертификационный экзамен — экстерном» книга «Разработка баз данных на SQL Server 7 .0 для MCSE». В настоящее время Джефф — президент консалтинговой и обучающей фирмы Soaring Eagle Consult ing, специализирующейся на решении бизнес-проблем в области СУРБД, которая находится в городе Тампа. Дэвид Паскузи (David Pascuzzi) — преподаватель, автор и консультант по компьютерам, специализирующийся в области технологий баз данных уже более 10 лет. По заказу правительства и частных фирм он готовил курсы для обучения, а также писал разнообразные статьи по технологиям баз данных. В своей работе по консалтингу он решает вопросы от поддержки баз данных и настройки их для повышения производительности до разработки баз данных. В настоящее время имеет степень MCP по SQL Server. После ее получения Дэвид уделяет особое внимание разработке курсов и консультациям по SQL Server. Элвин Чанг ( Alvin Chang) — преподаватель, автор и консультант, работающий в консалтинговой и обучающей фирме Soaring Eagle Consult ing в городе Тампа. Обладая степенью MCP по SQL Server, он занимается обучением и консалтингом по SQL Server в США. Специализируясь в настоящее время по администрированию в области систем Microsoft и Sybase Syst em , Элвин начинал как преподаватель, обучающий продуктам Microsoft Office, Lot us Sm art suit e и Lot us Not es до того момента, когда он перешел на СУРБД.

converted to PDF by BoJIoc

Введение Добро пожаловать! Цель этой книги — помочь вам подготовиться и сдать сертификационный экзамен Microsoft номер 70 -029, который называется Designing and I m plem ent ing Dat abases on Microsoft SQL Serv er 7 .0 ( Разработка и внедрение баз данных при помощи Microsoft SQL Server 7.0) . В этом разделе мы расскажем о программе сертификации Microsoft в общих чертах, а также покажем, как книги серии «Сертификационный экзамен — экстерном» могут помочь в сдаче экзаменов Microsoft . Книги этой серии помогут вам лучше понять материал, знание которого необходимо для успешной сдачи экзаменов. Серия «Сертификационный экзамен — экстерном» нацелена именно на подготовку к экзаменам. Эти книги не учат буквально всему, что вы должны знать о предмете экзамена (например, всем деталям архитектуры или программирования SQL Server) . Тем не менее, мы (авторы) рассматриваем и анализируем проблемы, которые вы, скорее всего, встретите на экзамене. Многое было взято из учебных материалов и тренировочных тестов самой Microsoft , а также из множества тестов для самопроверки разных фирм. Наша цель — дать как можно больше информации, которая пригодится вам при сдаче сертификационного экзамена. Однако чтобы быть готовым полностью к любому экзамену Microsoft , мы рекомендуем вам ознакомиться с тестом для самооценки, который следует в этой книге непосредственно за разделом «Особенности сертификации в России» . Это поможет вам оценить, удовлетворяют ли ваши знания требованиям, предъявляемым к MSCE. Основываясь на результатах теста, вы сможете выбрать для себя или обучение в сертифицированном центре, или самостоятельную подготовку с помощью учебных пособий Microsoft или других фирм, в том числе из серии « Сертификационный экзамен — экстерном». Мы также настоятельно рекомендуем вам попрактиковаться в установке, настройке и работе с программным продуктом или средой, по которой вы будете проходить тестирование, потому что для понимания вопросов, которые встретятся на экзамене, ничто не заменит вам реального опыта работы. Важно учиться по книгам, но опыт — лучший учитель! Программа « Сертифицированный профессионал M icrosoft» ( M CP) На момент написания этой книги программа MCP состояла из семи отдельных направлений, каждое из которых обозначается отдельным сокращением (каждому будущему сертифицированному специалисту необходимо относиться к сокращениям терпимо) : • MCP (Microsoft Cert ified Professional) — наименее престижная сертификация. Этот статус позволяет получить успешная сдача любого экзамена Microsoft (за исключением Net working Essent ials) . Вы можете доказать свое знание продуктов Microsoft сдачей дополнительных экзаменов. • MCP + I (Microsoft Cert ified Professional + I nt ernet) — эта сертификация среднего уровня требует сдачи трех обязательных экзаменов: Windows NT Server, TCP/ I P и I nternet I nform at ion Server. • MCP + SB (Microsoft Cert ified Professional + Sit e Building) — новая сертификация предназначена для специалистов, которые занимаются планированием, созданием, управлением и обслуживанием Webсерверов. Лица, которые стремятся получить этот статус, должны обладать навыками по созданию Webсерверов, которые включают в себя мультимедийное содержимое и средства поиска, а также могут публиковать в Интернете базы данных. Чтобы стать MCP+ SB, необходимо сдать один любой экзамен, который позволяет получить статус MCP, а также два экзамена из следующих трех: Designing and I m plem ent ing Com m erce Solut ions w it h Microsoft Sit e Server 3.0, Com m erce Edit ion ( Разработка и внедрение коммерческих приложений на основе коммерческого варианта Microsoft Sit e Server 3 .0 ), Designing and I m plem ent ing Web Sites wit h Microsoft Front Page 98 ( Разработка и внедрение Web-серверов с использованием Microsoft FrontPage 98) , а также Designing and I m plem ent ing Web Solut ions wit h Microsoft Visual I nt erDev 6 .0 ( Разработка и внедрение решений на основе Web при помощи Microsoft Visual I nt erDev 6.0). • MCSE ( Microsoft Cert ified Sy st em s Engineer) . Каждый, кто имеет статус MCSE, обладает высокой квалификацией при работе с Windows NT 3 .51 или Windows NT 4.0 и другими операционными системами и продуктами Microsoft . Эта сертификация была разработана для тех, кто должен планировать, внедрять и поддерживать информационные системы и сети на основе Microsoft Windows NT и семейства продуктов BackOffice.

converted to PDF by BoJIoc

converted to PDF by BoJIoc

логическую модель базы данных, внедрять ее на практике, осуществлять работу с данными с помощью Transact -SQL, поддерживать базы данных, регулировать доступ к данным, оценивать производительность и оптимизировать базы данных, устанавливать и конфигурировать Microsoft SQL Server. Чтобы стать MCDBA, нужно сдать в общей сложности пять экзаменов — четыре обязательных и один по выбору. К обязательным относятся: Adm inist ering Microsoft SQL Server 7.0 ( Администрирование Microsoft SQL Serv er 7 .0 ), Designing and I m plem ent ing Dat abases wit h Microsoft SQL Server 7.0 (Разработка и внедрение баз данных при помощи Microsoft SQL Server 7.0) , I m plem ent ing and Support ing Microsoft Windows NT Serv er 4.0 ( Внедрение и поддержка Windows NT Serv er 4 .0 ) и I m plem ent ing and Support ing Microsoft Windows NT Server 4 .0 in t he Enterprise (Внедрение и поддержка корпоративных технологий Window s NT Server) . Из экзаменов по выбору можно предпочесть либо экзамен по особенностям использования SQL Server — Designing and I m plem ent ing Dist ribut ed Applicat ions w it h Microsoft Visual C+ + 6.0 ( Разработка и внедрение распределенных приложений с помощью Microsoft Visual C+ + 6.0) ( экзамен 70-015) или с помощью Visual Basic 6.0 (экзамен 70-175), Designing and I m plem ent ing Dat a Warehouses wit h Microsoft SQL Serv er 7 .0 and Microsoft Decision Support Services 1 .0 ( Разработка и внедрение хранилищ данных с помощью Microsoft SQL Serv er 7 .0 и Microsoft Decision Support Services 1 .0 ), либо экзамен по Windows NT — I nt ernet working wit h Microsoft TCP/ I P on Microsoft Windows NT 4 .0 ( Работа с Microsoft TCP/ I P в сетях под управлением Microsoft Windows NT 4.0) или I m plem ent ing and Support ing Microsoft I nt ernet I nform at ion Server 4.0 (Внедрение и поддержка Microsoft I nt ernet I nform ation Server 4.0) . Эта книга готовит к сдаче обязательного для сертификации MCDBA экзамена. Полностью требования к MCDBA представлены в табл. 3. • MCT (Microsoft Cert ified Trainer) . Сертифицированные инструкторы Microsoft должны соответствовать требованиям, необходимым для преподавания в рамках авторизованных курсов Microsoft , в области как технических знаний, так и методических навыков. Для каждого курса, который хочет вести MCT, необходимо сдать соответствующий сертификационный экзамен и пройти авторизованное обучение, а также продемонстрировать способности к обучению. Удовлетворить последнему критерию можно, если у вас уже есть сертификация инструктора от фирмы Novell, Banyan, Lot us, Sant a Cruz Operat ion или Cisco или вы получили специальный опыт в преподавании курсов Microsoft . MCT отводится важная роль в системе обучения Microsoft . Только сертифицированные инструкторы имеют право читать авторизованные курсы в любых структурах, занимающихся авторизованным обучением, — будь то Сертифицированные центры технического обучения Microsoft (CTEC) или Институт онлайнового обучения Microsoft ( MOLI ) . Сертификация — это непрерывный процесс. Как только продукт Microsoft устаревает, сертифицированным специалистам дается обычно от 12 до 18 месяцев для того, чтобы сдать сертификационный экзамен по более свежей версии продукта (если этого не сделать, звание сертифицированного специалиста будет утрачено). В связи с бурными технологическими изменениями такой подход вполне объясним. Лучший способ получить дополнительные сведения о программе MCP и разнообразных способах сертификации — обратиться на Web-сайт Microsoft . Раздел, посвященный сертификации, называется Microsoft Cert ified Professional Web sit e, а его начальная страница находится по адресу www.m icrosoft .com / m cp. Поскольку Web-сайт Microsoft постоянно изменяется, возможно, вам придется провести на нем поиск по словосочетаниям MCP или «Microsoft Cert ified Professional Program » (последнее словосочетание для поиска лучше заключить в кавычки). Это позволит вам найти наиболее свежую и точную информацию по программам сертификации Microsoft . Кроме того, можно приобрести специальный компакт-диск, включающий в себя «Путь к образованию и сертификации Microsoft » («Microsoft Educat ion and Cert ificat ion Roadm ap»). Содержание его во многом совпадает с содержанием Web-сайта Microsoft и обычно обновляется ежеквартально. Сдача сертификационного экзамена Увы, тестирование не бесплатно. Вы заплатите за экзамен около 30 долларов в России и 100 долларов — в США и Канаде, независимо от того, сдали вы его или потерпели неудачу. Прием экзаменов осуществляется в авторизованных центрах тестирования Sylvan Prom et ric и Virt ual Universit y Ent erprise ( VUE), список которых можно получить на сайтах этих организаций — www.prom et ric.ru и ww w.it .spb.ru/ vue.

converted to PDF by BoJIoc

В день экзамена постарайтесь прийти примерно за 15 минут до назначенного времени. Следует заранее выяснить в центре тестирования, что вам нужно будет взять с собой ( обычно — удостоверение личности с фотографией). Все экзамены относятся к типу экзаменов «с закрытой книгой». Это означает, что вам не будет разрешено пользоваться на экзамене справочными материалами ( у вас будут только ручка, листок бумаги и словарь общего назначения, если вы сдаете тест на иностранном языке) . Перед тем как вы запустите тест, запишите на листке бумаги все, что, как вам кажется, придется вспоминать на экзамене, — это поможет сэкономить время в ходе экзамена. В книгах серии «Сертификационный экзамен — экстерном» в конце имеется шпаргалка с такой информацией. Перед началом экзамена у вас будет время вспомнить и записать эту информацию и, если есть необходимость, даже сдать пример теста, чтобы освоиться с интерфейсом тестирующей программы. Пример теста может пригодиться в первый раз, но вряд ли потребуется в дальнейшем. По окончании экзамена его результаты будут выведены на экран и на принтер. Все результаты оцениваются из расчета 1000 баллов, и иногда они дополнительно расшифровываются по темам экзамена. Даже если экзамен не сдан, мы советуем получить в центре тестирования официальный отчет, который позволит вам лучше подготовиться к пересдаче. Пересдача экзамена стоит столько же, сколько и первоначальный экзамен. Недавно компания Microsoft ввела новую политику в отношении пересдачи. Теперь первая пересдача может производиться на следующий день, а любая из последующих — по истечении 14-дневного периода. Получение статуса MCP Сдав любой экзамен, кроме Net working Essent ials, вы получаете статус MCP. В фирме Microsoft существует список сданных вами экзаменов — так называемый транскрипт. Вы можете получить транскрипт по электронной почте, отослав свой адрес электронной почты на m cp@m sprogram s.com . Вы можете также заказать и получить копию транскрипта, обратившись по соответствующим телефонам (номера можно узнать, загрузив с Web-узла Microsoft свежую версию MCT Guide, в которой есть раздел «Key Cont act s»). После того как вы сдадите необходимый набор экзаменов (шесть MCSE или девять MCSE+ I ) , на ваш адрес почтой будет отправлен пакет, так называемый Welcom e Kit . Обычные сроки его получения — от 2 до 4 недель с момента сдачи экзамена, так что не рассчитывайте получить его на следующее утро. Внутри пакета находятся: • Соответствующий сертификат, предназначенный для того, чтобы повесить его на видное место, пластиковая карточка сертифицированного профессионала Microsoft и нагрудный значок. • Лицензионное соглашение об использовании логотипа MCP в рекламных материалах, визитных карточках, фирменных бланках, документах и т. д. Кроме того, в состав пакета включены образцы логотипа и его описания. Перед использованием логотипа необходимо подписать указанное соглашение и переслать его в фирму Microsoft . • Если вы получили статус MCSE или MCSE+ I , то получите бесплатную годовую подписку на TechNet , подборку компакт- дисков, включающую техническую документацию, программное обеспечение, Serv ice Packs, базы данных и другую техническую информацию. По нашему мнению, подписка на TechNet — одно из наиболее ценных преимуществ, которые получает сертифицированный специалист. • Бесплатная подписка на Microsoft Cert ified Professional Magazine — журнал, посвященный вопросам тестирования и сертификации. В отличие от подписки на TechNet , за пределами США и Канады вам придется оплачивать почтовые расходы по пересылке журнала. • Годовая бесплатная подписка в рамках программы оценки бета-версий продуктов Microsoft . Эта подписка позволит получать бета- версии всех продуктов Microsoft в течение года ( кроме продуктов, предназначенных для разработчиков, — для их получения нужно оформить подписку в рамках программы MSDN или получить звание MCSD). Многие согласны с тем, что преимущества сертификации выходят далеко за рамки тех, которые предоставляет Microsoft . Так, часто в объявлениях о вакансиях сейчас требуется наличие у претендента статуса сертифицированного специалиста Microsoft, и многие из тех, кто получил сертификацию, признают, что она помогла им повысить зарплату или служебный статус. Статус сертифицированного специалиста Microsoft — это признание ваших знаний и упорного труда, и он высоко ценится в отрасли информационных технологий.

converted to PDF by BoJIoc

Как подготовиться к экзамену Для подготовки к любому тесту по SQL Server 7 ( включая и тест по администрированию) необходимо изучить те учебные материалы, которые обеспечат вам полную информацию о предмете экзамена. Мы рекомендуем: • Документацию по Microsoft SQL Server 7 (включая Books Online — электронную документацию, поставляемую вместе с продуктом, а также встроенную помощь). Часть документации можно найти на компакт- дисках TechNet . • Материалы для подготовки к экзаменам, тренировочные тесты, а также тесты для самооценки, которые можно загрузить со страницы Microsoft Training And Cert ificat ion Download page (www .m icrosoft .com / Train_Cert / download/ download.htm ) . Найдите эти материалы, загрузите их и используйте! • Обучение в сертифицированных центрах. Авторизованные центры обучения, Институт онлайнового обучения Microsoft , а также множество компаний, занимающихся неавторизованным обучением, предлагают (или предложат в ближайшее время) обучение администрированию SQL Server 7 . Цель обучения — помочь получить знания для работы с SQL Server и сдачи экзаменов. Большинство тех, кто проходил обучение ( к ним также присоединяются и авторы, которые ведут такие курсы) , согласны с тем, что курсы стоили затраченных на них денег. Для того чтобы помочь вам ориентироваться в публикациях за пределами этой книги, в конце каждой главы есть раздел «Дополнительная информация», который содержит ссылки на более подробные источники по теме главы. • Компакт- диски TechNet . Ежемесячные выпуски TechNet от Microsoft доставляются по подписке. TechNet включает в себя Resource Kits по продуктам Microsoft и относящуюся к ним документацию. Кроме того, в TechNet включены Microsoft Knowledge Base — база знаний Microsoft — и разного рода полезные программы, техническая документация (whit e papers), материалы для самостоятельного освоения программных продуктов, все служебные пакеты (service packs), включая отдельные заплаты ( pat hes) , и дополнительные драйверы, вышедшие в период после выпуска программного продукта. Мы считаем, что содержание TechNet полностью оправдывает расходы на подписку. Перечисленный набор обязательных и рекомендуемых материалов покрывает все темы, связанные с SQL Serv er 7 . Мы надеемся, что, оценивая эту книгу, вы придете к мысли, что она хорошо вписывается в этот набор. В следующем разделе мы объясним структуру этой книги и покажем, почему эта книга может рассматриваться как полноправный член списка обязательных и рекомендованных для чтения материалов.

Об этой книге Каждая глава этой книги написана по определенному плану, при этом наиболее важная и полезная информация графически выделена. Обычно глава включает: • Список ключевых терминов. Каждая глава начинается со списка терминов, инструментов и навыков, которыми вы должны полностью овладеть, изучая данную главу. За списком обычно идет один или два параграфа, которые должны послужить введением к главе. В основном эта книга полностью соответствует описанной структуре, но есть еще несколько моментов, на которые стоит обратить внимание. Так, глава 14 включает примерный тест, который позволит дополнительно закрепить все усвоенное из этой книги и оценить степень своей готовности к экзамену. Глава 15 содержит ответы на вопросы примерного экзамена. В конце книги вы найдете глоссарий, который поможет узнать, что означает тот или иной термин, а также алфавитный указатель, который позволит вам найти упоминание об этом термине в тексте. В самом конце книги находится «шпаргалка» — сжатый и комплексный подбор данных, схем и подсказок, которые вы должны выучить перед сдачей экзамена. Вы можете воспроизвести всю информацию на листке бумаги до того, как начнете отвечать на вопросы теста. В связи с этим можно попробовать зазубрить информацию перед экзаменом: вы должны помнить ее только до того момента, когда напишете на листке бумаги перед началом экзамена. Может быть, есть смысл бросить на «шпаргалку» последний взгляд в машине или даже в коридоре центра тестирования непосредственно перед экзаменом. Как использовать эту книгу Если вы в первый раз готовитесь к сдаче экзамена, есть смысл идти по главам в том порядке, в котором они расположены в данной книге. Это связано с тем, что некоторые темы в конце книги будет проще понять,

converted to PDF by BoJIoc

изучив ее начало. Если же вы хотите пропустить определенные темы или вы пытаетесь сдать экзамен уже не в первый раз, тогда используйте индекс или оглавление, чтобы сразу перейти к теме, которая вас интересует. Кроме сдачи экзаменов, эта книга может оказаться полезной для усвоения некоторых наиболее важных свойств SQL Server 7. Все компоненты нашей книги служат одной цели — помочь вам подготовиться и успешно сдать сертификационный экзамен Microsoft номер 70 -029 Designing and I m plem ent ing a Database wit h Microsoft SQL Serv er 7 .0 ( Разработка и внедрение баз данных при помощи Microsoft SQL Server 7.0) . Мы будем рады, если вы пришлете нам свое мнение об этой книге, особенно если выскажете при этом какие-либо конкретные предложения по ее улучшению. Мы постараемся с благодарностью воспринять все, что вы пришлете, и ответить на все ваши предложения. Благодарим вас и желаем получить удовольствие от книги!

Особенности сертификации в России Сертификация в России имеет свои особенности, которые мы постараемся осветить в этой главе. Цели сертификации Главное отличие сертификации в России и за рубежом, по-видимому, заключается в том, каким образом принимаются решения о необходимости сдачи тестов и чем руководствуется специалист, решивший получить сертификацию. В США обычно необходимость сертификации записана в должностной инструкции, контракте и т. п. Существует определенное правило — сотрудник с установленными зарплатой и кругом обязанностей должен иметь (или получить в течение определенного срока) , например, статус MCSE. Из этого вытекает и все остальное — например то, что обучение и определенное количество попыток сдачи экзаменов оплачивает работодатель. Интересно, что иногда слишком большое количество званий у специалиста может стать препятствием к получению им работы. Например, на определенную должность ( типа поддержки рабочих станций — Workst at ion support ) , согласно штатному расписанию, должен быть принят сотрудник со статусом MCP по NT Workst at ion или Windows 95 . Сотрудника со статусом MCSE на эту должность уже не возьмут — существует правило, согласно которому сертифицированному инженеру необходимо платить другую сумму, и фирма может отказаться от специалиста с более высокой сертификацией. Поэтому экзамены «на всякий случай» сдаются за рубежом относительно редко. В России в настоящий момент ситуация несколько другая. В штатных расписаниях обычно указываются требования в виде специального образования, определенного стажа работы по специальности и крайне редко — требования иметь сертификацию определенной фирмы. Исключение составляют только филиалы и дочерние компании иностранных фирм, а также очень немногочисленные предприятия с западной корпоративной культурой. В то же время, достаточно часто бывает и так, что квалифицированному специалисту в течение долгого времени трудно подобрать работу с соответствующим уровнем оплаты труда и он старается использовать все возможности доказать свою квалификацию работодателям. В связи с этим большинство из тех, кто сдает в настоящее время в России экзамены на звание сертифицированного специалиста, делают это по собственной инициативе. Хорошо это или плохо? Конечно, хорошо. Во-первых, звание сертифицированного специалиста — это, пожалуй, лучший способ доказать свою квалификацию, если нет возможности представить множество рекомендаций. Звание сертифицированного специалиста особенно ценится при получении работы через кадровые агентства, а также при устройстве на работу за границей или в филиалы иностранных компаний. При этом следует упомянуть, что, например, в США звание MCSE ценится выше высшего образования по специальности, которое, если оно получено не в США, еще надо подтвердить. Во- вторых, обычно, получив сертификацию, специалист повышает свой авторитет в глазах окружающих, и многие вещи трактуются уже иначе. В одной и той же ситуации шеф может сказать так: «Что- то наш отдел автоматизации подкачал», а может и так: «Техника — она и есть техника, а ведь вроде brandnam e купили».

converted to PDF by BoJIoc

Естественно, чем выше ваш авторитет, тем чаще ситуации будут оцениваться по второму варианту. Может быть, это и не очень серьезно, но тем не менее... В-третьих, сертифицированный специалист обычно не просто умеет работать с программным продуктом, а делает это в соответствии с определенными стандартами и принятыми правилами, что в значительной степени гарантирует отсутствие проблем при переходе на новые версии и сокращает время, необходимое на переучивание, при переходе в другую организацию. В-четвертых, обычно сертификация типа MCSE или MCDBA подразумевает также неплохое знание технического английского и знание источников информации по программным продуктам, что обычно также идет специалисту «в плюс». В-пятых, сертификация — это еще и психологическая характеристика специалиста. С одной стороны, он не испугался достаточно сложных экзаменов, с другой — сумел потратить достаточно много времени на подготовку, а это уже говорит о том, что он заинтересован и дальше развиваться как специалист. Необходимо также упомянуть о большой усидчивости и настойчивости, которая необходима для получения MCSE или MCDBA. Перечислять плюсы можно еще достаточно долго. Но, возможно, один из самых интересных моментов — это то, что экзамены — это всегда вызов сдающему, и притом серьезный, и чувство победы заслуживает того, чтобы его испытать. Подготовка к экзаменам Подготовка к экзаменам в России также имеет свои особенности. Безусловно, лучший способ — это авторизованные курсы в учебном центре Microsoft (ATEC). Обучение в таких центрах ведется по материалам Microsoft в учебных классах, в которых регламентировано буквально все — от рабочих станций до кондиционеров (список ATEC в странах СНГ приведен в табл. 1 в приложении «Центры обучения и сертификации в СНГ» в конце книги) . Курсы полностью идентичны проводимым за рубежом, за исключением языка, на котором они читаются. После завершения курса выдаются сертификаты об окончании авторизованных курсов Microsoft , которые ценятся, конечно, меньше, чем сертификации, но все равно являются серьезными документами. При этом обучение ведется преподавателями, которые как минимум уже сдали экзамен по тому предмету, который они читают, поэтому у них обычно можно получить информацию не только по программному продукту, но и по особенностям экзамена. Будет очень удачно, если вы сможете пройти по так называемой сборке — сразу по нескольким курсам, специально подобранным для получения определенной сертификации. Это выгодно и по финансовым соображениям, и с той точки зрения, что преподавателю не надо будет дублировать определенные повторяющиеся в разных курсах моменты. Сборка по сертификации MCSE в настоящий момент успешно работает в ATEC ЛИМТУ. Если же ни вы, ни ваша организация не могут взять на себя расходы по обучению в учебном центре, остается единственный выход — самостоятельная подготовка. При этом, конечно, выбор пособий и других источников информации для подготовки гораздо беднее, чем за рубежом. Издательство «Питер» в настоящее время выпустило для подготовки к экзаменам следующие книги серии «Сертификационный экзамен — экстерном» : Net work ing Essent ials ( экзамен 70-058 ), NT Workst at ion 4 (экзамен 70-073), NT Server 4 (экзамен 70 -067) , NT Server 4 in t he Ent erprise (экзамен 70 -068) , TCP/ I P ( экзамен 70-059), Adm inistering SQL Serv er 7 (экзамен 70-028 ), Dat abase Design on SQL Server 7 (экзамен 70 -029) и Exchange Server 5.5 (экзамен 70-081) . Не следует забывать также и про документацию программного продукта, в особенности электронную — Books Online. Без проработки документации, по нашему мнению, сдать экзамены почти невозможно (по крайней мере, с первого раза). Пугаться самостоятельной подготовки не стоит, большинство сертифицированных специалистов в России готовились к сдаче экзаменов именно таким способом. Правда пока у вас недостаточно опыта сдачи этих экзаменов, велика вероятность, что первые экзамены придется сдавать несколько раз. Сдача экзамена Главное отличие сдачи экзаменов в России, которое буквально бросается в глаза, — это их стоимость. Сдача сертификационного экзамена в России стоит 30 долларов США (до недавнего повышения их стоимости фирмой Microsoft было 20 долларов) , в то время как за рубежом — 100 долларов. Фактически, экзамены являются дотационными, то есть Microsoft доплачивает проводящим тестирование

converted to PDF by BoJIoc

организациям — Sylvan Prom et ric и VUE — за прием экзаменов. Это — еще один довод в пользу сертификации. Все остальное — сами экзамены, тестирующее программное обеспечение, правила тестирования, заказ экзаменов и т. д. — четко регламентировано и является идентичным в центрах тестирования по всему миру. Четыре экзамена — по Windows 95, Windows NT Workst at ion, Windows NT Server и Windows NT Server on t he Ent erprise можно сдавать на русском языке. Многие из сдающих отмечают, что на русском зачастую сдавать сложнее из-за терминологических неточностей и просто ошибок перевода, а также из- за того, что времени бывает недостаточно (если вы сдаете экзамен на неродном языке, то вам даются дополнительные 30 минут) . Во всем остальном экзамены на русском ничем не отличаются от остальных. Список центров тестирования в России приведен в табл. 2 и 3 в приложении «Центры обучения и сертификации в СНГ» в конце книги. После экзамена После экзамена, если у вас уже есть звание MCP, вы можете убедиться в том, что его сдача зафиксирована в Microsoft , зайдя на защищенную часть Web-сервера Microsoft ( ищите кнопку MCP Only, а затем — Transcript ) . Обычно новая запись появляется через день-два после сдачи. Если вы получили новую сертификацию, то через какое-то время экспресс-почтой DHL вам придет так называемый Welcom e Kit — пакет с вашим сертификатом, соглашением, которое нужно принять, прежде чем открывать сертификат, разного рода рекламой, инструкциями и другими полезными вещами. Microsoft предупреждает о том, что Welcom e Kit приходит в течение 4–6 недель с момента сдачи экзамена. По нашему опыту, реально проходит от 10 дней до 2 месяцев, со средним сроком около 2 недель. Если примерно через месяц вы еще не получили Welcom e Kit , можно отправить по определенному электронному адресу (его вы найдете на Web-сайте Microsoft ) письмо с просьбой разобраться. Адрес, по которому будет отправлен Welcom e Kit , берется из анкеты, которую вы заполнили перед заказом первого экзамена (потом адрес можно будет изменить на Web-узле Microsoft ), поэтому есть смысл указать адрес, по которому будет кому принять Welcom e Kit в рабочее время. Через значительно более долгое время вам обычной почтой придет Lapel Pin — нагрудный значок, соответствующий вашей сертификации, и Wallet Card — магнитная карта (не кредитная, хотя и очень на нее похожая) , несущая в себе ту же информацию. Кроме того, если вы получили сертификацию MCSE или MCDBA, на тот же адрес почтой DHL вам будут приходить компакт-диски TechNet (20–40 штук ежемесячно) , поэтому адрес нужно указывать очень четко и продуманно, желательно печатными буквами и с соблюдением международных правил. Тенденции сертификации В настоящее время значение сертификации постоянно возрастает. Если еще несколько лет назад международная сертификация была экзотикой, то сейчас все большее число людей знает, что это такое, и готово ее ценить. С учетом того, что количество рабочих мест в области информационных технологий, как и во всем мире, постоянно растет и требуется непредвзятая оценка квалификации специалистов, несомненно, что в ближайшее время требования в отношении MCP, MCSE, MCDBA и MCSD будут встречаться все чаще. В то же время, получить сертификацию становится все сложнее. С одной стороны, растет стоимость сдачи экзаменов (а в будущем планируется, что стоимость сдачи экзаменов в США и России будет одинаковой) , все меньше становится разных ваучерных программ (в 1997 г., например, можно было в рамках специальных программ сдавать экзамены бесплатно, и в случае получения звания MCSE или MCSD выплачивалась вполне приличная премия в долларах) . С другой стороны, Microsoft постоянно меняет форматы экзаменов (делая их то адаптивными, то обычными, с фиксированным числом вопросов) , тематику вопросов, сами экзамены. С 1 октября 1999 г. полностью меняются, например, требования к разработчикам — MCSD. Учитывая все вышесказанное, получается единственный вывод — если вы решили получать сертификацию, самое время делать это сейчас. Удачи вам!

Оцените свою готовность

converted to PDF by BoJIoc

Основываясь на последней статистике фирмы Microsoft — около 250 000 человек находятся на том или ином этапе сертификации, но еще не получили статуса MCP или какого-либо иного. По нашим оценкам, в три-четыре раза большее число людей размышляют, стоит ли им сертифицироваться. Это очень много. Причина, по которой мы включили тест для самооценки в эту книгу, заключается в желании помочь вам оценить вашу готовность для получения сертификации MCSE или MCSE+ I nt ernet . Тест поможет вам оценить, что вам необходимо, чтобы овладеть предметом этой книги, а именно, темами экзамена 70 -029 «Разработка и внедрение баз данных при помощи Microsoft SQL Server 7.0» . Но перед тем как вы приступите к самооценке, давайте обсудим, для кого предназначена сертификация MCSE и как должен выглядеть идеальный кандидат на это звание. M CSE в реальной жизни В этом разделе мы опишем идеального кандидата на звание MCSE (не забывая о том, что в действительности таким требованиям удовлетворяют совсем немногие) . Возможно, наше описание покажется вам несколько пугающим. Однако волноваться не следует: хотя требования для получения статуса MCSE и выглядят очень серьезными, это не значит, что им невозможно соответствовать. Тем не менее, вы должны четко представлять себе, что процесс сертификации займет определенное время, потребует расходов и значительных усилий с вашей стороны. В настоящее время во всем мире существует около 95 000 сертифицированных специалистов со званием MCSE, так что эта цель представляется вполне достижимой. Поскольку до вас сертификационные экзамены сдавали многие, у вас есть преимущество — вы можете учесть их опыт. Если у вас достаточно волевых качеств, чтобы отнестись к процессу сертификации серьезно и приобрести необходимые для этого знания и опыт, — вы сможете сдать все требуемые тесты. Мы разрабатывали серию «Сертификационный экзамен — экстерном» (и в дополнение к ней серию «Для подготовки к экзаменам») для того, чтобы облегчить вам, насколько возможно, процесс подготовки. Но подготовка должна быть обязательно! Это, конечно, справедливо и для других сертификаций MCSE, таких как: • MCSE+ I nternet , которая во многом схожа с MCSE, но требует семи обязательных экзаменов и двух — по выбору по темам, связанным с Интернетом (всего девять экзаменов); • MCSD, которая предназначена для разработчиков программного обеспечения и требует сдачи одного специального экзамена, двух экзаменов по настольным и распределенным приложениям и еще одного экзамена по выбору (из разнообразного, но строго ограниченного набора); • других сертификаций, требующих сдачи только одного экзамена (MCP или MCT) или нескольких ( MCP+ I , MCP+ SB, MCDBA). Идеальный кандидат в MCSE Чтобы понять, каким должен быть идеальный кандидат на звание MCSE, мы приведем некоторые сведения об образовании и опыте, которыми он должен обладать. Не беспокойтесь, если вы не соответствуете этим требованиям, — мы живем не в идеальном мире, и те моменты, которым вы соответствуете не в полной мере, можно компенсировать, приложив дополнительные усилия. Требования включают в себя: • Академическое или профессиональное образование в области теории, концепций и работы в компьютерных сетях. Необходимо иметь глубокие знания в области сетевых устройств и технологий, включая знания сетевых операционных систем, служб и приложений. • Не менее трех лет опыта профессиональной работы с компьютерными сетями, включая Et hernet , Token Ring, модемы и другие сетевые технологии. Нужно обладать опытом в установке, конфигурировании, обновлении и диагностике. • Не менее двух лет опыта реальной работы в сетевом окружении, включающем в себя системы на основе Windows NT Server, Windows NT Work st at ion и Windows 95 или 98. Также необходимо хорошо разбираться в установке, конфигурировании, поддержке и диагностике этих операционных систем. • Хорошее понимание механизма работы сетевых протоколов, таких как TCP/ I P, I PX/ SPX и Net BEUI , включая адресацию и разрешение имен. • Хорошее понимание схемы именования в Net BI OS, работы службы обзора сети и служб доступа к файлам и печати.

converted to PDF by BoJIoc

• Знакомство со службами Windows NT, основанными на TCP/ I P, такими как HTTP (серверы Web), DHCP, WI NS, DNS, и с одним или несколькими продуктами Microsoft для работы в Интернете, такими как I nt ernet I nform at ion Server (I I S), I ndex Server, Proxy Server. • Практические знания в области Net Ware 3.x и 4.x, включая форматы фреймов I PX/ SPX, служб файлов, печати, каталогов и программное обеспечение как клиентов Novell, так и клиентов Microsoft . Умение работать с Microsoft Client Services for Net Ware (CSNW) , Gat ew ay Serv ices for Net Ware ( GSNW) , Net Ware Migrat ion Tool ( NWCONV) и клиентами Net Ware для Windows (NT, 95 и 98) также является существенным. Подводя итоги, мы должны отметить, что необходим диплом бакалавра в области компьютеров и три года работы по технической специальности в области разработки, установки, конфигурирования и поддержки компьютерных сетей. Мы считаем, что значительно менее половины кандидатов на получение сертификации соответствуют всем требованиям, а большинство не соответствует и половине требований, по крайней мере, когда они начинают заниматься сертификацией. Но поскольку 90 000 сертифицированных специалистов смогли выдержать испытание в виде тестов — ничто не мешает выдержать его и вам, особенно если наш краткий список требований позволил вам выявить ваши слабые места. Проверьте себя с помощью теста Следующая серия вопросов была разработана специально для того, чтобы помочь оценить, сколько труда нужно будет вам приложить для сертификации Microsoft и какие дополнительные ресурсы потребуются. Постарайтесь быть абсолютно честными в ваших ответах — в противном случае вы рискуете просто потерять деньги, сдавая экзамены, к сдаче которых еще не готовы. Правильных и неправильных ответов на эти вопросы не существует, а есть только этапы, которые, возможно, вам придется преодолеть для получения сертификации. Только вы сами сможете определить свое место среди широкого спектра кандидатов. Следует обратить внимание на такие два обстоятельства: • даже не самое совершенное образование по компьютерной специальности принесет вам пользу; • реальный опыт в работе с продуктами и технологиями Microsoft дает вам существенные преимущества при сертификации. Ваше образование 1. Проходили ли вы ранее обучение в компьютерных классах? ( Да или нет.) Если «Да», переходите к вопросу 2, если «Нет» — к вопросу 4. 2. Проходили ли вы обучение в компьютерных классах по операционным системам? (Да или нет.) Если «Да», то, возможно, вы знакомы с основами архитектуры систем Microsoft и главными системными компонентами. Если это так, сосредоточьте свое внимание на базовых концепциях операционных систем, в особенности связанных с виртуальной памятью, режимами многозадачности, отличием режима пользователя от режима ядра, общей архитектурой безопасности. Если «Нет» , вам необходимо ознакомиться с дополнительной литературой, особенно связанной с концепциями операционных систем. 3. Проходили ли вы обучение концепциям построения сетей или сетевым технологиям? (Да или нет.) Если «Да», то, возможно, вы ориентируетесь в терминологии, концепциях и технологиях сетей Microsoft . Если же такого обучения не было или вы проходили его очень давно, вам следует подтянуть свои знания в области базовых концепций построения сетей, терминологии, в особенности в отношении сетевых сред, способов передачи данных, модели OSI и конкретных сетевых технологий, таких как Et hernet , Token Ring, FDDI и WAN. 4. Изучали ли вы самостоятельно с помощью литературы операционные системы или компьютерные сети? (Да или нет.) Если «Да», то посмотрите, хорошо ли вы знакомы с темами, которые перечислены ранее в этом разделе. Если все в порядке, переходите к следующему разделу.

converted to PDF by BoJIoc

Если «Нет» , вам необходимо ознакомиться с дополнительной литературой по этой тематике. Ничто не заменит хорошие базовые знания для сдачи экзаменов Microsoft . Практический опыт Решающее значение для сдачи всех экзаменов Microsoft имеет практический опыт работы с программными продуктами, особенно с Windows NT Server и Work st at ion, а также разного рода дополнительными компонентами и продуктами Back Office. Главная мысль, которую следует вынести из данного теста для самооценки, — не существует альтернативы реальной работе с программными продуктами, включая их установку, настройку и использование в течение достаточно долгого периода и на высоком уровне. 5. Устанавливали ли вы и конфигурировали: • Windows NT Server? (Да или нет) ? Если «Да», проверьте, что вы действительно понимаете базовые концепции в соответствии с темами экзамена 70-067 и более сложные концепции экзамена 70 -068. Вы должны также быть знакомы с интерфейсами, утилитами и службами TCP/ I P на уровне экзамена 70-059 и с возможностями I nt ernet I nform at ion Server на уровне экзамена 70 -087. Вы можете загрузить темы экзамена, тренировочные экзамены и другую информацию об экзаменах Microsoft с Web-страницы, посвященной обучению и сертификации, по адресу www.m icrosoft .com / t rain_cert . Используйте кнопку Find an Exam , чтобы найти информацию по определенному экзамену. Если вам еще не приходилось работать с Window s NT Serv er, TCP/ I P и I I S (или другим продуктом, который вы выбрали для сдачи экзамена), полезно будет приобрести один или два компьютера и копию Windows NT Server. Затем приступайте к изучению операционной системы, TCP/ I P и прочих программных продуктов, по которым вам предстоят экзамены. Мы рекомендуем вам приобрести два компьютера, каждый с сетевой платой, и организовать маленькую локальную сеть из двух компьютеров для практических заданий. В настоящее время можно приобрести компьютер, подходящий для установки Windows NT, за 500–600 долларов — мы надеемся, что это не вызовет у вас больших финансовых затруднений. Советуем вам также заказать Back Office Trial Kit , который включает в себя пробные версии Workstat ion и Server. Это можно сделать на странице www.backooffice.m icrosoft .com / downt rial. • Windows NT Workstat ion? (Да или нет.) Если «Да», проверьте ваше знание тем экзамена 70-073 . Если «Нет» , приобретите копию Windows NT Workstat ion и научитесь устанавливать, конфигурировать и поддерживать эту операционную систему. Чтобы лучше ориентироваться в этом, вы можете приобрести книгу «NT Workstat ion 4» из серии «Сертификационный экзамен — экстерном» или просто руководствоваться списком тем от Microsoft . Очень полезная информация для подготовки ко всем перечисленным экзаменам содержится в Resource Kit s. Эти наборы можно заказать по адресу: ht tp: / / m spress.m icrosoft .com . Кроме того, они высылаются подписчикам TechNet . Мы советуем вам использовать Resource Kit s вместе с нашими книгами серий «Сертификационный экзамен — экстерном» и «Для подготовки к экзаменам» . Вместо экзамена 70-073 вы можете сдавать экзамен по Windows 95 (70 -064) или Windows 98 (70-098) — все эти экзамены соответствуют списку возможных экзаменов по настольным операционным системам MCSE. Хотя мы рекомендуем вам сдавать экзамен 70-073 (это поможет вам в освоении NT Server), если вы всетаки решили выбрать Windows 95 или 98, советуем вам также использовать для подготовки Resource Kit s. 6. Устанавливали ли вы, конфигурировали, использовали, обновляли другие продукты Microsoft — не операционные системы? Например, Front Page98, SQL Server и прочие ( Да или нет.) Если «Да», то переходите к следующему разделу. Если «Нет» , то советуем вам приобрести необходимый опыт. Далее мы приведем несколько советов относительно того, каким образом это лучше сделать.

converted to PDF by BoJIoc

Для любых экзаменов Microsoft — от самых простых, таких как FrontPage98 , до таких сложных, как Exchange 5 .5 или SQL Server 7, — от вашего практического опыта работы во многом зависит ваш успех. Вы можете загрузить себе на компьютер компоненты Back Office со страницы www.backoffice.m icrosoft .com / downt rial, для пробных версий других программ используйте опции поиска на Web-узле Microsoft . Совет Если вы располагаете достаточными средствами или за вас может заплатить ваш работодатель, подумайте о том, чтобы пройти специализированное обучение в авторизованном учебном центре (Cert ified Training and Educat ion Cent er — CTEC) или в высшем учебном заведении — партнере Microsoft ( Aut horized Academ ic Training Part ner — AATP) . В дополнение к тому, что вы узнаете на лекциях, у вас будет возможность на практике поработать с программным продуктом и операционной системой (как правило, c NT Server), кроме того, в вашем распоряжении останутся фирменные учебные материалы. И не пытайтесь сдавать экзамен без достаточной подготовки, которая обязательно должна включать в себя понимание процесса установки и конфигурирования продукта, его поддержки и диагностики проблем. Тщательная подготовка поможет вам не только на экзамене, но и в реальной жизни! Проверка вашей готовности к экзамену Готовиться к экзаменам нужно обязательно, независимо от того, занимаетесь ли вы с инструктором или самостоятельно сидите за книгами. Поскольку вы платите деньги за экзамен, обычно существует желание сдать его с первой попытки. Чтобы узнать, каковы ваши шансы сдать экзамен, существуют пробные тесты. Обычно лучшая стратегия после того, как вы завалили экзамен после самостоятельной подготовки, — всетаки пройти специализированное обучение в учебном классе. Чтобы найти информацию по обучению, проводимому самой Microsoft , следует воспользоваться кнопкой «Find a course» на странице www.m icrosoft .com / t rain_cert. Если такое обучение для вас дороговато, все равно посетите эту страницу и просмотрите ссылки на бесплатные пробные экзамены. Существует также множество платных пробных экзаменов. Даже если вы по финансовым соображениям не захотите приобретать многие из них, обратите внимание на некоторые из дешевых тестов. Возможно, они вам помогут оценить готовность к экзамену лучше, чем вы сможете это сделать любым другим способом. Вот несколько Web-узлов, которые предлагают вам пробные тесты дешевле, чем за 100 долларов ( а некоторые из них гораздо дешевле или совсем бесплатно) : • • • •

Beachfont Quizzer — www .bfq.com ; Hardcore MCSE — www.hardcorem cse.com ; LANWright s — www.lanw .com / books/ exam cram / order.htm ; MeasureUP — www .m easureup.com .

7. Пытались ли вы сдавать пробные тесты по теме вашего экзамена? (Да или нет.) Если «Да» и вы получили результат от 70 % и выше, возможно, вы уже готовы отправляться на экзамен. Если не дотягиваете до нужно результата — тренируйтесь дальше. Если «Нет» , постарайтесь загрузить доступные вам бесплатные и дешевые тесты и приступайте к их освоению. Советуем добиться того, чтобы уверенно набирать требуемое число баллов. Когда вам нужно оценить уровень своей готовности к экзамену, нет ничего лучше хорошего пробного теста — посмотрите, можете ли вы его пройти с результатом в 70% или выше. Когда мы сами готовились к экзаменам, нашим ориентиром был показатель в 80% . В оставшиеся 20% входят вопросы, на которые почти невозможно ответить правильно и которые иногда встречаются на экзаменах Microsoft . Оценка вашей готовности к экзамену 7 0 - 0 2 9 В дополнение к обшей информации, которая изложена в предыдущей главе, для подготовки к экзамену «Разработка и внедрение баз данных при помощи SQL Server 7.0» можно сделать еще ряд вещей. Поместите себя в список почтовой рассылки MCSE (это можно сделать на странице www.soft belt soft ware.com , кнопка «Subscribe t o…» ). Это место, где можно задать вопросы и получить хорошие ответы или просто посмотреть, какие ответы на свои вопросы получают другие.

converted to PDF by BoJIoc

Вы можете также поискать в сети так называемые брэйндампы — «braindum ps» (сборники тем и вопросов, встречающихся на экзаменах, собранные самими экзаменующимися) — для того, чтобы посмотреть, с чем вы можете столкнуться на экзамене. Задать вопросы, где можно найти полезные брэйндампы, можно в почтовой рассылке MCSE (см. выше), а можно посмотреть ссылки на них на странице Шауна Гэмбла ( Shawn Gam ble) www.com m andcent ral.com (там же есть и несколько неплохих и бесплатных пробных тестов) или на Web-узле Герба Мартина под названием Braindum p Heav en ht t p: / / 209 .207.167.177 . Используя брэйндампы, обращайте внимание, главным образом, на тематику вопросов — совсем не обязательно, что ответ, который предлагает автор брэйндампа, правилен. Используйте вопросы в процессе подготовки, но не следует доверять приводимым там же ответам — иначе легко попасть впросак. Тщательно проверяйте всю информацию, которую вы нашли в брэйндампе. Microsoft также рекомендует использовать для подготовки к экзаменам базу знаний Microsoft — Microsoft Knowledge Base. База знаний частично рассылается в рамках рассылки TechNet , кроме того, к ней можно обратиться через страницу ht t p: / / support .m icrosoft .com / support для получения «имеющих существенное значение технических сведений в области поддержки программных продуктов», которые могут помочь вам для подготовки к экзаменам. Хотя мы не совсем уверены в значении приведенной цитаты, база знаний может оказаться полезной для подготовки по темам, связанным с технической поддержкой продуктов и диагностикой неисправностей. Еще одно замечание: возможно, вам покажется странным говорить о практическом опыте работы в отношении разработки и внедрения баз данных при помощи SQL Server 7 .0 . Но при подготовке вы убедитесь, что реальный опыт работы с системой имеет неоценимое значение. Возможно, к своему удивлению, вы обнаружите, что опыт практической работы с Windows NT Server также имеет большое значение — особенно в отношении работы с файлами и файловыми группами, использования интегрированной безопасности Windows NT и наблюдения за производительностью SQL Server. Пора в бой После того как вы оцените свою готовность, обновите ваши базовые знания, потренируетесь в реальной работе с системой и воспримете информацию из всех возможных руководств и источников, вы будете готовы пройти несколько пробных тестов. Если их результаты внушат вам оптимизм, пора отправляться на экзамен, предварительно заказав его через центр тестирования Sylvan Prom et ric или VUE. Удачи вам! ГЛАВА 1

Сертификационные экзамены M icr osoft Ключевые термины • • • • • •

Переключатели Флажки Сопровождающие иллюстрации Вопросы с разным количеством правильных ответов Внимательное чтение Процесс исключения неверных ответов

Необходимые знания и приемы • • • • • • •

Оценка вашей готовности к экзамену Подготовка к сертификационному экзамену Методы подготовки Знакомство с интерфейсом программы тестирования Распределение времени для ответа на вопросы Откладывание самых трудных вопросов Угадывание (на самый крайний случай)

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

converted to PDF by BoJIoc

Сдаете ли вы первый или десятый экзамен — знание обстоятельств сдачи экзамена ( сколько у вас будет времени, в какой обстановке проходит экзамен и прочего) , а также знакомство с тестирующим программным обеспечением позволит вам лучше сконцентрироваться на вопросах экзамена. Кроме того, освоение некоторых основных навыков сдачи экзамена позволит вам распознать — а возможно, и обойти — те ловушки, которые встретятся вам в некоторых вопросах. В этой главе мы расскажем, как проходят экзамены, об особенностях тестирующей программы и о некоторых проверенных на практике стратегиях успешной сдачи экзаменов. Оценка вашей готовности к экзамену Мы настоятельно рекомендуем перед сдачей любого экзамена Microsoft ознакомиться с тестом для самопроверки (помещенным в предыдущем разделе) . Это поможет вам сравнить уровень ваших знаний с требованиями, предъявляемыми к кандидатам на звание MCSE, и определить, в каких областях у вас имеются пробелы и как их лучше ликвидировать. При наличии хорошей базовой подготовки получение сертификации Microsoft обычно проходит гораздо проще. После прохождения теста для самопроверки вы сможете подтянуть те области, в которых ваши знания или опыт не позволяют вам соответствовать требованиям идеального кандидата на звание MCSE. Впрочем, вам ничего не мешает параллельно готовиться и сдавать сертификационные экзамены. После того как вы проработали эту книгу, прочитали дополнительные материалы и сдали пробный тест, помещенный в конце этой книги, у вас должно сложиться ясное представление о степени вашей готовности к экзамену. Мы настоятельно рекомендуем продолжать подготовку до тех пор, пока на пробных тестах вы не будете набирать по крайней мере более 70% . 75% — хороший ориентир, который позволит вам оставить небольшой зазор на случай, если на экзамене вы допустите больше ошибок (на это может повлиять, например, волнение). 75% — показатель, после которого можно сдавать настоящий экзамен. Но если вы попробовали сдать пробный экзамен, приведенный в конце книги, и ваш результат оказался хуже, то лучше продолжать готовиться и сдавать пробные экзамены. Более подробная информация о том, где найти другие пробные экзамены, приведена в предыдущем разделе. А теперь мы рассмотрим, как проходит сам экзамен. Как проходит тестирование Когда вы пришли сдавать заказанный экзамен, первым делом вам необходимо отметиться у администратора центра тестирования. Он или она может попросить вас показать два документа, удостоверяющие вашу личность, при этом один из документов должен быть с фотографией (лучше заранее узнать, какой документ устроит ваш центр). После того как вы распишетесь, вам придется сдать все принесенные с собой сумки, пакеты, книги и т. д. После этого вас пригласят в предназначенную для сдачи экзаменов комнату. Обычно в ней стоят от одного до шести компьютеров, расположенных таким образом, чтобы сдающий не смог заглядывать в компьютер к соседу. В ваше распоряжение будут предоставлены карандаш или ручка и листок бумаги, а может быть, специальный лист из пластика и фломастер. С их помощью вы сможете записывать все, что вам потребуется. Перед экзаменом вам нужно будет по крайней мере помнить весь материал, который приведен в «шпаргалке» в конце книги. Можно перед тем, как запустить тест, записать то, что удастся вспомнить, на выданном листке. Вы сможете обращаться к своим записям во время теста, но по его окончании их придется сдать. Большинство комнат для тестирования имеют стену с прозрачным окном. Через это окно координатор центра тестирования следит за тем, чтобы сдающие не могли общаться друг с другом, а также может принять меры в случае возникновения непредвиденной ситуации. Экзамен загружается на компьютер перед вашим приходом, и, сев за компьютер, вы можете его запустить. Для всех экзаменов Microsoft предусмотрена определенная продолжительность экзамена ( таймер высвечивается на экране тестирующей программы, и вы можете в любой момент посмотреть, сколько у вас осталось времени) . Экзамен 70-029 состоит из 70 случайно выбранных вопросов. На ответы на них отводится 90 минут (и еще 30 минут, если вы сдаете экзамен не на родном языке) . Все экзамены Microsoft генерируются компьютером, предлагающим на каждый вопрос несколько ответов. Сдача экзамена может показаться очень легкой, но вопросы подобраны таким образом, чтобы не только

converted to PDF by BoJIoc

проверить знание основных принципов разработки и внедрения баз данных при помощи SQL Serv er 7 , но и оценить, как вы будете ориентироваться в различных обстоятельствах. Часто можно будет выбрать более одного ответа. В других случаях вам будет предложено выбрать наиболее эффективное решение проблемы из нескольких решений, каждое из которых вполне работоспособно. Сдача экзамена похожа на приключение, и в ходе экзамена не раз потребуется продемонстрировать ваши способности к мышлению. В этой книге мы постараемся показать, что вам следует ожидать и как можно будет справиться со встретившимися проблемами и головоломками. Внешний вид тестов Некоторые экзаменационные вопросы потребуют от вас выбрать только один ответ, тогда как другие — несколько. В следующем вопросе от вас потребуется выбрать единственный правильный ответ. После вопроса идут краткое изложение каждого варианта ответа и пояснение, почему он правилен или ошибочен. Que stion 1 When is a t rigger fired? • • • • •

A. When t he t rigger fire st at em ent is executed. B. Before dat a m odificat ion. C. Before const raint validat ion. D. Aft er t he t ransact ion com plet es. E. Aft er const raint validat ion but before t he t ransact ion com m it s.

Вопрос 1 Когда срабатывает триггер? • • • • •

A. Когда выполняется команда на запуск триггера. B. До изменения данных. C. До проверки на соответствие ограничению. D. После завершения транзакции. E. После проверки на соответствие ограничению, но до завершения транзакции.

Правильный ответ — E. Триггер — это неотъемлемая часть транзакции, которая его запускает, и он должен иметь возможность обратиться как к предыдущим, так и к измененным значениям данных, чтобы выполнить свою работу. Этот формат вопроса в точности соответствует формату, который встречается на экзамене Microsoft . Единственное отличие — на экзамене вам не приведут после вопроса ответ на него. Чтобы выбрать ответ, поместите курсор мыши над переключателем, а потом щелкните мышью. Другой тип вопросов требует нескольких ответов. В этих вопросах вместо переключателей используются флажки, которыми помечаются все правильные ответы. Que stion 2 How long does a t rigger persist in dat abase? [ Check all correct answers] • • • • •

A. Unt il t he session is t erm inat ed. B. Unt il it is dropped. C. Unt il a new t rigger is creat ed wit hout t he append opt ion. D. Unt il anot her t rigger replaces it . E. None of t he above.

Вопрос 2 Как долго триггер хранится в базе данных? • • • • •

A. До прерывания сеанса. B. До того, как его удалят. C. До того, как будет создан новый триггер без использования параметра «Добавить». D. До замены его другим триггером. E. Ничего из перечисленного выше.

Правильные ответы — B, C и D. Триггеры являются постоянными, а не временными составными частями базы данных, поэтому ответ A неверен.

converted to PDF by BoJIoc

Отвечая на эти вопросы, необходимо выбирать несколько вариантов ответа. Авторы уверены (Microsoft этот момент не комментирует), что ответ на этот вопрос не будет засчитан, если вы не выберете все правильные варианты. Другими словами, частично правильный ответ не даст вам никаких баллов. Отвечая на вопрос 2 , вы должны установить флажки напротив всех вариантов ответа, за исключением A и D. Заметьте, что, выбирая правильные ответы, вы должны также знать, почему остальные ответы неправильны. Хотя эти два типа вопросов могут проявляться в самых разнообразных формах, они составляют основу всех экзаменов Microsoft . Некоторые вопросы включают в себя иллюстрации, на которых обычно изображены экраны SQL Server Ent erprise Manager. Для некоторых из таких вопросов вам придется выбирать переключатели или флажки на самой иллюстрации. Для других информацию, которую содержит в себе иллюстрация, нужно использовать для выбора вариантов в обычном порядке. Ключ к ответам на такие вопросы — знание изображенной утилиты. Некоторые вопросы используют графики или диаграммы, чтобы проиллюстрировать ситуацию, в которой вам надо будет проявить навыки диагностики или конфигурирования. Необходимо со всей внимательностью подходить к информации, содержащейся в иллюстрациях. Будьте готовы к тому, что придется часто переключаться между вопросом и иллюстрацией. Стратегия сдачи экзаменов с фиксированным числом вопросов Хорошо известная стратегия сдачи экзаменов фиксированной длины — вначале прочитать все вопросы теста, ответив только на те, в ответах на которые вы полностью уверены. Проходя тест повторно, вы можете основательнее заняться более сложными вопросами, имея представление о том, сколько их еще осталось. К счастью, программное обеспечение для сдачи экзаменов Microsoft облегчает использование такой стратегии. В верхнем левом углу экрана можно установить флажок, чтобы пометить вопрос для последующего возвращения к нему. Заметьте: если вы пометили вопрос, вам будет легче к нему вернуться, но также вы сможете вернуться и к любому другому вопросу, нажимая кнопки Forward ( Вперед) и Back (Назад) . Прочитав вопрос, ответьте на него, если ответ ясен, или пометьте, если вы в нем не уверены, для того, чтобы потом работать уже с уменьшившимся списком самых сложных вопросов. Совет Есть по крайней мере одна причина, почему вначале следует прочитать весь тест целиком: иногда информация, которая содержится в последующих вопросах, прольет свет на предыдущий. В других случаях ответы на последующие вопросы помогут вам вспомнить какие- либо факты, черты, особенности работы SQL Serv er, что позволит дать правильный ответ на предыдущие вопросы. В любом случае двигайтесь вперед, если вам попался какой-нибудь вопрос, на который вы не можете пока ответить. Вот несколько полезных советов для сдачи тестов фиксированной длины: • Когда вы вернетесь к вопросу во второй раз, прочитайте снова каждое слово этого вопроса. Иногда повторное чтение позволит вам обратить внимание на то, что вы пропустили в первый раз. Однако бывает и так, что вы остаетесь в плену своего первого впечатления от вопроса. Постарайтесь этого избегать. • Если вы читаете вопрос уже не в первый и не во второй раз, постарайтесь произнести про себя то, что вы не можете понять в вопросе, — почему ответы представляются вам лишенными смысла или что- то кажется пропущенным. Если вы будете «пережевывать» вопрос в течение некоторого времени, может быть, подсознание подскажет вам недостающие детали или вы заметите скрытую в тексте вопроса ловушку. Во время сдачи экзамена нелишне обращать внимание еще на один счетчик — на сколько вопросов вы ответили и сколько еще осталось. Постарайтесь отвечать таким образом, чтобы за четверть отведенного времени вы ответили не менее чем на четверть вопросов, за три четверти времени — на три четверти вопросов и т. д. Если время подходит к концу, а вы не успеваете ответить на все вопросы, постарайтесь потратить последние 5 минут на то, чтобы быстро пробежаться по оставшимся вопросам и постараться хотя бы угадать ответы на них. Обычно угадывать все- таки полезнее, чем оставлять вопросы без ответа, хотя бы потому, что последнее точно не даст вам никаких баллов, а в случае угадывания шансы ответить правильно все-таки есть. Если нет совсем никаких мыслей насчет ответа, выбирайте случайные варианты — вдруг чтонибудь да и угадаете.

converted to PDF by BoJIoc

Совет Лучше ответить наугад, чем оставлять экзаменационный вопрос без ответа. Стратегия сдачи адаптивных экзаменов Если формулировать только один принцип сдачи адаптивных экзаменов, он прозвучит так: «Сразу выбирайте правильный ответ». Вы не можете пропустить вопрос и вернуться к нему позднее, так как программа тестирования использует ваш ответ для выбора следующего вопроса. У вас есть только один шанс, чтобы ответить на вопрос. Если вы ответите на вопрос правильно, вам будет предложен более сложный вопрос — чтобы можно было точнее определить уровень ваших знаний. Если ответ на предыдущий вопрос был неправильным, вам будет предложен более легкий вопрос ( а уровень оценки ваших знаний снизится) . Экзамен будет продолжаться до тех пор, пока тестирующая программа не решит, что уровень ваших знаний определен с достаточной точностью. Обычно количество вопросов в течение адаптивного экзамена — от 25 до 35 . В адаптивном экзамене хорошо то, что, если вы знаете предмет, у вас есть шанс закончить экзамен минут за тридцать. С другой стороны, для того, чтобы сдать адаптивный экзамен, вы должны показать действительно хорошие знания. Вам обязательно попадутся настолько запутанные и тяжелые вопросы, что один-два неправильных ответа — вещь почти неизбежная. Так что чем лучше ваши знания и чем правильнее вы отвечаете на первые вопросы теста, тем более сложные вопросы ожидают вас дальше. Поскольку обычно о типе теста — адаптивный он или нет — вы сможете узнать, только начав его сдавать, есть смысл готовиться ко всем тестам как к адаптивным. Такой подход позволит вам быть готовым к любому типу экзамена. Но если окажется, что ваш тест — с фиксированным числом вопросов, воспользуйтесь советами, приведенными в предыдущем разделе. Если на адаптивном экзамене вам встретился какой- то вопрос, на который вы не знаете ответа, вам придется угадывать немедленно. При этом за правильную отгадку вам придется немедленно пострадать — следующий вопрос будет еще сложнее! Азбука сдачи экзамена Самый важный совет всем сдающим экзамены: читайте все вопросы очень внимательно! Некоторые вопросы намеренно формулируются двусмысленно, другие используют двойное отрицание, в третьих может использоваться необычная терминология. Авторы сдавали множество экзаменов — и пробных, и реальных — и всегда по меньшей мере один неправильный ответ был из-за невнимательного чтения. Несколько советов для борьбы с излишне быстрым чтением: • Убедитесь, что вы прочитали каждое слово в вопросе. Если вы заметили, что нетерпеливо прыгаете через какие- либо его части, лучше начать чтение сначала. • По прочтении попробуйте пересказать вопрос своими словами. Если вы сможете это сделать, вам будет проще выбрать правильный вариант. • Когда вы вернетесь к вопросу во второй раз, прочитайте снова каждое слово этого вопроса. Иногда повторное чтение вопроса позволяет вам обратить внимание на что-нибудь, что вы пропустили в первый раз, но нередко бывает и так, что вы остаетесь в плену своего первого впечатления от вопроса. Постарайтесь этого избегать. • Если вы читаете вопрос уже не в первый и не во второй раз, постарайтесь произнести про себя то, что вы не можете понять в вопросе, — почему ответы представляются вам лишенными смысла или что- то кажется пропущенным. Если вы будете «пережевывать» вопрос в течение некоторого времени, может быть, подсознание подскажет вам недостающие детали или вы заметите скрытую в тексте вопроса ловушку. Кроме того, постарайтесь оценить каждый вопрос через призму того, что вы знаете о разработке и внедрении баз данных с использованием SQL Serv er — характеристиках, особенностях работы, фактах, чертах. С помощью обзора всей известной вам информации, включая и ту, что вы записали на выданном листке перед началом экзамена, вы сможете лучше понять смысл вопроса и определить правильный ответ. Стратегия работы с вопросами Из опыта сданных нами экзаменов мы заметили интересную тенденцию. В вопросах, где нужно выбирать только один правильный ответ, обычно два или три варианта бывают очевидно неверны, два могут быть

converted to PDF by BoJIoc

правдоподобны и только один, разумеется, правилен. Даже если ответ явно напрашивается ( если это так, лучше перечитайте вопрос — скорее всего, здесь какая- то ловушка), следует начинать отвечать на вопрос с выяснения того, почему остальные варианты неверны. Явно неверные ответы можно определить по несуществующим пунктам меню и утилитам, отсутствующим параметрам настройки и терминам, которые вы видите в первый раз. Если вы действительно готовились к экзамену, то правильные варианты ответа не должны содержать незнакомых вам понятий. Незнакомая или странная терминология обычно указывает на то, что вариант неверен. Во многих вопросах подразумевается, что в такой-то программе действуют настройки по умолчанию. Если вы будете знать настройки по умолчанию и на что они влияют, это поможет разрубить вам множество гордиевых узлов. Готовьте себя к победе Знания приводят к уверенности, а уверенность — к успеху. Если вы тщательно изучили материал этой книги и проработали вопросы в конце каждой главы, вам должно быть ясно, где нужно приложить дополнительные усилия. Мы советуем вам использовать те источники, которые названы в разделе «Дополнительная информация» в конце каждой главы. Мы рассчитываем, что вы используете концепции и ситуации пробных вопросов для того, чтобы не растеряться, когда схожие ситуации встретятся во время реального экзамена. Если вы знаете материал, будьте уверены, что вам удастся сдать экзамен. После того как вы проработаете материал данной книги, попробуйте сдать пробный экзамен, помещенный в конце книги. Это обеспечит реальную проверку ваших знаний и поможет определить те области, где нужна дополнительная подготовка. Будьте уверены, что вы действительно проработали все темы, в которых в пробном тесте сделали ошибки, прежде чем заказывать реальный экзамен. Только после того, как вы начали чувствовать себя комфортно, сдавая пробные экзамены, есть смысл отправляться сдавать реальный тест. Совет Если на пробном экзамене вы набрали менее 75% правильных ответов, продолжайте подготовку. Обычно Microsoft предлагает бесплатные пробные тесты (PEP t ests) и экзамены для самооценки (self-assessm ent exam s) , которые можно загрузить с Web-узла Microsoft ( рис. 1 .1 ). Если вам нужны дополнительные возможности и вы можете потратить некоторую сумму денег, попробуйте приобрести пробные экзамены, предлагаемые разными фирмами. Вооружившись информацией из этой книги и будучи уверенными в уровне своих знаний, вы сможете сдать сертификационный экзамен. Однако вы должны действительно готовиться, в противном случае придется сдавать экзамен несколько раз. Если вы готовились серьезно, то сдадите экзамен. Удачи вам! Дополнительные ресурсы Лучший источник информации о сертификации Microsoft — это сама Microsoft . Поскольку изменения в ее продуктах и технологиях — и в соответствующих им экзаменах — происходят очень быстро, лучшее место для получения информации, относящейся к экзаменам, — это Интернет. Если вы еще не посещали Web-сайт Microsoft Cert ified Professional, есть смысл это сделать. Его адрес — www.m icrosoft .com / m cp (см. рис. 1.1) . Внимание: возможно, что когда вы попытаетесь открыть эту страницу, ее уже не будет или она будет выглядеть по-другому. Изменения на Web-узле Microsoft происходят очень часто. Если это произошло, то прочитайте раздел «Борьба с изменениями в Web» . Пункты меню в левой колонке ведут к наиболее важным источникам информации по сертификации. Куда есть смысл обратиться: • Программы сертификации ( Cert ificat ions) — используйте эти ссылки для того, чтобы ознакомиться с разнообразными программами сертификации, предлагаемыми Microsoft .

converted to PDF by BoJIoc

• Найти экзамен ( Find Exam ) — этот пункт меню запускает поиск, с помощью которого можно получить список всех экзаменов, относящихся к определенной программе сертификации ( MCPS, MCSE, MCT и т. д.) , или найти все экзамены по определенному продукту. Его же можно использовать, чтобы получить не только список экзаменов, но и информацию о подготовке к конкретному экзамену, так как каждому экзамену соответствуют свои авторизованные курсы.

Рис. 1.1. Начальная страница сайта Microsoft Cert ified Professional • Загрузка (Downloads) — используйте этот пункт меню для того, чтобы найти файлы и пробные экзамены, которые Microsoft предоставляет для общего пользования. Обычно в этом есть смысл. Особенно полезно бывает загрузить информацию об изменениях в сертификации, пробные тесты (PEP t est s), разного рода экзамены для самооценки и руководства для подготовки к экзаменам. Найдите время ознакомиться с этими материалами перед первым экзаменом. Следует просмотреть и другие ссылки на странице сертификации Microsoft — многие из них будут для вас, безусловно, полезны. Борьба с изменениями в W eb Рано или поздно все ссылки, о которых мы говорим в этом разделе или в других частях книги, устареют или будут заменены новыми. В некоторых случаях вы сможете найти более свежую информацию по старому адресу, в других случаях вы получите только сообщение об ошибке 404 «File not found» . Если такое произойдет, не сдавайтесь. Всегда есть возможность найти в Интернете то, что вам нужно, затратив на это некоторое время и силы. Большинство крупных или сложных Web-сайтов — а сайт Microsoft , безусловно, попадает в обе категории — предлагают средства поиска. Если мы посмотрим на рис. 1 .1 , то заметим кнопку Search (Поиск) в верхней части экрана. Пока вы находитесь на Web- сайте Microsoft (в адресе будет присутствовать www.m icrosoft .com ), вы всегда сможете использовать эту опцию. Чем тщательнее вы подойдете к составлению условий поиска, тем больше вероятность, что вы найдете нужную информацию. Например, если вы пустите поиск на строчку «t raining and cert ificat ion», вам вернется масса ссылок на страницы с общей информацией по этому предмету, но если вы ищете руководство по

converted to PDF by BoJIoc

подготовке к экзамену 70-029 « Разработка и внедрение баз данных при помощи Microsoft SQL Server», лучше будет набрать в строке поиска следующую строчку: "Ex am 70 -029" AND "preparat ion guide" Если вы ищете, что можно загрузить на свой компьютер по обучению и сертификации, введите в строке поиска "t raining and cert ificat ion" AND " download page" Наконец, можно использовать и общие поисковые серверы — такие как www.search.com , www.alt av ista.com и w ww.excite.com — для того, чтобы найти требуемую информацию. Хотя Microsoft — наилучший источник информации по сертификационным экзаменам Microsoft , существует также множество других источников, информирующих об экзаменах, обучении и помощи в этой области и необязательно следующих линии Microsoft . В общем надо запомнить: если вы не нашли что-либо, на что ссылается эта книга, попробуйте найти это с помощью специальных инструментов. ГЛАВА 2

Модели данных Ключевые термины • • • • • • • • • • • • •

Реляционная база данных Сущность Атрибут Отношение Первичный ключ Внешний ключ Ссылочная целостность Целостность данных Запреты неопределенностей, дубликатов и изменений Нормализация Деловые правила Типы отношений Обязательность

Необходимые знания и приемы • Преобразование логической модели в физическую • Чтение физической модели • Поэтапное моделирование • Нормализация базы данных • Денормализация базы данных • Оптимизация быстродействия, удобства поддержки, возможности расширения, доступности и защищенности Общие сведения Термин « реляционный» означает «основанный на отношениях». Реляционная база данных состоит из сущностей (« таблиц») , находящихся в некотором отношении друг с другом; записей («строк»), то есть экземпляров данных; и атрибутов ( «столбцов» ) данных. Существуют разные способы проектирования баз данных. Для вас важно запомнить, какой подход к проектированию баз данных является правильным с точки зрения Microsoft . Проектирование базы данных состоит из двух основных фаз: логического и физического моделирования. Во время фазы логического моделирования конструктор собирает требования и разрабатывает модель, не зависящую от конкретной СУБД (системы управления базами данных). СУБД позволяет хранить информацию в виде сущностей, выполнять математические операции пересечения и объединения сущностей. Во время фазы логического моделирования выполняется нормализация.

converted to PDF by BoJIoc

Во время фазы физического моделирования конструктор создает модель, оптимизированную для конкретного приложения и СУБД; именно эта модель реализуется на практике. Если вам известна трехфазовая методология проектирования, учтите, что Microsoft выделяет только логическую и физическую модели. Концептуальная фаза объединяется с фазой логического моделирования. Процесс проектирования базы данных состоит из следующих этапов: • • • • • • • •

сбор информации; идентификация объектов; моделирование объектов; идентификация типов информации для каждого объекта; идентификация отношений; нормализация; преобразование к физической модели; создание базы данных.

Этапы 1–6 образуют фазу логического моделирования. Этап 7 представляет собой фазу физического моделирования. Практически вся книга посвящена последнему этапу — фазе реализации. Базы данных с обработкой транзакций Базы данных делятся на два основных типа: базы с оперативной обработкой транзакций ( OLTP, Online Transact ion Processing — самый распространенный тип базы данных) и системы поддержки принятия решений (DSS, Decision Support Syst em s) . Базы данных OLTP постоянно обрабатывают транзакции. Для них характерно большое количество пользователей и множество четко определенных транзакций, выполняющих чтение/ запись данных. Базы данных с принятием решений Базы данных с принятием решений, также называемые системами с принятием решений DSS, являются вторым базовым типом баз данных. В них данные анализируются после выполнения периодической обработки. В частности, одной из специфических разновидностей DSS являются хранилища данных (data warehouse) . Обычно в них малочисленные пользователи запускают малое количество запросов для особых случаев ( ad hoc queries) , выполняющихся в течение продолжительного времени. База данных DSS может представлять собой копию базы OLTP; кроме того, несколько баз OLTP могут объединяться в одну базу DSS. DSS также называются отчетными базами данных. Логическая фаза Фаза логического проектирования базы данных состоит из пяти основных этапов: сбор требований, идентификация сущностей, моделирование сущностей, идентификация типов данных ( атрибутов) каждой сущности и идентификация отношений. Сбор требований На первом этапе проектирования базы данных необходимо точно определить, как будет использоваться база данных и какие данные в ней будут храниться. Если новая система замещает уже существующую, то большую часть необходимой информации можно получить из старой системы. Переговорите со всеми, кто имеет какое-либо отношение к существующей системе, определите их функции и место в работе системы, а также те данные, которые им необходимо хранить в базе. Кроме того, необходимо понять, что изменилось по сравнению с существующей системой, идентифицировать все потенциальные проблемы, ограничения и препятствия. Соберите как можно больше информации о том, что система должна и не должна делать. Как правило, достаточно следовать какой-либо стандартной методике по сбору требований. Моделирование объектов После того как идентификация объектов будет завершена, необходимо сохранить информацию о них. Для этого лучше всего воспользоваться визуальной моделью. В этой модели также должны учитываться все

converted to PDF by BoJIoc

основные данные, собранные на предыдущем этапе. Модель может использоваться в качестве образца на этапе реализации базы. В вашем распоряжении сотни средств моделирования — от карандаша с бумагой, редакторов и электронных таблиц до специализированных программ для моделирования данных при проектировании баз. Такие модели называются моделями отношения сущностей ( сокращенно — диаграммы E/ R) . Для построения диаграмм E/ R существуют различные наборы условных обозначений. Конкретная методология и условные обозначения зависят от выбранного вами инструмента. SQL Serv er Ent erprise Manager содержит средства визуального проектирования, которые могут использоваться для конструирования и создания объектов базы, однако они предназначены главным образом для фазы физического моделирования. Для логического моделирования желательно поискать другой инструмент. Сущности Сущность является субъектом или объектом действия и может быть связана с другими сущностями. Сущности состоят из записей (экземпляров данных, обычно представляемых в виде строк таблицы) и атрибутов (полей, или столбцов записи). Сущность может представлять нечто вещественное ( человек, место, животное и т. д.) или абстрактное (банковскую транзакцию, отдел фирмы, период обращения капитала и т. д.) . Большинство баз данных состоит из нескольких основных сущностей, связанных с большим количеством подчиненных сущностей. Основные сущности именуются независимыми. Подчиненные сущности называются зависимыми; для того, чтобы они существовали, должна существовать связанная с ними основная таблица. В модели E/ R сущности обычно представляются в виде прямоугольников; имя сущности указывается за границей прямоугольника. Во многих средствах моделирования зависимые и независимые сущности имеют различную форму. На рис. 2 .1 показан типичный вид сущности на диаграмме E/ R. Атрибуты Атрибут представляет свойство, описывающее сущность или отношение. Атрибуты часто являются числовой величиной, датой или описанием. Все данные, хранящиеся в атрибуте, должны иметь одинаковый тип и обладать одинаковыми свойствами. После идентификации основных сущностей следует перейти к идентификации атрибутов (данных, которые должны храниться для каждой сущности) . В фазе логического моделирования отношения также могут обладать атрибутами. На диаграммах атрибуты обычно перечисляются внутри прямоугольника сущности. Во многих программах моделирования для отслеживания атрибутов отношений отношения преобразовываются в сущности. На рис. 2.2 изображена сущность с несколькими атрибутами.

Рис. 2.1. Независимая сущность

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

converted to PDF by BoJIoc

Правило обязательности для заполнения определяет, является ли атрибут обязательной частью сущности. Если атрибут является обязательным, он не может принимать неопределенные значения. Этот принцип также называется «запретом неопределенности» (no nulls). Вы должны определить, является ли атрибут изменяемым. Значения некоторых атрибутов не могут изменяться после создания записи. Наконец, для каждого атрибута необходимо определить, является ли он уникальным. Если атрибут не является уникальным, он может допускать строго определенное или неограниченное число дубликатов. Значения уникального атрибута не повторяются. Сущности и данные При выполнении чтения SQL Server возвращает данные и заголовок. Заголовок определяет имя каждого атрибута. Сущность «Издатель» из табл. 2.1 состоит из пяти атрибутов и трех записей ( строк) . Ключи Ключом ( key ) называется набор атрибутов, однозначно определяющий запись. Существуют пять типов ключей: возможные ключи ( candidate k ey s) , первичные ключи (prim ary key s) , альтернативные ключи (alt ernate keys), общие ключи ( com m on keys) и внешние ключи (foreign keys) . Ключи также делятся на два класса: простые (singlet on) и составные ( com posit e) . Таблица 2.1. Таблица «Издатель» с данными Город

Штат Страна

0736 New Moon Books

Бостон

MA

США

0877 Binnet & Hardley

Вашингтон DC

США

Код

Название

1389 Algodat a I nfosyst em s Беркли

CA

США

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

converted to PDF by BoJIoc

Общим ключом называется любой атрибут, используемый для объединения двух таблиц. Как правило, общие ключи являются внешними. Если в таблице имеются общие ключи, которые не являются внешними, вероятно, база данных не была нормализована.

Рис. 2.3. Ключевые атрибуты Внешние ключи Внешним ключом называется совокупность атрибутов, ссылающихся на первичный или альтернативный ключ другой сущности. Если внешний ключ не связан с первичной сущностью, может содержать только неопределенные значения. Если при этом ключ является составным, то все атрибуты внешнего ключа должны быть неопределенными. На диаграммах атрибуты, объединяемые во внешние ключи, обозначаются специальными символами; также часто используется префикс FK. На рис. 2 .4 изображены две связанные сущности и образованные ими внешние ключи. На рис. 2 .4 Сущность 1 имеет составной ключ, состоящий из Ключевого атрибута 1 и Ключевого атрибута 2 . Сущность 2 объединяется с Сущностью 1 внешним ключом. Таким образом, внешний ключ указывает, что ключевые столбцы Сущности 1 являются частью Сущности 2 . Ключи являются логическими конструкциями, а не физическими объектами. В реляционных базах данных предусмотрены механизмы, обеспечивающие сохранение ключей (например, ограничения целостности данных). Отношения Реляционные базы данных позволяют объединять информацию, принадлежащую разным сущностям базы данных. Отношения определяются в процессе проектирования базы; для этого следует проанализировать разные таблицы, выявить логические связи, существующие между ними, и создать атрибуты для объединения таблиц. Если две сущности не связаны по возможным ключам одной из сущностей, база данных не является нормализованной. Отношение может объединять две и более сущностей.

Рис. 2.4. Внешние ключи Как правило, отношение соответствует некоторому взаимодействию между сущностями и описывает связь, возникающую между ними. Во время логического проектирования отношение может обладать собственными атрибутами. Для каждого отношения определяются три основных характеристики: имя, тип отношений и обязательность. Отношение отслеживается в обоих направлениях, хотя большинство программ моделирования выводят имя только для одного направления. Иначе говоря, если сущность А находится в некотором отношении с сущностью Б, также возникает обратное отношение, направленное от Б к А. Пример показан на рис. 2.5. Тип отношений ( cardinalit y ) отношения определяет количество записей сущности, связанных с записью другой сущности. Отношения делятся на три основных типа в зависимости от мощности: • Один к одному. Каждой записи первой сущности соответствует только одна запись второй сущности, а каждой записи второй сущности — только одна запись первой сущности. Пример — автор, у которого в

converted to PDF by BoJIoc

данный момент имеется лишь одна незавершенная книга. Отношения « один к одному» часто изображаются на диаграммах в виде простой линии между сущностями. • Один ко многим. Каждой записи первой сущности могут соответствовать несколько записей второй сущности, однако каждой записи второй сущности соответствует только одна запись первой сущности. Пример — издательство, выпустившее несколько книг. Отношения «один ко многим» часто изображаются на диаграммах в виде линии, разветвляющейся на одном из концов. • Многие ко многим. Каждой записи первой сущности могут соответствовать несколько записей второй сущности, а каждой записи второй сущности соответствют несколько записей первой сущности. Пример — один автор может написать несколько книг, а у одной книги может быть несколько авторов. Отношения «многие ко многим» изображаются на диаграммах в виде линии, разветвляющейся на обоих концах. В некоторых отношениях количество «многих» записей известно точно, однако все они интерпретируются одинаково. По критерию обязательности сущности, входящие в отношения, делятся на обязательные (m andat ory) и необязательные (opt ional) .

Рис. 2 .5 . Именованное отношение • Обязательная сущность означает, что для каждой записи первой сущности непременно должны присутствовать связанные записи во второй сущности. Обязательные отношения обычно представляются дополнительной одиночной линией на обязательной стороне. • Необязательное отношение означает, что связанная сущность может и не существовать. Такие отношения иногда называются независимыми. Необязательная сторона часто помечается незакрашенным кружком. Обязательность идентифицируется для каждой сущности, участвующей в отношении. Все сущности, участвующие в отношении, могут обладать как одинаковой, так и разной обязательностью. Другими словами, одна сущность отношения может быть обязательной, а другая — необязательной. Часто встречаются два особых типа отношений: • Зависимость представляет собой обязательное отношение, в котором атрибуты ключа первой сущности являются частью первичного ключа второй сущности. Такое отношение также называется отношением «родитель/ потомок» . • В рекурсивном отношении сущность связывается сама с собой. Рекурсивное отношение не может быть обязательным; цепочка должна где-то прерываться. Пример рекурсивного отношения изображен на рис. 2.6. Большинство программ моделирования позволяют устанавливать непосредственные отношения лишь между двумя сущностями. Если вам потребуется установить отношения с большим количеством сущностей, приходится использовать ассоциативную сущность. Так называется сущность, первичный ключ которой состоит из ключевых атрибутов двух и более сущностей. На рис. 2.7 изображено трехстороннее отношение с применением ассоциативной сущности.

Рис. 2.6. Рекурсивное отношение

converted to PDF by BoJIoc

Рис. 2 .7 . Ассоциативная сущность Нормализация Нормализацией называется процесс удаления избыточных данных. Каждый элемент данных должен храниться в базе в одном и только одном экземпляре. Существует пять распространенных форм нормализации, основанных на математической теории отношений. Возможно, вам приходилось слышать и о других формах нормализации, но они имеют чисто теоретическое значение. Как правило, база данных приводится к третьей нормальной форме. Различные формы нормализации таковы: • • • • •

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

Большинство баз данных нормализуются в третьей нормальной форме. В процессе нормализации выполняются определенные действия по удалению избыточных данных. Нормализованная сущность содержит набор атрибутов, каждый из которых связан с первичным ключом сущности. Обычно это приводит к увеличению числа сущностей, обладающих меньшим количеством атрибутов. Нормализация повышает быстродействие, ускоряет сортировку и построение индекса, увеличивает степень группировки индекса, делает индекс более узким и компактным, уменьшает количество индексов на сущность, ускоряет операции вставки и обновления и уменьшает число неопределенных атрибутов. Нормализованная база данных обычно отличается большей гибкостью. При модификации запросов или сохраняемых данных в нормализованную базу обычно приходится вносить меньше изменений, а внесение изменений имеет меньше последствий. Например, если в базе данных присутствуют повторяющиеся группы и вам потребуется включить новый экземпляр группы в ненормализованную базу, придется изменять сущность и запросы для работы с ней. Если база данных была нормализована, изменения вносятся без модификации базы данных или запросов. Первая нормальная форма Чтобы преобразовать сущность в первую нормальную форму, следует исключить повторяющиеся группы и добиться того, чтобы каждый атрибут содержал только одно значение. Другими словами, каждый атрибут должен храниться в сущности лишь в одном экземпляре. Сущность «Дом» на рис. 2.8 не нормализована. В частности, она не соответствует первой нормальной форме, поскольку в ней присутствуют повторяющиеся атрибуты для хранения данных о владельце. Чтобы атрибуты Владелец 1–Владелец N на рис. 2.8 не повторялись, следует создать отдельную сущность для каждого набора атрибутов; в результате у вас появятся две сущности. На рис. 2 .9 показана сущность «Дом» после преобразования в первую нормальную форму. Вторая нормальная форма Во второй нормальной форме из сущности исключаются избыточные данные. Правило также требует, чтобы каждая сущность обладала уникальным идентификатором, то есть первичным ключом. Избыточными считаются атрибуты, не зависящие от первичного ключа. Если ключ является составным, атрибут должен

converted to PDF by BoJIoc

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

Рис. 2.8. Ненормализованная сущность

Рис. 2.9. Первая нормальная форма Продолжим предыдущий пример. В модели, изображенной на рис. 2 .9 , атрибут «Цена чая» не имеет ничего общего с домовладельцем. Кроме того, атрибут « Мэр» не зависит от всего первичного ключа. Следовательно, сущность «Дом» не соответствует требованиям второй нормальной формы. Чтобы исправить модель данных, мы удаляем атрибут «Цена чая» (эта информация в дальнейшем не отслеживается) и переносим атрибут «Мэр» в отдельную сущность. На рис. 2 .10 та же база данных изображена во второй нормальной форме. Третья нормальная форма В третьей нормальной форме исключаются атрибуты, не зависящие от всего ключа. Любая сущность, находящаяся в третьей нормальной форме, заведомо находится во второй нормальной форме. Это самая распространенная форма баз данных. Для запоминания можно воспользоваться формулой: каждый атрибут зависит от ключа, от всего ключа и ни от чего, кроме ключа. Любая сущность, находящаяся во второй нормальной форме и не имеющая составного первичного ключа, автоматически находится в третьей нормальной форме. Пример: хотя у каждого человека имеется определенный знак зодиака, этот знак зависит от даты рождения и потому не должен находиться в той же сущности, что и остальные данные об этом человеке. На рис. 2.11 изображена база данных «Дом» в третьей нормальной форме.

Рис. 2.10 . Вторая нормальная форма

converted to PDF by BoJIoc

Рис. 2.11 . Третья нормальная форма НФБК Между третьей и четвертой формами существует еще одна разновидность — нормальная форма Бойса— Кодда (НФБК). В соответствии с ее требованиями при наличии нескольких возможных ключей для каждого из них создается отдельная сущность. Чтобы сущность соответствовала НФБК, она должна находиться в третьей нормальной форме. Любая сущность с единственным возможным ключом, соответствующая требованиям третьей нормальной формы, автоматически находится в НФБК. Четвертая нормальная форма В четвертой нормальной форме изолируются многозначные зависимости. Многозначная зависимость возникает в случае, когда два полностью независимых атрибута объединяются третьим атрибутом ( обычно ключевым) . Чтобы сущность соответствовала четвертой нормальной форме, она должна заведомо соответствовать третьей нормальной форме или НФБК.

Рис. 2.12 . Сущность «Фильм» Сущность на рис. 2.12 находится в нормальной форме Бойса—Кодда, а все ее атрибуты являются ключевыми. Однако она не соответствует четвертой нормальной форме, поскольку каждый из атрибутов «Режиссер» и «Актер» зависит от атрибута «Название», но между этими атрибутами не существует отношения. У фильма может быть много режиссеров и актеров, не зависящих друг от друга. Режиссер может снимать несколько картин, а актер может сниматься в нескольких фильмах. Чтобы сущность «Фильм» соответствовала четвертой нормальной форме, ее необходимо разделить на две сущности ( рис. 2.13). Пятая нормальная форма В пятой нормальной форме изолируются семантически взаимосвязанные множественные отношения. В основном рассматриваются отношения с участием трех и более сторон. Пятая нормальная форма обеспечивает построение правильных данных в трехсторонних отношениях. Чтобы сущность соответствовала пятой нормальной форме, она должна заведомо соответствовать четвертой нормальной форме.

Рис. 2 .13. Нормализация сущностей «Фильм»

converted to PDF by BoJIoc

Целостность данных Правильность данных в реляционных базах обеспечивается набором правил. Правила целостности данных делятся на четыре категории: • Целостность сущностей. Каждая запись сущности должна обладать уникальным идентификатором и содержать данные. • Целостность доменов. Каждый атрибут принимает лишь допустимые значения. • Ссылочная целостность. Набор правил, обеспечивающих логическую согласованность первичных и внешних ключей при вставке, обновлении и удалении записей. Ссылочная целостность является качеством реляционной базы данных, при котором для каждого внешнего ключа существует соответствующий первичный ключ. Она должна обеспечиваться при выполнении действий, приводящих к изменению записей. Вы должны оценить каждую операцию и определить, не приведет ли она к удалению/ модификации первичных ключей, для которых существуют внешние ключи (а также созданию/ модификации внешних ключей для несуществующих первичных ключей). • Пользовательские правила целостности. Любые правила целостности, не относящиеся ни к одной из перечисленных выше категорий. Деловые правила Деловые правила определяют ограничения, накладываемые на данные в соответствии с деловой областью. Им подчиняются более сложные и специфические правила, относящиеся к вашей организации. Деловые правила могут включать правила целостности данных. В отличие от других правил, их главная цель — обеспечить правильное ведение деловых операций. Физическая модель Следующим после создания логической модели шагом является построение физической модели. Эта модель соответствует практической реализации базы данных и определяет те физические объекты, которые вам предстоит реализовать. Преобразование логической модели в физическую При переходе от логической модели к физической сущности преобразуются в таблицы, а атрибуты — в поля (столбцы). Отношения между сущностями можно преобразовать в таблицы или оставить в виде внешних ключей. В процессе проектирования физической базы данных необходимо соблюдать ряд общих правил: • • • •

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

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

converted to PDF by BoJIoc

По возможности следует избегать использования триггеров для соблюдения ссылочной целостности или пользовательских правил целостности. Тем не менее, триггеры обладают большей универсальностью, чем ограничения. Денормализация Чрезмерная нормализация базы данных может привести к тому, что при каждом извлечении данных придется обращаться к нескольким таблицам. Обычно в запросе должны участвовать четыре таблицы или менее. Если вы используете более четырех сущностей, вероятно, ваша база данных излишне нормализована. В большинстве баз данных следует ограничиваться третьей нормальной формой. Дальнейшая нормализация обычно приводит к тому, что вам придется денормализовать базу. Денормализацией называется процесс включения в базу избыточных данных. Стандартными приемами денормализации являются: объединение нескольких таблиц в одну, сохранение одинаковых атрибутов в нескольких таблицах, а также хранение в таблице сводных или вычисляемых данных. Таблица 2.2. Обеспечение целостности Тип целостности

Рекомендуемые варианты

Другие варианты

Сущности

Первичный ключ, уникальный ключ, счетчик

Уникальные индексы

Домены

Внешний ключ, ограничение, значение по умолчанию, запрет или разрешение использования значений типа NULL

Типы данных, значения по умолчанию, правила

Ссылки

Внешний ключ, ограничение

Триггеры

Все

Ограничения, триггеры, хранимые процедуры

Пользовательские правила Быстродействие

При создании физической базы данных необходимо принять во внимание ее быстродействие. Физическая база данных должна использовать особенности SQL Server. Все операции приложения базы данных должны выполняться в определенный интервал времени, однако некоторые самые важные функции должны работать быстрее. Позаботьтесь о том, чтобы структура базы обеспечивала повышенное быстродействие таких функций. Большие таблицы и сложные функции часто отрицательно влияют на быстродействие баз. При конструировании таблиц, используемых в этих условиях, необходимо проявлять особенную осторожность. Вы должны быть абсолютно уверены в правильности выбора индексов и структуры таблицы. Другая проблема, которую также следует рассмотреть, — что произойдет с вашей базой при увеличении числа пользователей. Иногда база данных хорошо работает для нескольких пользователей, но по мере добавления новых пользователей ее быстродействие резко падает. Установка дополнительных или более быстрых аппаратных компонентов на сервере обычно приводит к повышению быстродействия. Если установить дополнительную память, SQL Server сможет кэшировать больше данных. Чем больше у вас жестких дисков и чем быстрее они работают, тем лучше SQL Server будет распределять операции ввода/ вывода при параллельном выполнении нескольких задач. Наличие нескольких процессоров позволит SQL Server организовать параллельную обработку пользовательских запросов. Старайтесь создавать индексы, соответствующие запросам. Если в обращениях к таблице используется множество разных полей, подумайте о создании нескольких индексов для ускорения доступа. Но не забывайте о том, что слишком большое количество индексов замедляет операции вставки и удаления. Удобство сопровождения

converted to PDF by BoJIoc

SQL Serv er требует выполнения некоторых вспомогательных задач (таких как проверка целостности или архивация базы данных). Все эти задачи следует учитывать на стадии проектирования физической базы данных. Позаботьтесь о том, чтобы объем вспомогательных операций и их влияние на пользователей были минимальными. Уменьшение размера базы данных приводит к ускорению многих вспомогательных операций. Нормализация базы данных приводит к уменьшению ее размера. В результате ускоряются операции архивации и восстановления. Реализуйте структуру, которая сводит к минимуму количество записей в активных таблицах. Для этого можно разделить таблицу или заносить старые данные в архив. Тем самым вы ускорите процесс создания индекса. Безопасность При реализации базы данных также необходимо выработать план защиты. Определите, кому из пользователей разрешено работать с той или иной таблицей. Графическая утилита SQL Se rve r En te rprise Man age r SQL Serv er Ent erprise Manager содержит утилиту диаграммного моделирования, которая может использоваться при сопровождении баз данных SQL Server. Вы работаете с базой данных, к которой подключены в настоящий момент и которой принадлежат настраиваемые объекты. Утилита выполняет большинство стандартных функций реализации баз данных. Она позволяет просматривать таблицы и отношения между ними, вносить изменения и анализировать новую диаграмму без изменения базы. Нежелательные изменения можно попросту отменить. Если же изменения вас устраивают, можно сохранить диаграмму, чтобы они немедленно вступили в силу, или построить сценарий для последующего выполнения. Примеры экзаменационных вопросов Que stion 1 Which of t he following st at em ent s are t rue about norm alizat ion? [ Check all correct answers] • • • • •

A. Norm alizat ion is used t o reduce t he num ber of t ables in a dat abase. B. Norm alizat ion can rem ove redundant dat a from the dat abase. C. Norm alizat ion can be used t o speed up m aint enance t asks. D. Norm alizat ion sim plifies select statem ents. E. Most dat abases are in fift h norm al form .

Вопрос 1 Что из нижеперечисленного является методом обеспечения целостности? [ Выберите все правильные ответы] • • • • •

A. Нормализация используется для сокращения числа таблиц в базе данных. B. Нормализация может привести к удалению избыточных данных из базы. C. Нормализация может использоваться для ускорения вспомогательных операций. D. Нормализация упрощает команды выбора. E. Большинство баз данных находится в пятой нормальной форме.

Правильные ответы — B и C. Нормализация используется для удаления избыточных данных, а уменьшение таблиц ускоряет вспомогательные операции. Как правило, процесс нормализации увеличивает количество таблиц, поэтому ответ A неверен. При большем количестве таблиц команды выбора требуют большего числа объединений и потому усложняются; ответ D неверен. Ответ E также неверен — большинство баз данных находится в третьей нормальной форме. Que stion 2 Which of t he following are int egrity t ypes? [ Check all correct answers] • A. Dom ain integrit y. • B. At t ribut e int egrit y.

converted to PDF by BoJIoc

• C. Ent it y integrit y. • D. Referent ial int egrity . • E. Table int egrit y . Вопрос 2 Какие из следующих утверждений о нормализации верны? [ Выберите все правильные ответы] • • • • •

A. Целостность доменов. B. Целостность атрибутов. C. Целостность сущностей. D. Ссылочная целостность. E. Целостность таблиц.

Правильные ответы — A, C и D. В них указаны правильные типы целостности. Ответы B и Е не относятся к типам целостности. Que stion 3 Ent ity int egrit y should be enforced using which of t he following? [ Check all correct answers] • • • • •

A. Prim ary key s. B. Foreign keys. C. Unique indexes. D. Unique const raint s. E. I dent it y.

Вопрос 3 Что из перечисленного ниже используется для обеспечения целостности сущностей? [ Выберите все правильные ответы] • • • • •

A. Первичные ключи. B. Внешние ключи. C. Уникальные индексы. D. Ограничения уникальности. E. Счетчики.

Правильные ответы — A, D и E. Ответ C неверен; хотя уникальные индексы могут обеспечивать целостность сущностей, Microsoft не рекомендует использовать этот вариант. Ответ B также неверен, поскольку внешние ключи используются для обеспечения целостности ссылок, а не сущностей. Que stion 4 What should be done t o convert t he ent it y US Tax Payer int o first norm al form ? US Tax Payer contains t he following at t ributes: Social Securit y Num ber, First Nam e, Last Nam e, St reet Address, City , St at e, Phone Num ber 1, Phone Num ber 2, Phone Num ber 3 , Phone Num ber 4 . • • • • •

A. Com bine t he phone num bers int o one field. B. Mak e an ent it y t o cont ain the phone num bers. C. Move Cit y and St ate t o anot her ent ity . D. All of t he above. E. None of t he above.

Вопрос 4 Что следует сделать для преобразования сущности «Налогоплательщик» в первую нормальную форму? Сущность «Налогоплательщик» содержит следующие атрибуты: Номер социального страхования, Имя, Фамилия, Адрес, Город, Штат, Телефон 1 , Телефон 2 , Телефон 3, Телефон 4. • • • • •

A. Объединить телефоны в одно поле. B. Создать сущность для хранения телефонов. C. Переместить Город и Штат в другую сущность. D. Все перечисленное выше. E. Ничего из перечисленного выше.

Правильный ответ — B; сущность в первой нормальной форме не должна содержать повторяющихся групп. Ответ A неверен. Он позволяет избавиться от повторяющихся групп, однако новый атрибут будет содержать более одного элемента данных. Ответ C неверен, поскольку даже после перемещения атрибутов Город и Штат сущность «Налогоплательщик» все равно будет содержать повторяющиеся группы.

converted to PDF by BoJIoc

Que stion 5 For t he ent it y US Tax Pay er, what at t ributes should be used as t he prim ary key at t ributes for it t o be in t hird norm al form ? Aft er norm alizing US Tax Payer int o first norm al form , it cont ains t he following at t ribut es: Social Securit y Num ber, First Nam e, Last Nam e, St reet Address, City , St at e. • • • • •

A. Social Securit y Num ber, Last Nam e. B. First Nam e, Last Nam e. C. First Nam e, Last Nam e, Cit y . D. First Nam e, Last Nam e, St reet Address, Cit y, St at e. E. None of t he above.

Вопрос 5 Какие атрибуты следует включить в первичный ключ сущности «Налогоплательщик» , чтобы она находилась в третьей нормальной форме? После преобразования сущности «Налогоплательщик» в первую нормальную форму она содержит следующие атрибуты: Номер социального страхования, Имя, Фамилия, Адрес, Город, Штат. • • • • •

A. Номер социального страхования, Фамилия. B. Имя, Фамилия. C. Имя, Фамилия, Город. D. Имя, Фамилия, Адрес, Город, Штат. E. Ничего из перечисленного выше.

Правильный ответ — E. У сущности, находящейся в третьей нормальной форме, все атрибуты зависят от полного набора атрибутов первичного ключа. Для данной сущности первичным ключом является атрибут «Номер социального страхования». Ответ A неверен; запись таблицы определяется номером социального страхования, и фамилия не участвует в идентификации записей. Ответы B, C и D неверны, поскольку данные таблицы не зависят от перечисленных атрибутов. ГЛАВА 3

Системные базы данных, таблицы и хранимые процедуры Ключевые термины • • • • • • • • •

Метаданные Словарь данных Системная база данных Системная таблица База данных m ast er База данных t em pdb База данных m odel База данных m sdb Системная хранимая процедура

Необходимые знания и приемы • Анализ системных таблиц и баз данных При использовании SQL Server возникает задача сохранения информации о том, как хранятся данные в базе. Информация о хранении данных называется метаданными. Метаданные хранятся в словаре данных (набор системных таблиц) , заполняемом командами CREATE и ALTER. Словарь данных, как и любые другие данные SQL Serv er, делится на таблицы. Например, при создании таблицы вы добавляете новую запись в таблицу sysobj ect s. В этой таблице присутствуют записи для каждого объекта базы данных. Кроме того, новая запись появляется и в таблице sysindexes, которая содержит запись для каждого индекса. А также несколько новых записей появляются в таблице syscolum ns (по одной для каждого столбца данных) . Помимо системных таблиц, многие из которых присутствуют во всех базах, существует несколько системных баз данных, содержащих информацию о конкретной системе и используемых при выполнении таких задач, как репликация. В SQL Server существуют четыре системных базы данных: m ast er

converted to PDF by BoJIoc

(высокоуровневые данные о сервере) , t em pdb (временные таблицы, специфические для отдельных процессов или запросов), m odel ( шаблон для создания новых баз данных) и m sdb (данные для планировщика SQL Server Agent ) . Существуют два типа системных таблиц: присутствующие в каждой базе данных (метаданные каждой базы) и содержащиеся только в системных базах данных ( информация о сервере в целом, а не о конкретной базе) . Наконец, в SQL Server существует ряд системных хранимых процедур, используемых при работе с системными таблицами. Они используются при выполнении таких задач, как заполнение системных таблиц и обработка запросов к ним (например, процедура sp_who выдает сведения обо всех серверных процессах, работающих в данный момент). Системные процедуры важны по двум причинам: во-первых, они позволяют легко получить нужную информацию из системных таблиц, а во-вторых, они используются для заполнения системных таблиц. Системные базы данных Системные базы данных отделяют данные сервера от пользовательских данных. Можно рассматривать их как высокоуровневую форму нормализации. В системе Microsoft SQL Server существуют четыре системных базы данных: m ast er, t em pdb, m odel и m sdb. В следующих разделах приведено подробное описание каждой из четырех системных баз SQL Server. m a ste r В базе данных m ast er хранятся сведения о системе SQL Server на уровне сервера, среди которых — регистрация обращений к серверу, параметры конфигурации, базы данных и их отображение на физические устройства (другими словами, при записи в базу данных страница в действительности записывается в файл на диске) . Все эти данные записываются в системные таблицы. Поскольку база данных m aster содержит данные о системе, специфические для SQL Server, а также некоторые данные уровня операционной системы (некоторые параметры памяти, физические имена файлов и т. д.) , вы всегда должны иметь резервную копию базы данных m ast er. te m pdb В базе данных tem pdb хранятся временные таблицы и хранимые процедуры SQL Server. Tem pdb содержит временные таблицы, намеренно созданные разработчиком, а также все временные таблицы и промежуточные результаты, используемые SQL Serv er при обработке запросов. Более того, t em pdb также применяется для хранения любых временных данных (например, создаваемых при обработке секций GROUP BY и союзов) . Помните: t em pdb является глобальным ресурсом. Другими словами, t em pdb содержит временные таблицы и хранимые процедуры всех пользователей, подключенных к системе. Поскольку временные таблицы и хранимые процедуры автоматически удаляются при отключении пользователя, а при закрытии системы активных подключений не остается, содержимое t em pdb никогда не сохраняется между сеансами работы с SQL Serv er. База данных t em pdb заново создается по определению из sysdat abases и содержимому базы m odel при каждом запуске SQL Server. Это гарантирует чистоту базы (отсутствие каких-либо данных, кроме хранящихся в базе m odel) . Файл базы данных t em pdb на диске динамически увеличивается по мере необходимости. Автоувеличение (aut ogrow) — новая возможность, появившаяся в SQL Server 7 . При каждом запуске системы размер t em pdb сбрасывается до первоначального значения, которым является размер базы данных m odel. Чтобы избежать затрат, связанных с автоувеличением t em pdb, увеличьте размер базы командой ALTER TABLE. В предыдущих версиях SQL Server содержимое t em pdb могло храниться в памяти — теперь такая возможность отсутствует. m odel База данных m odel представляет собой шаблон, по которому создаются другие базы данных. При выполнении команды CREATE DATABASE содержимое m odel копируется в новую базу данных, а остаток

converted to PDF by BoJIoc

новой базы заполняется пустыми страницами, выделяемыми под таблицы при вставке новых данных. Как упоминалось выше, база данных t em pdb создается заново при каждом запуске SQL Server; следовательно, при каждом запуске t em pdb обращается к базе данных m odel. Это означает, что база данных m odel всегда должна присутствовать в системе SQL Server. m sdb База данных m sdb используется SQL Server Agent для планирования оповещений и заданий, а также для хранения данных об операторах. Каждая база данных SQL Server содержит системные таблицы, которые используются для записи данных, используемых компонентами SQL Server (то есть метаданных). Местонахождение файлов В SQL Serv er версии 7 каждая база данных имеет собственный набор системных файлов. По умолчанию файлы хранятся в каталоге C: \ Msssql7\ Dat a. Имена системных файлов и их размеры для типичной установки перечислены в табл. 3.1. Данные и журналы хранятся в разных файлах. В версии 7 журнал транзакций не выглядит как нормальная таблица, как это было в предыдущих версиях ( таблица syslogs) . В ранних версиях SQL Server системные базы данных m ast er и m odel хранились в одном файле, который назывался главным устройством ( m aster device). Первые 2 Мбайт пространства t em pdb тоже хранились на главном устройстве. Из-за этого иногда возникали проблемы со свободным местом в базах m ast er и m odel. Теперь каждая база данных имеет собственный набор файлов и может увеличиваться независимо от других баз. Таблица 3.1. Стандартные системные файлы Файл базы данных

Физическое имя файла Стандартный размер (для типичной установки)

m ast er - основные данные Mast er.m df

7,5 Мбайт

m ast er - журнал

1 Мбайт

Mast log.ldf

t em pdb - основные данные Tem pdb.m df

8 Мбайт

t em pdb - журнал

Tem plog.ldf

0,5 Мбайт

m odel - основные данные

Model.m df

0,75 Мбайт

m odel - журнал

Modellog.ldf

0,75 Мбайт

m sdb - основные данные

Msbdat a.m df

3,5 Мбайт

m sdb - журнал

Msdblog.ldf

0,75 Мбайт

Системные таблицы Системные таблицы почти ничем не отличаются от обычных, кроме одного — вместо пользовательских данных в них хранится информация о содержимом базы или о сервере. Они автоматически заполняются при выполнении команды CREATE или некоторых системных хранимых процедур. Вы не должны непосредственно обновлять содержимое системных таблиц. Более того, для них нельзя устанавливать триггеры, поскольку это может привести к изменениям в работе системы. В системных таблицах хранятся данные двух типов: уровня сервера и относящиеся к конкретной базе данных. Как нетрудно предположить, информация о сервере хранится только в базе данных m ast er. Информация о конкретной базе данных находится в каждой отдельной базе данных. В табл. 3 .2–3.5 перечислены различные системные таблицы. В табл. 3 .2 перечислены таблицы с системными данными уровня сервера, хранящиеся в таблице m ast er. В табл. 3.3 перечислены таблицы с данными, используемыми SQL Server Agent . В табл. 3 .4 представлены таблицы с данными, используемыми в операциях архивации и восстановления, а в табл. 3.5 — таблицы с системной информацией уровня базы данных, присутствующие в каждой базе. Таблица 3.2. Системные таблицы с данными о сервере ( база данных MASTER) Имя таблицы

Содержимое

converted to PDF by BoJIoc

sysallocat ions

Одна запись на каждую единицу выделения.

sysalt files

Одна запись на каждый файл базы данных.

syscharsets

Одна запись на каждый установленный набор символов и порядок сортировки.

sysconfigures

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

syscurconfigs

Текущая конфигурация системы.

sysdatabases

Одна запись на каждую базу данных.

sysdevices

Одна запись на каждое устройство.

syslanguages

Одна запись на каждый установленный язык.

syslock info

Одна запись на каждую блокировку.

syslogins

Одна запись на каждую учетную запись пользователя для входа.

sysm essages

Одна запись на каждое сообщение, определяемое для сервера.

sysoledbusers

Одна запись для каждого имени/ пароля на заданном связанном сервере.

sysperfinfo

Внутренние счетчики быстродействия для Perform ance Monit or.

sysprocesses

Одна запись на каждый присоединенный процесс.

sysrem ot elogins Одна запись на каждую удаленную учетную запись для входа. sysserv ers

Одна запись на каждый доступный сервер, включая текущий.

Вам не придется запоминать имена или содержимое всех системных таблиц, однако бывает полезно знать, какая информация хранится в каждой системной таблице. В табл. 3 .3 и 3 .4 содержимое таблиц не указано, поскольку эти данные не обязательны для сдачи экзамена. Таблица 3.3. Системные таблицы уровня сервера для системного агента ( база данных MSDB) Имя таблицы sysalert s syscategories sysdownloadlist sysj obhistory sysj obs sysj obsschedules sysj observers sysj obsteps sysnot ificat ions sysoperat ors syst arget servergroupm em bers syst arget servergroups syst arget servers syst ask ids Таблица 3.4. Системные таблицы базы данных MSDB Имя таблицы backupfile backupm ediafam ily backupm ediaset backupset rest orefile

converted to PDF by BoJIoc

rest orefilegroup rest orehist ory Таблица 3.5. Системные таблицы уровня базы данных (присутствуют во всех базах данных) Имя таблицы

Содержимое

syscolum ns

Одна запись на каждый столбец в каждой таблице.

syscom m ent s

Текст создания всех пользовательских объектов.

sysconst raint s

Одна запись на каждое определенное ограничение.

sysdepends

Одна запись на каждую зависимость объектов.

sysfilegroups

Одна запись на каждую группу файлов.

sysfiles

Одна запись на каждый файл.

sysforeignkeys

Одна запись на каждый внешний ключ.

sysfullt ex tcat alogs Набор текстовых каталогов. sysindexes

Одна запись на каждый индекс и таблицу.

sysindexk eys

Информация о каждом столбце индекса.

sysm em bers

Одна строка для каждого члена роли базы данных.

sysobj ect s

Одна строка для каждого объекта базы данных.

sysperm issions

Предоставленные и отозванные права доступа пользователей.

sysprot ects

Предоставленные или отказанные права защиты.

sysreferences

Ограничения внешних ключей.

syst ypes

Типы данных, определяемые пользователем.

sysusers

Одна запись для каждого пользователя и группы.

Системные хранимые процедуры Для модификации системных таблиц следует использовать готовые системные хранимые процедуры. Системные хранимые процедуры делятся на категории в соответствии с областью применения ( табл. 3.6) . Если в документации явно не оговорено обратное, все системные хранимые процедуры возвращают значение 0 как признак успешного завершения. Иногда это раздражает новичков; многие интерфейсы не сообщают о завершении операций с нулевым кодом, из-за чего пользователь не получает положительной обратной связи в виде сообщения « Готово! ». Когда у вас появится опыт работы с системными хранимыми процедурами, вы сможете модифицировать их или написать собственные процедуры. Таблица 3.6. Категории системных хранимых процедур Категория

Описание

Процедуры каталога

Реализация функций словаря данных ODBC и изоляция приложений ODBC от изменений в системных таблицах.

Процедуры курсоров

Реализация возможностей курсорных переменных.

Процедуры распределенных запросов

Реализация распределенных запросов и управление ими.

Процедуры SQL Server Agent

Управление операциями ( запланированными или зависящими от событий) с помощью SQL Serv er Agent .

Процедуры репликации

Управление, разрешение или запрет задач репликации.

Процедуры безопасности Обеспечение защиты. Системные процедуры

Общее сопровождение SQL Server.

converted to PDF by BoJIoc

Процедуры Web Assist ant Помощь в работе Web Assist ant . Общие расширенные процедуры

Интерфейс SQL Server с внешними программами для различных вспомогательных операций.

Расширенные процедуры Работа с электронной почтой в SQL Server. SQL Mail Средства SQL Server Profiler. Для выполнения расширенных процедур SQL Server Расширенные процедуры Profiler на локальном сервере через SQL Server Query Analyzer следует SQL Serv er Profiler использовать средства аутентификации Windows NT. Процедуры OLE Aut om at ion

Применение стандартных объектов OLE Aut om at ion в стандартных пакетах Transact -SQL.

Процедуры Dat a Transform at ion Services

Управление службой преобразования данных, методами устойчивости и пространством имен.

Системные хранимые процедуры, определяемые администратором Администратор может создавать свои собственные системные процедуры. Они обладают многими достоинствами, в том числе и тем, что системные процедуры автоматически изменяют контекст базы данных (по умолчанию хранимые процедуры выполняются в контексте базы данных, в которой они были созданы; если процедура создавалась в контексте базы данных pubs, она всегда будет обращаться к объектам базы pubs, даже если она выполняется из другой базы данных) . Чтобы создать собственную системную процедуру, воспользуйтесь базой данных m ast er, снабдите имя процедуры префиксом sp_ и предоставьте право исполнения тем, кому разрешается запуск данной процедуры. Например: creat e proc sp_ list t ables as select nam e from sysobj ect s where t ype = 'U' Примеры экзаменационных вопросов Que stion 1 Which dat abase(s) cont ains syst em t ables? [ Check all correct answers] • • • • •

A. m ast er B. m odel C. t em pdb D. m sdb E. All of t he abov e

Вопрос 1 Какие базы данных содержат системные таблицы? [ Выберите все правильные ответы] • • • • •

A. m ast er B. m odel C. t em pdb D. m sdb E. Все перечисленные

Правильный ответ — E. Системные таблицы присутствуют во всех базах данных. Que stion 2 Which dat abase(s) cont ains server-specific syst em tables? [ Check all correct answers] • • • • •

A. m ast er. B. m odel. C. t em pdb. D. m sdb. E. All of t he abov e.

Вопрос 2 Какие базы данных содержат системные таблицы с данными о сервере? [ Выберите все правильные ответы]

converted to PDF by BoJIoc

• • • • •

A. m ast er. B. m odel. C. t em pdb. D. m sdb. E. Все перечисленные.

Правильные ответы — A ( данные о конфигурации сервера) и D (информация для Syst em Agent ) . Ответы B и C неверны, поскольку эти базы данных содержат только информацию, относящуюся к конкретным таблицам. Que stion 3 Which syst em t able contains inform at ion pert aining t o who m ay access a server? • • • • •

A. sy slogins. B. sy susers. C. sy saccesses. D. sy sdat abaseaccess. E. None of t he above.

Вопрос 3 Какая системная таблица содержит информацию о том, кто может работать на сервере? • • • • •

A. sy slogins. B. sy susers. C. sy saccesses. D. sy sdat abaseaccess. E. Ни одна из перечисленных выше.

Правильный ответ — A. Ответ B относится к конкретным базам данных, ответы C и D не существуют. Que stion 4 Which syst em t able contains inform at ion pert aining t o who m ay access a dat abase? • • • • •

A. sy slogins. B. sy susers. C. sy saccesses. D. sy sdat abaseaccess. E. None of t he above.

Вопрос 4 Какая системная таблица содержит информацию о том, кто может работать с базой данных? • • • • •

A. sy slogins. B. sy susers. C. sy saccesses. D. sy sdat abaseaccess. E. Ни одна из перечисленных выше.

Правильный ответ — B. Ответ A относится к серверу, ответы C и D не существуют. ГЛАВА 4

Базы данных и файлы Ключевые термины • База данных • Файл • Группа файлов Необходимые знания и приемы • • • •

Создание и использование баз данных Модификация баз данных Создание групп файлов Модификация групп файлов

converted to PDF by BoJIoc

• Настройка баз данных Базы данных принадлежат к числу основных структур SQL Server. Они обеспечивают контекст для хранения и управления данными. Общие сведения о базах данных Кроме четырех системных баз, SQL Server может обрабатывать до 32 734 баз данных, определяемых пользователем. Все объекты баз данных SQL Server так или иначе связаны с использованием, доступом и целостностью таблиц. База данных представляет собой: • • • • •

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

Файлы базы данных База данных состоит из двух и более файлов, каждый из которых может использоваться лишь одной базой. У файлов существуют два имени: логическое и физическое. Логическое имя подчиняется стандартным правилам выбора имен объектов SQL Server. Физическое имя представляет собой полное имя любого локального или сетевого файла. В отличие от предыдущих версий SQL Server, файлы базы данных могут автоматически увеличиваться. Максимальное число файлов в базе данных — 32 768 . Файлы делятся на три типа: • Первичные файлы. Используются для хранения данных и информации, определяющих начальные действия с базой. База данных содержит лишь один первичный файл. Стандартное расширение — .m df. • Вторичные файлы. Одна или несколько вспомогательных областей для хранения данных. Могут использоваться для распределения операций чтения/ записи по нескольким дискам. Стандартное расширение — .ndf. • Файлы журналов. Содержат журналы транзакций базы данных. База данных содержит по крайней мере один файл журнала. Стандартное расширение — .ldf. Перед непосредственной записью транзакций в файл данных все вносимые изменения записываются в журнал. Примечание Каждая база данных содержит по крайней мере один первичный файл и один файл журнала. SQL Serv er не накладывает жестких ограничений на расширения файлов, но мы рекомендуем следовать правилам Microsoft . Каждый файл может принадлежать лишь одной базе данных. Группы файлов Группы файлов предназначены для объединения нескольких файлов. Каждый файл может входить не более чем в одну группу. Файлы журналов не могут принадлежать никаким группам. Группы файлов используются для распределения операций чтения/ записи по нескольким дискам. Если группа содержит более одного файла, операции записи распределяются между файлами группы. Базы данных могут содержать до 32 768 групп файлов. У каждой базы данных имеется первичная группа файлов. Она содержит первичный файл данных и все файлы, которые не были явно назначены в другую группу файлов. Имя первичной группы файлов — PRI MARY. Таблицы и индексы можно назначить в любую группу файлов. При отсутствии назначений они включаются в стандартную группу файлов. В любой момент времени лишь одна группа файлов может быть назначена стандартной. Проблемы файлов и групп

converted to PDF by BoJIoc

Файл или группа файлов может использоваться лишь одной базой данных. В свою очередь, файл может входить лишь в одну группу. Кроме того, данные и журналы должны храниться в отдельных файлах. Файлы журналов никогда не входят в группы. Как правило, база данных с одним файлом данных и одним файлом журнала удовлетворяет требованиям к быстродействию. Если вы собираетесь работать с несколькими файлами, воспользуйтесь первичным файлом только для системных таблиц и объектов. Затем создайте по крайней мере один вторичный файл для хранения пользовательских данных и объектов. Распределяйте файлы или группы по как можно большему числу локальных физических дисков. Объекты, занимающие много места, включаются в различные группы файлов. По соображениям быстродействия файлы базы данных не следует размещать на сетевых дисках. Разные таблицы, используемые в одном запросе, помещаются в разные группы файлов. Параллельный поиск на диске при вводе/ выводе для объединенных данных повышает быстродействие. Кроме того, таблицы, к которым происходят частые обращения, и некластерные индексы, принадлежащие этим таблицам, также помещаются в разные группы. Быстродействие также повышается благодаря параллельному вводу/ выводу, если файлы находятся на разных физических дисках. Для повышения быстродействия файлы журналов не должны находиться на одном устройстве с файлами данных. По возможности избегайте размещения файлов операционной системы на дисках, содержащих файлы данных или журналов SQL Server. Устройства SQL Serv er все еще позволяет создавать устройства (или предопределенные файлы данных) командой DI SK I NI T перед созданием базы данных. Однако Microsoft не рекомендует пользоваться командой DI SK I NI T, которая была включена в версию 7.0 лишь для обеспечения обратной совместимости. Команда DI SK I NI T имеет следующий синтаксис: DI SK I NI T NAME = 'логическое_имя' PHYSNAME = 'физическое_имя' VDEVNO = виртуальный_номер_устройства SI ZE = количество_2- килобайтных_блоков [ , VSTART = виртуальный_адрес] Устройство включается в таблицу sysdevices базы данных m aster. Таблица также содержит все устройства выгрузки и устройства баз данных m aster, m odel и t em pdb. Создание базы данных Базы данных создаются командой CREATE DATABASE. Создание баз данных разрешается любому пользователю с ролью системного администратора или всем, кому системный администратор предоставил такое право. Команда CREATE DATABASE имеет следующий синтаксис: CREATE DATABASE имя_базы [ ON [ PRI MARY] ( [ NAME = логическое_имя_файла, ] FI LENAME = 'имя_файла_ОС' [ , SI ZE = размер] [ , MAXSI ZE = { максимальный_размер | UNLI MI TED } ] [ , FI LEGROWTH = приращение] ) | { FI LEGROUP имя_группы_файлов FI LEDEFI NI TI ONS} [ ,.. .n] ] [ LOG ON { [ NAME = логическое_имя_файла, ] [ FI LENAME = 'имя_файла_ ОС' [ , SI ZE = размер] [ , MAXSI ZE = { максимальный_размер | UNLI MI TED } ] [ , FI LEGROWTH = приращение] } [ ,...n] [ FOR LOAD | FOR ATTACH] Команда CREATE DATABASE может использоваться для связывания базы данных с устройством, созданным командой DI SK I NI T. Мы рекомендуем использовать команду CREATE DATABASE для создания файлов базы

converted to PDF by BoJIoc

данных и связывания их с базой. Если при создании базы не указан первичный файл данных и/ или файл журнала, то отсутствующий файл (или файлы) создается с именем по умолчанию. Физические файлы будут находиться в стандартном каталоге. Первичному файлу присваивается имя имя_базы.m df, а файлу журнала — имя_ базы_log.ldf. Если размер файлов не задан, то при создании размер первичного файла совпадает с размером первичного устройства базы m odel, а размер файла журнала и вторичных файлов данных равен 1 Мбайт. Он может быть и больше, если размер первичного файла базы данных m odel превышает 1 Мбайт. Хотя имена и размеры файлов указывать не обязательно, на практике это всегда следует делать. SQL Server создает базу данных за два этапа. На первом этапе база m odel копируется в новую базу данных, а на втором этапе инициализируется все неиспользуемое пространство. Команда CREATE DATABASE имеет следующие параметры: • PRI MARY — файл определяется как первичное устройство. • NAME — логическое имя; по умолчанию совпадает с именем файла. • FI LENAME — полное имя файла на диске. • SI ZE — исходный размер файла. Минимальный размер файла журнала равен 512 Кбайт. • MAXSI ZE — максимальный размер файла. • UNLI MI TED — размер файла не ограничивается. • FI LEGROWTH — приращение размера в мегабайтах ( MB) , килобайтах (KB) или процентах ( % ) . По умолчанию приращение равно 10% . • FOR LOAD — обеспечивает обратную совместимость со сценариями SQL, написанными для предыдущих версий SQL Server. • FOR ATTACH — указывает, что файлы базы данных уже существуют. Пользователь, создавший базу данных, является ее владельцем. Все параметры конфигурации базы копируются из базы m odel, если только при создании базы не был указан параметр FOR ATTACH. В этом случае параметры конфигурации читаются из существующей базы данных. Рассмотрим некоторые примеры команды CREATE DATABASE: / * База данных со стандартным размером и именами файлов * / CREATE DATABASE t est 1 / * Данные — 2 Мбайт, файл журнала — по умолчанию * / CREATE DATABASE t est 2 ON (FI LENAME = 'c: \ d1 .m df', SI ZE = 2 , NAME = 'd1') / * Первичный файл — 10 Мбайт, одна группа файлов g1 и журнал размером 10 Мбайт * / CREATE DATABASE t est 3 ON PRI MARY (FI LENAME = 'c: \ t est3 .m df', SI ZE = 10 , NAME = 'd1') , FI LEGROUP g1 (FI LENAME — 'c: \ g1 .m df', SI ZE = 10 , NAME = 'g1') LOG ON ( FI LENAME = 'c: \ test 3.ldf', SI ZE = 10, NAME = 'log1 ') Модификация баз данных В SQL Serv er 7 .0 модификация баз данных выполняется нечасто. И все же не исключено, что вам придется добавить новые файлы или группы, уменьшить размер базы, сменить владельца или имя базы данных, заново сконфигурировать существующий файл или группу. Возможны любые модификации, кроме переименования базы в многопользовательском режиме. Удаление базы данных Базы данных удаляются командой DROP DATABASE. Команда DROP DATABASE имеет следующий синтаксис: DROP DATABASE имя_базы [ , n]

converted to PDF by BoJIoc

Команда удаляет одну или несколько баз данных. При удалении базы удаляются файлы, используемые ею. Если база данных используется в настоящий момент, удаление невозможно. После удаления база и ее файлы не могут использоваться. Смена владельца базы данных Для изменения владельца базы данных используется хранимая процедура sp_changedbowner. Владельцем базы данных можно назначить любую учетную запись пользователя для входа, не являющуюся текущим пользователем базы. Если у текущего владельца базы данных существуют псевдонимы (aliases) , вы можете указать, хотите ли вы назначить их новому владельцу. Хранимая процедура для смены владельца базы данных имеет следующий синтаксис: sp_changedbowner [ @loginam e = ] 'имя' [ .[ @m ap = ] [ флаг_псевдонимов] Смена владельца выполняется только пользователями с правами системного администратора. Внимание Вы не можете сменить владельца системных баз данных. При смене владельца необходимо предварительно перейти к базе данных. Применение процедуры sp_changedbowner продемонстрировано в следующем примере: USE MyDb go sp_changedbowner @loginam e= 'NewDBO' go Переименование баз данных Для смены имени базы данных в SQL Server существует хранимая процедура sp_ renam edb. Процедура переименования базы данных имеет следующий синтаксис: sp_ renam edb "старое_имя"," новое_имя" Только системный администратор может переименовать базу данных. База данных должна быть предварительно переведена в однопользовательский режим (см. раздел «Настройка баз данных» этой главы) . Рассмотрим пример использования процедуры sp_ renam edb: use m ast er go sp_dbopt ion MyDB,'single','t rue' go sp_ renam edb MyDB,'MyNewDB' go sp_dbopt ion MyNewDB,'single','false' go Команда ALTER Команда ALTER DATABASE позволяет изменить как определение, так и размер базы данных. Она имеет следующий синтаксис: ALTER DATABASE база_данных { ADD FI LE < спецификация> [ ,...n] [ TO FI LEGROUP имя_ группы] | ADD LOG FI LE < спецификация> [ ,.. .n] | REMOVE FI LE логическое_имя_файла | ADD FI LEGROUP имя_группы | REMOVE FI LEGROUP имя_группы | MODI FY FI LE < спецификация> | MODI FY FI LEGROUP имя_ группы свойство_группы }

converted to PDF by BoJIoc

< спецификация> : : = (NAME = 'логическое_имя_файла' [ , FI LENAME = 'имя_файла_ОС' ] [ , SI ZE = размер] [ , MAXSI ZE = { максимальный_ размер | UNLI MI TED } ] [ , FI LEGROWTH = приращение] ) Команда ALTER DATABASE позволяет включать файлы в существующие группы или добавлять в базу данных новые файлы журналов. Если вы добавляете новый файл данных без указания группы, файл включается в первичную группу. Команда ALTER DATABASE также выполняет следующие функции: • Удаление пустых файлов. Первичная группа всегда должна содержать как минимум один первичный файл и один файл журнала в базе данных. При удалении файла удаляется физический файл. • Добавление новых групп файлов. При добавлении новой группы в нее не включаются никакие файлы. • Удаление групп файлов. Если в группе присутствуют какие-либо файлы, они должны быть пустыми; в противном случае удаление группы невозможно. Удалить первичную группу файлов невозможно. Используя команду ALTER DATABASE для модификации файлов, необходимо указывать логическое имя файла. Спецификация позволяет изменить все остальные параметры, однако в одной команде ALTER DATABASE можно указать лишь один параметр. Если вы изменяете размер файла, новый размер не может быть меньше текущего. При модификации группы файлов можно задавать свойства READONLY, READWRI TE и DEFAULT: • Свойство READONLY говорит о том, что группа файлов доступна только для чтения. Оно предотвращает возможную модификацию объектов из этой группы. Для первичной группы установка этого свойства невозможна. Свойство READONLY может устанавливаться только пользователями, обладающими монопольным доступом к базе данных. • Свойство READWRI TE обладает противоположным действием. Оно разрешает обновление объектов в группе. Свойство READWRI TE может устанавливаться только пользователями, обладающими монопольным доступом к базе данных. • Свойство DEFAULT говорит о том, что группа назначается стандартной для базы данных. При установке свойства DEFAULT это свойство отменяется для группы, которая была назначена стандартной ранее. При создании базы стандартной группой назначается первичная группа файлов. Если в командах CREATE TABLE, ALTER TABLE и CREATE I NDEX не указана группа файлов, новые таблицы и индексы создаются в стандартной группе. Непосредственное перемещение файлов из одной группы в другую невозможно. Вам придется сначала удалить файл, а затем включить его в новую группу. Приведем несколько примеров использования команды ALTER DATABASE: / * Следующий пример включает новый файл данных pubs_dat a.ndf размером 50 Мбайт в новую группу grp2 * / ALTER DATABASE pubs ADD FI LEGROUP grp2 ALTER DATABASE pubs ADD FI LE ( NAME = 'PubsFile2', FI LENAME = 'c: \ t em p\ pubsdat a2.ndf', SI ZE = 50 ) TO FI LEGROUP grp2 / * Следующий пример удаляет группу grp2 , созданную в предыдущем примере, из базы данных pubs * / ALTER DATABASE pubs REMOVE FI LE PubsFile2 ALTER DATABASE pubs REMOVE FI LEGROUP grp2 Уменьшение размера баз данных вручную Уменьшение размера баз данных вручную выполняется командой DBCC SHRI NKDATABASE. Она имеет следующий синтаксис:

converted to PDF by BoJIoc

DBCC SHRI NKDATABASE ( имя_базы [ , процент] [ , { NOTRUNCATE | TRUNCATEONLY} ] ) При сжатии базы данных можно указать необязательный параметр — процент свободного места, которое вы хотите оставить в базе данных. Параметр NOTRUNCATE отменяет стандартное поведение и оставляет свободное место в файлах операционной системы после сжатия файла. Параметр TRUNCATEONLY возвращает операционной системе все неиспользуемое место в файлах данных и сокращает файл до последнего экстента. Команда не пытается переместить записи в невыделенные страницы. При наличии параметра NOTRUNCATE значение процент игнорируется. Параметр NOTRUNCATE не позволяет сократить файл ниже минимального размера. Команда DBCC SHRI NKFI LE не сжимает файл больше минимума, необходимого для хранения данных в файле. Если параметр NOTRUNCATE используется вместе с параметром процент, то последствия ограничиваются перемещением используемых страниц в начало файла. База данных не может стать меньше базы m odel. Сжатие файлов выполняется командой DBCC SHRI NKFI LE в базе данных, файлы которой требуется сжать. Команда SHRI NKFI LE имеет следующий синтаксис: DBCC SHRI NKFI LE { { имя_файла | идентификатор_файла } { [ , размер] | [ , { EMPTYFI LE | NOTRUNCATE | TRUNCATEONLY} ] } ) Файл определяется по имени или по идентификатору. В процессе сжатия данные обычно перемещаются в страницы, находящиеся в начале файла. Параметр размер — целое число, определяющее требуемый размер файла. Если размер не указан, файл сжимается до минимального размера, необходимого для хранения данных. Параметр EMPTYFI LE перемещает все данные из файла в другие файлы группы. После очистки файла SQL Server не позволяет заносить в него новые данные. Тем самым файл готовится к удалению командой ALTER DATABASE. Параметр NOTRUNCATE освобождает неиспользуемое место, но не перемещает записи данных. При его наличии параметр размер игнорируется. Настройка параметров баз данных Многие параметры конфигурации SQL Server настраиваются на уровне баз данных. Конфигурация может осуществляться хранимой процедурой sp_dbopt ion. Процедура sp_dbopt ion имеет следующий синтаксис: sp_dbopt ion [ 'база_данных'] [ , 'имя_параметра'] [ , 'значение'] Если база данных не указана, sp_ configure выводит список всех настраиваемых параметров. Допустимые параметры перечислены в табл. 4 .1 . Таблица 4.1. Параметры конфигурации баз данных Параметр

Описание

AUTOCLOSE

Если параметр равен TRUE, после выхода последнего пользователя база данных закрывается с освобождением всех ресурсов.

AUTOSHRI NK

Если параметр равен TRUE, файлы базы данных являются кандидатами для периодического автоматического сжатия.

ANSI NULL DEFAULT

Если параметр равен TRUE и при создании или модификации таблицы для столбца не был задан параметр NOT NULL, то допустимость значений NULL в этом столбце определяется по правилам SQL-92.

ANSI NULLS

Если параметр равен TRUE, результат всех сравнений с NULL считается равным

converted to PDF by BoJIoc

UNKNOWN. Если параметр равен FALSE и при этом не используются значения UNI CODE, результат NULL = NULL считается равным TRUE. ANSI WARNI NGS

Если параметр равен TRUE, то при возникновении состояний типа "деления на ноль" выдаются ошибки или предупреждения.

CONCAT NULL YI ELDS NULL

Если параметр равен TRUE и хотя бы один из операндов конкатенации равен NULL, результат также равен NULL.

CURSOR CLOSE ON COMMI T

Если параметр равен TRUE, любые курсоры, открытые на момент закрепления или отката изменений, закрываются. Если параметр равен FALSE, курсоры остаются открытыми при завершении транзакции. Откат транзакции при значении FALSE закрывает любые курсоры, кроме тех, которые определялись как I NSENSI TI VE или STATI C.

DBO USE ONLY

Если параметр равен TRUE, базу данных может использовать лишь ее владелец.

DEFAULT TO LOCAL CURSOR

Если параметр равен TRUE, при объявлениях курсоров по умолчанию принимается тип LOCAL.

MERGE PUBLI SH

Если параметр равен TRUE, база данных может быть опубликована для репликации сведением..

OFFLI NE

Если параметр равен TRUE, база данных находится в отключенном состоянии и не может никем использоваться.

PUBLI SHER

Если параметр равен TRUE, база данных может быть опубликована для репликации.

QUOTED I DENTI FI ER

Если параметр равен TRUE, идентификаторы могут заключаться в кавычки ( ") .

READ ONLY

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

RECURSI VE TRI GGERS

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

SELECT I NTO/ BULKCOPY

Если параметр равен TRUE, разрешается команда SELECT I NTO, WRI TETEXT без записи в журнал, UPDATETEXT без записи в журнал и опрации с использованием команды BULK COPY..

SI NGLE USER

Если параметр равен TRUE, то в произвольный момент времени с базой данных может работать лишь один пользователь.

SUBSCRI BED

Если параметр равен TRUE, база данных может быть подписана для публикации.

TORN PAGE DETECTI ON

Если параметр равен TRUE, становится возможным обнаружение незавершенных страниц.

TRUNC.LOG ON CHKPT.

Если параметр равен TRUE, при заполнении журнала на 70 процентов происходит автоматическое усечение, при этом для журнала устанавливается контрольная точка.

Для базы данных m ast er можно задать лишь один параметр TRUNC.LOG ON CHKPT. При создании новой базы устанавливаются параметры, которые в данный момент установлены для базы m odel. Внимание Изменения конфигурационных параметров вступают в силу лишь после прохождения базой данных контрольной точки. Однако SQL Server автоматически устанавливает контрольную точку после вызова процедуры sp_ configure. Просмотр сведений о базе данных SQL Serv er содержит три стандартных процедуры каталога (см. табл. 3.6) для просмотра сведений о базах данных, файлах и группах: sp_helpdb, sp_helpfile и sp_helpfilegroup. Процедура sp_ helpdb выводит информацию о базе данных и о ее конфигурации. Хранимая процедура sp_helpdb имеет следующий синтаксис: sp_helpdb [ имя_базы]

converted to PDF by BoJIoc

Если имя конкретной базы не задано, SQL Server возвращает однострочную сводку для каждой базы данных. Если sp_helpdb запускается из базы данных, о которой вы хотите получить информацию, процедура выдает более подробный отчет с теми же данными, что и sp_helpfile. Хранимая процедура sp_helpfile выдает сведения о файлах, связанных с текущей базой данных. Она имеет следующий синтаксис: sp_helpfile [ [ @filenam e = ] 'имя'] Если имя файла не указано, SQL Serv er возвращает информацию обо всех файлах базы данных. Хранимая процедура sp_helpfilegroup выдает информацию о группе файлов текущей базы. Она имеет следующий синтаксис: sp_helpfilegroup [ [ @filegroupnam e = ] 'имя'] Если имя группы не задано, программа возвращает информацию обо всех группах. При наличии параметра nam e хранимая процедура sp_ helpfilegroup также запускает sp_helpfile для каждого файла в группе. Чтобы получить информацию о первичной группе файлов, заключите имя в кавычки, поскольку оно является зарезервированным словом. Например: sp_helpfilegroup @filegroupnam e = 'prim ary' Ente rprise Ma nage r Для управления базами данных можно воспользоваться утилитой Ent erprise Manager. Создание и модификации файлов в Enterprise Manager реализуются с помощью мастеров ( wizards) . Использование баз данных У любого пользовательского сеанса имеется текущая база данных; Microsoft называет это «использованием» базы данных. Системный администратор определяет для вас базу данных, которая должна использоваться по умолчанию при получении доступа к серверу. Если база данных не была указана при создании учетной записи, используется база m ast er, однако она может быть в любой момент изменена системным администратором. Чтобы узнать имя текущей базы данных, воспользуйтесь встроенной функцией SQL: / * Вывод имени текущей базы данных * / SELECT db_nam e() Смена текущей базы данных выполняется командой USE. Все элементы синтаксиса SQL, следующие за командой USE, будут выполняться в контексте новой базы данных. Ниже показан пример использования команды USE: / * Назначить текущей базой данных "st udent 07" * / USE st udent07 Примеры экзаменационных вопросов Que stion 1 I f y ou want t o rem ov e a file from dat abase, which of t he following st at em ent s are t rue? [ Check all correct answers] • • • • • • •

A. You m ust be in t he dat abase from w hich you want t o rem ove t he file. B. You m ust run t he DBCC SHRI NKFI LE com m and to m ake sure t hat t he file is em pt y. C. You cannot rem ov e the file if it s file group has dat a in it . D. You run t he DBCC REMOVEFI LE com m and t o rem ov e the file from t he dat abase. E. The OS file will st ill have t he dat a in it aft er it is rem oved from t he database. F. The database m ust be in single user m ode. G. None of t he above.

converted to PDF by BoJIoc

Вопрос 1 Если вы хотите удалить файл из базы данных, какие из следующих утверждений являются истинными? [ Выберите все правильные ответы] • • • • • • •

A. Вы должны находиться в той базе данных, из которой удаляется файл. B. Вы должны выполнить команду DBCC SHRI NKFI LE, чтобы гарантировать, что файл пуст. C. Вы не можете удалить файл, если в его группе файлов имеются данные. D. Файл удаляется из базы данных командой DBCC REMOVEFI LE. E. Файл ОС все еще будет содержать данные после его удаления из базы. F. База данных должна находиться в однопользовательском режиме. G. Ни одно из перечисленных.

Правильный ответ — G. Ответ A неверен, поскольку команда ALTER DATABASE не ограничивается текущей базой данных. Хотя файл не должен содержать данных, вы не обязаны сжимать его перед удалением, поэтому ответ B неверен. Ответ C тоже неверен; файл можно удалить даже в том случае, если другие файлы группы содержат данные. Команда DBCC REMOVEFI LE не существует, поэтому ответ D неверен. После удаления из базы данных файл удаляется из операционной системы, следовательно, ответ E неверен. Que stion 2 Which of t he following will creat e a dat abase called MyDB wit h an init ial size of 50 MB for t he dat abase files? • A. creat e dat abase MyDB dat asize= 40 , logsize = 10 • B. creat e dat abase MyDB on File1 = 40 log on file2= 10 • C. create dat abase MyDB on NAME= 'File1', size = 40 log on nam e= file2 , size = 10 • D. creat e dat abase MyDB on( NAME= 'File1', size = 40 ) log on(nam e= file2 , size = 10) • E. creat e dat abase MyDB on (NAME= 'File1', size = 40 log on nam e= file2, size = 10 ) Вопрос 2 Какая из команд создает базу данных с именем MyDB и исходным размером файлов 50 Мбайт? • A. creat e dat abase MyDB dat asize= 40 , logsize = 10 • B. creat e dat abase MyDB on File1 = 40 log on file2= 10 • C. create dat abase MyDB on NAME= 'File1', size = 40 log on nam e= file2 , size = 10 • D. creat e dat abase MyDB on( NAME= 'File1', size = 40 ) log on(nam e= file2 , size = 10) • E. creat e dat abase MyDB on (NAME= 'File1', size = 40 log on nam e= file2, size = 10 ) Единственный синтаксически правильный ответ — D. В ответе A отсутствуют ключевые слова on и log on. В ответе B используется синтаксис старых версий SQL Server. В ответе C не хватает скобок. В ответе E скобки расставлены неверно. Que stion 3 To find out inform at ion about all files used in t he current dat abase, y ou should use which of t he following SQL st at em ent s? • • • •

A. sp_helpgroup B. sp_helpdb C. sp_helpfile D. sp_list files

Вопрос 3 Какую из перечисленных команд SQL следует использовать для получения информации обо всех файлах текущей базы данных?

converted to PDF by BoJIoc

• • • •

A. sp_helpgroup B. sp_helpdb C. sp_helpfile D. sp_list files

Правильный ответ — C. Ответ A ( sp_helpgroup без имени файла) выводит только сведения о группах. Ответ B ( sp_helpdb) без указания имени выводит только однострочную сводку о базах данных. Хранимая процедура sp_list files не существует. Que stion 4 How do y ou st op users from m odify ing dat a in a dat abase? [ Check all correct answ ers] • • • • •

A. Set t he NOWRI TE dat abase configurat ion opt ion. B. Set t he READONLY file opt ion for every file in t he dat abase. C. Set t he READONLY file group opt ion for every file in t he dat abase. D. Set t he READONLY database configurat ion opt ion. E. I t cannot be done.

Вопрос 4 Как предотвратить модификацию данных в базе пользователями? [ Выберите все правильные ответы] • • • • •

A. Установить параметр конфигурации базы данных NOWRI TE. B. Установить параметр файла READONLY для каждого файла в базе данных. C. Установить параметр группы файлов READONLY для каждого файла в базе данных. D. Установить параметр конфигурации базы данных READONLY. E. Это сделать невозможно.

Правильный ответ — D. Параметр конфигурации базы NOWRI TE не существует, следовательно, ответ A неверен. Параметр группы файлов не может быть установлен для отдельных файлов, поэтому ответ C неверен. Параметра READONLY не существует для файлов, поэтому ответ B тоже неверен. ГЛАВА 5

Определение данных Ключевые термины • • • • • •

Таблица Ограничение Первичный ключ Внешний ключ Тип данных Идентификация

Необходимые знания и приемы • • • •

Создание таблиц Модификация таблиц Работа с временными таблицами Удаление таблиц

Одно из определений реляционной базы данных — «набор взаимосвязанных таблиц». Таблицу проще всего описать в виде списка. Для упрощения идентификации содержимого таблицы делятся на столбцы, содержащие отдельные элементы данных. База данных представляет собой набор таблиц, а таблицы являются наборами столбцов. Создание базы данных начинается с выбора таблиц и содержащихся в них столбцов (процесс физического проектирования базы описан в главе 2). В процессе планирования столбцов проектировщик выбирает тип данных, которые будут в них храниться, а также допустимость неопределенных значений (NULL) — другими словами, является ли значение столбца обязательным или необязательным. Разрешая неопределенные значения, вы тем самым делаете столбец необязательным. Создание таблиц

converted to PDF by BoJIoc

Таблицы создаются командой CREATE TABLE. Создавать таблицы может любой пользователь, получивший это право ( от системного администратора или владельца базы данных) или обладающий ролью системного администратора. Синтаксис команды CREATE TABLE показан в листинге 5 .1 . Листинг 5 .1 . Синтаксис команды CREATE TABLE CREATE TABLE имя_таблицы ( { имя_столбца тип_данных [ NULL | NOT NULL ] [ I DENTI TY [ (начало, приращение ) [ NOT FOR REPLI CATI ON] ] ] [ ROWGUI DCOL ] [ CONSTRAI NT имя_ограничения] { { PRI MARY KEY | UNI QUE } [ CLUSTERED | NONCLUSTERED] [ WI TH [ FI LLFACTOR = коэффициент_заполнения] [ ON { группа_файлов | DEFAULT} ] | [ FOREI GN KEY] REFERENCES ссылка_таблица [ ( ссылка_столбец ) ] [ NOT FOR REPLI CATI ON] | DEFAULT выражение_константа | CHECK [ NOT FOR REPLI CATI ON] (логическое_выражение) } ] [ .. .n] | имя_столбца AS вычисляемое_выражение | < ограничение_ таблицы> } [ , . . .n] ) [ ON { группа_файлов | DEFAULT} ] [ TEXTI MAGE_ ON { группа_ файлов | DEFAULT} ] < определение_столбца> : : = { имя_столбца тип_данных } [ NULL | NOT NULL ] [ I DENTI TY [ (начало, приращение ) [ NOT FOR REPLI CATI ON] ] ] [ ROWGUI DCOL ] [ < ограничение_столбца> : : = [ CONSTRAI NT имя_ограничения] { { PRI MARY KEY | UNI QUE } [ CLUSTERED | NONCLUSTERED] [ WI TH [ FI LLFACTOR = коэффициент_заполнения] ] [ ON { группа_файлов | DEFAULT} ] | [ FOREI GN_KEY] REFERENCES ссылка_таблица [ ( ссылка_столбец ) ] [ NOT FOR REPLI CATI ON] | DEFAULT выражение_константа | CHECK [ NOT FOR REPLI CATI ON] (логическое_выражение) } ] [ . ..n] Пример CREATE TABLE aut hors_short (aut hor_id int not null, last nam e varchar(40) not null, first nam e v archar(20) null) В приведенном примере создается таблица с именем aut hors_short , предназначенная для хранения списка авторов. Таблица состоит из столбцов для фамилий и имен, а также кодов авторов. Структура таблицы показана в табл. 5 .1 . Имена таблиц

converted to PDF by BoJIoc

Имена таблиц ограничиваются 128 символами. Они должны быть уникальными по отношению к владельцу — то есть две таблицы с одинаковыми именами не могут принадлежать одному владельцу, но у другого пользователя может быть таблица с тем же именем. Столбцы Таблица может содержать до 1024 столбцов. Для каждого столбца определяются как минимум имя и тип данных. Имена столбцов имеют длину до 128 символов и являются уникальными в пределах таблицы. Имена столбцов соответствуют обычным правилам выбора имен идентификаторов и состоят из букв, цифр и служебных символов (_, @ и # ) . Таблица 5.1. Таблица authors aut hor_ id last nam e

first nam e

1

Bennet

Abraham

2

Blot chet -Halls Reginald

3

DeFrance

Chery l

Типы данных В табл. 5 .2 перечислены основные типы данных, используемые в SQL Server при создании столбцов. Совет При выборе типа данных столбца будьте внимательны. Например, для хранения данных типа int необходимо больше места, чем для t iny int . Следовательно, при создании столбца для хранения целых величин следует определить его максимальные значения. Если содержимое столбца никогда не превышает 10, логичнее выбрать тип t iny int , который позволяет более эффективно расходовать место хранения данных. Таблица 5.2. Основные типы данных в базах Тип данных

Описание

BI T

Целое значение 0 или 1.

I NT

Целое число в интервале от - 2147483648 до 2147483647.

SMALLI NT

Целое число в интервале от - 32768 до 32767.

TI NYI NT

Целое число в интервале от 0 до 255.

DECI MAL(p,s)

Числовые данные с фиксированной точностью ( p) и количеством цифр после запятой ( s) . Интервал: от -1038 -1 до 1038-1.

NUMERI C(p,s)

Синоним Decim al.

FLOAT

Число с плавающей запятой. Интервал: от - 1.79 E+ 308 до 1 .79E+ 308 .

REAL

Число с плавающей запятой. Интервал: от - 3.40 E+ 38 до 3.40 E+ 38.

CHAR(N)

Строка фиксированной длины (n). Максимальная длина - 8000 символов.

VARCHAR(n)

Строка переменной длины (n). Максимальная длина - 8000 символов.

TEXT

Символьные данные переменной длины. Максимальная длина - 2147483647 символов.

MONEY

Денежная сумма. Интервал: от -922337203685477.5808 до 922 .337.203.685.5807.

SMALLMONEY

Денежная сумма. Интервал: от -214748.3648 до 214748.3647 .

DATETI ME

Дата и время. Интервал: от 1 января 1753 г. до 31 декабря 9999 г. Обратите внимание: время хранится в виде интервалов продолжительностью 3,33 миллисекунды, поэтому точность данных составляет 3,33 миллисекунды.

SMALLDATETI ME

Дата и время. Интервал: от 1 января 1900 г. до 6 июня 2079 г. Точность: 1 минута.

TI MESTAMP

Пометка времени. Величина, назначаемая компьютером и используемая для управления изменениями.

converted to PDF by BoJIoc

UNI QUEI DENTI FI ER Глобально-уникальный идентификатор (GUI D). BI NARY(n)

Двоичные строковые данные фиксированной длины ( n) . Максимальная длина: 8000 байт.

VARBI NARY

Двоичные строковые данные переменной длины ( n) . Максимальная длина: 8000 байт.

I MAGE

Двоичные данные. Максимальная длина: 2 Гбайт.

NCHAR

Символьная строка фиксированной длины в многобайтовой кодировке ( Unicode) . Максимальная длина: 4000 символов.

NTEXT

Текстовые данные переменной длины в многобайтовой кодировке (Unicode) . Максимальная длина: 1073741823 символов.

NVARCHAR

Символьная строка переменной длины в многобайтовой кодировке ( Unicode). Максимальная длина: 4000 символов.

SYSNAME

Синоним nvarchar(128) .

N ULL/ NOT NULL Если столбец создается с параметром NULL, то при вводе данных в базу столбец можно оставить пустым. Если столбец содержит обязательные данные, его следует создавать с параметром NOT NULL. По умолчанию столбцы создаются с параметром NOT NULL (хотя в ODBC этот параметр изменяется) . Уникальные идентификаторы Теория реляционных баз данных требует, чтобы в базе существовал способ однозначной идентификации записей. Иногда однозначная идентификация записей реализуется просто, но при отсутствии удобного способа приходится использовать ключ с последовательным приращением или другой неестественный механизм. В SQL Server существуют столбцы счетчика, в которых уникальность значений обеспечивается автоматически. Столбцы счетчика Столбец счетчика представляет собой автоматизированный столбец, генерирующий уникальные значения с некоторым приращением. Они часто используются для определения уникальности записей таблицы. Столбцы счетчика не могут содержать неопределенные значения и должны относиться к числовому типу данных (например, int , sm allint , t inyint , num eric(p,0) или decim al( p,0) ). Если при объявлении столбца не указаны начальное значение и приращение, столбец действует как счетчик с начальным значением 1 и приращением 1. Внимание Нумерация столбцов счетчика может содержать пропуски, обусловленные незавершенными транзакциями или непредвиденными сбоями сервера. При выборе типа данных для столбца счетчика следует быть внимательным. Как видно из предыдущего примера, недостаточный размер столбца счетчика может вызвать немало проблем. CREATE TABLE too_short (id_num t inyint I DENTI TY, nam e v archar(25) NOT NULL) В этом примере столбец счетчика объявлен с типом t inyint , для которого максимальное значение равно 255 . При достижении максимума таблица будет отвергать все дальнейшие операции вставки. Столбец счетчика не гарантирует уникальности значений. ROW GUI DCOL Свойство столбца ROWGUI DCOL в сочетании с типом данных UNI QUEI DENTI FI ER обеспечивает глобальную уникальность значения для всех компьютеров сети. Такая возможность бывает полезной при работе с несколькими базами данных, содержимое которых требуется объединить.

converted to PDF by BoJIoc

Ограничения Ограничения накладывают определенные условия на данные, вводимые в таблицу. Условием может быть уникальность значения, принадлежность некоторому интервалу или наличие первичного ключа, соответствующего внешнему ключу ( ограничения ссылочной целостности). SQL Serv er поддерживает четыре типа ограничений (PRI MARY KEY, FOREI GN KEY, CHECK и UNI QUE) . Все четыре типа могут быть объявлены в определении столбца или присоединены в конце определения таблицы. PRI M ARY KEY Ограничения первичного ключа требуют, чтобы содержимое ограничиваемых столбцов было уникальным. Объявление первичного ключа гарантирует однозначную идентификацию записей таблицы (ограничение PRI MARY KEY или UNI QUE является обязательным требованием для обеспечения ссылочной целостности посредством ограничения внешних ключей; другими словами, если вы начинаете определять внешние ключи, ссылающиеся на таблицы, для внешнего ключа должен быть определен первичный ключ) . В следующем фрагменте ограничение первичного ключа объявляется при объявлении столбца. Обратите внимание на то, что ограничение включено в объявление столбца aut hor_id. Такой способ подходит для первичных ключей, состоящих из одного столбца, но для объявлениямногостолбцового первичного ключа потребуется объявление на уровне таблицы. В листингах 5.2 и 5.3 приведены примеры команды CREATE TABLE с объявлением первичного ключа. Листинг 5 .2 . Создание таблицы с объявлением первичного ключа на уровне столбца CREATE TABLE aut hors_short (aut hor_id int NOT NULL CONSTRAI NT aut hor_pk PRI MARY KEY, last nam e varchar(40) NOT NULL, first nam e v archar(20) NULL) Листинг 5.3 делает то же, что и листинг 5.2. Единственное отличие заключается в том, что ограничение объявляется после объявления последнего столбца ( first nam e). Обратите внимание на то, что в объявлении таблицы за ключевыми словами PRI MARY KEY следует список ограничиваемых столбцов. Это дает возможность объявлять многостолбцовые первичные ключи. Листинг 5 .3 . Создание таблицы с объявлением первичного ключа на уровне таблицы CREATE TABLE aut hors_short (aut hor_id int NOT NULL, last nam e varchar(40) NOT NULL, first nam e v archar(20) NULL, CONSTRAI NT aut hor_pk PRI MARY KEY (aut hor_id) ) Указывать ключевое слово CONSTRAI NT с именем ограничения необязательно. Тем не менее, если имя не указано, SQL Server присваивает его за вас. Для первичного ключа также по умолчанию генерируется кластерный индекс (индексы рассматриваются в главе 9 ). У ограничения PRI MARY KEY существует альтернатива — ограничение UNI QUE. Отличие между ними заключается в том, что ограничение UNI QUE допускает ввод неопределенных значений и генерирует некластерный индекс. FOREI GN KEY Как упоминалось выше, база данных представляет собой набор взаимосвязанных таблиц. Ограничение внешнего ключа является одним из способов выражения отношений, существующих между таблицами. При установке ограничения внешнего ключа SQL Server обращается к столбцу первичного ключа связанной таблицы и проверяет совпадение данные в общих столбцах. Это становится обязательным требованием при обеспечении ссылочной целостности. Пример ссылочного ограничения приведен в листинге 5.4. Листинг 5 .4 . Команда CREATE TABLE с ограничением ссылок на уровне столбца

converted to PDF by BoJIoc

CREATE TABLE book_aut hor (book_nam e varchar(30) NOT NULL, Aut hor_id int NOT NULL CONSTRAI NT aut hor_ fk REFERENCES aut hors_short ( aut hor_id) ) Листинг 5.4 создает таблицу, содержащую имена книг и имена авторов. Ограничение REFERENCES требует, чтобы значение author_id уже присутствовало в таблице aut hors_short . Листинг 5 .5 . Команда CREATE TABLE с ограничением внешнего ключа на уровне таблицы CREATE TABLE book_aut hor (book_nam e varchar(30) NOT NULL, aut hor_ id int NOT NULL, CONSTRAI NT aut hor_ fk FOREI GN KEY ( aut hor_ id) REFERENCES aut hors_short ( aut hor_id)) Листинг 5.5 делает то же, что и предыдущий. Отличаются только синтаксис и функциональность. Во втором примере устанавливается ограничение уровня таблицы, поэтому в нем использована форма с ключевым словом FOREI GN_KEY, за которым указывается проверяемый столбец (столбцы) таблицы book_aut hors. Ограничение REFERENCES определяет таблицу aut hors_short и столбец aut hor_ id, в котором должны находиться существующие данные. Многостолбцовые ограничения внешнего ключа должны объявляться на уровне таблицы. Они ссылаются на столбцы, объявленные в качестве первичных ключей или имеющие уникальные индексы. Как и для ограничений первичного ключа, часть CONSTRAI NT ИмяОграничения можно опустить; тем не менее, SQL Server присвоит ограничению имя за вас. Внимание Создание ограничений внешнего ключа не приводит к индексированию столбца, указанного в ограничении. CHECK В некоторых ситуациях проверяется не существование данных (как в ограничении внешнего ключа), а их правильность. Деловые правила могут предъявлять определенные требования к вводимым данным. Для их реализации можно воспользоваться ограничением проверки. Кроме того, ограничения проверки позволяют сравнивать данные из разных столбцов — при условии, что столбцы находятся в одной таблице, а ограничение объявлено на уровне таблицы. В листинге 5.6 создается таблица a_ aut hors; в ней хранятся записи авторов, имена которых начинаются с буквы A. Листинг 5 .6 . Команда CREATE TABLE с ограничением проверки на уровне столбца CREATE TABLE a_aut hors (aut hor_id int NOT NULL, last nam e varchar(40) NOT NULL CONSTRAI NT last nam e_ck CHECK ( last nam e LI KE "A% " ), first nam e v archar(20 ) NULL) Для столбца last nam e установлено ограничение уровня столбца. Оно проверяет первую букву всех фамилий, вводимых в таблицу ( листинг 5 .7 ). Листинг 5 .7 . Команда CREATE TABLE с ограничением проверки на уровне таблицы CREATE TABLE a_aut hors (aut hor_id int NOT NULL, last nam e varchar(40) NOT NULL, first nam e v archar(20) NULL, CONSTRAI NT last nam e_ck CHECK ( last nam e LI KE "A% " )) Листинг 5.7 функционально идентичен листингу 5.6, только ограничение объявляется на уровне таблицы. Преимущество такого объявления состоит в том, что проверка позволяет сравнивать данные столбца с другим столбцом в той же таблице.

converted to PDF by BoJIoc

Значения по умолчанию При вводе данных в базу столбцы либо заполняются, либо остаются неопределенными. Иногда неопределенные значения запрещаются из-за деловых правил или параметра NOT NULL. В таких ситуациях требуется задать значение по умолчанию, для этой цели используется параметр DEFAULT. Пример определения значения по умолчанию приведен в листинге 5 .8 . Листинг 5 .8 . Примеры определений значений по умолчанию / * Объявление на уровне столбца * / CREATE TABLE book_sales (book_id int NOT NULL, Volum e int NOT NULL CONSTRAI NT v ol_def DEFAULT 0 ) / * Объявление на уровне таблицы * / CREATE TABLE book_sales (book_id int NOT NULL, Volum e int NOT NULL, CONSTRAI NT v ol_def DEFAULT 0 FOR Volum e) Обратите внимание: при объявлении на уровне таблицы DEFAULT сопровождается ключевым словом FOR, определяющим конкретный столбец таблицы. Информацию о значениях по умолчанию, как и об остальных ограничениях, можно получить с помощью хранимых процедур sp_help или sp_helpconst raint . Вычисляемые столбцы SQL Serv er позволяет создавать виртуальные столбцы, значения которых вычисляются с использованием функций, констант или других столбцов таблицы. Вычисляемые столбцы определяются в виде выражений, которые представляют собой формулы T- SQL. В листинге 5.9 приведен пример таблицы с вычисляемым столбцом. Листинг 5 .9 . Команда CREATE TABLE с вычисляемым столбцом CREATE TABLE book_price (book_id int NOT NULL, whsl_price sm allm oney NOT NULL, m arkup_pct num eric (5 ,2 ) NOT NULL, m srp AS whsl_price * (1+ (m ark up_ pct / 100 )) ) Команда создает таблицу, состоящую из трех столбцов: book_ id, whsl_ price и m arkup_pct . Столбец m srp является вычисляемым и не сохраняется в таблице. В результате четыре столбца занимают место трех. Модификация таблиц После создания таблицы в базе данных в нее можно внести изменения. К числу возможных модификаций относится добавление столбцов, изменение типов данных в существующих столбцах, объявление первичных ключей и т. д. Обратите внимание на то, что вы не можете удалить ограничение первичного ключа при наличии ограничения внешнего ключа, ссылающегося на него. Полный синтаксис команды ALTER TABLE показан в листинге 5.10 . Листинг 5 .1 0 . Синтаксис команды ALTER TABLE ALTER TABLE имя_таблицы { [ WI TH CHECK | WI TH NOCHECK] { [ ALTER COLUMN имя_столбца { [ новый_ тип_данных [ ( точность[ , количество_ цифр_после_запятой] ) ] [ NULL | NOT NULL ] ] | [ { ADD | DROP} ROWGUI DCOL ]

converted to PDF by BoJIoc

} ] | ADD { [ { имя_столбца тип_данных } [ NULL | NOT NULL ] [ I DENTI TY [ (начало[ , приращение] ) [ NOT FOR REPLI CATI ON] ] ] [ ROWGUI DCOL ] ] | имя_столбца AS вычисляемое_выражение | [ [ CONSTRAI NT имя_ограничения] { [ { PRI MARY KEY | UNI QUE } [ CLUSTERED | NONCLUSTERED] { ( столбец[ ,.. .n] ) } [ WI TH [ FI LLFACTOR = коэффициент_ заполнения] ] [ ON ( группа_ файлов | DEFAULT} ] ] | FOREI GN KEY [ (столбец[ ,.. .n] ) ] REFERENCES ссылка_таблица [ ( ссылка_столбец[ ,.. .n] ) ] [ NOT FOR REPLI CATI ON] | DEFAULT выражение_константа [ FOR столбец] | CHECK [ NOT FOR REPLI CATI ON] (логическое_выражение) }] } [ ,. ..n] | DROP { [ CONSTRAI N] ограничение | COLUMN столбец } [ ,. ..n] | { CHECK | NOCHECK} CONSTRAI NT { ALL | ограничение[ ,...n] } } } Дополнение таблиц После создания таблицы в нее можно добавить новые столбцы, ограничения и значения по умолчанию. Добавление столбцов после определения таблицы осуществляется командой ALTER TABLE. Пример приведен в листинге 5 .11. Листинг 5 .1 1 . Команда ALTER TABLE с новыми столбцами и ограничениями ALTER TABLE aut hors_short ADD MI char(1 ) NULL CONSTRAI NT MI _ck CHECK (MI like "[ A-Z] " ) ALTER TABLE aut hors_short ADD MI char(1 ) NULL, CONSTRAI NT MI _ck CHECK (MI LI KE "[ A-Z] " ) Две команды ALTER TABLE, приведенные в листинге 5.11, функционально идентичны. В первой ограничение проверки объявляется на уровне столбца, а во второй — на уровне таблицы. Модификация таблиц с помощью команды ALTER TABLE ADD SQL Serv er предполагает, что столбец может содержать неопределенные значения, если в объявлении не указано обратное. Если новый столбец не допускает неопределенных значений, необходимо определить для него значение по умолчанию. Новые столбцы могут представлять собой вычисляемые выражения и объявляться с ограничениями уровня столбцов. Удаление из таблиц

converted to PDF by BoJIoc

Из созданной таблицы можно удалить столбцы или ограничения. При удалении ограничений следует помнить, что выполнению команды могут помешать некоторые зависимости. Например, если столбец является первичным ключом, SQL Server не позволит удалить его до тех пор, пока не будет снято соответствующее ограничение. Если в другой таблице существует ссылка на столбец, SQL Server также не позволит удалить его до снятия ограничения. Синтаксис команды удаления показан в листинге 5.12. Листинг 5 .1 2 . Примеры команды ALTER TABLE DROP ALTER TABLE aut hors_short DROP CONSTRAI NT MI _ck ALTER TABLE aut hors_short DROP COLUMN MI Модификация столбцов Иногда люди делают неверные предположения относительно типа данных, которые они собираются хранить в таблице. Неверный выбор приводит к неэффективному хранению данных или же данные могут оказаться слишком большими и не помещаться в столбцах. В таких ситуациях следует изменить исходное определение столбцов командой ALTER TABLE. Пример использования команды ALTER TABLE приведен ниже: ALTER TABLE aut hors_short ALTER COLUMN first nam e varchar(40 ) В этом примере команда ALTER TABLE используется для увеличения столбца. При первоначальном объявлении таблицы aut hors_short столбец first nam e был объявлен с типом v archar(25). Команда ALTER TABLE расширяет его до 40 символов. Примечание При модификации столбца должно существовать неявное преобразование старого типа данных в новый; новый тип данных не может иметь тип Tim est am p. Если модифицированный столбец является столбцом счетчика, новый тип данных должен быть допустимым для столбцов счетчика. Временные таблицы Временные таблицы похожи на обычные, однако они не предназначены для постоянного хранения данных. Во временных таблицах часто хранятся данные, которые должны быть модифицированы или использованы позднее. Они создаются, удаляются и используются как обычные таблицы. Ниже перечислены главные отличия временных таблиц от обычных: • Имена временных таблиц должны начинаться с символов # или # # . • Имена временных таблиц ограничиваются 116 символами. • Временные таблицы удаляются при отключении пользователя от базы данных. • Временные таблицы используются так, как будто они входят в текущую базу данных, однако в действительности данные хранятся в TEMPDB. В SQL Serv er существуют два типа временных таблиц: локальные и глобальные. Локальные временные таблицы Локальные временные таблицы доступны лишь для своего владельца. Имена локальных временных таблиц всегда начинаются с префикса # . В следующем фрагменте создается локальная временная таблица: CREATE TABLE # t em p1 ( a int NULL, b varchar(25) NULL) Команда создает временную таблицу с именем # t em p1. Синтаксис команды отличается только тем, что имя таблицы начинается с символа # . Глобальные временные таблицы

converted to PDF by BoJIoc

Глобальные временные таблицы похожи на локальные, за исключением того, что они доступны для всех пользователей, а их имена должны начинаться с префикса # # . Следующий фрагмент создает глобальную временную таблицу: CREATE TABLE # # t em p2 ( a int NULL, b varchar(25) NULL) Когда временная таблица становится ненужной, ее можно удалить, как и любую другую таблицу. Удаление таблиц Ненужные таблицы удаляются командой DROP. Удаленная таблица навсегда пропадает из базы данных. Это действие отменить невозможно. Команда DROP TABLE имеет следующий синтаксис: DROP TABLE имя_таблицы Пример DROP TABLE aut hors_short Внимание Удалять можно только пользовательские таблицы, но не системные таблицы SQL Server. Таблицу, на которую ссылаются какие-либо ограничения, удалить нельзя. Перед удалением таблицы эти ограничения необходимо отключить или удалить. Таблица может быть удалена только владельцем. Удаленную таблицу нельзя восстановить — « откат» в этой операции невозможен. Таблицу приходится создавать заново. Совет Рекомендуем хранить тексты всех команд, создающих ваши объекты, в отдельном файле, чтобы в экстренной ситуации (нарушении данных, миграции базы и т. д.) их можно было бы построить заново. Кроме того, это упрощает процесс миграции между различными системами. Примеры экзаменационных вопросов Que stion 1 What is t he m axim um lengt h of a t able nam e for SQL Serv er? • • • • •

A. 128. B. 116. C. 90 . D. 30 . E. None of t he above.

Вопрос 1 Какова максимальная длина имени таблицы в SQL Server? • • • • •

A. 128. B. 116. C. 90 . D. 30 . E. Ни одно из перечисленных значений.

Правильный ответ — A. Тем не менее, в прежних версиях SQL Server максимальная длина имени была равна 30 символам. Que stion 2 What is t he m axim um charact er lengt h for a char or varchar dat at ype? • • • •

A. 255. B. 128. C. 8000. D. 2000.

converted to PDF by BoJIoc

• E. None of t he above. Вопрос 2 Чему равно максимальное количество символов в типе данных char или varchar? • • • • •

A. 255. B. 128. C. 8000. D. 2000. E. Ни одно из перечисленных значений.

Правильный ответ — C. В прежних версиях SQL Serv er эти типы данных могли содержать лишь до 255 символов. Que stion 3 Which of t he following are t rue about local tem porary t ables? [ Check all correct answ ers] • • • • •

A. Their nam es are preceded by # . B. They are st ored in t em pdb. C. The are accessible t o ot her users. D. Their nam es are preceded by # # . E. They can be dropped like norm al t ables.

Вопрос 3 Какие из следующих утверждений истинны для локальных временных таблиц? [ Выберите все правильные ответы] • • • • •

A. Их имена начинаются с # . B. Они хранятся в t em pdb. C. Они доступны для других пользователей. D. Их имена начинаются с # # . E. Они могут быть удалены, как обычные таблицы.

Правильные ответы — A, B и E. Ответы C и D относятся к глобальным временным таблицам. Que stion 4 What dat at ypes are v alid for an ident it y colum n? [ Check all correct answers] • • • • •

A. num eric (5,1) B. decim al (4 ,0 ) C. int D. bit E. t inyint

Вопрос 4 Какие типы данных допускаются для столбцов счетчика? [ Выберите все правильные ответы] • • • • •

A. num eric (5,1) B. decim al (4 ,0 ) C. int D. bit E. t inyint

Правильные ответы — B, C и E. Ответ A неверен, поскольку столбец счетчика должен содержать целые числа. Тип данных bit , приведенный в варианте D, слишком мал для столбца счетчика и потому недопустим. Que stion 5 A foreign key const raint can be creat ed provided t hat : • • • • •

A. The referenced t able already exist s. B. I t s referenced colum n(s) have a prim ary key or unique const raint . C. The const raint nam e is unique wit hin t he database. D. All of t he above. E. None of t he above.

Вопрос 5 Ограничение внешнего ключа может быть создано при следующем условии:

converted to PDF by BoJIoc

• A. Таблица, на которую оно ссылается, уже существует. • B. Столбец ( столбцы), на который оно ссылается, имеет ограничение первичного ключа или уникальности. • C. Имя ограничения уникально в базе данных. • D. Все из перечисленного выше. • E. Ничего из перечисленного выше. Правильный ответ — D. Все остальные ответы неполны. Que stion 6 Which of t he following correct ly com plet es t he phrase «A t able m ay be dropped ...»: • • • • •

A. by using t he ALTER TABLE t able_nam e DROP com m and. B. by any user wit h access t o t he t able. C. if t here are no const raints referencing it . D. All of t he above. E. None of t he above.

Вопрос 6 Какой из следующих вариантов правильно завершает фразу «Таблица может быть удалена...» : • • • • •

A. командой ALTER TABLE имя_таблицы DROP. B. любым пользователем, имеющим доступ к таблице. C. если не существует ограничений, ссылающихся на нее. D. Все из перечисленного выше. E. Ничего из перечисленного выше.

Правильный ответ — C. Ответ А неверен, поскольку команда ALTER TABLE DROP удаляет столбцы, а не таблицы. Ответ B неверен, поскольку таблица может быть удалена только своим владельцем (независимо от того, кто ее создал) . ГЛАВА 6

Выборка данных Ключевые термины • • • • • • • • •

Команда SELEСT Подзапрос Агрегат Союз SQL Объединение таблиц Использование подзапросов Уточнение имен объектов Запросы к типам данных t ext и im age

Необходимые знания и приемы • • • • • • • • • •

Отбор записей Использование функций Использование ключевого слова lik e Форматирование и сортировка данных Группировка результатов Внешнее объединение Внутреннее объединение Ортогональное объединение Итоговый набор Производная таблица

Хранение данных в таблице принесет пользу лишь в том случае, если у вас есть возможность получить эти данные. Как нетрудно догадаться, для обращения к данным в таблицах Microsoft SQL Server используется язык SQL ( St ruct ured Query Language). В SQL Server выборка данных осуществляется командой SELECT.

converted to PDF by BoJIoc

Внимание SQL является одним из стандартных уровней доступа к базе данных в соответствии со стандартом ANSI . Одна из его главных целей — изоляция физических структур данных от пользователя, что приводит к упрощению работы с данными. В SQL Server реализовано расширение ANSI SQL, которое называется Transact -SQL (T- SQL). Структура команды SELECT Команда SELECT состоит из семи основных частей: • • • • • • •

Список выборки; FROM; WHERE; GROUP BY; HAVI NG; ORDER BY; COMPUTE.

Все части команды SELECT, кроме списка выборки, являются необязательными. Порядок их перечисления строго фиксирован. Синтаксис команды SELECT приведен в листинге 6.1. Листинг 6 .1 . Синтаксис команды SELECT SELECT [ ALL | DI STI NCT ] [ TOP n [ PERCENT] [ WI TH TI ES] список_выборки [ I NTO имя_таблицы ] [ FROM { имя_ таблицы | имя_представления} [ , { имя_ таблицы | имя_представления} ... ] [ WHERE условия_поиска ] [ GROUP BY выражение_без_агрегатов [ , выражение_без_агрегатов ... ] [ WI TH CUBE| ROLLUP] ] [ HAVI NG условия_поиска ] [ ORDER BY { имя_столбца | список_выборки } [ ASC | DESC ] [ , { имя_столбца | список_выборки } [ ASC | DESC ] . .. ] ] [ COMPUTE агрегат(имя_столбца) [ , агрегат( имя_столбца) ] ... [ BY имя_столбца [ , имя_столбца ] ... ] ] ] После выполнения команды SELECT вы получаете от SQL Server итоговый набор (таблицу результатов) . Итоговый набор состоит из трех частей: столбцов, заголовков столбцов и записей. Итоговый набор может содержать один или несколько столбцов. Кроме того, он может содержать пустые заголовки столбцов, а также ноль и более записей данных. Примечание Имена таблиц и столбцов могут быть настроены так, чтобы в них различался или не различался регистр символов. В ключевых словах SQL регистр никогда не учитывается. В SQL Serv er имена могут заключаться в квадратные скобки, например [ имя_объекта] . В следующем фрагменте приведены два варианта команды SELECT, с квадратными скобками и без них: SELECT [ d] / [ discount t ype] FROM [ dbo] .[ discount ] d -- Эквивалентная команда select SELECT d.discount t ype FROM dbo.discount d В следующих разделах мы подробнее рассмотрим каждую из семи частей команды SELECT. Чтобы изложение материала было последовательным, части будут описываться в порядке их следования в команде SELECT. Итак, начнем со списка выборки. Список выборки Начало команды SELECT выглядит следующим образом:

converted to PDF by BoJIoc

SELECT [ ALL | DI STI NCT ] [ TOP n [ PERCENT] [ WI TH TI ES] список_выборки В этой секции вы указываете, какие столбцы включаются в итоговый набор команды SELECT. Столбцы возвращаются в порядке их перечисления в списке выборки. При выполнении команды SELECT возвращается виртуальная таблица результатов (итоговый набор). Таблица может содержать константы, столбцы, функции и производные столбцы. Например, следующая команда возвращает константу ('constant value') , столбец базы данных (Colum n1 ), функцию (@@SERVERNAME) и производный столбец (Colum n2 + Colum n2) : SELECT 'constant v alue', Colum n1, @@SERVERNAME, Colum n2+ Colum n2 FROM MyTable Чтобы список выборки содержал все столбцы таблицы, можно либо перечислить имена всех столбцов, либо включить в список выборки символ «звездочка» (* ). Если список выборки содержит звездочку, возвращаются все столбцы таблицы. Символ * может указываться наряду с ограничениями, столбцами и производными столбцами. Следующий пример демонстрирует использование звездочки в команде SELECT: SELECT * FROM MyTable SELECT * , Colum n1 + Colum n2 FROM MyTable По умолчанию команда SELECT возвращает все записи, включая дубликаты. Чтобы явно запросить все записи, поместите ключевое слово ALL перед списком выборки. Без ключевого слова ALL всегда можно обойтись; оно поддерживается только для того, чтобы TSQL соответствовал стандарту ANSI . Чтобы команда SELECT возвращала только уникальные записи, поставьте перед списком выборки ключевое слово DI STI NCT. Ключевое слово DI STI NCT (или ALL, если оно используется) должно находиться сразу же после ключевого слова SELECT: SELECT DI STI NCT 'const ant value', Colum n1, @@SERVERNAME, Colum n2+ Colum n2 FROM MyTable Команда SELECT позволяет присвоить значения переменным или получить итоговый набор. В одной команде SELECT нельзя сделать и то, и другое. Например, если @a — целая переменная, то следующая команда SELECT верна: SELECT @a = 5 Однако следующая команда SELECT недопустима: SELECT @a = 5 , au_id FROM aut hors При выполнении команды SELECT в итоговый набор для каждого возвращаемого столбца включается заголовок по умолчанию. Значения констант, функции и производные столбцы имеют пустые заголовки. Заголовок столбца по умолчанию совпадает с его именем. Так, в предыдущем примере для константы был бы создан пустой заголовок, для столбца Colum n1 — заголовок Colum n1, а для @@SERVERNAME и Colum n2+ Colum n2 — пустые строки. Чтобы изменить заголовки столбцов, назначьте им псевдонимы в списке выборки. В SQL Server существуют три формы назначения заголовков для итогового набора: заголовок = столбец столбец заголовок столбец AS заголовок Если заголовок столбца содержит какие-либо специальные символы (например, пробелы) , его необходимо заключить в кавычки. Совет

converted to PDF by BoJIoc

MS SQL Server позволяет использовать в командах SQL как апострофы (') , так и кавычки ( ") . В стандарте ANSI для имен объектов и заголовков столбцов со специальными символами используются кавычки, а для всего остального — апострофы. Мы рекомендуем следовать этим правилам. Для определения таблиц, содержащих искомые данные, используется список выборки в сочетании с секцией FROM. Секция FROM Секция FROM определяет источник(и) данных для выборки. Вы можете обращаться к данным из таблиц, представлений или производных таблиц. Синтаксис секции FROM приведен в листинге 6 .2 . Листинг 6 .2 . Синтаксис секции FROM FROM { < таблица_или_представление> | (команда_выборки) [ AS] псевдоним_ таблицы (псевдоним_столбца , . ..] | < таблица_или_представление> | CROSS JOI N < таблица_или_представление> { { I NNER | { FULL | LEFT | RI GHT } [ OUTER] JOI N } < таблица_или_представление> ON < условие_объединения> } [ , .. .n] Без секции FROM команда SELECT может лишь присваивать значения переменным, возвращать переменные и выполнять функции. Команда SELECT может содержать до 256 таблиц, представлений или производных таблиц. Приведем пример с двумя таблицами: SELECT * FROM MyTable, My Ot herTable Эта команда означает, что вы хотите выбрать все столбцы из таблиц MyTable и MyOt herTable. Для упрощения команд SQL можно воспользоваться псевдонимами таблиц. Псевдонимы таблиц Псевдоним ( alias) представляет собой более короткое или легко запоминающееся имя для таблицы с длинным или трудным именем. Если для таблицы задается псевдоним, то вы уже не сможете ссылаться на нее по имени в командах SELECT, если только таблица не упоминается в секции FROM несколько раз: SELECT M.Colum n, MyTable.Colum n2 FROM My Table M, MyTable В этом примере первому экземпляру MyTable назначается псевдоним M. Секция FROM также содержит MyTable без псевдонима. Столбец Colum n1 берется из экземпляра-псевдонима, а столбец Colum n2 — из обычного экземпляра MyTable. Следующий пример демонстрирует применение псевдонимов для сокращения длинного имени таблицы: SELECT M.Colum n1 FROM My VeryVeryVery VeryVeryVeryVeryLongTableNam e AS M В этом примере My VeryVeryVeryVeryVeryVery VeryLongTableNam e — таблица, а M — псевдоним. Поскольку таблице назначен псевдоним, вы не можете сослаться на нее в команде SELECT без указания псевдонима. Псевдонимы также применяются при создании производных таблиц. Производная таблица возникает в том случае, когда секция FROM вместо имени таблицы содержит команду SELECT. В этом случае данные производной таблицы состоят из данных, которые возвращаются командой SELECT, «встроенной» в секцию FROM. Если вы используете производную таблицу, ей необходимо назначить псевдоним: SELECT * FROM ( SELECT * FROM m ast er..sysprocesses) B В этом примере SELECT * FROM m ast er..sysprocesses является производной таблицей, которой назначается псевдоним B.

converted to PDF by BoJIoc

Для упрощения команды SQL в секции FROM можно также назначить псевдонимы отдельным столбцам: SELECT AA FROM (SELECT LongColum nNam e FROM MyTable WHERE b ! = 123 ) AS t 1 (AA) Пример создает псевдоним с именем t1 для таблицы, содержащей столбец LongColum nNam e таблицы MyTable. Столбцу назначается псевдоним AA. Примечание При использовании производной таблицы вы обязаны предоставить псевдонимы для всех производных столбцов. Псевдонимы таблиц и столбцов упрощают запись объектов, используемых в запросе. Полные имена объектов часто делают команды SQL излишне громоздкими. Уточнение имен объектов Уточненное имя таблицы записывается в форме ИмяСервера.ИмяБазы.ИмяВладельца.ИмяТаблицы: • ИмяСервера — по умолчанию — текущий сервер; • ИмяБазы — по умолчанию — текущая база данных; • ИмяВладельца — по умолчанию сначала проверяется, принадлежит ли таблица текущему пользователю; если не принадлежит, по умолчанию используется владелец базы данных; • ИмяТаблицы — имя таблицы; должно быть задано. Если задано имя сервера, необходимо либо задать имена базы и владельца, либо воспользоваться заполнителем (..). Если задано имя базы данных, необходимо либо задать имя владельца, либо включить заполнитель: pubs.dbo.t it les pubs..t it les ot herserver.y ourdb.user2 .TheTable В первом примере pubs — имя базы данных, dbo — владелец, а t it les — таблица. Во втором примере pubs — база данных, владелец таблицы — текущий пользователь или владелец базы данных, а таблица — t it les. В третьем примере используется другой сервер с именем ot herserver, база данных yourdb, владелец user2 и таблица TheTable. При использовании псевдонима таблицы уточненное имя столбца записывается в форме ПсевдонимТаблицы.ИмяСтолбца. Если псевдоним таблицы не используется, уточненное имя столбца записывается в форме ИмяСервера.ИмяБазы.ИмяВладельца.ИмяТаблицы.ИмяСтолбца: • ИмяСервера — по умолчанию — текущий сервер. • ИмяБазы — по умолчанию — текущая база данных. • ИмяВладельца — по умолчанию сначала проверяется, принадлежит ли таблица текущему пользователю; если не принадлежит, по умолчанию используется владелец базы данных. • ИмяТаблицы — имя таблицы, содержащей столбец. • ИмяСтолбца — имя столбца. Если имя столбца задается без уточнения, оно должно быть уникальным для всех таблиц секции FROM, поскольку в противном случае SQL Server не сможет определить, из какой таблицы следует брать столбец. При указании уточненного имени уточняющий префикс столбца должен точно совпадать с уточненным именем таблицы. Примечание Если в секции FROM не указана таблица, то вы не сможете уточнить имя столбца сведениями о владельце таблицы, имени базы данных или сервера. При использовании псевдонима уточненное имя столбца записывается в форме ПсевдонимТаблицы.ИмяСтолбца. Как и прежде, если псевдоним таблицы не указан, имя столбца должно быть уникальным. В следующем фрагменте приведены примеры уточнения имен столбцов:

converted to PDF by BoJIoc

Colum n1 t it les.t it le pubs.dbo.t it les.t it le Первый пример ссылается на столбец с именем Colum n1 . Второй пример ссылается на столбец t it le из таблицы t it les. Третий пример ссылается на столбец t it le из таблицы t it les, принадлежащей владельцу базы, из базы данных pubs. Секция W HERE Секция WHERE определяет критерий отбора записей, включаемых в итоговый набор. Возвращаются только те записи, которые соответствуют условиям секции WHERE. Синтаксис секции WHERE приведен в листинге 6.3. Листинг 6 .3 . Синтаксис секции W HERE WHERE [ NOT ] < предикат> [ { AND | OR } [ NOT] < предикат> ] } [ , . . .n] < предикат> : : = { выражение { = | < > | ! = | > | > = | ! > | < | < = | ! < } выражение | строковое_выражение [ NOT] LI KE строковое_выражение[ ESCAPE 'метасимвол'] | выражение [ NOT] BETWEEN выражение AND выражение | выражение I S [ NOT] NULL | выражение [ NOT] I N (подзапрос | выражение [ ,.. .n] ) | выражение { = | < > | ! = | > | > = | ! > | < | < = | ! < } { ALL | SOME | ANY } (подзапрос) | EXI STS (подзапрос) } Секция WHERE позволяет сравнивать столбцы, переменные, константы, функции и любые другие выражения. Сравниваемые объекты не обязаны присутствовать в списке выборки. Вы можете объединять предикаты, называемые « условиями поиска» или «аргументами поиска», с помощью ключевых слов AND и OR. Ключевое слово NOT реализует логическое отрицание условий. Предикаты группируются с помощью скобок, что позволяет управлять порядком сравнений. Количество предикатов в секции WHERE не ограничено. Для сравнения двух выражений используются операторы сравнения. Стандартные операторы сравнения перечислены в табл. 6 .1 . В следующем примере продемонстрированы команды SQL с применением различных операторов сравнения: SELECT t it le, price FROM t it les WHERE price = 19 .99 SELECT t it le, price FROM t it les WHERE SQRT(price) ! < 19.99 SELECT t it le, price FROM t it les WHERE NOT ( (price > 21.00 ) AND ( price < 30.00) ) Первая команда SELECT возвращает лишь те записи, в которых столбец price равен 19 .99. Во втором примере для price вызывается функция SQRT и возвращаются только те записи, для которых полученный результат не меньше 19.99. Последняя команда проверяет, принадлежит ли столбец price к интервалу от 21.00 до 30.00; возвращаются лишь те записи, которые не входят в этот интервал. Важной составной частью секции WHERE является секция I N. Таблица 6.1. Операторы сравнения Оператор Значение =

Равно

Не равно

converted to PDF by BoJIoc

!=

Не равно

>

Больше

>=

Больше или равно

!>

Не больше


10 FROM aut hor a LEFT OUTER JOI N t it leaut hor ON a.au_id = t a.au_id I NNER JOI N t it le t ON t .t it le_id = t a.t it le_ id AND t .y td_sales > 4000

converted to PDF by BoJIoc

Предыдущий пример показывает, как в синтаксисе JOI N стандарта ANSI реализуется объединение нескольких условий. Следующие примеры демонстрируют различные типы объединений ANSI . Первый пример создает ортогональное объединение: SELECT * FROM t it les t CROSS JOI N t it leauthor t a Команда возвращает все записи из таблиц t it le и t itleaut hor. Общее число возвращаемых записей равно произведению количества записей в t it le и t it leaut hor. Следующая команда выполняет внутреннее объединение: SELECT * FROM t it les t I NNER JOI N t it leaut hor ta ON t .t it le_id = t a.t it le_id Команда возвращает только те записи, в которых содержимое t it le_ id совпадает в таблицах t it les и t it leaut hor. Последний пример демонстрирует внешнее объединение: SELECT * FROM t it les t LEFT OUTER JOI N t it leaut hor ta ON t .t it le_id = t a.t it le_id -- левое внешнее объединение Возвращаются все записи t it les даже в том случае, если для t it le_id не находится соответствующего значения t it le_ id в t it leaut hor. SELECT * FROM t it les t FULL OUTER JOI N t it leaut hor ta ON t .t it le_id = t a.t it le_id -- полное внешнее объединение В этом примере показано полное внешнее объединение; возвращаются все записи t it les и t it leaut hor даже в том случае, если условие не выполняется. Синтаксис объединений ANSI читается намного проще, чем синтаксис TSQL. В нем сразу видно, какие таблицы объединяются и как выглядит условие объединения. Возможно, расширенные объединения TSQL не будут поддерживаться будущими версиями SQL Server. Подзапросы Подзапросы (subquery ) позволяют включать команды SELECT в другие запросы. Если таблица принадлежит не внешнему запросу, а вложенному подзапросу, то столбцы этой таблицы могут использоваться только в подзапросе. Подзапросы не могут содержать секций ORDER BY, COMPUTE или FOR BROWSE. Они могут присутствовать в секциях FROM в качестве производных таблиц, а также в секциях WHERE и HAVI NG. Если подзапрос находится в секции WHERE или HAVI NG, он может использоваться в сочетании с ключевыми словами EXI ST, ANY, SOME, ALL или I N. Внимание Подзапросам особого типа, называемым коррелированными подзапросами, могут передаваться столбцы основного запроса. Они используются для ограничения записей, возвращаемых подзапросом. В следующем фрагменте показан пример коррелированного подзапроса: SELECT t it le_ id, ( SELECT SUM(roy alt yper) FROM t it les_aut hors t a WHERE t a.t it le_ id = t .t it le_ id) FROM t it les t В этом примере коррелированный подзапрос является частью списка выборки. UN I ON Союз ( union) позволяет связать данные двух и более итоговых наборов в один. В отличие от объединений, которые включают в итоговые наборы дополнительные столбцы, союзы связывают воедино данные, полученные от нескольких команд SELECT. Команда UNI ON имеет следующий синтаксис: Команда_SELECT UNI ON [ ALL]

converted to PDF by BoJIoc

Команда_SELECT [ .. . ] Все списки выборки в UNI ON должны содержать одинаковое число столбцов, в противном случае SQL Server выдаст сообщение об ошибке. Соответствующие столбцы должны принадлежать к одному типу данных или преобразовываться в него (неявно или с применением функций преобразования) . Неявные преобразования типов подчиняются правилам приоритетов. Первая команда SELECT в конструкции UNI ON определяет заголовки столбцов результата. В каждой команде SELECT могут присутствовать секции GROUP BY или HAVI NG. Они относятся только к конкретной команде SELECT — вы не сможете применить их к союзу в целом. Если вы используете секции ORDER BY или COMPUTE, они могут задаваться только в последней команде SELECT союза. Содержимое ORDER BY и COMPUTE относится ко всей конструкции UNI ON. По умолчанию UNI ON возвращает только различающиеся записи. Ключевое слово ALL говорит о том, что возвращаться должны все записи без исключения. В одной команде можно смешивать UNI ON и UNI ON ALL. Внимание Если в одной команде встречаются и UNI ON, и UNI ON ALL, для выбора удаляемых дубликатов можно воспользоваться скобками. Секция TOP SQL Serv er позволяет указать в списке выборки, что вас интересует лишь часть возвращаемого итогового набора. Для этой цели используется секция TOP, которая должна находиться до списка выборки. Секция TOP имеет следующий синтаксис: [ TOP n [ PERCENT] [ WI TH TI ES] ] Если секция TOP используется с ALL или DI STI NCT, она должна находиться после этих ключевых слов. Секция TOP говорит, что после того, как будут сгенерированы первые n записей, удовлетворяющих запросу, обработку данных следует прекратить. При отсутствии секции ORDER BY записи будут находиться в порядке их нахождения SQL Server. В простейшем варианте секция TOP делает то же, что и ROWCOUNT. Значение n является неотрицательным целым числом. Если n равно нулю, не возвращается ни одна запись. Если n превышает количество записей в таблице, возвращаются все записи. При наличии параметра PERCENT значение n интерпретируется не как количество записей, а как процент от него. Любое значение больше 100 приводит к возвращению всех записей таблицы. Если в соответствии с заданным процентом должна быть возвращена лишь часть записи, возвращается целая запись. При наличии параметра WI TH TI ES секция TOP распространяется на все записи, в которых значение столбца совпадает с его значением в последней возвращенной записи итогового набора. Параметр WI TH TI ES может использоваться только при наличии секции ORDER BY. Ключевое слово ALL не действует на записи, возвращенные с применением секции TOP. Ключевое слово DI STI NCT действует как обычно — возвращается лишь одна копия записей из итогового набора. Следующий фрагмент демонстрирует применение команды TOP: SELECT TOP 6 * FROM authors ORDER BY qt y DESC Команда возвращает первые шесть записей таблицы aut hors, упорядоченные по столбцу qty в порядке убывания. В следующем примере продемонстрирован отбор процента записей: SELECT TOP 6 PERCENT * FROM aut hors ORDER BY qt y DESC Команда возвращает первые шесть процентов записей таблицы aut hors, упорядоченные по столбцу qty в порядке убывания. Следующий пример демонстрирует применение параметра TI ES в конструкции TOP: SELECT TOP 6 WI TH TI ES * FROM aut hors ORDER BY qt y DESC

converted to PDF by BoJIoc

Команда возвращает первые шесть записей таблицы aut hors, упорядоченных по столбцу qty в порядке убывания. Если у каких-либо записей после шестой значение qt y совпадает с его значением в шестой записи, эти записи также возвращаются. Выборка данных из столбцов типа TEXT и I MAGE При выборке данных из столбцов типа TEXT, NTEXT или I MAGE SQL Server извлекает данные объема @@TEXTSI ZE. Для управления выборкой данных типов TEXT, NTEXT или I MAGE в SQL Server существует команда READTEXT, обладающая следующим синтаксисом: READTEXT { база.владелец.} таблица.столбец { указатель смещение размер} [ HOLDLOCK] Чтение данных командой READTEXT возможно лишь при наличии в столбце текстового указателя. Указатель создается при обновлении или вставке в столбцах TEXT, NTEXT или I MAGE данных, отличных от NULL. Смещение определяет количество байтов, пропускаемых перед началом выборки данных из столбца, а размер — количество читаемых байтов. Если размер равен 0, читается блок размером 4 Кбайт. Если размер превышает @@TEXTSI ZE, объем читаемого блока ограничивается @@TEXTSI ZE. Чтобы прочитать данные командой READTEXT, необходимо предварительно считать текстовый указатель в переменную типа BI NARY или VARBI NARY длиной минимум 16 байт, после чего выполнить команду SELECT с функцией TEXTPTR. Если команда SELECT возвращает несколько записей, текстовый указатель устанавливается на последнюю прочитанную запись. Следующий фрагмент демонстрирует процесс чтения из текстового столбца: DECLARE @Tpoint BI NARY(16) SELECT @Tpoint = TEXTPTR( MyText Colum n) FROM MyText Table READTEXT MyTex tTable.MyTex t Colum n @Tpoint 200 2024 В этом фрагменте объявляется локальная переменная @Tpoint (локальные переменные рассматриваются ниже). Команда SELECT инициализирует текстовый указатель. Затем текстовый указатель используется для чтения байтов с 200-го по 2024-й столбцов MyText Colum n. Внимание Запомните: параметры команды READTEXT не разделяются запятыми. Примеры экзаменационных вопросов Que stion 1 Which of t he following SQL st at em ent s ret rieves t he unique list of cit ies from t he publisher t able wit h a colum n heading of Publisher Cit y? [ Check all correct answers] • • • • •

A. select B. select C. select D. select E. select

dist inct Publisher City = cit y from publishers unique cit y as " Publisher Cit y" from publishers dist inct "Publisher Cit y" = city from publisher "Publisher Cit y" = dist inct cit y from publisher dist inct cit y as " Publisher City " from publisher

Вопрос 1 Какие из следующих команд SQL извлекают список уникальных городов из таблицы publisher с заголовком столбца Publisher Cit y? [ Выберите все правильные ответы] • • • • •

A. select B. select C. select D. select E. select

dist inct Publisher City = cit y from publishers unique cit y as " Publisher Cit y" from publishers dist inct "Publisher Cit y" = city from publisher "Publisher Cit y" = dist inct cit y from publisher dist inct cit y as " Publisher City " from publisher

Правильные ответы — C и E. В них используются разные формы псевдонимов столбцов. Команды из ответов A, B и D имеют неверный синтаксис.

converted to PDF by BoJIoc

Que stion 2 Which of t he following SQL st at em ent s ret urns all aut hors whose last nam e has I as t he second- t o-last charact er and a zip code greater t han 50 000? [ Check all correct answers] • • • • • •

A. select * from authors where au_lnam e like '_I % ' and zip > 50 000 B. select * from authors where au_lnam e like '% I _ ' and zip ! < 50 001 C. select * from aut hors where au_lnam e = '% I _' and zip > 50 000 D. select * from aut hors where au_lnam e like '% I % ' and zip > 50 000 E. select * from authors where au_ lnam e like '% I _ ' escape 'I ' and zip > 50 000 F. You cannot ret urn t he request dat a.

Вопрос 2 Какие из следующих команд SQL возвращают всех авторов, предпоследним символом фамилии которых является буква I , а zip-код превышает 50000? [ Выберите все правильные ответы] • A. select * from authors where au_lnam e like '_I % ' and zip > 50 000 • B. select * from authors where au_lnam e like '% I _ ' and zip ! < 50 001 • C. select * from aut hors where au_lnam e like '% I _ ' and zip > 50 000 • D. select * from aut hors where au_lnam e like '% I % ' and zip > 50 000 • E. select * from authors where au_ lnam e like '% I _ ' escape 'I ' and zip > 50 000 • F. Получить данные с помощью запроса невозможно. Правильный ответ — B; команда возвращает всех авторов, у которых предпоследним символом фамилии является буква I , а zip-код превышает 50 000. Ответ A неверен, поскольку буква I ищется во второй позиции от начала фамилии. Ответ C неверен, поскольку ключевое слово LI KE в нем заменено знаком равенства. В ответе D ищутся фамилии, содержащие I в любой позиции, поэтому он неверен. Наконец, ответ E тоже неверен, поскольку он ищет любую фамилию, состоящую по крайней мере из одного символа. Que stion 3 Which of t he following SQL st at em ent s ret urns t he j ob I D, j ob descript ion, and t he em ployee’s full nam e from t he j ob and em ploy ee t able, even if t here are no em ployees wit h t he j ob? • A. select j .j ob_id, j ob_desc, fnam e, lnam e from j obs j left out er j oin em ployee e on j .j ob_ id * = e.j ob_id • B. select j .j ob_id, j ob_desc, fnam e, lnam e from j obs j left out er j oin em ployee e on j .j ob_ id = e.j ob_id • C. select j ob_id, j ob_desc, fnam e, lnam e from j obs j , em ploy ee e w here j .j ob_id * = e.j ob_ id • D. select j .j ob_id, j ob_desc, fnam e, lnam e from j obs j left out er j oin em ployee e where j .j ob_ id = e.j ob_id • E. select j .j ob_id, j ob_desc, fnam e, lnam e from j obs j right outer j oin em ployee e on j .j ob_id = e.j ob_id Вопрос 3 Какая из следующих команд SQL возвращает код ( job_id) и описание должности (j ob_desc), имя ( fnam e) и фамилию ( lnam e) работника из таблиц j obs и em ployee, даже если не существует ни одного работника с данной должностью? • A. select j .j ob_id, j ob_desc, fnam e, lnam e from j obs j

converted to PDF by BoJIoc

left out er j oin em ployee e on j .j ob_ id * = e.j ob_id • B. select j .j ob_id, j ob_desc, fnam e, lnam e from j obs j left out er j oin em ployee e on j .j ob_ id = e.j ob_id • C. select j ob_id, j ob_desc, fnam e, lnam e from j obs j , em ploy ee e w here j .j ob_id * = e.j ob_ id • D. select j .j ob_id, j ob_desc, fnam e, lnam e from j obs j left out er j oin em ployee e where j .j ob_ id = e.j ob_id • E. select j .j ob_id, j ob_desc, fnam e, lnam e from j obs j right outer j oin em ployee e on j .j ob_id = e.j ob_id Правильный ответ — B. Запрос возвращает необходимые данные посредством внешнего объединения таблиц job и em ployee. Ответ A неверен, поскольку оператор * = не может использоваться в объединениях ANSI . Ответ C неверен; столбец j ob_id в списке выборки не уточняется именем таблицы, и SQL Server не будет знать, из какой таблицы следует брать столбец j ob_ id. Ответ D неверен, поскольку в нем отсутствует секция ON, обязательная для стандарта ANSI . Ответ E неверен — он возвращает записи всех работников, даже не имеющих должности. Que stion 4 Rev iew t he following ent ry: select t it le, count (* ) from t it les t left out er j oin sales s on t .t it le_id = s.t it le_id where stor_ id > 4000 order by 1 group by all t it le Which of t he following st at em ent s are t rue in relat ion t o t he preceding query? [ Check all correct answers] • • • • •

A. No rows w ill be ret urned. B. I t will ret urn t he num ber of a count of sales for each t it le. C. Data will be sort ed by t it le. D. Dat a will be sort ed by t he num ber of sales. E. I t will ret urn zero for t he second colum n when stor_ id< = 4000 .

Вопрос 4 Имеется следующая команда: select t it le, count (* ) from t it les t left out er j oin sales s on t .t it le_id = s.t it le_id where stor_ id > 4000 order by 1 group by all t it le Какие из следующих утверждений истинны по отношению к этому запросу? [ Выберите все правильные ответы] • • • • •

A. Не будет возвращена ни одна запись. B. Запрос возвратит количество записей в sales для каждого названия. C. Данные будут отсортированы по названию ( t it le). D. Данные будут отсортированы по количеству записей в sales. E. Если stor_ id< = 4000, во втором столбце возвращается ноль.

converted to PDF by BoJIoc

Правильный ответ — A, поскольку в приведенной команде SQL нарушен порядок следования секций, следовательно, команда не возвратит ни одной записи и все остальные ответы неверны. Que stion 5 Which of t he following queries ret urn all t it les t hat cont ain t he word I S wit hout concern for t he case? [ Check all correct answers] • A. select t it le from t it les w here UPPER(t it le) = '% I S% ' • B. select t it le from t it les w here upper( t it le) like 'I S% ' or lower ( t it le) like '% is% ' or t it le like '% [ I i] [ Ss] % ' • C. select t it le from t it les w here upper( t it le) like '% I S' • D. select t it le from t it les w here t it le in [ 'I S % ', '% I S % ', '% I S'] Вопрос 5 Какие из следующих запросов возвращают все значения столбца t it le, содержащие слово I S, независимо от регистра символов? [ Выберите все правильные ответы] • A. select t it le from t it les w here UPPER(t it le) = '% I S% ' • B. select t it le from t it les w here upper( t it le) like 'I S% ' or lower ( t it le) like '% is% ' or t it le like '% [ I i] [ Ss] % ' • C. select t it le from t it les w here upper( t it le) like '% I S' • D. select t it le from t it les w here t it le in [ 'I S % ', '% I S % ', '% I S'] Правильный ответ — B, поскольку первое условие возвращает значения, начинающиеся с I S, а второе и третье условия возвращают значения, содержащие is ( независимо от регистра) . Ответ A неверен, поскольку условие '% I S' требует точного совпадения в верхнем регистре. Ответ C неверен, поскольку он находит только те значения, которые оканчиваются на 'I S'; экземпляры I S внутри строк пропускаются. Ответ D тоже неверен, поскольку в нем пропускаются экземпляры I S, записанные символами нижнего регистра. Que stion 6 Which SELECT st at em ent s ret urn all aut hors’ first and last nam es as well as all em ploy ees’ first and last nam es? [ Check all correct answers] • A. select au_lnam e, au_ fnam e, fnam e, em ploy ee.lnam e from em ployee e cross j oin aut hors a • B. select au_lnam e, au_ fnam e from aut hors union select lnam e, fnam e from em ployee • C. select au_lnam e, au_ fnam e from aut hors union all select lnam e, fnam e from em ployee • D. None of t he above. Вопрос 6 Какие из команд SELECT возвращают имена ( fnam e) и фамилии (lnam e) всех авторов, а также имена и фамилии всех работников? [ Выберите все правильные ответы]

converted to PDF by BoJIoc

• A. select au_lnam e, au_ fnam e, fnam e, em ploy ee.lnam e from em ployee e cross j oin aut hors a • B. select au_lnam e, au_ fnam e from aut hors union select lnam e, fnam e from em ployee • C. select au_lnam e, au_ fnam e from aut hors union all select lnam e, fnam e from em ployee • D. Ни одна из перечисленных. Правильные ответы — B и C. Обе команды возвращают желаемый результат. Ответ B возвращает набор уникальных записей, а ответ C — набор с дубликатами. Ответ A неверен из-за ошибки в синтаксисе команды. Используя псевдоним таблицы, нельзя ссылаться на таблицу по ее настоящему имени без указания псевдонима. Que stion 7 Which SELECT st at em ent ret urns t he five charact ers im m ediat ely following t he first occurrence of t he from a st ring ( if t he is not found, t he statem ent m ust ret urn N/ A)? • A. select I SNULL( subst ring( t it le,CHARI NDEX ('t he', LOWER(t it le) ),3) ,'N/ A') from t it les • B. select case when t it le like ' % t he% ' t hen nex t ( 't he',5 ) else 'N/ A' end from t it les • C. select I SNULL(subst ring ( t it le,charindex ('t he',lower(t it le) ) + 3 , charindex ( 'the',low er(t it le) )+ 5 ) , 'N/ A') from t it les • D. select case when charindex ( 't he',low er(t it le) ) = 0 t hen 'N/ A' else subst ring ( t it le, charindex ('t he',lower(t it le)) + 3,5) end from t it les • E. None of t he above. Вопрос 7 Какая команда SELECT возвращает пять символов, следующих после первого экземпляра слова t he в строке (если слово t he не найдено, команда должна возвращать строку N/ A) ? • A. select I SNULL( subst ring( t it le,CHARI NDEX ('t he', LOWER(t it le) ),3) ,'N/ A') from t it les • B. select case when t it le like ' % t he% ' t hen nex t ( 't he',5 ) else 'N/ A'

converted to PDF by BoJIoc

end from t it les • C. select I SNULL(subst ring ( t it le,charindex ('t he',lower(t it le) ) + 3 , charindex ( 'the',low er(t it le) )+ 5 ) , 'N/ A') from t it les • D. select case when charindex ( 't he',low er(t it le) ) = 0 t hen 'N/ A' else subst ring ( t it le, charindex ('t he',lower(t it le)) + 3,5) end from t it les • E. Ни одна из перечисленных команд. Правильный ответ — D. Эта команда возвращает пять символов, расположенные сразу же после первого экземпляра t he в строке; если слово t he не найдено, команда возвращает N/ A. Ответ A неверен; если слово t he находится в строке, то команда возвращает t he вместо пяти символов, следующих за ним. Ответ B неверен, поскольку функции NEXT не существует. Наконец, ответ C тоже неверен, поскольку для строк без слова t he не возвращается строка N/ A. Que stion 8 Which of t he following queries ret urn publisher nam es and the m ax im um last nam e of t heir em ployees, ev en if t hey have no em ployees, for publishers t hat have not published cook ing books? [ Check all correct answers] • A. select pub_ nam e, m ax( lnam e) from publishers p left j oin em ploy ee e on p.pub_id = e.pub_id inner j oin t it les t on t .pub_id = p.pub_id and t .ty pe not lik e '% cooking' group by pub_nam e • B. select pub_ nam e , m ax (lnam e) from ( select pub_nam e, p_pub_ id from publishers p inner j oin t it les t on t .pub_id = p.pub_id where t .t ype not like '% cooking') AS t1 left out er j oin em ployee e on t 1.pub_ id = e.pub_ id group by pub_nam e • C. select dist inct pub_nam e ,( select m ax( lnam e)from em ployee e where e.pub_ id = t 1.pub_id) from ( select pub_nam e, p.pub_id from publishers p inner j oin t it les t on t .pub_id = p.pub_id where t .t ype not like '% cooking') AS t1 • D. None of t he above. Вопрос 8 Какие из следующих запросов возвращают имя издателя ( publisher) и последнюю по алфавиту фамилию работника (даже если работников нет) тех издателей, которые еще не издавали книг по кулинарии ( слово cooking в столбце t ype)? [ Выберите все правильные ответы]

converted to PDF by BoJIoc

• A. select pub_ nam e, m ax( lnam e) from publishers p left j oin em ploy ee e on p.pub_id = e.pub_id inner j oin t it les t on t .pub_id = p.pub_id and t .ty pe not lik e '% cooking' group by pub_nam e • B. select pub_ nam e , m ax (lnam e) from ( select pub_nam e, p_pub_ id from publishers p inner j oin t it les t on t .pub_id = p.pub_id where t .t ype not like '% cooking') AS t1 left out er j oin em ployee e on t 1.pub_ id = e.pub_ id group by pub_nam e • C. select dist inct pub_nam e ,( select m ax( lnam e)from em ployee e where e.pub_ id = t 1.pub_id) from ( select pub_nam e, p.pub_id from publishers p inner j oin t it les t on t .pub_id = p.pub_id where t .t ype not like '% cooking') AS t1 • D. Ни один из перечисленных запросов. Правильные ответы — A, B и C. Все команды возвращают имя издателя и последнюю фамилию работника (даже в том случае, если работников нет) для издателей, не выпускавших книг по кулинарии. Que stion 9 Which of t he following SELECT st at em ent s return t he t it les and t he t ot al order num ber for t it les t hat hav e at least 5000 books ordered? [ Check all correct answers] • A. select t it le, sum (qt y) from t it les t inner j oin sales s on t .t it le_ id = s.t it le_ id hav ing count (qty ) > 5000 • B. select t it le , t ot al( qt y) from t it les t inner sales s on t .t it le_ id = s.t it le_ id group by t it le hav ing count (qt y) > 5000 • C. select t it le , sum ( qt y) from t it les t inner j oin sales s on t .t it le_ id = s.t it le_ id where sum (qt y) > 5000 group by t it le • D. select t it le, sum (qt y) from t it les t inner j oin sales s on t .t it le_ id = s.t it le_ id group by t it le_id hav ing sum (qty ) > 5000 • E. None of t he above.

converted to PDF by BoJIoc

Вопрос 9 Какие из следующих команд SELECT возвращают названия ( t it le) и общий объем заказов (qt y) для книг, которые были заказаны в количестве не менее 5000 экземпляров? [ Выберите все правильные ответы] • A. select t it le, sum (qt y) from t it les t inner j oin sales s on t .t it le_ id = s.t it le_ id hav ing count (qty ) > 5000 • B. select t it le, t ot al( qt y) from t it les t inner j oin sales s on t .t it le_ id = s.t it le_ id group by t it le hav ing count (qt y) > 5000 • C. select t it le, sum (qt y) from t it les t inner j oin sales s on t .t it le_ id = s.t it le_ id where sum (qt y) > 5000 group by t it le • D. select t it le, sum (qt y) from t it les t inner j oin sales s on t .t it le_ id = s.t it le_ id group by t it le_id hav ing sum (qty ) > 5000 • E. Ни одна из приведенных команд. Правильный ответ — E, поскольку ни одна из приведенных команд не удовлетворяет заданным условиям. Ответ A неверен, поскольку в списке выборки присутствуют столбцы, не являющиеся агрегатными функциями и не присутствующие в GROUP BY. Ответ B неверен, поскольку агрегатной функции t otal не существует. Неверен и ответ C; агрегатные функции не могут использоваться в секции WHERE. Ответ D тоже неверен, поскольку столбец t it le_id в секции GROUP BY может принадлежать любой из таблиц. Для неоднозначных столбцов необходимо указать ссылку на таблицу. Que stion 1 0 Which of t he following SELECT clauses can you use t o lim it t he rows ret urned in a SELECT st at em ent ? [ Check all correct answers] • • • • •

A. WHERE. B. HAVI NG. C. FROM using ANSI j oins. D. FROM using TSQL j oins. E. None of t he above.

Вопрос 1 0 Какие из перечисленных секций SELECT могут использоваться для ограничения количества записей, возвращаемых командой SELECT? [ Выберите все правильные ответы] • • • • •

A. WHERE. B. HAVI NG. C. FROM с использованием объединений ANSI . D. FROM с использованием объединений TSQL. E. Ни одна из перечисленных.

Правильные ответы — A, B и C. Количество записей, возвращаемых командой SELECT, может ограничиваться в секциях WHERE и HAVI NG, а также в секциях FROM, использующих объединения ANSI . Ответ D неверен; хотя объединения TSQL могут ограничивать количество возвращаемых записей, но в секции WHERE, а не FROM. Que stion 1 1 For t he follow ing table, CREATE TABLE MyTable ( a int , b t ext )

converted to PDF by BoJIoc

what happens when t he following SQL st at em ent s are execut ed? DECLARE @TP BI NARY(15) SELECT @TP = TEXTPTR(b) FROM MyTable ORDER BY a DESC READTEXT MyTable.b @TP 10 20 • • • • •

A. The 10 t hrough 30 characters B. The 10 t hrough 30 characters C. The 10 t hrough 30 characters D. The 10 t hrough 20 charact ers E. An error w ill be generat ed.

are are are w ill

ret rieved for ret rieved for ret rieved for be ret rieved

ev ery row. t he row with t he low est value for a. t he row with t he highest value for a. for t he row wit h t he lowest v alue for a.

Вопрос 1 1 Имеется таблица: CREATE TABLE MyTable ( a int , b t ext ) Что произойдет при выполнении следующих команд SQL? DECLARE @TP BI NARY(15) SELECT @TP = TEXTPTR(b) FROM MyTable ORDER BY a DESC READTEXT MyTable.b @TP 10 20 • • • • •

A. Из каждой строки читаются символы с 10 по 30 . B. Из строки с наименьшим значением a читаются символы с 10 по 30. C. Из строки с наибольшим значением a читаются символы с 10 по 30. D. Из строки с наименьшим значением a читаются символы с 10 по 20. E. Произойдет ошибка.

Правильный ответ — E. Ошибка происходит из-за того, что текстовый указатель @TP имеет длину менее 16 байт. Из-за этого остальные ответы неверны. ГЛАВА 7

Модификация данных в таблицах Ключевые термины • • • • • • •

I NSERT BULK I NSERT SELECT I NTO UPDATE WRI TETEXT UPDATETEXT Типы данных TEXT и I MAGE

Необходимые знания и приемы • • • • •

Вставка данных Обновление данных Использование SELECT I NTO Использование BULK I NSERT Работа с типами данных TEXT и I MAGE

В большинстве данных не хранятся статические данные. Обычно данные приходится добавлять и обновлять. Microsoft SQL Serv er поддерживает несколько способов модификации данных в таблицах. В вашем распоряжении следующие команды: • • • • • •

I NSERT; SELECT I NTO; BULK I NSERT; UPDATE; WRI TETEXT; UPDATETEXT.

I N SERT

converted to PDF by BoJIoc

Команда I NSERT имеет четыре основные синтаксические формы. В первых двух формах задаются значения столбцов одной записи. Две другие формы позволяют добавить несколько записей, основанных на результатах команды SELECT или хранимой процедуры. Синтаксис всех четырех форм I NSERT выглядит следующим образом: I NSERT [ I NTO] { таблица| представление} { список_столбцов} VALUES ( { DEFAULT | выражение_константа } [ ,...n] ) I NSERT [ I NTO] { таблица| представление} { список_столбцов} DEFAULT VALUES I NSERT [ I NTO] { таблица| представление} { список_столбцов} команда_select I NSERT [ I NTO] { таблица| представление} { список_столбцов} команда_execut e Основные сведения об I N SERTM Помните: команда I NSERT дописывает записи в таблицу, а не модифицирует существующие записи. Модификация существующих данных в результате I NSERT возможна лишь в результате срабатывания триггера (см. главу 12), модифицирующего записи. Вы должны помнить о некоторых особенностях команды I NSERT, среди которых — списки столбцов, столбцы счетчика, UNI QUEI DENTI FI ER, символьное и двоичное выравнивание столбцов и @@ROWCOUNT. Списки столбцов Список столбцов представляет собой перечень имен столбцов, разделенных запятыми и заключенных в круглые скобки: I NSERT PhoneList ( PersonNam e, PhoneNum ber) VALUES ( John Doe, 200-567-1234) В этом примере список столбцов состоит из PersonNam e и PhoneNum ber. Порядок столбцов в списке может отличаться от порядка столбцов в таблице. Тем не менее, в списке столбцов команды I NSERT должны присутствовать все столбцы с запрещением значений типа NULL, не имеющие значений по умолчанию или получающие значения от триггера. Производные столбцы не могут присутствовать в списке столбцов. Если в команде I NSERT отсутствует список столбцов, она выполняется так, словно список содержит все столбцы в том же порядке, что и в таблице, за исключением производных столбцов (которые автоматически пропускаются) . Это означает, что при отсутствии списка столбцов порядок значений соответствует порядку столбцов в таблице. Столбец счетчика Обычно вставка данных в столбцы счетчика (см. главу 5 ) невозможна. Чтобы вставить данные в столбец счетчика, следует установить для таблицы свойство I DENTI TY_I NSERT: SET I DENTI TY_ I NSERT [ база.[ владелец.] ] { таблица} { ON| OFF} Установка свойства I DENTI TY_I NSERT разрешает вставку данных в столбец счетчика. Если столбец счетчика таблицы не указан в команде I NSERT, ему будет присвоено следующее значение. Можно явно указать присваиваемое значение для столбца счетчика. Если присваиваемое значение превышает текущее значение столбца счетчика, дальнейший отсчет в столбце будет вестись от новой величины. Как говорилось в главе 5 , столбец счетчика не гарантирует уникальности. UNI QUEI DENTI FI ER При вставке данных в столбцы с типом данных UNI QUEI DENTI FI ER необходимо учитывать особенности поведения этих столбцов. Если для столбца UNI QUEI DENTI FI ER не задано значение по умолчанию, присваиваемые значения не будут автоматически заноситься в базу данных. Значения столбцов UNI QUEI DENTI FI ER представляют собой шестнадцатеричные числа, состоящие из 36 цифр в формате xxxxxxxx -xxxx-xxxx-xxxx-xxxxxxxxxxxx . Присутствие дефисов обязательно. Для получения глобальноуникального идентификатора, присваиваемого столбцу, можно воспользоваться функцией NEWI D() .

converted to PDF by BoJIoc

Следующий фрагмент показывает, как происходит вставка данных в таблице со столбцом типа UNI QUEI DENTI FI ER: I NSERT MyPhoneList (PhoneI d, PersonNam e, PhoneNum ber) VALUES (NEWI D( ) , "John Doe", "200-000-0000 ") Символьное и двоичное выравнивание столбцов При использовании команды I NSERT для модификации данных типов CHAR, VARCHAR или VARBI NARY фактическое вставляемое значение зависит от состояния параметра ANSI _PADDI NG в момент создания таблицы (процесс создания таблиц описан в главе 5 , а настройка параметров конфигурации — в главе 8) . Если для параметра ANSI _PADDI NG установлено значение OFF: • значения типа CHAR дополняются пробелами до ширины столбца; • в значениях типа VARCHAR удаляются завершающие пробелы, а строки, состоящие из одних пробелов, заменяются одним пробелом; • в значениях типа VARBI NARY удаляются завершающие нули. Если для параметра ANSI _PADDI NG установлено значение ON: • значения типа CHAR дополняются пробелами до ширины столбца; • значения типов VARCHAR и VARBI NARY не обрезаются, но и не дополняются. По умолчанию параметр ANSI _PADDI NG равен OFF. Тем не менее, и драйвер ODBC Microsoft SQL Server, и провайдер OLE DB Microsoft SQL Server устанавливают для него значение ON при подключении. Microsoft рекомендует всегда устанавливать для этого параметра значение ON. @@ROW COUN T После выполнения команды I NSERT функция @@ROWCOUNT возвращает количество вставленных записей. Ноль вставленных записей еще не означает, что произошла ошибка. Например, это может означать, что команда SELECT или хранимая процедура, которая генерирует вставляемые записи, не вернула ни одной записи. Перечисленные базовые функции используются одинаково независимо от того, какой синтаксис I NSERT вы используете. Следующий раздел посвящен вставке отдельной записи. Вставка отдельной записи Команда I NSERT чаще всего применяется для вставки в таблицу отдельной записи. Обычно при этом используется ключевое слово VALUES, за которым следует необязательный список значений. Он содержит значения, присваиваемые соответствующим столбцам в списке столбцов. В следующих примерах продемонстрированы различные варианты вставки записи в таблицу с именем MyTable, состоящую из двух столбцов ( a и b) : I NSERT MyTable VALUES ('a',1234) Команда вставляет новую запись в таблицу MyTable. Столбцу a присваивается значение "a", а столбцу b — значение 1234 : I NSERT I NTO MyTable (a) VALUES ('ccc') В команде использовано необязательное ключевое слово I NTO, не влияющее на выполнение команды I NSERT. Список столбцов состоит из одного столбца a: I NSERT MyTable DEFAULT VALUES При наличии ключевых слов DEFAULT VALUES список столбцов не допускается. Каждому столбцу MyTable присваивается значение по умолчанию: I NSERT MyTable VALUES (DEFAULT,5 ) В этом примере список столбцов тоже не используется. Столбцу a присваивается значение по умолчанию, а столбцу b — значение 5.

converted to PDF by BoJIoc

I NSERT MyTable (b, a) VALUES ( @@ROWCOUNT, user_nam e( ) ) На этот раз столбец b стоит на первом месте в списке, а столбец a — на втором. Столбцу b присваивается значение, полученное при вызове функции @@ROWCOUNT, а столбцу a — значение, полученное при вызове функции USER_NAME( ). Каждому столбцу соответствует скалярное выражение в списке значений. Это выражение может представлять собой константу, скалярную функцию, любое сочетание констант и скалярных функций или ключевое слово DEFAULT. В списке значений не допускается использование подзапросов, столбцов или агрегатных функций. Присваиваемое значение либо неявно преобразуется к типу данных столбца, либо вы должны выполнить явное преобразование. Иногда при вставке данных в таблицу требуется, чтобы SQL Server присвоил столбцу значение по умолчанию. Для этого используется ключевое слово DEFAULT. Существует два возможных применения ключевого слова DEFAULT в команде I NSERT. Если DEFAULT используется в списке значений, оно относится к соответствующему столбцу списка. Если ключевое слово DEFAULT находится перед началом списка, оно относится ко всем непроизводным столбцам таблицы, в этом случае список столбцов должен быть пустым. Ключевое слово DEFAULT обрабатывается следующим образом: • Если у столбца имеется значение по умолчанию, оно заносится в столбец. • Если у столбца нет значения по умолчанию, присваивается значение типа NULL. • Если столбец не допускает значений типа NULL, SQL Server выдает сообщение об ошибке. • Если столбец имеет тип TI MESTAMP, столбцу присваивается следующая пометка времени. • SQL Server не разрешает использовать DEFAULT в списке значений для столбца счетчика, однако использование ключевых слов DEFAULT VALUES допускается. Применение ключевого слова DEFAULT для столбцов счетчика демонстрирует следующий пример: -- таблица CREATE TABLE Test ( Col1 NUMERI C(10 ) I DENTI TY, Col2 VARCHAR(32) DEFAULT 'Test ' NOT NULL) -- допустимая вставка I NSERT Test DEFAULT VALUES -- недопустимая вставка I NSERT Test VALUES ( DEFAULT,DEFAULT) Первая команда I NSERT вставляет запись со следующим значением в столбце Col1 и значением 'Test ' в столбце Col2. Вторая команда I NSERT завершится неудачей, даже если в таблице установлен параметр, разрешающий выполнение команды I NSERT для столбцов счетчика. Вставка нескольких записей Команда I NSERT позволяет вставить в таблицу несколько записей. Для этого список значений заменяется командой SELECT или хранимой процедурой. Использование команды SELECT Большинство синтаксически правильных команд SELECT может использоваться в командах I NSERT для вставки нескольких записей в таблицу. Если команда SELECT является частью команды I NSERT, она не может содержать секций COMPUTE или COMPUTE BY. Допускается применение команды SELECT для выборки записей из таблицы, в которую вы собираетесь вставлять данные, но при этом необходимо проследить за сохранением уникальности индексов, или операция вставки завершится неудачей. • Если значение ROWCOUNT (см. главу 8 ) текущего сеанса отлично от нуля, команда I NSERT прекращает работу после вставки количества записей, равного этому значению. • Команда SELECT, являющаяся частью I NSERT, может не возвратить ни одной записи. Это не является ошибкой. • Если хотя бы одна вставленная запись нарушает ограничение таблицы, вся команда I NSERT не может быть выполнена. Приведем пример команды I NSERT с внутренней командой SELECT:

converted to PDF by BoJIoc

I NSERT MyTable( a, b ) SELECT c,SUM( d) FROM MyTable2 GROUP BY c Команда вставляет в таблицу MyTable каждую запись, возвращаемую командой SELECT. Использование хранимых процедур Записи, включаемые в таблицу, могут быть получены с помощью хранимой процедуры. При этом допускается использование любой хранимой процедуры, которая возвращает данные с помощью команд SELECT или READTEXT. Хранимые процедуры в команде I NSERT подчиняются следующим правилам: • Если процедура производит выборку данных из текстового столбца с помощью команды READTEXT, при каждом вызове READTEXT возвращается не более 1024 Кбайт данных. • Хранимая процедура, используемая для создания нескольких записей, также может выполнять обновление и вставку в других таблицах. • Процедура может находиться на локальном или удаленном сервере, а также может быть расширенной хранимой процедурой. • Выполняя несколько команд SELECT, процедура может извлекать несколько итоговых наборов. • Полученные данные должны соответствовать типу и количеству столбцов в списке. • Если значение ROWCOUNT текущего сеанса отлично от нуля, команда I NSERT прекращает работу после вставки количества записей, равного этому значению. Иногда хранимая процедура не возвращает ни одной записи. Это не является ошибкой. Если хотя бы одна вставляемая запись нарушает ограничение таблицы, вся команда I NSERT завершается неудачей. Ниже показан пример вставки записей с помощью хранимой процедуры: I NSERT MyTable ( a, b ) EXECUTE Som eValidProcedure Процедура Som eValidProc должна возвращать один или несколько итоговых наборов. Каждый итоговый набор содержит два значения, вставляемые в столбцы a и b таблицы MyTable. SELECT I N TO Команда SELECT с параметром I NTO позволяет одновременно создать таблицу и заполнить ее данными. Чтобы воспользоваться этим средством заполнения таблицы, необходимо установить параметр базы данных SELECT I NTO. Как правило, команда SELECT I NTO не используется при создании рабочих баз данных. Примечание Если команда SELECT I NTO все же применяется при создании рабочих баз данных, обычно ее использование ограничивается созданием временных таблиц. Команда SELECT с параметром I NTO имеет следующий синтаксис: SELECT список_выборки I NTO имя_таблицы FROM список_ таблиц [ секции_where] [ секция_groupby] [ секция_having] [ секция_ orderby] Список_выборки может быть любым допустимым списком выборки, а имя_таблицы — именем любой таблицы, не существующей в данный момент ( имена таблиц рассматриваются в главе 5, а глава 6 содержит подробное описание всех секций команды SELECT). Команда SELECT I NTO создает новую таблицу, содержащую результаты выборки. Новая таблица состоит из столбцов, присутствующих в списке выборки. В команде могут использоваться любые секции SELECT, за исключением COMPUTE и COMPUTE BY. Присутствие секции FROM обязательно. Каждый столбец в списке выборки должен иметь уникальное непустое имя. Если два столбца имеют одинаковые имена, одному из них необходимо назначить псевдоним. Псевдоним столбца может быть назначен любому выражению или функции. Кроме того, не допускается выполнение SELECT I NTO внутри транзакции. Внимание Таблица, создаваемая командой SELECT I NTO, не должна существовать перед выполнением этой команды. Секции WHERE и HAVI NG ограничивают количество вставляемых записей. Если команда SELECT не возвращает ни одной записи, создается пустая таблица. Довольно часто встречаются таблицы, созданные

converted to PDF by BoJIoc

командой SELECT I NTO с секцией WHERE 1= 2, — команда создает пустую таблицу, которая будет заполнена позднее. При выполнении команды SELECT I NTO свойства счетчика наследуются, если только SELECT не содержит объединения, агрегатной функции, секции GROUP BY, UNI ON, нескольких столбцов счетчика в списке выборки или столбца, используемого в выражениях. В новой таблице не создаются ограничения и индексы, а вычисляемые столбцы становятся обычными, невычисляемыми столбцами. Для выполнения команды SELECT I NTO необходимо иметь привилегии создания таблиц для базы данных, в которую осуществляется выборка, и привилегии чтения данных для таблиц, из которой выбираются данные; в противном случае команда не будет выполнена. База данных, в которой создается таблица, должна иметь установленный параметр SELECT I NTO/ BULKCOPY. Приведем пример использования SELECT с секцией I NTO: SELECT * I NTO TestTable FROM aut hors Команда копирует все записи и столбцы из таблицы aut hors в новую таблицу TestTable. Внимание Таблица, в которую записываются данные, не обязана принадлежать текущей базе данных. Вы можете использовать любое полностью определенное имя таблицы, не существующей в данный момент. Кроме того, таблица может быть временной. BULK I NSERT В SQL Serv er 7 появился новый способ загрузки данных в таблицу — команда BULK I NSERT (листинг 7.1) . Команда работает аналогично программе BCP, запускаемой из командной строки, и тоже используется для вставки пакетов данных в существующую таблицу. Для каждого параметра команды BULK I NSERT существует эквивалентный параметр программы BCP. Внимание Одно из отличий между BULK I NSERT и программой BCP заключается в том, что BULK I NSERT только заполняет таблицы и не может экспортировать данные из SQL Server в файлы данных. Программа BCP импортирует и экспортирует данные. Листинг 7 .1 . Синтаксис BULK I N SERT BULK I NSERT [ [ 'имя_базы'.] [ 'владелец'] .] { 'имя_таблицы' FROM файл_данных} [ WI TH ( [ BATCHSI ZE = размер_пакета] [ [ ,] CHECK_CONSTRAI NTS] [ [ ,] CODEPAGE = ACP | OEM | RAW | кодировка] [ [ ,] DATAFI LETYPE = { 'char' | 'nat ive' | 'widechar' | 'widenat ive'} ] [ [ ,] FI ELDTERMI NATOR = 'разделитель_полей'] [ [ ,] FI RSTROW = первая_запись] [ [ ,] FORMATFI LE = 'полное_имя_файла_форматирования'] [ [ ,] KEEPI DENTI TY] [ [ ,] KEEPNULLS] [ [ ,] LASTROW = последняя_ запись] [ [ ,] MAXERRORS = максимум_ ошибок] [ [ ,] ORDER ({ столбец [ ASC | DESC] } [ ,...n] ) ] [ [ ,] ROWTERMI NATOR = 'разделитель_записей'] [ [ ,] TABLOCK] ) ]

converted to PDF by BoJIoc

Любые параметры команды BULK I NSERT могут встретиться в вопросах экзамена. К счастью, многие параметры достаточно просты. Помните о том, что параметры разделяются запятыми, и о том, что перечень после ключевого слова WI TH заключается в скобки. В команде BULK I NSERT обязательно присутствует только имя таблицы, в которую вставляются данные, и файл данных. Все остальные части являются необязательными. Для них действуют следующие правила: • Если имя базы данных не указано, по умолчанию используется текущая база данных. • Если владелец не указан, по умолчанию используется текущий владелец. • По умолчанию SQL Server пытается занести данные в таблицу, владельцем которой является владелец базы данных. Если вы не являетесь владельцем базы данных, попытка завершится неудачей — вставка данных в таблицу, принадлежащую кому-то другому, возможна лишь для владельца базы данных. В приведенном выше фрагменте файл_данных содержит полный путь к загружаемому файлу. Путь определяется по отношению к компьютеру, на котором работает SQL Server, а не вашему локальному компьютеру. Чтобы загрузить файл данных с локального компьютера, следует ввести имя файла с указанием полного пути, содержащее сетевое имя локального компьютера. После исходной команды BULK I NSERT следует секция WI TH с параметрами. В следующем списке кратко описан каждый из параметров BULK I NSERT: • BATCHSI ZE — определяет количество записей, передаваемых серверу в пакете. По умолчанию все пакеты передаются в одной транзакции. При аварийном завершении команды BULK I NSERT выполняется откат текущего пакета. Откат всех предыдущих пакетов производиться не будет. Размер пакета оказывает заметное влияние на скорость загрузки. • CHECK_CONSTRAI NTS — приказывает SQL Server проверить все ограничения в таблице. Без этого параметра команда BULK I NSERT может загрузить данные, недопустимые в обычных условиях из-за нарушения ограничений. • CODEPAGE — определяет кодовую страницу для данных в файле. Параметр влияет только на символьные столбцы. Он действует лишь при наличии символов с ASCI I - кодами меньше 32 или больше 127. Значение ACP означает, что файл содержит текст в кодировке ANSI / Microsoft Windows I SO 1252. Значение OEM используется для файлов в кодировке OEM. Значение RAW говорит о том, что преобразование символов не выполняется; этот параметр обеспечивает самую быструю загрузку. Любое другое значение определяет конкретную кодовую страницу. • DATAFI LETYPE — определяет тип файла данных. • CHAR — все данные файла хранятся в символьном формате, с полями, разделенными символами табуляции, и символами перевода строки в конце строк. Данный тип используется по умолчанию. • NATI VE — файл содержит данные SQL Server. Используется для файлов, экспортированных из SQL Server утилитой BCP. • WI DECHAR — файл содержит символы в кодировке UNI CODE. В остальном аналогичен CHAR. • WI DENATI VE — файл содержит данные SQL Server, но все символьные поля хранятся в кодировке UNI CODE. Для файлов CHAR и WI DECHAR вы можете изменить разделители полей и записей. • FI ELDTERMI NATOR — позволяет заменить стандартный разделитель полей (символ табуляции) любой символьной строкой. • FI RSTROW — позволяет загрузить фрагмент файла. Если значение FI RSTROW превышает количество записей в файле, не загружается ни одна запись и выдается сообщение об ошибке. Значение FI RSTROW должно быть меньше или равно LASTROW. В противном случае LASTROW игнорируется. • FORMATFI LE — позволяет работать с широким спектром файлов данных. Файл форматирования позволяет определять поля фиксированной длины, использовать разные разделители для каждого поля и пропускать столбцы (перечислены лишь некоторые возможности) . • KEEPI DENTI TY — загружает значения столбца счетчика из данных файла. • KEEPNULLS — игнорирует значения по умолчанию для столбцов, не загружаемых из файла. Все незагруженные столбцы заполняются значениями NULL. • LASTROW — позволяет загрузить фрагмент файла. Если LASTROW превышает количество записей в файле, загрузка данных прекращается в конце файла и не выдается сообщение об ошибке. Значение FI RSTROW должно быть меньше или равно LASTROW. В противном случае LASTROW игнорируется. • MAXERRORS — позволяет задать количество ошибок перед остановкой BULK I NSERT. По умолчанию BULK I NSERT прекращает работу после 10 ошибок. • ORDER — позволяет отсортировать файл данных в соотвествии с кластерным индексом для ускорения загрузки. Если данные не отсортированы, параметр ORDER игнорируется. Если вы отсортировали данные,

converted to PDF by BoJIoc

но в соответствии со своим порядком сортировки SQL Server отсортировал их иначе, данные считаются неотсортированными. • ROWTERMI NATOR — позволяет выбрать другой разделитель записей. В качестве разделителя записей может использоваться любая строка, состоящая из одного и более символов. • TABLOCK — вместо стандартной страничной блокировки SQL Server использует блокировку таблиц. Ниже приведен пример команды BULK I NSERT: BULK I NSERT pubs.dbo.aut hors FROM 'c: \ dat a\ aut hors.blk' WI TH FI ELDTERMI NATOR '| | ', LASTROW = 300 При наличии соответствующих привилегий эта команда загрузит из файла данных до 300 записей. Файл содержит данные в символьном формате. Поля разделяются двойной вертикальной чертой ( '| | ') , а в конце каждой записи находится стандартный разделитель — символ перевода строки. SQL Serv er выполняет быструю пакетную загрузку без записи в журнал при следующих условиях: • • • •

Для параметра базы данных SELECT I NTO/ BULKCOPY установлено значение TRUE. Таблица не имеет индексов. Таблица не имеет триггеров. Таблица не участвует в процессе репликации.

Любые пакетные операции копирования SQL Server, не удовлетворяющие этим условиям, записываются в журнал транзакций. Такие операции копирования выполняются медленнее, чем операции без записи в журнал, но в рабочих базах данных следует использовать именно их. Дополнительная информация о журналах приведена в главе 13 . UPDATE Команда UPDATE обновляет существующие записи в существующей таблице. Команда UPDATE может использоваться для обновления количества записей, начиная с нуля. Если команда не может обновить ни одной записи, генерируется сообщение об ошибке. Если имя обновляемой таблицы должно использоваться в секции WHERE или в подзапросе, обычно таблице назначается псевдоним. Команда UPDATE имеет следующий синтаксис: UPDATE { < таблица_или_представление> } SET { имя_столбца = { выражение | DEFAULT} | @переменная = выражение } [ ,...n] [ FROM секция_from ] [ WHERE < условия_поиска> | CURRENT OF { { [ GLOBAL] имя_курсора } | имя_переменной_курсора} } ] Команда UPDATE обновляет один или несколько столбцов из таблицы, указанной после ключевого слова UPDATE. MS SQL Server 7 позволяет модифицировать данные и задавать значения для переменной в рамках одной команды. Имена столбцов и переменных разделяются запятыми. При выполнении обновлений действуют следующие правила: • Столбцам могут присваиваться выражения. • В выражениях могут использоваться столбцы таблицы, заданной в секции FROM. • Нельзя непосредственно присвоить столбцу агрегатную функцию. Однако допускается присваивание подзапросов, возвращающих агрегатные функции. • Если за именем столбца следует ключевое слово DEFAULT, столбцу присваивается значение по умолчанию. Секция FROM команды UPDATE подчиняется тем же правилам, что и секция FROM команды SELECT (см. главу 6 ). В нее могут входить объединения ANSI и псевдонимы столбцов. Чтобы включить обновляемую таблицу в объединение, необходимо либо повторно указать таблицу в секции FROM либо воспользоваться расширенными объединениями TSQL.

converted to PDF by BoJIoc

UPDATE t it les SET yt d_sales = 123 FROM t it leaut hor ta WHERE t a.au.ord = 1 AND t it les.t it le_ id = t a.t it le_id В первом примере продемонстрировано применение расширенных объединений TSQL для объединения обновляемой таблицы с другой таблицей. UPDATE t it les SET yt d_sales = 123 FROM t it leaut hor ta j oin t it les t ON t .t it le_id = t a.t it le_id WHERE t a.au.ord = 1 Команда делает в точности то же самое, что и предыдущая, но вместо расширенных объединений TSQL в ней используется объединение ANSI . Продолжим знакомство с синтаксисом UPDATE. Секция WHERE подчиняется тем же правилам, что и секция WHERE команды SELECT. Она может содержать столбцы из обновляемой таблицы и любых таблиц, перечисленных в секции FROM. При отсутствии секции WHERE, ссылающейся на столбец обновляемой таблицы, обновляются все записи. Если команда присваивает значение переменной и из-за содержимого секции WHERE ни одна запись не изменяется, переменная также сохраняет прежнее значение. Параметр CURRENT OF используется с курсорами и будет подробнее рассмотрен в главе 11. При выполнении UPDATE нельзя изменять столбцы счетчика. Если какая-либо из модифицированных записей нарушает правило или ограничение таблицы, вся команда UPDATE не может быть выполнена. Вы не можете изменять кластерный индекс для нескольких записей и модифицировать столбцы типов TEXT, I MAGE или типов данных, использующих символы UNI CODE в одной команде. Рассмотрим несколько примеров, демонстрирующих использование параметров команды UPDATE: UPDATE aut hors SET au_ fnam e = 'hi' + au_fnam e Следующая команда UPDATE присваивает значение переменной и модифицирует столбец. Если ни в одной записи таблицы aut hors столбец au_id не равен "172 -32-1176" , значение переменной @a не присваивается: DECLARE @a int UPDATE authors SET au_ lnam e = 'Sm it h' , @a = -99 WHERE au_ id = "172-32-1176" В следующем примере обновляемые записи отбираются с помощью подзапроса в секции WHERE: UPDATE t it les SET advance = advance * 1.5 WHERE pub_id in (SELECT pub_id FROM publishers WHERE st at e = "CA") Последний пример показывает, что обновляемая таблица может присутствовать в секции FROM: UPDATE t it les SET advance = advance * 1.5 FROM publishers p, t it les t WHERE p.pub_id = t .pub_id AND st at e = "CA" Работа с типами данных TEXT и I MAGE В MS SQL Server 7 обычные команды I NSERT и UPDATE используются для модификации типов данных TEXT и I MAGE без каких-либо ограничений. Кроме того, в SQL Server существуют команды WRI TETEXT и UPDATETEXT, обладающие повышенным быстродействием и более широкими возможностями при работе с данными типа TEXT. Команды WRI TETEXT и UPDATETEXT имеют следующий синтаксис:

converted to PDF by BoJIoc

WRI TETEXT { таблица.столбец указатель_для_TEXT} [ WI TH LOG] { данные} UPDATETEXT { имя_таблицы.имя_столбца_приемника указатель_ приемника} { NULL | смещение_вставки} { NULL | длина_удаления} [ WI TH LOG] [ вставляемые_данные | [ { имя_ таблицы.имя_столбца_ источника указатель_источника} ] Перед чтением и модификацией данных типа TEXT и I MAGE необходимо предварительно инициализировать текстовые указатели. Текстовый указатель создается при вставке или обновлении поля значением, не являющимся NULL. Операция создает текстовый указатель, а также выделяет для поля первую 8килобайтную страницу. Затем текстовый указатель сохраняется в переменной типа BI NARY, имеющей длину не менее 16 байт. По умолчанию операции WRI TETEXT и UPDATETEXT производятся без записи в журнал. Чтобы база данных позволяла выполнять операции без записи в журнал, необходимо присвоить параметру SELECT I NTO/ BULKCOPY значение TRUE. В противном случае команды могут выполняться только с параметром WI TH LOG, в результате чего изменения данных записываются в журнал транзакций. Команда UPDATETEXT позволяет указать позицию поля типа TEXT для удаления существующих или вставки новых данных. Параметр смещение определяет позицию, с которой начинается вставка данных. Нулевое значение соответствует началу поля, а NULL — присоединению данных в конец поля. Параметр длина_удаления определяет количество удаляемых байт от позиции смещения. Если он равен NULL, данные перезаписываются от смещения до конца поля. Команда UPDATETEXT вставляет новые данные с позиции смещение и удаляет байты старых данных в количестве, равном велечине длина_удаления. Например, если смещение равно 10, а длина_удаления — 20, будут удалены 20 байтов существующих данных, начиная с 10 байта. Новые данные вставляются в столбец с 10- го байта. Команда UPDATETEXT также позволяет взять данные из одного столбца с типом данных TEXT или I MAGE и скопировать с тем же типом данных. Такая возможность может пригодиться при копировании столбцов типа TEXT и I MAGE, а также при внесении в них одинаковых изменений. Если вы хотите присвоить для столбца с типом данных TEXT значения NULL без записи операций в журнал, выполните команду WRI TETEXT с указанием значений типа NULL. При выполнении команды WRI TETEXT с указанием значений типа NULL в текстовое поле заносится пустая строка. Чтобы использовать команды WRI TETEXT или UPDATETEXT, необходимо сначала создать текстовый указатель. Он представляет собой внутренний указатель SQL Server на область данных столбца типа TEXT или I MAGE. Текстовый указатель создается либо командой I NSERT с данными, отличными от NULL, либо командой UPDATE с присваиванием столбцу произвольного значения (включая NULL). Работа с текстовыми указателями продемонстрирована в листинге 7 .2 . Листинг 7 .2 . Инициализация текстовых указателей CREATE TABLE MyBook ( Chapt erNum ber I NT NOT NULL, Chapt er TEXT NULL ) -- установка текстового указателя командой insert I NSERT MyBook (Chapt erNum ber, Chapt er) VALUES (7,"" ) -- установка текстового указателя командой insert -- с последующей командой updat e I NSERT MyBook(Chapt erNum ber) VALUES(7) UPDATE My Book SET Chapt er = NULL WHERE Chapt erNum ber = 7

converted to PDF by BoJIoc

Фрагмент создает таблицу MyBook, состоящую из двух столбцов, а затем демонстрирует два способа инициализации текстовых указателей. В первом примере (команда I NSERT) в столбец Chapt er заносится пустая строка. Во втором примере в MyBook вставляется новая запись, однако для столбца Chapt er не указывается значение. Столбец Chapt er получает значение по умолчанию NULL. Не забывайте о том, что при вставке NULL в столбец типа TEXT текстовый указатель не инициализируется. Второй пример обновляет MyBook , присваивая Chapt er значение NULL. При выполнении команды UPDATE, присваивающей столбцу типа TEXT значения NULL, создается правильный текстовый указатель. Следующим шагом является сохранение текстового указателя в локальной переменной. Переменная, предназначенная для хранения текстового указателя, должна относиться к типу BI NARY или VARBI NARY с длиной не менее 16 байт. Обращение к текстовому указателю производится с помощью функции TEXTPTR. Следующий пример показывает, как сохранить текстовый указатель: DECLARE @MyPt r BI NARY(16 ) SELECT @MyPt r = TEXTPTR(Chapt er) FROM MyBook WHERE Chapt erNum ber = 7 В этом примере создается локальная переменная @My Pt r типа BI NARY длиной 16 байтов. Команда SELECT обращается к текстовому указателю для столбца Chapt er и присваивает @My Pt r значение этого указателя. После сохранения текстового указателя в переменной можно использовать команды WRI TETEXT и UPDATETEXT. WRI TETEXT My Book.Chapt er @MyPt r WiTH LOG "Chapt er 7 Term s you'll need t o Underst and ..." WRI TETEXT My Book.Chapt er @MyPt r 33 1 WI TH LOG " u" В этом примере команда WRI TETEXT перезаписывает значение столбца Chapt er с текстовым указателем @MyPt r. Затем команда UPDATETEXT использует тот же текстовый указатель для замены 33- го символа, " U" , символом нижнего регистра " u" . Примечание После того как текстовый указатель был инициализирован, он не изменяется при изменении данных в столбце. Модификация данных с использованием представлений Модификация данных с использованием представлений имеет много общего с непосредственной модификацией данных в таблицах. Представления допускают как вставку, так и обновление данных. Модификация данных в представлениях рассматривается в главе 10. Примеры экзаменационных вопросов Que stion 1 Using t he Pubs dat abase in Appendix A, which answers are t rue about t he following I NSERT st at em ent ? [ Check all correct answers] insert discount s ( stor_ id, lowqty , discount ,discount t ype ) values (6380, 10, 20, 'My Discount ') • • • • •

A. The st at em ent will insert one row int o t he discount t able if t he st or_id 6380 exist s in t he st ores t able. B. The I NSERT will fail, because st or_id is a character colum n and you are t rying t o insert an int eger int o it . C. The colum n highqt y will be set t o NULL. D. I f a discount type 'MyDiscount ' already exist s, t he row w ill not be added. E. None of t he above.

Вопрос 1 Используется база данных Pubs из приложения А. Какие утверждения будут истинны для следующей команды I NSERT? [ Выберите все правильные ответы] insert discount s ( st or_id, lowqt y, discount ,discount t ype ) values (6380, 10, 20, 'My Discount ') • A. Команда вставит одну запись в таблицу discount , если в таблице st ores существует st or_id 6380.

converted to PDF by BoJIoc

• B. Команда I NSERT не будет выполнена, поскольку st or_id является символьным столбцом, а вы пытаетесь вставить в него целое число. • C. Столбцу highqt y будет присвоено значение NULL. • D. Если discount ty pe 'MyDiscount ' уже существует, запись не добавляется. • E. Ни одно из перечисленных утверждений. Правильные ответы — A и C. Ответ A правилен, поскольку правила ссылочной целостности требуют, чтобы значение st or_ id присутствовало в таблице st ores перед его включением в таблицу discount . Ответ C тоже правилен, поскольку для столбца highqty не определено значение по умолчанию, однако столбец допускает NULL; это значение и будет автоматически присвоено ему SQL Server. SQL Server автоматически преобразует целое число в символьные данные, поэтому ответ B неверен. Ответ D неверен, поскольку в таблице не существует уникальных индексов, ограничений или триггеров, обеспечивающих уникальность. Que stion 2 Using t he Pubs dat abase in Appendix A, which SQL st at em ent will update t he em ployee t able by set t ing t he hire dat e t o the publish dat e of t he m ost recent book published when the hire dat e is before Jan 1, 1992? I f t here is no publish date, it will set t he hire date t o t he current date and t im e. [ Check all correct answers] • A. updat e em ployee set hire_dat e = isnull(( select m ax( pubdat e) from t it les t where em ployee.pub_id = t .pub_ id and hire_date < 'Jan 1 1992 ') , getdat e( )) • B. updat e [ em ployee] set [ hire_dat e] = isnull(( select m ax( [ pubdat e] ) from [ t it les] t where em ployee.[ pub_id] = t .[ pub_ id] ) .get dat e() ) where [ hire_date] < 'Jan 1 1992' • C. updat e em ployee set hire_dat e = isnull(( select m ax( pubdat e) from t it les t where em ployee.pub_id = t .pub_ id),get dat e( )) where hire_dat e < 'Jan 1 1992' • D. updat e [ em ployee] set [ hire_dat e] = isnull( m ax( [ pubdat e] ), GETDATE( )) from [ t it les] t where em ployee.[ pub_id] = t .[ pub_id] and [ hire_dat e] > 'Jan 1 1992' • E. updat e em ployee set hire_dat e = isnull(pubdat e,get dat e( )) from t it les t where em ployee.pub_id * = t .pub_id and hire_date < 'Jan 1 1992 ' and t .pubdat e = (select m ax(pubdate) from t it les2 where t 2.pub_id = em ployee.pub_id) Вопрос 2 Используется база данных Pubs из приложения А. Какая команда SQL обновляет таблицу em ployee, присваивая столбцу hire_dat e дату публикации (pubdate) самой последней опубликованной книги, если дата hire_dat e предшествует 1 января 1992 года? Если дата публикации не задана, столбцу hire_dat e присваиваются текущая дата и время. [ Выберите все правильные ответы] • A. updat e em ployee set hire_dat e = isnull(( select m ax( pubdat e)

converted to PDF by BoJIoc

from t it les t where em ployee.pub_id = t .pub_ id and hire_date < 'Jan 1 1992 ') , getdat e( )) • B. updat e [ em ployee] set [ hire_dat e] = isnull(( select m ax( [ pubdat e] ) from [ t it les] t where em ployee.[ pub_id] = t .[ pub_ id] ) .get dat e() ) where [ hire_date] < 'Jan 1 1992' • C. updat e em ployee set hire_dat e = isnull(( select m ax( pubdat e) from t it les t where em ployee.pub_id = t .pub_ id),get dat e( )) where hire_dat e < 'Jan 1 1992' • D. updat e [ em ployee] set [ hire_dat e] = isnull( m ax( [ pubdat e] ), GETDATE( )) from [ t it les] t where em ployee.[ pub_id] = t .[ pub_id] and [ hire_dat e] > 'Jan 1 1992' • E. updat e em ployee set hire_dat e = isnull(pubdat e,get dat e( )) from t it les t where em ployee.pub_id * = t .pub_id and hire_date < 'Jan 1 1992 ') and t .pubdat e = (select m ax(pubdate) from t it les2 where t 2.pub_id = em ployee.pub_id) Правильные ответы — B и C. Оба ответа, B и C, выполняют одни и те же действия — вычисляют максимальное значение pubdat e для издателя, на которого трудится работник. Если опубликованных книг нет, pubdat e присваивается текущая дата. Модификация выполняется лишь в том случае, если значение hire_date меньше 1 января 1992 г. Команда из ответа A синтаксически правильна, однако в ней отсутствует секция WHERE, поэтому команда обновляет все записи таблицы em ploy ee. Ответ D содержит неверную команду SQL, поскольку секция SET содержит агрегатную функцию. Команда из ответа E тоже неверна — таблица t it les входит во внутреннее и внешнее объединения T-SQL. Que stion 3 Which answers are t rue regarding t he following SQL? [ Check all correct answers] declare @a varbinary (16) select @a = t ex tpt r(logo) from pub_info updat et ext pub_info.logo @a 3 10 '000123' • • • • •

A. The st at em ent will fail, because you cannot use UPDATETEXT wit h an im age colum n. B. The st at em ent will fail, because 10 characters are being replaced wit h 6 charact ers. C. The st at em ent will fail, because the variable @a is a VARBI NARY, not a BI NARY. D. The st at em ent will rem ove 10 byt es start ing wit h byt e 3 and insert t he by tes for '000123'. E. None of t he above.

Вопрос 3 Какие утверждения верны по отношению к следующему фрагменту кода SQL? [ Выберите все правильные ответы] declare @a varbinary (16) select @a = t ex tpt r(logo) from pub_info updat et ext pub_info.logo @a 3 10 '000123' • A. Команда не будет выполена, поскольку UPDATETEXT не может использоваться для столбцов типа im age. • B. Команда не будет выполнена, поскольку 10 символов заменяются 6 символами.

converted to PDF by BoJIoc

• C. Команда не будет выполена, поскольку переменная @a относится к типу VARBI NARY, а не к BI NARY. • D. Команда удалит 10 байт, начиная с третьего, и вставит байты '000123'. • E. Ни одно из перечисленных утверждений. Правильный ответ — D. Смещение равно 3, длина заменяемого фрагмента — 10, а заменяющий фрагмент — '000123'. Ответ A неверен, поскольку команда UPDATETEXT модифицирует любые типы неструктурированных двоичных данных ( BLOB). Ответ B неверен, поскольку команда UPDATETEXT позволяет сокращать размер текстовых и графических столбцов. Наконец, ответ C тоже неверен; текстовый указатель может иметь тип BI NARY или VARBI NARY длиной не менее 16 байт. Que stion 4 Which answers are t rue about t he following SQL st at em ent s? [ Check all correct answ ers] select * int o # pubs1 from aut hors where au_ id > '123-45-6789 ' select * int o # pubs1 from aut hors where au_ fnam e like 'A% ' • • • • •

A. A t able will be creat ed in t he current dat abase. B. A t able will be creat ed in t em pdb. C. The st at em ent s will only work if t he 'Select Creat e' dat abase opt ion is t urned on. D. The t able creat ed will only have t he row s from t he first SELECT st at em ents. E. None of t he above.

Вопрос 4 Какие утверждения верны по отношению к следующим командам SQL? [ Выберите все правильные ответы] select * int o # pubs1 from aut hors where au_ id > '123-45-6789 ' select * int o # pubs1 from aut hors where au_ fnam e like 'A% ' • • • • •

A. Таблица будет создана в текущей базе данных. B. Таблица будет создана в tem pdb. C. Команды будут работать лишь в том случае, если установлен параметр базы данных 'Select Creat e'. D. Созданная таблица будет содержать записи лишь из первой команды SQL. E. Ни одно из перечисленных утверждений.

Правильный ответ — E. Все остальные ответы неверны, поскольку к моменту компиляции второй команды SELECT I NTO таблица # pubs1 уже существует. Это сделает выполнение всего пакета невозможным. ГЛАВА 8

Конфигурация сеанса Ключевые термины • • • • • • •

Параметр конфигурации Взаимная блокировка Тайм-аут для блокировки Математическое переполнение Управление запросами Косвенные транзакции Уровень изоляции транзакций

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

converted to PDF by BoJIoc

Команда SET Команда SET влияет на особенности поведения SQL Server во время подключения. С ее помощью можно настроить формат вывода результатов, вывести статистику обработки данных и воспользоваться диагностическими средствами для отладки TSQL. Microsoft делит команды SET на семь категорий: • • • • • • •

команды даты и времени; команды блокировки; разные команды; команды выполнения запросов; команды настройки SQL-92; команды вывода статистики; команды транзакций.

Внимание При выполнении хранимых процедур действуют текущие параметры SET. Если значение параметра изменяется внутри процедуры, то после ее завершения параметр возвращается к значению, действовавшему до вызова хранимой процедуры. В следующих разделах описаны все семь типов команд SET в классификации Microsoft . Команды даты/ времени Команды даты/ времени определяют формат, используемый при выводе даты и времени. В SQL Server существуют две функции для управления форматом даты: SET DATEFI RST и SET DATEFORMAT. SET DATEFI RST Команда SET DATEFI RST определяет день, который считается первым днем недели. Команда имеет следующий синтаксис: SET DATEFI RST число, где число принимает значения от 1 до 7. В табл. 8.1 перечислены допустимые значения параметра команды SET DATEFI RST. Таблица 8.1. Значения параметра DATEFI RST Значение Значение 1

Понедельник

2

Вторник

3

Среда

4

Четверг

5

Пятница

6

Суббота

7

Воскресенье

По умолчанию первым днем недели назначается воскресенье (7 ). При использовании функции DATEPART для получения дня недели возвращаемое значение основано на текущем выборе первого дня недели (дополнительные сведения о функции DATEPART приведены в главе 6) . Например, в стандартной конфигурации пятница является шестым днем недели. Если назначить первым днем недели понедельник, то пятница будет пятым днем недели. Совет Чтобы узнать, какой день недели в настоящее время является первым, воспользуйтесь функцией @@DATEFI RST. SET DATEFORMAT

converted to PDF by BoJIoc

Команда SET DATEFORMAT определяет формат, используемый при выводе данных в символьных строках SQL Serv er. Помните о том, что SET DATEFORMAT не влияет на формат возвращаемых дат или строк, полученных при преобразовании даты в символьные строки. DATEFORMAT влияет только на символьные значения, преобразуемые в дату. Команда SET DATEFORMAT имеет следующий синтаксис: SET DATEFORMAT { формат | @форматная_переменная} В табл. 8 .2 перечислены допустимые форматы для команды SET DATEFORMAT. Таблица 8.2. Допустимые форматы даты для команды SET DATEFORMAT Формат Описание

Пример

m dy

Месяц, дата, год 07 / 30/ 99

m yd

Месяц, год, дата 07 / 99/ 30

dym

День, год, месяц 30 / 99/ 07

dm y

День, месяц, год 30 / 07/ 99

ym d

Год, месяц, день 99 / 07/ 30

ydm

Год, день, месяц 99 / 30/ 07

При преобразовании строки в поле DATETI ME формат даты определяет порядок следования дня, месяца и года в строке. Если выбран формат m dy, дата 01 / 07/ 1999 соответствует 7 января 1999 года. Если выбрать формат dm y, то 01 / 07/ 1999 соответствует 1 июля 1999 года. Если SQL Serv er настроен на стандарт USEnglish, по умолчанию используется формат m dy . Формат даты не влияет на даты, отформатированные в числовом виде. Числовой формат всегда интерпретируется в порядке ym d. Например, значение 19990730 соответствует 30 июля 1999 г. Команды блокировки Команды блокировки управляют блокировкой данных в SQL Server. Они позволяют управлять взаимными блокировками (deadlock s) и тайм- аутом ( интервалом времени, в течение которого подключение ожидает снятия блокировки). SET DEADLOCK_PRI ORI TY Команда SET DEADLOCK_PRI ORI TY управляет взаимными блокировками. Ситуация взаимной блокировки возникает тогда, когда два подключения блокируют некоторые ресурсы и для продолжения работы каждому из них нужен доступ к ресурсу другого подключения. Команда SET DEADLOCK_PRI ORI TY имеет следующий синтаксис: SET DEADLOCK_PRI ORI TY { LOW | NORMAL | @переменная } Как видно из синтаксиса, приоритет взаимной блокировки может быть низким (LOW) или стандартным (NORMAL). Приоритет также может определяться переменной, содержащей LOW или NORMAL. При выборе приоритета LOW SQL Server повышает вероятность того, что ваша блокировка будет выбрана в качестве жертвы взаимоблокировки. Приоритет NORMAL означает, что SQL Server выполняет обычную обработку взаимных блокировок, а ваша блокировка выбирается жертвой взаимной блокировки со стандартной вероятностью. По умолчанию для взаимных блокировок используется приоритет NORMAL. SET LOCK_TI MEOUT По умолчанию подключение переходит в состояние ожидания до тех пор, пока заблокированный ресурс не освободится. Команда SET LOCK_TI MEOUT позволяет изменить это поведение и задать интервал в миллисекундах, в течение которого подключение ждет освобождения заблокированных ресурсов до наступления тайм-аута. Команда SET LOCK_TI MEOUT имеет следующий синтаксис: SET LOCK_TI MEOUT число_миллисекунд Если присвоить LOCK_TI MEOUT значение –1, SQL Server переходит к стандартной обработке блокировок; для подключений, ожидающих снятия блокировки, тайм-аут не наступает никогда. Любое положительное

converted to PDF by BoJIoc

число определяет интервал ожидания в миллисекундах. Текущее значение тайм- аута определяется функцией @@LOCK_TI MEOUT. Разные команды Категория объединяет все команды, которые Microsoft не относит ни к одной из других категорий. В частности, команды этого типа определяют обработку значений типа NULL, поведение курсоров и столбцов счетчика. SET CONCAT_NULL_YI ELDS_NULL Команда SET CONCAT_NULL_YI ELDS_NULL определяет поведение SQL Server при конкатенации строк со значениями типа NULL. Она имеет следующий синтаксис: SET CONCAT_NULL_YI ELDS_NULL { ON | OFF } Если флаг CONCAT_NULL_YI ELDS_NULL установлен, то при конкатенации строки с NULL результат равен NULL. Если флаг сброшен, поведение определяется флагом CONCAT_NULL_YI ELDS_NULL базы данных. Если оба флага сброшены, то результат конкатенации строки с NULL равен NULL. Если флаг подключения сброшен, а флаг базы данных установлен, результат конкатенации также равен NULL. По умолчанию флаг подключения CONCAT_NULL_YI ELDS_NULL установлен. SET CURSOR_CLOSE_ON_COMMI T Команда SET CURSOR_CLOSE_ON_COMMI T определяет поведение курсора при выполнении команды COMMI T. Она имеет следующий синтаксис: SET CURSOR_CLOSE_ON_COMMI T { ON | OFF } Если флаг CURSOR_CLOSE_ON_COMMI T установлен, то каждый раз, когда подключение выполняет команду COMMI T или ROLLBACK, курсоры закрываются (курсоры подробно рассматриваются в главе 11) . Если флаг сброшен, то поведение курсоров при выполнении COMMI T или ROLLBACK определяется флагом CURSOR_CLOSE_ON_COMMI T базы данных. Если оба флага сброшены, то при выполнении команды COMMI T курсоры остаются открытыми. Если хотя бы один из флагов CURSOR_CLOSE_ON_COMMI T находится в состоянии ON, откат приведет к закрытию всех курсоров, за исключением I NSENSI TI VE или STATI C. Драйвер OLE DB Microsoft , драйвер ODBC и DB-Library автоматически сбрасывают флаг CURSOR_CLOSE_ON_COMMI T. SET FI PS_FLAGGER Команда SET FI PS_ FLAGGER используется для проверки SQL на соответствие стандарту ANSI SQL-92. Если параметр FI PS_FLAGGER установлен, то для любой команды, нарушающей стандарт ANSI SQL-92 на уровне параметра, выдается сообщение об ошибке. Команда SET FI PS_FLAGGER имеет следующий синтаксис: SET FI PS_FLAGGER { ENTRY | I NTERMEDI ATE | FULL | OFF } По умолчанию параметр FI PS_FLAGGER находится в состоянии OFF, и SQL Serv er не проверяет нарушения стандарта ANSI SQL-92 в командах T- SQL. Если параметр равен ENTRY, I NTERMEDI ATE или FULL, SQL Server ищет в командах T-SQL нарушения соответствующего уровня ANSI SQL-92. По умолчанию параметр находится в состоянии OFF. SET I DENTI TY_ I NSERT По умолчанию вставка или обновление столбца счетчика с использованием явно заданных значений не разрешается. Команда SET I DENTI TY_ I NSERT позволяет задать значение столбца счетчика. Она имеет следующий синтаксис: SET I DENTI TY_ I NSERT имя_таблицы { ON | OFF } Если для таблицы установлен флаг I DENTI TY_I NSERT, ее столбец счетчика можно модифицировать. В любой момент времени допускается установка параметра I DENTI TY_I NSERT лишь для одной таблицы в базе данных. Если флаг I DENTI TY_ I NSERT сброшен, столбец счетчика таблицы модифицировать нельзя.

converted to PDF by BoJIoc

Если значение, присвоенное столбцу счетчика, превышает текущее максимальное значение столбца, то значения счетчика новых записей будут отсчитываться от новой величины. SET LANGUAGE Команда SET LANGUAGE позволяет выбрать для подключения другой языковой стандарт. Выбранный язык определяет форматы DATETI ME и язык системных сообщений. Команда SET LANGUAGE имеет следующий синтаксис: SET LANGUAGE { язык | переменная } Параметр язык определяет любой язык из системной таблицы syslanguages базы данных m ast er. SET OFFSETS Команда SET OFFSETS используется в сочетании с приложениями DB-Library для поиска ключевых слов в SQL. В экзамене она не встречается. SET PROCI D Команда SET PROCI D используется в сочетании с приложениями DB-Library для возврата идентификатора хранимой процедуры приложению DB-Library . SET QUOTED_I DENTI FI ER Команда SET QUOTED_I DENTI FI ER требует, чтобы SQL Server подчинялся правилам использования кавычек стандарта ANSI SQL-92. При установке флага QUOTED_I DENTI FI ER кавычки ( ") интерпретируются как идентификаторы объектов, а апострофы (') используются для строковых литералов. Если флаг QUOTED_ I DENTI FI ER находится в состоянии OFF, то строковые литералы заключаются как в кавычки, так и в апострофы, а в идентификаторах объектов эти символы не используются. Команда SET QUOTED_ I DENTI FI ER имеет следующий синтаксис: SET QUOTED_I DENTI FI ER { ON | OFF } При использовании DB-Library флаг QUOTED_I DENTI FI ER по умолчанию равен OFF. В приложениях ODBC и OLE DB он по умолчанию равен ON. Команды выполнения запросов Команды выполнения запросов влияют на обработку команд SQL. Например, с их помощью можно ограничивать количество записей, определять, будет ли команда выполняться, управлять выполнением команд и обработкой различных математических условий. SET ARI THABORT Команда SET ARI THABORT определяет поведение SQL Server при возникновении математического переполнения или деления на ноль, когда математическая функция пытается присвоить столбцу значение, не помещающееся в его типе данных. Команда SET ARI THABORT имеет следующий синтаксис: SET ARI THABORT { ON | OFF } Если флаг ARI THABORT находится в состоянии OFF, при возникновении математического переполнения или деления на ноль SQL Serv er выдает предупреждающее сообщение и продолжает работу. Если присвоить ARI THABORT значение ON, то при возникновении математического переполнения или деления на ноль SQL Server завершает текущий запрос или пакет. Примечание В качестве результата операций, вызвавших деление на ноль или переполнение, SQL Server генерирует значение NULL. SET ARI THI GNORE

converted to PDF by BoJIoc

Команда SET ARI THI GNORE определяет, должен ли SQL Serv er выдавать сообщения об ошибках при возникновении математического переполнения или деления на ноль в командах SELECT. Команда SET ARI THI GNORE имеет следующий синтаксис: SET ARI THI GNORE { ON | OFF } Если флаг ARI THI GNORE находится в состоянии OFF, при возникновении математического переполнения или деления на ноль SQL Server выдает предупреждающее сообщение. Если присвоить ARI THI GNORE значение ON, SQL Server в этих ситуациях не будет выдавать сообщение об ошибке. SET FMTONLY Команда SET FMTONLY позволяет настроить SQL Server так, чтобы клиенту возвращалась только информация о столбцах. Команда имеет следующий синтаксис: SET FMTONLY { ON | OFF } Если флаг FMTONLY находится в состоянии OFF, SQL Server анализирует и выполняет команды SQL Server. При этом клиенту передаются данные и информация о столбцах. Если установить флаг FMTONLY, SQL Server ограничивается анализом команд SQL, а клиент получает только информацию о столбцах. При выполнении хранимой процедуры для каждой команды SELECT передается информация о столбцах. SET NOCOUNT Команда SET NOCOUNT позволяет запретить вывод информации о количестве записей, участвовавших в выполнении команды SQL, после каждой команды. Команда имеет следующий синтаксис: SET NOCOUNT { ON | OFF } Если флаг NOCOUNT установлен ( значение по умолчанию) , то для каждой выполняемой команды SQL Server сообщает клиенту количество записей, участвовавших в ее выполнении. Примечание Команда SET NOCOUNT не влияет на функцию @@ROWCOUNT. Функция всегда возвращает количество записей, участвовавших в выполнении предыдущей команды SQL, даже если флаг NOCOUNT находится в состоянии OFF. SET NOEXEC Команда SET NOEXEC запрещает выполнение команд SQL. Она часто используется в сочетании с другими командами SET для анализа команд SQL. Команда имеет следующий синтаксис: SET NOEXEC { ON | OFF } Если флаг NOEXEC установлен, не выполняется ни одна команда SQL за исключением SET NOEXEC. Если флаг NOEXEC находится в состоянии OFF, все команды SQL выполняются как обычно. SET NUMERI C_ROUNDABORT Команда SET NUMERI C_ROUNDABORT определяет действия SQL Server в ситуациях, когда арифметическое округление приводит к потере точности в запросе. Она имеет следующий синтаксис: SET NUMERI C_ROUNDABORT { ON | OFF } По умолчанию флаг NUMERI C_ROUNDABORT находится в состоянии OFF — это означает, что при потере точности SQL Server не выдает ошибок и предупреждений. Если флаг ARI TH_ROUNDABORT сброшен, а NUMERI C_ ROUNDABORT установлен, потеря точности сопровождается выдачей предупреждения. Если установлены оба флага, ARI TH_ROUNDABORT и NUMERI C_ROUNDABORT, при потере точности операция не выполняется с выдачей сообщения об ошибке. SET PARSEONLY

converted to PDF by BoJIoc

Команда SET PARSEONLY определяет режим проверки синтаксиса в командах SQL. Она имеет следующий синтаксис: SET PARSEONLY { ON | OFF } Если флаг PARSEONLY установлен, SQL Server ограничивается проверкой синтаксиса команд SQL — он не проверяет, существуют ли объекты. При установленном флаге PARSEONLY может быть выполнена лишь одна команда SET PARSEONLY OFF. Команда SET PARSEONLY не может использоваться в хранимой процедуре и не может быть включена в пакет вместе с другими командами SQL. SET QUERY_GOVERNOR_COST_LI MI T Команда SET QUERY_GOVERNOR_COST_LI MI T позволяет ограничить выполнение запросов в зависимости от времени, которое будет затрачено на обработку данного запроса по оценке SQL Server. Это называется управлением запросами (query governing). Команда имеет следующий синтаксис: SET QUERY_GOVERNOR_COST_LI MI T целое_число Если целое_число равно нулю, все запросы выполняются независимо от затрат ( под затратами понимается совокупность ресурсов, необходимых для выполнения запроса) . Если параметр является любым положительным числом, то при выполнении любого запроса SQL Serv er оценивает затраты. Если они превышают заданный порог, выполнение запроса не разрешается. По умолчанию параметр QUERY_GOVERNOR_ COST_LI MI T равен 0. SET ROWCOUNT Команда SET ROWCOUNT позволяет ограничить количество записей, участвующих в выполнении команды SQL. Она имеет следующий синтаксис: SET ROWCOUNT целое_число Если целое_число равно 0 , SQL Server не накладывает искусственных ограничений на количество обрабатываемых записей. Если параметр является любым положительным числом, то после обработки заданного числа записей команда SQL прекращает работу ( например, команда SELECT перестает возвращать записи) . Все команды модификации (I NSERT, UPDATE, DELETE) при достижении порогового значения завершают модификацию записей. SET TEXTSI ZE Команда SET TEXTSI ZE используется с типами данных TEXT и I MAGE и определяет количество байт, возвращаемых командой SELECT. Она имеет следующий синтаксис: SET TEXTSI ZE { целое_число | @переменная_int ) Неотрицательное целое_число определяет количество байт, возвращаемых клиентской программе при выборке данных из столбцов типа TEXT или I MAGE. Максимальный объем блока равен 2 Гбайт. При значении 0 объем блока равен 4 Кбайт (значение TEXTSI ZE по умолчанию) . Выполняя команду TEXTSI ZE, вы изменяете значение функции @@TEXTSI ZE. Примечание При подключении к SQL Server через драйвер Microsoft ODBC или OLE DB размер блока 2 147 483 647 байт устанавливается автоматически. Команды настройки SQL- 9 2 Команды Microsoft T- SQL не всегда подчиняются стандарту ANSI SQL. SQL Server позволяет сделать так, чтобы команды SQL работали в соответствии со стандартом ANSI . SET ANSI _DEFAULTS Команда SET ANSI _DEFAULTS используется для включения и отключения целого пакета правил ANSI SQL. Она имеет следующий синтаксис:

converted to PDF by BoJIoc

SET ANSI _DEFAULTS { ON | OFF } При установке флага ANSI _DEFAULTS устанавливаются следующие флаги SET: • • • • • • •

ANSI _NULL_DFLT_ON; ANSI _NULLS; ANSI _PADDI NG; ANSI _WARNI NGS; CURSOR_CLOSE_ON_COMMI T; I MPLI CI T TRANSACTI ONS; QUOTED_I DENTI FI ER.

Если флаг ANSI _DEFAULTS переводится в состояние OFF, устанавливается флаг ANSI _NULL_DFLT_OFF, а следующие флаги сбрасываются: • • • • • •

ANSI _NULLS; ANSI _PADDI NG; ANSI _WARNI NGS; CURSOR_CLOSE_ON_COMMI T; I MPLI CI T TRANSACTI ONS; QUOTED_I DENTI FI ER.

SET ANSI _NULL_DEFAULT_OFF Команда SET ANSI _NULL_DEFAULT_OFF в сочетании с SET ANSI _NULL_ DEFAULT_ ON определяет допустимость по умолчанию значений NULL в столбцах при создании новых столбцов. Команда имеет следующий синтаксис: SET ANSI _NULL_DFLT_OFF { ON | OFF } Если оба флага, ANSI _NULL_DEFAULT_OFF и ANSI _NULL_DEFAULT_ON, сброшены, то параметр базы данных ANSI NULL DEFAULT определяет, разрешаются ли по умолчанию значения NULL в столбцах создаваемой таблицы. Если флаг ANSI _NULL_DFLT_OFF установлен, то по умолчанию значения NULL в столбцах не допускаются (поведение SQL Serv er по умолчанию). В любой момент времени может быть установлен лишь один из флагов ANSI _NULL_DEFAULT_OFF и ANSI _NULL_DEFAULT_ ON. При установке одного из них другой флаг автоматически сбрасывается. Совет При создании таблицы всегда указывайте для столбцов параметр NULL или NOT NULL. В противном случае вы можете не разобраться с параметрами, присваиваемыми командой CREATE TABLE по умолчанию. SET ANSI _NULL_DEFAULT_ON Команда SET ANSI _NULL_DEFAULT_ON обеспечивает выполнение стандарта ANSI для команд CREATE TABLE, в которых не указана допустимость NULL в новых столбцах. Команда имеет следующий синтаксис: SET ANSI _NULL_DFLT_ON { ON | OFF } Флаг ANSI _NULL_DEFAULT_ON работает в сочетании с флагом ANSI _NULL_ DEFAULT_OFF ( см. предыдущий раздел). SET ANSI _NULLS В стандарте ANSI сравнение вида имя_столбца = NULL всегда дает результат FALSE, даже если столбец содержит NULL. Команда SET ANSI _NULLS определяет поведение SQL Server при проверке столбцов на равенство NULL. Команда имеет следующий синтаксис: SET ANSI _NULLS { ON | OFF } При установке флага ANSI _NULLS сравнение столбца с NULL всегда дает результат FALSE. Если для флага ANSI _NULLS установлено значение OFF, то сравнение с NULL столбца, содержащего значение типа NULL, дает истинный результат. Например, при сброшенном флаге ANSI _NULLS следующая команда SELECT возвращает все записи, у которых в поле SpouseNam e находится NULL:

converted to PDF by BoJIoc

SELECT * FROM Person WHERE SpouseNam e = NULL Если флаг ANSI _NULLS установлен, приведенная команда не возвратит ни одной записи. В соответствии со стандартом ANSI при сравнениях столбца с NULL должны использоваться конструкции I S NULL и I S NOT NULL. Следующая команда возвращает все записи из таблицы Person, независимо от значения ANSI _NULLS: SELECT * FROM Person WHERE SpouseNam e I S NULL SET ANSI _PADDI NG Команда SET ANSI _PADDI NG управляет хранением данных типа CHAR, BI NARY, VARCHAR и VARBI NARY, которые либо завершаются последовательностью пробелов, либо имеют длину меньше максимальной длины столбца. Команда имеет следующий синтаксис: SET ANSI _PADDI NG { ON | OFF } Если флаг ANSI _ PADDI NG находится в состоянии OFF: • CHAR — данные дополняются пробелами до ширины столбца; • VARCHAR — из данных удаляются завершающие пробелы, а строки; состоящие из одних пробелов, преобразуются в один пробел; • VARBI NARY — из данных удаляются завершающие нули. Если флаг ANSI _ PADDI NG находится в состоянии ON: • CHAR — данные дополняются пробелами до ширины столбца; • VARCHAR — данные не обрезаются и не дополняются; • VARBI NARY — данные не обрезаются и не дополняются. Примечание Microsoft рекомендует всегда устанавливать флаг ANSI _PADDI NG в состояние ON. SET ANSI _WARNI NGS Команда SET ANSI _WARNI NGS определяет действия при возникновении ошибок, соответствующие стандарту ANSI . Она имеет следующий синтаксис: SET ANSI _WARNI NGS { ON | OFF } Если флаг ANSI _WARNI NGS установлен, следующие условия обрабатываются в соответствии со стандартом ANSI : • При наличии NULL в любой записи, используемой в агрегатной функции, выдается предупреждение. • Деление на ноль или математическое переполнение приводит к откату команды и выдаче сообщения об ошибке. Хотя флаг ANSI _WARNI NGS по умолчанию находится в состоянии OFF, драйверы Microsoft SQL Server OLE DB и ODBC автоматически устанавливают для него значение ON. Команды вывода статистики Команды вывода статистики помогают анализировать запросы. С их помощью можно узнать, какой объем работы выполняет SQL Server при обработке запроса. SET FORCEPLAN Команда SET FORCEPLAN управляет порядком объединения таблиц. Она имеет следующий синтаксис: SET FORCEPLAN { ON | OFF } Если флаг FORCEPLAN находится в состоянии OFF, SQL Server выбирает оптимальный порядок объединения. Если флаг FORCEPLAN установлен, таблицы объединяются в порядке их перечисления в секции FROM. Команда FORCEPLAN влияет не на результат выполнения команд SQL, а лишь на внутренний механизм работы SQL Server. SET SHOWPLAN_ ALL

converted to PDF by BoJIoc

Команда SET SHOWPLAN_ALL используется для вывода информации о выполнении каждой команды SQL. Она имеет следующий синтаксис: SET SHOWPLAN_ ALL { ON | OFF } Если флаг SHOWPLAN_ALL установлен, SQL Server возвращает сведения о выполняемой команде SQL и о том, на какой стадии находится обработка команды. Внимание Команда SHOWPLAN_ALL аналогична SHOWPLAN в предыдущих версиях SQL Server. Команда SHOWPLAN_ALL не может вызываться из хранимой процедуры. Она должна быть единственной командой в пакете. SET SHOWPLAN_TEXT Команда SET SHOWPLAN_TEXT используется для вывода информации о выполнении каждой команды SQL. Она имеет следующий синтаксис: SET SHOWPLAN_TEXT { ON | OFF } Если флаг SHOWPLAN_TEXT установлен, SQL Server возвращает сведения о выполняемой команде и о том, на какой стадии находится обработка команды. Единственная команда SQL, которая может быть выполнена при установленном флаге SHOWPLAN_TEXT, — это команда SET SHOWPLAN_TEXT OFF. Внимание Команда SHOWPLAN_TEXT аналогична последовательности команд SHOWPLAN и NOEXEC в предыдущих версиях SQL Server. Команда SHOWPLAN_TEXT не может вызываться из хранимой процедуры. Она должна быть единственной командой в пакете. SET STATI STI CS I O По команде SET STATI STI CS I O SQL Server возвращает сведения о дисковых операциях, выполняемых командой SQL. Команда имеет следующий синтаксис: SET STATI STI CS I O { ON | OFF } Если флаг STATI STI CS I O установлен, SQL Server возвращает информацию обо всех операциях чтения базы данных, производимых при выполнении команды SQL. SQL Server не возвращает сведений о записи на диск. SET STATI STI CS TI ME По команде SET STATI STI CS TI ME SQL Server возвращает количество миллисекунд, затраченных на выполнение команд SQL. Команда имеет следующий синтаксис: SET STATI STI CS TI ME { ON | OFF } Если флаг STATI STI CS TI ME установлен, SQL Server возвращает количество миллисекунд, затраченных на анализ, компиляцию и выполнение каждой команды SQL. Команды транзакций Команды этой категории управляют обработкой транзакций в SQL Server. В частности, они определяют, следует ли интерпретировать каждую команду SQL как отдельную транзакцию, а также выбирают уровень изоляции транзакций. SET I MPLI CI T_TRANSACTI ONS

converted to PDF by BoJIoc

Команда SET I MPLI CI T_TRANSACTI ONS управляет автоматическим инициированием транзакций в SQL Server. Она имеет следующий синтаксис: SET I MPLI CI T_TRANSACTI ONS { ON | OFF } Если флаг I MPLI CI T_TRANSACTI ONS установлен, SQL Server автоматически начинает транзакцию при выполнении любой из перечисленных ниже команд SQL и при отсутствии незавершенных транзакций: • • • • • • • • • • • •

ALTER TABLE; CREATE; DELETE; DROP; FETCH; GRANT; I NSERT; OPEN; REVOKE; SELECT; TRUNCATE TABLE; UPDATE.

Примечание Если флаг I MPLI CI T_TRANSACTI ONS находится в состоянии OFF (значение по умолчанию в SQL Server), транзакции инициируются командой BEGI N TRANSACTI ON. Команда BEGI N TRANSACTI ON рассматривается в главе 13. SET REMOTE_PROC_TRANSACTI ONS Команда SET REMOTE_PROC_TRANSACTI ONS управляет поведением SQL Server при вызове удаленных процедур. Она имеет следующий синтаксис: SET REMOTE_PROC_TRANSACTI ONS { ON | OFF } Если флаг REMOTE_PROC_TRANSACTI ONS установлен, при каждом дистанционном вызове процедуры RPC SQL Serv er начинает распределенную транзакцию. Запускается Microsoft Dist ribut ed Transact ion Manager (MS DTC) , который управляет выполнением транзакции RPC. Если флаг REMOTE_ PROC_TRANSACTI ONS находится в состоянии OFF, вызов RPC не начинает распределенную транзакцию. SET TRANSACTI ON I SOLATI ON LEVEL Команда SET TRANSACTI ON I SOLATI ON LEVEL управляет работой механизма блокировки. Она имеет следующий синтаксис: SET TRANSACTI ON I SOLATI ON LEVEL { READ COMMI TTED | READ UNCOMMI TED | REPEATABLE READ | SERI ALI ZABLE } В любой момент времени может быть установлено лишь одно значение параметра TRANSACTI ON I SOLATI ON LEVEL. По умолчанию в SQL Server используется значение READ COMMI TED. Различные значения TRANSACTI ON I SOLATI ON LEVEL описаны ниже: • READ COMMI TTED — запрещает « грязное чтение» (чтение изменений данных, не закрепленных в базе) . Разрешается доступ лишь к тем данным, которые не были заблокированы другим подключением. • READ UNCOMMI TED — разрешает чтение данных сквозь блокировки, установленные другими пользователями. Вы сможете читать изменения данных, не закрепленные в базе. • REPEATABLE READ — заставляет SQL Server устанавливать блокировки и запрещает другим пользователям обновлять данные, используемые в команде SQL. Однако REPEATABLE READ не мешает добавлению новых записей в таблицу. Такие записи называются фантомными (phant om rows) и появляются при повторном чтении данных. • SERI ALI ZABLE — обеспечивает самый высокий уровень изоляции транзакций. SERI ALI ZABLE запрещает другим пользователям обновлять данные, открытые для чтения, а также добавлять данные, которые должны участвовать в выборке текущей команды SQL.

converted to PDF by BoJIoc

SET XACT_ABORT Команда SET XACT_ABORT управляет обработкой ошибок времени выполнения ( run- t im e errors) в SQL Server. Она имеет следующий синтаксис: SET XACT_ABORT { ON | OFF } Если флаг XACT_ABORT установлен, то при возникновении ошибки времени выполнения SQL Server отменяет транзакцию. Если флаг XACT_ ABORT сброшен, SQL Serv er ограничивается отменой команды SQL, вызвавшей ошибку. Просмотр пользовательских параметров конфигурации После изменения параметров командой SET иногда бывает необходимо просмотреть их текущие значения. Для просмотра параметров конфигурации используется команда DBCC USEROPTI ONS или функция @@OPTI ONS. D BCC USEROPTI ON S Команда DBCC USEROPTI ONS возвращает все параметры SET для текущего подключения. Она имеет следующий синтаксис: DBCC USEROPTI ONS Команда DBCC USEROPTI ONS возвращает параметры подключения в стандартном табличном формате. В одном столбце таблицы выводятся имена параметров, а в другом — их текущие значения. Команда DBCC USEROPTI ONS может быть выполнена любым пользователем. Следующий пример DBCC USEROPTI ONS предполагает, что команды SET не выполнялись и все параметры сохранили значения по умолчанию: Set Opt ion

Value

-- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -t ext size

64512

language

us- english

dat eform at

m dy

dat efirst

7

ansi_null_dflt _on

SET

Как видно из приведенного примера, в результатах команды DBCC USEROPTI ONS выводятся лишь явно заданные параметры. Например, в таблице отсутствуют строки для параметров ROWCOUNT или TRANSACTI ON I SOLATI ON LEVEL. В следующем примере команда DBCC USEROPTI ONS выполняется после изменения параметров ROWCOUNT или TRANSACTI ON I SOLATI ON LEVEL следующими командами: SET ROWCOUNT 100 SET TRANSACTI ON I SOLATI ON LEVEL READ UNCOMMI TED DBCC USEROPTI ONS Результаты команды DBCC USEROPTI ONS принимают следующий вид: Set Opt ion

Value

-- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- - t ext size

64512

row count

100

language

us- english

dat eform at

m dy

dat efirst

7

ansi_null_dflt _on

SET

isolat ion level

read uncom m it ed

converted to PDF by BoJIoc

В таблице появились дополнительные строки для параметров ROWCOUNT или TRANSACTI ON I SOLATI ON LEVEL. Обратите внимание на одну важную деталь: имена параметров, задаваемых командой SET, не всегда совпадают с именем параметра в результатах DBCC USEROPTI ONS; например, параметр TRANSACTI ON I SOLATI ON LEVEL выводится с именем isolat ion level. @@OPTI ON S Функция @@OPTI ONS возвращает битовую маску, определяющую установленные параметры SET для текущего подключения. Главный недостаток команды @@OPTI ONS заключается в том, что не все параметры влияют на состояние возвращаемой битовой маски. В табл. 8.3 перечислены устанавливаемые биты маски и параметры, связанные с каждым битом. В первом столбце таблицы указан номер бита от правого края результата команды @@OPTI ONS. Во втором столбце находится десятичное число, равное 2 в степени позиции устанавливаемого бита. В последнем столбце указывается параметр SET, который находится в состоянии ON для установленного бита. Единственным исключением является флаг ANSI NULL DEFAULT, для которого в маске выделено два разряда (бит 10 — флаг установлен, бит 11 — флаг сброшен) . Применение функции @@OPTI ONS демонстрирует следующий пример: I F @@OPTI ONS & 64 ! = 0 SELECT 'ARI THABORT I S SET' Таблица 8.3. Биты функции @@OPTI ONS Бит Десятичное значение Параметр 0

1

DI SABLE DEFAULT CONSTRAI N CHECK

1

2

I MPLI CI T TRANSACTI ONS

2

4

CURSOR CLOSE ON COMMI T

3

8

ANSI WARNI NGS

4

16

ANSI PADDI NG

5

32

ANSI NULLS

6

64

ARI THABORT

7

128

ARI THI GNORE

8

256

QUOTED I DENTI FI ER

9

512

NOCOUNT

10

1024

ANSI NULL DEFAULT ON

11

2048

ANSI NULL DEFAULT OFF

В этом примере поразрядная функция AND (&) проверяет, установлен ли шестой бит маски ( десятичное число 64). Если бит установлен, следовательно, флаг ARI THABORT находится в состоянии ON. Пользовательские параметры конфигурации по умолчанию При подключении к SQL Server пользователь получает набор параметров по умолчанию. Значения по умолчанию задаются хранимой процедурой sp_configure, имеющей следующий синтаксис: sp_configure 'user opt ions', маска Битовая маска определяет параметры, устанавливаемые по умолчанию. Если какой- то бит в маску не включен, это означает установку данного параметра в значение OFF. Биты и связанные с ними параметры перечислены в табл. 8 .3 . Даже несмотря на то, что флаги ANSI NULL DEFAULT ON и ANSI NULL DEFAULT OFF представлены разными битами, их нельзя установить одновременно. Совет Вы не сможете изменить значения по умолчанию для всех параметров конфигурации. Допускается

converted to PDF by BoJIoc

изменение только тех параметров, которые перечислены в табл. 8.3. Примеры экзаменационных вопросов Que stion 1 Which of t he following SET st at em ent s can be used t o st op SQL st atem ent s from affect ing any rows? [ Check all correct answers] • • • • •

A. set showplan on B. set noexec on C. set parseonly on D. set rowcount 0 E. set query_governor_cost_ lim it 0

Вопрос 1 Какие из следующих команд SET могут использоваться для того, чтобы команды SQL не изменяли ни одной записи? [ Выберите все правильные ответы] • • • • •

A. set showplan on B. set noexec on C. set parseonly on D. set rowcount 0 E. set query_governor_cost_ lim it 0

Правильные ответы — B и C. Команда SET NOEXEC ON предотвращает выполнение любых команд, за исключением SET NOEXEC. Аналогично, команда SET PARSEONLY переводит SQL Server в режим анализа команд и поиска синтаксических ошибок. Ответ A неверен, поскольку команда SET SHOWPLAN использовалась в предыдущих версиях SQL Server для вывода плана выполнения запроса. В SQL Server 7 команда SET SHOWPLAN была заменена командами SET SHOWPLAN_TEXT и SET SHOWPLAN_ ALL. Ответ D неверен, поскольку по команде SET ROWCOUNT 0 SQL Server возвращает все записи. Наконец, ответ E тоже неверен; команда SET QUERY_GOVERNOR_COST_LI MI T 0 отключает управление запросами, но не мешает их выполнению. Que stion 2 I f t he current default user opt ions only hav e ANSI WARNI NGS and NOCOUNT t urned on, which of t he following SQL statem ent s will also set t he QUOTED I DENTI FI ER and I MPLI CI T TRANSACTI ONS as default opt ions? • A. sp_configure 'user opt ions', 778 • B. set default_ opt ion, 'quoted_ident ifier', on set default_ opt ion, 'im plicit _t ransact ions', on • C. sp_configure 'user opt ions', + 258 • D. set quot ed_ ident ifier on set im plicit _t ransact ions on • E. None of t he above. Вопрос 2 Если из текущих пользовательских параметров по умолчанию установлены только ANSI WARNI NGS и NOCOUNT, какая из перечисленных команд SQL также установит по умолчанию параметры QUOTED I DENTI FI ER и I MPLI CI T TRANSACTI ONS? • A. sp_configure 'user opt ions', 778 • B. set default_ opt ion, 'quoted_ident ifier', on set default_ opt ion, 'im plicit _t ransact ions', on • C. sp_configure 'user opt ions', + 258 • D. set quot ed_ ident ifier on set im plicit _t ransact ions on

converted to PDF by BoJIoc

• E. Ни одна из перечисленных. Правильный ответ — A. Он устанавливает параметры ANSI WARNI NGS (8) , NOCOUNT (512) , QUOTED I DENTI FI ER (256) и I MPLI CI T TRANSACTI ONS (2 ). Если сложить десятичные числа, соответствующие битам маски, в сумме получается 778. Ответ B неверен, поскольку команды SET DEFAULT_OPTI ON не существует. Ответ C тоже неверен; значение 258 устанавливает только флаги QUOTED I DENTI FI ER (256) и I MPLI CI T TRANSACTI ONS (2) , а команда sp_configure 'user opt ions' устанавливает только те флаги, которые непосредственно заданы в маске. Все остальные флаги сбрасываются, поэтому ответ С сбросит флаги ANSI WARNI NGS и NOCOUNT. Ответ D неверен, поскольку флаги QUOTED I DENTI FI ER и I MPLI CI T TRANSACTI ONS устанавливаются только для текущего подключения. Que stion 3 Which of t he following SQL st at em ent s will show you t he value t hat all t he current user opt ions are set t o? • • • • •

A. dbcc useropt ions B. select @@opt ions C. sp_configure D. sp_opt ions E. None of t he above.

Вопрос 3 Какая из следующих команд SQL выводит значения всех текущих пользовательских параметров? • • • • •

A. dbcc useropt ions B. select @@opt ions C. sp_configure D. sp_opt ions E. Ни одна из перечисленных.

Правильный ответ — E; ни одна из приведенных команд не решает поставленную задачу. Ответ A неверен, поскольку он не возвращает значения всех пользовательских параметров. Команда DBCC USEROPTI ONS не возвращает сведения о параметрах, имеющих значения по умолчанию, и описывает лишь часть параметров. Ответ B неверен, поскольку он выдает информацию о 12 параметрах, перечисленных в табл. 8.3. Ответ C неверен, поскольку он возвращает сведения о конфигурации сервера. Ответ D не является допустимой командой SQL и потому вообще не возвращает никакой информации. Que stion 4 The following st at em ent set lock_t im eout 0 will have which of t he following effect s when t he connect ions has t o wait for a lock? • • • •

A. The B. The C. The D. The

connect ion will perform the default behav ior and wait unt il t he locked resource is released. connect ion will im m ediately ret urn wit h an error st at ing t hat t he lock t im e period has been exceeded. SET st at em ent is invalid, so it will hav e no effect on t he lock. connect ion will force t he locked resources t o im m ediately be released by t he ot her connect ion.

Вопрос 4 Имеется следующая команда: set lock_t im eout 0 Каковы будут ее последствия в случае, когда подключению приходится ждать снятия блокировки? • • • •

A. Подключение сохраняет стандартное поведение и ожидает, пока блокировка не будет снята. B. Подключение немедленно выходит из ожидания с ошибкой превышения тайм- аута блокировки. C. Команда SET неверна и потому не влияет на блокировку. D. Подключение заставит другое подключение немедленно освободить заблокированные ресурсы.

Правильный ответ — B; команда SET устанавливает нулевой интервал тайм-аута. Ответ A неверен, поскольку, в отличие от других команд, установка для параметра LOCK_TI MEOUT значения 0 не возвращает его к значению по умолчанию. Чтобы подключение бесконечно ожидало снятия блокировки, следует присвоить LOCK_TI MEOUT значение -1. Ответ C неверен, поскольку команда имеет правильный синтаксис SQL. Ответ D неверен, поскольку описанный в нем вариант не реализуется ни одной командой SQL. ГЛАВА 9

converted to PDF by BoJIoc

Индексы Ключевые термины • • • • • •

Индекс B-дерево ( B-t ree) Кластерный индекс Некластерный индекс Страница Уникальность

Необходимые знания и приемы • Выбор между кластерными и некластерными индексами • Переход от логической модели к физической • Выбор индексов для повышения быстродействия Индекс представляет собой физический объект базы данных, имеющий структуру b-дерева и используемый оптимизатором для ускорения доступа к данным по сравнению с линейным просмотром таблиц. Дополнительное преимущество индексов заключается в том, что они используются для обеспечения уникальности ключа, — это означает, что конкретные значения ключа в столбце не должны повторяться. В SQL Serv er существуют индексы двух типов: кластерные и некластерные. Кластерные и некластерные индексы SQL Serv er позволяет создавать кластерные или некластерные индексы. Определяя для таблицы кластерный индекс, вы тем самым приказываете серверу физически отсортировать данные в порядке индекса. Поскольку создание кластерного индекса приводит к физической сортировке данных, у каждой таблицы может быть лишь один кластерный индекс. Однако одного индекса обычно оказывается недостаточно. При работе с базой данных часто приходится обращаться к данным несколькими способами; наличие нескольких индексов упрощает эту задачу. Как упоминалось ранее, физическая сортировка данных возможна лишь в одном порядке, следовательно, таблица может иметь лишь один кластерный индекс. К счастью, в SQL Serv er существует механизм для выборки данных в порядке, отличном от порядка физической сортировки. Для этого используются некластерные индексы, позволяющие индексировать данные на основании значения ключа в каждой записи. SQL Serv er позволяет создать до 249 некластерных индексов. Между кластерными и некластерными индексами существует много различий. В следующих разделах рассматриваются механизмы реализации для каждого типа индексов. Механизмы реализации кластерных индексов Одна из важнейших особенностей кластерного индекса заключается в том, что один элемент индекса соответствует странице данных. Страница представляет собой физический блок для хранения данных объемом 8 Кбайт. После того как сервер определит страницу (посредством перебора индекса или просмотра таблицы) , он находит на странице нужную запись. Поскольку кластерный индекс позволяет выйти на первую запись результата и организовать последующий перебор таблицы (вместо повторного перемещения по индексу) в поисках остальных записей без возврата на уровень индекса, кластерные индексы отлично подходят для выборки интервалов данных. К этой категории относятся внешние ключи ( объединения), списки имен и любые другие совокупности данных с последовательными ключами. Внимание Для повышения быстродействия одна страница должна соответствовать как можно большему числу элементов индекса, а ширина индекса (количество байт на элемент) должна быть как можно меньше. В SQL Server индексы могут иметь длину до 900 байт и содержать до 16 столбцов данных, однако для оптимизации количества элементов индекса на страницу следует держать параметры индекса на как можно более низком уровне.

converted to PDF by BoJIoc

Кластерный индекс и данные также совместно используют запись в таблице sysindex es (присутствующей в каждой базе данных). Когда серверу требуется найти место, выделяемое для таблицы, он просматривает столбец segm ent таблицы sysindexes. Вероятно, вы уже встречались с b-деревьями при изучении структур данных. Как известно, b-деревья ускоряют поиск данных. Вы начинаете поиск с корня и продолжаете перемещаться по дереву до тех пор, пока не найдете нужный индекс. Рассмотрим структуру b-дерева для кластерного индекса. На рис. 9.1 изображен индекс для столбца last_nam e. Поиск элементов индекса всегда начинается с корневой страницы ( root page), которая является отправной точкой для любых перемещений по дереву. Предположим, вы пытаетесь найти запись «Baker». При входе в индекс с корневой страницы выясняется, что элемент «Baker» находится между «Albert » и « Jones» (учтите, что в SQL Server понятие «между» включает обе границы интервала) . Таким образом вы переходите за указателем « Albert » на следующий уровень индекса. Поиск элемента «Baker» продолжается; на этот раз он находится между «Albert» и « Brown». Указатель «Albert » переводит вас на следующий уровень индекса. В нашем примере следующий уровень индекса представляет собой страницу данных, на которой ищется запись(и) « Baker».

Рис. 9.1. Структура b-дерева для кластерного индекса Благодаря структуре кластерных индексов поиск в них обычно выполняется быстрее, чем при выборке произвольных записей для соответствующих некластерных индексов. Впрочем, это лишь условное правило. Оно в значительной степени зависит от количества указателей, необходимых для индекса каждого типа, а также от их ширины. Иногда кластерный индекс работает значительно быстрее, а иногда вообще не дает никакого выигрыша в скорости. Впрочем, для большинства запросов кластерные индексы работают быстрее некластерных. Конечно, при необходимости некластерный индекс все же дает выигрыш по сравнению с альтернативой — отсутствием какого- либо индекса. Учитывая сказанное, давайте подробнее познакомимся с механизмами реализации некластерных индексов. Механизмы реализации некластерных индексов Некластерные индексы имеют много общего с кластерными. Важнейшая особенность некластерного индекса заключается в том, что один элемент индекса приходится на одну запись. Когда запись будет идентифицирована, к ней происходит непосредственное обращение. Каждой записи в таблице назначается идентификатор. Поскольку в некластерном индексе каждый указатель соответствует одной записи, а также потому, что их указатели имеют больший размер, чем у кластерных индексов (поскольку содержат идентификатор записи, а не просто идентификатор страницы) , некластерные индексы обычно занимают намного больше места. Рассмотрим структуру b-дерева для некластерного индекса (рис. 9.2) . Предположим, у нас имеется некластерный индекс для столбца first_ nam e и мы хотим найти в нем все элементы «Am y».

converted to PDF by BoJIoc

Рис. 9 .2 . Структура b-дерева для некластерного индекса Как упоминалось выше, поиск в индексе всегда начинается с корневой страницы. На корневой странице выясняется, что «Am y» находится между элементами «Am y» и « George» (не забывайте о включении границ интервала) . Указатель «Am y» ведет на следующий уровень индекса. На этот раз элемент «Am y» находится между «Am y» и «Bob» , и мы снова переходим на следующий уровень. В данном примере следующий уровень является завершающим (листовым) уровнем дерева некластерного индекса. На листовом уровне с помощью указателей определяются записи результата. В нашем примере находятся два элемента индекса со значением «Am y» . Обратите внимание: у вас имеются два указателя на записи, по одному для каждого найденного элемента, и для каждого элемента приходится запросить одну страницу. Совет Оптимизатор SQL Server использует специальную методику получения индекса, называемую наложением индексов ( index covering). При этом листовой уровень некластерного индекса интерпретируется как уровень данных кластерного индекса. Наложение индексов способно кардинально ускорить некоторые типы запросов, для которых все необходимые данные находятся внутри индекса. Например, если записи (t it le, qt y_sold) индексируются по столбцу t it le, то при выполнении команды SELECT t it le, sub(qt y_ sold) from t it les group by t it le вся необходимая информация находится в индексе и серверу не придется заново читать базовую страницу. Наложение индексов часто используется для оптимизации и повышения быстродействия. Индексы не следует создавать до загрузки данных ( кроме ситуаций, когда это неизбежно) , поскольку в течение некоторого периода времени статистика индекса не будет соответствовать действительности. Кроме того, при создании индекса необходимо учитывать ряд других соображений. Создание индексов Для повышения быстродействия кластерный индекс следует создавать раньше некластерных индексов. Создание кластерного индекса требует физической сортировки записей, а некластерные индексы содержат указатели на страницы и записи, которые приходится модифицировать при перемещении записей. Внимание При создании кластерного индекса вам понадобится свободное место в базе данных в объеме отсортированной копии с индексом, или примерно 120–150% объема таблицы. Упрощенный вариант создания индекса имеет следующий синтаксис: CREATE [ UNI QUE] [ CLUSTERED | NONCLUSTERED] I NDEX имя_индекса ON имя_таблицы ( столбец [ ,.. .] ) Команда содержит следующие параметры: • UNI QUE — запрещает наличие повторяющихся ключей в таблице. Обычно используется для столбцов первичного ключа. По умолчанию индекс не является уникальным. • CLUSTERED — создает кластерный индекс. • NONCLUSTERED — создает некластерный индекс ( используется по умолчанию) . • имя_индекса — определяет имя индекса, уникальное в пределах таблицы.

converted to PDF by BoJIoc

• столбец — определяет столбцы, включаемые в индекс. Индекс может содержать до 16 столбцов общим объемом до 900 байт. Следующая команда создает кластерный индекс с именем nam e_index: CREATE UNI QUE CLUSTERED index_nam e ON aut hors ( au_lnam e, au_fnam e) Создается уникальный кластерный индекс для таблицы aut hors; индексация ведется сначала по столбцу au_ lnam e, а затем — по столбцу au_fnam e. Другая команда создает некластерный индекс с именем fnam e_ index: CREATE I NDEX fnam e_ index ON aut hors (au_fnam e, au_ lnam e) На этот раз команда создает неуникальный, некластерный индекс для таблицы aut hors с индексацией по столбцам au_fnam e и au_lnam e. Внимание При создании кластерного индекса для таблицы, уже имеющей некластерные индексы, SQL Server автоматически строит заново все некластерные индексы, поскольку в процессе построения кластерного индекса изменяются страницы и позиции записей. Индексы принадлежат к числу объектов базы данных, и потому с ними периодически выполняются вспомогательные операции. Управление индексами Чтобы изменить индекс таблицы, необходимо удалить его и затем создать заново в соответствии с новым определением. Удаление и повторное создание индексов часто выполняется в рабочих базах данных для пересчета коэффициента заполнения или модификации индексных структур в случае их смещения или нарушения сбалансированности со временем. В этих ситуациях повторное создание индекса выполняется по соображениям быстродействия, а не вследствие необходимости. Команда удаления индекса из таблицы имеет следующий синтаксис: DROP I NDEX имя_таблицы.имя_индекса Команда удаляет из базы данных всю структуру индекса, удаляет из системных таблиц все записи индекса и освобождает использовавшиеся страницы. Для получения информации о текущих индексах таблицы используются команды sp_help или sp_helpindex: sp_helpindex go index_nam e index_descript ion index_key s -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- - -- -- -- - - -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- - - -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- - -- -- -- - - -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- - -- -- -- - - -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- - -- -- -- - - -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- - - -- -- - UPKCL_ t it leidind clust ered, unique, prim ary k ey locat ed on PRI MARY t it le_id t it leind nonclust ered locat ed on PRI MARY t it le Совет Для управления свойствами индексов и получения о них информации можно воспользоваться утилитой SQL Ent erprise Manager. Некоторые сведения об индексах

converted to PDF by BoJIoc

Перед тем как завершить главу, мы приводим некоторые факты об индексах, которые следует знать перед сдачей экзамена: • Если индекс определен как уникальный (UNI QUE) , никакие две записи не могут иметь одинакового значения индекса (NULL также считается значением). Проверка уникальности осуществляется при создании индекса, а также при последующих операциях вставки и удаления. • Выбор индекса определяется соображениями быстродействия, а не первичным ключом или другими обстоятельствами. Нередко сгруппированный индекс используется в качестве первичного ключа. Такое решение не всегда обеспечивает оптимальное быстродействие. • Для оптимизации физического размещения данных желательно иметь сгруппированный индекс в большинстве таблиц. • С ростом количества индексов (свыше пяти) затраты, связанные с поддержанием индексов, становятся чрезмерными. • В информационных системах, используемых для поддержки управленческих решений (EI S, Execut ive I nform at ion Syst em s), где обновление практически не осуществляется в реальном времени, единственным ограничением количества индексов является объем дискового пространства. • В системах с оперативной обработкой транзакций (OLTP, Online Transact ion Processing) обычно создается минимальное количество индексов, что позволяет ускорить выполнение команд UPDATE, I NSERT и DELETE. Примеры экзаменационных вопросов Que stion 1 What are t he charact erist ics of a clustered index? [ Check all correct answers] • • • •

A. Physically sort s data in clust ered index order. B. Tends t o be sm aller t hen nonclust ered indexes. C. Should be clustered on prim ary keys. D. Tends t o be one I O fast er t han a nonclust ered index.

Вопрос 1 Какими особенностями обладает кластерный индекс? [ Выберите все правильные ответы] • • • •

A. Физически сортирует данные в порядке кластерного индекса. B. Обычно занимает меньше места, чем некластерные индексы. C. Должен использовать те же столбцы, что и первичный ключ. D. Обычно работает быстрее некластерного индекса.

Правильные ответы — A, B и D, все они относятся к кластерным индексам. Ответ C является решением, принимаемым на стадии физического проектирования, и притом не всегда удачным. Que stion 2 What are t he charact erist ics of a non-clust ered index ? [ Check all correct answers] • • • • •

A. Physically sort s data in clust ered index order. B. Tends t o be sm all com pared t o clust ered indexes. C. Should be clustered on prim ary keys. D. Tends t o be one I O fast er t han a clust ered index. E. None of t he above.

Вопрос 2 Какими особенностями обладает некластерный индекс? [ Выберите все правильные ответы] • • • • •

A. Физически сортирует данные в порядке некластерного индекса. B. Обычно занимает меньше места, чем кластерные индексы. C. Должен использовать те же столбцы, что и первичный ключ. D. Обычно работает на порядок быстрее кластерного индекса. E. Ни одно из перечисленных утверждений.

Правильный ответ — E. Ответы A, B и D неверны, поскольку все они относятся к кластерным индексам. Ответ C неверен, поскольку он соответствует решению стадии физического проектирования, а не характеристике индекса. Que stion 3 I f y ou are designing an EI S (ex ecut ive inform at ion syst em ) or a DSS ( decision support system ), what is t rue about index select ion? [ Check all correct answers]

converted to PDF by BoJIoc

• • • • •

A. Av oid clust ered indexes. B. Av oid nonclust ered indexes. C. The num ber of indexes you choose is largely irrelevant . D. The num ber of indexes you choose should be m inim al. E. You ignore, for t he m ost part , updat e ram ificat ions.

Вопрос 3 Если вы проектируете EI S (информационную поддержку принятия управленческих решений) или DSS (систему поддержки принятия решений), какие из следующих утверждений истинны по отношению к выбору индекса? [ Выберите все правильные ответы] • • • • •

A. Следует избегать кластерных индексов. B. Следует избегать некластерных индексов. C. Количество выбираемых индексов почти ни на что не влияет. D. Количество выбираемых индексов должно быть минимальным. E. Влияние индексов на операции обновления в основном игнорируется.

Правильные ответы — C и E. Ответ C правилен, поскольку общее количество индексов отрицательно сказывается только на операциях обновления. Ответ A неверен — кластерные индексы ускоряют доступ к данным. Ответ B тоже неверен, поскольку в системе обработки запросов должно присутствовать несколько индексов, а кластерный индекс может быть только один. Ответ D неверен по тем же причинам, что и B. Ответ E правилен, поскольку ни в одной из указанных систем пользователи не выполняют немедленного обновления данных. Que stion 4 I f y ou are designing an OLTP (online t ransact ion processing) syst em , w hat is t rue about index select ion? • • • • •

A. Av oid clust ered indexes. B. Av oid nonclust ered indexes. C. The num ber of indexes you choose is largely irrelevant . D. The num ber of indexes you choose should be m inim al. E. You ignore, for t he m ost part , updat e ram ificat ions.

Вопрос 4 Если вы проектируете OLTP (систему оперативной обработки транзакций) , какие из следующих утверждений истинны по отношению к выбору индекса? • • • • •

A. Следует избегать кластерных индексов. B. Следует избегать некластерных индексов. C. Количество выбираемых индексов почти ни на что не влияет. D. Количество выбираемых индексов должно быть минимальным. E. Влияние индексов на операции обновления в основном игнорируется.

Правильный ответ — D. Ответ A неверен, поскольку кластерные индексы ускоряют доступ к данным. Ответ B тоже неверен, поскольку в системе обработки запросов должно присутствовать несколько индексов, а кластерный индекс может быть только один. Неправилен и ответ C — общее количество индексов отрицательно сказывается на операциях обновления ( обновление нескольких индексов требует больше времени) . Ответ E тоже неверен, поскольку именно обновления имеют принципиальное значение в системах OLPT. Que stion 5 Which stat em ent is t rue about clust ered indexes? • • • • •

A. Clust ered indexes are the quickest way t o resolve any query. B. Clust ered indexes are alway s fast er t han nonclust ered indexes. C. Clustered indexes are always fast er than t able scans. D. None of t he above. E. All of t he abov e.

Вопрос 5 Какое утверждение истинно по отношению к кластерным индексам? • • • •

A. Кластерные индексы являются самым быстрым способом выполнения любого запроса. B. Кластерные индексы всегда работают быстрее некластерных. C. Кластерные индексы всегда работают быстрее, чем поиск в таблице. D. Ни одно из перечисленных утверждений.

converted to PDF by BoJIoc

• E. Все перечисленные утверждения. Правильный ответ — D. Ответ A неверен, поскольку наложение индексов или поиск в таблице может происходить быстрее, чем поиск по кластерному индексу. Ответ B неверен, поскольку кластерные индексы часто работают медленнее некластерных индексов с наложением. Ответ C неверен — если индекс не используется в запросе или при выборке всех данных, поиск в таблице выполняется быстрее. Que stion 6 Which stat em ent is t rue about nonclust ered indexes? • • • • •

A. Nonclust ered indexes are t he quickest w ay t o resolve any query . B. Nonclust ered indexes are always faster t han clust ered indexes. C. Nonclust ered indexes are always faster t han t able scans. D. None of t he above. E. All of t he abov e.

Вопрос 6 Какое утверждение истинно по отношению к некластерным индексам? • • • • •

A. Некластерные индексы являются самым быстрым способом выполнения любого запроса. B. Некластерные индексы всегда работают быстрее кластерных. C. Некластерные индексы всегда работают быстрее, чем поиск в таблице. D. Ни одно из перечисленных утверждений. E. Все перечисленные утверждения.

Правильный ответ — D. Ответ A неверен, поскольку наложение индексов может работать быстрее кластерного индекса, но лишь в некоторых типах запросов. Ответ B неверен — некластерные индексы обычно работают медленнее кластерных. Наконец, ответ C тоже неверен; если объем выборки не ограничивается малым процентом данных, из- за затрат на перемещение по индексу и многочисленных обращений к логическим страницам поиск в таблице работает быстрее. ГЛАВА 1 0

Правила, представления и значения по умолчанию Ключевые термины • • • •

Связывание Правило Значение по умолчанию Представление

Необходимые знания и приемы • Создание правил и значений по умолчанию • Связывание правил и значений по умолчанию со столбцами • Создание и использование представлений Правила, представления и значения по умолчанию используются для ограничения или изменения режима доступа к данным таблиц SQL Server. С их помощью можно обеспечить соблюдение простых ограничений доменов; для более сложных доменных ограничений используются триггеры. Объекты всех трех типов (правила, представления, значения по умолчанию) могут существовать самостоятельно; они имеют смысл и без связывания с таблицами. Правила, значения по умолчанию и представления кратко определяются следующим образом: • Правило (rule) — автономный объект базы данных, который связывается со столбцами таблицы и ограничивает их домены. • Значение по умолчанию ( default ) — автономный объект базы данных, который связывается со столбцами таблицы в базе данных и предоставляет значение столбца в том случае, если столбец отсутствует в команде I NSERT. • Представление ( другое название – вид) (view) — автономный объект базы данных, содержащий предварительно проанализированное дерево запроса для команды SELECT.

converted to PDF by BoJIoc

В этой главе мы рассмотрим все три ключевых объекта баз данных. Правила Правило (rule) представляет собой выражение, вычисляемое при вставке или обновлении записи. Если это выражение принимает значение FALSE, команда I NSERT или UPDATE, ставшая причиной нарушения, отменяется. Полный синтаксис создания правил выглядит следующим образом: CREATE RULE имя_правила @переменная оператор выражение [ { AND| OR} ...] Определение правил лучше всего рассматривать на примере: CREATE RULE AgeRule AS @age bet ween 16 and 21 В этом примере переменная @age обозначает позицию, в которую подставляется значение столбца. Имя переменной не влияет на выполнение правила. В табл. 10.1 приведены результаты вставки различных значений в столбец age из приведенного примера. Обратите внимание: запись вставляется лишь в том случае, если вычисленное выражение равно TRUE (помните о том, что связка BETWEEN включает границы интервала) . Для удаления правил используется команда DROP RULE: DROP RULE имя_правила Таблица 10 .1 . Результаты вставки при использовании правила AgeRule Значение Правило 6

FALSE

20

TRUE

30

FALSE

Удаляемое правило исчезает из базы данных. Чтобы использовать правило, необходимо ассоциировать его со столбцом. Этот процесс называется связыванием (binding). Связывание правила со столбцом Для связывания правил со столбцами в SQL Serv er применяется хранимая процедура sp_bindrule. Следующий фрагмент демонстрирует синтаксис связывания правил со столбцами таблицы: sp_bindrule имя_правила, 'имя_таблицы.имя_столбца' Примечание Имена таблиц и столбцов должны заключаться в апострофы или кавычки, поскольку аргумент содержит специальный символ — точку. В этом примере хранимая процедура sp_bindrule приказывает SQL Serv er установить правило с заданным именем для столбца. В результате в таблицу не удастся ввести никакие дополнительные данные, нарушающие это правило. Примечание При вызове процедуры sp_bindrule устанавливаемое правило не распространяется на данные, уже находящиеся в таблице.

converted to PDF by BoJIoc

После того как правило будет связано с таблицей, оно начинает действовать автоматически. Если новое правило накладывается поверх предыдущего, оно немедленно вступает в силу. Для разрыва связи правил со столбцами применяется процедура sp_ unbindrule: sp_unbindrule 'имя_таблицы.имя_столбца' При вызове sp_unbindrule не нужно указывать имя правила, поскольку сервер уже знает, какое правило связано с данным столбцом. Установление и разрыв связи правил со столбцами или типами данных может осуществляться на соответствующих вкладках диалогового окна Rules Propert y (с помощью щелчка правой кнопкой мыши на правиле) утилиты Ent erprise Manager. Ограничения для правил Для правил установлен целый ряд ограничений. Пользуясь правилами, помните следующее: • В правиле могут участвовать только константы, функции SQL Server и маски редактирования. Другими словами, правило ограничивается простыми вычислениями. • Правило не может выполнять просмотр таблицы. Если уровень сложности делового правила требует выполнения просмотра, следует воспользоваться триггером или декларативным ограничением. • В правилах не могут сравниваться столбцы таблиц. Если это неизбежно, воспользуйтесь ограничением. • С каждым столбцом может быть связано лишь одно правило. Чтобы установить второе правило, следует создать ограничение или объединить всю логику в триггер. • Если со столбцом связано некоторое правило, оно замещается новым устанавливаемым правилом. SQL Server рассматривает последовательность правил как стек единичной глубины. • Значения, используемые в правилах, должны быть совместимы с типом данных связанного столбца. При возникновении конфликта снижается быстродействие или возникают ошибки времени выполнения (в зависимости от того, существует ли возможность неявного преобразования типа данных). • Правила не применяются к данным, уже находящимся в таблице, но действуют при обновлении существующих данных. • Правило, связанное со столбцом или пользовательским типом данных, нельзя удалить. Предварительно необходимо разорвать связь правила со всеми столбцами и типами данных. • Правила не действуют при вводе данных с помощью BCP. Если вам необходимо использовать их, воспользуйтесь другой программой ввода (например, напишите собственную программу на C) . • Microsoft не рекомендует пользоваться правилами. Правила оставлены в SQL Server лишь для обеспечения обратной совместимости. Вместо правил Microsoft предлагает использовать ограничения ( см. главу 5 ). Значения по умолчанию, как и правила, являются самостоятельными объектами базы данных, которые могут связываться со столбцами. Значения по умолчанию Значения по умолчанию (default ) используются для заполнения столбцов, отсутствующих в команде I NSERT. Они создаются следующим образом: CREATE DEFAULT имя_значения_по_умолчанию AS выражение_константа Если при вставке новой записи в таблицу вы не передаете значение столбца, для которого установлено значение по умолчанию, то значение по умолчанию заносится в столбец. Внимание Если в качестве значения столбца передается NULL, то значение по умолчанию не применяется, поскольку NULL считается допустимым значением. Следующий пример создает значение по умолчанию с именем AgeDefault : CREATE DEFAULT AgeDefault AS 18

converted to PDF by BoJIoc

Когда значение по умолчанию AgeDefault применяется при вставке записи, в столбец заносится значение 18. Значение по умолчанию является самостоятельным объектом базы данных, который может быть связан с одним или несколькими столбцами в таблицах базы. Тип данных значения по умолчанию должен совпадать с типом столбца, с которым оно связано. Значения по умолчанию удаляются командой DROP DEFAULT: DROP DEFAULT имя_ значения_по_умолчанию При выполнении команды DROP значение по умолчанию удаляется из базы данных. Чтобы значение по умолчанию использовалось сервером для столбца, следует связать его с этим столбцом. Связывание значения по умолчанию со столбцом Связывание значения по умолчанию со столбцом осуществляется с помощью хранимой процедуры sp_bindefault . Процедура имеет следующий синтаксис: sp_bindefault имя_ значения_по_умолчанию, 'имя_таблицы.имя_столбца' Примечание Имена таблиц и столбцов должны заключаться в апострофы или кавычки, поскольку аргумент содержит специальный символ — точку. Хранимая процедура sp_bindefault устанавливает связь между значением по умолчанию и столбцом таблицы. Примечание При вызове процедуры sp_bindefault значение по умолчанию не распространяется на данные, уже находящиеся в таблице. После того как значение по умолчанию будет связано с таблицей, оно начинает действовать автоматически. Если новое значение по умолчанию накладывается поверх предыдущего, оно немедленно вступает в силу. Для разрыва связи между значением по умолчанию и столбцом применяется процедура sp_unbindefault 'имя_ таблицы.имя_столбца': sp_unbindefault 'имя_таблицы.имя_столбца' При вызове sp_unbindrule не нужно указывать имя значения по умолчанию, поскольку сервер уже знает, какое значение по умолчанию связано с данной таблицей. Установление и разрыв связи значений по умолчанию со столбцами или типами данных могут осуществляться на соответствующих вкладках диалогового окна Default s Propert y утилиты SQL Ent erprise Manager. Ограничения для значений по умолчанию Значения по умолчанию имеют крайне ограниченную область применения и подчиняются следующим ограничениям: • В определении значения по умолчанию может использоваться лишь одна константа или функция SQL Server — логические возможности в них отсутствуют. • В значениях по умолчанию не могут использоваться механизмы принятия решений или просмотра таблицы. В таких ситуациях следует использовать триггеры. • С каждым столбцом может быть связано лишь одно значение по умолчанию. Это вполне логично, поскольку столбец не может иметь несколько значений по умолчанию. • При попытке задать второе значение по умолчанию для столбца, у которого уже имеется значение по умолчанию, выдается сообщение об ошибке. • Тип данных значения по умолчанию должен быть совместим с типом данных столбца. Проверка осуществляется во время выполнения, а не во время создания.

converted to PDF by BoJIoc

• Значения по умолчанию не применяются к данным, уже находящимся в таблице. Вместо этого следует написать команду UPDATE для модификации всех записей, у которых значение для данного столбца равно NULL. • Необходимо проследить за тем, чтобы значения по умолчанию не нарушали никаких правил или ограничений столбца. В противном случае любые операции вставки, использующие значение по умолчанию, не будут выполнены. • Значение по умолчанию применяется до применения правила ( следовательно, если правило требует присутствия значения в столбце, значение по умолчанию поможет избежать ошибки при вставке) . • Значения по умолчанию действуют при пакетном копировании, но не применяются к данным, уже находящимся в таблице. • Значение по умолчанию, связанное со столбцом или пользовательским типом данных, нельзя удалить. Предварительно необходимо разорвать связь значения по умолчанию со всеми столбцами и типами данных. Представления Представлением (v iew) называется логический «вид» физических данных, хранящихся в базе. Команда создания вида имеет следующий синтаксис: CREATE VI EW имя_представления [ (имя_столбца, ...) ] [ WI TH ENCRYPT] AS команда_select [ WI TH CHECK OPTI ON ] С практической точки зрения представление является предварительно проанализированной командой SELECT, которая может интерпретироваться как таблица. Формально представление является не физической, а логической таблицей. Другими словами, представление изменяет способ восприятия данных, не изменяя базового объекта базы данных. Как вы вскоре убедитесь, в большинстве ситуаций (в том числе и в командах SELECT) представления работают так же, как обычные таблицы. С помощью представления можно ограничить доступ к записям и столбцам, скрыть объединения или упростить SQL-код посредством предварительного кодирования агрегатов, групп и других сложных конструкций. Если в команде новые имена столбцов не заданы явно, они наследуются из таблиц базы. Обратите внимание на то, что при использовании агрегатов имена столбцов задаются явно. Параметры команды управляют доступом к представлению со стороны пользователей. Например, параметр ENCRYPT запрещает доступ к SQL-коду представления всем, кроме его создателя. Другими словами, при использовании параметра ENCRYPT никто, кроме создателя представления, не сможет просмотреть базовый SQL-код. При установке параметра WI TH CHECK OPTI ON вставка и обновление записей через представление возможны лишь в том случае, если эти записи могут быть получены выборкой из представления. Следующий пример создает представление с именем FLAut horsView, которое выглядит и работает, как таблица: CREATE VI EW FLAuthorsView AS select from aut hors w here st at e = 'FL' Из «таблицы» FLAut hors можно осуществлять выборку данных: SELECT * FROM FLAut horsView Команда возвращает все столбцы и записи таблицы aut hors, для которых значение поля STATE равно 'FL'. При попытке вставить данные в представление с установленным параметром WI TH CHECK OPTI ON операция I NSERT завершится неудачей, если значение поля STATE вставляемой записи отлично от 'FL'. Иначе говоря, если команда I NSERT нарушает представление, параметр WI TH CHECK OPTI ON запрещает вставку. Представление, создаваемое следующей командой, содержит лишь два столбца из таблицы aut hors (au_lnam e и au_fnam e).

converted to PDF by BoJIoc

CREATE VI EW aut hor_nam e AS SELECT last = au_lnam e, first = au_fnam e FROM aut hors Если в команде CREATE VI EW указаны названия столбцов, как в показанном примере, они становятся именами столбцов представления. Внимание Создавая представление, проследите за тем, чтобы имена столбцов соответствовали правилам выбора имен SQL Serv er. Следующая команда извлекает все записи и столбцы из представления aut hor_nam e: SELECT * FROM aut hor_nam e Представления удаляются командой DROP VI EW, имеющей следующий синтаксис: DROP VI EW имя_представления Следующая команда удаляет представление aut hor_nam e: DROP VI EW aut hor_nam e При удалении представления его определение удаляется из базы. Внимание Команду DROP нельзя отменить. К удалению объекта следует относиться осторожно, особенно если у вас нет возможности создать его заново. Представления могут использоваться для различных целей, связанных с защитой данных, от ограничения доступа к столбцам ( вертикальная защита) до ограничения доступа к записям (горизонтальная защита) . Представления: вертикальная защита данных С помощью представления можно ограничить доступ к некоторым столбцам таблицы. Для этого в список выборки включаются лишь те столбцы, к которым вы хотите разрешить доступ пользователям. В следующем примере пользователи могут получать данные трех из четырех столбцов таблицы t it leaut hor — они не имеют доступа к столбцу royalt y : CREATE VI EW t a_lim it ed as SELECT au_id, t it le_id, au_ ord FROM t it leaut hor Работая с представлением t a_ lim it ed вместо таблицы, пользователь может выполнять любые действия со всеми данными, кроме столбца royalt y. Результат выглядит следующим образом: au_ id

t it le_id au_ord royalt y

-- -- -

-- -- -- -- - -- -- -

- -- - -- -- --

172 -32-1176 PS3333 1

100

213 -46-8915 BU1032 2

40

213 -46-8915 BU2075 1

100

.. . 998 -72-3567 PS2106 1

100

Теперь можно разрешить пользователю выборку данных из этого представления, не предоставляя права выборки из базовой таблицы. Представление t a_ lim it ed может использоваться для объединения таблиц t it les и aut hors, как показано ниже: SELECT * FROM aut hors a, t it les t , t a_lim it ed t a WHERE a.au_ id = t a.au_id AND t .t it le_id = t a.t it le_ id

converted to PDF by BoJIoc

Команда выбирает столбцы с именами авторов и названиями книг с помощью представления t a_lim ited. При этом столбец roy alty остается невидимым для пользователя. Вы можете предоставить доступ к представлению, но не к базовой таблице, если вам принадлежат и представление, и таблица. Такая методика может использоваться для ограничения доступа к некоторым частям таблицы без защиты на уровне столбцов, которая сделала бы невозможной выполнение команд SELECT * . Представления: горизонтальная защита данных Представления также могут использоваться для ограничения доступа к отдельным записям базовой таблицы. Секция WHERE ограничивает записи, входящие в представление. Например, следующее представление ограничивает пользователю доступ к записям издателей, находящихся в Калифорнии: CREATE VI EW cal_publishers AS SELECT * FROM publishers WHERE st at e = "CA" Команда SELECT для получения всех записей и столбцов представления, созданного в предыдущем фрагменте, выглядит следующим образом: SELECT * FROM cal_publishers Обратите внимание: команда ничем не отличается от обычной выборки из таблицы. Упрощение SQL- кода с помощью представлений Представления используются для упрощения запросов, а также для маскировки сложных объединений и денормализованных таблиц от пользователя. Например, следующий фрагмент создает представление для работы с трехсторонним объединением: CREATE VI EW t it les_and_ aut hors AS SELECT t it le, au_ lnam e, au_fnam e, t ype FROM t it les t , t a_ lim it ed t a, aut hors a WHERE t .t it le_id = t a.t it le_ id AND a.au_id = ta.au_ id Новое представление содержит созданное выше представление t a_lim it ed. Следующая команда выбирает все записи и столбцы из представления t it les_ and_aut hors: SELECT * FROM t it les_and_aut hors WHERE t ype = "business" Представления и команды I N SERT, UPDATE, DELETE SQL Serv er разрешает вставлять, удалять и обновлять данные в представлениях. Команда I NSERT добавляет записи в базовую таблицу. Команды UPDATE и DELETE модифицируют записи базовой таблицы. Например, следующий фрагмент удаляет записи из базовой таблицы через представление: DELETE aut hor_nam e WHERE last = " Sm it h" AND first = "Joseph" UPDATE cal_publishers SET pub_ nam e = " Joe's Books and Magazines" WHERE pub_id = "1389 " Каждая из приведенных команд модифицирует базовую таблицу. Если представление содержит столбцы из нескольких таблиц, вы не сможете удалить записи из представления или обновить столбцы нескольких таблиц в одной команде UPDATE. Например, следующая команда недопустима:

converted to PDF by BoJIoc

UPDATE t it les_and_aut hors SET t ype = "m od_cook ", au_fnam e = " Mary" WHERE t it le = " The Gourm et Microwave" Из-за подобных ограничений могут возникнуть проблемы, поскольку одна команда может модифицировать лишь одну из базовых таблиц. Проблема решается поочередным обновлением таблиц: UPDATE t it les_and_aut hors SET t ype = "m od_cook " WHERE t it le = " The Gourm et Microwave" UPDATE t it les_and_aut hors SET au_fnam e = "Mary " WHERE t it le = " The Gourm et Microwave" Вставка в представлениях допускается лишь при условии, что все столбцы базовой таблицы, не включенные в представление, допускают значения NULL или для них определены значения по умолчанию. Если представление содержит объединение, вставка допускается при условии, что все вставляемые столбцы принадлежат одной базовой таблице. Таким образом, вы не можете обновлять, удалять или вставлять данные в представлении с секцией DI STI NCT, поскольку DI STI NCT создает временную рабочую таблицу. В такой ситуации вместо настоящей базовой таблицы будет модифицироваться временная таблица. W I TH CH ECK OPTI ON В предыдущих версиях SQL Server пользователь мог посредством вставки или обновления создать запись, которая не могла быть выбрана из этого представления командой SELECT. Ниже приведен пример создания «невидимой» записи: I NSERT I NTO cal_publishers (pub_ id, pub_nam e, cit y, st at e) VALUES (" 1234" , "Joe's Books", " Cant on" , " OH" ) / * Создается «невидимая» запись * / UPDATE cal_publishers SET stat e = " OH" В SQL Serv er 7 флаг WI TH CHECK OPTI ON запрещает пользователям вставку и обновление записей, не входящих в представление. Команда CREATE VI EW с параметром WI TH CHECK OPTI ON имеет следующий синтаксис: CREATE VI EW имя_представления [ (имя_столбца, ...) ] AS команды_select [ WI TH CHECK OPTI ON] В следующем представлении параметр WI TH CHECK OPTI ON разрешает пользователям выборку, модификацию и вставку лишь тех записей, которые входят в представление: CREATE VI EW cal_publishers ASt SELECT * t FROM publisherst WHERE st at e = "CA"t WI TH CHECK OPTI ON Получение информации о представлениях Хранимая процедура sp_help выводит информацию обо всех объектах базы данных, включая представления и таблицы. К сожалению, список может оказаться необъятным. Чтобы ограничиться списком представлений, определенным в таблицах базы данных, воспользуйтесь командой SELECT:

converted to PDF by BoJIoc

SELECT nam e FROM sy sobj ect s WHERE t ype = "V" Список столбцов, входящих в представление, выводится командой вида sp_help имя_представления Чтобы просмотреть SQL- код, создавший представление, воспользуйтесь командой sp_helpt ext имя_представления ALTER VI EW Для модификации представлений используется команда ALTER VI EW. Команда модифицирует существующее представление и не влияет на зависящие от него хранимые процедуры или триггеры, а также не изменяет прав пользователей. В прежних версиях единственным способом модификации представления было его удаление с повторным созданием. При этом менялся идентификатор объекта, что приводило к перекомпиляции хранимых процедур и триггеров, зависящих от представления. Кроме того, приходилось заново предоставлять права пользователям, поскольку при удалении объекта права терялись. Команда ALTER VI EW имеет следующий синтаксис: ALTER VI EW имя_представления [ (столбец [ , .. .n] ) ] [ WI TH ENCRYPTI ON] AS команда_ select [ WI TH CHECK OPTI ON] Команда ALTER VI EW принадлежит к числу новых возможностей SQL Serv er 7 и позволяет модифицировать представления без их удаления и повторного создания. Аргументы ALTER VI EW имеют следующий смысл: • n — заполнитель, обозначающий n-кратное повторение аргумента столбец. • ENCRYPTI ON — шифрует элементы sy scom m ent s, содержащие текст команды CREATE VI EW. Это означает, что никто из пользователей, кроме владельца объекта, не сможет обратиться к SQL-коду представления. • CHECK OPTI ON — производит проверку соответствия модифицированных данных критериям команды SELECT в определении представления. Примечание Права доступа к столбцам сохраняются лишь в том случае, если столбцы сохраняют одинаковые имена до и после выполнения команды ALTER VI EW. Если представление было создано с флагами WI TH ENCRYPTI ON или WI TH CHECK OPTI ON, эти флаги остаются в модифицированном представлении лишь в том случае, если они присутствуют в команде ALTER VI EW. Другими словами, вы можете случайно отменить флаги WI TH ENCRYPTI ON или WI TH CHECK OPTI ON, если забудете включить их в ALTER VI EW. Представление, используемое в настоящий момент, модифицировать нельзя. При попытке модификации Microsoft SQL Server устанавливает для представления монопольную (exclusive) блокировку. Если блокировка была предоставлена ( что означает отсутствие активных пользователей у представления) , SQL Server удаляет все копии представления из кэша процедур. Все существующие планы выполнения процедур, содержащие ссылки на представление, остаются в кэше, однако при следующем вызове они автоматически перекомпилируются. Наконец, по умолчанию право выполнения ALTER VI EW предоставляется членам db_ owner и db_ddladm in, а также владельцу представления. Это право не может передаваться. Некоторые сведения о представлениях Вопросы, связанные с представлениями, часто встречаются на экзамене. Ниже перечислены наиболее важные факты, которые следует запомнить:

converted to PDF by BoJIoc

• Представления могут создаваться только в той базе данных, которую вы используете, хотя к представлениям можно обращаться и из других баз — для этого необходимо ввести полностью определенное имя представления. • Вы должны указать имя для каждого столбца в представлении, если выполняется одно из следующих условий: · Любой столбец представления является производным от константы, встроенной функций или математического выражения. Обратите внимание на возможность присвоения имен столбцам в команде SELECT. · Два и более столбцов таблицы имеют одинаковые имена. · Вы хотите переименовать столбец. • Представление может содержать до 1024 столбцов. В предыдущих версиях максимальное количество столбцов было равно 255. • При обновлении столбцов записи через представление каждая команда UPDATE должна обновлять лишь одну базовую таблицу ( она может ссылаться на несколько таблиц, но должна обновлять только одну) . • Представления не могут содержать следующие конструкции: · SELECT I NTO; · COMPUTE; · ORDER BY ( однако секция ORDER BY может использоваться при выборке из представления); · Ссылки на временные таблицы. Внимание Представления могут содержать агрегатные функции и группировки, объединения, другие представления, секцию DI STI NCT и союзы (последняя возможность появилась относительно недавно). Примеры экзаменационных вопросов Que stion 1 How are business rules current ly enforced at the dat abase level? [ Check all correct answers] • • • • •

A. By defining a rule at t he dat abase level. B. By defining a default . C. By using declarat ive const raint s. D. This has t o be handled program m at ically. E. None of t he above.

Вопрос 1 Каким образом в настоящее время обеспечивается выполнение деловых правил на уровне базы данных? [ Выберите все правильные ответы] • • • • •

A. Определением правила на уровне базы данных. B. Определением значения по умолчанию. C. Посредством использования декларативных ограничений. D. Задача решается на программном уровне. E. Ни одним из перечисленных способов.

Правильные ответы — A и C, хотя предпочтительным является ответ C. Ответ B неверен, поскольку значения по умолчанию не обеспечивают выполнения деловых правил. Ответ D неверен, поскольку вы можете создать правило. Ответ E неверен, поскольку среди ответов присутствует правильный. Que stion 2 What st ep is necessary t o inst ruct t he server t o use a rule for a row? • • • • •

A. The create rule st at em ent B. The bind rule st at em ent C. sp_bindrule D. sp_bindefault E. None of t he above.

converted to PDF by BoJIoc

Вопрос 2 Что необходимо сделать для того, чтобы сервер использовал правило для записей? • • • • •

A. Команда creat e rule B. Команда bind rule C. sp_bindrule D. sp_bindefault E. Ни один из перечисленных ответов.

Правильный ответ — E, поскольку выполнение правила обеспечивается не для записей, а для столбцов в границах роли. Ответ B неверен, поскольку команды BI ND RULE не существует. Ответ D также неверен, поскольку он относится к значениям по умолчанию. Que stion 3 How m any rules can be enforced on a row in a table? • • • • •

A. None. B. One per table. C. One per colum n in t he t able. D. 16 . E. None of t he above.

Вопрос 3 Сколько правил может быть установлено в таблице? • • • • •

A. Ни одного. B. Одно на каждую таблицу. C. Одно на каждый столбец таблицы. D. 16 . E. Ни один из перечисленных ответов.

Правильный ответ — C. Que stion 4 How long does a rule persist in а dat abase? • • • • •

A. Unt il t he session is t erm inat ed. B. Unt il t he rule is dropped. C. Unt il a new rule is creat ed. D. Unt il a const raint replaces t he rule. E. None of t he above.

Вопрос 4 Как долго правило продолжает существовать в базе данных? • • • • •

A. До завершения сеанса. B. До удаления правила. C. До создания нового правила. D. До замены правила ограничением. E. Ни один из перечисленных ответов.

Правильный ответ — B, поскольку правило является хранимым объектом базы данных. Que stion 5 A rule can be dropped: • • • • •

A. By t he owner of the rule. B. By using t he drop rule statem ent . C. I f it is not bound t o a database object . D. All of t he above. E. None of t he above.

Вопрос 5 Правило может быть удалено: • A. Владельцем правила. • B. Командой drop rule.

converted to PDF by BoJIoc

• C. Если оно не связано с объектом базы данных. • D. Все перечисленные ответы. • E. Ни один из перечисленных ответов. Правильный ответ — D. Que stion 6 A default is used [ Check all correct answers] : • • • • •

A. To m odify exist ing dat a in a dat abase. B. To place a v alue in a colum n t hat is insert ed null. C. To place a value in t he colum n t hat was included in t he colum n list in t he insert st at em ent . D. Com m only in current MS SQL applicat ions. E. None of t he above.

Вопрос 6 Значения по умолчанию используются [ Выберите все правильные ответы] : • • • • •

A. Для модификации существующих данных в базе. B. Для включения значений в столбец, для которого при вставке указано значение null. C. Для включения значений в столбец, включенный в список столбцов команды insert . D. Обычно в современных приложениях MS SQL. E. Ни один из перечисленных ответов.

Правильный ответ — B. Ответ A неверен, поскольку значение по умолчанию не влияет на существующие данные. Ответ C неверен, поскольку значение по умолчанию действует на столбцы, отсутствующие в списке столбцов. Ответ D тоже неверен — Microsoft не рекомендует использовать отдельные пользовательские объекты. Ответ E неверен, в списке присутствует правильный ответ. Que stion 7 The preferred m et hod of default ing a value in a colum n is: • • • • •

A. To use a const raint . B. To use a default . C. Writ e t he applicat ion code correct ly. D. None of t he above. E. All of t he abov e.

Вопрос 7 Предпочтительным способом определения значения по умолчанию для столбца является: • • • • •

A. Использование ограничения. B. Использование объекта DEFAULT. C. Правильное написание кода приложения. D. Ни один из перечисленных ответов. E. Все перечисленные ответы.

Правильный ответ — A. Microsoft в настоящее время рекомендует пользоваться именно этим способом. Ответ D неверен, поскольку в списке присутствует правильный ответ. Ответ E неверен, поскольку ответы B и C не принадлежат к числу рекомендуемых способов определения значений по умолчанию в столбцах. Que stion 8 I f y ou bind a rule or default over an exist ing rule or default : • • • • •

A. You will get a runt im e error. B. The first rule or default t o be bound will t ake effect . C. The last rule or default t o be bound will t ake effect . D. The act ion is different for rules and default s. E. None of t he above.

Вопрос 8 Если вы связываете правило или значение по умолчанию поверх существующего правила или значения по умолчанию: • A. Вы получите ошибку времени выполнения. • B. Действует правило или значение по умолчанию, которое было связано первым. • C. Действует правило или значение по умолчанию, которое было связано последним.

converted to PDF by BoJIoc

• D. Для правил и значений по умолчанию будут выполнены разные действия. • E. Ни один из перечисленных ответов. Правильный ответ — C. В столбце может существовать лишь одно правило или значение по умолчанию, а именно то, которое было определено последним. Ответ E неверен, поскольку правильный ответ присутствует в списке. Que stion 9 A v iew can be used: [ Check all correct answers] • • • • •

A. To sim plify code. B. As horizont al securit y. C. As vert ical securit y. D. To hide data. E. To hide underlying dat abase changes.

Вопрос 9 Представление может использоваться: [ Выберите все правильные ответы] • • • • •

A. Для упрощения кода. B. Как средство горизонтальной защиты. C. Как средство вертикальной защиты. D. Для маскировки данных. E. Для маскировки изменений в базе данных.

Правильные ответы — A, B, C, D и E. Во всех ответах даны правильные применения представлений. Que stion 1 0 You can insert rows int o a view: [ Check all correct answers] • • • • •

A. I f all t he underly ing t ables are being updated. B. I f only one underlying t able is being updat ed. C. I f t he Wit h Check Opt ion is set and t he insert ed row does not violat e t he view ’s select . D. I f t he Wit h Check Opt ion is set and the insert ed row v iolat es t he view’s select . E. You cannot insert rows int o a view .

Вопрос 1 0 Вы можете вставлять записи в представление: [ Выберите все правильные ответы] • A. Если обновляются все базовые таблицы. • B. Если обновляется лишь одна базовая таблица. • C. Если флаг Wit h Check Opt ion установлен и вставляемая запись не нарушает критерия выборки представления. • D. Если флаг Wit h Check Opt ion установлен и вставляемая запись нарушает критерий выборки представления. • E. В представление нельзя вставлять записи. Правильные ответы — B и C. Именно в них описаны условия вставки записей через представление. Ответ A неверен — справедливо противоположное утверждение. То же самое относится и к ответу D. Ответ E неверен, подобных ограничений не существует. ГЛАВА 1 1

Программирование на Tr a n sa ct - SQL Ключевые термины • • • • •

Пакет Комментарии Курсор Хранимая процедура Переменная

Необходимые знания и приемы • Программирование на Transact - SQL

converted to PDF by BoJIoc

• Обработка сообщений • Обработка ошибок Язык SQL стандарта ANSI позволяет создавать и модифицировать базы данных и читать из них информацию. Для программирования этого недостаточно. Программирование требует дополнительных возможностей, от управления потоком команд до модульности. По этой причине SQL Server содержит расширенную версию SQL, которая называется Transact -SQL, или TSQL. В этой главе представлены различные компоненты языка T- SQL, от определений пакетов до отличительных особенностей конкретных команд. Хотя вы не найдете в ней подробного описания каждой команды T-SQL, многочисленные примеры помогут лучше освоить материал. Мы рассмотрим следующие конструкции: • • • • • •

пакеты; комментарии; переменные; команды TSQL; курсоры; хранимые процедуры.

Пакеты Пакет ( bat ch) представляет собой группу команд, передаваемых от клиента к серверу. Пакеты являются основой для программ SQL Serv er. После подключения вы начинаете передавать пакеты SQL Serv er. Транзакция (см. главу 13) может включать в себя несколько пакетов. Пакет содержит одну или несколько команд SQL. Например, следующий пакет состоит из двух команд SELECT: SELECT * FROM aut hors SELECT * FROM aut hors Обе команды передаются серверу и выполняются им, а их результаты вместе возвращаются клиенту. Команды пакета анализируются, компилируются и выполняются как единая группа. Если сервер обнаруживает синтаксические ошибки, весь пакет не может быть выполнен. Наконец, если вызов хранимой процедуры не является первой командой пакета, перед именем процедуры должно стоять ключевое слово exec. Например: exec sp_who Комментарии Любой хороший программист знает, что программа нуждается в комментариях — без них сопровождение программы превращается в исключительно сложную задачу. Существует несколько основных вариантов записи комментариев. Комментарии бывают однострочными и многострочными. Как правило, многострочные комментарии используются в «шапке» программы — краткое описание, версия и т. д. Однострочные комментарии обычно комментируют отдельную строку программного кода. Они располагаются в отдельной строке или следуют за командой программы. Ниже приведены примеры многострочных и однострочных комментариев: / * Многострочные комментарии * * используются для различных целей * / -- Однострочный комментарий может находиться в отдельной строке select get dat e( ) - - или продолжать строку команды Совет Если ваша программа выдает ошибки, для которых трудно найти логическое объяснение, проверьте завершение всех многострочных комментариев. Переменные SQL Serv er поддерживает два типа переменных — локальные и глобальные. Локальные переменные существуют только в пределах сеанса, во время которого они были созданы. Глобальные переменные

converted to PDF by BoJIoc

(которые Microsoft постепенно преобразует в функции) используются для получения информации о сервере в целом. Локальные переменные Для хранения временной информации, которую нет смысла заносить в таблицы, следует использовать локальные переменные. Локальные переменные объявляются командой DECLARE и существуют лишь во время выполнения пакета. Следовательно, после завершения пакета вы уже не сможете обратиться к значению переменной. Значения переменных задаются командой SELECT или SET; если значение присваивается одной переменной, эти команды эквивалентны. Команда SELECT может присвоить значения сразу нескольким переменным. В следующем примере команда DECLARE объявляет две переменные. Значение одной переменной задается командой SELECT, а значение другой — командой SET. Затем программа читает значения обеих переменных: DECLARE @t oday dat et im e, @count er int SELECT @count er = 1 SET @t oday = get dat e( ) SELECT @count er, @t oday Результатом выполнения пакета является вывод значений переменных. Встроенная функция get dat e( ) возвращает текущие дату и время. Совет Для повышения эффективности следует присваивать значения нескольких переменных в одной команде SELECT и объявлять несколько переменных в одной команде DECLARE. Microsoft рекомендует для присваивания переменным констант использовать команду SET вместо SELECT. Команда SET работает немного быстрее. Глобальные переменные Глобальные переменные используются сервером для отслеживания информации уровня сервера или данных, относящихся к конкретному сеансу. Для глобальных переменных невозможно явное присваивание или объявление. В табл. 11.1 представлены некоторые глобальные переменные, которые могут вам встретиться как на экзамене, так и на практике. В следующем примере глобальная переменная @@VERSI ON проверяет версию SQL Server: SELECT @@VERSI ON GO -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- - -- -- -- - - -- Microsoft SQL Server 7.00 – 7.00 .517 ( I ntel X86) Jun 19 1998 17 : 06: 54 Copyright (c) 1988-1998 Microsoft Corporat ion Ent erprise version on Windows NT Таблица 11 .1 . Некоторые глобальные переменные Глобальная переменная Описание @@ROWCOUNT

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

@@ERROR

Код ошибки для последней команды SQL.

@@TRANCOUNT

Уровень вложенности транзакции.

@@SERVERNAME

Имя локального сервера

@@VERSI ON

Номер версии SQL Server, дата и тип процессора

@@SPI D

Идентификатор текущего процесса

@@I DENTI TY

Последнее значение счетчика, используемое в операции вставки

converted to PDF by BoJIoc

@@NESTLEVEL

Количество уровней вложенности для хранимой процедуры или триггера

@@FETCH_STATUS

Статус предыдущей команды выборки для курсора

Команды TSQL Transact -SQL (TSQL) дополняет стандарт ANSI , не обладающий возможностями обработки сообщений или управления потоком команд. В сущности, все ваши программы будут написаны именно на TSQL. Команда PRI NT Команда PRI NT передает сообщения длиной до 1024 байт обработчику сообщений клиента. Не путайте обработчики сообщений с обработчиками ошибок. Как правило, обработчик сообщения выглядит, как раскрывающееся окно интерфейсного модуля, а обработчик ошибок изменяет порядок выполнения команд программы. Следующая команда PRI NT просто передает клиентскому обработчику сообщения текст, заключенный в кавычки: PRI NT "This is a m essage" В следующем фрагменте команда PRI NT выводит результат конкатенации строки «Hello» с именем пользователя, полученным от сервера: / * Передать обработчику сообщения переменную * * Переменная должна относиться к символьному типу * / DECLARE @m sg VARCHAR(30) SELECT @m sg = "Hello " + user_ nam e() PRI NT @m sg print convert (char,123) RAI SERROR Команда RAI SERROR передает состояния, коды и сообщения ошибок на программном уровне. Длина стандартных сообщений не может превышать 8000 символов, а длина незапланированных сообщений — 14 000 символов. Синтаксис RAI SERROR, показанный в следующем фрагменте, позволяет использовать стандартное сообщение или определить новое сообщение непосредственно в команде: RAI SERROR ( { код_ошибки | символьная_строка} , код_серьезности, состояние [ , список_аргументов] ) [ WI TH параметр] Коды ошибок должны быть больше 50 и меньше 2 147 483 647. Незапланированные сообщения (ad hoc m essages) автоматически инициируют ошибку с кодом 50 000 . Код ошибки идентифицирует сообщение из таблицы sy sm essages. Следующий пример генерирует незапланированное сообщение со списком аргументов: DECLARE @t ab_nam e VARCHAR(30) , @count int SELECT @t ab_nam e = "aut hors" SELECT @count = count (* ) FROM aut hors RAI SERROR ( "% d rows exist in t able '% s'". 16, 1 , @count , @t ab_ nam e) / * То же самое, но код имеет длину 10 символов, * * выравнивается по левому краю и выводится с префиксом 0 x */ RAI SERROR ( "% - # 10x rows ex ist in t able '% s'" , 16 , 1, @count , @t ab_ nam e) Сообщения об ошибках можно (и должно) стандартизировать и использовать многократно. Для этого сообщения следует определять в базе данных. Синтаксис включения сообщения в базу данных выглядит следующим образом:

converted to PDF by BoJIoc

sp_addm essage код_сообщения, важность, текст_сообщения [ , язык[ , [ FALSE| TRUE] [ , REPLACE] ] ] Здесь важность совпадает со значением код_важности для RAI SERROR, а текст_сообщения содержит до 255 символов и может содержать заполнители. Флаг FALSE| TRUE определяет, должно ли сообщение записываться в журнал ошибок SQL Server. По умолчанию язык равен NULL, что по умолчанию совпадает с языком текущего сеанса. Наконец, параметр REPLACE заменяет существующее сообщение с указанным кодом. Добавленное сообщение можно удалить хранимой процедурой sp_ dropm essage или модифицировать сохраненной процедурой sp_alt erm essage: sp_dropm essage код_сообщения,язык sp_alt erm essage код_сообщения, WI TH_LOG, { TRUE | FALSE} Следующий пример объявляет и использует хранимое сообщение: EXEC sp_ addm essage 52345, 16, 'Row not found' EXEC sp_ addm essage 55555, "No rows exist in t able '% 1 ! '" / * Чтобы использовать сообщение, вызовите RAI SERROR * * без указания строки сообщения * / RAI SERROR (52345 , 16 , 1) DECLARE @t ab_nam e VARCHAR(30) SELECT @t ab_nam e = "aut hors" RAI SERROR (55555 , 16 , 1, @t ab_nam e) / * Удалить пользовательское сообщение * / EXEC sp_ dropm essage 66666 Для управления сообщениями можно воспользоваться утилитой SQL Enterprise Manager — выберите команду Tools| Manage SQL Serv er Messages из меню Server. Перейдите на вкладку Message и нажмите кнопку New ( рис. 11 .1 ). Команды условного выполнения Термин «условное выполнение» означает, что команды выполняются лишь в случае истинности некоторого критерия ( условия). I F…ELSE Конструкция I F…ELSE определяет команды, выполнение которых зависит от некоторого критерия. Она присутствует в большинстве языков программирования. Команда I F…ELSE имеет следующий синтаксис: I F логическое_выражение { команда | блок_команд} [ ELSE { команда | блок_команд}

converted to PDF by BoJIoc

Рис. 11.1. Управление сообщениями в SQL Ent erprise Manager В следующем примере команда I F…ELSE проверяет среднюю цену книг, посвященных бизнесу, и возвращает соответствующий текст: I F ( SELECT AVG( price) FROM t it les WHERE t ype = "business") > $19 .95 PRI NT "The average price of business books is greater t han $19.95 " ELSE PRI NT "The average price of business books is less t han $19.95" Функциональным подмножеством команды I F является проверка существования I F EXI STS. I F EXI STS Команда I F EXI STS позволяет узнать, существуют ли какие- либо экземпляры, определяемые условием. Команда I F EXI STS заменяет конструкцию COUNT(* ) > 0 при проверке существования, поскольку при обнаружении первой совпадающей записи обработка команды SELECT прекращается. Команда из следующего примера определяет, присутствуют ли в таблице данные об авторах по фамилии Sm it h. Программа не подсчитывает количество записей, а всего лишь проверяет факт их существования: DECLARE @lnam e VARCHAR(40) SELECT @k nam e = " Sm it h" I F EXI STS ( SELECT * FROM t it les WHERE au_ lnam e = @lnam e) PRI NT " Aut hor's nam e found ! " ELSE PRI NT " Aut hor's nam e not found ! " Если логическое выражение содержит команду SELECT, эта команда должна быть заключена в скобки. Количество уровней вложенности для команды I F не ограничивается. Команда I F EXI STS часто используется при проверке ссылочной целостности. Внимание

converted to PDF by BoJIoc

Условие I F распространяется ровно на одну команду или блок команд. Из-за этого часто возникают трудноуловимые ошибки. BEGI N…END Конструкция BEGI N…END используется для создания блока команд. Все, что находится между BEGI N и END, является частью блока. Следующий пример проверяет, существует ли в таблице запись автора с фамилией Sm it h, и выполняет некоторые действия в зависимости от результата проверки: I F EXI STS ( SELECT * FROM aut hors) WHERE au_ lnam e = " Sm ith" BEGI N PRI NT " Sm it h exist s" EXEC found_proc END ELSE BEGI N PRI NT " Sm it h not found" EXEC not _found_ proc END Если запись Sm it h существует, выполняется процедура found_proc, а если не существует — процедура not _found_proc. CASE Для тех ситуаций, когда проверка нескольких условий требует многих команд I F, в Microsoft SQL Server предусмотрена конструкция CASE. Она позволяет проверить несколько условий в одной команде SELECT, поскольку может заменить любое выражение. Команда CASE имеет следующий синтаксис: CASE выражение WHEN выражение1 THEN выражение2 [ ...] [ ELSE выражениеN] END / * или * / CASE WHEN логическое_выражение1 THEN выражение1 [ [ WHEN логическое_выражение2 THEN выражение2] [ ...] ] [ ELSE выражениеN] END В следующем примере команда CASE получает данные о типе книги и объеме продаж: SELECT SUBSTRI NG (t it le, 1, 20) CASE t ype WHEN 'popular_com p' THEN ' Com put er book ' WHEN 'm od_cook ' THEN ' Cook book' WHEN 't rad_cook ' THEN ' Cook book' ELSE ' Unknown book ' END, 'Sales are ' + CASE WHEN yt d_sales < 5000 THEN "Poor" WHEN yt d_sales bet ween 5001 AND 10000 THEN " Good" WHEN yt d_sales > 10000 THEN " Awesom e" ELSE "Unknown" END FROM t it les -- -- -- -- -- - -- -- -- -- - - -- -- -- -- - -- -- - -- - -- -- - - -- -- - The Busy Execut ive's Unk now n book Sales are Poor Cooking wit h Com put e Unk nown book Sales are Poor

converted to PDF by BoJIoc

You can Com bat Com pu Unknown book Sales are Awesom e St raight Talk About Unknown book Sales are Poor Silicon Valley Gast r Cook book Sales are Poor The Gourm et Microwav Cook book Sales are Awesom e The Psychology of Co Unknown book Sales are unknown But it is User Frien Com put er book Sales are Good Secrets of Silicon V Com put er book Sales are Poor Net Et iquet te Com put er book Sales are unk nown Com put er Phobic AND Unknown book Sales are Poor I s Anger t he Enem y ? Unk now n book Sales are Poor Life Wit hout Fear Unk now n book Sales are Poor Prolonged Data Depri Unknown book Sales are Poor Em ot ional Securit y: Unknown book Sales are Poor Onions, Leeks, and G Cook book Sales are Poor Fift y Years in Bucki Cook book Sales are Awesom e Sushi, Anyone? Cook book Sales are Poor Без конструкции CASE в этом примере пришлось бы использовать временную таблицу. Циклы W H I LE Конструкция WHI LE используется для многократного выполнения команд. Команда WHI LE вычисляет условие цикла и, если оно равно TRUE, выполняет команду или блок. Команда WHI LE имеет следующий синтаксис: WHI LE логическое_условие [ { команда | блок_команд} ] [ BREAK] [ CONTI NUE] Команда BREAK безусловно завершает выполнение цикла WHI LE и продолжает выполнение с первой команды после END. Команда CONTI NUE заново вычисляет логическое условие и, если оно равно TRUE, продолжает выполнение с начала цикла. В следующем примере цикл выполняется до тех пор, пока средняя цена остается меньшей $25: WHI LE (SELECT AVG(price) FROM t it les) < $25 BEGI N UPDATE t it les SET price = price * 1 .05 / * Если количество книг с ценой < $15 меньше 10, * * продолжить обработку * / I F ( SELECT COUNT(* ) FROM t it les WHERE price < $15 ) < 10 CONTI NUE ELSE / * Если максимальная цена одной книги превышает * * $50, выйти из цикла * / I F ( SELECT MAX(price) FROM t it les) > $50 BREAK END Внимание Обратите внимание на знак доллара ($) в программе. Он упрощает идентификацию аргументов денежного типа при анализе команды. GOTO Существует и другой способ многократного повторения вычислений — с помощью команды GOTO. Однако учтите, что применение GOTO может вызвать насмешки у других программистов (эта команда вышла из моды много лет назад) . Пример использования GOTO показан ниже:

converted to PDF by BoJIoc

DECLARE @count er TI NYI NT SELECT @count er = 0 t op: SELECT @count er = @counter + 1 PRI NT " St ruct ured program m ing scoffs at t he got o" I F @counter < = 10 GOTO t op Строка top: является меткой. Если значение счетчика меньше либо равно 10, управление снова передается метке t op: . WAI TFOR Команда WAI TFOR переводит запрос в состояние ожидания в течение некоторого интервала или до наступления заданного времени (и потому называется обработчиком события) . Команда WAI TFOR имеет следующий синтаксис: WAI TFOR { DELAY " время" | TI ME "время"} Параметр DELAY заставляет пакет или процесс сделать паузу заданной длины (максимальное значение — 24 часа). Если в команде указан параметр TI ME, процесс приостанавливается до наступления заданного времени. В обоих случаях время задается в формате hh: m i: ss — дату задать нельзя. Следующие примеры описаны во встроенных комментариях: / * Пауза до 22 : 00 * / WAI TFOR TI ME "22 : 00: 00" / * Выводить текущий список пользователей каждые 30 секунд * / WHI LE 1 < 2 BEGI N WAI TFOR DELAY "00: 00: 30 " EXEC sp_ who END RETURN Безусловный выход из пакета осуществляется командой RETURN. При желании в команде можно задать код возврата (обратите внимание: эта возможность используется только при выходе из хранимой процедуры). Команда RETURN имеет следующий синтаксис: RETURN { целое} Применение команды RETURN демонстрирует следующий пример: SELECT * FROM aut hors PRI NT " finishing now" RETURN / * ret urn может использоваться с условными конструкциями * / I F NOT EXI STS (SELECT * FROM invent ory WHERE it em _num = @item _num ) BEGI N RAI SERROR ( "Not found" , 16, 1 ) RETURN END PRI NT "No error found" RETURN SET Параметры, задаваемые командой SET, определяют реакцию сервера на некоторые условия. Команда SET имеет следующий синтаксис:

converted to PDF by BoJIoc

SET условие { ON | OFF | значение} Некоторые команды SET приведены в следующем примере: SET SET SET SET SET SET SET

rowcount 100 stat ist ics io on stat ist ics t im e on nocount on show plan on noexec on parseonly on

Параметры настраиваются на уровне сеанса или на уровне процедуры. Они не сохраняются между сеансами. Если параметр изменяется в хранимой процедуре, при выходе из нее параметр восстанавливает прежнее значение. Курсоры Курсоры позволяют приложениям выполнять действия с отдельными записями, входящими в результат запроса, вместо обработки итогового набора в целом. SQL проектировался как язык обработки данных, ориентированный на работу с наборами. Некоторые деловые правила требуют выполнения действий с отдельными записями. По возможности старайтесь избегать подобных ситуаций. Поскольку SQL ориентирован на обработку наборов, переход между отдельными записями снижает быстродействие программы. Предположим, если книга стоит дешевле $15 , вы хотите увеличить ее цену на 15% , а если дороже $15 — уменьшить цену на 10% . Выполните следующую команду UPDATE: UPDATE t it les SET price = price * $1.15 WHERE price < = $15 . UPDATE t it les SET price = price * $ .90 WHERE price > $15 . Что произойдет, если книга стоит $14 .95? Должна ли цена измениться в обоих направлениях? С помощью курсора можно определить цену для каждой записи и обновить ее соответствующим образом. SQL Serv er поддерживает два основных типа курсоров: курсоры T-SQL и курсоры API . Курсоры T- SQL полностью реализуются в рамках SQL. Они часто называются внутренними ( back -end) или языковыми ( language) курсорами. Курсоры API создаются через API -базы данных. Они часто называются интерфейсными (front -end) или клиентскими (client) курсорами. Даже если вам удастся определить языковой курсор, выполняющий команды курсоров T- SQL, смешивать разные типы курсоров не рекомендуется. Этот раздел посвящен курсорам T-SQL. Последовательность действий с курсорами При использовании курсоров T-SQL и API выполняются одни и те же основные действия: 1. Свяжите курсор с итоговым набором и определите характеристики курсора. 2. Заполните курсор командами T-SQL. 3. Произведите выборку обрабатываемых записей. 4. Выполните действия с записями. 5. Закройте курсор. Типы курсоров T- SQL Курсоры T-SQL делятся на три основных типа:

converted to PDF by BoJIoc

• Динамические курсоры — курсоры, при использовании которых изменения данных отображаются при перемещении курсора. Динамические курсоры используют минимальное количество ресурсов сервера за пределами базы данных. Кроме того, они в наименьшей степени используют t em pdb. • Статические курсоры — курсоры, изолированные от изменений в данных. Сервер сохраняет весь итоговый набор курсора в t em pdb при первой выборке. • Ключевые курсоры — курсоры, в которых отображается большая часть изменяемых данных, хотя новые записи и не появляются. При открытии курсора сервер сохраняет ключи возвращаемых записей в t em pdb. Ключевые курсоры умеренно используют t em pdb. Новые записи не включаются в курсор, а при обращении к записи, удаленной другим пользователем, происходит ошибка. Работа с курсорами в T- SQL Ниже приведена последовательность действий при использовании курсора. Проследите за тем, чтобы все операции выполнялись в нужном порядке: 1. Объявите курсор. 2. Откройте курсор. 3. Произведите выборку записей. 4. Модифицируйте или удалите записи из курсора. 5. Продолжайте выборку записей до завершения всей обработки. 6. Закройте курсор. 7. Освободите ресурсы курсора. Объявление курсоров Полный синтаксис объявления курсора выглядит следующим образом: DECLARE имя_курсора CURSOR [ LOCAL | GLOBAL ] [ FORWARD ONLY | SCROLL] [ STATI C | KEYSET | DYNAMI C] [ READ_ ONLY | SCROLL_LOCKS | OPTI MI STI C] FOR команда_select [ FOR UPDATE [ OF список_столбцов] } ] Курсор из следующего примера последовательно перебирает записи таблицы aut hors, у которых в столбце cit y находится значение "Los Angeles" . DECLARE aut hors_curs CURSOR for SELECT * FROM aut hors WHERE cit y = "Los Angeles" FOR READ ONLY Курсор обращается к таблице aut hors и отбирает все записи авторов, живущих в Лос- Анжелесе. Более того, объявление запрещает обновление данных через курсор. Имя курсора подчиняется стандартным правилам выбора имен для объектов баз данных. Объявление курсора с ключевым словом I NSENSI TI VE заставляет сервер создать копию данных во временной рабочей таблице. При работе с курсором вы в действительности работаете с содержимым временной таблицы, которое не изменяется с модификацией настоящей таблицы. Этот механизм позволяет создать «снимок» данных в определенный момент времени, а затем использовать курсор для перебора и обработки данных. Курсоры типа I NSENSI TI VE не обновляются. Параметр SCROLL разрешает дополнительные методы перемещения —переход к первой, последней, а также к предыдущей записям. В курсорах T-SQL может использоваться любая команда SELECT, допустимая в T- SQL и удовлетворяющая следующим условиям:

converted to PDF by BoJIoc

• Команда SELECT не может содержать секции SELECT I NTO, COMPUTE, COMPUTE BY и FOR BROWSE. • При использовании секций GROUP BY, HAVI NG, DI STI NCT или UNI ON курсор становится статическим. • Если все таблицы, используемые в курсоре, не имеют уникального индекса, курсор становится статическим. • Если все столбцы, используемые в ORDER BY, не входят в уникальный индекс, динамический курсор преобразуется в ключевой или статический. Остальные аргументы в синтаксисе DECLARE имеют следующий смысл: • LOCAL — курсор является локальным по отношению к пакету, хранимой процедуре или триггеру, где объявляется курсор. В конце процедуры или триггера локальные курсоры автоматически освобождаются (de-allocat ed). Если курсор передается в качестве выходного параметра, он освобождается лишь после освобождения последней переменной, ссылающейся на него. • GLOBAL — курсор доступен в любой момент в течение подключения. Глобальный курсор освобождается явно или уничтожается в конце сеанса. • FORWARD_ONLY — курсор допускает перебор записей только в прямом направлении ( от первой к последней) . Если ключевое слово STATI C| KEYSET| DYNAMI C не указано, курсор является динамическим. При отсутствии этих ключевых слов параметр FORWARD_ONLY используется по умолчанию; в противном случае по умолчанию используется SCROLL. • STATI C — статический курсор, доступный только для чтения. • KEYSET — ключевой курсор. • DYNAMI C — динамический курсор. • READ_ONLY — курсор доступен только для чтения. • SCROLL_LOCKS — параметр гарантирует, что операции обновления и удаления с использованием выражения WHERE CURRENT будут успешными, а блокировки сохраняются до выборки следующей записи. • OPTI MI STI C — успешность операций обновления и удаления с использованием команды WHERE CURRENT не гарантируется, а блокировки не сохраняются до выборки следующей записи. • FOR READ ONLY — данные не могут обновляться командой UPDATE WHERE CURRENT (ANSI ). • FOR UPDATE — режим используется по умолчанию, если при объявлении курсора не указано обратное. • COLUMN_LI ST — список всех обновляемых столбцов. SQL Serv er разрешает всем пользователям объявлять и использовать курсоры. Объявленный курсор готов к открытию. Открытие курсоров Открытие курсора начинает обработку команды SELECT и готовит курсор к выборке записей. Команда открытия курсора имеет следующий синтаксис: OPEN { { [ GLOBAL] имя_курсора } | @переменная} Параметр GLOBAL означает, что курсор является глобальным. Если существуют локальный и глобальный курсоры с одинаковыми именами, для открытия глобального курсора необходимо задать параметр GLOBAL. Переменная @переменная содержит имя курсора. Приведем пример открытия курсора: DECLARE aut hors_curs CURSOR FOR SELECT * FROM aut hors WHERE cit y = "Los Angeles" FOR READ ONLY OPEN aut hors_curs Приведенный фрагмент объявляет и открывает курсор. Открыть можно только объявленный курсор. Для курсоров I NSENSI TI VE и STATI C количество записей в итоговом наборе курсора должно быть меньше максимального количества записей в таблице SQL Server. Глобальная переменная @@CURSOR_ROWS содержит количество записей, полученных последней командой открытия курсора. После открытия курсора следующим шагом является выборка записей. Выборка записей Выборка записей курсора осуществляется командой FETCH. Для выборки записей необходимо предварительно открыть курсор. Синтаксис выборки записей выглядит следующим образом:

converted to PDF by BoJIoc

FETCH [ направление FROM] { { [ GLOBAL] имя_курсора } | @переменная } [ I NTO список_переменных] Параметры GLOBAL, имя_курсора и @переменная имеют тот же смысл, что и при открытии курсора. Если при объявлении курсора указано ключевое слово SCROLL, параметр направление может принимать следующие значения: • FI RST — курсор перемещается к первой записи итогового набора; • LAST — курсор перемещается к последней записи итогового набора; • NEXT — курсор перемещается на одну запись вперед в текущем наборе ( действие по умолчанию при выборке) ; • PRI OR — курсор перемещается на одну запись назад в текущем наборе; • ABSOLUTE n/ -n — если n является положительным числом, курсор перемещается к n-й записи от начала. Если n является отрицательным числом, курсор перемещается к последней записи набора и отсчитывает n записей в обратном направлении. Если n = 0 , записи не возвращаются. • RELATI VE n/ - n — если n является положительным числом, курсор перемещается на n записей вперед от текущей позиции. Если n является отрицательным числом, курсор перемещается на n записей назад. Если n = 0 , возвращается текущая запись. • В качестве аргументов при использовании параметров ABSOLUTE и RELATI VE курсор может получать целые переменные или параметры хранимых процедур. Следующий фрагмент объявляет и открывает курсор, после чего выбирает из него данные: DECLARE aut hors_curs CURSOR SCROLL FOR SELECT au_lnam e, au_ fnam e FROM aut hors WHERE st at e = "CA" FOR READ ONLY OPEN aut hors_curs FETCH NEXT FROM aut hors_curs DECLARE @lnam e VARCHAR(40) DECLARE @fnam e VARCHAR(20) / * Прочитать следующую запись в локальные переменные * / FETCH NEXT FROM aut hors_curs I NTO @lnam e, @fnam e / * Прочитать 10-ю запись от текущей * / FETCH RELATI VE 10 FROM aut hors_curs CLOSE aut hors_curs DEALLOCATE aut hors_curs Если при объявлении курсора не указано ключевое слово SCROLL, допускается выборка только следующей записи (FETCH NEXT). При наличии списка переменных их типы должны совпадать со списком выборки. Если список переменных не задан, результат возвращается непосредственно. В табл. 11 .2 перечислены глобальные переменные, значения которых можно проверять при работе с курсорами. Таблица 11 .2 . Глобальные переменные, используемые с курсорами Глобальная переменная

Описание

@@CURSOR_ROWS

Количество записей в последнем открытом курсоре: - # = количество записей, находящихся в данный момент в ключевом наборе, если выборка происходит асинхронно. # = количество записей после завершения выборки. 0 = открытые курсоры отсутствуют.

@@FETCH_STATUS

Результат команды FETCH: 0 = выборка успешна.

converted to PDF by BoJIoc

- 1 = выборка завершилась неудачей или запрашиваемая запись выходит за границы диапазона. - 2 = возвращенная запись отсутствует в таблице (она была удалена после открытия курсора) . В следующем примере переменная @@FETCH_STATUS использована в условии цикла WHI LE при обработке курсора: DECLARE t it le_curs CURSOR FOR SELECT t it le, t ype, price, yt d_sales FROM t it les FOR READ ONLY DECLARE @t ype VARCHAR(30) , @price MONEY, @t it le VARCHAR(80), @t otal_ sales int OPEN t it le_curs FETCH t it le_curs I NTO @t it le, @t ype, @price @t otal_ sales WHI LE @@FETCH_STATUS = 0 / * Продолжать, пока остаются необработанные записи * / BEGI N I F @t ype = "business" SELECT Tit le = @t it le, "Net Profit " = ( @price * .5) * t ot al_sales ELSE SELECT Tit le = @t it le, "Net Profit " = ( @price * .7) * t ot al_sales FETCH t it le_curs I NTO @t it le, @t ype, @price, @t otal_ sales END I F @@FETCH_STATUS = -2 / * Выход из цикла по ошибке выборки * / RAI SERROR ( "Row fetched has been deleted" , 16 , 1) CLOSE t it le_curs DEALLOCATE t it le_curs Модификация записей с помощью курсоров Вы можете модифицировать записи с помощью курсора, для чего в команды UPDATE и DELETE включается секция WHERE CURRENT OF: UPDATE имя_ таблицы SET имя_столбца = выражение [ , .. . ] [ FROM имя_таблицы [ , имя_ таблицы] ] WHERE CURRENT OF имя_курсора [ { AND | OR} ... ] DELETE [ FROM] имя_ таблицы [ FROM имя_таблицы [ , имя_ таблицы] ] WHERE CURRENT OF имя_курсора [ { AND | OR} ... ] / * Поменять код города в номере телефона * / UPDATE aut hors SET phone = st uff(phone, 1, 3, " 310" ) WHERE CURRENT OF aut hors_curs

converted to PDF by BoJIoc

/ * Удалить текущую запись * / DELETE aut hors WHERE CURRENT OF aut hors_curs Не разрешается удаление из многотабличных курсоров (то есть курсоров, объявленных с секцией JOI N или представлением, содержащим JOI N). Обновление многотабличного курсора разрешается лишь в том случае, если оно затрагивает одну таблицу. Операция удаления удаляет запись из таблицы. Обновление не изменяет текущей позиции курсора, что делает возможным многократное обновление записи. При попытке выполнить команду UPDATE или DELETE для курсора READ_ONLY выдается сообщение об ошибке, в котором говорится, что курсор доступен только для чтения. Закрытие курсоров Команда CLOSE переводит курсор в неактивное состояние и фактически удаляет его итоговый набор. Она имеет следующий синтаксис: CLOSE { { [ GLOBAL] имя_курсора} | { @переменная} Приведем пример закрытия курсора: CLOSE aut hors_curs Команда CLOSE завершает обработку курсора. Курсор можно открыть повторно, при этом все его указатели сбрасываются. Освобождение курсоров В процессе освобождения курсора удаляется ссылка на него. Допускается освобождение курсора даже в том случае, если в нем остались незавершенные транзакции. Команда освобождения курсора имеет следующий синтаксис: DEALLOCATE { { GLOBAL} имя_курсора} | { @переменная} Приведем пример освобождения курсора: DEALLOCATE aut hor_curs После выполнения команды имя курсора может быть использовано в другой команде DECLARE CURSOR. Если эта ссылка на курсор была последней, команда освобождает всю память, занятую структурой курсора. Чтобы заново открыть курсор, необходимо повторно объявить его. Хранимые процедуры Хранимые процедуры — программы, находящиеся в базе данных и выполняемые по требованию клиента. Хранимая процедура представляет собой набор совместно откомпилированных команд SQL. Одним из преимуществ хранимых процедур является повышение быстродействия вследствие снижения сетевого трафика. В версии 7 планы выполнения обычных команд SQL могут использоваться повторно, поэтому предварительная компиляция планов выполнения хранимых процедур уже не дает столь значительного повышения быстродействия. Хранимые процедуры обладают и другими преимуществами, среди которых — модульность программирования и тестирования, а также ограниченный доступ к таблицам, построенный на базе функций. Это помогает изолировать пользователей от базовых табличных структур, сокращает ошибки в операторах, обеспечивает согласованность в программировании и автоматизирует выполнение сложных или неустойчивых транзакций. Хранимые процедуры являются объектами, находящимися в базе данных. Синтаксис их создания выглядит следующим образом: CREATE PROC[ EDURE] имя_процедуры [ ; номер] [ @параметр тип_данных [ VARYI NG] [ = значение ] [ OUTPUT] [ , . . .] ]

converted to PDF by BoJIoc

[ WI TH { RECOMPI LE| ENCRYPTI ON| RECOMPI LE| ENCRYPTI ON} ] [ FOR REPLI CATI ON] AS команды SQL [ RETURN [ код_статуса] ] Ниже описаны аргументы, используемые при создании хранимых процедур: • Имя_процедуры — подчиняется стандартным правилам выбора имен объектов: · в рамках одной базы данных для процедур с одинаковыми именем и владельцем номер должен быть уникальным; · имена локальных временных процедур должны начинаться с символа # ; · имена глобальных временных процедур должны начинаться с символов # # . • Номер — используется для группировки процедур как единого целого ( часто в сочетании с версией приложения) . • @параметр — представляет параметр, передаваемый и/ или получаемый из процедуры. Процедура имеет до 1024 параметров. Параметры могут принимать значения NULL. Они не могут использоваться в процедуре вместо объектов баз данных, если только они не включаются в команду EXEC. Параметры относятся к встроенным либо пользовательским типам данных. Обратите внимание — правила, значения по умолчанию и свойства столбцов не относятся к параметрам, определяемым пользовательскими типами данных. Параметр может относиться к любому типу данных SQL Serv er, в том числе TEXT, I MAGE или CURSOR. Для параметров типа CURSOR ключевые слова VARYI NG и OUTPUT являются обязательными. • VARYI NG — означает, что параметр возвращает итоговый набор. Используется только для типа данных CURSOR. • Значение — определяет значение параметра по умолчанию. Может быть любой константой или NULL. • OUTPUT — означает, что параметр является выходным, то есть может возвращаться стороне, вызвавшей процедуру. Параметры типа CURSOR обязаны быть выходными. • RECOMPI LE — отменяет кэширование плана выполнения в SQL Server. Параметр ENCRYPTI ON означает, что таблица sy scom m ent должна шифроваться (благодаря чему текст процедуры скрывается от постороннего взгляда) . • FOR REPLI CATI ON — означает, что процедура участвует в процессе репликации. Обратите внимание: параметры FOR REPLI CATI ON и RECOMPI LE являются взаимоисключающими. • Команды SQL — произвольное количество команд SQL, составляющих тело процедуры. Максимальный объем команд не должен превышать 128 Кбайт. Помимо знания аргументов существующих процедур при работе с хранимыми процедурами следует учитывать ряд ограничений: • Постоянные (а не временные) процедуры создаются только в текущей базе данных. • Ссылки на объекты интерпретируются на стадии выполнения, а не во время создания процедуры. • Временные процедуры автоматически удаляются при отключении пользователя, создавшего их. • Глобальные временные процедуры могут выполняться другими пользователями. • Процедуры не могут содержать команд ALTER TABLE, CREATE I NDEX, CREATE TABLE, DROP TABLE, DROP I NDEX, TRUNCATE TABLE, UPDATE STATI STI CS и любых команд DBCC. Ниже приведен пример хранимой процедуры, которая выводит названия книг с данными издателей: CREATE PROC pub_t it les AS SELECT t .t it le, p.pub_nam e FROM publishers p, t it les t WHERE p.pub_id = t .pub_id RETURN GO / * Пример процедуры с параметром-курсором * / CREATE PROCEDURE acur @aut h_ cur CURSOR VARYI NG OUTPUT, @st at e char(2) = " CA", @ct ype int = 1 AS

converted to PDF by BoJIoc

I F ( @ct ype = 1 ) SET @aut h_cur = CURSOR SCROLL FOR SELECT au_lnam e FROM aut hors WHERE st ate = @st ate ELSE SET @aut h_cur = CURSOR SCROLL FOR SELECT au_lnam e, au_ fnam e FROM aut hors OPEN @aut h_cur Как упоминалось ранее в этой главе, процедуры вызываются с помощью ключевого слова EXECUTE (EXEC) . Использование EXECUTE обязательно, если вызов сохраненной процедуры не является первой командой пакета. При вызове процедуры должны передаваться все параметры, для которых не определены значения по умолчанию. Синтаксис вызова процедуры выглядит следующим образом: [ EXEC[ UTE] ] [ @код_возврата = ] имя_процедуры [ ; номер ] [ @список_параметров] [ WI TH RECOMPI LE] В этом фрагменте: • @код_возврата — переменная для сохранения кода возврата процедуры. • Номер — числовой идентификатор процедуры. При отсутствии этого аргумента выполняется процедура с максимальным номером версии. • @список_параметров — список параметров процедуры. Параметры передаются как по имени (имя = значение), так и по позиции в списке, но если некоторый параметр передается по имени, все последующие параметры в списке тоже должны передаваться по имени. Чтобы пропустить параметр в середине списка, следует передавать остальные параметры по имени. • WI TH RECOMPI LE — процедура заново компилируется при выполнении. В следующих двух строках выполняется процедура с именем pub_t it les. Обратите внимание на то, что ключевое слово EXEC необходимо лишь во второй строке: pub_t it les — Пакет начинается с вызова процедуры exec pub_t it les go Команда удаления хранимых процедур имеет следующий синтаксис: DROP PROC имя_процедуры [ , имя_процедуры[ , ...] ] Хранимая процедура является постоянным объектом базы данных, поэтому ее удаление должно осуществляться специальной командой. Команда DROP PROC удаляет одну или несколько процедур. Для заданного имени процедуры удаляются все процедуры с разными номерами ( то есть удаляется вся группа процедур). Внимание Нельзя удалить отдельную процедуру из группы. Традиционным способом модификации хранимых процедур было удаление процедуры и ее повторное создание с повторной выдачей всех разрешений. В версии 7 появилась возможность модификации хранимых процедур командой ALTER: ALTER PROC[ EDURE] имя_процедуры [ ; номер] [ @параметр тип_данных [ VARYI NG] [ = значение ] [ OUTPUT] [ , ... ] ] [ WI TH { RECOMPI LE| ENCRYPTI ON} ] [ FOR REPLI CATI ON] AS команды SQL [ RETURN [ код_возврата] ]

converted to PDF by BoJIoc

Команда ALTER ведет себя так же, как и CREATE PROCEDURE. Она не изменяет зависимостей или разрешений, поэтому вы не сможете модифицировать несуществующую процедуру. Хранимые процедуры можно не только модифицировать, но и переименовывать. Переименование осуществляется системной процедурой sp_ renam e: sp_ renam e процедура, новое_имя Наконец, вывод текста хранимой процедуры в той базе данных, где она создавалась, осуществляется командой sp_helpt ex t : sp_helpt ext имя_процедуры Процедура sp_ help выводит имена и типы данных параметров хранимой процедуры. Для создания, удаления и модификации хранимых процедур можно воспользоваться утилитой SQL Ent erprise Manager. Нажатие кнопки OK или Apply выполняет команды SQL, находящиеся в окне. Окно SQL Ent erprise Manager показано на рис. 11.2 .

Рис. 11.2. Создание процедуры в SQL Ent erprise Manager Примеры экзаменационных вопросов Que stion 1 Which are t he charact erist ics of t he bat ch? [ Check all correct answers] • A. A bat ch is alway s a t ransact ion. • B. A bat ch can be a t ransact ion. • C. A bat ch can be part of t ransact ion.

converted to PDF by BoJIoc

• D. A single synt ax error in a batch will cause an entire bat ch t o fail. • E. SQL Server does not support batch processing. Вопрос 1 Какими характеристиками обладает пакет? [ Выберите все правильные ответы] • • • • •

A. Пакет всегда является транзакцией. B. Пакет может быть транзакцией. C. Пакет может быть частью транзакции. D. Одна синтаксическая ошибка в пакете приводит к отмене всего пакета. E. SQL Server не поддерживает пакетную обработку.

Правильные ответы — B, C и D; пакет может быть частью транзакции. Ответ D правилен, поскольку пакет обрабатывается как единое целое. Ответ A неверен, поскольку транзакции не зависят от пакетов. Ответ E неверен и лишь сбивает с толку, поскольку пакеты не всегда связаны с пакетной обработкой. Que stion 2 Which are valid applicat ions of procedures? [ Check all correct answers] • • • • •

A. Passing param et ers. B. Managing t ransact ions. C. Reducing net work t raffic. D. Modularizing applicat ions. E. Managing a cursor.

Вопрос 2 Для каких целей применяются процедуры? [ Выберите все правильные ответы] • • • • •

A. Передача параметров. B. Управление транзакциями. C. Сокращение сетевого трафика. D. Обеспечение модульной структуры приложений. E. Управление курсорами.

Правильные ответы — A, B, C, D и E. Que stion 3 What is t he m axim um st ored procedure size? • • • • •

A. 128 SQL st atem ent s. B. 128 K. C. 64 SQL st at em ent s. D. 64 K. E. There is no size lim it on a st ored procedure.

Вопрос 3 Чему равен максимальный размер хранимой процедуры? • • • • •

A. 128 команд SQL. B. 128 Kбайт. C. 64 команды SQL. D. 64 Кбайт. E. Размер хранимой процедуры не ограничивается.

Правильный ответ — B. Ответы A и C неверны, поскольку размер процедуры не измеряется в командах SQL. Ответ D тоже неверен, приведенное значение слишком мало. Неверен и ответ E, поскольку размер хранимых процедур ограничен. Que stion 4 When is using a cursor is a good idea? [ Check all correct answers] • • • • •

A. Never, because it causes a perform ance hit . B. When t here is no set -processing m et hod of solv ing a business problem . C. When you are defeated in your at t em pt s t o writ e set -processing code. D. When you are t oo lazy t o writ e set - processing code. E. None of t he above.

converted to PDF by BoJIoc

Вопрос 4 Когда следует пользоваться курсорами? [ Выберите все правильные ответы] • • • • •

A. Никогда, поскольку это приводит к снижению быстродействия. B. Когда деловая проблема не решается методами обработки наборов. C. Если все ваши попытки написать код обработки наборов ни к чему не привели. D. Если вы слишком ленивы, чтобы писать код обработки наборов. E. Ни в одном из перечисленных случаев.

Правильный ответ — B. Ответ A неверен, поскольку иногда специфика задачи заставляет действовать на уровне записей. Ответ C неверен; проблему нужно решать, а не искать обходные пути. Ответ D тоже неверен, поскольку леность вообще не является оправданием. Que stion 5 What is t he WAI TFOR statem ent? • • • • •

A. An event handler. B. An error handler. C. A deadlock avoidance m echanism . D. A program m ing t echnique no longer support ed in SQL Server 7. E. None of t he above.

Вопрос 5 Что собой представляет команда WAI TFOR? • • • • •

A. Обработчик событий. B. Обработчик ошибок. C. Механизм обхода взаимных блокировок. D. Методика программирования, не поддерживаемая в SQL Server 7. E. Ни один из перечисленных ответов.

Правильный ответ — A. Ответ B неверен, поскольку обработчик ошибок прерывает работу программы. Ответ C неверен, поскольку команда WAI TFOR при открытой транзакции может стать причиной взаимной блокировки. Ответ D неверен, поскольку команда продолжает существовать. ГЛАВА 1 2

Триггеры Ключевые термины • • • •

Триггер Вставленная таблица Удаленная таблица Журнал транзакций

Необходимые знания и приемы • Определение триггеров • Модификация триггеров • Понимание ограничений, связанных с триггерами Триггеры ( t rigger) являются особой разновидностью хранимых процедур, выполняемых автоматически (срабатывающих) при модификации данных таблицы. Триггеры находят разное применение — от проверки данных до обеспечения сложных деловых правил. Особенно полезным свойством триггеров является то, что они имеют доступ к образам записи до и после модификации; таким образом вы можете сравнить две записи и принять соответствующее решение. На экзамене вы должны знать, что такое триггеры, как они создаются и используются. Поэтому в этой главе наряду с созданием, удалением и модификацией триггеров также рассматривается их применение. Характерные примеры использования триггеров иллюстрируются примерами. Использование триггеров Триггеры используются для различных целей, в том числе:

converted to PDF by BoJIoc

• Обеспечения ссылочной целостности. Триггеры используются для поддержания ссылочной целостности, когда ее критерии слишком сложны для определения на уровне таблиц. В частности, сюда относится возможность каскадных обновлений и удалений первичных ключей. • Комплексного обеспечения целостности доменов. При необходимости триггеры могут использоваться для проверки значений в других таблицах и базах данных, а также для сравнения образов данных до и после обновления. • Обеспечения сложных деловых правил. С помощью триггеров решаются такие задачи, как автоматическое оформление заказов на покупку при малом количестве товара на складе или отмена поставки при задержке платежей. • Выбор сложных значений по умолчанию. Триггеры позволяют принимать решения при выборе значения по умолчанию для столбцов. Это полезная возможность, поскольку пользовательские значения по умолчанию допускают лишь одно конкретное значение для каждого столбца. • Обработки дубликатов. Триггеры используются для обеспечения целостности данных. Такая возможность бывает полезной при логическом сегментировании данных или при обработке дубликатов данных по соображениям быстродействия (например, для получения сводной информации) . Срабатывание триггеров Триггеры закрепляются за таблицей и срабатывают в ответ на определенные команды DML (Dat a Modificat ion Language, поднабор команд Transact -SQL) . Иначе говоря, выполнение команды, модифицирующей запись, всегда приводит к срабатыванию триггера. Поскольку триггер является частью исходной транзакции, он может вызвать откат отдельной команды или всей транзакции. Благодаря этому у вас появляется возможность контролировать модификацию таблиц с помощью логики, связанной с таблицей.

Рис. 12.1. Команда модификации данных без триггера Чтобы пояснить сказанное, рассмотрим пример — удаление записей из таблицы publishers командой DELETE. На рис. 12.1 показано, как команда DELETE работает без триггера. Как видно из рис. 12 .1 , при удалении записи таблицы в игру может вступить любое ограничение ссылочной целостности, являющееся частью таблицы publishers. Если ограничение ссылочной целостности существует, оно будет проверено. Если ограничение не нарушается (или не существует), запись удаляется. Если команда не является частью отдельной транзакции, в этот момент происходит закрепление транзакции. На рис. 12.2 показано, как команда модификации данных работает при использовании триггера. Сначала происходит проверка всех ограничений. Если ограничение не нарушено (или не существует), запись удаляется. Затем перед завершением транзакции выполняется триггер, который принимает решение об откате или закреплении транзакции. Внимание Триггеры выполняются только один раз для одной команды модификации данных, независимо от количества обрабатываемых записей (даже если команда не влияет ни на одну запись или, наоборот, обрабатывает все записи таблицы). Мы кратко рассмотрели примеры использования триггеров, а также время их срабатывания. Перейдем к созданию триггеров.

converted to PDF by BoJIoc

Рис. 12.2. Команда модификации данных с использованием триггера Создание триггеров Таблица может содержать триггеры трех типов — вставки, обновления или удаления (или любую комбинацию этих трех типов) . Количество триггеров в таблице теперь не ограничивается. Внимание Обратите внимание: это новая особенность SQL Serv er. В предыдущих версиях SQL Serv er (до версии 7 ) таблица могла содержать лишь один экземпляр триггера каждого типа. Команда создания триггера имеет следующий синтаксис: CREATE TRI GGER имя_ триггера ON имя_таблицы [ WI TH ENCRYPTI ON] FOR { I NSERT | UPDATE | DELETE} [ ,...] [ WI TH APPEND] [ NOT FOR REPLI CATI ON] AS [ команды SQL] [ RETURN] Синтаксические компоненты имеют следующий смысл: • Имя_ триггера — определяет имя объекта с необязательным включением имени владельца (например, m yt rigger или dbo.m yt rigger). • Имя_ таблицы — определяет имя таблицы, для которой срабатывает триггер. Обратите внимание, что таблица может быть лишь одна. • I NSERT| UPDATE| DELETE — модификация данных, приводящая к срабатыванию триггера. При создании триггера можно задать одну, две или три операции. В случае выбора нескольких операций их следует разделить запятыми (I NSERT, UPDATE, DELETE) . • WI TH APPEND — триггер добавляется в список триггеров, срабатывающих для указанного действия (действий) . SQL Server можно настроить так, что добавление будет происходить автоматически. Если SQL Server не настроен таким образом, создание триггера приводит к удалению существующего триггера для данного действия (действий). • NOT FOR REPLI CATI ON — означает, что триггер не выполняется в процессе репликации. Следующий фрагмент создает триггер, который выводит сообщение при каждой вставке записи в таблицу t it les: CREATE TRI GGER t it les_t rigger ON t it les FOR I NSERT AS PRI NT " t it le insert ed" RETURN При создании триггеров необходимо учитывать некоторые второстепенные обстоятельства: • Если вы задаете владельца триггера, также необходимо задать владельца таблицы ( особенность синтаксиса языка) . • Хотя триггеры во многих отношениях похожи на хранимые процедуры, они не получают параметров при вызове и не могут явно вызываться или выполняться из программы. • Команда CREATE TRI GGER должна быть первой командой в пакете. • Триггеры не могут создаваться для представлений. Они действуют лишь в базовых таблицах. Тем не менее, можно создавать представления для таблиц, содержащих триггеры. • Триггеры не срабатывают при выполнении команды TRUNCATE TABLE. Команда TRUNCATE TABLE не регистрируется в журнале, а триггеру необходим доступ к информации журнала. • Команда WRI TETEXT не приводит к срабатыванию триггеров. Эта команда не регистрируется в журнале. • Чтобы создать триггер, необходимо либо быть владельцем объекта, либо обладать ролью db_owner или db_ddladm in.

converted to PDF by BoJIoc

В триггерах запрещены следующие команды SQL: • • • • • • • • • • •

Любые команды CREATE; Любые команды DROP; ALTER TABLE/ DATABASE; DENY; GRANT; REVOKE; SELECT I NTO; TRUNCATE TABLE; UPDATE STATI STI CS; RECONFI GURE; LOAD/ RESTORE DATABASE/ TRANSACTI ON.

Удаление триггеров Триггеры удаляются командой DROP TRI GGER, имеющей следующий синтаксис: DROP TRI GGER имя_ триггера [ ,имя_триггера [ ,.. . ] ] Команда удаляет триггер с заданным именем. При замене триггеров команда DROP TRI GGER не нужна. Чтобы заменить существующий триггер, достаточно не указывать ключевые слова WI TH APPEND при создании нового триггера. Внимание Помните: при удалении таблицы удаляются также все связанные с ней триггеры. Модификация триггеров Когда- то модификация триггеров сводилась к простому удалению триггера с повторным созданием. В SQL Server 7 появилась новая возможность — модификация триггеров командой ALTER TRI GGER. Команда имеет следующий синтаксис: ALTER TRI GGER имя_триггера ON имя_таблицы [ WI TH ENCRYPTI ON] FOR { I NSERT | UPDATE | DELETE} [ , . ..] [ WI TH APPEND] [ NOT FOR REPLI CATI ON] AS [ команды SQL] [ RETURN] Параметры команды ALTER TRI GGER такие же, как и команды CREATE TRI GGER. Команда ALTER TRI GGER была введена главным образом для логической согласованности команд, поскольку все остальные команды создания объектов теперь допускают возможность модификации. Существуют особые представления журнала — таблицы insert ed и delet ed, которые открывают доступ к образам, данным до и после модификации. Таблицы de le te d и inse rte d Таблицы deleted и insert ed являются специальными представлениями журнала транзакций, доступными лишь во время срабатывания триггера и в пределах триггера. В этих таблицах отражаются изменения, внесенные в таблицу командой, которая привела к срабатыванию триггера. Структуры таблиц insert ed и delet ed в точности совпадают со структурой таблицы, для которой создавался триггер. Таблица insert ed содержит новые записи, созданные командой I NSERT или UPDATE. Таблица delet ed содержит записи, удаленные вследствие выполнения DELETE или UPDATE. SQL Serv er обычно интерпретирует команду UPDATE как DELETE с последующей I NSERT. Вставляемые и удаляемые записи включаются в таблицы inserted и delet ed. Эти таблицы могут использоваться только

converted to PDF by BoJIoc

внутри триггеров для определения того, какое событие вызвало срабатывание триггера. Записи таблицы insert ed создаются при вставке или обновлении, а записи таблицы delet ed — при удалении или обновлении. Нередко триггер включает таблицы insert ed и delet ed в объединение для обеспечения ссылочной целостности и целостности внешних ключей. Примечание Таблицы insert ed и delet ed видны только внутри триггера, для которого они создавались, — но не во вложенных триггерах (вложенные триггеры более подробно рассматриваются далее в этой главе) . Чтобы пояснить сказанное, рассмотрим пример, демонстрирующий применение таблицы delet ed. В этом примере из таблицы publishers удаляется определенная запись (рис. 12 .3 ). При срабатывании триггера транзакция еще не была закреплена. Триггер может обратиться к таблице delet ed и просмотреть удаляемую информацию. Например, триггер может запретить удаление записи при наличии внеочередного заказа на книгу, опубликованную этим издателем. На рис. 12.4 показано, что происходит при обновлении записи. Во время обновления триггер, как обычно, видит обновленный вариант таблицы. Таблица delet ed содержит образы записей до обновления, а таблица insert ed — образы после обновления. Обратите внимание: все три таблицы имеют одинаковую структуру. Просмотр таблиц de le te d и inse rte d В этом разделе приведен пример использования таблиц insert ed и delet ed. Мы напишем триггер обновления для таблицы publishers, выполняющий каскадное удаление в таблице t it les. Внимание Термин «каскадное удаление» означает, что из таблицы t it les удаляются любые записи, зависящие от удаляемой записи таблицы publishers. Не забывайте о проверке количества записей, участвующих в операции ( через @@ROWCOUNT) , поскольку команда DELETE заставляет триггер сработать ровно один раз, независимо от того, удаляла она записи или нет. Следующий триггер производит каскадное удаление подчиненных записей.

Рис. 12.3. Триггер удаления

converted to PDF by BoJIoc

Рис. 12.4. Обновление записи Листинг 1 2 .1 . Триггер каскадного удаления CREATE TRI GGER cascade_del_t rigger ON publishers FOR DELETE AS I F @@ROWCOUNT = 0 -- Удаленных записей нет RETURN / * Каскадное удаление записей из таблицы t it les, * / / * связанных по полю pub_id * / DELETE t it les FROM t it les t , delet ed d WHERE t .pub_id = d.pub_id I F @@ERROR ! = 0 BEGI N PRI NT " Error occurred during related t it les" ROLLBACK TRAN END RETURN На рис. 12.5 показано, что происходит при вставке записи в таблицу publishers. Триггер вставки «видит» пустую таблицу deleted и таблицу insert ed, содержащую вставленную запись(и). Обратите внимание: структура таблиц delet ed и inserted идентична структуре базовой таблицы. Вставка и удаление нескольких записей SQL Serv er позволяет вставить несколько записей в одной команде I NSERT с помощью конструкции I NSERT…SELECT. Если в процессе вставки или обновления участвуют несколько значений внешнего ключа, триггер должен сравнить количество вставленных или обновленных записей с количеством записей,

converted to PDF by BoJIoc

являющихся допустимыми ключами. Такое сравнение проверяет, что для модифицированных записей имеются соответствующие ключи (проверку также можно организовать с помощью декларативных ограничений — см. главу 6) . Для проверки ссылочной целостности можно воспользоваться агрегатной функцией COUNT(* ) для соединения таблицы insert ed с таблицей первичного ключа. Например, в начале триггера можно сравнить SELECT COUNT(* ) со значением @@ROWCOUNT. Значение @@ROWCOUNT необходимо проверить (а лучше сохранить в локальной переменной) до выполнения в триггере каких-либо операций, способных повлиять на @@ROWCOUNT. Дело в том, что любая команда SQL приводит к изменению @@ROWCOUNT (в том числе и та, которая проверяет @@ROWCOUNT) .

Рис. 12 .5 . Вставка записи Количество записей таблицы insert ed, успешно соединяемых с записями таблицы первичного ключа, не совпадает с общим количеством вставленных или удаленных записей; по крайней мере одна запись неверна. Следующий фрагмент программы демонстрирует методику проверки ссылочной целостности в триггере: CREATE TRI GGER t r1 ON... FOR I NSERT, UPDATE AS DECLARE @ROWS I NT SELECT @rows = @@row count .. . I F ( SELECT COUNT(* ) FROM insert ed i, pkey_t ab p WHERE i.fk ey = p.pkey ) ! = @rows / * По крайней мере одна из вставленных/ удаляемых записей * * не совпадает с первичным ключом * / / * Начать обработку ошибок * / .. . Проверка столбцов при модификации Выполняемая в таблице команда I NSERT или UPDATE приводит к срабатыванию триггера вставки или обновления. Если триггер проектировался для обеспечения ссылочной целостности, возможно, вас интересует лишь обновление или вставка в столбцах первичного или внешнего ключа. Конструкция I F

converted to PDF by BoJIoc

UPDATE позволяет определить, выполнялась ли вставка или модификация для конкретного столбца. Синтаксис I F UPDATE выглядит следующим образом: I F UPDATE (имя_столбца) [ { AND | OR } UPDATE (имя_столбца) ...] Результат проверки I F UPDATE равен TRUE в случае истинности одного из следующих условий: • В столбец было вставлено значение, отличное от NULL. • Столбец был включен в секцию SET команды UPDATE. Функция COLUMNS_UPDATED( ) позволяет узнать, входил ли конкретный столбец в команду I NSERT или UPDATE. Оператор COLUMNS_UPDATED() имеет следующий синтаксис: I F ( COLUMNS_UPDATED( ) { поразрядный оператор} маска_ обновления) { оператор_сравнения} маска_столбцов ] Проверка может выполняться в триггерах вставки или обновления; с ее помощью можно узнать о факте обновления нескольких столбцов. Параметры имеют следующий смысл: • • • •

Поразрядный_ оператор — определяет оператор, используемый при сравнении. Маска_обновления — определяет обновляемые столбцы. Маска_столбцов — определяет проверяемые столбцы. Оператор_сравнения — определяет оператор, используемый для проверки столбцов:

· = означает, что все столбцы маски должны обновляться. · > означает, что не все столбцы маски должны обновляться. Итак, мы довольно подробно рассмотрели теоретические принципы, используемые в триггерах вставки, удаления и обновления. Перейдем к практическим примерам. Сначала мы рассмотрим типичный триггер вставки, затем — условный триггер и, наконец, перейдем к примеру триггера обновления. Триггер вставки В листинге 12.2 записи, вставляемые в таблицу t it les, проверяются на ссылочную целостность по отношению к таблице publishers. Если какая- либо запись нарушает правила ссылочной целостности, транзакция вставки откатывается. Листинг 1 2 .2 . Триггер вставки с проверкой ссылочной целостности CREATE TRI GGER t r_ t it les_ i ON t it les FOR I NSERT AS DECLARE @row s int - - Переменная для хранения @@ROWCOUNT SELECT @rows = @@row count I F @rows = 0 - - Вставленных записей нет, выйти из триггера RETURN / * Проверить вставку в столбец pub_id, а также наличие * * pub_id в таблице publishers для всех вставленных pub_ id * / I F UPDATE(pub_id) – Было ли вставлено новое значение pub_id? AND SELECT COUNT(* ) FROM inserted i, publishers p WHERE p.pub_id = i.pub_id ) ! = @rows BEGI N RAI SERROR ( "I nvalid pub_id insert ed", 16, 1) ROLLLBACK TRANSACTI ON END RETURN

converted to PDF by BoJIoc

Следующий раздел расширяет приведенный пример и показывает, как проверить ссылочную целостность записей, вставленных в таблицу t it les, посредством сравнения внешних ключей с первичными ключами таблицы publishers. Условный триггер вставки Записи, нарушающие ссылочную целостность, удаляются из t it les, а остальные записи остаются в таблице. В листинге 12.3 приведена реализация условного триггера вставки, решающего эту задачу. Листинг 1 2 .3 . Условный триггер вставки CREATE TRI GGER t r_ t it les_ i ON t it les FOR I NSERT AS DECLARE @row s int - - Переменная для хранения @@ROWCOUNT SELECT @rows = @@ROWCOUNT I F @rows = 0 - - Вставленных записей нет, выйти из триггера RETURN / * Проверить вставку в столбец pub_id, а также наличие * * pub_id в таблице publishers для всех вставленных pub_ id * * Все нарушающие записи удаляются из t it les * / I F UPDATE(pub_id) – Было ли вставлено новое значение pub_id? AND SELECT COUNT(* ) FROM inserted i, publishers p WHERE p.pub_id = i.pub_id ) ! = @rows BEGI N DELETE t it les FROM t it les t , insert ed i WHERE t .pub_id NOT I N (SELECT pub_id FROM publishers) RAI SERROR ( "Som e invalid pub_id not insert ed", 16, 1 ) END RETURN Триггер обновления В этом примере при вставке или обновлении записи sales мы обновляем соответствующий итоговый столбец, yt d_sales, в таблице t it les. Листинг 12 .4 показывает, как обновление сводных данных реализуется с помощью триггеров. Листинг 1 2 .4 . Обновление сводной величины CREATE TRI GGER t r_ t otal_sales ON sales FOR UPDATE, I NSERT AS DECLARE @row s int - - Переменная для хранения @@ROWCOUNT SELECT @rows = @@ROWCOUNT I F @rows = 0 - - Вставленных записей нет, выйти из триггера RETURN I F EXI STS ( SELECT * FROM delet ed) AND @rows > 1 BEGI N PRI NT " Mult i- row updat es t o sales not allowed! " ROLLBACK TRAN RETURN END / * Обновить yt d_sales в таблице t it les значением qty * * в модифицированных записях sales * /

converted to PDF by BoJIoc

I F UPDATE(qt y) BEGI N UPDATE t it les SET yt d_sales = I SNULL( yt d_sales, 0 ) / * Функция I SNULL используется на случай отсутствия значений * / / * Сумма по вставкам и удалениям вычисляется в подзапросе * / + ( SELECT I SNULL( SUM( i.qty ), 0 ) FROM inserted i WHERE i.t it le_id = t it les.t it le_id) - (SELECT I SNULL( SUM(d.qty ), 0 ) FROM delet ed d WHERE d.t it le_id = t it les.t it le_id) END RETURN Триггеры в транзакциях Как говорилось ранее, триггер является неотъемлемой частью команды, вызвавшей его срабатывание, и транзакции, в которую входит эта команда. Выполнение ROLLBACK TRAN в триггере приводит к откату всех операций, начиная с самой внешней команды BEGI N TRAN, завершает вычисления в триггере и прерывает текущий пакет. Например, следующий триггер вызывается при вставке записей в таблицу t it les: CREATE TRI GGER t r_ t it les_ i ON t it les FOR I NSERT AS DECLARE @row s int - - Переменная для хранения @@ROWCOUNT SELECT @rows = @@ROWCOUNT I F @rows = 0 I F UPDATE(pub_id) AND (SELECT COUNT(* ) FROM I NSERTED i, publishers p WHERE p.pub_id = i.pub_id ) ! = @rows BEGI N ROLLBACK TRANSACTI ON RAI SERROR ( "I nvalid pub_id insert ed", 16, 1) END RETURN / * Транзакция вставляет записи в таблицу * / BEGI N TRAN add_t it les I NSERT t it les (t it le_ id, pub_id, t it le) VALUES ( 'BU1234', '0736 ', 'Tuning SQL Server') I NSERT t it les (t it le_ id, pub_id, t it le) VALUES ( 'BU1235', 'abcd', 'Tuning SQL Server') I NSERT t it les (t it le_ id, pub_id, t it le) VALUES ( 'BU1236', '0877 , 'Tuning SQL Server') COMMI T TRAN Сколько записей будет вставлено, если 'abcd' является недопустимым значением pub_ id? Ни одной; в отличие от ROLLBACK TRAN в процедуре, ROLLBACK TRAN в триггере отменяет выполнение оставшейся части пакета. При использовании триггеров в транзакциях необходимо помнить о некоторых нюансах: • Команды, следующие в триггере за ROLLBACK TRAN, будут выполнены. Откат относится к обработке транзакций, а не к потоку команд (весьма распространенная ошибка) . • Не забывайте ставить RETURN после ROLLBACK TRAN в триггере, чтобы предотвратить нежелательные последствия; это необходимо делать из-за странных проблем, возникающих в некоторых интерфейсных клиентских программах. • Не включайте в триггер команду BEGI N TRAN — вы уже находитесь в транзакции, поэтому лишняя команда BEGI N TRAN не нужна. В триггере можно установить точку сохранения и вернуться к ней ( см. следующий раздел). Откат будет выполнен только для команд триггера, находящихся за точкой сохранения. • Транзакция остается активной до последующего закрепления или отката, а выполнение пакета продолжится. • Не выполняйте в триггере откат для именованной транзакции. Это приведет к ошибке времени выполнения, откату всей работы и отмене пакета.

converted to PDF by BoJIoc

• Для получения оптимальных результатов не включайте в триггеры команды BEGI N TRAN и ROLLBACK TRAN (в том числе и ROLLBACK TRAN до отката к точке сохранения) . Использование точек сохранения в триггерах Команда SAVEPOI NT позволяет избежать отката всей транзакции в триггере. Вы определяете точку сохранения и по своему желанию ограничиваете откат транзакции точкой сохранения с заданным именем. В этом случае следует немедленно выполнить команду RAI SERROR или RETURN и передать код ошибки вызывающему процессу. Вызывающий процесс проверяет код ошибки и предпринимает необходимые действия — откат транзакции, откат до точки сохранения, игнорирование ошибки и закрепление модификации данных. В листинге 12.5 приведен триггер для таблицы t it les. Листинг 1 2 .5 . Триггер вставки с использованием точки сохранения / * Триггер для таблицы t it les, вызываемый при вставке * / CREATE TRI GGER t r_ t it les_ i ON t it les FOR I NSERT AS DECLARE @row s int - - Переменная для хранения @@ROWCOUNT SELECT @rows = @@ROWCOUNT I F @rows = 0 RETURN SAVE TRAN t it lest rig I F UPDATE(pub_id) AND (SELECT COUNT(* ) FROM inserted i, publishers p WHERE p.pub_id = i.pub_id ) ! = @rows BEGI N ROLLBACK TRANSACTI ON t it lest rig RAI SERROR " I nvalid pub_id inserted" , 16 , 1) END RETURN Команда I NSERT из листинга 12 .6 приводит к срабатыванию триггера, показанного в листинге 12.5. Листинг 1 2 .6 . Вставка в таблицу t itles и вызов триггера / * Транзакция вставляет записи в таблицу * / BEGI N TRAN add_t it les I NSERT t it les (t it le_ id, pub_id, t it le) VALUES ( 'BU1234', '0736 ', 'Tuning SQL Server') I F @@ERROR = 50000 BEGI N ROLLBACK TRAN add_t it les RETURN END I NSERT t it les (t it le_ id, pub_id, t it le) VALUES ( 'BU1235', 'abcd, 'Tuning SQL Server') I F @@ERROR = 50000 BEGI N ROLLBACK TRAN add_t it les RETURN END I NSERT t it les (t it le_ id, pub_id, t it le) VALUES ( 'BU1236', '0877 , 'Tuning SQL Server') I F @@ERROR = 50000 BEGI N ROLLBACK TRAN add_t it les RETURN END COMMI T TRAN

converted to PDF by BoJIoc

Фрагмент вставляет записи в таблицу, для которой определен триггер вставки. После каждой вставки мы проверяем значение @@ERROR, чтобы узнать, произошел ли в триггере откат, и если произошел — откатываем всю транзакцию. Если триггер модифицирует таблицу, для которой, в свою очередь, определен триггер, обычно это приводит к срабатыванию триггера модифицируемой таблицы. Такие триггеры называются « вложенными» (nest ed t riggers). Вложенные триггеры Предположим, триггер A выполняет команду I NSERT, UPDATE или DELETE для другой таблицы, в которой для выполняемой операции определен триггер B. В результате сработает и триггер B. Этот пример поясняет концепцию вложенных триггеров — эта модель поведения используется сервером по умолчанию. Триггеры ограничиваются 32 уровнями вложенности. Если вы полагаете, что ограничение на глубину вложенности триггеров может оказаться существенным для вашего приложения (хотя в большинстве ситуаций такое ограничение не вызывает проблем), проверьте глобальную переменную @@NESTLEVEL или вызовите функцию NEST_LEVEL() , чтобы избежать превышения. Для вложенных триггеров недоступно содержимое таблиц insert ed или deleted других триггеров — в них видны только таблицы inserted или delet ed триггера, вызвавшего срабатывание вложенного триггера. Системный администратор может запретить вложение триггеров на уровне сервера с помощью хранимой процедуры sp_ configure. Обычно триггеры не являются рекурсивными. Иначе говоря, при модификации собственной таблицы они не срабатывают, хотя при желании рекурсию можно включить. Команды модификации данных внутри триггера не влияют на содержимое таблиц insert ed или delet ed для данного триггера. Это означает, что значения в базовой таблице можно заменить без входа в циклическую рекурсию. Если для некоторого действия в таблице определено сразу несколько триггеров, эти триггеры срабатывают в порядке определения. Если порядок важен, будет проще (и разумнее) использовать всего один триггер. Триггеры не отменяют существующих разрешений; вместо этого они используют схему текущих разрешений. Если пользователь не имеет разрешения на прямое обновление таблицы, то он не сможет обновить таблицу с помощью триггера или другой таблицы, для которой он обладает разрешением на обновление. Триггеры не могут определяться для временных таблиц или представлений. При модификации данных через представление будут выполнены все триггеры для базовых таблиц. Триггеры могут выполнять хранимые процедуры, в том числе и удаленные хранимые процедуры. В триггерах можно использовать курсоры, хотя это и не рекомендуется, — триггеры выполняются часто, а курсоры работают медленно. В частности, курсоры в триггерах применяются для ведения нестандартных журналов, обработки дубликатов данных и выполнения действий с отдельными записями таблиц insert ed/ delet ed. Затраты ресурсов для триггеров, как и для хранимых процедур, относительно невелики. Триггер вставки не срабатывает во время медленной загрузки данных с использованием BCP ( Bulk Copy Program ) . Триггер удаления не срабатывает во время выполнения команды TRUNCATE TABLE. Результаты работы триггера направляются вызывающей программе, хотя пользоваться этим не рекомендуется. Не используйте в триггерах команды SELECT, которые возвращают пользователю итоговые наборы. Приложение, выдавшее команду I NSERT, вряд ли будет ожидать или обрабатывать итоговые наборы. Для возврата информации из триггеров следует использовать команды PRI NT и RAI SERROR. Просмотр триггеров Чтобы вывести список всех таблиц с триггерами, воспользуйтесь следующей командой SELECT: SELECT nam e, user_nam e(uid) , "insert t rigger" = obj ect_ nam e( inst rig) , "update t rigger" = object _nam e( updt rig) ,

converted to PDF by BoJIoc

"delet e t rigger" = obj ect_nam e(delt rig) FROM sysobj ect s WHERE t ype = "U" ORDER BY nam e Приведенный фрагмент выводит все таблицы вместе с триггерами. Чтобы вывести SQL-команды триггера, воспользуйтесь следующей процедурой: sp_helpt ext имя_ триггера Следующая команда выводит список всех объектов, на которые существует ссылка в триггере: sp_depends имя_ триггера Чтобы вывести все триггеры и сохраненные процедуры, ссылающиеся на таблицу, воспользуйтесь следующей командой: sp_depends имя_ таблицы Наконец, для создания, удаления, модификации и просмотра триггеров можно воспользоваться утилитой SQL Ent erprise Manager. Выделите таблицу, откройте меню Manage и выберите Task д Manage Triggers. На рис. 12 .6 изображен триггер, созданный в SQL Ent erprise Manager.

Рис. 12.6. Создание триггера в SQL Ent erprise Manager Примеры экзаменационных вопросов Que stion 1 What are t riggers used for? [ Check all correct answers] • • • • •

A. Enforcing referent ial int egrit y by defining a default . B. Com plex dom ain enforcem ent . C. Enforcing com plex business rules. D. Enforcing com plex default s. E. Maint aining duplicat e dat a.

converted to PDF by BoJIoc

Вопрос 1 Для каких целей используются триггеры? [ Выберите все правильные ответы] • • • • •

A. Реализация ссылочной целостности посредством определения значений по умолчанию. B. Реализация сложных доменов. C. Реализация сложных деловых правил. D. Реализация сложных значений по умолчанию. E. Обработка дубликатов данных.

Правильные ответы — A, B, C, D и E. Que stion 2 When is a t rigger fired? [ Check all correct answers] • • • • •

A. When t he t rigger fire statem ent is executed. B. Before dat a m odificat ion. C. Before const ant validat ion. D. Aft er t he t ransact ion com plet es. E. Aft er const raint validat ion, but before the t ransact ion com m it s.

Вопрос 2 Когда срабатывает триггер? [ Выберите все правильные ответы] • • • • •

A. При выполнении команды, вызывающей срабатывание триггера. B. Перед модификацией данных. C. Перед проверкой констант. D. После завершения транзакции. E. После проверки ограничений, но перед завершением.

Правильные ответы — A и E. Ответы B и C неверны, поскольку действия, описанные в них, выполняются раньше. Ответ D неверен, поскольку в этом случае триггер не мог бы откатить транзакцию. Ответ E тоже правилен, хотя его формулировка способна ввести в заблуждение. Que stion 3 How m any t riggers can exist on a t able? • • • • •

A. None. B. No effect ive lim it . C. Three. D. One for each t ype of dat a m odificat ion st atem ent . E. None of t he above.

Вопрос 3 Сколько триггеров может существовать в таблице? • • • • •

A. Ни одного. B. Количество практически не ограничено. C. Три. D. По одному для каждого типа команд модификации данных. E. Ни один из перечисленных вариантов.

Правильный ответ — B. Количество триггеров, существующих в таблице, практически не ограничено. Ответ A неверен, иначе триггеры бы вообще не существовали. Ответы C и D неверны; в них указаны ограничения, действовавшие в предыдущих версиях SQL Server. Que stion 4 How long does a t rigger persist in a dat abase? [ Check all correct answers] • • • • •

A. Unt il t he session is t erm inat ed. B. Unt il it is dropped. C. Unt il a new t rigger is creat ed wit hout t he append opt ion. D. Unt il anot her t rigger replaces it . E. Unt il t he t able it is creat ed for is dropped.

Вопрос 4 Как долго триггер существует в базе данных? [ Выберите все правильные ответы]

converted to PDF by BoJIoc

• • • • •

A. До завершения сеанса. B. До удаления. C. До создания нового триггера без параметра append. D. До его замены другим триггером. E. До удаления таблицы, для которой он создавался.

Правильные ответы — B, C, D и E. Ответ A неверен, поскольку триггер представляет собой объект, хранящийся в базе данных. Que stion 5 What are t he insert ed and delet ed t ables? • • • • •

A. Tem porary t ables located in t he tem pdb dat abase. B. Special views of t he t ransact ion log. C. Separat e database t ables. D. All of t he above. E. None of t he above.

Вопрос 5 Что представляют собой таблицы insert ed и delet ed? • • • • •

A. Временные таблицы, находящиеся в базе данных t em pdb. B. Специальные представления журнала транзакций. C. Отдельные таблицы базы данных. D. Все перечисленное. E. Ничего из перечисленного.

Правильный ответ — B. Таблицы insert ed и delet ed являются специальными представлениями журнала транзакций. Ответ A неверен, поскольку таблицы insert ed и delet ed не являются временными. Ответ С тоже неверен, таблицы являются представлениями журнала. Que stion 6 When can y ou access t he insert ed and delet ed t ables? • • • • •

A. You cannot access t hese t ables, because t hey are log tables. B. Only wit hin t he t ransact ion in which t hey are creat ed. C. Only wit hin t he t rigger t hat is firing. D. I n t he t rigger in w hich it fires and in any nest ed t rigger fired from t he t rigger. E. None of t he above.

Вопрос 6 Каким образом можно получить доступ к таблицам insert ed и delet ed? • • • • •

A. К этим таблицам обратиться нельзя, поскольку они являются таблицами журнала. B. Только из транзакции, в рамках которой они были созданы. C. Только из срабатывающего триггера. D. Из сработавшего триггера и из всех вложенных триггеров, сработавших из этого триггера. E. Ничего из перечисленного.

Правильный ответ — C, поскольку эти таблицы доступны только из триггера. Que stion 7 What is t he st ruct ure of t he inserted and delet ed t ables? [ Check all correct answers] • • • • •

A. Predefined. B. Set by t he server defaults. C. I dent ical t o each ot her. D. I dent ical t o the base t able. E. None of t he above.

Вопрос 7 Какую структуру имеют таблицы inserted и delet ed? [ Выберите все правильные ответы] • • • •

A. Заранее определенную. B. Зависящую от настроек по умолчанию сервера. C. Идентичную друг другу. D. Идентичную базовой таблице.

converted to PDF by BoJIoc

• E. Ничего из перечисленного. Правильные ответы — C и D. Ответ B неверен, поскольку параметров по умолчанию для таблиц insert ed и delet ed не существует. Que stion 8 What are t he cont ent s of t he insert ed and delet ed t ables? [ Check all correct answers] • • • • •

A. The insert ed t able cont ains all row s insert ed or updat ed. B. The deleted t able cont ains all rows delet ed or updat ed. C. The insert ed t able contains only rows insert ed. D. The deleted t able cont ains only rows delet ed. E. None of t he above.

Вопрос 8 Как выглядит содержимое таблиц insert ed и delet ed? [ Выберите все правильные ответы] • • • • •

A. Таблица inserted содержит все вставленные или обновленные записи. B. Таблица delet ed содержит все удаленные или обновленные записи. C. Таблица inserted содержит только вставленные записи. D. Таблица delet ed содержит только удаленные записи. E. Ни один из перечисленных ответов.

Правильные ответы — A и B. Ответ C неверен, поскольку таблица insert ed содержит обновленные записи. Неверен и ответ D, поскольку таблица deleted тоже содержит обновленные записи. ГЛАВА 1 3

Транзакции Ключевые термины • • • • • • • •

Закрепление Взаимная блокировка Dist ribut ed Transact ion Coordinat or Блокировка Восстановление Откат Транзакция Журнал транзакций

Необходимые знания и приемы • • • • • • •

Управление транзакциями Использование команд управления транзакциями Понимание последовательности выполнения транзакций Знание ограничений, связанных с транзакциями Использование распределенных транзакций Понимание структуры журнала транзакций Блокировка транзакций

Транзакции являются одной из самых важных концепций, необходимых для построения приложений SQL Server. Механизм транзакций тесно связан с природой реляционных СУБД, поскольку именно транзакции обеспечивают целостность данных в любых ситуациях. Природа транзакций Транзакция представляет собой команду SQL или группу команд SQL, которые успешно завершаются или отменяются как единое целое. Транзакция является логической единицей работы, обладающей следующими свойствами: • Атомарность — транзакция является автономной единицей работы. • Согласованность — транзакция обеспечивает целостность данных и внутренних структур данных. • Изолированность — две транзакции могут работать с одними и теми же данными независимо от изменений, вносимых другой транзакцией.

converted to PDF by BoJIoc

• Устойчивость — последствия транзакции продолжают действовать до тех пор, пока не будут модифицированы другой транзакцией. Классическим примером транзакции является пересылка денег через банкомат. Предположим, вы хотите воспользоваться банкоматом для перевода $5000 с накопительного счета на текущий. Программа вычитает $5000 с накопительного счета, после чего увеличивает текущий счет на $5000 . Во время работы программы после вычитания денег с накопительного счета, но до увеличения текущего счета на банкомате происходит сбой питания. Вопрос: что происходит с $5000? Деньги возвращаются на накопительный счет, помещаются на текущий счет или пропадают навеки? Если эти две команды объединены в транзакцию, проблем нет. Это гарантирует, что обе команды либо успешно завершатся, либо не завершится ни одна из них. Без транзакций существует опасность того, что будет выполнена лишь одна команда. Перейдем к менее классическому, но более реальному примеру. Предположим, вы выполняете команду UPDATE, обновляющую несколько записей. В процессе обновления происходит сбой (нарушение питания, выключение SQL Server или физический сбой на сервере) . Что произойдет в тот момент, когда данные снова станут доступными? Завершится ли операция обновления? Нет. Произойдет откат. В системах «клиент/ сервер» при разрыве связи подключение не восстанавливается. Вместо этого создается новое подключение. Сервер не располагает средствами, позволяющими связать старое подключение с новым. В результате SQL Serv er не пытается продолжить выполнение незавершенных транзакций. Следовательно, в приведенном примере выполнение команды UPDATE будет прервано и вам придется выполнить ее заново. Внимание Эта глава не слишком длинна, однако в ней представлены многие определения, критически важные для понимания SQL Server и потому часто встречающиеся на экзаменах. По умолчанию любая команда SQL представляет собой транзакцию. Кроме того, несколько команд SQL также могут быть объединены в одну транзакцию. Транзакции используются для различных целей, в том числе: • для соблюдения деловых правил или ссылочной целостности; • управления отдельными единицами работы; • обеспечения согласованности данных, особенно для избыточных или сводных данных. В SQL Serv er возможности управления транзакциями существуют во всех пользовательских базах данных. Для этого в SQL Server предусмотрено несколько механизмов, в том числе: • • • •

команды управления транзакциями; журналы транзакций с опережающей записью (writ e-ahead) ; автоматическое восстановление; автоматическая блокировка.

Команды управления транзакциями Команды управления транзакциями определяют логические единицы выполняемой работы. В табл. 13.1 перечислены команды управления транзакциями SQL Server и приведены краткие описания. Следует помнить, что команды управления транзакциями не влияют на последовательность выполнения программы. В листинге 13.1 приведен пример транзакции, демонстрирующий применение пар BEGI N TRAN…COMMI T TRAN для объединения нескольких команд SQL в одну логическую единицу работы. Листинг 1 3 .1 . Пример транзакции BEGI N TRAN UPDATE savings_account SET balance = balance - $5000 WHERE account _num ber = @sav_account I F @@error ! = 0 BEGI N

converted to PDF by BoJIoc

ROLLBACK TRAN RETURN END UPDATE checking_account SET balance = balance + $5000 WHERE account _num ber = @chk_account I F @@error ! = 0 BEGI N ROLLBACK TRAN RETURN END COMMI T TRAN В листинге 13.1 команда BEGI N TRAN сообщает серверу о начале транзакции. Это означает, что до получения сервером команды завершения транзакции (COMMI T TRAN) все изменения являются временными. Следовательно, если на сервере произойдет сбой после первого обновления, произойдет откат транзакции. Термин «откат» означает, что все последствия транзакции будут отменены; данные на сервере будут выглядеть так, словно никаких изменений не было. Чтобы обеспечить согласованность транзакций, фрагмент в листинге 13.1 блокирует модифицированную информацию до завершения транзакции. Термин «блокировка» (lock) означает, что никакой процесс не сможет обратиться к данным до их освобождения (посредством закрепления или отката транзакции). Таблица 13 .1 . Команды управления транзакциями и их применение Синтаксис

Применение

BEGI N TRAN[ SACTI ON] [ имя_транзакции| @переменная]

Определяет начало транзакции и заставляет сервер занести в журнал запись BEGI N TRAN.

COMMI T TRAN[ SACTI ON] [ имя_транзакции| @переменная]

Информирует сервер о завершении текущей транзакции, заставляет занести в журнал запись COMMI T TRAN и делает изменения данных постоянными.

COMMI T WORK Работает аналогично COMMI T TRAN, но без имени транзакции.

Соответствует синтаксису ANSI -92.

ROLLBACK TRAN[ SACTI ON] [ имя_транзакции| имя_точки_сохранения| @переменная]

Заставляет сервер отменить все изменения данных от последней определенной точки сохранения или от начала транзакции.

ROLLBACK WORK Работает аналогично ROLLBACK TRAN, но без имени транзакции.

Соответствует синтаксису ANSI -92.

SAVE TRAN[ SACTI ON] имя_транзакции| @переменная

Регистрирует промежуточную точку, к которой может выполняться откат ( обеспечивает возможность частичного отката). Транзакция остается активной.

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

converted to PDF by BoJIoc

Последовательность выполнения транзакций Последовательность выполнения транзакций проще всего продемонстрировать на каком-нибудь примере. Рассмотрим рис. 13.1. На этом рисунке транзакция начинается в первой строке кода. Сервер запоминает этот факт, обновляя глобальную переменную @@TRANCOUNT. Переменная @@TRANCOUNT равна 0 для открытой транзакции и 1 или больше в зависимости от уровня вложенности транзакции.

Рис. 13 .1 . Последовательность выполнения вложенных транзакций Внимание Проверка значения @@TRANCOUNT в программе позволяет узнать о наличии открытой транзакции. После открытия транзакции команда I NSERT добавляет запись в таблицу tally. Добавленная запись находится в таблице и может участвовать в запросах со стороны процесса, открывшего транзакцию, но не со стороны всех остальных процессов. До закрепления транзакции она не является постоянным объектом базы данных. Команда SAVE TRAN используется в качестве «закладки». Она не влияет на значение @@TRANCOUNT и не изменяет уровня вложенности транзакции, а лишь позволяет позднее вернуть транзакцию к точке сохранения. Обратите внимание: откаты, закрепления и команды BEGI N TRAN не обязаны образовывать пары, аналогичные традиционным (и необходимым с точки зрения синтаксиса) парам BEGI N/ END. Каждая транзакция завершается откатом или закреплением, однако для упрощения логики программа может содержать несколько команд отката и/ или закрепления.

converted to PDF by BoJIoc

Независимо от количества вложенных команд BEGI N TRAN вложенность является лишь синтаксической. Другими словами, действительно активной является лишь одна транзакция. Эта открытая транзакция закрепляется в базе данных только командой COMMI T самого верхнего уровня. SQL Server следит за этим, уменьшая значение @@TRANCOUNT на единицу для каждого закрепления. Хотя закрепление уменьшает значение @@TRANCOUNT, неуточненная команда ROLLBACK вызывает откат к самой внешней транзакции. Если глобальная переменная @@TRANCOUNT так и не возвращается к нулевому значению, транзакция считается незавершенной и откатывается. Блокировка сохраняется до завершения транзакции по той или иной причине. Тем не менее, существуют некоторые действия, которые не могут выполняться в транзакциях. Ограничения транзакций Транзакции SQL Server должны подчиняться некоторым ограничениям. Например, транзакция относится к конкретному серверу ( то есть не может распространяться на несколько серверов). Для создания мультисерверных транзакций следует использовать Dist ribut ed Transact ion Coordinat or. Другое ограничение связано с дистанционным вызовом процедур (RPC) . RPC представляют собой хранимые процедуры, находящиеся на других серверах и не являющиеся локальными по отношению к серверу. Следовательно, RPC не могут управляться локальным журналом транзакций и потому не могут быть отменены откатом локального процесса ( снова приходится использовать Dist ributed Transact ion Coordinat or). Наконец, некоторые команды DDL (Dat a Definit ion Language) не могут использоваться в транзакциях. Их список приведен ниже: • ALTER/ CREATE/ DROP DATABASE; • DUMP/ LOAD DATABASE/ TRANSACTI ON; • UPDATE STATI STI CS. Распределенные транзакции ( то есть транзакции, распространяющиеся на две и более базы данных) обладают собственным набором правил и ограничений. Распределенные транзакции Как упоминалось выше, распределенной транзакцией называется транзакция, распространяющаяся на две и более базы данных. Если обе базы данных находятся на одном сервере, Dist ribut ed Transact ion Coordinat or позволяет SQL Server управлять ходом транзакции. Если базы данных находятся на разных серверах, Dist ribut ed Transact ion Coordinat or использует в журналах транзакций процесс «двухфазового закрепления» (t wo-phase com m it ) . Распределенные транзакции проходят двухфазовое закрепление. В первой (подготовительной) фазе диспетчер транзакции посылает всем серверам-участникам команду «приготовиться к закреплению». Непосредственное закрепление происходит во второй фазе, когда диспетчер транзакции после успешного завершения первой фазы посылает всем серверам оповещение. Если где-нибудь произойдет сбой, все компоненты транзакции откатываются на всех серверах. Кроме двухфазового закрепления существуют дополнительные команды управления транзакциями, используемые для управления распределенными транзакциями: BEGI N DI STRI BUTED TRAN[ SACTI ON] [ имя_транзакции| переменная] По этой команде сервер запускает Dist ribut ed Transact ion Coordinat or. Распределенные транзакции закрепляются командой COMMI T TRAN, завершающей любую другую транзакцию. Команда закрепления или отката распределенной транзакции выдается тем же сервером, на котором была выполнена команда BEGI N DI STRI BUTED TRANSACTI ON. Этот сервер называется управляющим (cont rolling server). Включение серверов в распределенную транзакцию осуществляется сервером, непосредственно инициировавшим транзакцию, или любым другим сервером, участвующим в транзакции. Добавленные серверы называются координирующими серверами ( coordinat ing servers) .

converted to PDF by BoJIoc

Обратите внимание: координирующие серверы не запрашивают участие в транзакции, а получают требование извне. Внимание Распределенные транзакции могут вызывать лишь хранимые процедуры на распределенных серверах. Координирующий сервер использует либо хранимую процедуру, либо встроенный SQL-код. Перейдем к следующему важнейшему компоненту управления транзакциями — журналу транзакций. Журнал транзакций Каждый экземпляр SQL Server ведет журнал транзакций, в котором регистрируются все изменения данных в базе. Формат журнала транзакций не подходит для чтения или модификации со стороны пользовательского процесса. Для некоторых операций (например, CREATE I NDEX) регистрируются не изменения данных, а сведения об использовании страниц. Внимание В SQL Serv er 7 журнал транзакций представляет собой файл, отдельный от базы данных. В предыдущих версиях журнал транзакций был таблицей базы данных с именем syslogs. В этом заключается одно из принципиальных отличий новой версии SQL Serv er. Журналы транзакций обеспечивают прямое и обратное восстановление транзакций. Восстановление автоматически происходит при запуске сервера. В процессе восстановления данные синхронизируются с журналом (синхронизация может быть нарушена в процессе сброса данных из кэша на диск). В журнале транзакций также регистрируются изменения, производимые текущей транзакцией, что позволяет выполнить откат и вернуть данные к состоянию, действовавшему до начала изменений. Что же в действительности происходит в процессе регистрации транзакции? Последовательность событий при регистрации транзакций Процесс регистрации транзакций существует для того, чтобы обеспечивать транзакционную целостность данных. Сначала команда BEGI N TRAN записывается в журнал, находящийся в кэше; при этом запоминается уникальный номер транзакции, а также ее номер последовательности. Затем в кэше модифицируются страницы журнала ( в SQL Server реализован журнал транзакций с опережающей записью) . Далее в кэше модифицируются страницы данных. Наконец, команда COMMI T TRAN записывается в журнал, находящийся в кэше, после чего кэш с журналом сбрасывается на диск. Обратите внимание на то, что не стоит торопиться с перенесением на диск страниц данных, поскольку в процессе восстановления сервер может воссоздать страницы данных по страницам журнала. Контрольные точки «Контрольная точка» (checkpoint ) — это процесс записи всех грязных страниц данных (dirt y pages) из кэша на диск. «Грязными» называются страницы данных в кэше, которые были модифицированы, однако эти модификации еще не были отражены на диске. Сначала на диск записываются страницы журнала, а затем — страницы данных. Затем на диск записывается маркер контрольной точки. Маркер контрольной точки представляет собой механизм, уменьшающий время восстановления, поскольку к моменту завершения контрольной точки база данных на диске полностью синхронизирована ( то есть журнал соответствует данным) . Контрольные точки устанавливаются в следующих ситуациях: • • • •

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

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

converted to PDF by BoJIoc

до завершения транзакции. Существует несколько уровней блокировки, предназначенных для разных приложений в разных ситуациях. Уровни блокировки определяются стандартом SQL ANSI -92. Уровни изоляции ANSI - 9 2 Стандарт SQL ANSI -92 определяет четыре уровня изоляции транзакций SQL. Каждый уровень изоляции описывает типы действий, выполнение которых для данного уровня запрещено. В следующих разделах описаны все уровни изоляции ANSI . Помните о том, что высокие уровни включают в себя низкие уровни. Также обратите внимание на альтернативные имена различных уровней изоляции: • • • •

READ UNCOMMI TED — ANSI -уровень 0; READ COMMI TED — ANSI - уровень 1 ; REPEATABLE READ — ANSI -уровень 2; SERI ALI ZABLE — ANSI -уровень 3.

Уровень изоляции 0 — READ UNCOMMI TED Уровень 0 допускает грязное чтение. Процесс, выполнящий чтение данных, не нуждается в блокировках и не получает их. Уровень 0 реализуется командой NOLOCK или параметром READUNCOMMI TED команд SELECT и SET. Этот уровень блокировки гарантирует лишь то, что данные не будут физически нарушены. Уровень изоляции 1 — READ COMMI TED Уровень 1 является уровнем блокировки по умолчанию; он предотвращает грязное чтение. В SQL Server уровень 1 реализуется с помощью механизма монопольных блокировок. SQL Server также позволяет переопределить альтернативный уровень изоляции командой SET LOCKI MPLEMENTS или параметром READ COMMI TED команд SELECT и SET. Уровень изоляции 2 — REPEATABLE READ Уровень 2 запрещает неповторяемые операции чтения. Таким образом, вторая транзакция не сможет модифицировать запись, которая в настоящее время читается текущей транзакцией. В SQL Server уровень 2 реализуется параметром REPEATABLE команд SELECT и SET. Уровень изоляции 3 — SERI ALI ZABLE Уровень 3, последний уровень изоляции, запрещает чтение фантомных записей. Он предотвращает ситуацию, при которой набор выбранных записей отличается от набора, прочитанного ранее в этой транзакции с тем же критерием выборки. В SQL Serv er уровень 3 реализуется параметрами HOLDLOCK и SERI ALI ZABLE команд SELECT и SET. Уровень изоляции по умолчанию Как упоминалось выше, по умолчанию в SQL Server используется уровень изоляции 1. В соответствии со стандартом ANSI для транзакций должна существовать возможность установки уровня изоляции 3 . Уровень изоляции, используемый по умолчанию для сеанса, задается командой SET: SET TRANSACTI ON I SOLATI ON LEVEL { READ COMMI TTED | READ UNCOMMI TED | REPEATABLE READ | SERI ALI ZABLE } При установке значения SERI ALI ZABLE ко всем командам SELECT транзакции автоматически применяется параметр HOLDLOCK. Уровень изоляции транзакции продолжает действовать на протяжении всего сеанса или до установки нового уровня. Чтобы узнать текущий уровень изоляции, воспользуйтесь командой DBCC USEROPTI ONS. Все блокировки в SQL Server устанавливаются автоматически. В табл. 13 .2 перечислены уровни гранулярности, а в табл. 13.3 — различные типы блокировок. Таблица 13 .2 . Гранулярность блокировок Ресурс

Описание

Идентификатор записи Отдельная запись по идентификатору записи (rid).

converted to PDF by BoJIoc

Ключ

Отдельная запись по уникальному индексу (ключу).

Страница

8-килобайтная страница данных или страница индекса.

Блок страниц (ext ent )

Смежная группа из 8 страниц данных или страниц индекса.

Таблица

Вся таблица, включая все данные и индексы.

База данных

Вся база данных.

Таблица 13 .3 . Типы блокировок Тип

Описание

Монопольная блокировка( X)

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

Условная разделяемая блокировка( I S)

Принимает запросы на чтение данных.

Условная блокировка модификации ( I X)

Принимает запросы на модификацию данных.

Разделяемая (S)

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

Разделяемая блокировка с условномонопольной ( SI X)

Устанавливает параллельные блокировки для ресурсов высокого уровня (таблиц) и монопольные блокировки для некоторых ресурсов низкого уровня (страницы/ записи) .

Структурная

Применяется для системных таблиц и индексов. По сравнению с остальными типами структурные блокировки расходуют намного больше ресурсов и обеспечивают большую степень параллельности. Структурная блокировка модификации (SCH-M) используется при модификации структуры данных и выполнении DDL. Раздельная структурная блокировка (SCH-S) используется при компиляции запросов. Раздельная структурная блокировка не запрещает никакие блокировки.

Модификации (U)

Действует как "закладка", помогающая SQL Server избежать взаимных блокировок. Разрешает разделяемые блокировки, но запрещает другие блокировки модификации или монопольные блокировки.

Механизм расширения блокировок (lock escalat ion) позволяет повысить быстродействие при запросе чрезмерного количества блокировок для страницы или таблицы в одной транзакции. Расширение блокировок SQL Serv er стремится устанавливать блокировку на уровне записей, чтобы обеспечить максимальную параллельность в работе. При этом SQL Server устанавливает для страниц и таблиц условные блокировки. С увеличением количества блокировок записей для одной команды SQL Server может перейти к блокировке страниц, если количество записей превышает пороговое значение. При расширении блокировки все блокировки более низкого уровня снимаются. SQL Server динамически определяет пороги расширения, для них не существует параметров конфигурации. Некоторые сведения о блокировках Если процесс получает монопольную блокировку для записи, страницы или таблицы, то до закрепления или отката транзакции ни один процесс не сможет прочитать этот объект или установить для него блокировку. Если процесс устанавливает разделяемую блокировку объекта, то другие процессы не смогут установить монопольную блокировку до снятия разделяемой блокировки. Если это приводит к возникновению проблем, сервер может перейти к блокировке по требованию (dem and lock) . Конкуренция процессов из- за блокировок может отрицательно сказаться на быстродействии системы. Старайтесь работать с базой данных с помощью хранимых процедур, чтобы свести к минимуму время, затрачиваемое на блокировку.

converted to PDF by BoJIoc

Совет Постарайтесь сократить объем транзакций и убрать из них лишние команды SELECT. Тем самым вы сокращаете время, в течение которого сохраняется блокировка объектов. Приложение никогда не должно держать блокировку в ожидании ввода данных от пользователя. Разделяемые блокировки обычно снимаются после чтения страницы или записи. Переопределение блокировок на уровне запросов Вы можете переопределить тип блокировки, используемый сервером, однако этой возможностью не стоит злоупотреблять. Помимо HOLDLOCK MS SQL Serv er позволяет определять на уровне запросов и другие типы блокировок. Если после имени таблицы в секции FROM следует одно из перечисленных ниже ключевых слов, запрос вмешивается в работу диспетчера блокировок SQL Server и применяет заданный тип блокировки. Блокировка сохраняется на время выполнения команды или транзакции, содержащей команду. Возможны следующие типы блокировок: • • • • • •

NOLOCK — разрешает грязное чтение; PAGLOCK — блокировка на уровне страниц, возможно расширение; ROWLOCK — блокировка на уровне записей; TABLOCK — разделяемая блокировка таблицы; TABLOCKX — монопольная блокировка таблицы; UPDLOCK — вместо разделяемой блокировки используется блокировка модификации.

Приведем примеры команд SELECT, в которых переопределяется механизм блокировки по умолчанию: SELECT * FROM t it les NOLOCK WHERE t it le_id = "394-92-9841" SELECT * FROM publishers TABLOCKX HOLDLOCK Помните: каждая блокировка, установленная вами, мешает другим процессам получить доступ к информации. Выбор уровня блокировки для индексов Процедура sp_ indexopt ion позволяет запрещать уровни блокировки для индексов. Например, для системы DSS с незначительным количеством обновлений можно ограничиться только разделяемыми блокировками. Для отключения блокировки на уровне страниц и/ или записей используется хранимая процедура sp_ indexopt ion: sp_ indexopt ion имя_индекса, имя_параметра, значение Имя_параметра принимает значения AllowRowLock s или AllowPageLocks, а значение — TRUE или FALSE. Следующий пример показывает, как отключить блокировку на уровне записей с помощью хранимой процедуры sp_ indexopt ion: sp_ indexopt ion 'm y table.m yindex ',AllowRowLocks,'FALSE' Команда запрещает блокировку на уровне записей для индекса m yindex таблицы с именем m yt able. Совет Процедурой sp_indexopt ion следует пользоваться крайне осторожно. Примеры экзаменационных вопросов Que stion 1 When is a t ransact ion m ade perm anent in a dat abase? [ Check all correct answers] • A. Aft er t he first com m it . • B. Aft er t he final com m it . • C. Aft er any checkpoint .

converted to PDF by BoJIoc

• D. When t he session term inates. • E. All of t he abov e. Вопрос 1 Когда результаты выполнения транзакции заносятся в базу данных? [ Выберите все правильные ответы] • • • • •

A. После первой команды com m it . B. После завершающей команды com m it . C. После любой контрольной точки. D. При завершении сеанса. E. Во всех перечисленных случаях.

Правильный ответ — B. Единственное действие, в результате которого транзакция заносится в базу данных, — переход @@TRANCOUNT в нулевое значение, что означает завершающее закрепление транзакции. Ответ A неверен, поскольку транзакция может содержать более одного уровня. Ответ C тоже неверен; контрольные точки не имеют никакого отношения к уровням вложенности транзакций. Наконец, ответ D неверен, поскольку он приводит к откату. Que stion 2 When does recovery occur? • • • • •

A. Aut om at ically when t he server is start ed. B. Aut om at ically when the server is stopped. C. Only during t he recover server com m and. D. Aft er each rolled back t ransact ion. E. All of t he abov e.

Вопрос 2 Когда происходит восстановление? • • • • •

A. Автоматически при запуске сервера. B. Автоматически при остановке сервера. C. Только по команде recov er server. D. После каждого отката транзакции. E. Во всех перечисленных случаях.

Правильный ответ — A. Восстановление автоматически выполняется при запуске сервера. Ответ B неверен, поскольку при остановке выполняется процесс контрольной точки. Ответ C неверен — команды recover server не существует. Ответ D неверен, поскольку процесс восстановления не запускается после каждого отката транзакции. Que stion 3 How m any t ransact ion isolat ion levels does t he ANSI st andards board define? • • • • • •

A. Zero. B. One. C. Two. D. Three. E. Four. F. None of t he above.

Вопрос 3 Сколько уровней изоляции транзакций определяет комитет по стандартам ANSI ? • • • • • •

A. Ноль. B. Один. C. Два. D. Три. E. Четыре. F. Ни один из перечисленных ответов.

Правильный ответ — E. Комитет по стандартам ANSI определяет четыре уровня изоляции. Que stion 4 How long does a com plet ed t ransact ion persist in a dat abase? • A. Unt il it is rolled back .

converted to PDF by BoJIoc

• • • •

B. Unt il it is com m it t ed. C. Unt il t he locks are released. D. Unt il anot her t ransact ion replaces it . E. None of t he above.

Вопрос 4 До какого времени завершенная транзакция продолжает существовать в базе данных? • • • • •

A. До отката. B. До закрепления. C. До снятия блокировок. D. До ее замены другой транзакцией. E. Ни один из перечисленных ответов.

Правильный ответ — E. Que stion 5 What lock t ypes are supported by SQL Server? [ Check all correct answers] • • • • •

A. Row level. B. Page level. C. Table level. D. Dat abase level. E. Serv er level.

Вопрос 5 Какие типы блокировок поддерживаются в SQL Server? [ Выберите все правильные ответы] • • • • •

A. На уровне записей. B. На уровне страниц. C. На уровне таблиц. D. На уровне баз данных. E. На уровне серверов.

Правильные ответы — A, B, C и D. SQL Server поддерживает блокировку на уровне записей, страниц, таблиц и баз данных ( а также на некоторых других уровнях). Ответ E неверен, поскольку блокировки на уровне серверов не существует. ГЛАВА 1 4

Импорт, экспорт и преобразование данных Ключевые термины • • • •

Импорт Экспорт Преобразование Утилита dt swiz

Необходимые знания и приемы • Использование программы BCP • Использование Data Transform at ion Service При работе с базой данных необходимо иметь возможность как внести в нее новые данные, так и извлечь уже существующие данные. В SQL Server существует несколько способов импорта и экспорта данных в базах. Термин «импорт» означает загрузку данных в базу, а «экспорт» — перенос данных из базы. Кроме того, данные можно преобразовать из одного формата в другой. В этой главе рассматриваются импорт и экспорт данных SQL Server с помощью программ BCP ( Bulk Copy Program ) и DTS (Dat a Transform at ion Service). BCP

converted to PDF by BoJIoc

Программа bcp.exe (BCP) предназначена для импорта и экспорта данных из таблиц баз данных SQL Server. Она устанавливается во время установки SQL Server и находится в подкаталоге binn основного каталога SQL Serv er. Внимание Данные, загружаемые в SQL Server, считаются импортированными. Когда BCP копирует данные в базу из файла (при осуществлении импорта), данные присоединяются к существующим таблицам. При копировании данных из базы в файл (экспорте) BCP стирает все текущее содержимое файла. Программа BCP способна читать и записывать данные в нескольких форматах. Различные форматы, используемые BCP, будут перечислены при описании параметров. Наиболее распространенным форматом в SQL Serv er является символьный формат с разделением полей запятыми. Примечание Если предыдущие версии bcp.exe подключались к SQL Server через DB-library, то BCP версии 7 использует для этой цели ODBC. При загрузке данных в таблицу базы данных с помощью BCP таблица должна заранее существовать в базе. Кроме того, для нее необходимо иметь разрешения на вставку и выборку данных. Количество и порядок полей в файле не обязательно должны совпадать со структурой таблицы. Однако в том случае, если между ними существуют отличия, необходимо использовать файл форматирования. В файле форматирования перечисляются импортируемые и экспортируемые столбцы, их порядок, длина и символы-разделители столбцов. Более того, типы данных файла форматирования должны быть совместимы с типами данных столбцов. В первой строке файла форматирования указывается номер версии BCP, а во второй — количество импортируемых или экспортируемых столбцов. Остальные строки файла форматирования содержат группы из семи полей в следующем порядке: • • • • • • •

Позиция поля в файле данных. Тип данных поля. Длина префикса (0, 1, 2 или 4) . Максимальная длина поля в файле данных. Разделитель полей ( обычно используется символ табуляции \ t ) . Номер столбца в таблице SQL Server. Имя столбца в таблице SQL Server. Не обязательно должно совпадать с настоящим именем столбца.

Поведение BCP при импорте и экспорте данных зависит от множества параметров. Синтаксис запуска утилиты BCP показан в листинге 14 .1 . Листинг 1 4 .1 . Синтаксис BCP bcp [ [ имя_базы.] [ владелец] .] имя_таблицы { in | out | form at } файл_данных [ - m максимум_ ошибок] [ - f файл_форматирования] [ -e файл_ошибок] [ - F первая_запись] [ -L последняя_запись] [ - b размер_пакета] [ - n] [ -c] [ - w] [ -N] [ -6] [ - q] [ -C кодовая_страница] [ - t разделитель_полей] [ - r разделитель_записей] [ - i входной_файл] [ - o выходной_файл] [ - a размер_сетевого_пакета] [ - S имя_сервера] [ -U имя_пользователя] [ - P пароль] [ - T] [ -v ] [ -k] [ - E] [ -h " рекомендация [ ,.. .n] " ] Для каждого параметра BCP существует эквивалентный параметр команды BULK I NSERT. Внимание Если параметр содержит какие-либо специальные символы, он должен заключаться в кавычки. Например: bcp pubs..aut hors out au.dat -U"My Account " Ниже перечислены параметры BCP: • I N| OUT| FORMAT — действие, выполняемое BCP. Если задан параметр FORMAT, утилита создает файл форматирования и не осуществляет импорт или экспорт данных. При использовании параметра FORMAT

converted to PDF by BoJIoc

необходимо также задать параметр - f. Если при выборе действия FORMAT не заданы параметры - n, -c, -w , 6 или - N, BCP предлагает ввести информацию о формате. • - m — максимальное количество ошибок. Записи, содержащие ошибки, игнорируются. По умолчанию этот параметр равен 10 . • - f — файл форматирования, позволяющий BCP более точно определять вид загружаемых или экспортируемых данных. Если при задании файла форматирования не указано действие FORMAT, файл форматирования должен уже существовать. • - e — файл ошибок. В этот файл записываются все сообщения об ошибках и записи, которые стали причиной ошибок. • - F — первая запись при пакетном копировании. По умолчанию копируются все записи от первой до последней. • - L — последняя запись при пакетном копировании. По умолчанию копируются все записи от первой до последней. • - b — размер пакета (количество записей, образующих один пакет при пакетном копировании). По умолчанию копируется весь файл. Для каждого пакета BCP создает новую транзакцию. Если пакетное копирование по какой-либо причине завершается аварийно, все вставки записей в текущем пакете откатываются. Параметр -b не следует использовать в сочетании с параметром - h "ROWS_ PER_BATCH = bb". • - n — при пакетном копировании используются исходные типы данных (определенные в базе) . • - c — все данные преобразуются к символьному типу. Данные сохраняются в типе char без префиксов. В качестве разделителя полей используется символ табуляции ( \ t ), а в качестве разделителя записей — символ перевода строки ( \ n). • - w — все данные преобразуются в кодировку Unicode. Данные сохраняются в типе nchar без префиксов. В качестве разделителя полей используется символ табуляции ( \ t ), а в качестве разделителя записей — символ перевода строки ( \ n). Параметр - w не используется в SQL Server 6.5 и более ранних версиях. • - N — для символьных данных используется кодировка Unicode, а для прочих данных — исходный тип (определенный в базе). По сравнению с - w этот параметр обеспечивает более высокое быстродействие; он предназначен для передачи данных из одного экземпляра SQL Server в другой через файл. Не используется в SQL Server 6.5 и более ранних версиях. • - 6 — в ходе пакетного копирования используются типы данных SQL Serv er 6 или 6.5. Параметр используется совместно с параметрами - c и - n для загрузки данных, сгенерированных прежними версиями BCP. • - q — параметр сообщает о том, что имя таблицы содержит специальные символы. В этом случае полное имя таблицы должно заключаться в кавычки (" ). • - C — кодировка, используемая для символьных данных. Влияет на столбцы, содержащие символы с кодами больше 127 или меньше 32. • - t — разделитель полей. По умолчанию используется символ табуляции ( \ t ). • - r — разделитель записей. По умолчанию используется символ перевода строки (\ n) . • - i — имя входного файла ответов. В этом файле перечисляются ответы на вопросы, которые могут возникнуть по каждому полю при выполнении пакетного копирования без параметров -n, -c, - w, - 6 или -N или без имени входного файла. • - o — имя файла, в который BCP направляет выходные данные. • - a — размер сетевого пакета. Параметр принимает значения от 4096 до 65 535 байт (по умолчанию равен 4096) . Увеличение размера сетевого пакета может повысить быстродействие BCP. Если запрашиваемый размер сетевого пакета слишком велик и не может быть предоставлен, используется значение по умолчанию. • - S — параметр приказывает SQL Server подключиться через сеть. По умолчанию используется локальный сервер. Параметр необходим при запуске BCP с удаленного компьютера в сети. • - U — имя пользователя (login) при подключении к SQL Server. По умолчанию используется имя текущего пользователя. • - P — пароль для указанного имени пользователя. Если данный параметр отсутствует и при этом не указан параметр -T, BCP запрашивает пароль. Если -P завершает список параметров и за ним не следует пароль, BCP использует пароль по умолчанию, который представляет собой значение NULL. • - T — приказывает BCP подключиться к SQL Server по доверенному соединению с использованием атрибутов аутентификации сетевого пользователя. Ни имя пользователя, ни пароль при этом не нужны. • - v — выводит номер версии и лицензионную информацию для программы BCP и завершает ее. • - k — при пакетной вставке пустые столбцы заполняются значениями типа NULL вместо значений по умолчанию. • - E — параметр сообщает, что в импортируемом файле присутствуют столбцы счетчика. Если параметр - E не задан, импортируемый файл не должен содержать значения для этих столбцов, поскольку SQL Server

converted to PDF by BoJIoc

автоматически присваивает им уникальные значения. При отсутствии параметра -E SQL Server берет значения столбцов счетчика из файла данных. • - h — определяет рекомендации ( hint s) для оптимизатора, используемые в процессе пакетного копирования данных в таблицу. Допустимые рекомендации оптимизатора BCP перечислены в табл. 14.1. Таблица 14 .1 . Рекомендации оптимизатора BCP Рекомендация

Значение

ORDER (столбец[ ASC| DESC] [ ,n] )

Порядок сортировки данных в файле данных.

ROWS_ PER_BATCH = bb

Количество записей данных в пакете. Не используется совместно с параметром -b.

KI LOBYTES_PER_BATCH = cc

Количество килобайт данных в пакете.

TABLOCK

На время операции пакетного копирования устанавливается блокировка на уровне таблицы.

CHECK_CONSTRAI NTS

В процессе загрузки данных SQL Server проверяет ограничения таблиц.

Запуск BCP При копировании данных (импортировании или экспортировании) с параметрами - n или -c BCP запрашивает только пароль (при условии, что он не был передан с параметром - P) . Если в командной строке не используются ни параметр -n, ни параметр - c, BCP запрашивает информацию о каждом поле в таблице. При каждом запросе в квадратных скобках выводится значение по умолчанию, которое можно принять нажатием клавиши Ent er. Запрашивается следующая информация: • • • •

тип данных в файле (может быть символьным или любым допустимым типом данных SQL Server); длина префикса в байтах; объем данных в файле; разделитель поля (любая символьная строка).

После ответов на вопросы о каждом поле утилита BCP спрашивает, хотите ли вы сохранить сведения о формате в файле. Внимание Вы можете одновременно выполнить несколько операций пакетного копирования, запуская несколько экземпляров BCP для одной таблицы. Это возможно лишь в том случае, если выполняются все требования пакетного копирования без регистрации в журнале ( установлен флаг SELECT I NTO/ BULKCOPY базы данных, таблица не имеет триггеров и не участвует в репликации) и если таблица не имеет индексов. Da ta Tra nsform a t ion Se rvice DTS (Dat a Transform at ion Serv ice) используется для импортирования, экспортирования и преобразования данных между несколькими разнородными источниками данных. DTS может использоваться для любого источника данных, с которым можно работать через OLE DB. Если для этого источника данных отсутствует драйвер OLE DB, можно воспользоваться драйвером OLE DB для ODBC. Dat a Transform at ion Service использует мастера DTS (DTS Wizard) для создания DTP (Dat a Transform at ion Package) . Запуск DTP выполняет преобразование данных. DTS можно вызвать непосредственно из SQL Server Enterprise Manager, запустить программу dt sw iz.exe или обратиться к DMO (Dist ributed Managem ent Obj ect ) . Компоненты DTS DTS состоит из четырех компонентов: • • • •

мастер импорта (I m port Wizard) ; мастер экспорта ( Export Wizard); конструктор пакетов ( Package Designer); программные COM-интерфейсы.

Все компоненты кратко описаны в следующих разделах.

converted to PDF by BoJIoc

D TS I m p ort W iza rd Мастер импорта руководит вашими действиями по импорту данных в базу SQL Serv er. Выполните следующие действия: 1. Запустите DTS I m port Wizard и нажмите кнопку Next . 2. В следующем окне выберите источник данных, содержащий импортируемые данные. Затем введите все параметры, необходимые для подключения ( параметры зависят от источника данных) . Нажмите кнопку Next . 3. В следующем окне выберите приемник данных и введите параметры, необходимые для подключения. Нажмите кнопку Next . 4. На следующем экране выберите команду Copy Tables (выбор копируемых таблиц) или Use Query (ввод команды SQL, определяющей копируемые данные) . Нажмите кнопку Next . 5. Если в предыдущем окне была выбрана команда Copy Tables, появляется окно для выбора копируемых таблиц. Если была выбрана команда Use Query , вам придется либо вручную ввести запрос в следующем окне, либо воспользоваться услугами конструктора запросов Query Builder (запускается кнопкой Query Builder) . Нажмите кнопку Next . 6. Выберите нужное действие — запустить пакет, сохранить пакет, создать пакет для репликации или запланировать выполнение пакета. Нажмите кнопку Nex t . Если вы решили запустить пакет, появляется окно, в котором выводится статус выполнения. В случае сохранения пакета вам будет предложено ввести имя и описание пакета, а также сведения о сервере. 7. В следующем окне нажмите кнопку Finish, чтобы выполнить все выбранные действия. D TS Ex port W iza rd Мастер экспорта руководит вашими действиями по экспорту данных из базы SQL Server. Выполните следующие действия: 1. Запустите DTS Export Wizard и нажмите кнопку Next . 2. В следующем окне выберите источник данных, содержащий экспортируемые данные. Введите все параметры, необходимые для подключения. Нажмите кнопку Next . 3. В следующем окне выберите приемник данных и введите параметры, необходимые для подключения. Нажмите кнопку Next . 4. На следующем экране выберите команду Copy Tables или Use Query. Нажмите кнопку Nex t . 5. Если в предыдущем окне была выбрана команда Copy Tables, появляется окно для выбора копируемых таблиц. Если была выбрана команда Use Query , вам придется либо вручную ввести запрос в следующем окне, либо воспользоваться услугами конструктора запросов Query Builder (запускается кнопкой Query Builder) . Нажмите кнопку Next . 6. Выберите нужное действие — запустить пакет, сохранить пакет, создать пакет для репликации или запланировать выполнение пакета. Нажмите кнопку Nex t . Если вы решили запустить пакет, появляется окно, в котором выводится статус выполнения. В случае сохранения пакета вам будет предложено ввести имя и описание пакета, а также сведения о сервере. 7. В следующем окне нажмите кнопку Finish, чтобы выполнить все выбранные действия. D TS Pa cka ge Designe r Конструктор пакетов предназначен для графического конструирования пакетов DTS. Пакет DTS определяет последовательность действий, выполняемых в процессе преобразования данных. В простейшем случае пакет DTS содержит одно действие по импорту или экспорту, определенное мастерами импорта или экспорта. Конструктор пакетов является частью SQL Server Enterprise Manager. Он позволяет сохранить пакет DTS в базе данных MSDB SQL Server, в Microsoft Reposit ory или в структурированном файле COM. Более того, пакет DTS можно запланировать для последующего выполнения.

converted to PDF by BoJIoc

Программные COM -интерфейсы COM-интерфейсы предназначены для создания и выполнения пакетов DTS. С COM-интерфейсами можно работать в любом языке программирования с поддержкой OLE Aut om at ion. Они позволяют создавать специализированные приложения, использующие пакеты DTS и объекты Dat a Pum p. Преобразование данных Одной из самых полезных возможностей DTS является преобразование данных. В процессе преобразования DTS определяет набор операций, выполняемых с данными при передаче в приемник. Новые значения вычисляются по одному или нескольким полям источника. Преобразование позволяет организовать сложную проверку, чистку и дополнение данных в процессах экспортирования или импортирования. Внимание DTS копирует только структуру данных и сами данные. Другие объекты баз данных (триггеры, хранимые процедуры, правила, значения по умолчанию, ограничения и пользовательские типы данных) не преобразуются. При работе с мастерами импорта и экспорта DTS можно определить взаимную привязку столбцов, а также ввести информацию о преобразованиях. Отображения столбцов В окне Colum n Mappings ( рис. 14.1) определяется структура таблиц, в которую передаются данные, а также соответствия между столбцами источника и приемника.

Рис. 14 .1 . Окно Colum n Mappings DTS позволяет создать таблицы-приемники, а также удалять и заново создавать существующие таблицы. Если создание таблицы-приемника не является частью операции DTS, можно удалить содержимое существующей таблицы или присоединить новые данные к уже существующим. Как видно из рис. 14 .1 , окно Colum n Mappings позволяет указать, какое поле источника соответствует каждому полю приемника. Кроме того, для каждого выходного столбца можно изменить тип данных, разрешить или запретить значения типа NULL, а также задать размер и точность. Кнопка Edit SQL (рис. 14.2) позволяет ввести команду SQL для таблицы-приемника. Преобразования В окне Transform at ions ( рис. 14.3) можно непосредственно скопировать столбцы источника в столбцы приемника или задать сценарий, который будет выполняться DTS для преобразования данных.

converted to PDF by BoJIoc

Если выбрать непосредственное копирование данных, в окне Advanced Transform at ion Opt ions можно задать значения дополнительных флагов, управляющих процессом преобразования. Флаги, устанавливаемые в этом окне, перечислены в табл. 14.2. Как правило, эти флаги обеспечивают все необходимые функциональные возможности. Если вам потребуется более сложное преобразование, установите переключатель Transfer I nform at ion на вкладке Transform at ions и выберите тип сценария ( Java Script , Perl Script или Visual Basic Script ). Для каждого типа DTS генерирует сценарий по умолчанию. В листинге 14.2 приведен пример сценария, написанного на Visual Basic.

Рис. 14.2. Окно Creat e Table SQL St at em ent

Рис. 14.3. Вкладка Transform at ions

converted to PDF by BoJIoc

Таблица 14 .2 . Флаги преобразования данных Флаг

Эффект

Default t ransform at ion flags (Стандартные флаги преобразования) All possible Conversions are allowed (Разрешить любые преобразования)

Разрешает преобразования без потерь данных, понижение типа данных и преобразования NULL.

Require exact m atch between source and dest inat ion (Требовать точного соответствия между источником и приемником)

Означает, что столбцы источника и приемника должны иметь одинаковый тип данных, размер, точность и возможность NULL. Это самое строгое ограничение.

Cust om t ransform at ion flags (Нестандартные флаги преобразования) Allow dat a t ype prom ot ion (Разрешить повышение типов данных)

Разрешает преобразование числовых типов в числовые типы большего размера. Например, столбец TI NYI NT может быть преобразован в I NTEGER.

Allow dat a t ype dem ot ion ( Разрешить понижение типов данных)

Разрешает преобразование числовых типов в числовые типы меньшего размера. Например, столбец I NTEGER может быть преобразован в TI NYI NT. Если преобразуемое число оказывается слишком большим для столбца приемника, происходит ошибка переполнения.

Allow NULL conversion (Разрешить преобразование NULL)

Разрешает преобразование столбца источника с запрещенными значениями типа NULL в столбец приемника с разрешенными значениями NULL.

Листинг 1 4 .2 . Сценарий преобразования данных, написанный на Visua l Ba sic '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ' Visual Basic Transform at ion Script ' Copy each source colum n to t he ' dest inat ion colum n '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Funct ion Transform () DTSDest inat ion(" au_id" ) = DTSource(" au_id" ) DTSDest inat ion(" au_lnam e") = DTSource(" au_ lnam e") DTSDest inat ion(" au_fnam e") = DTSource(" au_ fnam e") DTSDest inat ion(" au_lnam e") = DTSource(" au_ lnam e") DTSDest inat ion(" address") = DTSource(" address") DTSDest inat ion(" cit y" ) = DTSource("cit y" ) DTSDest inat ion(" st at e" ) = DTSource( "st ate") DTSDest inat ion(" zip" ) = DTSource( "zip") DTSDest inat ion(" cont ract ") = DTSource( " cont ract " ) Transform = 1 End Funct ion Утилита dtsw iz Утилита dt swiz запускает процесс преобразования данных в режиме командной строки. Параметры dt swiz определяют данные, вводимые в окнах импорта, экспорта и преобразования данных DTS. При вызове утилиты dt sw iz используется следующий синтаксис: dt swiz [ / f имя_файла] [ / i | / x] [ / r имя_провайдера] [ / s имя_сервера] [ / u имя_пользователя] [ / p пароль] [ / n] [ / d имя_базы] [ / y] Ниже приведены краткие описания каждого параметра: • / f — структурированный файл COM для хранения пакета DTS, построенного мастером.

converted to PDF by BoJIoc

• / i — импорт данных в SQL Server. • / x — экспорт данных из SQL Server. • / r — имя провайдера для подключения к источнику (при импорте) или к приемнику (при экспорте) . • / s — определяет сервер для экспорта или импорта данных. Если вы хотите перенести данные с одного экземпляра SQL Server на другой, один из серверов должен быть сконфигурирован как источник данных ODBC, а имя сервера, имя и пароль пользователя, а также база данных должны быть объявлены в настройках ODBC. • / u — имя пользователя при регистрации в SQL Server. • / p — пароль для регистрации в SQL Server. • / n — доверенное подключение — параметры / u и / p не используются. • / d — база данных SQL Server. • / y — программа dt swiz скрывает системные таблицы и базы данных. Примеры экзаменационных вопросов Que stion 1 DTS Export w izard allows you t o perform which of t he following ? [ Check all correct answers] • • • • •

A. Migrat e data from a SQL Server t o anot her SQL Server. B. Migrat e data from a SQL Serv er t o any ODBC dat a source. C. Migrat e dat a from Oracle t o SQL Server. D. Migrat e dat a from a SQL Serv er t o Oracle. E. None of t he above.

Вопрос 1 Что из перечисленного можно делать с помощью мастера экспорта DTS? [ Выберите все правильные ответы] • • • • •

A. Перенос данных из одного экземпляра SQL Server в другой экземпляр SQL Server. B. Перенос данных из SQL Server в любой источник данных ODBC. C. Перенос данных из Oracle в SQL Server. D. Перенос данных из SQL Serv er в Oracle. E. Ничего из перечисленного.

Правильные ответы — A, B, C и D. Хотя мастер называется «мастером экспорта», он позволяет импортировать данные из базы SQL Server в любой источник данных OLE DB. К этой категории относятся и источники данных ODBC. Ответ E неверен, поскольку в списке присутствуют правильные ответы. Que stion 2 What opt ion is used t o direct BCP t o redirect t he errors t o a file? • • • • •

A. - e B. - o C. -m D. -f E. None of t he above.

Вопрос 2 Какой параметр приказывает BCP осуществлять запись всех ошибок в файл? • • • • •

A. - e B. - o C. -m D. -f E. Ни один из перечисленных параметров.

Правильный ответ — A; в BCP для записи ошибок в файл используется параметр - e имя_файла. Ответ B неверен, поскольку параметр -o работает с данными на выходе BCP, а не с ошибками. Ответ C неверен — параметр -m ограничивает максимальное количество ошибок, допускаемых BCP до аварийного завершения. Ответ D тоже неверен, поскольку параметр - f определяет первую импортируемую или экспортируемую запись. Правильный ответ присутствует в списке, поэтому ответ E тоже неверен. Que stion 3 What dt swiz param et er can be used t o specify what login t o use when connect ing t o a SQL Server? [ Check all correct answers] • A. - n

converted to PDF by BoJIoc

• • • •

B. - u C. -I D. U E. None of t he above.

Вопрос 3 Какой параметр dt swiz определяет входное имя, используемое при подключении к SQL Server? [ Выберите все правильные ответы] • • • • •

A. - n B. - u C. -I D. U E. Ни один из перечисленных параметров.

Правильный ответ — E, поскольку нужный параметр отсутствует в списке. Все параметры dt swiz начинаются с наклонной черты (/ ), а не с дефиса (-) . Que stion 4 Which of t he following are t rue about t he follow ing BCP st at em ent ? [ Check all correct answers] Bcp c in - Uaaaaaa - P xyccc • • • • •

A. The st at em ent will t ry t o connect t o a local server. B. The st at em ent will fail, because t he dat abase nam e is m issing. C. The st at em ent will connect t o t he user’s aaaaaa default dat abase. D. The st at em ent will prom pt t he user for inform at ion about the file’s form at . E. None of t he above.

Вопрос 4 Какие из следующих утверждений истинны по отношению к следующей команде BCP? [ Выберите все правильные ответы] Bcp c in - Uaaaaaa - P xyccc • • • • •

A. Команда попытается подключиться к локальному серверу. B. Команда не может быть выполнена, поскольку не указано имя базы данных. C. Команда попытается подключиться к базе данных по умолчанию для пользователя aaaaaa. D. Команда запросит у пользователя информацию о формате файла. E. Ничего из перечисленного.

Правильный ответ — E, поскольку правильный ответ отсутствует в списке. Первый параметр после in (Uaaaaaa) интерпретируется как имя входного файла. Если -Uaaaaaa является допустимым именем файла, команда попытается подключиться к локальному серверу как именем текущего пользователя и паролем xyccc. Если файл не существует, произойдет ошибка, поэтому ответы A, B, C и D неверны. Que stion 5 The DTS data t ransform at ion GUI can use which of t he follow ing program m ing languages t o direct ly t ransform dat a? [ Check all correct answers] • • • • •

A. Perl B. C C. Visual Basic D. Java E. Visual C+ +

Вопрос 5 Какие из перечисленных языков программирования могут использоваться графической оболочкой DTS для непосредственного преобразования данных? [ Выберите все правильные ответы] • • • • •

A. Perl B. C C. Visual Basic D. Java E. Visual C+ +

converted to PDF by BoJIoc

Правильные ответы — A, C и D. При непосредственном преобразовании данных могут использоваться сценарии на языках Perl, Visual Basic и Java. Ответы B и E неверны, поскольку C и Visual C+ + не поддерживаются графической оболочкой DTS напрямую. ГЛАВА 1 5

Полнотекстовый поиск Ключевые термины • Индекс для полнотекстового поиска • Запрос, использующий полнотекстовый поиск • Каталоги индексов для полнотекстового поиска Необходимые знания и приемы • Подготовка индекса для полнотекстового поиска • Создание индекса для полнотекстового поиска • Выполнение запроса, использующего полнотекстовый поиск В типичной реляционной СУБД, к которой относится SQL Server, все данные, в том числе и типа TEXT, хранятся в столбцах с конкретным типом данных. При вставке данных в таблицу можно создать индекс, ускоряющий выборку данных. Однако при работе с данными типа TEXT сама возможность построения индекса выглядит сомнительно. Поиск для данных типа TEXT Рассмотрим несколько вариантов запроса для поиска слова com put er. Первый пример находит только те значения t it le, которые начинаются со слова com put er: SELECT t it le FROM t it les WHERE t it le LI KE " Com put er% " В другом варианте этот запрос записывается в виде SELECT t it le FROM t it les WHERE t it le > = "Com puter" Подобный тип аргумента поиска позволяет оптимизатору SQL Server использовать индекс. Следующий пример находит слово com put er в любой позиции столбца t it le: SELECT t it le FROM t it les WHERE t it le LI KE " % Com put er% " Такой вариант работает крайне медленно, поскольку серверу приходится выполнять сканирование таблицы. Альтернативное решение заключается в реализации полнотекстового поиска. Стандартный индекс сортирует столбец по возрастанию или убыванию символов. Полнотекстовый поиск упрощает нахождение слов или фраз1 в полях типа TEXT, поскольку он создает индекс слов столбца. Однако перед тем, как использовать полнотекстовый поиск, необходимо выполнить ряд подготовительных действий. Подготовка к полнотекстовому поиску Подготовка к полнотекстовому поиску состоит из настройки параметров, активизирующих полнотекстовый поиск, и объявления индексов. Прежде всего необходимо разрешить полнотекстовый поиск для базы данных, как показано в следующем примере: sp_ fullt ext_dat abase [ 'Enable'] [ 'DI SABLE'] sp_ fullt ext_dat abase enable Для выполнения процедуры sp_ fullt ext_dat abase пользователь должен обладать ролью db_owner. Команда активизирует возможность выполнения полнотекстового поиска текста.

converted to PDF by BoJIoc

Все остальные процедуры, относящиеся к полнотекстовому поиску, окажутся бесполезными, если не выполнить эту хранимую процедуру. Чтобы узнать, разрешен ли полнотекстовый поиск для базы данных, воспользуйтесь следующим запросом: SELECT DATABASEPROPERTY ( 'имя_базы', 'I sFullTextEnabled') Активизируя полнотекстовый поиск для базы данных, будьте внимательны: если в файловой системе имеются существующие каталоги индексов полнотекстового поиска, они будут удалены. Кроме того, при активизации полнотекстового поиска для базы данных будут заново созданы все созданные ранее индексы полнотекстового поиска. Внимание При отключении полнотекстового поиска все каталоги индексов удаляются из файловой системы. Информация об отключении заносится в системные таблицы. Наконец, перед выполнением запросов, использующих полнотекстовый поиск в SQL Server, необходимо создать индексы для полнотекстового поиска. Процесс построения индексов для полнотекстового поиска описан в следующем разделе. Создание индекса для полнотекстового поиска Для успешного выполнения полнотекстовых запросов необходимо создать индексы, с помощью которых будет осуществляться поиск. Индексы привязывают значащие слова зарегистрированных столбцов базы данных к записям соответствующих таблиц. Подготовка индекса состоит из нескольких этапов: • • • • •

Построение каталога для полнотекстового индекса. Регистрация таблиц для полнотекстового поиска. Регистрация столбцов для полнотекстового поиска. Активизация таблиц для полнотекстового индекса. Запуск полнотекстового индекса.

Создание полнотекстового индекса начинается с проверки того, было ли полнотекстовое индексирование разрешено для базы данных. Затем для индексов создается полнотекстовый каталог. Построение полнотекстового индекса Полнотекстовый каталог представляет собой файл, в котором хранится настоящий полнотекстовый индекс. В процессе построения полнотекстового каталога в базу данных включается новый файл операционной системы, а необходимые метаданные полнотекстового каталога заносятся в системные таблицы. Команда построения полнотекстового каталога имеет следующий синтаксис: sp_ fullt ext_ cat alog 'имя_полнотекстового_каталога' [ 'creat e'| 'drop' | 'st art_ increm ent al'| 'st art _full' | 'st op'| 'rebuild'] [ , 'корневой_каталог'] При построении полнотекстового каталога хранимой процедуре необходимо передать имя каталога, уникальное для базы данных, а также задать нужное действие. Возможны следующие варианты действий: • CREATE — создать файл в каталоге файловой системы, определяемом последним параметром, и включить информацию о нем в таблицу sysfullt ext cat alogs. • DROP — удалить сведения о полнотекстовом каталоге из sy sfulltext cat alogs и удалить файл из файловой системы. • START_I NCREMENTAL — начать заполнение полнотекстового индекса для изменившихся записей. Индексируемая таблица должна содержать столбец типа TI MESTAMP. • START_FULL — начать заполнение полнотекстового каталога для всех записей таблицы, зарегистрированной в указанном каталоге. • STOP — остановить заполнение полнотекстового индекса. • REBUI LD — заново построить полнотекстовый индекс. Файл каталога удаляется из операционной системы и строится заново.

converted to PDF by BoJIoc

В следующем примере создается каталог с именем PubsCatalog: sp_ fullt ext_ cat alog 'PubsCatalog', 'create' После создания файла полнотекстового каталога необходимо зарегистрировать таблицы базы данных для полнотекстового поиска. Регистрация таблиц для полнотекстового поиска В результате регистрации в базе данных таблица помечается как подходящая для полнотекстового поиска. В ней начинают создаваться структуры метаданных для хранения индекса, которые будут дополняться позднее. Процесс регистрации начинается хранимой процедурой sp_fullt ext _t able со следующим синтаксисом: sp_ fullt ext_ table [ 'имя_таблицы'] [ 'creat e'| 'drop' | 'act ivat e' | 'deact ivate'] [ 'имя_каталога', 'имя_индекса'] Как видно из описания синтаксиса, параметры процедуры sp_ fullt ex t_ t able позволяют зарегистрировать новые таблицы для полнотекстового поиска или отменить эту возможность для существующих таблиц: • CREATE — генерирует метаданные для полнотекстового индекса таблицы. Чтобы для таблицы можно было создать полнотекстовый индекс, в ней должен существовать хотя бы уникальный индекс. Имя индекса является обязательным при использовании параметра CREATE. • DROP — удаляет метаданные для полнотекстового индекса в таблице. Перед удалением метаданных активные таблицы необходимо деактивизировать. • ACTI VATE — разрешает сбор данных полнотекстового индекса. Чтобы таблица могла активизироваться, она должна иметь по крайней мере один столбец, участвующий в индексе. • DEACTI VATE — прекращает использование полнотекстового индекса в таблице. В дальнейшем индекс не заполняется, однако полнотекстовые метаданные продолжают существовать. Индекс может быть активизирован заново с параметром ACTI VATE. В следующем примере метаданные для полнотекстового поиска в таблице t it les создаются в каталоге PubsCatalog на основании индекса PK_t it les: sp_ fullt ext_ table 't it les', 'create', 'PubsCatalog', 'PK_t it les' После регистрации таблиц выполняется следующий шаг в процессе создания полнотекстового индекса — регистрация столбцов, участвующих в полнотекстовом индексе. Регистрация столбцов для полнотекстового поиска Столбцы регистрируются с помощью хранимой процедуры sp_ fullt ex t_ colum ns. Процедура имеет следующий синтаксис: sp_ fullt ext_ colum n 'имя_ таблицы', 'имя_столбца', { 'ADD'| 'DROP'} Параметр ADD регистрирует столбец, участвующий в полнотекстовом индексе, а параметр DROP удаляет столбцы из индекса. Первая команда в следующем фрагменте регистрирует столбец t it le таблицы t it les для полнотекстового поиска. Вторая команда исключает столбец t it le из полнотекстового индекса: sp_ fullt ext_ colum n 't it les', 't it le', 'ADD' sp_ fullt ext_ colum n 't it les', 't it le', 'DROP' После регистрации всех необходимых столбцов необходимо активизировать полнотекстовый индекс. Активизация таблицы для полнотекстового индекса Активизация таблицы означает, что все столбцы, участвующие в полнотекстовом индексе, были зарегистрированы, а таблица готова к заполнению индекса. Полнотекстовый индекс активизируется хранимой процедурой sp_ fullt ex t_t able:

converted to PDF by BoJIoc

sp_ fullt ext_ table 'имя_таблицы', 'act ivat e' После активизации индекса для каталога наступает последний этап — запуск индекса. Запуск индекса Чтобы приступить к фактическому заполнению индекса, каталог должен получить команду запуска. Такой командой является хранимая процедура sp_fullt ext _cat alog. Запуск выполняется следующим образом: sp_ fullt ext_ cat alog 'PubsCatalog', 'st art _full' Каталог PubsCat alog начинает заполняться данными всех зарегистрированных столбцов всех зарегистрированных таблиц индексного каталога. Выполнение полнотекстовых запросов После завершения всех подготовительных действий вы можете выполнять запросы, в которых используется индекс. Однако до того, как сервер закончит заполнение индекса, делать этого не следует. Статус заполнения индекса проверяется следующим запросом: SELECT fullt ext catalogpropert y('имя_каталога','Populat eSt at us') Запрос возвращает двоичную величину. Значение 0 означает, что заполнение индекса завершено. Значение 1 означает, что сервер все еще продолжает заполнение индекса. Чтобы узнать, включен ли конкретный столбец в полнотекстовый индекс, воспользуйтесь следующим запросом: SELECT Colum nPropert y (Obj ect_ I d('имя_таблицы'), 'имя_столбца', 'I sFullText I ndexed') В приведенном примере возвращаемое значение 1 означает, что столбец является частью полнотекстового индекса, а значение 0 — что столбец не входит в полнотекстовый индекс. Кроме того, существует несколько хранимых процедур для проверки полнотекстового индексирования столбцов и таблиц: • sp_ help_ fullt ext_ cat alogs — выводит идентификатор, имя, каталог на диске, статус и количество таблиц для заданного полнотекстового каталога. • sp_ help_ fullt ext_ t ables — возвращает список таблиц, зарегистрированных для полнотекстового индексирования. • sp_ help_ fullt ext_ colum ns — возвращает список таблиц и столбцов, зарегистрированных для полнотекстового индексирования. Создание и заполнение каталогов завершено. Поиск данных в полнотекстовых индексах осуществляется с помощью полнотекстовых запросов. Полнотекстовые запросы Полнотекстовые запросы находят записи баз данных с помощью индексов, созданных для полнотекстовых запросов. Для выполнения полнотекстовых запросов используется команда SELECT. SQL Server поддерживает два предиката для реализации полнотекстовых запросов, CONTAI NS и FREETEXT. CONTAI NS Ключевое слово CONTAI NS организует полнотекстовый поиск слова или фразы в зарегистрированном столбце. Помните — при использовании предиката CONTAI NS фразы должны заключаться в кавычки. Если полнотекстовый поиск выполняется для отдельного слова, это слово не обязательно заключать в кавычки. Более того, условие поиска может состоять из начальных символов слова, за которыми следует звездочка (универсальный символ). Синтаксис предиката CONTAI NS выглядит следующим образом: CONTAI NS ({ имя_столбца| * } , 'критерий_поиска') Приведем пример полнотекстового поиска с использованием предиката CONTAI NS:

converted to PDF by BoJIoc

SELECT t it le, not es FROM t it les WHERE CONTAI NS (not es, 'Com put er') Запрос выбирает из таблицы t it les столбцы t it le и not es для тех записей, у которых столбец not es содержит слово « Com put er». Приведем пример поиска фразы: SELECT t it le, not es FROM t it les WHERE CONTAI NS (not es, '"fav orit e recipes" ') В этом примере выбираются записи, в которых столбец not es содержит фразу «fav orite recipes». В последнем примере предикат CONTAI NS используется для поиска начальных символов слова с произвольным продолжением: SELECT t it le, not es FROM t it les WHERE CONTAI NS( not es, '"CO* "') Примечание Перед вами одна из немногочисленных ситуаций, где * ( звездочка) используется в качестве универсального символа. Запрос возвращает записи таблицы t it les, в которых столбец not es содержит слова, начинающиеся с символов "CO" . Поиск слов, расположенных рядом Чтобы система поиска была более гибкой, SQL Server также позволяет искать слова, находящиеся поблизости друг от друга. Для выполнения такого поиска в критерий включается функция NEAR() . Функция вызывается без параметров, однако по обе стороны от нее располагаются искомые слова или фразы: SELECT t it le, not es FROM t it les WHERE CONTAI NS (not es, 'cooking near( ) com put ers') Запрос возвращает записи, в которых слова «cooking» и «com put ers» находятся в столбце not es вблизи друг от друга. Поиск единственного и множественного числа В SQL Serv er существует функция FORMSOF( ), предназначенная для поиска слов в различных грамматических формах. Функция FORMSOF( ) ищет как единственное, так и множественное число слов (существительных и глаголов). Одна функция FORMSOF() может работать либо с существительными, либо с глаголами, но не с обеими категориями одновременно. Функция FORMSOF( ) имеет следующий синтаксис: FORMSOF(I NFLECTI ONAL, 'фраза') Приведем пример использования FORMSOF() : SELECT t it le, not es FROM t it les WHERE CONTAI NS (not es, FORMSOF(I NFLECTI ONAL, 'com puter')) Запрос возвращает записи, в которых столбец not es содержит слово «com put er» или любую из его грамматических форм. Весовые коэффициенты в критериях поиска

converted to PDF by BoJIoc

Функция I SABOUT( ) в сочетании с функцией WEI GHT( ) позволяет задать весовые коэффициенты, определяющие относительную значимость критериев поиска. Функция I SABOUT( ) определяет список весовых коэффициентов. В качестве параметра функции WEI GHT() передается весовой коэффициент — десятичное число в интервале от 0.0 до 1.0. Синтаксис выглядит следующим образом: I SABOUT('фраза' w eight (весовой_коэффициент,. ..) ) Приведем пример использования весовых коэффициентов в критерии: SELECT t it le FROM t it les WHERE CONTAI NS (t it le, 'I SABOUT ( cooking weight (.8) , com put er weight (.4) ) ' ) Запрос возвращает записи таблицы t it les, содержащие слово «cooking» или «com put er», в столбец t it le. Однако в данном примере слову «cooking» назначен более высокий весовой коэффициент, поэтому сервер присваивает записям, содержащим слово «cooking», более высокий ранг. Логические операторы Предикаты поиска ( такие как CONTAI NS, FORMSOF() или I SABOUT( ) ), используемые при полнотекстовом поиске, объединяются с помощью логических операторов AND, OR и AND NOT. Кроме того, предикаты полнотекстового поиска могут использоваться в сочетании с другими традиционными предикатами команды SELECT. Ниже приведен пример использования логических операторов при полнотекстовом поиске. Запрос возвращает записи, в которых в столбце t it le присутствует слово «cooking» , но при этом отсутствуют слова «com puters» или «com put er»: SELECT t it le_ id, t it le, yt d_sales FROM t it les WHERE CONTAI NS (t it le, 'cooking AND NOT ( com put ers OR com puter) ') SELECT t it le_ id, t it le, yt d_sales FROM t it les WHERE CONTAI NS (t it le, 'cooking AND NOT FORMSOF(I NFLECTI ONAL, 'com put er')') FREETEXT В качестве альтернативы CONTAI NS при проведении полнотекстового поиска используется предикат FREETEXT. Он позволяет обращаться к базе данных с запросами, основанным на значащих словах из произвольной текстовой строки. Механизм полнотекстовых запросов SQL Server анализирует текст, выделяет все значащие слова и обороты, после чего генерирует запрос на основании полученных результатов. Предикат FREETEXT имеет следующий синтаксис: FREETEXT ( 'имя_столбца', 'искомый_текст') Приведем пример использования предиката FREETEXT: SELECT t it le FROM t it les WHERE FREETEXT (not es, 'The quick brown fox j um ped over t he lazy dog ' ) Запрос возвращает записи таблицы t it les со словами, похожими на слова приведенной фразы. Примеры экзаменационных вопросов Que stion 1 Which of t he following st at em ent s are t rue about full-t ex t queries? [ Check all correct answers] • A. Full- t ext queries can be perform ed wit h a FREETEXT clause. • B. Full- t ext queries require a full- t ext index. • C. Full- t ext queries can only be applied t o regist ered colum ns.

converted to PDF by BoJIoc

• D. Full- t ext queries will only ret urn exact m at ches. • E. Full- t ext queries can be run by any user. Вопрос 1 Какие из следующих утверждений истинны по отношению к полнотекстовым запросам? [ Выберите все правильные ответы] • • • • •

A. Полнотекстовые запросы могут выполняться с предикатом FREETEXT. B. Для полнотекстовых запросов необходим полнотекстовый индекс. C. Полнотекстовые запросы могут применяться только к зарегистрированным столбцам. D. Полнотекстовые запросы возвращают только точные совпадения. E. Полнотекстовые запросы могут выполняться любым пользователем.

Правильные ответы — A, B, C и E. Ответ A правилен, поскольку оператор FREETEXT применяется в полнотекстовых запросах. Ответ B тоже правилен; полнотекстовый запрос работает лишь при наличии полнотекстового индекса. Полнотекстовые запросы могут искать данные лишь в зарегистрированных столбцах, поэтому ответ C тоже правилен. Наконец, ответ E правилен, поскольку использование полнотекстовых запросов не ограничивается. Ответ D неверен. В полнотекстовых запросах существуют средства для выполнения неформального поиска — например, универсальный символ * и функция FORMSOF() . Que stion 2 Which of t he following st at em ent s are t rue about full-t ex t indexes t ypes? [ Check all correct answers] • • • • •

A. Full- t ext B. Full- t ext C. Full- t ext D. Full- t ext E. Full- t ext

indexes require at least a unique index on t he respect ive t ables. index es can be im plem ented by any user. indexes are st ored in t he dat abase. index es are populat ed by sp_fullt ext _dat abase. index es require a t im est am p colum n.

Вопрос 2 Какие из следующих утверждений истинны по отношению к полнотекстовым индексам? [ Выберите все правильные ответы] • A. Полнотекстовые индексы требуют существования хотя бы уникального индекса для соответствующих таблиц. • B. Полнотекстовые индексы могут быть реализованы любым пользователем. • C. Полнотекстовые индексы хранятся в базе данных. • D. Полнотекстовые индексы заполняются процедурой sp_ fullt ex t_ dat abase. • E. Для полнотекстовых индексов необходим столбец типа t im est am p. Правильный ответ — A, поскольку регистрация таблицы для полнотекстового поиска возможна лишь при наличии для нее уникального индекса. Ответ B неверен, поскольку для реализации полнотекстовых индексов пользователь должен обладать по крайней мере ролью db_ow ner. Ответ C неверен, поскольку полнотекстовый индекс хранится в файловой системе. Ответ D неверен, поскольку заполнение индекса осуществляется процедурой sp_ fullt ext _cat alog. Ответ E неверен, поскольку наличие столбца типа TI MESTAMP необходимо лишь при заполнении индекса с приращениями. Que stion 3 Consider t he following st at em ent : Sp_ fullt ext _colum n 'aut hors','last _nam e','ADD' What t asks m ust be com pleted first before this com m and can be run? [ Check all correct answers] • • • • •

A. The full- t ext index m ust be st art ed for populat ion. B. The aut hor’s t able m ust be registered for use with a full-t ex t index. C. The full- t ext index opt ion m ust be enabled for t he dat abase. D. A full- t ext cat alog m ust be creat ed for t he index. E. The colum ns for t he aut hor’s t able m ust be regist ered for t he full- t ext indexes.

Вопрос 3 Имеется следующая команда: Sp_ fullt ext _colum n 'aut hors','last _nam e','ADD' Какие задачи должны быть выполнены перед запуском этой команды? [ Выберите все правильные ответы] • A. Должно быть начато заполнение полнотекстового индекса. • B. Таблица aut hors должна быть зарегистрирована для использования с полнотекстовым индексом.

converted to PDF by BoJIoc

• C. Для базы данных должно быть разрешено использование полнотекстового индекса. • D. Для индекса должен быть создан полнотекстовый каталог. • E. Столбцы таблицы aut hors должны быть зарегистрированы для использования в полнотекстовых индексах. Правильные ответы — B, C и D. Приведенная команда регистрирует столбец last _nam e таблицы aut hors для использования в полнотекстовом индексе. Ответ B правилен, поскольку таблицы регистрируются в полнотекстовом индексе раньше столбцов. Ответ C правилен, поскольку выполнение любой команды, относящейся к полнотекстовому индексированию, возможно лишь после разрешения самой возможности полнотекстового поиска. Ответ D тоже правилен — столбец может быть зарегистрирован для полнотекстового индексирования лишь при условии существования каталога, в котором хранится индекс. Ответ A неверен. Прежде чем начинать заполнение индекса, необходимо сначала зарегистрировать все необходимые таблицы и столбцы. Ответ E неверен, поскольку он не отвечает на вопрос, а лишь поясняет эффект приведенной команды. Que stion 4 Exam ine t he following query: Sp_ fullt ext _cat alog 'aut hor_cat alog','st art_ full' Which of t he following st at em ent s are t rue about full-t ex t index t ypes? [ Check all correct answers] • • • • •

A. The full- t ext B. The full- t ext C. The full- t ext D. The full- t ext E. The full- t ext

index index index index index

w ill begin t o populate for all rows t hat have changed. w ill begin t o populate based on all t he data in t he registered colum ns. w ill be act ivated and ready for populat ion. cat alog aut hor_cat alog w ill be created. aut hor_cat alog t able will be regist ered for t he st art _full index.

Вопрос 4 Рассмотрим следующий запрос: Sp_ fullt ext _cat alog 'aut hor_cat alog','st art_ full' Какие из следующих утверждений истинны по отношению к полнотекстовым индексам? [ Выберите все правильные ответы] • A. Начинается заполнение полнотекстового индекса для всех изменившихся записей. • B. Начинается заполнение полнотекстового индекса на основании всех данных в зарегистрированных столбцах. • C. Полнотекстовый индекс активизируется и становится готовым к заполнению. • D. Создается каталог полнотекстового индекса aut hor_cat alog. • E. Таблица полнотекстового индекса aut hor_cat alog регистрируется для индекса st art_ full. Правильный ответ — B, поскольку параметр st art _full начинает заполнение индекса на основании всех данных в зарегистрированных столбцах. Ответ A неверен, поскольку заполнение индекса на основании изменений выполняется с параметром start _increm ent al. Ответ C неверен, поскольку индекс должен быть активизирован и готов к заполнению до выполнения приведенного фрагмента. Ответ D неверен, поскольку каталог aut hor_cat alog должен быть создан до начала заполнения. Ответ E неверен, поскольку приведенный фрагмент не имеет никакого отношения к регистрации. ГЛАВА 1 6

Диагностика и сбор данных Ключевые термины • • • • •

Команда SHOWPLAN Оптимизатор Статистика Взаимная блокировка dbcc showcont ig

Необходимые знания и приемы • Использование SHOWPLAN • Обновление статистики • Диагностика и решение проблем с блокировкой

converted to PDF by BoJIoc

• Использование SQL Server Profiler Итак, вы написали приложение базы данных и реализовали его на сервере. Теперь необходимо позаботиться о том, чтобы приложение работало с максимальной эффективностью. Однако при этом также необходимо осуществлять мониторинг и оптимизацию работы SQL Server. Microsoft предоставляет в ваше распоряжение ряд инструментов. Они помогают следить за приложениями и запросами, выполняемыми сервером, а также за решениями, принимаемыми SQL Server при их запуске. Другие инструменты предназначены для наблюдения за работой сервера и проверки эффективности его работы. Один из вариантов оптимизации SQL Server заключается в том, чтобы запросы работали в соответствии с исходными планами. Скажем, индексы создаются для ускорения работы приложений. Предполагается, что индекс позволит SQL Server более эффективно находить данные. Команда SQL Server SET SHOWPLAN позволяет узнать, какие решения принимает SQL Server. В частности, вы узнаете, используется индекс или нет и почему это происходит. Полученные результаты помогут улучшить структуру запросов и обеспечить их максимальную эффективность. Кроме того, вы сможете определить, когда следует создавать новые индексы. SH OW PLAN Флаги SHOWPLAN используются до выполнения незапланированных ( ad hoc) запросов. С их помощью можно предварительно оценить затраты ввода/ вывода, связанные с выполнением запроса. На основании полученной оценки можно отменить выполнение неудачно сконструированных запросов (например, создающих декартово произведение или возвращающих чрезмерное количество записей) до исправления проблемы. В SQL Serv er существуют две версии команды SHOWPLAN: • SET SHOWPLAN_TEXT; • SET SHOWPLAN_ALL. SQL Query Analyzer позволяет работать с графической версией SHOWPLAN. Внимание Новые параметры SHOWPLAN_TEXT и SHOWPLAN_ALL выводят информацию о решениях, принимаемых SQL Server при обработке запроса. Microsoft включила в SQL Server немало новых планов обработки запросов — пользователям следует познакомиться с ними. SH OW PLAN _ TEXT Флаг SHOWPLAN_TEXT отображает данные в виде текстовых сообщений в большинстве редакторов запросов (например, isql или SQL Query Analyzer) и предоставляет информацию о том, как SQL Server собирается выполнять запрос. Данные выдаются лишь при установке параметра SHOWPLAN_TEXT в isql, SQL Query Analy zer или другом редакторе сценариев. Команда SHOWPLAN_TEXT имеет следующий синтаксис: SET SHOWPLAN_TEXT [ ON| OFF] В листинге 16.1 показан запрос, запущенный при включенном параметре SHOWPLAN_TEXT. Листинг 1 6 .1 . Запрос с установленным флагом SH OW PLAN _ TEXT и его результаты St m t Text -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- select * from t it les where t it le_ id = 'BU1111' (1 row( s) affect ed) St m t Text -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- | - -Clust ered I ndex Seek(pubs..t it les.UPKCL_t it leidind, SEEK: ( t it les.t it le_ id= @1) ORDERED)

converted to PDF by BoJIoc

Как видно из листинга 16.1, выполняется запрос SELECT * FROM t it les WHERE t it le_ id= 'BU111'. Для обработки запроса оптимизатор решил использовать поиск в кластерном индексе. Имя индекса определяется строкой UPKCL_ t it leidind — именем кластерного индекса в таблице t it les. SH OW PLAN _ ALL Флаг SHOWPLAN_ALL, как и SHOWPLAN_TEXT, предоставляет пользователям подробные сведения о том, что SQL Serv er знает о запросе и как собирается его выполнять. Однако SHOWPLAN_ALL следует использовать во время выполнения программы, а SHOWPLAN_TEXT — при интерпретации незапланированных запросов. При установленном флаге SHOWPLAN_ALL вы получаете таблицу, содержащую информацию о плане запроса. Табличные данные удобнее форматировать и анализировать, чем текстовый вывод SHOWPLAN_TEXT. Пока флаг SHOWPLAN_ALL остается установленным, запросы только анализируются, но не выполняются. Чтобы выполнить запрос, необходимо сбросить флаг SHOWPLAN_ALL. Выходная таблица SHOWPLAN_ALL содержит следующие столбцы: • St m t Text — исходный запрос SQL, проанализированный SHOWPLAN. Кроме того, этот столбец также содержит параметр PLAN_ROWS с описанием того, каким образом запрос будет выполняться SQL Server. По нему можно узнать, собирается ли SQL Server применять сканирование таблицы или поиск в индексе. • St m t I d — номер команды в текущем пакете. Если пакет состоит из нескольких команд, номер может быть больше 1 . • NodeI d — узловой идентификатор текущего запроса. • Parent — узловой идентификатор родительской операции, если операция инициируется другой операцией. • PhysicalOp — физическая реализация запроса. Используется только в сочетании с PLAN_ROWS. • LogicalOp — логическая реализация запроса. Используется только в сочетании с PLAN_ROWS. • Argum ent — выводится дополнительная информация о запросе, основанная на аргументах поиска. • DefinedValues — список значений, используемых запросом. В частности, содержит столбцы, указанные в секциях SELECT и WHERE. Используется только в сочетании с PLAN_ROWS. • Est im at eRows — количество выходных записей по оценке SQL Server для PLAN_ROW. • Est im at eI O — примерный объем операций ввода/ вывода для запроса на основании PLAN_ROW. • Est im at eCPU — примерные затраты процессорного времени для PLAN_ROW. • AvgRowSize — примерный размер возвращаемой записи. • Tot alSubt reeCost — примерные затраты на выполнение запроса. Данная величина является накапливаемой. • Out put List — список столбцов, выводимых запросом. • Warnings — предупреждающие сообщения для запроса. • Type — узловой тип запроса. Значение может описывать тип запроса ( SELECT, I NSERT, DELETE или EXECUTE) или быть равным PLAN_ROW. Команда SHOWPLAN_ALL имеет следующий синтаксис: SET SHOWPLAN_ ALL [ ON| OFF] Обновление статистики Для определения лучшего способа выполнения запроса, оптимального по затратам ввода/ вывода, в SQL Server используется оптимизатор. Чтобы флаги SHOWPLAN и оптимизатор могли оценивать запросы, SQL Server необходимо передать некоторую информацию с описанием данных и их распределения. Эта информация сохраняется в статистических страницах при создании индекса. В часто изменяющейся таблице статистика может устареть. На основании устаревшей информации оптимизатор принимает неверные решения, относящиеся к оптимизации запросов, поскольку статистика дает неверные оценки. Чтобы оптимизатор выбирал оптимальные способы выполнения запросов, статистические данные таблиц должны регулярно обновляться. В прежних версиях SQL Server эта задача поручалась системному администратору, в SQL Server 7 процесс обновления статистики автоматизирован. По умолчанию статистика автоматически обновляется на основании периодической случайной выборки данных из таблицы. Период обновления зависит от размера таблицы и скорости ее увеличения. Если случайная выборка не обеспечивает оптимального планирования запросов, статистику можно обновить вручную — для этого следует выполнить команду UPDATE STATI STI CS. В листинге 16.2 показан синтаксис команды SQL, используемой при обновлении статистики.

converted to PDF by BoJIoc

Листинг 1 6 .2 . Синтаксис команды UPDATE STATI STI CS UPDATE STATI STI CS { имя_таблицы } [ имя_индекса | (индекс_или_список_столбцов [ , . . . n] ) ] [ WI TH [ [ FULLSCAN] | SAMPLE номер { PERCENT | ROWS} ] ] [ [ ,] [ ALL | COLUMNS | I NDEX] [ [ ,] NORECOMPUTE] ] Команда UPDATE STATI STI CS обладает множеством параметров, управляющих процессом обновления статистики. Статистика может собираться для таблицы и всех ее индексов или, если это занимает слишком много времени, для конкретного индекса. Ниже приведена более подробная информация о параметрах команды UPDATE STATI STI CS, приведенных в листинге 16.2: • FULLSCAN — заставляет SQL Server выполнить полное сканирование индекса или таблицы в процессе сбора статистики. Но полное сканирование таблицы или индекса может занять много времени. Альтернативный вариант — определение размера выборки. • SAMPLE — вместо накопления статистики для всей таблицы можно приказать SQL Server построить новые страницы статистики на основании выборки табличных данных. Размер выборки задается в виде количества записей или процента от их общего числа. • ALL| COLUMNS| I NDEX — по умолчанию команда UPDATE STATI STI CS обновляет только статистику индексов. Команда UPDATE STATI STI CS позволяет обновлять статистику столбцов (COLUMNS) , индексов (I NDEX) или одновременно столбцов и индексов (ALL) . • NORECOMPUTE — параметр запрещает автоматическое обновление статистики с помощью сохраненной процедуры sp_ aut ost at s. Sp_ upda te sta ts В прежних версиях SQL Server команда UPDATE STATI STI CS выполнялась отдельно для каждой таблицы. Хранимая процедура sp_updat est at s выполняет команду UPDATE STATI STI CS для всех таблиц текущей базы данных. Выполнение процедуры разрешается только пользователям с ролью SA или владельцам базы данных. Sp_ a ut osta t s В прошлом обновление статистики регулярно выполнялось системным администратором. В SQL Serv er 7 статистика может обновляться автоматически; данная возможность включается хранимой процедурой sp_aut ost at s. Процедура sp_aut ostats разрешает или запрещает автоматическое обновление статистики для всей таблицы или для конкретного индекса. Настройка автоматического обновления статистики с применением sp_aut ost ats выполняется следующим образом: sp_aut ost at s 'имя_таблицы'[ ,'ON'| 'OFF'] [ 'имя_индекса'] Совет В прошлом на обновление статистики расходовалось чрезвычайно много ресурсов. Из- за этого обновление обычно выполнялось в то время, когда на сервере работало относительно мало процессов. Правило действует и в наши дни. Единственный способ снизить эту нагрузку — строить статистику не для всей таблицы, а для выборки данных. Хотя при этом обновление статистики требует меньше ресурсов и может выполняться даже в периоды максимальной загрузки, статистика перестает адекватно отражать распределение данных в таблице. Это может повлиять на точность оценки планов запросов в оптимизаторе. Альтернативным решением является запланированное выполнение команды UPDATE STATI STI CS с параметром FULLSCAN в периоды минимальной загрузки. Диагностика и решение проблем блокировки По умолчанию читаемые или модифицируемые данные блокируются сервером на уровне 8 -килобайтных страниц. Подобная форма блокировки может стать причиной проблем конкуренции (попытки нескольких пользователей заблокировать одну и ту же страницу данных) и потенциальных ситуаций взаимной блокировки, приводящих к отмене транзакций некоторых пользователей.

converted to PDF by BoJIoc

В SQL Serv er используются различные типы блокировок. При выборке данных устанавливаются разделяемые блокировки, а при удалении —монопольные блокировки. Чтобы определить, какие типы блокировок используются в настоящее время, следует выполнить хранимые процедуры sp_lock и sp_who. Эти хранимые процедуры помогут узнать, какие ресурсы заблокированы в настоящее время, кем и почему. Выходные данные хранимой процедуры sp_lock состоят из следующих столбцов: • • • • • • •

Spid — идентификатор системного процесса; Dbid — идентификатор базы данных; Obj I D — идентификатор объекта; I ndI D — идентификатор индекса; Type — тип блокировки; Resource — информация о заблокированных ресурсах, хранящаяся в текстовой таблице syslock ifo.res; Mode — режим блокировки. Допускаются следующие значения:

· S — разделяемая блокировка; · U — блокировка модификации; · E — монопольная блокировка; · I S — условная разделяемая; · I X — условная монопольная; · SI X — разделяемая блокировка с условно-монопольной; · St at us — статус запроса блокировки (например, GRANT, WAI T или CONVERT). В листинге 16.3 приведен пример выходных данных процедуры sp_ lock . Листинг 1 6 .3 . Пример вывода sp _ lock spid dbid Obj I d

I ndI d Type Resource

Mode St at us

-- -- - -- - -- -- -- --

-- -- -- -- --

- -- -- - - -- -- -

1

1

0

0

DB

S

GRANT

6

1

0

0

DB

S

GRANT

7

1

0

0

DB

S

GRANT

8

1

0

0

DB

S

GRANT

9

1

0

0

DB

S

GRANT

9

2

0

0

DB

S

GRANT

9

5

0

0

DB

S

GRANT

9

5

261575970 1

PAG 1: 103

IS

GRANT

9

1

117575457 0

TAB

IS

GRANT

9

5

261575970 0

TAB

IS

GRANT

9

5

261575970 1

KEY (42b753b5aa62 ) I S-S GRANT

9

5

261575970 1

KEY (42b753b7aa62 ) I S-S GRANT

10

5

0

DB

S

10

5

261575970 1

PAG 1: 103

IS

GRANT

10

5

261575970 0

TAB

IS

GRANT

10

5

261575970 1

KEY (42b753b5aa62 ) I S-S GRANT

10

5

261575970 1

KEY (45bc55b3aa64) I S-S GRANT

0

-- -- - -- -- -- --

GRANT

По выходным данным sp_lock в сочетании с хранимой процедурой sp_who можно узнать, кто предоставил блокировку и не мешает ли она другим процессам или пользователям. Хранимая процедура sp_w ho выводит следующие данные (см. листинг 16 .4 ): • spid — идентификатор системного процесса;

converted to PDF by BoJIoc

• • • • • •

st at us — статус процесса; loginam e — имя пользователя, запустившего данный процесс; host nam e — имя хоста или системы, вызывающей процесс; blk — идентификатор процесса, мешающего завершению данного процесса; dbnam e — имя базы данных, используемой процессом; cm d — тип команды SQL Server, выполняющей процесс.

Листинг 1 6 .4 . Пример вывода sp _ w ho spid st atus

loginam e

host nam e blk dbnam e cm d



————————

———

—————

— ———

———————-

1

sleeping

sa

0

m ast er SI GNAL HANDLER

2

sleeping

sa

0

pubs

LOCK MONI TOR

3

sleeping

sa

0

pubs

LAZY WRI TER

4

sleeping

sa

0

pubs

LOG WRI TER

5

sleeping

sa

0

pubs

CHECKPOI NT SLEEP AWAI TI NG COMMAND

6

background sa

0

pubs

7

sleeping

NT AUTHORI TY\ SYSTEM TENCHI

0

m ast er AWAI TI NG COMMAND

8

sleeping

NT AUTHORI TY\ SYSTEM TENCHI

0

m ast er AWAI TI NG COMMAND

9

sleeping

user1

KEYONE

10 pubs

UPDATE

10

runnable

user2

KEYONE

0

SELECT

pubs

Из листингов 16.3 и 16.4 видно, что выполнению процесса 9 мешает процесс 10. Пользователь user1, запустивший процесс 9, должен ждать освобождения ресурсов, занятых процессом 10. Взаимные блокировки Взаимной блокировкой ( deadlock) называется ситуация, в которой два процесса не позволяют друг другу продолжить работу. Каждый процесс занимает ресурс, необходимый другому процессу, и не может освободить его ( рис. 16.1) . SQL Serv er обнаруживает взаимные блокировки посредством поиска циклических цепочек запросов на блокировку. При обнаружении взаимной блокировки один из двух процессов объявляется «жертвой» (vict im ) и аварийно завершается. Другой процесс продолжает работу. Жертва генерирует ошибку 1205 и получает от сервера сообщение о взаимной блокировке и необходимости перезапустить транзакцию. Если это происходит в хранимой процедуре, возвращаемое значение равно –3. В приложениях, написанных для SQL Server, следует предусмотреть обработку этих кодов ошибок.

converted to PDF by BoJIoc

Рис. 16.1. Взаимная блокировка По умолчанию SQL Server выбирает жертвой транзакцию с минимальными затратами. Тем не менее, команда SET DEADLOCK_PRI ORI TY LOW позволяет назначить сеансу низкий приоритет взаимных блокировок и определить его потенциальной жертвой. Команда SET DEADLOCK_PRI ORI TY NORMAL возвращает процесс к нормальной схеме обработки взаимных блокировок. Команда установки флага DEADLOCK_PRI ORI TY имеет следующий синтаксис: SET DEADLOCK_PRI ORI TY { [ LOW] [ NORMAL] } dbcc show con tig Команда DBCC SHOWCONTI G анализирует фрагментацию области, занимаемой данными и индексами. Фрагментация возникает в том случае, когда SQL Server вынужден нарушить непрерывную последовательность хранения страниц данных (например, при включении данных в существующие заполненные страницы) . Кроме того, фрагментация возникает и в страницах индексов. По выходным данным dbcc showcont ig можно обнаружить фрагментацию и исправить ее. Исправление осуществляется посредством удаления и повторного создания кластерного индекса для таблицы. Команда DBCC SHOWCONTI G имеет следующий синтаксис: DBCC SHOWCONTI G [ ( идентификатор_таблицы [ , индентификатор_индекса] ) ] В листинге 16.5 продемонстрирован пример выполнения DBCC SHOWCONTI G для таблицы с именем raw dat a и приведены выходные данные команды. Листинг 1 6 .5 . Пример выполнения DBCC SH OW CON TI N G dbcc showcont ig (197575742) DBCC SHOWCONTI G scaning 'lookup' t able... Table: 'look up' (309576141); index I D: 1 , dat abase I D: 8 TABLE level scan perform ed. - Pages Scanned.... .. . .. ... ... .. . .. ... ... .. . .. .: 38 - Ext ents Scanned..... .... ... .... .... ... ... ....: 5 - Ext ent Sw it ches... .... .... ... .... .... ... .... .: 4 - Avg. Pages per Ext ent ..... ... ... .. ... ... ... .. : 7.6

converted to PDF by BoJIoc

-

Scan Densit y [ Best Count : Act ual Count ] .... ...: 100.00% [ 5: 5] Logical Scan Fragm ent at ion .... ... ... .. . .. ...: 0.00 % Ext ent Scan Fragm ent at ion ... .... ... .... .... .: 20 .00% Avg. By tes Free per Page... ... .. ... ... ... .. ..: 199 .3 Avg. Page Densit y ( full) .. ... ..... ... ... .....: 9 7.54%

Выходные данные DBCC SHOWCONTI G интерпретируются следующим образом: • Pages Scanned — количество страниц в таблице или индексе; • Ext ent s Scanned — количество экстентов в таблице или индексе; • Ext ent Swit ches — количество переходов между экстентами при переборе страниц таблицы или индекса; • Avg. Pages per Ext ent — количество страниц на экстент в цепочке страниц; • Scan Density [ Best Count : Act ual Count ] — оптимальное и фактическое число переходов между блоками страниц; • Logical Scan Fragm ent at ion — процент страниц, нарушающих непрерывный порядок. Вычисляется при сканировании листовых страниц индекса; • Ext ent Scan Fragm ent at ion — процент экстентов, нарушающих непрерывный порядок. Вычисляется при сканировании листовых страниц индекса; • Avg. Byt es Free per Page — среднее количество свободных байт на сканированных страницах; • Avg. Page Densit y (full) — средний процент заполнения страниц. Как видно из листинга 16.5, таблица состоит из 38 страниц и 5 блоков. По количеству переходов таблица получает идеальный рейтинг 100% , поскольку оптимальное количество совпадает с фактическим [ 5: 5] . Таблица не требует дополнительной модификации. SQL Se rve r Profile r В комплект SQL Server 7 входит продукт SQL Server Profiler — диагностическая утилита, позволяющая администратору следить за некоторыми стандартными событиями (например, попытками регистрации, подключениями и отключениями, выполнением пакетов SQL), а также обнаруживать взаимные блокировки. SQL Serv er Profiler создает на сервере трассировочные файлы или таблицы с данными. Если данные хранятся в таблицах SQL Server, Profiler может воспроизвести запросы и облегчить анализ проблем. Profiler является составной частью Ent erprise Manager и вызывается из меню Tools. Кроме того, утилиту можно запустить из группы SQL Serv er 7 меню «Пуск» . Примеры экзаменационных вопросов Quest ion 1 By default , how oft en are stat ist ics updat ed? • • • • •

A. Once a day. B. Once a week. C. Once a year. D. Wit h each SQL st at em ent . E. Never.

Вопрос 1 С какой частотой обновляется статистика по умолчанию? • • • • •

A. Один раз в день. B. Один раз в неделю. C. Один раз в год. D. С каждой командой SQL. E. Никогда.

Правильный ответ — E. По умолчанию страницы статистики создаются при создании индекса. Однако эти страницы не обновляются до тех пор, пока для таблицы или индекса не будет выполнена команда UPDATE STATI STI CS. Это стандартное поведение переопределяется хранимой процедурой sp_aut ost at s. Ответы A, B, C и D неверны, поскольку по умолчанию автоматическое обновление страниц статистики не происходит никогда. Que stion 2 By default , what st at ist ics get updated with an UPDATE STATI STI CS st at em ent ?

converted to PDF by BoJIoc

• • • • •

A. I ndexes. B. Colum ns. C. Rows. D. I ndexes and colum ns. E. I ndexes, colum ns and rows.

Вопрос 2 Статистика каких объектов обновляется командой UPDATE STATI STI CS по умолчанию? • A. Индексы. • B. Столбцы. • C. Записи. • D. Индексы и столбцы. • E. Индексы, столбцы и записи. Правильный ответ — A. По умолчанию команда UPDATE STATI STI CS обновляет только статистику индексов. Ответы B, C, D и E неверны, поскольку команда UPDATE STATI STI CS по умолчанию не обновляет столбцы и записи. Que stion 3 What kind of lock is described by the follow ing sp_lock out put ? spid dbid Obj I d I ndI d Type Resource Mode St at us -- -- - -- - - -- -- -- - -- - -- -- - - -- - - -- -- -- -- -- - -- - -- - -- - -- -- 9 5 26157970 1 PAG 1: 103 I S GRANT • • • • •

A. An exclusive lock on t he ent ire t able. B. An exclusive lock on a page. C. A shared lock on a page. D. An int ent shared lock on a page. E. An int ent shared lock on a t able.

Вопрос 3 Какой тип блокировки описывают следующие выходные данные sp_lock? spid dbid Obj I d I ndI d Type Resource Mode St at us -- -- - -- - - -- -- -- - -- - -- -- - - -- - - -- -- -- -- -- - -- - -- - -- - -- -- 9 5 26157970 1 PAG 1: 103 I S GRANT • • • • •

A. Монопольная блокировка всей таблицы. B. Монопольная блокировка страницы. C. Разделяемая блокировка страницы. D. Условная разделяемая блокировка страницы. E. Условная разделяемая блокировка таблицы.

Правильный ответ — D. Сокращение I S означает условную разделяемую блокировку ( I ntent Shared), а тип PAG — страницу (page). Во всех остальных ответах приведены неверные типы блокировок. Que stion 4 Which of t he following t akes place when a deadlock occurs? [ Check all correct answers] • • • • •

A. Only one process is blocking anot her process. B. Two processes are block ing each ot her. C. One process w ill be declared a v ict im . D. A 1205 error will be ret urned. E. - 1 will be ret urned by the st ored procedure.

Вопрос 4 Что из перечисленного происходит при наступлении взаимной блокировки? [ Выберите все правильные ответы] • • • • •

A. Только один процесс блокирует работу другого процесса. B. Два процесса блокируют друг друга. C. Один процесс объявляется жертвой. D. Возвращается ошибка 1205. E. Хранимая процедура возвращает - 1.

Правильные ответы — B, C и D. Ответ B правилен, поскольку взаимная блокировка возникает в случае, если как минимум два процесса блокируют друг друга. Ответ C правилен, поскольку при обнаружении сервером взаимной блокировки процесс с меньшими затратами процессорного времени объявляется

converted to PDF by BoJIoc

жертвой и аварийно завершается. Ответ D тоже правилен — при обнаружении взаимной блокировки обработчику ошибок возвращается код ошибки 1205 . Ответ A неверен, поскольку при взаимной блокировке оба процесса мешают работе друг друга. Ответ E неверен, поскольку хранимая процедура возвращает код – 3. Que stion 5 Sp_aut ostat s perform s what funct ions? [ Check all correct answ ers] • • • • •

A. Act ivates t he aut om at ic updat ing of t able st at ist ics. B. Deact ivates t he aut om at ic updat ing of t able st at ist ics. C. Act ivat es t he aut om at ic updat ing of index st at istics. D. Deact ivat es t he aut om at ic updat ing of colum n stat ist ics. E. Deact ivates t he aut om at ic updat ing of index st atist ics.

Вопрос 5 Какие функции выполняет sp_aut ostats? [ Выберите все правильные ответы] • • • • •

A. Активизирует автоматическое обновление статистики таблиц. B. Деактивизирует автоматическое обновление статистики таблиц. C. Активизирует автоматическое обновление статистики индексов. D. Деактивизирует автоматическое обновление статистики столбцов. E. Деактивизирует автоматическое обновление статистики индексов.

Правильные ответы — A, B и C; в них описываются стандартные функции хранимой процедуры sp_aut ost at s. Ответ D неверен, поскольку sp_aut ostat s не работает на уровне столбцов. ГЛАВА 1 7

Удаленный доступ к данным Ключевые термины • • • • • • • • • • •

Удаленный вызов процедур (RPC) Распределенная транзакция Распределенный запрос Связанный сервер Полное имя объекта Набор записей Дружественное имя Dist ribut ed Transact ion Service Диспетчер ресурсов Диспетчер транзакций Двухфазовое закрепление

Необходимые знания и приемы • • • • •

Вызов удаленных процедур Понимание отличий между RPC и распределенным запросом Обращение к удаленным данным через связанные серверы Обращение к удаленным данным посредством незапланированных запросов Понимание преобразований данных, выполняемых при распределенных запросах

Обычно все данные, с которыми должно работать приложение базы данных, находятся на одном сервере. Но иногда данные хранятся на нескольких серверах или находятся под управлением системы, отличной от SQL Serv er. Microsoft SQL Serv er поддерживает два способа обращения к данным, находящимся на разных серверах: удаленный вызов процедур ( RPC) и распределенные запросы. В обоих случаях для обращения к удаленным данным используется распределенный запрос. RPC Механизм RPC используется для работы с данными, находящимися на другом сервере SQL Server. Он поддерживается в SQL Server для обеспечения обратной совместимости и не может работать с данными, не хранящимися в SQL Server.

converted to PDF by BoJIoc

Внимание SQL Serv er 7 обслуживает вызовы RPC от SQL Server версии 4 .2 и выше. Однако при этом SQL Server 7 может обратиться с вызовом RPC только к SQL Server версии 6 и выше. Чтобы вызов RPC стал возможным, системный администратор должен настроить оба сервера на взаимодействие друг с другом. После завершения настройки для вызова процедуры RPC используется полное имя хранимой процедуры. Синтаксис удаленного вызова приведен ниже: [ EXEC[ UTE] ] имя_сервера.[ имя_базы] .[ владелец] .[ хранимая_процедура] [ параметры[ , параметр ...] ] Удаленные хранимые процедуры могут использоваться в SQL везде, где допускается использование локальных хранимых процедур. Иначе говоря, удаленная хранимая процедура может: • • • •

являться самостоятельным пакетом; использоваться в пакете совместно с другими запросами; вызываться из хранимой процедуры; входить в команду I NSERT в виде команды EXECUTE.

Приведем пример удаленного вызова хранимой процедуры: EXEC MyOt herServer...sp_who В этом примере показан простейший вариант вызова удаленной хранимой процедуры — системная хранимая процедура sp_who выполняется на сервере MyOt herServer без параметров. Следующий пример не столь тривиален: I NSERT Nam es EXECUTE MyOt herServer.pubs.j oe.Ret rieveAut horsNam es @parm 1 = 'A' В этом примере механизм RPC используется для выборки данных, вставляемых в таблицу Nam es. Процедура Ret rieveAut horNam es (владелец — j oe) базы данных pubs на сервере MyOt herServer выполняется с параметром @parm 1 , равным 'A'. Удаленная хранимая процедура выполняет любые действия, выполняемые локальными процедурами. Следовательно, механизм RPC позволяет выполнить на удаленном сервере любую процедуру, которую вы могли бы выполнить после непосредственной регистрации на сервере. RPC возвращает данные с помощью трех стандартных механизмов, используемых в локальных хранимых процедурах: • Итоговые наборы. Записи и отдельные значения. • Выходные параметры. Общий набор выходных значений для всей процедуры. • Передача кода возврата команде SQL Server. Одно целое число. В листинге 17.1 приведена хранимая процедура, которая использует все три механизма передачи данных. Листинг 1 7 .1 . Удаленная хранимая процедура -- Выполняется на удаленном сервере в t em pdb CREATE PROC SysObj Nam e @Num Obj I NT OUTPUT AS SELECT nam e FROM sy sobj ect s WHERE t ype = 'S' SELECT @Num Obj = @@ROWCOUNT RETURN -30000 Go -- Выполняется на локальном сервере DECLARE @Ret Cnt I NT, @result I NT EXEC @result = My Rem oteServ er.t em pdb..m yp1 @Ret Cnt out put

converted to PDF by BoJIoc

SELECT Ret urnSt at us = @result , Out putParm = @RetCount GO -- Итоговый набор nam e -- -- -- -- -- sysobj ect s sysindexes syscolum ns syst ypes syscom m ent s sysfiles1 sysperm issions sysusers sysdepends sysreferences sysfullt ex tcat alogs sysindexk eys sysforeignkeys sysm em bers sysprot ects sysfiles sysfilegroups sysallocat ions -- Код возврата и выходной параметр Ret urnSt at us Out put Parm -- -- -- -- -- - - -- -- -- - -- -30000 18 Распределенные запросы Механизм распределенных запросов Server позволяет работать с данными любого источника через провайдеры OLE DB. Это означает, что вы можете обращаться к данным любого источника OLE DB. Распределенные запросы работают с данными одного или нескольких удаленных источников так, словно эти данные находятся в локальной таблице. Между распределенными запросами и RPC существует два основных отличия: • Распределенные запросы позволяют обратиться к данным из нескольких источников в одном запросе. • Распределенный запрос выполняет на локальном сервере команду SQL, которая влияет на данные удаленного сервера. Перед использованием распределенных запросов подключение должно установить флаги ANSI _NULLS и ANSI _WARNI NGS, как показано в следующем фрагменте: SET ANSI _NULLS ON SET ANSI _WARNI NGS ON Хотя источники в распределенных запросах обычно представляют собой базы данных, существуют провайдеры OLE DB для различных типов и форматов файлов, включая текстовые файлы и электронные таблицы. Если для вашего конкретного источника данных не существует провайдера OLE DB, вероятно, вы сможете обратиться к нему через провайдера OLE DB для ODBC. Связанный сервер Связанный сервер (linked serv er) представляет собой заранее сконфигурированный источник данных OLE DB. Команды SQL ссылаются на связанный сервер по полному имени объекта. Перед использованием связанного сервера необходимо предварительно настроить локальный SQL Server на работу с удаленным источником данных OLE DB. Полное имя объекта выглядит следующим образом: имя_сервера.имя_базы.владелец_объекта.имя_объекта

converted to PDF by BoJIoc

В следующем примере показана ссылка на связанный сервер в команде SELECT: SELECT * FROM Ot herServer.SalesDB.dbo.Sale Помимо уточнения имени удаленного сервера необходимо указать имя связанного сервера при вызове функции OPENQUERY (см. далее). Функция OPENQUERY возвращает набор записей (rowset ), который может использоваться в командах SQL вместо таблицы или представления. Внимание Наборы записей являются основными объектами, используемыми провайдерами OLE DB для возвращения итоговых наборов в табличной форме. Основные преимущества связанных серверов: • Связанный сервер обеспечивает удаленный доступ к данным. • Связанный сервер позволяет использовать распределенные запросы и транзакции для разнородных источников данных. • Связанный сервер обеспечивает возможность одинаковой работы с несколькими разнородными источниками данных. Функция OPEN QUERY Функция OPENQUERY предназначена для выполнения сквозных (pass-t hrough) запросов в источниках данных OLE DB. Она имеет следующий синтаксис: OPENQUERY(связанный_сервер, 'запрос') Параметры функции OPENQUERY определяют имя связанного сервера и исполняемый запрос. Перед использованием функции OPENQUERY необходимо настроить локальный SQL Server на работу со связанным сервером. В следующем примере функция OPENQUERY использована для выполнения команды SELECT на связанном сервере: SELECT * FROM OPENQUERY(Ot herSvr, 'SELECT au_lnam e, au_ fnam e FROM pubs..aut hors') Незапланированные распределенные запросы Даже если удаленный источник данных не был определен заранее, вы все равно можете обратиться к удаленным данным в незапланированном распределенном запросе с помощью функции OPENROWSET. При использовании функции OPENROWSET указываются параметры, необходимые для подключения к связанному серверу. На полученный набор записей можно ссылаться точно так же, как и на таблицу. Синтаксис OPENROWSET выглядит следующим образом: OPENROWSET( 'имя_провайдера' { 'источник'; 'имя_пользователя'; 'пароль' | 'строка_ провайдера'} , { [ каталог.] [ схема.] объект | 'запрос'} ) Как видно из синтаксиса, функции OPENROWSET передается вся информация, необходимая для подключения к удаленному источнику данных. Аргументы перечислены ниже: • 'Имя_провайдера' — строка определяет зарегистрированное имя провайдера OLE DB, хранящееся в системном реестре. Также встречается термин «дружественное (friendly ) имя». • 'Источник' — строка, определяющая источник данных OLE DB. Формат строки зависит от конкретного источника данных OLE DB. • 'Имя_пользователя' — имя пользователя, передаваемое провайдеру OLE DB. • 'Пароль' — пароль, ассоциируемый с именем пользователя. • 'Строка_провайдера' — информация подключения, необходимая для инициализации источника данных OLE DB ( зависит от конкретного провайдера) . • Каталог — имя каталога или базы данных, к которой обращается незапланированный запрос. • Схема — имя владельца структуры или объекта.

converted to PDF by BoJIoc

• Объект — имя объекта. • 'Запрос' — запрос, передаваемый провайдеру для выполнения. Внимание Если запрос возвращает несколько итоговых наборов, функция OPENROWSET вернет только первый итоговый набор. Преобразования данных При работе с удаленными данными происходят преобразования типа данных и кодировки, используемых на локальном сервере. При выборке данных командами SELECT, UPDATE, I NSERT или DELETE удаленные данные преобразуются в тип данных и кодировку локального сервера. При модификации данных командами I NSERT и UPDATE данные локального сервера преобразуются к типу данных и кодировке удаленного сервера. Если кодировка удаленных данных отличается от кодировки локального сервера, результаты запроса могут оказаться бессмысленными. Рассмотрим следующий пример: SELECT FirstNam e, LastNam e FROM Ot herDat aSource.DBNam e.Obj ectOw ner.PersonNam es WHERE PersonKey = 'ABC' ORDER BY Last Nam e, First Nam e Если кодировка удаленного источника данных отличается от кодировки локального сервера, результаты сравнения в секции WHERE могут оказаться неожиданными. Если показанный запрос выполняется на удаленном сервере, он возвращает все записи, у которых столбец PersonKey равен 'ABC'. Но если запрос запускается на локальном сервере, PersonKey перед сравнением преобразуется в локальную кодировку. Ограничения распределенных запросов При использовании распределенных запросов в SQL Server действует целый ряд правил и ограничений. Если провайдер не в полной степени обеспечивает функциональность OLE DB, возможны дополнительные ограничения для команд SQL. Правила и ограничения, действующие в отношении распределенных запросов, перечислены ниже: • В распределенных запросах разрешаются команды SELECT, состоящие только из секций SELECT, FROM и WHERE. • Секция I NTO разрешается при условии, что создаваемая таблица находится на локальном сервере. • Если список выборки содержит столбец типа BLOB из удаленной таблицы, команда SELECT не может содержать секции ORDER BY. • Локальные команды SQL не могут ссылаться на удаленные столбцы BLOB с ключевыми словами I S NULL и I S NOT NULL. • Команды I NSERT, UPDATE и DELETE, модифицирующие данные на удаленном сервере, должны соответствовать требованиям OLE DB к модификации данных. • При работе с удаленной таблицей с помощью курсора секция обновления и удаления WHERE CURRENT OF может выполняться лишь в том случае, если провайдер OLE DB поддерживает данную возможность. • Команды READTEXT, WRI TETEXT и UPDATETEXT не поддерживаются для удаленных таблиц. • Команды CREATE, DROP и ALTER не могут использоваться для удаленных серверов. • Курсоры типов STATI C и I NSENSI TI VE могут ссылаться на удаленные таблицы. • Курсоры типа KEYSET могут ссылаться на удаленные таблицы лишь в том случае, если провайдер OLE DB соответствует требованиям, документированным в описании функциональных возможностей курсоров KEYSET. • Курсоры FORWARD- ONLY не работают с удаленными таблицами. Совет Хотя к данным на удаленном сервере можно обратиться и через RPC, и с помощью распределенного запроса, Microsoft рекомендует при работе с удаленными данными использовать распределенные запросы. Распределенные транзакции

converted to PDF by BoJIoc

Распределенная (dist ribut ed) транзакция работает с данными, находящимися на двух и более серверах. В механизме распределенных транзакций участвуют два основных компонента: диспетчер ресурсов и диспетчер транзакций. SQL Server ( версии 6.5 и выше) может участвовать в распределенной транзакции с другим экземпляром SQL Server ( версии 6.5 и выше) или любым источником данных, соответствующим спецификации X/ Open XA для обработки распределенных транзакций. Внимание Транзакция на одном сервере, распространяющаяся на две и более базы данных, в действительности является распределенной. В этом случае SQL Server выполняет обычные действия по управлению распределенными транзакциями. Диспетчер ресурсов Диспетчером ресурсов ( resource m anager) называется сервер, содержащий данные, к которым обращается распределенный запрос. Функция диспетчера ресурсов — предоставление ресурсов, являющихся частью распределенной транзакции. SQL Server выполняет функции диспетчера ресурсов для распределенных транзакций, соответствующих спецификации X/ Open XA для обработки распределенных транзакций. Диспетчер транзакций Диспетчер транзакций координирует прохождение транзакции между диспетчерами ресурсов. Диспетчером распределенных транзакций может быть MS DTC (Microsoft Dist ribut ed Transact ion Coordinat or) или любой диспетчер транзакций с поддержкой спецификации X/ Open XA в части обработки распределенных транзакций. Диспетчер транзакций координирует транзакции совместно с диспетчерами ресурсов, чтобы гарантировать закрепление или откат всей транзакции. Примечание Распределенную транзакцию можно создать лишь при работающем диспетчере транзакций. Двухфазовое закрепление Распределенная транзакция обрабатывается аналогично локальным транзакциям. Когда транзакция завершается, приложение выдает команду закрепления или отката транзакции. Затем диспетчер транзакций координирует выполнение команды закрепления или отката с применением двухшагового процесса, называемого двухфазовым закреплением. Процесс двухфазового закрепления состоит из подготовительной фазы и фазы закрепления. Подготовительная фаза В подготовительной фазе диспетчер транзакций посылает команду подготовки всем диспетчерам ресурсов, участвующим в распределенной транзакции. Диспетчеры ресурсов подготавливают транзакцию так, чтобы для нее можно было выполнить закрепление или откат, и сообщают диспетчеру транзакций о завершении подготовительной фазы. Если какому-либо диспетчеру ресурсов не удается обработать запрос на подготовку, транзакция откатывается. Фаза закрепления После того как все диспетчеры ресурсов сообщат диспетчеру транзакций о завершении подготовительной фазы, диспетчер транзакций передает диспетчерам ресурсов требование на закрепление или откат. Если какой-либо диспетчер ресурсов не сможет завершить свою часть транзакции, вся транзакция откатывается. SQL Se rve r в распределенных транзакциях Существует несколько ситуаций, при которых SQL Server включается в распределенную транзакцию: • Если при активной локальной транзакции выдается запрос на распределенную транзакцию, локальная транзакция преобразуется в распределенную. Следующий фрагмент демонстрирует преобразование локальной транзакции в распределенную: BEGI N TRANSACTI ON GO UPDATE aut hors SET cont ract = 1 GO -- на данный момент транзакция является локальной UPDATE My Server.Pubs.dbo.aut hors SET cont ract = 1 GO -- транзакция преобразуется в распределенную

converted to PDF by BoJIoc

COMMI T TRANSACTI ON GO • Для явного создания распределенной транзакции используется команда BEGI N DI STRI BUTED TRANSACTI ON. • Удаленные вызовы процедур могут привести к повышению локальной транзакции до распределенной. • Распределенная транзакция может запускаться методами ODBC или OLE DB. Экземпляр SQL Server, инициирующий распределенную транзакцию, управляет ее завершением. Когда после инициирования распределенной транзакции подключение выполняет команду COMMI T TRANSACTI ON или ROLLBACK TRANSACTI ON, управляющий сервер обращается к диспетчеру транзакций с требованием завершить распределенную транзакцию на всех участвующих в ней диспетчерах ресурсов. BEGI N DI STRI BUTED TRAN SACTI ON Команда BEGI N DI STRI BUTED TRANSACTI ON используется для явного создания распределенных транзакций. Она имеет следующий синтаксис: BEGI N DI STRI BUTED TRAN[ SACTI ON] [ имя_транзакции | @переменная_с_именем_ транзакции] Повышение транзакций при вызовах RPC SQL Serv er можно настроить так, чтобы при выполнении RPC локальная транзакция повышалась до распределенной. Для настройки используется хранимая процедура sp_ configure. Синтаксис sp_configure для повышения локальных транзакций выглядит следующим образом: sp_configure "rem ot e proc t rans" , [ 1 | 0] Если параметр rem ot e proc t rans процедуры sp_configure равен 0, то при удаленном вызове процедуры локальная транзакция не преобразуется в распределенную. Если параметр rem ote proc t rans процедуры sp_configure равен 1 , вызов RPC приводит к преобразованию локальной транзакции в распределенную. Совет После настройки SQL Server не забудьте выполнить команду RECONFI GURE; без нее изменения конфигурации не вступят в силу. Примеры экзаменационных вопросов Que stion 1 I n t he following SELECT statem ent , w hat are t he nam es of t he tables being accessed? [ Check all correct answers] select * from sales..t hisyear cross j oin old.ot hersales.j oe.last week • • • • •

A. t hisyear B. last week C. sales D. old E. j oe

Вопрос 1 Что является именами таблиц в следующей команде SELECT? [ Выберите все правильные ответы] select * from sales..t hisyear cross j oin old.ot hersales.j oe.last week • • • • •

A. t hisyear B. last week C. sales D. old E. j oe

converted to PDF by BoJIoc

Правильные ответы — A и B. Команда SELECT обращается к таблицам t hisyear и last week . Ответ C неверен, поскольку sales является именем базы данных. Ответ D неверен, поскольку old является именем удаленного сервера. Ответ E тоже неверен; j oe — владелец таблицы lastw eek . Que stion 2 Which of t he following SQL bat ches w ill run a dist ributed t ransact ion? [ Check all correct answers] • a. begin t ransact ion go delet e t able1 go updat e MyServer.dbo.MyTable set Colum n1 = 1234 go com m it t ransact ion go • b. sp_configure 'rem ot e proc t ran',1 reconfigure go exec Server2.m ydb.m y proc go • c. begin dist ribut ed t ransact ion go updat e serv er2.pubs..aut hors set cont ract = 1 go com m it t ransact ion go • d. begin t ransact ion go delet e m y db..t able1 delet e m 2.m y db..t able2 go rollback t ransact ion go Вопрос 2 Какие из приведенных пакетов SQL запускают распределенный запрос? [ Выберите все правильные ответы] • A. begin t ransact ion go delet e t able1 go updat e MyServer.dbo.MyTable set Colum n1 = 1234 go com m it t ransact ion go • B. sp_configure 'rem ot e proc t ran',1 reconfigure go exec Server2.m ydb.m y proc go • C. begin dist ribut ed t ransact ion go updat e serv er2.pubs..aut hors set cont ract = 1 go

converted to PDF by BoJIoc

com m it t ransact ion go • D. begin t ransact ion go delet e m y db..t able1 delet e m 2.m y db..t able2 go rollback t ransact ion go Правильные ответы — C и D. В ответе C использовано явное создание распределенной транзакции. Ответ B косвенно начинает распределенную транзакцию, обращаясь к удаленному источнику данных при наличии активной транзакции. Ответ A неверен, поскольку в команде UPDATE имя My Server относится к базе данных, а не к удаленному серверу. Следовательно, распределенная транзакция не создается. Ответ B неверен. Даже несмотря на то, что сервер настроен на автоматическое преобразование локальных транзакций в распределенные при вызовах RPC, в момент вызова RPC локальной транзакции не существует. Que stion 3 The OPENQUERY funct ion is used t o do w hich of t he following? • • • • •

A. The OPENQUERY funct ion B. The OPENQUERY funct ion C. The OPENQUERY funct ion D. The OPENQUERY funct ion E. All of t he abov e.

is is is is

used used used used

to to to to

m odify dat a on a rem ot e serv er. execute an RPC. m ake an ad hoc connect ion t o an OLE DB dat a source. access predefined rem ot e dat a source.

Вопрос 3 Что из перечисленного делает функция OPENQUERY? • A. Функция OPENQUERY используется для модификации данных на удаленном сервере. • B. Функция OPENQUERY используется для выполнения RPC. • C. Функция OPENQUERY используется для установления незапланированных подключений к источникам данных OLE DB. • D. Функция OPENQUERY используется для обращения к заранее определенным удаленным источникам данных. • E. Все перечисленное. Правильный ответ — C. Функция OPENQUERY используется для организации незапланированных запросов к удаленным источникам данных. Ответ A неверен, поскольку функция OPENQUERY не выполняет прямой модификации данных. Ответ B неверен, поскольку функция OPENQUERY не выполняет RPC. Ответ D неверен — функция OPENQUERY не используется для работы с заранее определенными источниками данных. Наконец, ответ E тоже неверен, поскольку правилен лишь ответ C. Que stion 4 Which of t he following SQL st at em ent s are valid in dist ribut ed queries? [ Check all correct answers] • • • •

A. select * int o MyServer.t em pdb..t 1 from pubs..aut hors B. insert S2.pubs..j os ( j obs_desc, m in_lv l, m xm _lvl) v alues ('My Job',1 ,2 ) C. select * from s3 .pubs..aut hors D. drop t able S2.t em pdb..t 3

Вопрос 4 Какие из следующих команд SQL допустимы в распределенных запросах? [ Выберите все правильные ответы] • • • •

A. select * int o MyServer.t em pdb..t 1 from pubs.authors B. insert S2.pubs..j os ( j obs_desc, m in_lv l, m xm _lv l) v alues ('My Job',1 ,2 ) C. select * from s3 .pubs..aut hors D. drop t able S2.t em pdb..t 3

Правильные ответы — B и C. В обоих ответах происходит обращение к данным, находящимся на другом сервере. Ответ A неверен, поскольку удаленная таблица не может быть указана в качестве создаваемой в

converted to PDF by BoJIoc

команде SELECT I NTO. Ответ D неверен, поскольку команда DROP TABLE в распределенных запросах не разрешается. ГЛАВА 1 8

Пример экзамена Приведенные в этой главе рекомендации помогут вам выработать стратегию успешной сдачи экзамена. В частности, вы научитесь выбирать правильные ответы, расшифровывать неоднозначности в тексте и работать с экзаменационной программой Microsoft . Вы узнаете, какую информацию следует запоминать и как готовиться к экзамену. В конце главы приведена подборка из 40 вопросов по темам, относящимся к экзамену Microsoft Exam 70-029: «Designing and I m plem ent ing Dat abases with Microsoft SQL Server 7». Вопросы, вопросы, вопросы… Не сомневайтесь, при сдаче экзамена вам предстоит ответить на множество специфических и конкретных вопросов. В настоящее время экзамен по SQL Server 7 может быть фиксированным или адаптивным. Фиксированный экзамен состоит из 49 вопросов, на которые отводится 150 минут. Если экзамен является адаптивным (программа сообщит вам об этом в начале экзамена) , он содержит от 25 до 75 вопросов (в среднем) и занимает от 30 до 90 минут. Независимо от типа экзамена вопросы делятся на четыре основных типа: • • • •

многовариантные с одним правильным ответом; многовариантные с несколькими правильными ответами; многофазовые с одним правильным ответом; многофазовые с одним или несколькими ответами.

Перед тем как выбрать ответ, обязательно дважды перечитайте текст вопроса. Кроме того, поищите кнопку Exhibit . Кнопка Exhibit выводит графическую информацию, относящуюся к вопросу, как правило — экранную копию выходных данных программы или элементы графического интерфейса, которые необходимо проанализировать при изучении вопроса и формулировке ответа. Кнопка Ex hibit выводит также графику и диаграммы, которые поясняют текст вопроса, содержат дополнительные данные, демонстрируют структуру страниц или поведение программы. Не у каждого вопроса есть лишь один ответ; многие вопросы имеют несколько ответов. Следовательно, вы должны внимательно прочитать текст вопроса и определить, какие ответы являются обязательными или возможными, а также поискать дополнительные подсказки или инструкции при выборе ответа. Такие инструкции часто выводятся в квадратных скобках сразу же после текста вопроса (как в многовариантных ответах, где допускается выбор одного или нескольких вариантов). Выбор правильных ответов Разумеется, единственный способ сдать экзамен — найти достаточное количество правильных ответов и набрать проходной балл. Однако экзамены Microsoft отличаются от стандартных экзаменов SAT или GRE своими каверзными и изощренными вопросами. Иногда вопросы поставлены так невразумительно, что расшифровать их почти невозможно. Тогда приходится действовать методом исключения. Почти всегда один ответ из приведенных можно немедленно отвергнуть, потому что: • он не имеет отношения к описанной ситуации; • в нем предлагается несуществующее решение; • ответ опровергается текстом самого вопроса. Когда очевидно неправильные ответы будут отвергнуты, попробуйте исключить другие варианты, руководствуясь своими знаниями. Ищите ответы, которые на первый взгляд кажутся правильными, но описывают несуществующие или неприменимые в описанной ситуации действия, команды или возможности. Если после второй стадии отбора у вас остались два и более потенциально правильных ответа, перечитайте вопрос. Попытайтесь представить описанную ситуацию и то, как на нее повлияет каждый из оставшихся ответов. Будьте особенно внимательны в терминологии; иногда правильный ответ может зависеть от выбора одного слова (например, «удалить» вместо « отключить») .

converted to PDF by BoJIoc

Если все возможности для исключения исчерпаны, а вы все еще не знаете, какой из оставшихся ответов является правильным, попытайтесь угадать! Вопрос без ответа вообще не дает очков, а догадка по крайней мере дает шанс правильно ответить на вопрос. Главное — не торопитесь с догадками! Внимание Если вы сдаете фиксированный или укороченный экзамен, с догадками можно подождать до завершающей стадии просмотра помеченных вопросов ( когда у вас подойдет к концу время или вопросы без ответов) . На адаптивном экзамене вам придется гадать, чтобы перейти к следующему вопросу. В любом случае гадание должно быть последним средством. Интерпретация неоднозначного текста Экзамены Microsoft прославились своими невразумительными, каверзными и двусмысленными вопросами. По своему опыту сдачи многочисленных экзаменов мы хорошо понимаем, почему об этом так часто приходится слышать. Экзамены Microsoft действительно трудны, и это было сделано намеренно. Единственное средство победить Microsoft на ее собственном поле — хорошая подготовка. Вы увидите, что во многих вопросах проверяется ваше знание в областях, не связанных напрямую с темой вопроса. Это означает, что предложенные вам ответы, даже неправильные, предназначены для оценки вашей осведомленности в данном вопросе. Если вы слабо разбираетесь в работе SQL Server 7, вам не удастся исключить заведомо неверные ответы, потому что они относятся к другой области SQL Server — совсем не к той, которая упоминается в самом вопросе. Другими словами, чем больше вы знаете о программе, тем проще будет отличить правильные ответы от неправильных. Подсказка нередко кроется в самом вопросе, но чтобы разглядеть ее, нужно обладать проницательностью Шерлока Холмса. В текст часто включаются тонкие намеки, которые с первого взгляда кажутся излишними. Вы должны понимать, что каждый вопрос сам по себе является экзаменом и для успешной сдачи всего экзамена необходимо изучить и успешно разобраться с каждым вопросом. Ищите подсказки — время, права и названия групп, параметры конфигурации. Все это может навести вас на правильный ответ; но если вы пройдете мимо, останется лишь гадать. Другая распространенная трудность, связанная с сертификационными экзаменами, — терминология. Microsoft прославилась своими исключительными способностями по выбору терминов и названий — вполне логичных в одних случаях и совершенно бессмысленных в других. Уделите внимание терминам, перечисленным в начале каждой главы. Перед сдачей экзамена стоит заново просмотреть глоссарий. Тактика ответа на вопросы Вопросы экзамена следуют в произвольном порядке. К тому же многие элементы или темы повторяются в нескольких вопросах. Нередко правильный ответ на один вопрос оказывается неправильным для другого. Обязательно прочитайте все ответы, даже если вы с первого взгляда определили правильный. Возможно, даже неправильные ответы помогут вспомнить какую-нибудь особенность или функцию SQL Server, которая поможет с ответом на другой вопрос экзамена. Если вы сдаете фиксированный экзамен, к вопросу можно сколько угодно раз возвращаться в будущем. Если вы не уверены в правильности ответа, установите специальный флажок — он позволит вам позднее вернуться к этому вопросу. Кроме того, помечайте те вопросы, которые, по вашему мнению, могут помочь с ответами на другие вопросы. При сдаче фиксированных или укороченных экзаменов мы помечали от 25 до 50 процентов всех вопросов. Экзаменационная программа написана так, чтобы вы могли пометить ответ на любой вопрос, — пользуйтесь этим. Помечайте все, что вы хотите увидеть снова; программа поможет вернуться к помеченным данным. Внимание При сдаче фиксированных и укороченных экзаменов мы настоятельно рекомендуем начать с просмотра всех вопросов и лишь потом переходить к ответам на отдельные вопросы. Чтение предлагаемых ответов освежит вашу память, а также поможет выделить вопросы, которые следует пометить, и возвратиться к ним в будущем. Кроме того, вы сможете определить и пометить самые каверзные вопросы. Главное — быстро пробежаться по списку вопросов и разобраться, с чем вам предстоит иметь дело. Со второго захода можно переходить к внимательному изучению вопросов, последовательно и методично отвечая на них.

converted to PDF by BoJIoc

Если вы сдаете адаптивный экзамен и при виде вопроса или ответа у вас в памяти всплывает важная информация или если вы думаете, что эта информация поможет с ответом на другой вопрос, запишите ее на листке бумаги. Хотя адаптивный экзамен не позволяет вернуться к прежним вопросам, вы имеете право делать заметки, которые могут пригодиться при ответе на последующие вопросы. Внимание Не бойтесь делать заметки во время сдачи адаптивного экзамена. Иногда то, что вы запишете при ответе на один вопрос (тема, в которой вы недостаточно хорошо разбираетесь, имя или особенности применения утилиты, подробности интерфейса и т. д.), может пригодиться при ответах на другие вопросы. В некоторых экзаменах Microsoft объединяются от 15 до 25 вопросов адаптивных экзаменов с 10 вопросами фиксированных экзаменов. В этом случае для адаптивной части следует использовать стратегию, рекомендованную для адаптивных экзаменов, а для фиксированной части — стратегию фиксированного или укороченного экзамена. Что следует запоминать Объем информации, которую необходимо помнить для сдачи экзамена, зависит от вашей способности запоминать все прочитанное и увиденное. Если вы обладаете зрительной памятью и можете легко представить себе меню или диалоговое окно, ваша задача несколько упрощается. В процессе экзамена вам придется не раз напрячься, чтобы вспомнить команды и функции SQL Server. Как минимум необходимо запомнить следующую информацию: • • • •

отличительные особенности различных нормальных форм; T-SQL DML (Data Manipulat ion Language); T-SQL DDL (Data Definit ion Language) ; команды управления транзакциями T-SQL и их поведение.

Если вы читали эту книгу за компьютером, на котором установлен SQL Server, и пытались экспериментировать с различными возможностями и функциями по мере изложения материала, вам удастся справиться с этой задачей без особых затруднений. Кроме того, не забывайте о «шпаргалке» в конце книги — в ней изложен материал, который важнее всего запомнить; пользуйтесь ею при подготовке к экзамену. Подготовка к экзамену Лучший способ подготовки к экзамену (разумеется, после изучения материала) — сдать хотя бы один пробный экзамен. Мы включили в эту главу вопросы такого экзамена. Эти вопросы приведены в следующем разделе. В отличие от предыдущих глав, ответы не следуют сразу же за вопросами; чтобы просмотреть ответы, вам придется обратиться к главе 19. На сдачу экзамена отводится 105 минут. Ведите себя честно, не подглядывайте в текст книги или в ответы. Когда время выйдет или вы ответите на все вопросы, проверьте свои ответы по главе 19. Обратите особое внимание на объяснение неправильных ответов; это поможет укрепить ваше знание материала. Конечно, умение находить правильные ответы — вещь хорошая, но не менее важно понять, почему неправильный ответ неправилен. На экзамене Прежде всего — успокойтесь. Когда вы окажетесь перед экзаменационным компьютером, то уже никак не сможете получить дополнительные знания или подготовку. Сделайте глубокий вдох, потянитесь и беритесь за первый вопрос. Не торопитесь — времени с избытком хватает на то, чтобы ответить на каждый вопрос и вернуться к пропущенным вопросам (для фиксированных или укороченных экзаменов) . Если вы дважды прочитали вопрос и понятия не имеете, что с ним делать, пометьте его и двигайтесь дальше (для фиксированных или укороченных экзаменов; на адаптивном экзамене придется гадать) . Простые и сложные вопросы распределены в экзамене случайным образом. Если вы сдаете фиксированный или укороченный экзамен, не обманывайте себя и не тратьте слишком много времени на сложный вопрос в самом начале — это помешает вам ответить на несколько простых вопросов в конце. На фиксированном или укороченном экзамене вы можете прочитать все вопросы экзамена. Перед тем как возвращаться к пропущенным вопросам, оцените свой запас времени. По мере ответов на вопросы

converted to PDF by BoJIoc

снимайте пометки. Продолжайте просматривать оставшиеся помеченные вопросы до тех пор, пока не кончится время или не будут введены ответы на все вопросы. На адаптивном экзамене установите максимальное время ответа на вопрос (мы рекомендуем выделять не более пяти минут, и то, только если вы находитесь в полном замешательстве) и следите за временем, отвечая на длинные или сложные вопросы. Если время истекло, попробуйте угадать ответ и следуйте дальше. Не лишайте себя возможности ответить на большее число вопросов и не тратьте время на долгие размышления над вопросами, если только вам не кажется, что вы сможете найти ответ. В противном случае вы лишь упускаете собственные возможности. На этом наши рекомендации кончаются. Далее следуют вопросы, на которых можно потренироваться в сдаче экзамена. Que stion 1 Which of t he following SQL st at em ent s will place t he dash in a nine-digit zipcode field from t he address t able? That is, w hat will convert 557460001 t o 55746-0001? [ Check all correct answers] • • • • •

A. select B. select C. select D. select E. select

st uff( zipcode, 6 ,1 ,'- ') from address subst ring( zipcode,0 ,4 )+ '- '+ subst ring(zipcode,5,8) from address st uff( zipcode,6,0,'-') from address subst ring(zipcode,1 ,5 )+ '- '+ subst ring( zipcode,6 ,4 ) from address subst ring( zipcode,1 ,5 )+ '- '+ subst ring(zipcode,6,9) from address

Вопрос 1 Какие из следующих команд SQL включают дефис в поле zipcode таблицы address, состоящее из девяти цифр? Иначе говоря, какие команды преобразуют 557460001 в 55746-0001? [ Выберите все правильные ответы] • • • • •

A. select B. select C. select D. select E. select

st uff( zipcode, 6 ,1 ,'- ') from address subst ring( zipcode,0 ,4 )+ '- '+ subst ring(zipcode,5,8) st uff( zipcode,6,0,'-') from address subst ring(zipcode,1 ,5 )+ '- '+ subst ring( zipcode,6 ,4 ) from address subst ring( zipcode,1 ,5 )+ '- '+ subst ring(zipcode,6,9) from address

Que stion 2 What is a prim ary key const raint used for? • • • •

A. I dent ify a row in a dat abase t able. B. I m prove t he perform ance of dat abase queries. C. Reduce cont ent ion when updat ing dat a. D. Enforce dom ain integrit y.

Вопрос 2 Для чего используется ограничение первичного ключа (PRI MARY KEY)? • • • •

A. Для идентификации записи в таблице базы данных. B. Для повышения быстродействия запросов. C. Для уменьшения конкуренции при обновлении данных. D. Для обеспечения целостности доменов.

Que stion 3 The following t able will t ake up how m uch disk space for 100 000 rows? creat e t able MyTable ( a int not null, b char(400) not null, c dat et im e not null ) • • • • •

A. 800 000K. B. 50 000K. C. 40 000K. D. 44 480K. E. 42 112K.

Вопрос 3 Сколько места на диске потребуется для хранения 100 000 записей следующей таблицы?

converted to PDF by BoJIoc

creat e t able MyTable ( a int not null, b char(400) not null, c dat et im e not null ) • • • • •

A. 800 000 Кбайт. B. 50 000 Кбайт. C. 40 000 Кбайт. D. 44 480 Кбайт. E. 42 112 Кбайт.

Que stion 4 You have t wo t ables — t able Order is t he parent t able and OrderLine is t he child table. How would you set up a delet e t rigger t o cascade queries? • • • •

A. The t rigger should set up on OrderLine t o rem ove Order rows when OrderLine is delet ed. B. The t rigger should be set up on Order t o rem ove OrderLine rows when t he Order is deleted. C. The t rigger should be set up on Order t o prevent t he delet e if OrderLine exist s. D. None of t he above.

Вопрос 4 Имеются две таблицы — таблица Order является базовой, а таблица OrderLine является подчиненной. Как установить триггер для каскадного удаления? • A. Триггер следует установить в OrderLine для удаления записей Order при удалении из OrderLine. • B. Триггер следует установить в Order для удаления записей Orderline при удалении из Order. • C. Триггер следует установить в Order для предотвращения удаления в том случае, если запись в OrderLine существует. • D. Ни один из перечисленных ответов не подходит. Que stion 5 Which norm al form is t he following t able in? creat e t able Address ( AddressI d int not null, St reetAddress varchar(120), City varchar(120) , St ate varchar(120) , ZipCode char(9 ), PhoneNum ber1 v archar(10), PhoneNum ber2 v archar(10), PhoneNum ber3 v archar(10), St ateTaxRat e num eric(5,3) , PriceOfTea num eric(10,2) , prim ary key ( AddressI d) ) • • • •

A. First norm al form . B. Second norm al form . C. Third norm al form . D. I t is not norm alized.

Вопрос 5 В какой нормальной форме находится следующая таблица? creat e t able Address ( AddressI d int not null, St reetAddress varchar(120), City varchar(120) , St ate varchar(120) , ZipCode char(9 ), PhoneNum ber1 v archar(10), PhoneNum ber2 v archar(10), PhoneNum ber3 v archar(10), St ateTaxRat e num eric(5,3) ,

converted to PDF by BoJIoc

PriceOfTea num eric(10,2) , prim ary key ( AddressI d) ) • • • •

A. Первая нормальная форма. B. Вторая нормальная форма. C. Третья нормальная форма. D. Таблица не нормализована.

Que stion 6 Which norm al form is t he following t able in? creat e t able Address ( AddressI d int not null, St reetAddress varchar(120), City varchar(120) , St ate varchar(120) , ZipCode char(9 ), St ateTaxRat e num eric(5,3) , PriceOfTea num eric(10,2) , prim ary key ( AddressI d) ) • • • •

A. First norm al form . B. Second norm al form . C. Third norm al form . D. I t is not norm alized.

Вопрос 6 В какой нормальной форме находится следующая таблица? creat e t able Address ( AddressI d int not null, St reetAddress varchar(120), City varchar(120) , St ate varchar(120) , ZipCode char(9 ), St ateTaxRat e num eric(5,3) , PriceOfTea num eric(10,2) , prim ary key ( AddressI d) ) • • • •

A. Первая нормальная форма. B. Вторая нормальная форма. C. Третья нормальная форма. D. Таблица не нормализована.

Que stion 7 Which norm al form is t he following t able in? creat e t able Address ( AddressI d int not null, St reetAddress varchar(120), City varchar(120) , St ate varchar(120) , ZipCode char(9 ), prim ary key ( AddressI d) ) • • • •

A. First norm al form . B. Second norm al form . C. Third norm al form . D. I t is not norm alized.

Вопрос 7 В какой нормальной форме находится следующая таблица? creat e t able Address

converted to PDF by BoJIoc

( AddressI d int not null, St reetAddress varchar(120), City varchar(120) , St ate varchar(120) , ZipCode char(9 ), prim ary key ( AddressI d) ) • • • •

A. Первая нормальная форма. B. Вторая нормальная форма. C. Третья нормальная форма. D. Таблица не нормализована.

Que stion 8 What will happen w it h t he following CREATE DATABASE com m and? creat e dat abase MyDb on ( nam e = dev1, filenam e= 'C: \ m ssql7 \ dev1 ', size= 10) • • • •

A. An error w ill be generat ed, because a log file was not specified. B. A dat abase will be creat ed t hat has dat a and log st ored on dev1 . C. A dat abase will be creat ed t hat has data st ored on dev1 and a log st ored in a file called MyDB.ldf. D. An error will be generat ed, because t he ext ension .m df was not specified for t he file nam e.

Вопрос 8 Что произойдет при выполнении следующей команды CREATE DATABASE? creat e dat abase MyDb on ( nam e = dev2, filenam e= 'C: \ m ssql7 \ dev1 ', size= 10) • • • •

A. Произойдет ошибка, поскольку файл журнала не указан. B. На dev1 создается база данных, содержащая данные и журнал. C. Создается база данных, хранящая данные на dev1, а журнал — на MyDB.ldf. D. Произойдет ошибка, поскольку в имени файла не указано расширение .m df.

Que stion 9 You want t o creat e a Sales table t hat m eet s t he following condit ions: • You plan on having rem ot e servers set up in Denver, Tam pa and Minneapolis wit h a cent ral sit e in Dallas. • You want t o be able t o insert new cust om ers in each rem ot e server. • You want t o be able t o report on t he dat a from t he cent ral server in Dallas. • You want unique I Ds across all t he servers. • You will use replicat ion t o keep t he dat a sy nchronized across t he dat abases. How do y ou creat e the Sales t able? • A. Create all t he t ables w it h t he I D being an ident it y colum n. • B. Create t he rem ote t ables wit h an ident it y colum n, and, on t he cent ral table, m ake sure t he I D colum n is not an ident it y. • C. Creat e t he t ables with t he I D colum n being an uniqueident ifier data t ype. • D. Creat e t he t ables wit h t he I D colum n being a uniqueident ifier dat a t ype w it h a default of GETI D() . • E. Create t he t ables wit h t he I D colum n being a uniqueident ifier data t ype wit h a default of NEWI D() . Вопрос 9 Вы хотите создать таблицу Sales, удовлетворяющую следующим условиям: • Вы планируете установить удаленные серверы в Денвере, Тампа и Миннеаполисе, а центральный сервер будет находиться в Далласе. • Вы хотите иметь возможность вставлять данные новых клиентов на каждом удаленном сервере. • Вы хотите иметь возможность строить отчеты по данным на центральном сервере в Далласе. • Вы хотите создать поле I D, значения которого уникальны на всех серверах. • Для синхронизации данных между базами будет использоваться репликация. Как создать таблицу Sales? • A. Создать все таблицы, в которых столбец I D является столбцом счетчика. • B. Создать все удаленные таблицы со столбцами счетчика и проследить за тем, чтобы в центральной таблице столбец не был столбцом счетчика. • C. Создать таблицы, в которых столбец I D имеет тип данных uniqueident ifier.

converted to PDF by BoJIoc

• D. Создать таблицы, в которых столбец I D имеет тип данных uniqueident ifier и по умолчанию равен GETI D( ). • E. Содать таблицы, в которых столбец I D имеет тип данных uniqueident ifier и по умолчанию равен NEWI D() . Que stion 1 0 Consider t he following st ored procedure: creat e procedure MyP1 (@a v archar(32 )) as begin t ran declare @b int delet e from a1 where au_lnam e like @a select @b = @@rowcount if ( @@error ! = 0 ) begin rollback t ran ret urn -200 end delet e from a2 where au_lnam e like @a select @b = @b + @@rowcount if ( @@error ! = 0 ) begin rollback t ran ret urn -200 end com m it t ran ret urn @b Which of t he following st at em ent s are t rue? [ Check all correct answers] • • • • •

A. The procedure can only be run from inside a t ransact ion. B. I f an error occurs in delet ing from t able a1, it will not delete from table a2. C. I f an error occurs in delet ing from t able a2, t he rows delet ed from t able a1 will be rolled back . D. The st ored procedure is invalid and will not be creat ed. E. None of t he above.

Вопрос 1 0 Имеется следующая хранимая процедура: creat e procedure MyP1 (@a v archar(32 )) as begin t ran declare @b int delet e from a1 where au_lnam e like @a select @b = @@rowcount if ( @@error ! = 0 ) begin rollback t ran ret urn -200 end delet e from a2 where au_lnam e like @a select @b = @b + @@rowcount if ( @@error ! = 0 ) begin rollback t ran ret urn -200 end com m it t ran ret urn @b Какие из следующих утверждений истинны? [ Выберите все правильные ответы] • A. Процедура может запускаться только из транзакции. • B. Если при удалении из таблицы a1 произойдет ошибка, процедура не будет производить удаление из таблицы a2 . • C. Если при удалении из таблицы a2 произойдет ошибка, записи, удаленные из таблицы a1 , будут возвращены на место. • D. Хранимая процедура написана неправильно и не будет создана. • E. Ни одно из перечисленных утверждений.

converted to PDF by BoJIoc

Que stion 1 1 You current ly have t he following t able: creat e t able Sale ( SaleI d num eric(10) ident ity , Cust om erI d num eric(10) , SaleNot e varchar(2000) default 'NONE', SaleDat e dat et im e) You no longer want t o st ore t he SaleNote in t his t able. Which of t he following is t he best way t o rem ov e t he SaleNot e colum n from t he t able? • A. Bulk copy t he Sale t able out of t he database, drop t he Sale t able, creat e a new Sale t able, and bulk copy t he dat a back int o t he new Sale t able, ignoring t he SaleNot e colum n. • B. Alt er t he Sale t able by dropping t he SaleNot e colum n. • C. Renam e t he Sale t able. Use DTS t o m igrat e t he dat a creat ing a Sale t able, sk ipping t he SaleNot e colum n. Then, drop t he original Sale t able. • D. Alt er t he Sale t able by dropping t he default on t he SaleNote colum n and t hen dropping t he SaleNot e colum n. Вопрос 1 1 Имеется следующая таблица: creat e t able Sale ( SaleI d num eric(10) ident ity , Cust om erI d num eric(10) , SaleNot e varchar(2000) default 'NONE', SaleDat e dat et im e) Вы хотите отказаться от хранения SaleNote в таблице. Как лучше всего удалить столбец SaleNot e из таблицы? • A. Выполнить пакетное копирование таблицы Sale из базы данных, удалить таблицу Sale, создать новую таблицу Sale и выполнить пакетное копирование данных обратно в таблицу Sale, игнорируя столбец SaleNot e. • B. Модифицировать таблицу Sale t able с удалением столбца SaleNote. • C. Переименовать таблицу Sale. Воспользоваться DTS для переноса данных и создать таблицу Sale, пропуская столбец SaleNot e. Затем удалить исходную таблицу Sale. • D. Модифицировать таблицу Sale, удалить значение по умолчанию для столбца SaleNot e и затем удалить столбец SaleNote. Que stion 1 2 You have a blank t able that contains ident it y colum ns, and you w ant t o load a dat a file t hat current ly cont ains values for t he ident it y colum n int o t he t able. Which of t he following stat em ent s are t rue? • • • •

A. To load t he B. To load t he C. To load the D. You cannot

data using bcp, you m ust use the –I param et er. data using bcp, you m ust use the –E param et er. dat a using bcp, you m ust first configure t he dat abase t o allow ident it y insert s. load t he dat a wit h bcp.

Вопрос 1 2 Имеется пустая таблица, содержащая столбцы счетчика. Вы хотите загрузить в таблицу файл данных, содержащий значения столбца счетчика. Какие из следующих утверждений верны? • A. Для загрузки данных с использованием bcp необходимо использовать параметр –I . • B. Для загрузки данных с использованием bcp необходимо использовать параметр –E. • C. Чтобы загрузить данные с использованием bcp, необходимо предварительно настроить базу данных и разрешить вставку в столбцы счетчика. • D. Вы не cможете загрузить данные с помощью bcp. Que stion 1 3 You want t o enforce dom ain int egrity on a t able. Which of t he following SQL Server feat ures can you use? [ Check all correct answers] • • • •

A. Defaults. B. Rules. C. Triggers. D. Foreign key.

converted to PDF by BoJIoc

Вопрос 1 3 Вы хотите обеспечить целостность доменов для таблицы. Какими из следующих возможностей SQL Server можно воспользоваться? [ Выберите все правильные ответы] • • • •

A. Значения по умолчанию. B. Правила. C. Триггеры. D. Внешний ключ.

Que stion 1 4 What will happen w hen y ou execut e t he following SQL st at em ent ? [ Check all correct answers] select au_id, sum (roy altyper) from t it leaut hor group by au_ id, t it le_ id order by t it le_id, au_id com put e avg( sum ( royalt yper)) by t it le_id • A. The st at em ent will fail. • B. There will be a row for each aut or_id and t it le_id com binat ion. • C. There will be a row each t im e t he t it le_id changes showing t he average for each aut hor t hat worked on t hat t it le_id. • D. There will be a row each t im e t he aut or_id changes showing t he average for each aut hor t hat worked on t hat t it le_ id. Вопрос 1 4 Что произойдет при выполнении следующей команды SQL? [ Выберите все правильные ответы] select au_id, sum (roy altyper) from t it leaut hor group by au_ id, t it le_ id order by t it le_id, au_id com put e avg( sum ( royalt yper)) by t it le_id • A. Команда завершится неудачей. • B. Для каждого сочетания aut or_id и t it le_id создается запись. • C. Для каждого изменения t it le_id создается запись, в которой показано среднее значение выплат для всех авторов, работавших над книгой с данным названием ( t it le_id) . • D. Для каждого изменения aut or_ id создается запись, в которой показано среднее значение выплат для всех авторов, работавших над книгой с данным названием ( t it le_id) . Que stion 1 5 Consider t he following t able definit ion: Creat e t able aut os (m ake varchar(20) not null, m odel varchar(20 ) not null, acquisit ion_cost m oney null, acquisit ion_dat e dat et im e null) What will happen w hen t he follow ing SQL is execut ed? [ Check all correct answers] Truncat e table aut os Begin t ran I nsert aut os (m ake, m odel) values ('Tucker', "Torpedo" ) I f exist s(select * from aut os) Rollback t ran Else Com m it t ran • • • • •

A. The bat ch will fail, because t he begin t ran…com m it t ran pair are not properly nest ed. B. At t he end of t he bat ch, no rows will be in t he t able. C. At t he end of t he batch, one row will be in t he t able. D. All proper error handling will be perform ed. E. All proper error handling will not be perform ed.

Вопрос 1 5 Имеется следующее определение таблицы: Creat e t able aut os (m ake varchar(20) not null, m odel varchar(20 ) not null,

converted to PDF by BoJIoc

acquisit ion_cost m oney null, acquisit ion_dat e dat et im e null) Что произойдет при выполнении следующего фрагмента SQL ? [ Выберите все правильные ответы] Truncat e table aut os Begin t ran I nsert aut os (m ake, m odel) values ('Tucker', "Torpedo" ) I f exist s(select * from aut os) Rollback t ran Else Com m it t ran • A. Пакет не будет выполнен, поскольку пара begin t ran…com m it t ran не находится на должном уровне вложенности. • B. После выполнения пакета в таблице не останется ни одной записи. • C. После выполнения пакета в таблице останется одна запись. • D. Будет выполнена надлежащая обработка ошибок. • E. Не будет выполнена надлежащая обработка ошибок. Que stion 1 6 Consider t he following t able definit ion: Creat e t able aut os (m ake varchar(20) not null, m odel varchar(20 ) not null, acquisit ion_cost m oney null, acquisit ion_dat e dat et im e null) What will happen w hen t he follow ing SQL is execut ed? [ Check all correct answers] Truncat e table aut os Begin t ran I nsert aut os (m ake, m odel) values ('Tucker', "Torpedo" ) I f exist s(select * from aut os) Com m it t ran Else Print "Error: t he row was not insert ed int o the t able" Rollback t ran • • • • •

A. The bat ch will fail, because t he begin t ran…com m it t ran pair are not properly nest ed. B. At t he end of t he bat ch, no rows will be in t he t able. C. At t he end of t he batch, one row will be in t he t able. D. All proper error handling will be perform ed. E. All proper error handling will not be perform ed.

Вопрос 1 6 Имеется следующее определение таблицы: Creat e t able aut os (m ake varchar(20) not null, m odel varchar(20 ) not null, acquisit ion_cost m oney null, acquisit ion_dat e dat et im e null) Что произойдет при выполнении следующего фрагмента SQL ? [ Выберите все правильные ответы] Truncat e table aut os Begin t ran I nsert aut os (m ake, m odel) values ('Tucker', "Torpedo" ) I f exist s(select * from aut os) Com m it t ran Else Print "Error: t he row was not insert ed int o t he t able" Rollback t ran • A. Пакет не будет выполнен, поскольку пары begin t ran…com m it t ran не находятся на должном уровне вложенности. • B. После выполнения пакета в таблице не останется ни одной записи. • C. После выполнения пакета в таблице останется одна запись. • D. Будет выполнена надлежащая обработка ошибок.

converted to PDF by BoJIoc

• E. Не будет выполнена надлежащая обработка ошибок. Que stion 1 7 Consider t he following t able definit ion: Creat e t able aut os (m ake varchar(20) not null, m odel varchar(20 ) not null, acquisit ion_cost m oney null, acquisit ion_dat e dat et im e null) What will happen w hen t he follow ing SQL is execut ed? [ Check all correct answers] Truncat e table aut os I nsert aut os (m ake, m odel) values ('Plym out h, "Prow ler" ) I f @@error ! = 0 ret urn Begin t ran I nsert aut os (m ake, m odel) values ('Tucker', "Torpedo" ) I f @@error ! = 0 ret urn I f ( select count (* ) from aut os) = 2 Com m it t ran Else begin Print "Error: t he row was not insert ed int o t he t able" Rollback t ran end • • • • • •

A. The bat ch will fail, because t he begin t ran…com m it t ran pair are not properly nest ed. B. At t he end of t he bat ch, no rows will be in t he t able. C. At t he end of t he batch, t wo rows will be in t he table. D. All proper error handling will be perform ed. E. All proper error handling will not be perform ed. F. The bat ch will fail, because of m ism at ched quot es in t he insert st at em ent s.

Вопрос 1 7 Имеется следующее определение таблицы: Creat e t able aut os (m ake varchar(20) not null, m odel varchar(20 ) not null, acquisit ion_cost m oney null, acquisit ion_dat e dat et im e null) Что произойдет при выполнении следующего фрагмента SQL ? [ Выберите все правильные ответы] Truncat e table aut os Begin t ran I nsert aut os (m ake, m odel) values ('Plym out h, "Prow ler" ) I f @@error ! = 0 ret urn Begin t ran I nsert aut os (m ake, m odel) values ('Tucker', "Torpedo" ) I f @@error ! = 0 ret urn I f ( select count (* ) from aut os) = 2 Com m it t ran Else begin Print "Error: t he row was not insert ed int o t he t able" Rollback t ran end • A. Пакет не будет выполнен, поскольку пары begin t ran…com m it t ran не находятся на должном уровне вложенности. • B. После выполнения пакета в таблице не останется ни одной записи. • C. После выполнения пакета в таблице останутся две записи.

converted to PDF by BoJIoc

• D. Будет выполнена надлежащая обработка ошибок. • E. Не будет выполнена надлежащая обработка ошибок. • F. Пакет не будет выполнен из- за несовпадения кавычек и апострофов в командах вставки. Que stion 1 8 You are creat ing a database t o cont ain m em ber inform at ion for a social group. What is w rong wit h he following design? [ Check all correct answers] Creat e t able m em ber (last_ nam e char(20 ) null, first _nam e varchar(30) not null, address_line1 v archar(30) null, address_line2 v archar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_nam e char(30) not null) • • • • • • •

A. This t able is not norm alized. B. Dat a t ypes are chosen poorly. C. Colum n null propert ies are not chosen well. D. All fields are required. E. No fields are required. F. Som e fields are required t hat probably should not be. G. Som e fields are not required t hat probably should be.

Вопрос 1 8 Вы создаете базу данных для хранения информации о членах общественной группы. Какими недостатками обладает следующая структура? [ Выберите все правильные ответы] Creat e t able m em ber (last_ nam e char(20 ) null, first _nam e varchar(30) not null, address_line1 v archar(30) null, address_line2 v archar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_nam e char(30) not null) • • • • • • •

A. Таблица не нормализована. B. Неудачно выбраны типы данных. C. Неудачно выбраны свойства обязательности полей (null/ not null) . D. Все поля являются обязательными. E. Ни одно поле не является обязательным. F. Некоторые из обязательных полей следовало бы сделать необязательными. G. Некоторые из необязательных полей следовало бы сделать обязательными.

Que stion 1 9 You are creat ing a database t o cont ain m em ber inform at ion for a social group. What could you change t o m ake t he design bet t er? [ Check all correct answers] Creat e t able m em ber (last_ nam e char(20 ) null, first _nam e varchar(30) not null, address_line1 v archar(30) null, address_line2 v archar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_nam e char(30) not null) • • • • •

A. Mak e last nam e not null. B. Create a candidat e key for t he t able. C. Norm alize t he address fields int o a different t able. D. Make all charact er colum ns fix ed lengt h. E. Make all charact er colum ns variable lengt h.

converted to PDF by BoJIoc

Вопрос 1 9 Вы создаете базу данных для хранения информации о членах общественной группы. Как можно улучшить структуру базы? [ Выберите все правильные ответы] Creat e t able m em ber (last_ nam e char(20 ) null, first _nam e varchar(30) not null, address_line1 v archar(30) null, address_line2 v archar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_nam e char(30) not null) • • • • •

A. Запретить null в столбце фамилии (last_nam e) . B. Создать для таблицы возможный ключ. C. Нормализовать адресные поля в отдельную таблицу. D. Объявить все символьные столбцы с фиксированной длиной. E. Объявить все символьные столбцы с переменной длиной.

Que stion 2 0 The following t able will t ake up how m any pages for 100 000 row s? creat e t able MyTable ( a int not null, b char(400) not null, c dat et im e not null ) • • • • •

A. 100 000 . B. 50 000. C. 20 000. D. 10 000. E. 6000.

Вопрос 2 0 Сколько страниц потребуется для 100 000 записей следующей таблицы? creat e t able MyTable ( a int not null, b char(400) not null, c dat et im e not null ) • • • • •

A. 100 000 . B. 50 000. C. 20 000. D. 10 000. E. 6000.

Que stion 2 1 The following t able, wit h a clust ered index on colum n a, will t ake up how m any pages for 100 000 rows? creat e t able MyTable ( a int not null, b char(400) not null, c dat et im e not null ) • • • • •

A. 100 000 . B. 50 000. C. 20 000. D. 10 000. E. 6000.

Вопрос 2 1 Сколько страниц потребуется для 100 000 записей следующей таблицы с кластерным индексом по столбцу a? creat e t able MyTable

converted to PDF by BoJIoc

( a int not null, b char(400) not null, c dat et im e not null ) • • • • •

A. 100 000 . B. 50 000. C. 20 000. D. 10 000. E. 6000.

Que stion 2 2 What do you need t o do t o place t he following t able in t hird norm al form ? [ Check all correct answers] creat e t able Address ( AddressI d int not null, St reetAddress varchar(120), City varchar(120) , St ate varchar(120) , ZipCode char(9 ), PhoneNum ber1 v archar(10), PhoneNum ber2 v archar(10), PhoneNum ber3 v archar(10), St ateTaxRat e num eric(5,3) , PriceOfTea num eric(10,2) , prim ary key ( AddressI d) ) • • • • •

A. Rem ove t he phone repeat ing group. B. Turn t he phone repeat ing group int o an array. C. Rem ove t he st at e tax rate. D. Rem ove t he price of t ea. E. This t able is already in t hird norm al form .

Вопрос 2 2 Что необходимо сделать для преобразования следующей таблицы в третью нормальную форму? [ Выберите все правильные ответы] creat e t able Address ( AddressI d int not null, St reetAddress varchar(120), City varchar(120) , St ate varchar(120) , ZipCode char(9 ), PhoneNum ber1 v archar(10), PhoneNum ber2 v archar(10), PhoneNum ber3 v archar(10), St ateTaxRat e num eric(5,3) , PriceOfTea num eric(10,2) , prim ary key ( AddressI d) ) • • • • •

A. Удалить повторяющуюся группу с номерами телефонов. B. Преобразовать повторяющуюся группу с номерами телефонов в массив. C. Удалить налоговую ставку штата ( St at eTaxRat e) . D. Удалить цену чая ( PriceOfTea) . E. Таблица уже находится в третьей нормальной форме.

Que stion 2 3 Consider t he following t able definit ion: Creat e t able m em ber (last_ nam e char(20 ) null, first _nam e varchar(30) not null, address_line1 v archar(30) null, address_line2 v archar(30) null,

converted to PDF by BoJIoc

address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_nam e char(30) not null) Assum ing t his is t he only query on t he t able, how would you index for a nam e search ( on last nam e, on last nam e and first nam e, or part ial st ring searches)? • • • • • •

A. Clust ered on ( first _nam e, last _nam e) . B. Nonclust ered on ( first _nam e, last _nam e). C. Clustered on ( last _nam e, first _nam e) . D. Nonclustered on ( last _nam e, first _nam e) . E. No index is necessary. F. None of t he above.

Вопрос 2 3 Имеется следующее определение таблицы: Creat e t able m em ber (last_ nam e char(20 ) null, first _nam e varchar(30) not null, address_line1 v archar(30) null, address_line2 v archar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_nam e char(30) not null) Как индексировать таблицу для поиска по имени (по last _nam e, по last _nam e и first_nam e или по частичному вхождению строк) в предположении, что это единственный тип запросов? • • • • • •

A. Создать кластерный индекс по ( first _nam e, last _nam e). B. Создать некластерный индекс по ( first _nam e, last _nam e) . C. Создать кластерный индекс по ( last_nam e, first _nam e). D. Создать некластерный индекс по ( last _nam e, first _nam e) . E. Индекс не требуется. F. Ни один из перечисленных ответов.

Que stion 2 4 Which of t he following can be accom plished wit h t riggers? [ Check all correct answers] • • • • •

A. Referent ial int egrit y enforcem ent . B. Com plex business rule checking based on before and aft er im ages of t he dat a. C. Rolling back t he t ransact ion t hat fired t he t rigger. D. Addit ional t able m odificat ions of t he base t able or ot her t ables. E. Triggers are no longer available in version 7 .

Вопрос 2 4 Какие из следующих задач решаются с помощью триггеров? [ Выберите все правильные ответы] • • • • •

A. Обеспечение ссылочной целостности. B. Проверка сложных деловых правил, основанных на образах данных до и после операции. C. Откат транзакции, вызвавшей срабатывание триггера. D. Дополнительные модификации базовой таблицы или других таблиц. E. В версии 7 триггеры не поддерживаются.

Que stion 2 5 What is t he value of @@t rancount prior t o entering a t ransact ion? • • • • •

A. null B. 0 C. 1 D. 10 E. I nsufficient inform at ion is provided.

Вопрос 2 5 Чему равно значение @@t rancount до входа в транзакцию? • A. null • B. 0 • C. 1

converted to PDF by BoJIoc

• D. 10 • E. Приведенной информации недостаточно. Que stion 2 6 What is t he value of @@t rancount aft er an unqualified rollback ? • • • • •

A. null B. 0 C. 1 D. 10 E. I nsufficient inform at ion is provided.

Вопрос 2 6 Чему равно значение @@t rancount после неопределенного отката? • • • • •

A. null B. 0 C. 1 D. 10 E. Приведенной информации недостаточно.

Que stion 2 7 Consider t he following st ored procedure: Creat e procedure lookup (@a int ) As I f @a is null Begin Print "You forgot t o pass in a param et er" Ret urn End select * from sysobject s where id = @a ret urn What will happen if t his stored procedure is execut ed w it hout a param et er? • • • • •

A. The st ored procedure will print "You forgot t o pass in a param et er" B. The st ored procedure will do a lookup based on no param et er, ret urning all rows in a t able. C. The st ored procedure will fail before it is run. D. The server will print a m essage st at ing t hat you m ust provide a default value. E. The server will print an error st at ing t hat you m ust prov ide a default value.

Вопрос 2 7 Имеется следующая хранимая процедура: Creat e procedure lookup (@a int ) As I f @a is null Begin Print "You forgot t o pass in a param et er" Ret urn End select * from sysobject s where id = @a ret urn Что произойдет, если выполнить эту процедуру без параметра? • • • • •

A. Хранимая процедура выведет сообщение "You forgot t o pass in a param eter" . B. Хранимая процедура выполнит просмотр без параметров и вернет все записи таблицы. C. Хранимая процедура не будет выполнена. D. Сервер выведет сообщение, напоминающее о необходимости задать значение по умолчанию. E. Сервер выдаст сообщение об ошибке с напоминанием задать значение по умолчанию.

Que stion 2 8 The following st at em ent was executed in osql: creat e t able MyTable ( a int null, b char(400) null, c dat et im e

converted to PDF by BoJIoc

) Which answers best describe t he result s of t he st at em ent ? [ Check all correct answers] • • • • •

A. MyTable is creat ed in t he database. B. All t he colum ns in the table allow nulls. C. All t he colum ns except colum n C allow nulls. D. MyTable is not creat ed, because char cannot be 400 charact ers. E. Colum n a has been declared t he prim ary key.

Вопрос 2 8 В osql была выполнена следующая команда: creat e t able MyTable ( a int null, b char(400) null, c dat et im e ) Какие ответы лучше всего описывают результаты команды? [ Выберите все правильные ответы] • • • • •

A. В базе данных создается таблица MyTable. B. Все столбцы таблицы допускают значения null. C. Все столбцы таблицы, кроме столбца C, допускают значения null. D. Таблица MyTable не создается, поскольку тип char не может иметь длину 400 символов. E. Столбец A объявляется первичным ключом.

Que stion 2 9 Which of t he following answers best describes t he result s of t he following CREATE TABLE st at em ent ? Creat e t able MyTable (id int not null, price sm allm oney not null, m arkup num eric (5 ,2 ) not null, m srp as price * (1 + (m ark up/ 100) )) • • • •

A. SQL Server st ores a four- colum n t able. B. SQL Server st ores a t hree-colum n t able t hat act s lik e a four-colum n t able. C. A t able is created that only allows null in t he m srp colum n. D. The m arkup colum n is seven digit s wide.

Вопрос 2 9 Какое из перечисленных утверждений лучше всего описывает результаты выполнения следующей команды CREATE TABLE? Creat e t able MyTable (id int not null, price sm allm oney not null, m arkup num eric (5 ,2 ) not null, m srp as price * (1 + (m ark up/ 100) )) • A. SQL Server создает таблицу, состоящую из четырех столбцов. • B. SQL Server создает таблицу, состоящую из трех столбцов, которая работает как таблица с четырьмя столбцами. • C. Значения null допускаются только в столбце m srp созданной таблицы. • D. Ширина столбца m arkup равна шести символам. Que stion 3 0 Which of t he following st at em ent s are t rue about t he REFERENCES CONSTRAI NT? [ Check all correct answers] • • • • •

A. I nsert s int o t he referencing t able t hat violat e t he reference const raint w ill not be com plet ed. B. The referenced t able m ust already exist w hen t he referencing t able is creat ed. C. The referenced colum n m ust already ex ist when t he referencing t able is creat ed. D. The referenced colum n m ust be t he prim ary k ey or have a unique const raint . E. The referencing t able can have only one reference const raint .

Вопрос 3 0 Какие из следующих утверждений истинны по отношению к ссылочным ограничениям? [ Выберите все правильные ответы] • A. Операции вставки в ссылающуюся таблицу, нарушающие ссылочную целостность, не завершаются.

converted to PDF by BoJIoc

• B. Таблица, на которую указывает ссылка, должна существовать к моменту создания ссылающейся таблицы. • C. Столбец, на который указывает ссылка, должен существовать к моменту создания ссылающейся таблицы. • D. Столбец, на который указывает ссылка, должен быть первичным ключом или иметь ограничение уникальности. • E. Ссылающаяся таблица может иметь лишь одно ссылочное ограничение. Que stion 3 1 Which of t he following st at em ent s are t rue about t he ALTER TABLE st at em ent? • A. Colum ns can be dropped wit h t he ALTER TABLE st at em ent , even if t hey are referenced by a foreign key . • B. NOT NULL colum ns can be added t o a table wit h t he ALTER TABLE st at em ent , provided t he colum ns are declared with a default value. • C. I dent it y colum ns cannot be added t o a t able wit h t he ALTER TABLE st at em ent aft er is has been populat ed. • D. None of t he above. Вопрос 3 1 Какие из следующих утверждений истинны по отношению к команде ALTER TABLE? • A. Команда ALTER TABLE может удалять столбцы даже в том случае, если на них имеется ссылка во внешнем ключе. • B. Команда ALTER TABLE может включать в таблицу столбцы NOT NULL при условии, что эти столбцы объявлены со значением по умолчанию. • C. Команда ALTER TABLE не может добавить в таблицу столбцы счетчика после ее заполнения. • D. Ни одно из перечисленных утверждений. Que stion 3 2 Consider t he following t able: Creat e t able # atable ( a int null, b varchar(25) null) Which of t he following st at em ent s are t rue? [ Check all correct answers] • • • • •

A. # at able is a t em porary t able. B. # at able is accessible t o all users. C. # at able is accessible only to it s creator. D. # at able is delet ed when a creat or disconnect s. E. # at able is creat ed in t he current dat abase.

Вопрос 3 2 Имеется следующая таблица: Creat e t able # atable ( a int null, b varchar(25) null) Какие из следующих утверждений истинны? [ Выберите все правильные ответы] • • • • •

A. Таблица # atable является временной. B. Таблица # atable доступна для всех пользователей. C. Таблица # at able доступна только для своего создателя. D. Таблица # at able удаляется при отключении создателя. E. Таблица # atable создается в текущей базе данных.

Que stion 3 3 Which of t he following is t rue about full-t ex t indexing? • • • •

A. Full- t ext indexes are st ored in t he file sy st em . B. Tables are allowed m ult iple full- t ext index es. C. Full- t ext indexes are creat ed, m anaged, and dropped by Transact -SQL st atem ent s. D. None of t he above.

Вопрос 3 3 Какие из следующих утверждений истинны по отношению к полнотекстовому индексированию? • A. Полнотекстовые индексы хранятся в файловой системе. • B. Таблицы могут содержать несколько полнотекстовых индексов. • C. Полнотекстовые индексы создаются, обрабатываются и удаляются командами Transact -SQL.

converted to PDF by BoJIoc

• D. Ни одно из перечисленных утверждений. Que stion 3 4 Which st ored procedure enables full- t ext indexing for a dat abase? • • • •

A. sp_full_t ext _dat abase. B. sp_fulltext _database. C. sp_fullt ext _enable. D. None of t he above.

Вопрос 3 4 Какая хранимая процедура разрешает полнотекстовое индексирование для базы данных? • • • •

A. sp_full_t ext _dat abase. B. sp_fulltext _database. C. sp_fullt ext _enable. D. Ни одна из перечисленных.

Que stion 3 5 What will happen w it h t he following query? SELECT Tit les FROM MyBooks WHERE CONTAI NS( Descript ion, ' "Caj un Cooking" ') • A. A query will be perform ed on MyTable looking t o find Descript ions containing t he phrase "Caj un Cook ing" . • B. A full- t ext query w ill be perform ed on MyTable looking t o find Descript ions cont aining t he phrase "Caj un Cooking" . • C. A query will be perform ed on MyTable looking t o find Descript ions st art ing wit h the phrase "Caj un Cook ing" . • D. A full- t ext query will be perform ed on MyTable looking t o find Descript ions cont aining t he words " Caj un" and "Cook ing" . Вопрос 3 5 Что произойдет при выполнении следующего запроса? SELECT Tit les FROM MyBooks WHERE CONTAI NS( Descript ion, ' "Caj un Cooking" ') • A. К MyTable будет применен запрос для поиска всех записей, у которых столбец Descript ion содержит фразу " Caj un Cook ing" . • B. К MyTable будет применен полнотекстовый запрос для поиска всех записей, у которых столбец Descript ion содержит фразу "Caj un Cooking". • C. К MyTable будет применен запрос для поиска всех записей, у которых столбец Descript ion начинается с фразы "Caj un Cook ing" . • D. К MyTable будет применен полнотекстовыйый запрос для поиска всех записей, у которых столбец Descript ion содержит слова "Caj un" и "Cook ing" . Que stion 3 6 What will happen w it h t he following query? SELECT Tit les, CategoryNam e FROM MyBooks WHERE CONTAI NS( Descript ion, 'FORMSOF( I NFLECTI ONAL, "Spicy ") ') • A. A full- t ext query w ill be perform ed looking for Descript ions cont aining t he w ord "Spicy ". • B. A query will be perform ed looking for Descript ions containing t he word " Spicy ". • C. A full- t ext query w ill be perform ed looking for Descript ions start ing wit h t he w ord "Spicy" . • D. A query will be perform ed looking for Descript ions start ing wit h t he word "Spicy ". • E. A full- t ext query w ill be perform ed looking for Descript ions cont aining the word or any form s of t he word "Spicy" . Вопрос 3 6 Что произойдет при выполнении следующего запроса? SELECT Tit les, CategoryNam e FROM MyBooks WHERE CONTAI NS( Descript ion, 'FORMSOF( I NFLECTI ONAL, "Spicy ") ')

converted to PDF by BoJIoc

• A. Будет применен полнотекстовый запрос для поиска записей, в которых столбец Descript ion содержит слово " Spicy" . • B. Будет применен запрос для поиска записей, в которых столбец Descript ion содержит слово "Spicy" . • C. Будет применен полнотекстовый запрос для поиска записей, в которых столбец Descript ion начинается со слова "Spicy ". • D. Будет применен запрос для поиска записей, в которых столбец Descript ion начинается со слова "Spicy ". • E. Будет применен полнотекстовый запрос для поиска записей, в которых столбец Descript ion содержит слово " Spicy" или любые его формы. Que stion 3 7 Which of t he following st at em ent s are t rue? [ Check all correct answers] SELECT t it le FROM MyBooks WHERE CONTAI NS( Descript ion, 'I SABOUT (Caj un WEI GHT(0.9) , Cooking WEI GHT(0.5)) ') • A. The phrase "Caj un Cook ing" is given m ore weight t han j ust t he word "Cooking" it self. • B. The word "Cooking" should be near "Caj un" . • C. The full- t ext query will be done on MyTable look ing t o find Descript ions cont aining t he words "Caj un" and "Cook ing" . • D. A full- t ext query will be done on t he phrase "Cajun Cooking". • E. None of t he above. Вопрос 3 7 Какие из следующих утверждений истинны? [ Выберите все правильные ответы] SELECT t it le FROM MyBooks WHERE CONTAI NS( Descript ion, 'I SABOUT (Caj un WEI GHT(0.9) , Cooking WEI GHT(0.5)) ') • A. Фразе "Cajun Cooking" присваивается больший вес, чем отдельному слову " Cooking" . • B. Слово " Cooking" должно находиться рядом с "Caj un". • C. К MyTable будет применен полнотекстовый запрос для поиска всех записей, в которых столбец Descript ion содержит слова "Caj un" и "Cook ing" . • D. Будет выполнен полнотекстовый запрос для поиска фразы "Cajun Cooking". • E. Ни одно из перечисленных утверждений. Que stion 3 8 What m et hods can be used t o m inim ize deadlock occurrences? [ Check all correct answers] • A. Av oid t he use of holdlock. • B. Writ e t ransact ions so t hat when different t ransact ions m odify t he sam e tables, t he t ables are accessed in t he sam e order. • C. Do not allow user interact ion wit h the dat abase during a t ransact ion. • D. All of t he above. Вопрос 3 8 Какими способами можно уменьшить частоту возникновения взаимных блокировок? [ Выберите все правильные ответы] • A. Избегать использования holdlock . • B. Записывать транзакции так, чтобы при модификации одних и тех же таблиц несколькими транзакциями обращения к таблицам происходили в одинаковом порядке. • C. Не разрешать пользователям взаимодействовать с базой данных во время транзакции. • D. Всеми перечисленными способами. Que stion 3 9 Given t he following query and SHOWPLAN_TEXT out put , what is t rue about t he query? select * from t it les where t it le_ id = 'BU1111' St m t Text -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- - -- -- -- - - -- -- - -- -- | - -Clust ered I ndex Seek( pubs..t it les.UPKCL_ t it leidind, SEEK: ( t it les.t it le_ id= @1) ORDERED)

converted to PDF by BoJIoc

• • • • •

A. The query w ould be executed using t he clustered index. B. The query w ould be executed using the nonclust ered index. C. The clustered index, UPKCL_t it leidind, w ould be used t o execut e t he query. D. A t able scan is perform ed. E. The nonclust ered index, UPKCL_t it leidind, would be used t o execute t he query.

Вопрос 3 9 Какие утверждения являются истинными для следующего запроса и результата его выполнения при включенном параметре SHOWPLAN_TEXT? select * from t it les where t it le_ id = 'BU1111' St m t Text -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- -- - -- -- -- -- - -- -- -- - - -- -- - -- -- | - -Clust ered I ndex Seek( pubs..t it les.UPKCL_ t it leidind, SEEK: ( t it les.t it le_ id= @1) ORDERED) • • • • •

A. Запрос будет выполнен с использованием кластерного индекса. B. Запрос будет выполнен с использованием некластерного индекса. C. Для выполнения запроса будет использован кластерный индекс UPKCL_ t it leidind. D. Будет выполнено сканирование таблицы. E. Для выполнения запроса будет использован некластерный индекс UPKCL_t it leidind.

Que stion 4 0 What st ored procedures would be used t o help ident ify lock usage on a server? • • • •

A. sp_help. B. sp_who. C. sp_help 'locks'. D. sp_lock.

Вопрос 4 0 Какие хранимые процедуры следует использовать для идентификации блокировок на сервере? • • • •

A. sp_help. B. sp_who. C. sp_help 'locks'. D. sp_lock.

ГЛАВА 1 9

Ответы на вопросы экзамена 1. C, E

14. B, C

27. C

2. A

15. B, E

28. A, B

3. E

16. C, E

29.B

4. B

17. C, D

30. A, B, C, D

5. D

18. A, B, C, F, G 31. B

6. A

19. A, B, C, E

32. A, C, D

7. C

20. E

33. A

8. C

21. E

34. B

9. E

22. A, C, D

35. B

10. E

23. D

36. E

11. D

24. A, B, C, D

37. A, B, C

12. B

25. E

38. D

13. A, B, 26. B

39. C

40.D

Вопрос 1 Правильные ответы — C и E; в обоих случаях правильно задается положение дефиса в шестом символе кода. Ответ A неверен — третий параметр st uff определяет количество удаляемых символов, поэтому

converted to PDF by BoJIoc

шестой символ будет заменен дефисом (- ). Ответ B неверен, нумерация позиций в функции subst ring начинается с 1 , а не с 0. Ответ D неверен, поскольку третий параметр определяет не количество извлекаемых символов, а конечную позицию. Вопрос 2 Правильный ответ — A. Ограничение первичного ключа гарантирует, что все записи таблицы однозначно идентифицируются первичным ключом. Ответ B неверен. Хотя ограничение первичного ключа может повысить быстродействие запросов, это не является главной целью введения ограничений. Ответ C неверен; хотя ограничение первичного ключа способно уменьшить конкуренцию за счет того, что разные пользователи модифицируют разные страницы данных, это не является главной целью. Наконец, ответ D неверен, поскольку ограничение первичного ключа используется для обеспечения ссылочной целостности, а не целостности доменов. Вопрос 3 Правильный ответ — E. Фиксированный размер записи равен 412 байтам: 4 байта для столбца A + 400 байт для столбца B + 8 байт для столбца C. Маска NULL занимает целую часть 2+ ( (3 столбца + 7)/ 8) , или 3. Следовательно, общий размер записи равен 415 байтам. Количество записей на страницу равно 8096/ (415+ 2), округленному до ближайшего целого, или 19 записей на страницу. Общее количество страниц равно 100 000 записей/ 19 записей на страницу, то есть 5264 страниц или 42 112 Кбайт. Ответы A, B, C и D неверны, поскольку указанный в них объем дискового пространства отличается от необходимого для приведенной таблицы. Вопрос 4 Правильный ответ — B. Ответ A неверен, поскольку при удалении из OrderLine происходит каскадное удаление из базовой таблицы, однако удаление записей из Order может привести к появлению «бесхозных» записей в таблице OrderLine. Ответ C неверен, поскольку такой триггер вообще не позволит удалять записи. Ответ D неверен, поскольку правильный ответ присутствует в списке. Вопрос 5 Правильный ответ — D. Таблица не нормализована. Три атрибута телефонных номеров образуют повторяющуюся группу. Ответы A, B и C неверны, поскольку таблица не нормализована. Вопрос 6 Правильный ответ — A. Таблица не содержит повторяющихся групп, поэтому она соответствует требованиям хотя бы первой нормальной формы. Ответ B неверен, поскольку поле PriceOfTea не связано с AddressI d. Ответ C неверен; если таблица не находится во второй нормальной форме, она не может находиться в третьей нормальной форме. Ответ D неверен, поскольку таблица нормализована. Вопрос 7 Правильный ответ — C. Таблица находится в третьей нормальной форме, она была нормализована с исключением повторяющихся групп атрибутов. Из таблицы удалены все избыточные данные и частичные зависимости, а все существующие атрибуты зависят от первичного ключа. Ответ B неверен; хотя таблица находится во второй нормальной форме, это не лучший ответ. Ответ A неверен; хотя таблица находится в первой нормальной форме, это не лучший ответ. Ответ D неверен, поскольку таблица находится в третьей нормальной форме. Вопрос 8 Правильный ответ — C. Ответ C правильно описывает последствия приведенной команды. Поскольку файл журнала не задан, он автоматически создается с именем базы данных и расширением .ldf. Ответ A неверен, вы не обязаны задавать имена файлов в команде CREATE DATABASE. Ответ B неверен, поскольку в SQL Server 7 данные и журнал не могут храниться в одном файле. Ответ D неверен, поскольку использование стандартных расширений файлов — всего лишь рекомендация, а не обязательное требование. Вопрос 9 Правильный ответ — E. Ответы A и B неверны, поскольку уникальность столбцов счетчика не распространяется на разные таблицы, не говоря уже о разных серверах. Ответ C неверен, поскольку создание таблиц со столбцом I D типа uniqueident ifier позволит генерировать уникальные идентификаторы, но он уступает ответу E, в котором уникальные идентификаторы генерируются автоматически. Ответ D неверен, поскольку функции GETI D() не существует.

converted to PDF by BoJIoc

Вопрос 1 0 Правильный ответ — E. Ответ A неверен, поскольку процедура может вызываться как внутри транзакции, так и за ее пределами. Ответы B и C неверны, поскольку MyP1 присваивает значение переменной @B до проверки @@ERROR. Следовательно, значение @@ERROR будет потеряно. Ответ D неверен, поскольку хранимая процедура имеет правильный синтаксис SQL. Вопрос 1 1 Правильный ответ — D. Ответ A неверен; хотя он и вносит нужные изменения, но содержит лишние действия, замедляющие работу. Ответ B неверен, поскольку модификация таблицы завершится неудачей. Нельзя удалить столбец, имеющий значение по умолчанию. Ответ C неверен; хотя он и будет работать, но потребует больше времени и ресурсов, чем ответ D. Ответ D позволяет удалить столбец без повторного создания таблицы и учитывает значение по умолчанию. Вопрос 1 2 Правильный ответ — B. Параметр - E разрешает вставку значений столбцов счетчика программой bcp. Ответ A неверен, поскольку параметр -I не относится к числу допустимых параметров bcp. Ответ C неверен, поскольку вставка столбцов счетчика не разрешается на уровне базы данных. Ответ D неверен, поскольку данные можно загрузить с параметром -E. Вопрос 1 3 Ответы A, B и C верны, поскольку для обеспечения доменной целостности используются значения по умолчанию, правила и триггеры. Ответ D неверен, поскольку внешние ключи используются для ограничения ссылочной, а не доменной целостности. Вопрос 1 4 Правильные ответы — B и C. Ответ A неверен, поскольку команда имеет правильный синтаксис SQL и будет выполнена. Ответ D неверен, поскольку COMPUTE будет генерировать запись при каждом изменении t it le_id, а не au_id. Вопрос 1 5 Правильные ответы — B и E. Ответ A неверен, поскольку пары BEGI N TRAN...COMMI T TRAN не обязаны быть вложенными. Ответ C неверен, поскольку запись будет удалена либо по команде ROLLBACK TRAN, либо вследствие ошибки базы данных. Ответ D неверен, поскольку значение @@ERROR не проверяется после каждой команды SQL. Ответ B правилен, поскольку команда I F EXI STS проверяет наличие записей в таблице. Если записи остались, вставки откатываются. Поскольку перед транзакцией выполнялась команда TRUNCATE TABLE, записей не останется. Вопрос 1 6 Правильные ответы — C и E. Ответ C правилен, поскольку команда ROLLBACK TRAN выполняется всегда, но не является частью транзакции. Ответ A неверен, поскольку пары BEGI N TRAN...COMMI T TRAN не обязаны быть вложенными. Ответ D неверен, поскольку значение @@ERROR не проверяется после каждой команды SQL. Вопрос 1 7 Правильные ответы — C и D. Ответ C правилен, поскольку обе записи будут успешно вставлены. Ответ A неверен, поскольку пары BEGI N TRAN...COMMI T TRAN не обязаны быть вложенными. Ответ B неверен, поскольку ROLLBACK TRAN не влияет на записи, не участвующие в транзакции. Ответ E неверен, поскольку значение @@ERROR проверяется после каждой команды SQL. Остается правильный ответ — D. Ответ F неверен, поскольку в команде вставки допускаются как кавычки, так и апострофы (при условии, что для кавычек существуют парные кавычки, а для апострофов — парные апострофы). Вопрос 1 8 Правильные ответы — A, B, C, F и G. Утверждение A истинно, поскольку наличие двух наборов адресов в таблице означает, что таблица еще не была должным образом нормализована. Ответ B правилен, поскольку аналогичные типы данных не согласованы (например, тип Address2_ line2 должен совпадать с типом Address1_line2 , а тип first _nam e — с типом spouse_nam e). Ответ C тоже верен, поскольку выбранные типы предполагают наличие супруга (spouse) у каждого члена группы, а также обязательное наличие второго адреса при возможном отсутствии первого. Таким образом, ответы F и G тоже оказываются верными. Ответы D и E неверны, поскольку NULL соответствует необязательным атрибутам, а NOT NULL — обязательным атрибутам.

converted to PDF by BoJIoc

Вопрос 1 9 Правильные ответы — A, B, C и E. Ответ A правилен, поскольку поле фамилии (last_nam e) , скорее всего, должно быть обязательным. Ответ B правилен, поскольку в настоящий момент в таблице отсутствует ключ, а первичный ключ рекомендуется иметь в каждой таблице. Ответ C правилен, поскольку таблица не нормализована до уровня первой нормальной формы. Для этого следует выделить адресную информацию в отдельную таблицу. Ответ D неверен, поскольку VARCHAR занимает меньше памяти и быстрее работает. Вопрос 2 0 Правильный ответ — E. Фиксированный размер записи равен 412 байтам: 4 байта для столбца A + 400 байт для столбца B + 8 байт для столбца C. Маска NULL занимает целую часть 2+ ( (3 столбца + 7)/ 8) , или 3. Следовательно, общий размер записи равен 415 байтам. Количество записей на страницу равно 8096/ (415+ 2), округленному до ближайшего целого, или 19 записей на страницу. Общее количество страниц равно 100 000 записей/ 19 записей на страницу, то есть 5264 страницы. Ответы A, B, C и D неверны, поскольку в них указано неверное число страниц. Вопрос 2 1 Правильный ответ — E. Фиксированный размер записи равен 412 байт: 4 байт для столбца A + 400 байт для столбца B + 8 байт для столбца C. Маска NULL занимает целую часть 2+ ( (3 столбца + 7)/ 8) , или 3. Следовательно, общий размер записи равен 415 байтам. Количество записей на страницу равно 8096/ (415+ 2), округленному до ближайшего целого, или 19 записей на страницу. Общее количество страниц равно 100 000 записей/ 19 записей на страницу, то есть 5264 страницы. Даже при наличии нескольких индексов объем таблицы не вырастет более чем вдвое. Ответы A, B, C и D неверны, поскольку в них указано неверное число страниц. Вопрос 2 2 Правильные ответы — A, C и D. Ответ A правилен, поскольку повторяющиеся группы нарушают требования первой нормальной формы. Ответы C и D верны, поскольку указанные атрибуты не зависят от первичного ключа и, следовательно, нарушают требования третьей нормальной формы. Ответ B неверен — в SQL нет такой структуры данных, как массив. Ответ E неверен, поскольку для соответствия таблицы третьей нормальной форме необходимо выполнить действия, описанные в ответах A, C и D. Вопрос 2 3 Правильный ответ — D. Некластерный индекс по ( last _nam e, first _ nam e) позволит использовать наложение индекса. Ответы A и C неверны, поскольку запрос не будет накладываться. Ответ B неверен, поскольку некластерный индекс по ( first _nam e, last _nam e) не поможет с поиском last nam e. Ответ E неверен, поскольку индекс необходим. Ответ F неверен, поскольку правильный ответ присутствует в списке. Вопрос 2 4 Правильные ответы — A, B, C и D. Все они описывают стандартные функциональные возможности триггеров. Ответ E неверен, поскольку триггеры поддерживаются в SQL Server 7 . Вопрос 2 5 Правильный ответ — E. В тексте вопроса не содержится никакой информации о том, является ли транзакция вложенной, первой или именованной, — мы не можем определить, на каком уровне вложенности она находится. Вопрос 2 6 Правильный ответ — B. Неопределенный откат всегда сбрасывает локальную переменную @@TRANCOUNT в 0. Вопрос 2 7 Правильный ответ — C. Если для параметров хранимой процедуры не определены значения по умолчанию, то попытка вызова без параметров не будет выполнена. Ответы A и B неверны, поскольку процедура работать не будет. Ответы D и E неверны, поскольку сервер не выводит сообщений или ошибок, относящихся к кодированию процедур. Вопрос 2 8 Правильные ответы — A и B. Ответ A правилен, поскольку команда имеет правильный синтаксис, она успешно выполняется и создает My Table. Ответ B правилен, поскольку в osql сеанс по умолчанию настраивается на допустимость NULL при создании таблиц. Следовательно, все столбцы, включая столбец C, будут допускать NULL. По этой причине ответ C неверен. Ответ D тоже неверен, поскольку максимальная

converted to PDF by BoJIoc

длина столбца типа CHAR равна 8000 символам. Ответ E неверен, поскольку для таблицы не определено ограничение первичного ключа. Вопрос 2 9 Правильный ответ — B, поскольку таблица создается с вычисляемым столбцом. Его значение основано на данных, хранящихся в других столбцах, поэтому данные в нем не хранятся, а вычисляются в момент использования. По этой причине ответ A неверен. Ответ C неверен, поскольку столбцы price и m ark up, используемые для вычисления m srp, не допускают NULL, и потому вычисляемый столбец тоже никогда не будет равен NULL. Ответ D неверен, поскольку запись NUMERI C(5 ,2 ) означает пять цифр с двумя разрядами после десятичной запятой. Вопрос 3 0 Правильные ответы — A, B, C и D. Ответ A правильно описывает действие ссылочных ограничений при вставке в ссылающуюся таблицу. Ответы B и C правильны, поскольку суть ссылочного ограничения заключается в том, что таблицы и столбцы, на которые указывает ссылка, должны существовать при создании ограничения. Ответ D правилен, поскольку столбец, на который указывает ссылка, должен быть уникальным или первичным ключом. Ответ E неверен, поскольку таблица может иметь несколько ссылочных ограничений. Вопрос 3 1 Правильный ответ — B. SQL Server позволяет добавлять в таблицу столбцы NOT NULL при условии, что во все существующие записи может быть включено значение этого столбца по умолчанию. Ответ A неверен, поскольку столбцы, на которые имеется ссылка в ограничениях первичного ключа, уникальности, внешнего ключа или проверки, не удаляются. Ответ C неверен, поскольку столбцы счетчика могут включаться в таблицу после ее заполнения. Ответ D неверен, поскольку в списке имеется правильный ответ. Вопрос 3 2 Правильные ответы — A, C и D. Ответ A правилен, поскольку символ # является признаком временной таблицы. Ответ C правилен, поскольку временные таблицы доступны лишь для своих создателей. Ответ D верен, поскольку временная таблица автоматически удаляется при отключении пользователя. Ответ B неверен, поскольку временные таблицы доступны не для всех пользователей, а лишь для своих создателей. Ответ E неверен, поскольку временные таблицы хранятся в t em pdb. Вопрос 3 3 Правильный ответ — A, поскольку полнотекстовые индексы хранятся в файловой системе. Ответ B неверен, поскольку таблица может иметь лишь один полнотекстовый индекс. Ответ C неверен, поскольку для работы с расширенными индексами используются хранимые процедуры1. Вопрос 3 4 Правильный ответ — B. Полнотекстовое индексирование в базах данных SQL Server включается хранимой процедурой sp_fullt ext _dat abase. Ответы A и C неверны, поскольку хранимые процедуры sp_full_t ex t_ dat abase и sp_ fullt ex t_enable не существуют. Ответ D неверен, поскольку в списке присутствует правильный ответ. Вопрос 3 5 Правильный ответ — B. Команда определяет полнотекстовый запрос, который ищет в столбце Description фразу «Caj un Cook ing». Ответы A и C неверны, поскольку в них упоминаются обычные запросы, а предикат CONTAI NS используется только в полнотекстовых запросах. Ответ D неверен, поскольку слова «Caj un Cooking» заключены в кавычки, и их поиск осуществляется как поиск единой фразы. Вопрос 3 6 Правильный ответ — E, поскольку функция FORMSOF( I NFLECTI ONAL) разрешает SQL Server искать другие формы указанного слова. Ответ A неверен, поскольку в нем поиск ограничен только исходным словом без других форм. Ответы B и D неверны, поскольку в них упоминаются обычные, а не полнотекстовые запросы. Ответ C неверен, поскольку в нем утверждается, что столбец Descript ion должен начинаться со слова «Spicy» . Вопрос 3 7 Правильные ответы — A, B и C. Они правильно описывают аспекты выполнения полнотекстовых запросов с применением весовых коэффициентов. Ответ D неверен, поскольку в нем упоминается поиск целой фразы. Ответ E неверен, поскольку в списке присутствует правильный ответ.

converted to PDF by BoJIoc

Вопрос 3 8 Правильный ответ — D. Методы, описанные в ответах A, B и C, могут использоваться для уменьшения числа взаимных блокировок. Использование holdlock в хранимых процедурах легко может привести к появлению взаимных блокировок. Транзакции, сохраняющие одинаковый порядок обращения к одним таблицам, помогают избежать взаимных блокировок. Кроме того, взаимодействие с пользователем во время транзакции оставляет открытые монопольные или разделяемые блокировки на время, намного превышающее обычное. Это тоже может стать причиной взаимных блокировок. Вопрос 3 9 Правильный ответ — C. Из результата выполнения запроса видно, что индекс называется UPKCL_t it leidind и является кластерным. С технической точки зрения, ответ A правилен, но ответ C является более точным и потому предпочтительным. Ответы B и E неверны, поскольку из них видно, что для выполнения запроса будет выбран кластерный индекс. Ответ D неверен, поскольку при выборе индекса сканирование таблицы не выполняется. Вопрос 4 0 Правильный ответ — D. Процедура sp_lock используется для идентификации блокировок, используемых на сервере. Ответы A и C неверны, поскольку sp_ help выводит список или описание объектов баз данных, но не блокировок. Ответ B неверен, поскольку процедура sp_who может использоваться для идентификации процессов, заблокированных вследствие конкуренции запросов на блокировку, но не самих блокировок. Приложение А

База данных Pub s

Рис. А.1 . Диаграмма базы данных Pubs Pubs SQL EXEC sp_ addt ype N'em pid', N'char (9 )', N'NOT NULL' GO EXEC sp_ addt ype N'id', N'v archar (11)', N'not null' GO

converted to PDF by BoJIoc

EXEC sp_ addt ype N't id', N'varchar (6 )', N'not null' GO CREATE TABLE [ dbo] .[ st ores] ( [ st or_id] [ char] (4) NOT NULL , [ st or_nam e] [ v archar] (40) NULL , [ st or_address] [ v archar] (40) NULL , [ cit y] [ varchar] (20) NULL , [ st ate] [ char] (2) NULL , [ zip] [ char] (5) NULL , CONSTRAI NT [ UPK_st oreid] PRI MARY KEY CLUSTERED ([ st or_id] ) ON [ PRI MARY] ) GO CREATE TABLE [ dbo] .[ publishers] ( [ pub_ id] [ char] (4) NOT NULL , [ pub_ nam e] [ varchar] (40) NULL , [ cit y] [ varchar] (20) NULL , [ st ate] [ char] (2) NULL , [ count ry] [ varchar] ( 30) NULL CONSTRAI NT [ DF__publishers__count ry__0EA330E9 ] DEFAULT ( 'USA') , CONSTRAI NT [ UPKCL_pubind] PRI MARY KEY CLUSTERED ([ pub_id] ) ON [ PRI MARY] , CHECK ([ pub_id] = '1756 ' or [ pub_ id] = '1622' or [ pub_id] = '0877' or [ pub_id] = '0736' or [ pub_id] = '1389' or ( [ pub_ id] like '99[ 0-9] [ 0 -9 ] ')) ) GO CREATE TABLE [ dbo] .[ aut hors] ( [ au_id] [ id] NOT NULL , [ au_lnam e] [ varchar] (40 ) NOT NULL , [ au_fnam e] [ varchar] (20) NOT NULL , [ phone] [ char] (12) NOT NULL CONSTRAI NT [ DF__aut hors__phone__09DE7 BCC] DEFAULT ('UNKNOWN') , [ address] [ varchar] (40 ) NULL , [ cit y] [ varchar] (20) NULL , [ st ate] [ char] (2) NULL , [ zip] [ char] (5) NULL , [ cont ract ] [ bit ] NOT NULL , CONSTRAI NT [ UPKCL_auidind] PRI MARY KEY CLUSTERED ([ au_ id] ) ON [ PRI MARY] , CHECK (( [ au_id] lik e '[ 0-9] [ 0-9] [ 0-9 ] - [ 0 -9 ] [ 0-9] -[ 0-9] [ 0-9] [ 0 -9 ] [ 0-9] ') ), CHECK (( [ zip] like '[ 0 -9 ] [ 0-9] [ 0-9] [ 0 -9] [ 0-9] ') ) ) GO CREATE I NDEX [ aunm ind] ON [ dbo] .[ aut hors] ( [ au_lnam e] , [ au_fnam e] ) ON [ PRI MARY] GO CREATE TABLE [ dbo] .[ t it les] ( [ t it le_id] [ t id] NOT NULL , [ t it le] [ varchar] (80 ) NOT NULL , [ t ype] [ char] (12) NOT NULL CONSTRAI NT [ DF__t it le__t ype__117F9D94] DEFAULT ('UNDECI DED), [ pub_ id] [ char] (4) NULL ,

converted to PDF by BoJIoc

[ price] [ m oney] NULL , [ advance] [ m oney] NULL , [ royalt y ] [ int ] NULL , [ yt d_ sales] [ int ] NULL , [ not es] [ varchar] (200) NULL , [ pubdat e] [ dat et im e] NOT NULL CONSTRAI NT [ DF__t it les__pubdat e__1367E606] DEFAULT (get dat e( )) , CONSTRAI NT [ UPKCL_t it leidind] PRI MARY KEY CLUSTERED ([ t it le_id] ) ON [ PRI MARY] , FOREI GN KEY ([ pub_id] ) REFERENCES [ dbo] .[ publishers] ( [ pub_id] ) ) GO CREATE I NDEX [ t it leind] ON [ dbo] .[ t it les] ( [ t it le] ) ON [ PRI MARY] GO CREATE TABLE [ dbo] .[ discount s] ( [ discount type] [ varchar] (40) NOT NULL , [ st or_id] [ char] (4) NULL , [ lowqty ] [ sm allint ] NULL , [ highqt y] [ sm allint ] NULL , [ dicount ] [ decim al] (4 , 2) NOT NULL , FOREI GN KEY ([ st or_id] ) REFERENCES [ dbo] .[ st ores] ( [ st or_id] ) ) ON [ PRI MARY] GO CREATE TABLE [ dbo] .[ j obs] ( [ j ob_id] [ sm allint ] I DENTI TY (1 , 1) NOT NULL , [ j ob_desc] [ v archar] (50) NOT NULL , CONSTRAI NT [ DF__j obs__j ob_desc__239E4DCF] DEFAULT (" New posit ion – t it le not form alized yet " ), [ m in_ lv l] [ t inyint ] NOT NULL , [ m ax_lvl] [ t inyint ] NOT NULL , PRI MARY KEY CLUSTERED ([ j ob_id] ) ON [ PRI MARY] CHECK ([ m ax_lvl] < = 250) , CHECK ([ m in_lvl] > = 10) ) GO CREATE TABLE [ dbo] .[ em ployee] ( [ em p_id] [ em pid] NOT NULL , [ fnam e] [ varchar] (20) NOT NULL , [ m init ] [ char] (1) NULL , [ lnam e] [ varchar] (30) NOT NULL , [ j ob_id] [ sm allint ] NOT NULL CONSTRAI NT [ DF__em ployee__j ob_id__2C3393D0] DEFAULT (1 ), [ j ob_lvl] [ t iny int ] NOT NULL CONSTRAI NT [ DF__em ployee__j ob_lvl__2E1 BDC42] DEFAULT (10), [ pub_ id] [ char] (4) NOT NULL CONSTRAI NT [ DF__t it le__pub_ id__2F10007B] DEFAULT ('9952') , [ hire_dat e] [ datet im e] NOT NULL CONSTRAI NT [ DF__em ployee_hire_dat e__30F848ED] DEFAULT (get dat e( )) , CONSTRAI NT [ PK_em p_id] PRI MARY KEY NONCLUSTERED

converted to PDF by BoJIoc

([ em p_ id] ) ON [ PRI MARY] , FOREI GN KEY ( [ j ob_id] ) REFERENCES [ dbo] .[ j obs] ([ job_id] ) , FOREI GN KEY ( [ pub_ id] ) REFERENCES [ dbo] .[ publishers] ( [ pub_ id] ) , CONSTRAI NT [ CK_em p_id] CHECK (( [ em p_id] lik e '[ A- Z] [ A- Z] [ A-Z] [ 1-9] [ 0-9] [ 0 -9 ] [ 0-9] [ 0-9] [ FM] ') or ([ em p_ id] like '[ A- Z] - [ A-Z] [ 1-9] [ 0 -9] [ 0-9] [ 0-9] [ 0 -9 ] [ FM] ')) ) GO CREATE TABLE [ dbo] .[ pub_ info] ( [ pub_ id] [ char] (4) NOT NULL , [ logo] [ im age] NULL , [ pr_info] [ t ext ] NULL , CONSTRAI NT [ UPKCL_pubinfo] PRI MARY KEY CLUSTERED ([ pub_id] ) ON [ PRI MARY] , FOREI GN KEY ( [ pub_ id] ) REFERENCES [ dbo] .[ publishers] ( [ pub_ id] ) ) GO CREATE TABLE [ dbo] .[ roysched] ( [ t it le_id] [ t id] NOT NULL , [ lorange] [ int ] NULL , [ hirange] [ int ] NULL , [ royalt y ] [ int ] NULL , FOREI GN KEY ([ t it le_id] ) REFERENCES [ dbo] .[ t it les] ( [ t it le_ id] ) ) ON [ PRI MARY] GO CREATE I NDEX [ t it leidind] ON [ dbo] .[ roysched] ([ t it le_id] ) ON [ PRI MARY] GO CREATE TABLE [ dbo] .[ sales] ( [ st or_id] [ char] NOT NULL , [ ord_ num ] [ v archar] (20) NOT NULL , [ ord_date] [ dat et im e] NOT NULL , [ qt y] [ sm allint ] NOT NULL , [ payt erm s] [ varchar] (12 ) NOT NULL , [ t it le_id] [ t id] NOT NULL , CONSTRAI NT [ UPKCL_sales] PRI MARY KEY CLUSTERED ([ st or_id] ,[ ord_ num ] ,[ t it le_id] ) ON [ PRI MARY] , FOREI GN KEY ([ st or_id] ) REFERENCES [ dbo] .[ st ores] ( [ st or_id] ), FOREI GN KEY ([ t it le_id] ) REFERENCES [ dbo] .[ t it les] ( [ t it le_ id] ) ) GO CREATE I NDEX [ t it leidind] ON [ dbo] .[ sales] ([ t it le_id] ) ON [ PRI MARY] GO CREATE TABLE [ dbo] .[ t it leaut hor] ( [ au_id] [ id] NOT NULL , [ t it le_id] [ t id] NOT NULL , [ au_ord] [ t inyint ] NULL , [ royalt yper] [ int ] NULL , CONSTRAI NT [ UPKCL_t aind] PRI MARY KEY CLUSTERED

converted to PDF by BoJIoc

([ au_ id] ,[ t it le_id] ) ON [ PRI MARY] , FOREI GN KEY ([ au_ id] ) REFERENCES [ dbo] .[ aut hors] ( [ au_ id] ) , FOREI GN KEY ([ t it le_id] ) REFERENCES [ dbo] .[ t it les] ( [ t it le_ id] ) ) GO CREATE I NDEX [ auidind] ON [ dbo] .[ t it leaut hor] ([ au_ id] ) ON [ PRI MARY] GO CREATE I NDEX [ t it leidind] ON [ dbo] .[ t it leaut hor] ([ t it le_id] ) ON [ PRI MARY] GO CREATE VI EW t it lev iew AS select t it le, au_ ord, au_ lnam e, price, yt d_sales, pub_ id from authors, t it les, t it leaut hor where aut hors.au_id = t it leaut hor.au_id AND t it les.t it le_ id = t it leaut hor.t it le_id GO CREATE PROCEDURE acur @aut h_ cur cursor v arying output , @st at e char(2) = " CA", @ct ype int = 1 AS if (@ct ype = 1) set @aut h_cur = cursor SCROLL for select au_lnam e from authors where st ate = @state else set @aut h_cur = cursor SCROLL for select au_lnam e, au_ fnam e from aut hors open @aut h_cur ret urn 1 CREATE PROCEDURE byroy alt y @percent age int AS select au_id from t it leaut hor where t it leaut hor.royalt yper = @percent age GO CREATE PROCEDURE rept q1 AS select pub_ id, t it le_ id, price, pubdate from t it les where price is NOT NULL order by pub_id COMPUTE avg( price) BY pub_ id COMPUTE avg( price) GO CREATE PROCEDURE rept q2 AS select t ype, pub_ id, t it les.t it le_ id, au_ord, Nam e = subst ring (au_ lnam e, 1, 15) , yt d_sales from t it les, aut hors, t it leaut hor where t it les.t it le_ d = t it leaut hor.t it le_id AND authors.au_id = t it leaut hor.au_id AND pub_id is NOT NULL

converted to PDF by BoJIoc

order by pub_id, t ype COMPUTE avg( yt d_sales) BY pub_id, t ype COMPUTE avg( yt d_sales) BY pub_id GO CREATE PROCEDURE rept q3 @lolim it m oney, @hilim it m oney , @ty pe char(12) AS select pub_ id, t ype, t it le_ id, price from t it les where price> @lolim it AND prce < @hilim it AND t ype = @t ype OR t ype LI KE '% cook% ' order by pub_id, t ype COMPUTE count ( t it le_id) BY pub_ id, t ype GO CREATE TRI GGER em ployee_ insupd ON em ployee FOR insert , UPDATE AS -- Get t he range of level for t his j ob from t he jobs t able declare @m i_ lv l t inyint , @m ax_ lv l t inyint , @em p_ lv l t inyint , @j ob_id sm allint select @m in_ lv l = m in_ lv l, @m ax_ lv l = m ax_lvl, @em p_ lv l = i.j ob_lvl, @j ob_id = i.j ob_id from em ployee e, j obs j , insert ed i where e.em p_id = i.em p_id AND i.j ob_ id = j .j ob_id I F ( @j ob_id = 1) and ( @em p_lvl < > 10) begin raiseerror ( 'Job id 1 expect s t he default level of 10.', 16.1) ROLLBACK TRANSACTI ON end ELSE I F NOT (@em p_lv l BETWEEN @m in_lvl AND @m ax_lvl) begin raiseerror('The level for j ob_) id: % d should be bet ween % d and % d.', 16, 1 , @j ob_id, @m in_ lvl, @m ax_lvl) ROLLBACK TRANSACTI ON end GO Приложение Б

Функции Таблица Б.1. Компоненты даты Компонент

Сокращение Допустимые значения

Год (Year)

Yy

1753-9999

Квартал (Quart er)

Qq

1-4

Месяц (Month)

Mm

1-12

День года (Dayofyear)

Dy

1-366

converted to PDF by BoJIoc

День месяца ( Day )

Dd

1-31

Неделя (Week )

Wk

1-54

День недели (Weekday )

Dw

1-7 (1 = воскресенье)

Час (Hour)

Hh

0-23

Минута (Minut e)

Mi

0-59

Секунда (Second)

Ss

0-59

Миллисекунда (Millisecond) Ms

0-999

Таблица Б.2. Полный список функций SQL Server 7 Функция

Описание

@@CONNECTI ONS

Количество успешных подключений плюс количество неудачных попыток подключения с момента запуска SQL Serv er.

@@CPU_BUSY

Время работы процессора с момента запуска SQL Serv er в миллисекундах.

@@CURSOR_ROWS

Количество записей в последнем открытом курсоре.

@@DATEFI RST

Значение параметра SET DATEFI RST.

@@DBTS

Текущее значение TI MESTAMP для текущей базы.

@@ERROR

Номер ошибки для последней команды TSQL.

@@FETCH_STATUS

Статус выборки для последнего курсора.

@@I DENTI TY

Последнее вставленное значение счетчика.

@@I DLE

Продолжительность периода пассивности SQL Server в миллисекундах.

@@I O_BUSY

Продолжительность выполнения операций ввода/ вывода SQL Server в

converted to PDF by BoJIoc

миллисекундах. @@LANGI D

Идентификатор текущего языка.

@@LANGUAGE

Название текущего языка.

@@LOCK_TI MEOUT

Тайм-аут, установленный для блокировок текущего соединения в миллисекундах.

@@MAX_CONNECTI ONS

Максимальное количество одновременных подключений, разрешенное SQL Server.

@@MAX_PRECI SI ON

Максимальная точность числовых типов.

@@NESTLEVEL

Уровень вложенности хранимой процедуры.

@@OPTI ONS

Текущие значения параметров.

@@PACK_RECEI VED

Количество полученных входных сетевых пакетов.

@@PACK_ SENT

Количество отправленных сетевых пакетов.

@@PACKET_ERRORS

Количество ошибок пакетов.

@@PROCI D

Идентификатор объекта для текущей хранимой процедуры.

@@REMSERVER

имя удаленной базы данных SQL Server.

@@ROWCOUNT

Количество записей, участвовавших в выполнении последней команды.

@@SERVERNAME

Имя локального сервера.

@@SERVI CENAME

Раздел реестра, ассоциированный с SQL Serv er.

converted to PDF by BoJIoc

@@SPI D

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

@@TEXTSI ZE

Текущее значение TEXTSI ZE.

@@TI METI CKS

Количество миллисекунд на один такт таймера.

@@TOTAL_ERRORS

Общее количество ошибок чтения/ записи.

@@TOTAL_READ

Общее количество физических операций чтения с диска.

@@TOTAL_WRI TE

Общее количество физических операций записи на диск.

@@TRANCOUNT

Количество активных транзакций.

@@VERSI ON

Дата, версия SQL Server и тип процессора.

ABS(числовое_выражение)

Модуль числа.

ACOS(вещественное_ выражение)

Арккосинус ( в радианах).

APP_NAME( )

Имя приложения для клиентского процесса.

ASCI I (символьное_выражение)

ASCI I -код первого символа в строке.

ASI N(вещественное_выражение)

Арксинус ( в радианах).

ATAN( вещественное_выражение)

Арктангенс ( в радианах).

ATAN2 (вещественное_выражение1 , вещественное_выражение2)

Определяет арктангенс для тангенса, находящегося в промежутке между двумя выражениями с плавающей запятой.

CASE

Вычисление результата по списку выражений.

CAST

Преобразование типа данных.

converted to PDF by BoJIoc

CEI LI NG

Наименьшее целое, большее либо равное заданной величине.

CHAR(целое_выражение)

Преобразование целого числа в ASCI I -символ.

CHARI NDEX(символьное_выражение,выражение, начало)

Начальная позиция подстроки в выражении (0, если подстрока не найдена) .

COALESCE(выражение1 , выражение2)

Первое выражение, отличное от NULL.

COL_LENGTH(имя_объекта, имя_столбца)

Ширина столбца.

COL_NAME(идентификатор_объекта,идентификатор_столбца)

Имя столбца для заданного объекта.

COLUMNPROPERTY(идентификатор, столбец, свойство)

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

CONVERT( тип_данных,выражение[ ,стиль] )

Преобразование типа данных

COS(вещественное_выражение)

Косинус угла.

COT(вещественное_выражение)

Котангенс угла.

CURRENT_TI MESTAMP

Эквивалент GETDATA() .

CURRENT_USER

Эквивалент USER_NAME( ).

DATABASEPROPERTY(база, свойство)

Информация о свойстве базы данных.

DATALENGTH(символьное_выражение)

Целое число символов в выражении, не считая завершающих пробелов.

DATEADD( компонент,число,выражение_дата)

Дата, полученная прибавлением указанного числа компонентов к заданной дате.

DATEDI FF(компонент,выражение_дата1, выражение_дата2)

Разность дат, выраженная в заданных компонентах.

DATENAME( компонент,выражение_дата)

Компонент даты, выраженный в виде строки. По возможности преобразуется в имя (например,

converted to PDF by BoJIoc

June) . DATEPART(компонент,выражение_дата)

Заданный компонент даты в виде целого числа.

DAY(дата)

Целое число, определяющее день месяца.

DB_I D([ идентификатор_базы] )

Идентификатор базы данных.

DB_NAME([ идентификатор_базы] )

Имя базы данных.

DEGREES( числовое_выражение)

Преобразование радианов в градусы.

DI FFERENCE(символьное_выражение1 , символьное_выражение2 )

Разность между значениями SOUNDEX двух выражений.

EXP(вещественное_ выражение)

Экспонента заданного числа.

FI LE_I D(имя_файла)

Идентификатор логического файла базы данных.

FI LE_NAME(идентификатор_файла)

Имя файла, соответствующее заданному идентификатору.

FI LEGROUP_I D(имя_группы)

Идентификатор, соответствующий имени группы.

FI LEGROUP_NAME(идентификатор_группы)

Имя идентификатора.

FI LEGROUPPROPERTY(имя_группы, свойство)

Значение свойства для заданной группы и имени свойства.

FI LEPROPERTY(имя_файла,свойство)

Значение свойства по именам файла и свойства.

FLOOR(числовое_выражение)

Наибольшее целое, меньшее либо равное заданной величине.

FORMATMESSAGE(номер_сообщения,значение_параметра[ ,.. .n] )

Форматирование сообщения.

FULLTEXTCATALOGPROPERTY(каталог,свойство)

Получение данных о полнотекстовомом каталоге.

FULLTEXTSERVI CEPROPERTY( свойство)

Получение данных о возможности полнотекстового поиска.

converted to PDF by BoJIoc

GETANSI NULL([ база_данных] )

Получение данных о разрешении NULL для базы данных по умолчанию.

GETDATE( )

Текущая системная дата и время.

HOST_I D( )

Текущий идентификатор клиентского процесса на узле.

HOST_NAME()

Текущее имя узла для клиентского процесса.

I DENT_I NCR({ имя_ таблицы| имя_представления} )

Величина приращения столбца счетчика.

I DENT_SEED( { имя_ таблицы| имя_представления} )

Начальное значение столбца счетчика.

I DENT_COL(имя_объекта,идентификатор_индекса,номер_ключа)

Имя индексированного столбца.

I NDEXPROPERTY(идентификатор_таблицы,индекс,свойство)

Получение сведений об индексе.

I S_MEMBER({ группа| роль} )

1 , если текущий пользователь является членом группы NT или роли SQL Server, 0 - если не является, и NULL, если группа/ роль не определена.

I S_SRVROLEMEMBER( роль[ ,имя] )

1 , если имя пользователя входит в роль SQL Server.

I SDATE(выражение)

1 , если выражение определяет допустимую дату.

I SNULL(выражение,константа)

заменяет значения NULL заданной константой.

I SNUMERI C( выражение)

1 , если выражение является числовым.

LEFT(символьное_выражение,целое_выражение)

Заданное число символов от начала строки.

LEN(символьное_ выражение)

Длина строки в символах без учета завершающих пробелов.

converted to PDF by BoJIoc

LOG(вещественное_выражение)

Натуральный логарифм.

LOG10(вещественное_выражение)

Десятичный логарифм.

LOWER(символьное_выражение)

Преобразование строки в нижний регистр.

LTRI M(символьное_выражение)

Удаление начальных пробелов.

MONTH( дата)

Целый номер месяца.

NCHAR(целое_выражение)

Преобразование целого числа в символы Unicode.

NEWI D( )

Создание нового уникального значения для типа данных UNI QUEI DENTI FI ER.

NULLI F( выражение1,выражение2)

NULL, если выражения равны.

OBJECT_I D(имя_объекта)

Идентификатор объекта базы данных.

OBJECT_NAME(идентификатор_объекта)

Имя объекта базы данных.

OBJECTPROPERTY(идентификатор,свойство)

Получение сведений об объектах.

PARSE_NAME(имя_объекта,часть_объекта)

Выделение заданной части полного имени объекта: 1 - имя объекта, 2 - имя владельца, 3 - имя базы данных, 4 имя сервера.

PATI NDEX(% шаблон% ,выражение)

Начальная позиция заданного шаблона в строке.

PERMI SSI ONS([ идентификатор_объекта] ,столбец] )

Маска, определяющая разрешения для пользователя объекта.

PI ()

Константа 3 ,1415926…

POWER( основание,степень)

Возведение в степень.

QUOTENAME(символьное_выражение[ символ_ограничитель] )

Преобразование строки в идентификатор.

converted to PDF by BoJIoc

Ограничителем могут быть апострофы, кавычки или пара квадратных скобок. RADI ANS( )

Преобразование градусов в радианы.

RAND( [ целое_выражение] )

Получение случайного вещественного числа в интервале от 0 до 1 ( необязательное целое выражение используется для раскрутки генератора случайных чисел.) .

Замена всех экземпляров строки REPLACE(символьное_выражение1 ,символьное_выражение2,символьное_выражение3) 2 в строке 1 на строку 3. REPLI CATE(символьное_выражение,целое_выражение)

Повторение строки заданное число раз.

REVERSE(символьное_выражение)

Обратная перестановка строки.

RI GHT(символьное_выражение,целое_выражение)

Заданное число символов в конце строки.

ROUND( числовое_выражение,целое_выражение[ ,функция] )

Округление числового выражения до позиции, задаваемой целым выражением. Если третий аргумент отличен от 0 , ROUND не округляет, а отбрасывает цифры.

RTRI M(символьное_выражение)

Удаление завершающих пробелов.

SI GN(целое_выражение)

+ 1 для положительных чисел, -1 для отрицательных и 0 для нуля.

SI N( вещественное_выражение)

Синус угла.

SOUNDEX(символьное_выражение)

Четырехсимвольная величина,

converted to PDF by BoJIoc

используемая при сравнении строк.

SPACE(целое_выражение)

Построение строки из заданного количества пробелов.

SQRT( вещественное_выражение)

Извлечение квадратного корня.

SQUARE(вещественное_выражение)

Возведение в квадрат.

STATS_DATE(идентификатор_таблицы,идентификатор_индекса)

Время последнего обновления статистики для заданного индекса.

STR(вещественное_выражение[ ,длина[ ,точность] ] )

Преобразование числа в строку.

STUFF(символьное_выражение1,начало,длина,символьное_выражение2)

n символов строки 1 , начиная с заданной начальной позиции, заменяются строкой 2.

SUBSTRI NG( выражение,начало,длина)

Получение подстроки.

SUSER_ I D([ имя_пользователя] )

Идентификатор пользователя SQL Server.

SUSER_NAME([ идентификатор_пользователя] )

Имя пользователя SQL Serv er.

SUSER_ SI D([ имя_пользователя] )

Идентификатор пользователя SQL Server.

SUSER_ SNAME( [ идентификатор_пользователя] )

Имя пользователя SQL Serv er.

SYSTEM_USER

Имя текущего пользователя SQL Server.

TAN(вещественное_выражение)

Тангенс угла.

TSEQUAL(маркер1,маркер2 )

Сравнение двух маркеров TI MESTAMP. Если значения не совпадают, выдается сообщение об ошибке.

TYPEPROPERTY( тип,свойство)

Получение сведений о типе данных.

UNI CODE(выражение_nchar)

Код Unicode первого символа строки.

converted to PDF by BoJIoc

UPPER(символьное_выражение)

Преобразование строки в верхний регистр.

USER( )

Имя текущего пользователя.

USER_I D( [ имя_в_базе] )

Идентификатор пользователя в базе данных.

USER_NAME([ идентификатор_пользователя] ) или SESSI ON_USER

Имя пользователя в базе данных.

USERI D([ пользователь] )

Идентификатор пользователя.

VALI D_NAME( символьное_выражение)

0 , если строка не является допустимым идентификатором.

YEAR( выражение_дата)

Год в виде четырех цифр.

Таблица Б.3. Стили преобразования даты Без указания века С указанием века Формат преобразованной строки -

0 или 100

m on dd yy yy hh: m iAM(или PM)

1

101

m m / dd/ yy

2

102

yy .m m .dd

3

103

dd/ m m / yy

4

104

dd.m m .yy

5

105

dd-m m -yy

6

106

dd m on yy

7

107

m on dd,yy

8

108

hh: m m : ss

-

9 или 109

m on dd,yyyy hh: m i: ss: m m m AM ( или PM)

10

110

m m -dd-yy

11

111

yy / m m / dd

12

112

Yy m m dd

13

113

dd m on yy yy hh: m i: ss: m m m (24-часовая шкала)

14

114

hh: m i: ss: m m m (24-часовая шкала)

20

120

Yyyy -m m -dd hh: m i: ss (24 -часовая шкала)

21

121

yy yy -m m -dd hh: m i: ss: m m m (24- часовая шкала)

Таблица Б.4. Стили преобразования чисел Значение Описание

Пример

0

Стандартное преобразование; 6 цифр; экспоненциальная запись там, 1.23457e+ 006 где это оправдано.

1

Экспоненциальная запись с мантиссой из 8 знаков.

1.2345671e+ 006

2

Экспоненциальная запись с мантиссой из 16 знаков.

1.234567125000000e+ 006

Таблица Б.5. Стили преобразования денежных сумм

converted to PDF by BoJIoc

Значение Описание

Пример

0

Стандартное преобразование; без запятых; 2 цифры в дробной части.

123456.12

1

Каждые 3 разряда слева от десятичной точки отделяются запятой; 2 цифры в дробной части.

123,234 .12

2

Без запятых; 4 цифры в дробной части.

1234.1234

Таблица Б.6. Агрегатные функции Функция

Описание

sum ([ all| dist inct ] выражение)

Вычисляет общее количество ( разных) значений в числовом столбце.

avg( [ all| dist inct ] выражение)

Вычисляет среднее арифметическое (разных) значений в числовом столбце.

count ( [ all| dist inct ] выражение)

Вычисляет количество (разных) значений в числовом столбце, отличных от NULL.

count (* )

Вычисляет количество выбранных записей. Единственная агрегатная функция, учитывающая значения NULL.

m ax (выражение)

Определяет максимум среди выбранных значений.

m in( выражение)

Определяет минимум среди выбранных значений.

STDEV( выражение)

Вычисляет среднее квадратическое отклонение.

STDEVP(выражение)

Вычисляет среднее квадратическое отклонение для выборки.

VAR(выражение)

Вычисляет статистическую дисперсию.

VARP(выражение)

Вычисляет статистическую дисперсию для выборки.

Таблица Б.7. Функции, используемые в полнотекстовых и удаленных запросах Функция

Описание

CONTAI NSTABLE( таблица,{ столбец| * } ,< условие_поиска> )

Неформальный поиск в полнотекстовых запросах.

FREETEXTTABLE(таблица,{ столбец| * } ,"искомая строка" )

Поиск смысловых значений, а не конкретных слов в полнотекстовых запросах.

OPENQUERY(связанный_сервер," запрос" )

Выполнение запроса для другого источника данных.

Выполнение разового OPENROWSET('имя_провайдера' { 'источник'; 'имя_пользователя'; 'пароль' незапланированного запроса для | 'строка_провайдера'} , { [ каталог.] [ схема.] объект | 'запрос'} ) удаленного источника данных.

Приложение C

Синтаксис Tr a n sa ct - SQL Условные обозначения Таблица B.1. Условные обозначения Обозначение Смысл КОМАНДА

Имена команд, параметров и другие ключевые слова.

Переменная Значения, указываемые вами. {}

Необходимо выбрать хотя бы один из перечисленных вариантов.

converted to PDF by BoJIoc

[]

Значение/ ключевое слово является необязательным.

()

Круглые скобки являются частью команды.

|

Вы можете выбрать лишь один из перечисленных вариантов (по аналогии с логическим оператором "или") .

,

Вы можете выбрать любое число перечисленных вариантов, разделяя их запятыми.

.. .

Повторение предыдущего варианта.

Выражение

Любое выражение, возвращающее одно значение, может принадлежать к одному из следующих типов: символьное_выражениевыражение_ константавещественное_выражениецелое_ выражениечисловое_выражениедвоичное_выражение

BCP Листинг В.1 . Полный синтаксис BCP bcp [ [ имя_базы.] [ владелец] .] имя_таблицы { in | out | form at } файл_данных [ - m максимум_ ошибок] [ - f файл_форматирования] [ -e файл_ ошибок] [ - F первая_запись] [ -L последняя_запись] [ - b размер_пакета] [ - n] [ -c] [ - w] [ -N] [ -6] [ - q] [ -C кодовая_страница] [ - t разделитель_полей] [ - r разделитель_записей] [ - i входной_файл] [ - o выходной_файл] [ - a размер_сетевого_ пакета] [ - S имя_сервера] [ -U имя_пользователя] [ - P пароль] [ - T] [ -v ] [ -k] [ - E] [ -h " рекомендация [ ,.. .n] " ] Таблица В.2. Рекомендации оптимизатора BCP Рекомендация

Значение

ORDER (столбец[ ASC| DESC] [ ,n] )

Порядок сортировки данных в файле данных.

ROWS_ PER_BATCH = bb

Количество записей данных в пакете. Не используется совместно с параметром -b.

KI LOBATCH_PER_BATCH = cc

Количество килобайт данных в пакете.

TABLOCK

На время операции пакетного копирования устанавливается блокировка на уровне таблицы.

CHECK_CONSTRAI NTS

В процессе загрузки данных SQL Server проверяет ограничения таблиц.

BULK I NSERT Листинг В.2 . Полный синтаксис BULK I NSERT BULK I NSERT [ [ 'имя_базы'.] [ 'владелец'] .] { 'имя_таблицы' FROM файл_данных} [ WI TH ( [ BATCHSI ZE = размер_пакета] [ [ ,] CHECK_CONSTRAI NTS] [ [ ,] CODEPAGE = ACP | OEM | RAW | кодировка] [ [ ,] DATAFI LETYPE = { 'char' | 'nat ive' | 'widechar' | 'widenat ive'} ] [ [ ,] FI ELDTERMI NATOR = 'разделитель_полей'] [ [ ,] FI RSTROW = первая_запись] [ [ ,] FORMATFI LE = 'полное_имя_файла_форматирования'] [ [ ,] KEEPI DENTI TY] [ [ ,] KEEPNULLS] [ [ ,] LASTROW = последняя_ запись]

converted to PDF by BoJIoc

[ [ ,] [ [ ,] [ [ ,] [ [ ,] ) ]

MAXERRORS = максимум_ ошибок] ORDER ({ столбец [ ASC | DESC] } [ ,...n] ) ] ROWTERMI NATOR = 'разделитель_записей'] TABLOCK]

Операторы сравнения Таблица В.3. Операторы сравнения Оператор Значение =

Равно

Не равно

!=

Не равно

>

Больше

>=

Больше или равно

!>

Не больше


| CROSS JOI N < таблица_или_представление> { { I NNER | { FULL | LEFT | RI GHT } [ OUTER] JOI N } < таблица_или_представление> ON < условие_соединения> } [ , .. .n] Секция W HERE

converted to PDF by BoJIoc

Листинг В.5 . Полный синтаксис секции W H ERE WHERE [ NOT ] < предикат> [ { AND | OR } [ NOT] < предикат> ] } [ , . . .n] < предикат> : : = { выражение { = | < > | ! = | > | > = | ! > | < | < = | ! < } выражение | строковое+ выражение [ NOT] LI KE строковое_выражение[ ESCAPE 'метасимвол'] | выражение [ NOT] BETWEEN выражение AND выражение | выражение I S [ NOT] NULL | выражение [ NOT] I N (подзапрос | выражение [ ,.. .n] ) | выражение { = | < > | ! = | > | > = | ! > | < | < = | ! < } { ALL | SOME | ANY } (подзапрос) | EXI STS (подзапрос) } CASE Листинг В.6 . Полный синтаксис команды CASE CASE выражение WHEN выражение THEN выражение [ ...] [ ELSE выражение] END Листинг В.7 . Полный синтаксис команды CASE с поиском CASE WHEN столбец = выражение THEN выражение [ ...] [ ELSE выражение] END Курсоры Листинг В.8 . Объявление курсора DECLARE имя_курсора [ I NSENSI TI VE] { SCROLL] CURSOR FOR команда_select [ FOR READ ONLY | UPDATE [ OF список_столбцов] } ] Листинг В.9 . Открытие объявленного курсора OPEN имя_курсора Листинг В.1 0 . Выборка записей с помощью курсора FETCH [ [ NEXT | PRI OR | FI RST | LAST | ABSOLUTE n | RELATI VE n] FROM] имя_курсора [ I NTO @имя_переменной,...] Листинг В.11 . Закрытие открытого курсора CLOSE имя_курсора Листинг В.1 2 . Удаление структур данных курсора DEALLOCATE имя_курсора Обработка данных Листинг В.1 3 . Включение записей в таблицу

converted to PDF by BoJIoc

I NSERT [ I NTO] имя_таблицы [ (список_столбцов) ] { VALUES ({ DEFAULT | выражение_константа } [ ,...n ] ) | команда_ select } Листинг В.1 4 . Модификация записей в таблице UPDATE { < таблица_или_представление> } SET { имя_столбца = { выражение | DEFAULT} | @переменная = выражение } [ ,...n] [ FROM секция_from ] [ WHERE < условия_поиска> | CURRENT OF { { [ GLOBAL] имя_курсора } | имя_переменной_курсора} } ] Листинг В.1 5 . Удаление записей из таблицы DELETE [ FROM] имя_ таблицы [ FROM { имя_ таблицы | имя_представления} [ ,. ..] ] [ WHERE критерии_поиска] Листинг В.1 6 . Быстрое удаление всех записей из таблицы TRUNCATE TABLE имя_ таблицы Определение таблиц Листинг В.1 7 . Полный синтаксис создания таблицы CREATE TABLE имя_таблицы ( { имя_столбца тип_данных [ NULL | NOT NULL ] [ I DENTI TY [ (начало, приращение ) [ NOT FOR REPLI CATI ON] ] ] [ ROWGUI DCOL ] [ CONSTRAI NT имя_ограничения] { { PRI MARY KEY | UNI QUE } [ CLUSTERED | NONCLUSTERED] [ WI TH [ FI LLFACTOR = коэффициент_заполнения] [ ON { файловая_ группа | DEFAULT} ] | [ FOREI GN KEY] REFERENCES ссылка_таблица [ ( ссылка_столбец ) ] [ NOT FOR REPLI CATI ON] | DEFAULT выражение_константа | CHECK [ NOT FOR REPLI CATI ON] (логическое_выражение) } ] [ .. .n] | имя_столбца AS вычисляемое_выражение | < ограничение_ таблицы> } [ , . . .n] ) [ ON { файловая_ группа | DEFAULT} ] [ TEXTI MAGE_ ON { файловая_группа | DEFAULT} ] < определение_столбца> : : = { имя_столбца тип_данных } [ NULL | NOT NULL ] [ I DENTI TY [ (начало, приращение ) [ NOT FOR REPLI CATI ON] ] ] [ ROWGUI DCOL ] [ < ограничение_столбца> : : = [ CONSTRAI NT имя_ограничения] { { PRI MARY KEY | UNI QUE } [ CLUSTERED | NONCLUSTERED]

converted to PDF by BoJIoc

[ WI TH [ FI LLFACTOR = коэффициент_заполнения] ] [ ON { файловая_ группа | DEFAULT} ] | [ FOREI GN_KEY] REFERENCES ссылка_таблица [ ( ссылка_столбец ) ] [ NOT FOR REPLI CATI ON] | DEFAULT выражение_константа | CHECK [ NOT FOR REPLI CATI ON] (логическое_выражение) } ] [ . ..n] Листинг В.1 8 . Полный синтаксис модификации таблицы ALTER TABLE имя_таблицы { [ WI TH CHECK | WI TH NOCHECK] { [ ALTER COLUMN имя_столбца { [ новый_ тип_данных [ ( точность[ , scale] ) ] [ NULL | NOT NULL ] ] | [ { ADD | DROP} ROWGUI DCOL ] } ] | ADD { [ { имя_столбца тип_данных } [ NULL | NOT NULL ] [ I DENTI TY [ (начало[ , приращение] ) [ NOT FOR REPLI CATI ON] ] ] [ ROWGUI DCOL ] ] | имя_столбца AS вычисляемое_выражение | [ [ CONSTRAI NT имя_ограничения] { [ { PRI MARY KEY | UNI QUE } [ CLUSTERED | NONCLUSTERED] { ( столбец[ ,.. .n] ) } [ WI TH [ FI LLFACTOR = коэффициент_ заполнения] ] [ ON (файловая_группа | DEFAULT} ] ] | FOREI GN KEY [ (столбец[ ,.. .n] ) ] REFERENCES ссылка_таблица [ ( ссылка_столбец[ ,.. .n] ) ] [ NOT FOR REPLI CATI ON] | DEFAULT выражение_константа [ FOR столбец] | CHECK [ NOT FOR REPLI CATI ON] (логическое_выражение) }] } [ ,. ..n] | DROP { [ CONSTRAI N] ограничение | COLUMN столбец } [ ,. ..n] | { CHECK | NOCHECK} CONSTRAI NT { ALL | ограничение[ ,...n] } } } Индексы Листинг В.1 9 . Создание индекса CREATE [ UNI QUE] [ CLUSTERED | NONCLUSTERED] I NDEX имя_индекса

converted to PDF by BoJIoc

ON [ [ имя_базы,] владелец.] имя_таблицы (столбец [ ,.. .] ) [ WI TH [ FI LLFACTOR = x ] [ [ ,] I GNORE_DUP_KEY] [ [ ,] { SORTED_DATA | SORTED_DATA_REORG} ] [ [ ,] { I GNORE_DUP_ROW | ALLOW_DUP_ROW} ] ] [ ON имя_сегмента] Листинг В.2 0 . Удаление индекса DROP I NDEX [ владелец.] имя_таблицы.имя_индекса [ ,[ владелец.] имя_таблицы.имя_индекса...] Правила и значения по умолчанию Листинг В.2 1 . Создание правил CREATE RULE имя_правила @переменная оператор выражение [ { AND| OR} ...] Листинг В.2 2 . Удаление правил DROP RULE [ владелец.] имя_правила[ , [ владелец.] имя_правила...] Листинг В.2 3 . Связывание правил со столбцами sp_bindrule имя_правила, 'таблица.имя_столбца' Листинг В.2 4 . Отсоединение правил от столбцов sp_unbindrule 'таблица.имя_столбца' Листинг В.2 5 . Создание значений по умолчанию CREATE DEFAULT [ владелец] имя_значения AS выражение_константа Листинг В.2 6 . Удаление значений по умолчанию DROP DEFAULT [ владелец.] имя_ значения[ , [ владелец.] имя_значения...] Листинг В.2 7 . Связывание значений по умолчанию со столбцами sp_bindefault имя_ значения, 'таблица.имя_столбца' Листинг В.2 8 . Отсоединение значений по умолчанию от столбцов sp_bindefault 'таблица.имя_столбца' Базы данных: создание, модификация, удаление Листинг В.2 9 . Создание базы данных CREATE DATABASE имя_базы [ ON [ PRI MARY] ( [ NAME = логическое_имя_файла, ] FI LENAME = 'имя_файла_ОС' [ , SI ZE = размер] [ , MAXSI ZE = { максимальный_размер | UNLI MI TED } ]

converted to PDF by BoJIoc

[ , FI LEGROWTH = приращение] ) | { FI LEGROUP имя_файловой_ группы FI LEDEFI NI TI ONS} [ ,.. .n] ] [ LOG ON { [ NAME = логическое_имя_файла, ] [ FI LENAME = 'имя_файла_ ОС' [ , SI ZE = размер] [ , MAXSI ZE = { максимальный_размер | UNLI MI TED } ] [ , FI LEGROWTH = приращение] } [ ,...n] [ FOR LOAD | FOR ATTACH] Листинг В.3 0 . Модификация базы данных ALTER DATABASE база_данных { ADD FI LE < спецификация> [ ,...n] [ TO FI LEGROUP имя_ группы] | ADD LOG FI LE < спецификация> [ ,.. .n] | REMOVE FI LE логическое_имя_файла | ADD FI LEGROUP имя_группы | REMOVE FI LEGROUP имя_группы | MODI FY FI LE < спецификация> | MODI FY FI LEGROUP имя_ группы свойство_группы } < спецификация> : : = (NAME = 'логическое_имя_файла' [ , FI LENAME = 'имя_файла_ОС' ] [ , SI ZE = размер] [ , MAXSI ZE = { максимальный_размер | UNLI MI TED } ] [ , FI LEGROWTH = приращение] ) Листинг В.3 1 . Загрузка базы данных LOAD DATABASE { имя_базы | @переменная} FROM устройство[ , ...] [ WI TH OPTI ONS [ [ ,] STATS [ = процент] ] ] Листинг В.3 2 . Загрузка транзакций LOAD TRANSACTI ON { имя_базы | @переменная} FROM устройство[ , ...] [ WI TH OPTI ONS] Листинг В.3 3 . Выгрузка базы данных DUMP DATABASE { имя_базы | @переменная} TO устройство[ , . ..] ] [ WI TH OPTI ONS [ [ ,] STATS [ = процент] ] ] Листинг В.3 4 . Полный синтаксис сжатия базы данных DBCC SHRI NKDATABASE ( имя_базы [ , процент] [ , { NOTRUNCATE | TRUNCATEONLY} ] ) Листинг В.3 5 . Выгрузка журнала транзакций DUMP TRANSACTI ON { имя_базы | @переменная} [ TO устройство[ , . ..] ] [ WI TH { TRUNCATE_ONLY | NO_LOG |

converted to PDF by BoJIoc

NO_TRUNCATE} { OPTI ONS} ] Листинг В.3 6 . Переименование баз данных sp_ renam edb "старое_имя"," новое_имя" Листинг В.3 7 . Полный синтаксис сжатия файлов DBCC SHRI NKFI LE { { имя_файла | идентификатор_файла } { [ , размер] | [ , { EMPTYFI LE | NOTRUNCATE | TRUNCATEONLY} ] } ) Листинг В.3 8 . Инициализация диска DI SK I NI T NAME = 'логическое_имя' PHYSNAME = 'физическое_имя' VDEVNO = виртуальный_номер_устройства, SI ZE = количество_2- килобайтных_блоков, [ , VSTART = виртуальный_адрес] Вывод сообщений Листинг В.3 9 . Синтаксис команды PRI N T PRI NT " ASCI I _текст" | @локальная_переменная | @@глобальная_переменная Листинг В.4 0 . Синтаксис команды RAI SERROR RAI SERROR ( { код_ошибки | символьная_строка} , код_важности, состояние [ , список_аргументов] ) [ WI TH LOG] Полнотекстовый поиск Листинг В.4 1 . Создание полнотекстового каталога sp_ fullt ext_ cat alog 'имя_полнотекстового_каталога' [ 'creat e'| 'drop' | 'st art_ increm ent al'| 'st art _full' | 'st op'| 'rebuild'] [ , 'каталог_на_диске'] Листинг В.4 2 . Регистрация таблиц для полнотекстового поиска sp_ fullt ext_ table [ 'имя_таблицы'] [ 'creat e'| 'drop' | 'act ivat e' | 'deact ivate'] [ 'имя_каталога', 'имя_индекса'] Листинг В.4 3 . Регистрация столбцов для полнотекстового поиска sp_ fullt ext_ colum n 'имя_ таблицы', 'имя_столбца', { 'ADD'| 'DROP'} Листинг В.4 4 . Регистрация столбцов для полнотекстового поиска

converted to PDF by BoJIoc

sp_ fullt ext_ table 'имя_таблицы', 'act ivat e' Листинг В.4 5 . Полный синтаксис удаленного вызова процедур ( RPC) [ EXEC[ UTE] ] имя_сервера.[ имя_базы] .[ владелец] .[ хранимая_процедура] [ параметры[ , параметр ...] ] Безопасность Листинг В.4 6 . Полный синтаксис добавления учетной записи для входа sp_addlogin имя, пароль [ , база_по_умолчанию [ , язык_по_умолчанию [ , полное_имя ] ] ] ] Листинг В.4 7 . Удаление учетной записи для входа sp_droplogin имя Листинг В.4 8 . Добавление пользователя базы данных sp_adduser имя [ , имя_в_базе [ , группа] ] Листинг В.4 9 . Удаление пользователя sp_dropuser имя Листинг В.5 0 . Предоставление и отмена разрешений для объектов GRANT { ALL | список_разрешений} ON [ имя_ таблицы [ (список_столбцов) ] | имя_представления [ ( список_столбцов)] | имя_хранимой_процедуры | расширенное_имя_хранимой_процедуры} TO { PUBLI C | список_имен} REVOKE { ALL | список_разрешений} ON [ имя_ таблицы [ (список_столбцов) ] | имя_представления [ ( список_столбцов)] | имя_хранимой_процедуры | расширенное_имя_хранимой_процедуры} FROM { PUBLI C | список_имен} DENY { ALL | список_разрешений} ON [ имя_ таблицы [ (список_столбцов) ] | имя_представления [ ( список_столбцов)] | имя_хранимой_процедуры | расширенное_имя_хранимой_процедуры} FROM { PUBLI C | список_имен} Листинг В.5 1 . Предоставление и отмена разрешений для команд GRANT { ALL | список_команд} TO { PUBLI C | список_имен} REVOKE { ALL | список_команд} FROM { PUBLI C | список_имен} DENY { ALL | список_команд} FROM { PUBLI C | список_имен} Листинг В.5 2 . Вывод информации о пользователях базы данных sp_helpuser [ имя_пользователя]

converted to PDF by BoJIoc

Листинг В.5 3 . Вывод информации о защите объектов и пользователей sp_helprotect { имя_объекта | имя_пользователя} Листинг В.5 4 . Создание динамических псевдонимов владельцем для других пользователей базы данных set user [ " имя_пользователя" [ WI TH NORESET] ] Команды SET Таблица В.4. Команды SET Команда

Описание

SET DATEFI RST число

Определяет первый день недели.

SET DATEFORMAT { формат| @переменная}

Определяет формат даты в символьных строках, используемых SQL Server.

SET DEADLOCK_PRI ORI TY { LOW| NORMAL| @переменная}

Управляет обработкой взаимных блокировок в SQL Server.

SET LOCK_TI MEOUT миллисекунды

Изменяет значение по умолчанию и вызывает таймаут при блокировании ресурсов.

SET CONCAT_NULL_YI ELDS_NULL { ON| OFF}

При установке TRUE результатом конкатенации строки с NULL является NULL, в противном случае - строка.

SET CURSOR_CLOSE_ON_COMMI T

Определяет поведение курсора при выполнении команды COMMI T.

SET I DENTI TY_ I NSERT

Разрешает вставку значений в столбцы счетчика.

SET FI PS_FLAGGER{ ENTRY| I NTERMEDI ATE| FULL| OFF}

Разрешает проверку SQL на соответствие стандарту ANSI SQL-92.

SET LANGUAGE { язык| переменная}

Разрешает выбрать для сеанса другой язык.

SET OFFSETS

Используется в сочетании с приложениями DBLibrary для поиска ключевых слов SQL.

SET PROCI D

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

SET QUOTED_I DENTI FI ER{ ON| OFF}

Форсирует применение стандарта ANSI SQL-92 в SQL Server.

SET ARI THABORT { ON| OFF}

Определяет действия SQL Serv er при математическом переполнении или делении на ноль.

SET ARI THI GNORE { ON| OFF}

Определяет сообщение об ошибке, генерируемое SQL Serv er при математическом переполнении или делении на ноль в командах выборки.

SET FMTONLY{ ON| OFF}

Разрешает настроить SQL Server так, чтобы клиенту возвращались только данные столбцов.

SET NOCOUNT { ON| OFF}

Запрещает SQL Server передавать клиенту информацию о количестве выбираемых записей после каждой команды.

SET NOEXEC { ON| OFF}

Запрещает выполнение команд SQL.

SET NUMERI C_ROUNDABORT { ON| OFF}

Определяет действия SQL Serv er при потере точности вследствие математического округления.

converted to PDF by BoJIoc

SET PARSEONLY { ON| OFF}

Переводит SQL Server в режим проверки команд SQL.

SET QUERY_GOVERNOR_COST_LI MI T целое

Ограничивает выполнение запросов на основании предполагаемого объема работы по оценке SQL Server.

SET ROWCOUNT целое

Ограничивает количество записей, участвующих в выполнении команд SQL.

SET TEXTSI ZE { целое| @целая_переменная}

Определяет количество байт, возвращаемых командой выборки.

SET ANSI _DEFAULTS { ON| OFF}

Управляет соблюдением стандарта ANSI SQL.

SET ANSI _NULLS { ON| OFF}

Определяет поведение SQL Server при проверке NULL в столбцах.

SET ANSI _PADDI NG { ON| OFF}

Определяет формат хранения столбцов типов VARCHAR, BI NARY и VARBI NARY, которые завершаются пробелами или имеют длину меньше максимальной ширины столбца.

SET ANSI _WARNI NGS { ON| OFF}

Определяет поведение стандарта ANSI для ошибок.

SET FORCEPLAN { ON| OFF}

Определяет оптимальный порядок объединения.

SET SHOWPLAN_ ALL { ON| OFF}

Сбор данных о выполнении каждой команды SQL.

SET SHOWPLAN_TEXT { ON| OFF}

Сбор данных о выполнении каждой команды SQL.

SET STATI STI CS I O { ON| OFF}

SQL Server возвращает данные о дисковых операциях, выполняемых командами SQL.

SET STATI STI CS TI ME { ON| OFF}

SQL Server возвращает данные о количестве миллисекунд, затрачиваемых на анализ, компиляцию и выполнение каждой команды SQL.

SET I MPLI CI T_TRANSACTI ONS { ON| OFF}

Управляет неявным инициированием транзакций в SQL Server.

SET REMOTE_PROC_TRANSACTI ONS { ON| OFF}

Влияет на поведение SQL Server при удаленном вызове процедур.

SET XACT_ABORT{ ON| OFF}

Управляет поведением SQL Server при возникновении любых ошибок времени выполнения.

SET NO EXEC ON

Предотвращает выполнение любых команд, кроме SET NO EXEC.

SET TRANSACTI ON I SOLATI ON LEVEL { READ COMMI TED| READ UNCOMMI TED| REPEATABLE READ| SERI ALI ZABLE}

Управляет поведением SQL Server при установке блокировок.

Хранимые процедуры Листинг В.5 5 . Создание хранимой процедуры CREATE PROCEDURE [ владелец.] имя_процедуры [ ; номер] [ параметр1 [ , параметр2 ] ...[ параметр255] ) ] [ { FOR REPLI CATI ON} | { WI TH RECOMPI LE} [ { [ WI TH] | [ ,] ENCRYPTI ON] ] AS команды SQL Листинг В.5 6 . Выполнение хранимой процедуры

converted to PDF by BoJIoc

[ [ EXECUTE] { [ @код_возврата = ] { [ [ [ сервер.] ,база.] владелец.] имя_процедуры[ ; номер] @переменная} [ [ @имя_параметра = ] { значение | @переменная OUTPUT [ ,[ . . .] ] ] [ WI TH RECOMPI LE] Листинг В.5 7 . Вывод информации по объекту sp_help { имя_типа | имя_процедуры | имя_таблицы | имя_представления | имя_правила | имя_значения_по_умолчанию} Листинг В.5 8 . Вывод индексов, определенных для таблицы sp_helpindex имя_таблицы Листинг В.5 9 . Вывод текста объекта sp_helpt ext { имя_правила | имя_значения_по_умолчанию | имя_представления | имя_процедуры | имя_триггера } Листинг В.6 0 . Переименование объекта sp_ renam e { старое_имя | 'имя_ таблицы.старое_имя_столбца'} , новое_имя Листинг В.6 1 . Вывод сведений об ограничениях sp_helpconst raint имя_ таблицы [ , детализация] Листинг В.6 2 . Вывод сведений о зависимых объектах sp_depends { имя_триггера | имя_процедуры } Листинг В.6 3 . Вывод сведений обо всех триггерах и хранимых процедурах, ссылающихся на таблицу или представление sp_depends { имя_таблицы | имя_представления } Листинг В.6 4 . Просмотр текущих блокировок sp_ lock [ spid] Листинг В.6 5 . Просмотр текущих блокировок sp_who [ spid] Листинг В.6 6 . Вывод списка баз данных sp_helpdb [ имя_базы] Листинг В.6 7 . Определение нестандартных сообщений об ошибках sp_addm essage код_сообщения, текст_сообщения, [ ,язык[ ,{ TRUE | FALSE} [ ,REPLACE] ] ] Листинг В.6 8 . Определение и вывод ключей

converted to PDF by BoJIoc

sp_prim arykey имя_таблицы, столбец1 [ , .. .] sp_ foreignkey имя_ таблицы1, имя_таблицы2, столбец1 [ ,столбец2, ...] sp_com m onkey имя_ таблицы1 , имя_таблицы2, столбец1 a, столбец2а [ ,столбец1б, столбец2б , .. .] sp_helpkey имя_таблицы Таблицы и представления Листинг В.6 9 . Удаление таблицы DROP TABLE [ [ база_данных.] владелец.] имя_таблицы [ ,[ [ [ база_данных.] владелец.] имя_таблицы...] Листинг В.7 0 . Создание представления CREATE VI EW [ владелец.] имя_представления [ (имя_столбца, ...) ] [ WI TH ENCRYPTI ON] AS команда_select [ WI TH CHECK OPTI ON ] Листинг В.7 1 . Удаление представления DROP VI EW [ владелец.] имя_представления[ , [ владелец.] имя_представления...] Листинг В.7 2 . Полный синтаксис модификации представления ALTER VI EW имя_представления [ (столбец [ , .. .n] )] [ WI TH ENCRYPTI ON] AS команда_select [ WI TH CHECK OPTI ON] Транзакции и блокировка Листинг В.7 3 . Начало транзакции BEGI N TRANSACTI ON [ имя_транзакции] Листинг В.7 4 . Начало транзакции COMMI T TRANSACTI ON [ имя_транзакции] Листинг В.7 5 . Откат транзакции ROLLBACK TRANSACTI ON [ имя_транзакции | имя_точки_сохранения] Листинг В.7 6 . Сохранение транзакции SAVE TRANSACTI ON имя_точки_сохранения Листинг В.7 7 . Установка уровня изоляции транзакций SET TRANSACTI ON I SOLATI ON LEVEL { READ COMMI TED| READ UNCOMMI TED| REPEATABLE READ| SERI ALI ZABLE} Триггеры Листинг В.7 8 . Создание, удаление и модификация триггеров

converted to PDF by BoJIoc

CREATE TRI GGER имя_ триггера ON имя_таблицы [ WI TH ENCRYPTI ON] FOR { I NSERT | UPDATE | DELETE} [ ,...] [ WI TH APPEND] [ NOT FOR REPLI CATI ON] AS [ команды SQL] [ RETURN] DROP TRI GGER имя_ триггера [ ,имя_триггера [ ,.. . ] ] ALTER TRI GGER имя_триггера ON имя_таблицы [ WI TH ENCRYPTI ON] FOR { I NSERT | UPDATE | DELETE} [ , . ..] [ WI TH APPEND] [ NOT FOR REPLI CATI ON] AS [ команды SQL] [ RETURN] Листинг В.7 9 . Проверка вставки или обновления столбцов I F UPDATE (имя_столбца) [ { AND | OR } UPDATE (имя_столбца) ...] Обновление статистики Листинг В.8 0 . Полный синтаксис обновления статистики UPDATE STATI STI CS { имя_таблицы } [ имя_индекса | (индекс_или_список_столбцов [ , . . . n] ) ] [ WI TH [ [ FULLSCAN] | SAMPLE номер { PERCENT | ROWS} ] ] [ [ ,] [ ALL | COLUMNS | I NDEX] [ [ ,] NORECOMPUTE] ] Пользовательские типы данных Листинг В.8 1 . Определение типа данных sp_addt ype имя_ типа, тип_данных, [ { NULL | NOT NULL} ] Листинг В.8 2 . Удаление типа данных sp_dropt ype имя_типа Команды WRI TETEXT и UPDATETEXT Листинг В.8 3 . Полный синтаксис команд W RI TETEX T и UPDATETEXT WRI TETEXT { таблица.столбец текстовый_указатель} [ WI TH LOG] { данные} UPDATETEXT { имя_таблицы.имя_столбца_приемника указатель_ приемника} { NULL | смещение_вставки} { NULL | длина_удаления}

converted to PDF by BoJIoc

[ WI TH LOG] [ вставляемые_данные | [ { имя_ таблицы.имя_столбца_ источника указатель_источника} ]

Глоссарий ANSI (Am erican Nat ional St andards I nst it ut e) — организация американских промышленных и деловых групп, занимающаяся разработкой торговых и коммуникационных стандартов в США. bcp, утилита — утилита, запускаемая в режиме командной строки и предназначенная для копирования данных между таблицей SQL Serv er и файлом операционной системы в формате, определяемом пользователем. BI NARY — тип данных SQL Server, предназначенный для хранения шестнадцатеричных чисел. Данные типа BI NARY могут содержать от 0 до 8000 байт. BI T — тип данных SQL Server, принимающий значения 1 или 0. BLOB — тип данных SQL Server, предназначенный для хранения неструктурированных двоичных данных (например, графики, звука или откомпилированного кода). Данные типа BLOB занимают до 2 Гбайт. CHAR(n) — тип данных SQL Server, содержащий от 0 до 8000 символов. CHECK — ограничение, которое проверяет, что сохраняемые в столбце значения входят в его домен. DATETI ME — тип данных SQL Serv er для хранения даты и времени. Тип данных DATETI ME состоит из двух 4 байтовых целых чисел. DBCC (Dat abase Consistency Checker) — команда SQL Server, предназначенная для проверки логической и физической согласованности базы данных, а также для выполнения других системных функций. DB-Library — набор высокоуровневых функций API в системах «клиент/ сервер». DCL (Dat a Cont rol Language) — подмножество команд SQL, управляющих разрешениями для объектов баз данных. DDL (Dat a Definit ion Language) — подмножество команд SQL для создания таблиц и структур баз данных. DML (Dat a Manipulat ion Language) — подмножество команд SQL для вставки, обновления, удаления и выборки данных. DTS (Dat a Transform at ion Serv ice) — компонент SQL Server, предназначенный для импортирования, экспортирования и преобразования данных. FLOAT — тип данных, используемый для хранения чисел с плавающей запятой. I DENTI TY — атрибут столбца счетчика. Значения столбцов счетчика генерируются SQL Server. I MAGE — тип данных SQL Server для хранения двоичной информации. Данные типа I MAGE занимают до 2 Гбайт. I NT ( I NTEGER) — тип данных SQL Server для хранения целых чисел в интервале от –2 147 483 648 до 2 147 483 647. Данные типа I NT занимают 4 байта. m ast er, база данных — системная база данных SQL Serv er, содержащая информацию о ресурсах уровня сервера. m odel, база данных — системная база данных, используемая в качестве шаблона для каждой создаваемой базы данных.

converted to PDF by BoJIoc

MONEY — тип данных SQL Server, используемый для хранения денежных величин с точностью до четырех цифр после запятой. Тип данных MONEY хранит числа из интервала от –922337203685477,5808 до 922337203685477,5807. NCHAR — тип данных SQL Server, позволяющий хранить до 4000 символов в кодировке UNI CODE. NTEXT — тип данных SQL Server, позволяющий хранить до 1 073 741 823 символов в кодировке UNI CODE. NULL — неопределенное значение столбца при отсутствии присвоенного значения. NVARCHAR — тип данных SQL Server, позволяющий хранить до 4000 символов в кодировке UNI CODE. ODBC ( Open Dat abase Connect iv it y ) — прикладной интерфейс для работы с базами данных, приведенный в соответствие с интерфейсами баз данных уровня вызова (Call-Level I nt erface) стандартов ANSI и I SO. ODBC, драйвер — модуль DLL, обеспечивающий работу приложения с источником данных ODBC. OLE ( Obj ect Linking and Em bedding) — прикладной интерфейс для совместного использования объектов между приложениями. OLE DB — прикладной интерфейс для работы с данными, построенный на базе COM. OLE DB позволяет работать с данными в любом формате ( базы данных, электронной таблицы, текстового файла и т. д.) , для которого существует провайдер OLE DB. OLTP (Online Transact ion Processing) — приложение и база данных, разработанные для выполнения конкретной деловой задачи. В системах OLTP обычно выполняются запросы с заранее известной структурой. Perform ance Monit or — приложение Window s NT, предназначенное для сбора информации о характеристиках системы. Применяется для наблюдения за работой SQL Server. pubs, база данных — один из примеров баз данных, входящий в SQL Server. REAL — тип данных SQL Server для хранения чисел с точностью в 7 цифр. SELECT — команда SQL, возвращающая данные из базы данных SQL Serv er. SMALLDATETI ME — тип данных SQL Server для хранения времени и даты. SMALLI NT — тип данных для хранения целых чисел в интервале от –32 767 до 32 768. SQL ( St ruct ured Query Language) — язык запросов и программирования баз данных. SQL Serv er Agent — компонент SQL Server, отвечающий за создание и управление локальными и мультисерверными заданиями, оповещениями и операторами. SQL-3 — последняя версия стандарта SQL; в настоящее время еще не утверждена. SQL-92 — последняя утвержденная версия стандарта SQL, опубликованная в 1992 году; также известна как SQL-2. В США иногда используется термин «ANSI SQL». t em pdb — системная база данных для хранения временных рабочих объектов. TEXT — тип данных, используемый для хранения символьных данных объемом до 2 Гбайт. TI MESTAMP — тип данных, автоматически генерирующий уникальное значение для базы данных. Каждое новое сгенерированное значение должно быть больше предыдущего. TI NYI NT — тип данных для хранения целых чисел в интервале от 0 до 255. Unicode — кодировка, используемая в типах данных NCHAR, NVARCHAR и NTEXT.

converted to PDF by BoJIoc

UNI QUE — ограничение, обеспечивающее уникальность значений столбцов в таблице. UNI QUEI DENTI FI ER — тип данных SQL Server для хранения глобально-уникальных идентификаторов (GUI D) в виде 16-байтовой двоичной строки. VARBI NARY — тип данных для хранения двоичных данных объемом до 8000 байт. VARCHAR — тип данных для хранения символьных данных объемом до 8000 байт. автоматическая синхронизация (aut om at ic sy nchronizat ion) — автоматический процесс репликации, синхронизирующий подписчика с издателем при создании подписки. автоматическое восстановление ( aut om at ic recovery) — автоматический откат или завершение транзакций при перезапуске SQL Server. Автоматическое восстановление обеспечивает целостность баз данных. агрегатные функции ( aggregat e funct ions) — функции для вычисления сводных показателей. Агрегатными являются следующие функции: AVG, COUNT, COUNT(* ), MAX, MI N, STDEV, STDEVP, SUM, VAR и VARP. агрегатный запрос (aggregat e query ) — любой запрос, в котором используется агрегатная функция. анонимная подписка ( anonym ous subscript ion) — pull-подписка, которая позволяет любому серверу, известному издателю, получать подписку на публикацию, но лишь на время подключения. архивация (back up) — процесс создания копии базы данных, журнала транзакций, файла или группы файлов с использованием магнитной ленты, именованного канала или жесткого диска. архивный носитель (backup m edia) — тип устройства, на котором хранится архив. Для хранения архивных наборов используются файлы, магнитные ленты или именованные каналы. архивный файл (backup file) — файл, содержащий архивную копию данных. аутентификация (aut hent icat ion) — процесс идентификации пользователей и проверки разрешений при подключении к SQL Server. база данных по умолчанию (default dat abase) — база данных, которая автоматически становится текущей при подключении пользователя к SQL Server. базовая таблица (base t able) — таблица, на основе которой создается представление. блок (block ) — одна или несколько команд SQL, расположенных между командами BEGI N и END. блокировка ( lock ) — ограничение доступа к ресурсу со стороны других подключений. блокировка таблицы ( table lock) — режим блокировки, при котором блокируется целая таблица. вертикальное разбиение ( vert ical part it ioning) — физический процесс разделения одной таблицы на несколько наборов столбцов. Каждой записи исходной таблицы соответствует запись в каждой из полученных таблиц. взаимная блокировка (deadlock) — ситуация, при которой два и более пользователя блокируют некоторый ресурс и ожидают снятия блокировок со стороны других пользователей. владелец базы данных ( dbo, dat abase owner) — пользователь, которому принадлежит база данных; не обязан быть владельцем объектов базы. владелец объекта (obj ect owner) — пользователь, создавший объект. владелец объекта базы данных (dat abase obj ect owner) — пользователь базы данных, создавший объект базы данных. вложенный запрос (nest ed query) — запрос, являющийся составной частью другого запроса.

converted to PDF by BoJIoc

внешнее объединение ( out er j oin) — внешнее объединение, которое возвращает записи даже в том случае, если в другой таблице не находится записи, соответствующей критерию объединения. внешний ключ (foreign k ey) — один или несколько столбцов таблицы, совпадающих с первичным ключом другой таблицы. В SQL Server внешний ключ может совпадать с любым ограничением уникальности другой таблицы. внутреннее объединение ( inner join) — объединение двух таблиц, результаты которого определяются совпадающими значениями объединяемых полей. возможный ключ ( candidat e key ) — любая комбинация столбцов, однозначно идентифицирующая запись данных. Возможные ключи также называются суррогатными ключами. временная хранимая процедура ( t em porary stored procedure) — хранимая процедура, создаваемая в системной базе данных t em pdb. Признаком временной процедуры является префикс имени # . выгрузка (dum p) — архивация. выражение ( ex pression) — произвольный столбец, функция, переменная, подзапрос или произвольная комбинация имен столбцов, констант и функций, объединенных с помощью операторов, дающих одно значение и используемых в команде SQL вместо столбца. горизонтальное разбиение ( horizont al part it ioning) — физический процесс разделения одной таблицы на несколько таблиц на основании выбранных записей. группа файлов ( filegroup) — один или несколько файлов данных в базе, объединяемых под общим именем для упрощения администрирования. грязное чтение ( dirt y read) — чтение данных, которые были модифицированы, но не закреплены в базе данных. декартово произведение ( Cart esian product ) — объединение двух таблиц без аргументов. Декартово произведение содержит все возможные комбинации записей из таблиц, участвующих в операции объединения. денормализация (denorm alizat ion) — процесс добавления избыточных данных в базу. Приводит к изменению нормальной формы таблицы. диаграмма базы данных ( database diagram ) — графическое представление полной структуры базы данных или ее некоторой части. динамическая блокировка (dy nam ic locking) — процесс SQL Server, определяющий наиболее эффективную схему блокировки для каждого запроса. динамический курсор (dynam ic cursor) — курсор с изменяющимся итоговым набором. Другими словами, при перемещении курсора все изменения данных отображаются в итоговом наборе. домен (dom ain) — набор допустимых значений атрибута. журнал ошибок (error log) — ASCI I -файл операционной системы, в который SQL Server записывает сообщения. журнал приложений (applicat ion log) — файл Window s NT, в котором регистрируются события. SQL Serv er можно настроить на использование журнала приложений Windows NT. журнал событий (event log) — системный файл NT, содержащий сообщения от всех процессов на компьютере. журнал транзакций (t ransact ion log) — специальный файл базы данных, в который записываются все изменения данных перед записью в базу. закрепление ( com m it ) — процесс сохранения изменений в базе данных.

converted to PDF by BoJIoc

запись (row, record) — набор из одного или нескольких столбцов. запланированная архивация ( scheduled backup) — архивация, автоматически выполняемая SQL Server Agent в том случае, если архивация была определена и запланирована как задание. идентификатор ( ident ifier) — имя объекта базы данных. В границах своей области видимости идентификатор должен быть уникальным. столбец счетчика ( ident ity colum n) — столбец, сгенерированный системой и обладающий атрибутом I DENTI TY. В таблице может быть лишь один столбец счетчика. именованный канал (nam ed pipe) — механизм межпроцессных взаимодействий ( I PC) , используемый для доступа к общим сетевым ресурсам. имя базы данных (dat abase nam e) — имя, однозначно идентифицирующее базу данных в SQL Server. имя незапланированного подключения (ad hoc connect or nam e) — функция OpenRow set секции FROM используется для одноразового подключения к внешнему источнику данных. индекс (index) — объект баз данных, ускоряющий доступ к данным по сравнению с просмотром каждой записи таблицы в поисках нужного результата. интервальный запрос (range query) — запрос на выборку записей данных, у которых значение столбца принадлежит заданному интервалу. источник данных ( dat a source) — любые внешние данные, доступ к которым осуществляется через SQL Server. итоговый набор (result set ) — записи, возвращаемые командой SELECT. каскадное обновление ( cascading updat e) — обновление всех зависимых записей ( или столбцов). каскадное удаление (cascading delete) — удаление зависимых записей (или столбцов) из зависимых таблиц. каталог базы данных ( dat abase catalog) — системные таблицы с информацией, описывающей объекты базы данных. кластерный индекс ( clustered index) — индекс, при котором данные сортируются в порядке значений индекса. клиент (client ) — процесс (программа или задача), обращающийся к приложению-серверу с запросом на обслуживание. Кроме того, в локальной сети — компьютер, работающий с общими сетевыми ресурсами, предоставляемыми сервером. клиент/ сервер (client / serv er) — архитектура, при которой обработка данных распределяется между клиентами (программами, обычно оптимизированными для взаимодействия с пользователем) и серверами (программами, отвечающими за централизованное управление данными, сетевое администрирование и безопасность) в локальной сети. По сравнению со старыми архитектурами, архитектура «клиент/ сервер» повышает эффективность обработки данных. клиентский курсор (client cursor) — курсор, реализуемый клиентом через API . ключ (key) — один или несколько столбцов, однозначно определяющих таблицу или отношения между таблицами. ключевой курсор (keyset -driven cursor) — курсор, в котором не учитываются результаты вставок и удалений, но отображаются все модификации базовых данных. кодировка (charact er set ) — набор символов, используемый SQL Server для типов данных CHAR, VARCHAR или TEXT. Кодировка состоит из 256 букв, цифр или символов, относящихся к определенной стране или языку. Первые 128 символов совпадают во всех кодировках.

converted to PDF by BoJIoc

кодовая страница (code page) — см. кодировка. конкатенация (concatenat ion) — объединение двух и более символьных строк, выражений или двоичных цепочек. одновременность (concurrency ) — возможность одновременного обращения к SQL Server со стороны нескольких пользователей. константа ( const ant ) — любая статическая величина, используемая в запросе (не содержащая вызовов функций, столбцов или объектов баз данных). контрольная точка ( checkpoint ) — системное событие SQL Server. При прохождении контрольной точки на диск записываются все модифицированные страницы данных. коррелированный подзапрос ( correlat ed subquery) — подзапрос, в котором возвращаемые записи определяются по результатам внешнего запроса. коэффициент заполнения (fill fact or) — параметр, резервирующий свободное место в индексе при его создании. Коэффициент заполнения уменьшает разбивку страниц при увеличении таблицы. критерий объединения ( j oin condit ion) — логическое условие, определяющее способ объединения таблиц. курсор (cursor) — механизм последовательной обработки записей, входящих в итоговый набор. Курсоры делятся на клиентские и серверные. левое внешнее объединение ( left out er j oin) — внешнее объединение, в результат которого включаются все записи первой таблицы, даже при отсутствии связанных записей во второй таблице. Также см. объединение и внешнее объединение. логические операторы ( logical operat ors) — операторы AND, NOT и OR. логическое выражение ( Boolean expression) — любое выражение, возвращающее TRUE, FALSE или NULL. логическое имя ( logical nam e) — внутреннее имя, используемое в SQL Server для идентификации файлов. локальная переменная ( local variable) — переменная, определяемая пользователем. местонахождение (locale) — информация, описывающая языковые и национальные стандарты при регистрации пользователя в SQL Serv er. локальный сервер (local server) — сервер, к которому в данный момент подключен пользователь. метаданные (m et adat a) — данные, описывающие другие объекты баз данных. См. системный каталог. «многие ко многим», отношение ( m any-t o-m any, relat ionship) — отношение, при котором одной записи первой сущности соответствуют несколько записей второй сущности, а каждой записи второй сущности — несколько записей первой сущности. монопольная блокировка (exclusive lock) — режим блокировки, при котором другие процессы не могут установить блокировку для заблокированных записей. некластерный индекс (non-clust ered index) — индекс, в котором физический порядок данных отличается от порядка следования индекса. нормализация (norm alizat ion) — процесс удаления избыточных данных из сущности. объединение ( j oin) — процесс объединения данных из двух и более таблиц, представлений или процедур. объект базы данных (database obj ect ) — один из следующих элементов базы данных: таблица, индекс, триггер, представление, ключ, ограничение, значение по умолчанию, правило, пользовательский тип данных или хранимая процедура.

converted to PDF by BoJIoc

ограничение (const raint ) — свойство одного или нескольких столбцов таблицы. Ограничение сужает круг значений, которые могут храниться в столбце(ах). ограничение уровня столбца ( colum n-level const raint ) — ограничение, обеспечивающее целостность столбца. «один к одному» , отношение (one-t o-one, relat ionship) — отношение, при котором одной записи первой сущности соответствует одна запись второй сущности, а каждой записи второй сущности соответствует ровно одна запись первой сущности. «один ко многим», отношение ( one- t o-m any, relat ionship) — отношение, при котором одной записи первой сущности соответствует несколько записей второй сущности, но каждой записи второй сущности соответствует лишь одна запись первой сущности. однородные данные (hom ogeneous data) — данные, поступающие из одного источника, обслуживаемого одним провайдером. оповещение (alert ) — реакция на событие SQL Server, определяемая системным администратором откат ( rollback) — отмена транзакции и возврат модифицированных ею данных к исходному состоянию. отношение ( relat ionship) — ситуация, при которой одна сущность ссылается на первичный ключ второй сущности. пакет ( bat ch) — одна или несколько команд SQL, выполняемых SQL Server. параметр (param et er) — в хранимых процедурах параметр определяет величину, конкретное значение которой задается при вызове процедуры. Параметру может быть присвоена константа или переменная. первичный ключ ( prim ary key ) — возможный ключ, выбранный для идентификации записей данных в таблице. перекрестное объединение (cross j oin) — объединение, результат которого представляет собой декартово произведение. переменная (variable) — объект для хранения временных значений. Имена переменных начинаются с символа @. перенос данных (dat a m igrat ion) — перемещение данных из одного источника в другой. Также называется пересылкой данных. подзапрос (subquery ) — команда SELECT, создающая новый запрос. подключение ( connect ion) — установление соединения с SQL Server. поле (field) — часть записи, соответствующая столбцу в таблице базы данных. полное внешнее объединение ( full out er j oin) — внешнее объединение, которое возвращает все записи из обоих таблиц даже в том случае, если критерий объединения не дает совпадений в записях. См. также объединение и внешнее объединение. пользовательский тип данных ( user-defined dat a type) — тип данных, определенный пользователем. Должен быть основан на одном из стандартных типов SQL Server. порядок сортировки (sort order) — порядок, в котором SQL Server располагает символьные строки. посторонние слова ( noise words) — слова, не участвующие в полнотекстовых запросах. правило (rule) — объект базы данных, который определяет, какие данные могут находиться в столбце. правое внешнее объединение ( right out er j oin) — внешнее объединение, в результат которого включаются все записи второй таблицы, даже при отсутствии связанных записей в первой таблице.

converted to PDF by BoJIoc

представление ( view ) — логическая таблица, созданная командой SELECT путем выборки данных из одной или нескольких таблиц. преобразование данных ( dat a t ransform at ion) — изменение структуры или значений данных в процессе переноса. прикладной интерфейс ( API ) — набор функций, вызываемых приложениями. провайдер OLE DB ( OLE DB prov ider) — программный модуль, обслуживающий работу с источником данных через прикладной интерфейс OLE DB. проверка разрешений (perm issions validat ion) — процесс, задача которого — проверить, обладает ли пользователь правом выполнения той команды SQL Serv er, которую он пытается выполнить. прямой курсор ( forward- only cursor) — курсор, допускающий перебор записей только от первой к последней. псевдоним (alias) — альтернативное имя таблицы или столбца в выражении. разделяемая блокировка ( shared lock ) — блокировка, при которой другим пользователям разрешается читать заблокированные данные. разнородные данные (het erogeneous dat a) — данные, поступающие из двух и более источников данных, обслуживаемых разными провайдерами. разрешения (perm issions) — права доступа к объекту или команде. разрешения объекта ( object perm issions) — разрешения, предоставленные или отозванные для доступа к таблице или представлению. распределенная база данных (dist ribut ed dat abase) — база данных, которая физически находится на нескольких серверах. полнотекстовый запрос (full-t ext query) — команда SELECT с неформальной логикой и поиском приблизительных совпадений. полнотекстовый индекс (full-t ex t index) — особый индекс таблицы, который во включенном состоянии разрешает выполнять полнотекстовый поиск в таблице. Полнотекстовый индекс, в отличие от обычного, не изменяется автоматически при модификации данных. полнотекстовый каталог ( full- t ext cat alog) — механизм хранения полнотекстового индекса базы данных. Полнотекстовый каталог хранится во внешнем (по отношению к SQL Serv er) файле операционной системы. разностная архивация базы данных ( different ial database back up) — архивация базы данных, в которой участвуют только записи, изменившиеся с момента последней полной архивации. рекурсивное отношение ( recursive relat ionship) — отношение, в котором таблица связана сама с собой. Также называется «рефлективным» ( reflect ive) отношением. реляционная база данных ( relat ional dat abase) — база данных, построенная на основе реляционной модели. реляционная модель базы данных ( relat ional dat abase m odel) — модель данных, построенная на основе теории множеств, реляционной алгебры и реляционных вычислений. роль (role) — механизм обеспечения безопасности SQL Serv er, используемый для объединения пользователей с похожими правами. роль приложения ( applicat ion role) — роль баз данных SQL Server, при которой управление безопасностью осуществляется путем присвоения прав приложению. Данная роль активизируется паролем. связанный сервер (linked server) — удаленный источник данных OLE DB, определенный на локальном сервере.

converted to PDF by BoJIoc

серверный курсор (server cursor) — любой курсор, реализованный с использованием курсорных команд SQL. серверный курсор API (API server cursor) — серверный курсор, косвенно создаваемый обращениями к функциям прикладных интерфейсов ( API ), таких как ODBC, OLE DB, ADO и DB-Library. См. также курсор и серверный курсор. система с принятием решений (decision support system ) — приложение баз данных, используемое для анализа данных. системные базы данных (syst em dat abases) — четыре базы данных, создаваемые при установке SQL Server: m ast er, t em pdb, m odel и m sdb. системные таблицы (system t ables) — таблицы, образующие системный каталог и каталог баз данных. системные хранимые процедуры ( syst em st ored procedures) — набор хранимых процедур SQL Server для работы с системными таблицами. системный администратор ( syst em adm inist rat or) — любой пользователь с ролью sysadm in. системный каталог ( sy st em catalog) — системные таблицы базы данных m ast er, содержащие информацию об SQL Server. Не содержат информации о таблицах, входящих в базу. скалярный агрегат ( scalar aggregat e) — функция, которая применяется ко всем записям таблицы и генерирует сводное значение в виде одного из возвращаемых столбцов. словарь данных (dat a dict ionary ) — системные таблицы с описанием объектов баз данных. составной индекс (com posit e index) — индекс, состоящий из нескольких столбцов. составной ключ (com posit e key) — ключ, состоящий из нескольких столбцов. союз (union) — слияние результатов двух и более запросов. список выборки (select list ) — элементы, возвращаемые командой SELECT. ссылочная целостность (referent ial int egrity ) — правило, которое гарантирует, что для внешних ключей существуют ассоциированные первичные ключи. статический курсор (st at ic cursor) — курсор, в котором отображается состояние данных на момент открытия. статья (art icle) — базовая единица репликации. Статья может представлять собой таблицу или хранимую процедуру. столбец ( colum n) — отдельный атрибут данных в записи. страница ( page) — внутренняя единица хранения данных в SQL Server. Размер страниц в SQL Server равен 8 Кбайт. страница индекса (index page) — страница базы данных с данными, образующими индекс. СУБД (DBMS) — программа, управляющая доступом к данным. суррогатный ключ (surrogat e key) — возможный ключ в терминологии Microsoft . В нормальной терминологии так называется искусственно сгенерированный ключ. структура ( schem a) — описание базы данных на DDL. таблица (t able) — объект базы данных, содержащий информацию в табличной форме (то есть в виде строк и столбцов).

converted to PDF by BoJIoc

тип данных ( dat a t ype) — атрибут столбца, определяющий, какая информация может храниться в данном столбце. точка сохранения (savepoint ) — маркер, определяемый пользователем и обеспечивающий возможность частичного отката транзакций. транзакция ( t ransact ion) — логическая единица выполняемой работы. триггер ( t rigger) — аналог хранимых процедур. Автоматически выполняется при модификации данных. увеличение уровня блокировки (lock escalat ion) — процесс, в результате которого несколько блокировок, сгенерированных командой SQL, превращаются в блокировку более высокого уровня. удаленный сервер (rem ot e server) — сетевой сервер, доступ к которому осуществляется через локальный сервер. универсальные символы ( wildcard charact ers) — символы, используемые при поиске по шаблону (например, с ключевым словом LI KE в секции WHERE). уникальный индекс (unique index) — индекс, однозначно определяющий запись в таблице. уровень изоляции (isolat ion level) — параметр, определяющий степень блокировки данных в SQL Server. устройство архивации (backup device) — магнитная лента, файл или именованный канал, используемые для архивации или восстановления базы данных. файл ( file) — единица хранения информации в операционной системе. Базы данных SQL Server состоят из двух и более файлов операционной системы. файл базы данных ( dat abase file) — файл данных или файл журнала транзакций. файл данных ( data file) — файл с данными, образующими базу данных (в отличие от файла, в котором хранится журнал транзакций) . файл журнала (log file) — файл или набор файлов, в которых записываются текущие транзакции в базе данных. хранимая процедура ( st ored procedure) — совокупность команд SQL, хранящихся в SQL Serv er. целостность данных (dat a integrit y) — правильность и надежность данных в таблицах. целостность доменов ( dom ain integrit y) — процесс, в ходе которого проверяется соответствие значений всех атрибутов их доменам. целостность сущностей (ent ity int egrit y) — процесс, проверяющий наличие в таблице уникального первичного ключа. экстент ( ex tent ) — единица, используемая SQL Server для выделения места под таблицу или индекс. Экстент состоит из восьми смежных страниц одного файла общим объемом 64 Кбайт. ядро (k ernel) — главный модуль SQL Server. язык по умолчанию (default language) — язык, используемый сеансом для взаимодействия с SQL Server.

Центры обучения и сертификации в СНГ Таблица 1. Центры авторизованного обучения Microsoft в странах СНГ Местонахождение Наименование

Как связаться

converted to PDF by BoJIoc

центра www.rcom .ru/ lim t uт.293-29-59 ф.291-37-84 196135 , ул. Гастелло, [email protected]

Санкт-Петербург

ЛИМТУ

Санкт-Петербург

Учебно- технический www.it .spb.ruт.185 -49-88 ф.184 -42-97 198255, центр АйТи Санктул. Возрождения, д.4 info@it .spb.su Петербург

Санкт-Петербург

Компьютерная академия СофтДжойс

www.soft j oys.ruт.108-5463 196135, ул. Гастелло, д. 16 academ y@soft j oys.ru

Санкт-Петербург

Факультет переподготовки специалистов СПбГТУ

www.av alon.ru/ educat ionт.552-76-90 ф.552-6521 195251, ул. Политехническая, д.29, 4-й корп., ауд. 306 [email protected]

Санкт-Петербург

Com put er Educat ion Cent er " Support "

www.educate.spb.ruт.443-96 -98 ф.443-95-65 196135 , Россия, Санкт-Петербург, ул. Ленсовета, 14, оф. 227 inform @educate.spb.ru

Санкт-Петербург

Digit al Design

www.digdes.com т.168-39-72 ф.168-59 -71 192007 , ул. Боровая, д.57 , оф. 203 [email protected]

Алматы

АЛСИ

www.alsi.com т. 47-62-00 ф. 47-31 -50 480070 , Коктем-2 , дом 19-А [email protected]

Екатеринбург

Микротест

www.m icrot est .ruт. 6 05-253 ф. 605-175 620142, ул. Щорса, д.15 t raining@m icrot est .ru

Киев

Квазар- Микро

www.kv azar-m icro.com т. 443 -83 -96 ф. 434-8322 254136, ул. Северо-Сырецкая, д.3 [email protected] icro.com

Красноярск

MaxSoft

www.m axsoft .ruт. 65 -13-85 660049, ул. Урицкого 61m ax@m axsoft .ru

Минск

Nef

www.m insk .nef.byт. 232-5713 220013, пер. Якуба Коласа [email protected] insk.by

Москва

Академия АйТи

www.it .ruт.127-90-10 ф.129-12-75 117218, ул. Кржижановского, д.21а info@it .ru

Москва

Академия народного хозяйства, Microsoft m icrosoft .econom y.ruт./ ф. 564-8588 Сертифицированный (многоканальный) , 117571, Пр. Вернадского, д. центр технического 82, 2-й учебный корп., комн. 207 it t [email protected] обучения

Москва

Анкей/ Обучение

www.ankey .ru/ eduт.258-38-01 ф.258-38 08113114,ул. Летниковская, д.4 , строение 5 t raining@ankey .ru

Москва

Training.ru ( Весть)

www.t raining.ruт. 1 15-60-01 ф. 112-23-33 115446 , Коломенский проезд, д.1 а, 4 этаж t raining@vest .m sk.ru

Москва

Звезды и С

www.st ars- s.ruт. 251 -06-33 ф.251 -0633125040, Ленинградский проспект д.5 , стр. 2 info@st ars-s.ru

Москва

Микроинформ

www.m icroinform .ru/ t raining/ m icrosoft .htm т.953 00-06 ф.238-83-19113184, ул. Малая Ордынка, д.44 educ@m icroinform .ru

Москва

Оптима

www.opt im a.ru/ t rainingт. 263-9946 107082, Рубцовская наб., д. 3sim ony [email protected] im a.ru

converted to PDF by BoJIoc

Москва

САМАН- МАТИ

www.educat ion.ruт.915 -35-80 ф.915 -33-58 109240 , Берниковская наб., д.14, стр. 2, 4 этаж post m ast er@educat ion.ru

Москва

Сетевая Академия

www.academ y.ruт.967-66-70 ф.265-51-01 107066 , ул. Доброслободская, д.5 , стр.1 academ y@lanit .ru

Москва

Учебный центр ФОРС

www.fors.com т.129-06-45 ф.332 -48-45 117218, Нахимовский проспект, д.32 , 6-й этаж, офис 625 t [email protected]

Москва

Хьюлетт-Паккард А.О.

www.hp.ruт.978-39 -54 ф.973-04 -86 103055, ул. Новослободская, д.58 vladim ir_ov ert [email protected]

Москва

Центр Информационных Технологий

www.cit m gu.ruт.932-92-12 ф.939-08-05 119899, Воробьевы горы, МГУ им.Ломоносова info@cit m gu.ru

Москва

Центр компьютерного обучения УНЦ НПФ " Мастак" при МГТУ

www.ck o.bm st u.ruт.263-6963 2- ая Бауманская, д. 5 , ком. 703 ck [email protected] st u.ru

Москва

REDCENTER

www.redcent er.ruт./ ф. 932 -91-71 до 932-91 -75 119899 , Москва, Воробьевы горы, МГУ, Научный парк МГУ, корпус 2, REDCENTERm st rain@redcent er.ru

Москва

Xy los

www.xy los.com т.202-62-75 ф.202-88-73121019 , Малый Знаменский пер., д.8 , # 6Aask [email protected]

Новосибирск

SibI nfocenter

www.sibinfo.ruт.33-36-29 ф.39 -78-95 630090, ул. Пирогова, 2, ком[email protected]

Ташкент

NetDec

т. 1 32-0815 Ташкент, 700060, Азимов кучаси, 72Аnet dec@nayt ov .com

Ташкент

www.ucdm icros.com т. 132-0661, 133-9913 ф. Uzbek ist an Com put er 136 -2935 700000, ул. С.Азимова, 72а ( здание Design group Micros НПО "Коинот", центральный ( UCD Micros) вход)educat [email protected]

Томск

St ack Syst em s I nt egrat or

www.st ack.ru/ educat ionт. 553-433 ф. 554-431 634012 г.Томск, ул.Щорса, 2аedu@st ack.ru (iao?aiea)cert @st ack.ru ( сертификация)

Уфа

Центр информационных технологий

т. 2 53-853 ф. 253-771 450001 , ул. Степана Халтурина, д.39 m icrosoft @it .ufanet .ru

Таблица 2. Центры тестирования Sylvan Prom et ric Местонахождение Наименование центра

Как связаться

Санкт-Петербург

ЛИМТУ

w ww.rcom .ru/ lim t uт.293 -29-59 ф.291-37-84 196135, ул. Гастелло, [email protected]

Санкт-Петербург

Санкт- Петербургский Электротехнический Университет

т.234 -59-68 ф.234 -59-68197376 ул. Проф. Попова, д.3, 5 -й корпусlet i@sov am su.sov usa.com

Алматы

АЛСИ

w ww.alsi.com т. 47-62-00 ф. 47-31 -50 480070, Коктем-2, дом 19 -А [email protected]

Екатеринбург

Микротест

w ww.m icrotest .ruт. 6 05-253 ф. 605-175 620142, ул. Щорса, д.15

converted to PDF by BoJIoc

t raining@m icrotest .ru Екатернибург

НПВП " ЛАНТЕС"

w ww.lant es.ruт.555-432 ф.568-206620075 ул. Луначарского, д.81webm ast er@lant es.ru

Екатенринбург

Уральский центр тестирования

w ww.usu.ru/ aptcт.55 -74-40 ф.55-7385620083, ул.Тургенева, 4 , ауд. 524а[email protected]

Киев

Квазар-Микро

w ww.kvazar-m icro.com т. 443-83 -96 ф. 43483-22 254136, ул. Северо-Сырецкая, д.3 [email protected] icro.com

Москва

НТ- Центр

w ww.nt c.ruт.256 -16-92 ф.956-37-92123022 ул. 2 -я Звенигородская, д.13educ@nt c.ru

Москва

САМАН-МАТИ

w ww.educat ion.ruт.915-35 -80 ф.915 -33 -58 109240, Берниковская наб., д.14, стр. 2, 4 этаж post m ast er@educat ion.ru

Москва

Учебный центр ФОРС

w ww.fors.com т.129-06 -45 ф.332-48-45 117218, Нахимовский проспект, д.32, 6 -й этаж, офис 625 t [email protected]

Новосибирск

Вест Про

т.326 -244 ф.355 -237630081 Красный проспект, д.72 apt [email protected]

Новосибирск

" Новосибиркий Государственный Университет"

т.205 -823 ф.216 -164630090 ул. Пирогова, д.2westpro@subnet .ru

ПетропавловскКамчатский

КИТС

т.11-28-08 ф.11-20-12683000, ул. Ленинская, 46post m ast er@k it s.kam chat ka.su

Саратов УЦ

" Трайтек"

w ww.t rit ec.ru/ ucт.( 095 ) 733-93-32 ф.(8452) 50-88-95 , (8452) 50 -43-09, 50-84 76410026, Привокзальная пл.1, офис 3edu@t ritec.rulugovoy@t rit ec.ru

Томск

Центр обучения и сертификации, фирма " Стек"

w ww.st ack .ruт.553-433 ф.554-431634012 , ул.Щорса, 2аcert@st ack .ru

Таблица 3. Центры тестирования VUE Местонахождение

Наименование центра

Как связаться

Санкт-Петербург

ЛИМТУ

www.rcom .ru/ lim t uт.293-29-59 ф.291-37-84 196135 , ул. Гастелло, [email protected]

Санкт-Петербург

Com put er Educat ion Cent er " Support "

www.educate.spb.ru443-96 -98/ 443-95 65196135, ул. Ленсовета, 14, оф. 227 inform @educat e.spb.ru

Алматы

Manon Trading Group 642 -691/ 646-765480100 , проспект Абая 4info@ I nc.m anon.k im ep.kz m anon.kim ep.k zt rain_cert@ m anon.k im ep.kz

Киев

Квазар- Микро

www.kv azar-m icro.com т. 443-83-96 ф. 434-8322 254136, ул. Северо-Сырецкая, д.3 [email protected] icro.com

Красноярск

MaxSoft

www.m axsoft .ruт. 65 -13-85 660049, ул. Урицкого 61m ax@m axsoft .ru

Москва

Академия народного m icrosoft .econom y.ruт./ ф. 564 -8588 хозяйства, (многоканальный) , 117571, Пр. Вернадского, д. Сертифицированный 82, 2-й учебный корп., комн. 207 it t [email protected] центр технического

converted to PDF by BoJIoc

обучения Microsoft Москва

Звезды и С

www.st ars- s.ruт. 251 -06-33 ф.251 -0633125040, Ленинградский проспект д.5 , стр. 2 info@st ars-s.ru

Москва

Микроинформ

www.m icroinform .ru/ t raining/ m icrosoft .htm т.953 00-06 ф.238-83-19113184, ул. Малая Ордынка, д.44 educ@m icroinform .ru

Москва

Сетевая Академия

www.academ y.ruт.967-66-70 ф.265-51-01 107066 , ул. Доброслободская, д.5 , стр.1 academ y@lanit .ru

Москва

Анкей/ Обучение

www.ankey .ru/ eduт.258-38-01 ф.258-38 08113114,ул. Летниковская, д.4 , строение 5 t raining@ankey .ru

Москва

Учебный центр ФОРС

www.fors.com т.129-06-45 ф.332 -48-45 117218, Нахимовский проспект, д.32 , 6-й этаж, офис 625 t [email protected]

Москва

САМАН- МАТИ

www.educat ion.ruт.915 -35-80 ф.915 -33-58 109240 , Берниковская наб., д.14, стр. 2, 4 этаж post m ast er@educat ion.ru

Москва

Training.ru ( Весть)

www.t raining.ruт. 1 15-60-01 ф. 112-23-33 115446 , Коломенский проезд, д.1а, 4 этаж t raining@vest .m sk.ru

ПетропавловскКамчатский

КИТС

т.11-28 -08 ф.11-20-12683000, ул. Ленинская, 46post m ast er@kit s.kam chat ka.su

Ташкент

www.ucdm icros.com т. 132-0661, 133-9913 ф. Uzbek ist an Com put er 136 -2935 700000, ул. С.Азимова, 72а ( здание Design group Micros НПО "Коинот", центральный ( UCD Micros) вход)educat [email protected]

Томск

St ack Syst em s I nt egrat or

www.st ack.ru/ educat ionт. 553-433 ф. 554-431 634012 г.Томск, ул.Щорса, 2аedu@st ack.ru (обучение) cert @st ack.ru ( сертификация)

Шпаргалка

D a t a ba se D e sign on SQL Se r ve r 7 Проектирование реляционных баз данных 1. Нормальные формы: • Первая нормальная форма — удаление повторяющихся групп атрибутов. • Вторая нормальная форма — удаление избыточных данных и частичных зависимостей. • Третья нормальная форма — удаление атрибутов, не зависящих от первичного ключа. 2. Избыточными являются данные, хранящиеся в базе в нескольких экземплярах, а также производные данные (вычисляемые на основании других столбцов) . 3. Отношение «многие-ко-многим» преобразуется в объединение таблиц. 4. Рекурсивное отношение представляется на диаграмме в виде линии, которая соединяет таблицу саму с собой. 5. Внешний ключ связывает зависимую таблицу с первичным ключом или уникальным ключом родительской таблицы. 6. Для обеспечения ссылочной целостности используются внешние ключи, ограничения или триггеры.

converted to PDF by BoJIoc

Файлы и базы данных 7. Группы файлов используются в SQL Server 7 для размещения конкретных файлов и индексов на конкретном диске. В предыдущих версиях SQL Server для этой цели использовались сегменты. 8. Если в команде CREATE DATABASE не указан файл данных или файл журнала, SQL Server создает файл по умолчанию. 9. Если при создании таблицы или индекса базы данных не указана группа файлов, в которую они входят, таблица или индекс включаются в первичную группу файлов. 10. Если группа состоит из нескольких файлов, то SQL Server распределяет таблицы и индексы по файлам группы. 11. Файлы журнала не могут включаться в группы. Определение данных 12. Значение столбца с типом данных UNI QUEI DENTI FI ER (GUI D) уникально для всех серверов. 13. Столбец счетчика не гарантирует глобальной уникальности значений. 14. Если при ручной вставке в столбец счетчика новое значение превышает текущий максимум, автоматическая генерация значений столбца счетчика будет продолжена с новой величины. 15. Столбец нельзя удалить, если он используется в репликации, индексе, ограничении, имеет значение по умолчанию или связан с правилом. 16. Внимание: в таких программах, как Query Analyzer и OSQL, по умолчанию для столбцов разрешены значения NULL. Однако в SQL Server по умолчанию значения NULL запрещаются. Команда SELECT 17. При использовании функции SUBSTRI NG нумерация начальной позиции начинается с 1. 18. Функция может быть вызвана для результата вызова другой функции. 19. Команда SELECT без секций WHERE или HAVI NG возвращает каждую запись. 20. При использовании агрегатной функции все столбцы итогового набора либо являются агрегатными функциями, либо включаются в секцию GROUP BY. 21. Агрегатные функции могут включаться в секцию WHERE только как компоненты подзапросов. 22. Любая команда SQL присваивает значение @@ERROR. Модификация данных 23. Даже если команда UPDATE не модифицирует ни одной записи, это не приводит к возникновению ошибки. 24. При использовании секции LI KE символ % означает любую строку, а символ _ — любой символ. Индексы 25. Коэффициент заполнения определяет объем свободного места, резервируемого при создании индекса или при выполнении команды DBCC DBREI NDEX. Свободное место может повысить скорость вставки. 26. При снижении быстродействия стоит обновить статистику. Представления, правила и значения по умолчанию

converted to PDF by BoJIoc

27. В SQL Server представление может содержать союз. 28. С каждым столбцом могут быть связаны лишь одно правило и одно значение по умолчанию. Программирование 29. Выполняется лишь команда, непосредственно следующая за командой I F. Чтобы выполнить несколько команд после I F, необходимо воспользоваться блоком. 30. Команды I F влияют на значение глобальной переменной @@ROWCOUNT. 31. В SQL Server 7 при создании хранимых процедур не проверяется существование объектов (например, таблиц). Триггеры 32. Чтобы при удалении из базовой таблицы происходило автоматическое удаление из подчиненной таблицы, следует воспользоваться триггером DELETE. 33. Для одной таблицы можно определить несколько триггеров одного типа. Загрузка данных 34. BCP и BULK I NSERT используются для загрузки файлов с простыми данными, не нуждающимися в преобразованиях. 35. Если загружаемые данные требуется преобразовать, воспользуйтесь DTS. Полнотекстовый поиск 36. Полнотекстовый поиск позволяет находить неточные совпадения. 37. При архивации или загрузке базы данных полнотекстовый индекс не архивируется и не загружается вместе с данными. 38. В полнотекстовых запросах используются предикаты CONTAI NS и FREETEXT. Диагностика и сбор данных 39. Если в выходных данных DBCC SHOWCONTI G фактическое число переходов между страницами отличается от оптимального, значит, таблица фрагментирована. 40. SQL Server регистрирует ошибки в журнале ошибок SQL Server, в журнале приложений NT или в обоих журналах, если SQL Server был запущен как служба. 41. SQL Server регистрирует ошибки только в журнале ошибок SQL Server лишь в том случае, если он был запущен в режиме командной строки. 42. По выходным данным sp_who можно узнать, мешает ли один процесс работе другого; SPI D блокирующего процесса указан в столбце BLK. 43. По выходным данным sp_lock можно узнать тип блокировок, установленных процессом, а также определить заблокированные объекты.