converted to PDF by BoJIoc
Благодарности Я хотел бы поблагодарить всех людей, чьи время и поддержка сделали возможным создание этой книги: от моего агента, который нашел для нас издательство Coriolis, и до команды в Coriolis, которая смогла улучшить эту книгу. Более всего я бы хотел поблагодарить мою семью, которая предоставила мне время и место, чтобы я сделал эту работу. Спасибо вам за все. Джефф Гарбус Я хочу поблагодарить Джеффа Гарбуса за то, что он подключил меня к работе над этой книгой. Спасибо моим родителям Фрэнку и Ширли Паскузи, которые наделили меня жаждой знаний и научили меня разбираться в проблемах и находить решения. Особое спасибо моей чудесной жене Пауле, благодаря которой я смог писать эту книгу в дополнение к моей основной работе. Кроме того, спасибо моей дочери Бейли и сыну Коннеру за то, что они позволили папе работать над книжкой, когда им так хотелось играть. Дэвид Паскузи Спасибо Джеффу Гарбусу за то, что он предоставил мне возможность внести свой вклад в эту книгу. Спасибо Гэрри Туреллу, который прислушался ко мне, когда мне понадобился перерыв. Спасибо моему брату Бэзилу, чьи телефонные звонки поздно ночью хотя и увеличили мой счет за телефон, но сохранили мне здравый рассудок. И особое спасибо моим родителям Юлингу и Ючинг Чанг, которые когда-то усадили меня за компьютер в первый раз. Элвин Чанг
Об авторах Получив степень бакалавра в Политехническом институте города Ренселер, Джефф Гарбус (Jeff Garbus) работал в самых разных областях — от PC к мэйнфреймам и обратно. Джефф имеет многолетний опыт работы с клиент-серверными системами и программами Sybase, особенно по оказанию помощи клиентам при их переходе на новые системы в рамках пилотных и крупномасштабных проектов. В течение многих лет Джефф выступал на конференциях пользователей, писал статьи и заметки для национальных и международных изданий, а также написал около 10 книг, среди которых издающаяся в настоящее время в серии «Сертификационный экзамен — экстерном» книга «Разработка баз данных на SQL Server 7.0 для MCSE». В настоящее время Джефф — президент консалтинговой и обучающей фирмы Soaring Eagle Consulting, специализирующейся на решении бизнес-проблем в области СУРБД, которая находится в городе Тампа. Дэвид Паскузи (David Pascuzzi) — преподаватель, автор и консультант по компьютерам, специализирующийся в области технологий баз данных уже более 10 лет. По заказу правительства и частных фирм он готовил курсы для обучения, а также писал разнообразные статьи по технологиям баз данных. В своей работе по консалтингу он решает вопросы от поддержки баз данных и настройки их для повышения производительности до разработки баз данных. В настоящее время имеет степень MCP по SQL Server. После ее получения Дэвид уделяет особое внимание разработке курсов и консультациям по SQL Server. Элвин Чанг (Alvin Chang) — преподаватель, автор и консультант, работающий в консалтинговой и обучающей фирме Soaring Eagle Consulting в городе Тампа. Обладая степенью MCP по SQL Server, он занимается обучением и консалтингом по SQL Server в США. Специализируясь в настоящее время по администрированию в области систем Microsoft и Sybase System, Элвин начинал как преподаватель, обучающий продуктам Microsoft Office, Lotus Smartsuite и Lotus Notes до того момента, когда он перешел на СУРБД.
converted to PDF by BoJIoc
Введение Добро пожаловать! Цель этой книги — помочь вам подготовиться и сдать сертификационный экзамен Microsoft номер 70-029, который называется Designing and Implementing Databases on Microsoft SQL Server 7.0 (Разработка и внедрение баз данных при помощи Microsoft SQL Server 7.0). В этом разделе мы расскажем о программе сертификации Microsoft в общих чертах, а также покажем, как книги серии «Сертификационный экзамен — экстерном» могут помочь в сдаче экзаменов Microsoft. Книги этой серии помогут вам лучше понять материал, знание которого необходимо для успешной сдачи экзаменов. Серия «Сертификационный экзамен — экстерном» нацелена именно на подготовку к экзаменам. Эти книги не учат буквально всему, что вы должны знать о предмете экзамена (например, всем деталям архитектуры или программирования SQL Server). Тем не менее, мы (авторы) рассматриваем и анализируем проблемы, которые вы, скорее всего, встретите на экзамене. Многое было взято из учебных материалов и тренировочных тестов самой Microsoft, а также из множества тестов для самопроверки разных фирм. Наша цель — дать как можно больше информации, которая пригодится вам при сдаче сертификационного экзамена. Однако чтобы быть готовым полностью к любому экзамену Microsoft, мы рекомендуем вам ознакомиться с тестом для самооценки, который следует в этой книге непосредственно за разделом «Особенности сертификации в России». Это поможет вам оценить, удовлетворяют ли ваши знания требованиям, предъявляемым к MSCE. Основываясь на результатах теста, вы сможете выбрать для себя или обучение в сертифицированном центре, или самостоятельную подготовку с помощью учебных пособий Microsoft или других фирм, в том числе из серии «Сертификационный экзамен — экстерном». Мы также настоятельно рекомендуем вам попрактиковаться в установке, настройке и работе с программным продуктом или средой, по которой вы будете проходить тестирование, потому что для понимания вопросов, которые встретятся на экзамене, ничто не заменит вам реального опыта работы. Важно учиться по книгам, но опыт — лучший учитель! Программа «Сертифицированный профессионал Microsoft» (MCP) На момент написания этой книги программа MCP состояла из семи отдельных направлений, каждое из которых обозначается отдельным сокращением (каждому будущему сертифицированному специалисту необходимо относиться к сокращениям терпимо): • MCP (Microsoft Certified Professional) — наименее престижная сертификация. Этот статус позволяет получить успешная сдача любого экзамена Microsoft (за исключением Networking Essentials). Вы можете доказать свое знание продуктов Microsoft сдачей дополнительных экзаменов. • MCP + I (Microsoft Certified Professional + Internet) — эта сертификация среднего уровня требует сдачи трех обязательных экзаменов: Windows NT Server, TCP/IP и Internet Information Server. • MCP + SB (Microsoft Certified Professional + Site Building) — новая сертификация предназначена для специалистов, которые занимаются планированием, созданием, управлением и обслуживанием Webсерверов. Лица, которые стремятся получить этот статус, должны обладать навыками по созданию Webсерверов, которые включают в себя мультимедийное содержимое и средства поиска, а также могут публиковать в Интернете базы данных. Чтобы стать MCP+SB, необходимо сдать один любой экзамен, который позволяет получить статус MCP, а также два экзамена из следующих трех: Designing and Implementing Commerce Solutions with Microsoft Site Server 3.0, Commerce Edition (Разработка и внедрение коммерческих приложений на основе коммерческого варианта Microsoft Site Server 3.0), Designing and Implementing Web Sites with Microsoft FrontPage 98 (Разработка и внедрение Web-серверов с использованием Microsoft FrontPage 98), а также Designing and Implementing Web Solutions with Microsoft Visual InterDev 6.0 (Разработка и внедрение решений на основе Web при помощи Microsoft Visual InterDev 6.0). • MCSE (Microsoft Certified Systems 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, нужно сдать в общей сложности пять экзаменов — четыре обязательных и один по выбору. К обязательным относятся: Administering Microsoft SQL Server 7.0 (Администрирование Microsoft SQL Server 7.0), Designing and Implementing Databases with Microsoft SQL Server 7.0 (Разработка и внедрение баз данных при помощи Microsoft SQL Server 7.0), Implementing and Supporting Microsoft Windows NT Server 4.0 (Внедрение и поддержка Windows NT Server 4.0) и Implementing and Supporting Microsoft Windows NT Server 4.0 in the Enterprise (Внедрение и поддержка корпоративных технологий Windows NT Server). Из экзаменов по выбору можно предпочесть либо экзамен по особенностям использования SQL Server — Designing and Implementing Distributed Applications with Microsoft Visual C++ 6.0 (Разработка и внедрение распределенных приложений с помощью Microsoft Visual C++ 6.0) (экзамен 70-015) или с помощью Visual Basic 6.0 (экзамен 70-175), Designing and Implementing Data Warehouses with Microsoft SQL Server 7.0 and Microsoft Decision Support Services 1.0 (Разработка и внедрение хранилищ данных с помощью Microsoft SQL Server 7.0 и Microsoft Decision Support Services 1.0), либо экзамен по Windows NT — Internetworking with Microsoft TCP/IP on Microsoft Windows NT 4.0 (Работа с Microsoft TCP/IP в сетях под управлением Microsoft Windows NT 4.0) или Implementing and Supporting Microsoft Internet Information Server 4.0 (Внедрение и поддержка Microsoft Internet Information Server 4.0). Эта книга готовит к сдаче обязательного для сертификации MCDBA экзамена. Полностью требования к MCDBA представлены в табл. 3. • MCT (Microsoft Certified Trainer). Сертифицированные инструкторы Microsoft должны соответствовать требованиям, необходимым для преподавания в рамках авторизованных курсов Microsoft, в области как технических знаний, так и методических навыков. Для каждого курса, который хочет вести MCT, необходимо сдать соответствующий сертификационный экзамен и пройти авторизованное обучение, а также продемонстрировать способности к обучению. Удовлетворить последнему критерию можно, если у вас уже есть сертификация инструктора от фирмы Novell, Banyan, Lotus, Santa Cruz Operation или Cisco или вы получили специальный опыт в преподавании курсов Microsoft. MCT отводится важная роль в системе обучения Microsoft. Только сертифицированные инструкторы имеют право читать авторизованные курсы в любых структурах, занимающихся авторизованным обучением, — будь то Сертифицированные центры технического обучения Microsoft (CTEC) или Институт онлайнового обучения Microsoft (MOLI). Сертификация — это непрерывный процесс. Как только продукт Microsoft устаревает, сертифицированным специалистам дается обычно от 12 до 18 месяцев для того, чтобы сдать сертификационный экзамен по более свежей версии продукта (если этого не сделать, звание сертифицированного специалиста будет утрачено). В связи с бурными технологическими изменениями такой подход вполне объясним. Лучший способ получить дополнительные сведения о программе MCP и разнообразных способах сертификации — обратиться на Web-сайт Microsoft. Раздел, посвященный сертификации, называется Microsoft Certified Professional Web site, а его начальная страница находится по адресу www.microsoft.com/mcp. Поскольку Web-сайт Microsoft постоянно изменяется, возможно, вам придется провести на нем поиск по словосочетаниям MCP или «Microsoft Certified Professional Program» (последнее словосочетание для поиска лучше заключить в кавычки). Это позволит вам найти наиболее свежую и точную информацию по программам сертификации Microsoft. Кроме того, можно приобрести специальный компакт-диск, включающий в себя «Путь к образованию и сертификации Microsoft» («Microsoft Education and Certification Roadmap»). Содержание его во многом совпадает с содержанием Web-сайта Microsoft и обычно обновляется ежеквартально. Сдача сертификационного экзамена Увы, тестирование не бесплатно. Вы заплатите за экзамен около 30 долларов в России и 100 долларов — в США и Канаде, независимо от того, сдали вы его или потерпели неудачу. Прием экзаменов осуществляется в авторизованных центрах тестирования Sylvan Prometric и Virtual University Enterprise (VUE), список которых можно получить на сайтах этих организаций — www.prometric.ru и www.it.spb.ru/vue.
converted to PDF by BoJIoc
В день экзамена постарайтесь прийти примерно за 15 минут до назначенного времени. Следует заранее выяснить в центре тестирования, что вам нужно будет взять с собой (обычно — удостоверение личности с фотографией). Все экзамены относятся к типу экзаменов «с закрытой книгой». Это означает, что вам не будет разрешено пользоваться на экзамене справочными материалами (у вас будут только ручка, листок бумаги и словарь общего назначения, если вы сдаете тест на иностранном языке). Перед тем как вы запустите тест, запишите на листке бумаги все, что, как вам кажется, придется вспоминать на экзамене, — это поможет сэкономить время в ходе экзамена. В книгах серии «Сертификационный экзамен — экстерном» в конце имеется шпаргалка с такой информацией. Перед началом экзамена у вас будет время вспомнить и записать эту информацию и, если есть необходимость, даже сдать пример теста, чтобы освоиться с интерфейсом тестирующей программы. Пример теста может пригодиться в первый раз, но вряд ли потребуется в дальнейшем. По окончании экзамена его результаты будут выведены на экран и на принтер. Все результаты оцениваются из расчета 1000 баллов, и иногда они дополнительно расшифровываются по темам экзамена. Даже если экзамен не сдан, мы советуем получить в центре тестирования официальный отчет, который позволит вам лучше подготовиться к пересдаче. Пересдача экзамена стоит столько же, сколько и первоначальный экзамен. Недавно компания Microsoft ввела новую политику в отношении пересдачи. Теперь первая пересдача может производиться на следующий день, а любая из последующих — по истечении 14-дневного периода. Получение статуса MCP Сдав любой экзамен, кроме Networking Essentials, вы получаете статус MCP. В фирме Microsoft существует список сданных вами экзаменов — так называемый транскрипт. Вы можете получить транскрипт по электронной почте, отослав свой адрес электронной почты на
[email protected]. Вы можете также заказать и получить копию транскрипта, обратившись по соответствующим телефонам (номера можно узнать, загрузив с Web-узла Microsoft свежую версию MCT Guide, в которой есть раздел «Key Contacts»). После того как вы сдадите необходимый набор экзаменов (шесть MCSE или девять MCSE+I), на ваш адрес почтой будет отправлен пакет, так называемый Welcome Kit. Обычные сроки его получения — от 2 до 4 недель с момента сдачи экзамена, так что не рассчитывайте получить его на следующее утро. Внутри пакета находятся: • Соответствующий сертификат, предназначенный для того, чтобы повесить его на видное место, пластиковая карточка сертифицированного профессионала Microsoft и нагрудный значок. • Лицензионное соглашение об использовании логотипа MCP в рекламных материалах, визитных карточках, фирменных бланках, документах и т. д. Кроме того, в состав пакета включены образцы логотипа и его описания. Перед использованием логотипа необходимо подписать указанное соглашение и переслать его в фирму Microsoft. • Если вы получили статус MCSE или MCSE+I, то получите бесплатную годовую подписку на TechNet, подборку компакт-дисков, включающую техническую документацию, программное обеспечение, Service Packs, базы данных и другую техническую информацию. По нашему мнению, подписка на TechNet — одно из наиболее ценных преимуществ, которые получает сертифицированный специалист. • Бесплатная подписка на Microsoft Certified 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 Certification Download page (www.microsoft.com/ Train_Cert/download/download.htm). Найдите эти материалы, загрузите их и используйте! • Обучение в сертифицированных центрах. Авторизованные центры обучения, Институт онлайнового обучения Microsoft, а также множество компаний, занимающихся неавторизованным обучением, предлагают (или предложат в ближайшее время) обучение администрированию SQL Server 7. Цель обучения — помочь получить знания для работы с SQL Server и сдачи экзаменов. Большинство тех, кто проходил обучение (к ним также присоединяются и авторы, которые ведут такие курсы), согласны с тем, что курсы стоили затраченных на них денег. Для того чтобы помочь вам ориентироваться в публикациях за пределами этой книги, в конце каждой главы есть раздел «Дополнительная информация», который содержит ссылки на более подробные источники по теме главы. • Компакт-диски TechNet. Ежемесячные выпуски TechNet от Microsoft доставляются по подписке. TechNet включает в себя Resource Kits по продуктам Microsoft и относящуюся к ним документацию. Кроме того, в TechNet включены Microsoft Knowledge Base — база знаний Microsoft — и разного рода полезные программы, техническая документация (white papers), материалы для самостоятельного освоения программных продуктов, все служебные пакеты (service packs), включая отдельные заплаты (pathes), и дополнительные драйверы, вышедшие в период после выпуска программного продукта. Мы считаем, что содержание TechNet полностью оправдывает расходы на подписку. Перечисленный набор обязательных и рекомендуемых материалов покрывает все темы, связанные с SQL Server 7. Мы надеемся, что, оценивая эту книгу, вы придете к мысли, что она хорошо вписывается в этот набор. В следующем разделе мы объясним структуру этой книги и покажем, почему эта книга может рассматриваться как полноправный член списка обязательных и рекомендованных для чтения материалов.
Об этой книге Каждая глава этой книги написана по определенному плану, при этом наиболее важная и полезная информация графически выделена. Обычно глава включает: • Список ключевых терминов. Каждая глава начинается со списка терминов, инструментов и навыков, которыми вы должны полностью овладеть, изучая данную главу. За списком обычно идет один или два параграфа, которые должны послужить введением к главе. В основном эта книга полностью соответствует описанной структуре, но есть еще несколько моментов, на которые стоит обратить внимание. Так, глава 14 включает примерный тест, который позволит дополнительно закрепить все усвоенное из этой книги и оценить степень своей готовности к экзамену. Глава 15 содержит ответы на вопросы примерного экзамена. В конце книги вы найдете глоссарий, который поможет узнать, что означает тот или иной термин, а также алфавитный указатель, который позволит вам найти упоминание об этом термине в тексте. В самом конце книги находится «шпаргалка» — сжатый и комплексный подбор данных, схем и подсказок, которые вы должны выучить перед сдачей экзамена. Вы можете воспроизвести всю информацию на листке бумаги до того, как начнете отвечать на вопросы теста. В связи с этим можно попробовать зазубрить информацию перед экзаменом: вы должны помнить ее только до того момента, когда напишете на листке бумаги перед началом экзамена. Может быть, есть смысл бросить на «шпаргалку» последний взгляд в машине или даже в коридоре центра тестирования непосредственно перед экзаменом. Как использовать эту книгу Если вы в первый раз готовитесь к сдаче экзамена, есть смысл идти по главам в том порядке, в котором они расположены в данной книге. Это связано с тем, что некоторые темы в конце книги будет проще понять,
converted to PDF by BoJIoc
изучив ее начало. Если же вы хотите пропустить определенные темы или вы пытаетесь сдать экзамен уже не в первый раз, тогда используйте индекс или оглавление, чтобы сразу перейти к теме, которая вас интересует. Кроме сдачи экзаменов, эта книга может оказаться полезной для усвоения некоторых наиболее важных свойств SQL Server 7. Все компоненты нашей книги служат одной цели — помочь вам подготовиться и успешно сдать сертификационный экзамен Microsoft номер 70-029 Designing and Implementing a Database with Microsoft SQL Server 7.0 (Разработка и внедрение баз данных при помощи Microsoft SQL Server 7.0). Мы будем рады, если вы пришлете нам свое мнение об этой книге, особенно если выскажете при этом какие-либо конкретные предложения по ее улучшению. Мы постараемся с благодарностью воспринять все, что вы пришлете, и ответить на все ваши предложения. Благодарим вас и желаем получить удовольствие от книги!
Особенности сертификации в России Сертификация в России имеет свои особенности, которые мы постараемся осветить в этой главе. Цели сертификации Главное отличие сертификации в России и за рубежом, по-видимому, заключается в том, каким образом принимаются решения о необходимости сдачи тестов и чем руководствуется специалист, решивший получить сертификацию. В США обычно необходимость сертификации записана в должностной инструкции, контракте и т. п. Существует определенное правило — сотрудник с установленными зарплатой и кругом обязанностей должен иметь (или получить в течение определенного срока), например, статус MCSE. Из этого вытекает и все остальное — например то, что обучение и определенное количество попыток сдачи экзаменов оплачивает работодатель. Интересно, что иногда слишком большое количество званий у специалиста может стать препятствием к получению им работы. Например, на определенную должность (типа поддержки рабочих станций — Workstation support), согласно штатному расписанию, должен быть принят сотрудник со статусом MCP по NT Workstation или Windows 95. Сотрудника со статусом MCSE на эту должность уже не возьмут — существует правило, согласно которому сертифицированному инженеру необходимо платить другую сумму, и фирма может отказаться от специалиста с более высокой сертификацией. Поэтому экзамены «на всякий случай» сдаются за рубежом относительно редко. В России в настоящий момент ситуация несколько другая. В штатных расписаниях обычно указываются требования в виде специального образования, определенного стажа работы по специальности и крайне редко — требования иметь сертификацию определенной фирмы. Исключение составляют только филиалы и дочерние компании иностранных фирм, а также очень немногочисленные предприятия с западной корпоративной культурой. В то же время, достаточно часто бывает и так, что квалифицированному специалисту в течение долгого времени трудно подобрать работу с соответствующим уровнем оплаты труда и он старается использовать все возможности доказать свою квалификацию работодателям. В связи с этим большинство из тех, кто сдает в настоящее время в России экзамены на звание сертифицированного специалиста, делают это по собственной инициативе. Хорошо это или плохо? Конечно, хорошо. Во-первых, звание сертифицированного специалиста — это, пожалуй, лучший способ доказать свою квалификацию, если нет возможности представить множество рекомендаций. Звание сертифицированного специалиста особенно ценится при получении работы через кадровые агентства, а также при устройстве на работу за границей или в филиалы иностранных компаний. При этом следует упомянуть, что, например, в США звание MCSE ценится выше высшего образования по специальности, которое, если оно получено не в США, еще надо подтвердить. Во-вторых, обычно, получив сертификацию, специалист повышает свой авторитет в глазах окружающих, и многие вещи трактуются уже иначе. В одной и той же ситуации шеф может сказать так: «Что-то наш отдел автоматизации подкачал», а может и так: «Техника — она и есть техника, а ведь вроде brandname купили».
converted to PDF by BoJIoc
Естественно, чем выше ваш авторитет, тем чаще ситуации будут оцениваться по второму варианту. Может быть, это и не очень серьезно, но тем не менее... В-третьих, сертифицированный специалист обычно не просто умеет работать с программным продуктом, а делает это в соответствии с определенными стандартами и принятыми правилами, что в значительной степени гарантирует отсутствие проблем при переходе на новые версии и сокращает время, необходимое на переучивание, при переходе в другую организацию. В-четвертых, обычно сертификация типа MCSE или MCDBA подразумевает также неплохое знание технического английского и знание источников информации по программным продуктам, что обычно также идет специалисту «в плюс». В-пятых, сертификация — это еще и психологическая характеристика специалиста. С одной стороны, он не испугался достаточно сложных экзаменов, с другой — сумел потратить достаточно много времени на подготовку, а это уже говорит о том, что он заинтересован и дальше развиваться как специалист. Необходимо также упомянуть о большой усидчивости и настойчивости, которая необходима для получения MCSE или MCDBA. Перечислять плюсы можно еще достаточно долго. Но, возможно, один из самых интересных моментов — это то, что экзамены — это всегда вызов сдающему, и притом серьезный, и чувство победы заслуживает того, чтобы его испытать. Подготовка к экзаменам Подготовка к экзаменам в России также имеет свои особенности. Безусловно, лучший способ — это авторизованные курсы в учебном центре Microsoft (ATEC). Обучение в таких центрах ведется по материалам Microsoft в учебных классах, в которых регламентировано буквально все — от рабочих станций до кондиционеров (список ATEC в странах СНГ приведен в табл. 1 в приложении «Центры обучения и сертификации в СНГ» в конце книги). Курсы полностью идентичны проводимым за рубежом, за исключением языка, на котором они читаются. После завершения курса выдаются сертификаты об окончании авторизованных курсов Microsoft, которые ценятся, конечно, меньше, чем сертификации, но все равно являются серьезными документами. При этом обучение ведется преподавателями, которые как минимум уже сдали экзамен по тому предмету, который они читают, поэтому у них обычно можно получить информацию не только по программному продукту, но и по особенностям экзамена. Будет очень удачно, если вы сможете пройти по так называемой сборке — сразу по нескольким курсам, специально подобранным для получения определенной сертификации. Это выгодно и по финансовым соображениям, и с той точки зрения, что преподавателю не надо будет дублировать определенные повторяющиеся в разных курсах моменты. Сборка по сертификации MCSE в настоящий момент успешно работает в ATEC ЛИМТУ. Если же ни вы, ни ваша организация не могут взять на себя расходы по обучению в учебном центре, остается единственный выход — самостоятельная подготовка. При этом, конечно, выбор пособий и других источников информации для подготовки гораздо беднее, чем за рубежом. Издательство «Питер» в настоящее время выпустило для подготовки к экзаменам следующие книги серии «Сертификационный экзамен — экстерном»: Networking Essentials (экзамен 70-058), NT Workstation 4 (экзамен 70-073), NT Server 4 (экзамен 70-067), NT Server 4 in the Enterprise (экзамен 70-068), TCP/IP (экзамен 70-059), Administering SQL Server 7 (экзамен 70-028), Database 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 Prometric и VUE — за прием экзаменов. Это — еще один довод в пользу сертификации. Все остальное — сами экзамены, тестирующее программное обеспечение, правила тестирования, заказ экзаменов и т. д. — четко регламентировано и является идентичным в центрах тестирования по всему миру. Четыре экзамена — по Windows 95, Windows NT Workstation, Windows NT Server и Windows NT Server on the Enterprise можно сдавать на русском языке. Многие из сдающих отмечают, что на русском зачастую сдавать сложнее из-за терминологических неточностей и просто ошибок перевода, а также из-за того, что времени бывает недостаточно (если вы сдаете экзамен на неродном языке, то вам даются дополнительные 30 минут). Во всем остальном экзамены на русском ничем не отличаются от остальных. Список центров тестирования в России приведен в табл. 2 и 3 в приложении «Центры обучения и сертификации в СНГ» в конце книги. После экзамена После экзамена, если у вас уже есть звание MCP, вы можете убедиться в том, что его сдача зафиксирована в Microsoft, зайдя на защищенную часть Web-сервера Microsoft (ищите кнопку MCP Only, а затем — Transcript). Обычно новая запись появляется через день-два после сдачи. Если вы получили новую сертификацию, то через какое-то время экспресс-почтой DHL вам придет так называемый Welcome Kit — пакет с вашим сертификатом, соглашением, которое нужно принять, прежде чем открывать сертификат, разного рода рекламой, инструкциями и другими полезными вещами. Microsoft предупреждает о том, что Welcome Kit приходит в течение 4–6 недель с момента сдачи экзамена. По нашему опыту, реально проходит от 10 дней до 2 месяцев, со средним сроком около 2 недель. Если примерно через месяц вы еще не получили Welcome Kit, можно отправить по определенному электронному адресу (его вы найдете на Web-сайте Microsoft) письмо с просьбой разобраться. Адрес, по которому будет отправлен Welcome Kit, берется из анкеты, которую вы заполнили перед заказом первого экзамена (потом адрес можно будет изменить на Web-узле Microsoft), поэтому есть смысл указать адрес, по которому будет кому принять Welcome 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+Internet. Тест поможет вам оценить, что вам необходимо, чтобы овладеть предметом этой книги, а именно, темами экзамена 70-029 «Разработка и внедрение баз данных при помощи Microsoft SQL Server 7.0». Но перед тем как вы приступите к самооценке, давайте обсудим, для кого предназначена сертификация MCSE и как должен выглядеть идеальный кандидат на это звание. MCSE в реальной жизни В этом разделе мы опишем идеального кандидата на звание MCSE (не забывая о том, что в действительности таким требованиям удовлетворяют совсем немногие). Возможно, наше описание покажется вам несколько пугающим. Однако волноваться не следует: хотя требования для получения статуса MCSE и выглядят очень серьезными, это не значит, что им невозможно соответствовать. Тем не менее, вы должны четко представлять себе, что процесс сертификации займет определенное время, потребует расходов и значительных усилий с вашей стороны. В настоящее время во всем мире существует около 95 000 сертифицированных специалистов со званием MCSE, так что эта цель представляется вполне достижимой. Поскольку до вас сертификационные экзамены сдавали многие, у вас есть преимущество — вы можете учесть их опыт. Если у вас достаточно волевых качеств, чтобы отнестись к процессу сертификации серьезно и приобрести необходимые для этого знания и опыт, — вы сможете сдать все требуемые тесты. Мы разрабатывали серию «Сертификационный экзамен — экстерном» (и в дополнение к ней серию «Для подготовки к экзаменам») для того, чтобы облегчить вам, насколько возможно, процесс подготовки. Но подготовка должна быть обязательно! Это, конечно, справедливо и для других сертификаций MCSE, таких как: • MCSE+Internet, которая во многом схожа с MCSE, но требует семи обязательных экзаменов и двух — по выбору по темам, связанным с Интернетом (всего девять экзаменов); • MCSD, которая предназначена для разработчиков программного обеспечения и требует сдачи одного специального экзамена, двух экзаменов по настольным и распределенным приложениям и еще одного экзамена по выбору (из разнообразного, но строго ограниченного набора); • других сертификаций, требующих сдачи только одного экзамена (MCP или MCT) или нескольких (MCP+I, MCP+SB, MCDBA). Идеальный кандидат в MCSE Чтобы понять, каким должен быть идеальный кандидат на звание MCSE, мы приведем некоторые сведения об образовании и опыте, которыми он должен обладать. Не беспокойтесь, если вы не соответствуете этим требованиям, — мы живем не в идеальном мире, и те моменты, которым вы соответствуете не в полной мере, можно компенсировать, приложив дополнительные усилия. Требования включают в себя: • Академическое или профессиональное образование в области теории, концепций и работы в компьютерных сетях. Необходимо иметь глубокие знания в области сетевых устройств и технологий, включая знания сетевых операционных систем, служб и приложений. • Не менее трех лет опыта профессиональной работы с компьютерными сетями, включая Ethernet, Token Ring, модемы и другие сетевые технологии. Нужно обладать опытом в установке, конфигурировании, обновлении и диагностике. • Не менее двух лет опыта реальной работы в сетевом окружении, включающем в себя системы на основе Windows NT Server, Windows NT Workstation и Windows 95 или 98. Также необходимо хорошо разбираться в установке, конфигурировании, поддержке и диагностике этих операционных систем. • Хорошее понимание механизма работы сетевых протоколов, таких как TCP/IP, IPX/SPX и NetBEUI, включая адресацию и разрешение имен. • Хорошее понимание схемы именования в NetBIOS, работы службы обзора сети и служб доступа к файлам и печати.
converted to PDF by BoJIoc
• Знакомство со службами Windows NT, основанными на TCP/IP, такими как HTTP (серверы Web), DHCP, WINS, DNS, и с одним или несколькими продуктами Microsoft для работы в Интернете, такими как Internet Information Server (IIS), Index Server, Proxy Server. • Практические знания в области NetWare 3.x и 4.x, включая форматы фреймов IPX/SPX, служб файлов, печати, каталогов и программное обеспечение как клиентов Novell, так и клиентов Microsoft. Умение работать с Microsoft Client Services for NetWare (CSNW), Gateway Services for NetWare (GSNW), NetWare Migration Tool (NWCONV) и клиентами NetWare для Windows (NT, 95 и 98) также является существенным. Подводя итоги, мы должны отметить, что необходим диплом бакалавра в области компьютеров и три года работы по технической специальности в области разработки, установки, конфигурирования и поддержки компьютерных сетей. Мы считаем, что значительно менее половины кандидатов на получение сертификации соответствуют всем требованиям, а большинство не соответствует и половине требований, по крайней мере, когда они начинают заниматься сертификацией. Но поскольку 90 000 сертифицированных специалистов смогли выдержать испытание в виде тестов — ничто не мешает выдержать его и вам, особенно если наш краткий список требований позволил вам выявить ваши слабые места. Проверьте себя с помощью теста Следующая серия вопросов была разработана специально для того, чтобы помочь оценить, сколько труда нужно будет вам приложить для сертификации Microsoft и какие дополнительные ресурсы потребуются. Постарайтесь быть абсолютно честными в ваших ответах — в противном случае вы рискуете просто потерять деньги, сдавая экзамены, к сдаче которых еще не готовы. Правильных и неправильных ответов на эти вопросы не существует, а есть только этапы, которые, возможно, вам придется преодолеть для получения сертификации. Только вы сами сможете определить свое место среди широкого спектра кандидатов. Следует обратить внимание на такие два обстоятельства: • даже не самое совершенное образование по компьютерной специальности принесет вам пользу; • реальный опыт в работе с продуктами и технологиями Microsoft дает вам существенные преимущества при сертификации. Ваше образование 1. Проходили ли вы ранее обучение в компьютерных классах? (Да или нет.) Если «Да», переходите к вопросу 2, если «Нет» — к вопросу 4. 2. Проходили ли вы обучение в компьютерных классах по операционным системам? (Да или нет.) Если «Да», то, возможно, вы знакомы с основами архитектуры систем Microsoft и главными системными компонентами. Если это так, сосредоточьте свое внимание на базовых концепциях операционных систем, в особенности связанных с виртуальной памятью, режимами многозадачности, отличием режима пользователя от режима ядра, общей архитектурой безопасности. Если «Нет», вам необходимо ознакомиться с дополнительной литературой, особенно связанной с концепциями операционных систем. 3. Проходили ли вы обучение концепциям построения сетей или сетевым технологиям? (Да или нет.) Если «Да», то, возможно, вы ориентируетесь в терминологии, концепциях и технологиях сетей Microsoft. Если же такого обучения не было или вы проходили его очень давно, вам следует подтянуть свои знания в области базовых концепций построения сетей, терминологии, в особенности в отношении сетевых сред, способов передачи данных, модели OSI и конкретных сетевых технологий, таких как Ethernet, Token Ring, FDDI и WAN. 4. Изучали ли вы самостоятельно с помощью литературы операционные системы или компьютерные сети? (Да или нет.) Если «Да», то посмотрите, хорошо ли вы знакомы с темами, которые перечислены ранее в этом разделе. Если все в порядке, переходите к следующему разделу.
converted to PDF by BoJIoc
Если «Нет», вам необходимо ознакомиться с дополнительной литературой по этой тематике. Ничто не заменит хорошие базовые знания для сдачи экзаменов Microsoft. Практический опыт Решающее значение для сдачи всех экзаменов Microsoft имеет практический опыт работы с программными продуктами, особенно с Windows NT Server и Workstation, а также разного рода дополнительными компонентами и продуктами BackOffice. Главная мысль, которую следует вынести из данного теста для самооценки, — не существует альтернативы реальной работе с программными продуктами, включая их установку, настройку и использование в течение достаточно долгого периода и на высоком уровне. 5. Устанавливали ли вы и конфигурировали: • Windows NT Server? (Да или нет)? Если «Да», проверьте, что вы действительно понимаете базовые концепции в соответствии с темами экзамена 70-067 и более сложные концепции экзамена 70-068. Вы должны также быть знакомы с интерфейсами, утилитами и службами TCP/IP на уровне экзамена 70-059 и с возможностями Internet Information Server на уровне экзамена 70-087. Вы можете загрузить темы экзамена, тренировочные экзамены и другую информацию об экзаменах Microsoft с Web-страницы, посвященной обучению и сертификации, по адресу www.microsoft.com/train_cert. Используйте кнопку Find an Exam, чтобы найти информацию по определенному экзамену. Если вам еще не приходилось работать с Windows NT Server, TCP/IP и IIS (или другим продуктом, который вы выбрали для сдачи экзамена), полезно будет приобрести один или два компьютера и копию Windows NT Server. Затем приступайте к изучению операционной системы, TCP/IP и прочих программных продуктов, по которым вам предстоят экзамены. Мы рекомендуем вам приобрести два компьютера, каждый с сетевой платой, и организовать маленькую локальную сеть из двух компьютеров для практических заданий. В настоящее время можно приобрести компьютер, подходящий для установки Windows NT, за 500–600 долларов — мы надеемся, что это не вызовет у вас больших финансовых затруднений. Советуем вам также заказать BackOffice Trial Kit, который включает в себя пробные версии Workstation и Server. Это можно сделать на странице www.backooffice.microsoft.com/downtrial. • Windows NT Workstation? (Да или нет.) Если «Да», проверьте ваше знание тем экзамена 70-073. Если «Нет», приобретите копию Windows NT Workstation и научитесь устанавливать, конфигурировать и поддерживать эту операционную систему. Чтобы лучше ориентироваться в этом, вы можете приобрести книгу «NT Workstation 4» из серии «Сертификационный экзамен — экстерном» или просто руководствоваться списком тем от Microsoft. Очень полезная информация для подготовки ко всем перечисленным экзаменам содержится в Resource Kits. Эти наборы можно заказать по адресу: http://mspress.microsoft.com. Кроме того, они высылаются подписчикам TechNet. Мы советуем вам использовать Resource Kits вместе с нашими книгами серий «Сертификационный экзамен — экстерном» и «Для подготовки к экзаменам». Вместо экзамена 70-073 вы можете сдавать экзамен по Windows 95 (70-064) или Windows 98 (70-098) — все эти экзамены соответствуют списку возможных экзаменов по настольным операционным системам MCSE. Хотя мы рекомендуем вам сдавать экзамен 70-073 (это поможет вам в освоении NT Server), если вы всетаки решили выбрать Windows 95 или 98, советуем вам также использовать для подготовки Resource Kits. 6. Устанавливали ли вы, конфигурировали, использовали, обновляли другие продукты Microsoft — не операционные системы? Например, FrontPage98, SQL Server и прочие (Да или нет.) Если «Да», то переходите к следующему разделу. Если «Нет», то советуем вам приобрести необходимый опыт. Далее мы приведем несколько советов относительно того, каким образом это лучше сделать.
converted to PDF by BoJIoc
Для любых экзаменов Microsoft — от самых простых, таких как FrontPage98, до таких сложных, как Exchange 5.5 или SQL Server 7, — от вашего практического опыта работы во многом зависит ваш успех. Вы можете загрузить себе на компьютер компоненты BackOffice со страницы www.backoffice.microsoft.com/downtrial, для пробных версий других программ используйте опции поиска на Web-узле Microsoft. Совет Если вы располагаете достаточными средствами или за вас может заплатить ваш работодатель, подумайте о том, чтобы пройти специализированное обучение в авторизованном учебном центре (Certified Training and Education Center — CTEC) или в высшем учебном заведении — партнере Microsoft (Authorized Academic Training Partner — AATP). В дополнение к тому, что вы узнаете на лекциях, у вас будет возможность на практике поработать с программным продуктом и операционной системой (как правило, c NT Server), кроме того, в вашем распоряжении останутся фирменные учебные материалы. И не пытайтесь сдавать экзамен без достаточной подготовки, которая обязательно должна включать в себя понимание процесса установки и конфигурирования продукта, его поддержки и диагностики проблем. Тщательная подготовка поможет вам не только на экзамене, но и в реальной жизни! Проверка вашей готовности к экзамену Готовиться к экзаменам нужно обязательно, независимо от того, занимаетесь ли вы с инструктором или самостоятельно сидите за книгами. Поскольку вы платите деньги за экзамен, обычно существует желание сдать его с первой попытки. Чтобы узнать, каковы ваши шансы сдать экзамен, существуют пробные тесты. Обычно лучшая стратегия после того, как вы завалили экзамен после самостоятельной подготовки, — всетаки пройти специализированное обучение в учебном классе. Чтобы найти информацию по обучению, проводимому самой Microsoft, следует воспользоваться кнопкой «Find a course» на странице www.microsoft.com/train_cert. Если такое обучение для вас дороговато, все равно посетите эту страницу и просмотрите ссылки на бесплатные пробные экзамены. Существует также множество платных пробных экзаменов. Даже если вы по финансовым соображениям не захотите приобретать многие из них, обратите внимание на некоторые из дешевых тестов. Возможно, они вам помогут оценить готовность к экзамену лучше, чем вы сможете это сделать любым другим способом. Вот несколько Web-узлов, которые предлагают вам пробные тесты дешевле, чем за 100 долларов (а некоторые из них гораздо дешевле или совсем бесплатно): • • • •
Beachfont Quizzer — www.bfq.com; Hardcore MCSE — www.hardcoremcse.com; LANWrights — www.lanw.com/books/examcram/order.htm; MeasureUP — www.measureup.com.
7. Пытались ли вы сдавать пробные тесты по теме вашего экзамена? (Да или нет.) Если «Да» и вы получили результат от 70% и выше, возможно, вы уже готовы отправляться на экзамен. Если не дотягиваете до нужно результата — тренируйтесь дальше. Если «Нет», постарайтесь загрузить доступные вам бесплатные и дешевые тесты и приступайте к их освоению. Советуем добиться того, чтобы уверенно набирать требуемое число баллов. Когда вам нужно оценить уровень своей готовности к экзамену, нет ничего лучше хорошего пробного теста — посмотрите, можете ли вы его пройти с результатом в 70% или выше. Когда мы сами готовились к экзаменам, нашим ориентиром был показатель в 80%. В оставшиеся 20% входят вопросы, на которые почти невозможно ответить правильно и которые иногда встречаются на экзаменах Microsoft. Оценка вашей готовности к экзамену 70-029 В дополнение к обшей информации, которая изложена в предыдущей главе, для подготовки к экзамену «Разработка и внедрение баз данных при помощи SQL Server 7.0» можно сделать еще ряд вещей. Поместите себя в список почтовой рассылки MCSE (это можно сделать на странице www.softbeltsoftware.com, кнопка «Subscribe to…»). Это место, где можно задать вопросы и получить хорошие ответы или просто посмотреть, какие ответы на свои вопросы получают другие.
converted to PDF by BoJIoc
Вы можете также поискать в сети так называемые брэйндампы — «braindumps» (сборники тем и вопросов, встречающихся на экзаменах, собранные самими экзаменующимися) — для того, чтобы посмотреть, с чем вы можете столкнуться на экзамене. Задать вопросы, где можно найти полезные брэйндампы, можно в почтовой рассылке MCSE (см. выше), а можно посмотреть ссылки на них на странице Шауна Гэмбла (Shawn Gamble) www.commandcentral.com (там же есть и несколько неплохих и бесплатных пробных тестов) или на Web-узле Герба Мартина под названием Braindump Heaven http://209.207.167.177. Используя брэйндампы, обращайте внимание, главным образом, на тематику вопросов — совсем не обязательно, что ответ, который предлагает автор брэйндампа, правилен. Используйте вопросы в процессе подготовки, но не следует доверять приводимым там же ответам — иначе легко попасть впросак. Тщательно проверяйте всю информацию, которую вы нашли в брэйндампе. Microsoft также рекомендует использовать для подготовки к экзаменам базу знаний Microsoft — Microsoft Knowledge Base. База знаний частично рассылается в рамках рассылки TechNet, кроме того, к ней можно обратиться через страницу http://support.microsoft.com/support для получения «имеющих существенное значение технических сведений в области поддержки программных продуктов», которые могут помочь вам для подготовки к экзаменам. Хотя мы не совсем уверены в значении приведенной цитаты, база знаний может оказаться полезной для подготовки по темам, связанным с технической поддержкой продуктов и диагностикой неисправностей. Еще одно замечание: возможно, вам покажется странным говорить о практическом опыте работы в отношении разработки и внедрения баз данных при помощи SQL Server 7.0. Но при подготовке вы убедитесь, что реальный опыт работы с системой имеет неоценимое значение. Возможно, к своему удивлению, вы обнаружите, что опыт практической работы с Windows NT Server также имеет большое значение — особенно в отношении работы с файлами и файловыми группами, использования интегрированной безопасности Windows NT и наблюдения за производительностью SQL Server. Пора в бой После того как вы оцените свою готовность, обновите ваши базовые знания, потренируетесь в реальной работе с системой и воспримете информацию из всех возможных руководств и источников, вы будете готовы пройти несколько пробных тестов. Если их результаты внушат вам оптимизм, пора отправляться на экзамен, предварительно заказав его через центр тестирования Sylvan Prometric или VUE. Удачи вам! ГЛАВА 1
Сертификационные экзамены Microsoft Ключевые термины • • • • • •
Переключатели Флажки Сопровождающие иллюстрации Вопросы с разным количеством правильных ответов Внимательное чтение Процесс исключения неверных ответов
Необходимые знания и приемы • • • • • • •
Оценка вашей готовности к экзамену Подготовка к сертификационному экзамену Методы подготовки Знакомство с интерфейсом программы тестирования Распределение времени для ответа на вопросы Откладывание самых трудных вопросов Угадывание (на самый крайний случай)
Как показывает опыт, экзамены не относятся к тому, что большинство из нас ожидает с нетерпением, как бы хорошо мы ни были готовы. Впрочем, обычно, чем больше человек знает о том, что ему предстоит, тем меньше волнуется. Проще говоря, если вы уже сдали четыре сертификационных экзамена 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 Server 7, но и оценить, как вы будете ориентироваться в различных обстоятельствах. Часто можно будет выбрать более одного ответа. В других случаях вам будет предложено выбрать наиболее эффективное решение проблемы из нескольких решений, каждое из которых вполне работоспособно. Сдача экзамена похожа на приключение, и в ходе экзамена не раз потребуется продемонстрировать ваши способности к мышлению. В этой книге мы постараемся показать, что вам следует ожидать и как можно будет справиться со встретившимися проблемами и головоломками. Внешний вид тестов Некоторые экзаменационные вопросы потребуют от вас выбрать только один ответ, тогда как другие — несколько. В следующем вопросе от вас потребуется выбрать единственный правильный ответ. После вопроса идут краткое изложение каждого варианта ответа и пояснение, почему он правилен или ошибочен. Question 1 When is a trigger fired? • • • • •
A. When the trigger fire statement is executed. B. Before data modification. C. Before constraint validation. D. After the transaction completes. E. After constraint validation but before the transaction commits.
Вопрос 1 Когда срабатывает триггер? • • • • •
A. Когда выполняется команда на запуск триггера. B. До изменения данных. C. До проверки на соответствие ограничению. D. После завершения транзакции. E. После проверки на соответствие ограничению, но до завершения транзакции.
Правильный ответ — E. Триггер — это неотъемлемая часть транзакции, которая его запускает, и он должен иметь возможность обратиться как к предыдущим, так и к измененным значениям данных, чтобы выполнить свою работу. Этот формат вопроса в точности соответствует формату, который встречается на экзамене Microsoft. Единственное отличие — на экзамене вам не приведут после вопроса ответ на него. Чтобы выбрать ответ, поместите курсор мыши над переключателем, а потом щелкните мышью. Другой тип вопросов требует нескольких ответов. В этих вопросах вместо переключателей используются флажки, которыми помечаются все правильные ответы. Question 2 How long does a trigger persist in database? [Check all correct answers] • • • • •
A. Until the session is terminated. B. Until it is dropped. C. Until a new trigger is created without the append option. D. Until another trigger replaces it. E. None of the above.
Вопрос 2 Как долго триггер хранится в базе данных? • • • • •
A. До прерывания сеанса. B. До того, как его удалят. C. До того, как будет создан новый триггер без использования параметра «Добавить». D. До замены его другим триггером. E. Ничего из перечисленного выше.
Правильные ответы — B, C и D. Триггеры являются постоянными, а не временными составными частями базы данных, поэтому ответ A неверен.
converted to PDF by BoJIoc
Отвечая на эти вопросы, необходимо выбирать несколько вариантов ответа. Авторы уверены (Microsoft этот момент не комментирует), что ответ на этот вопрос не будет засчитан, если вы не выберете все правильные варианты. Другими словами, частично правильный ответ не даст вам никаких баллов. Отвечая на вопрос 2, вы должны установить флажки напротив всех вариантов ответа, за исключением A и D. Заметьте, что, выбирая правильные ответы, вы должны также знать, почему остальные ответы неправильны. Хотя эти два типа вопросов могут проявляться в самых разнообразных формах, они составляют основу всех экзаменов Microsoft. Некоторые вопросы включают в себя иллюстрации, на которых обычно изображены экраны SQL Server Enterprise Manager. Для некоторых из таких вопросов вам придется выбирать переключатели или флажки на самой иллюстрации. Для других информацию, которую содержит в себе иллюстрация, нужно использовать для выбора вариантов в обычном порядке. Ключ к ответам на такие вопросы — знание изображенной утилиты. Некоторые вопросы используют графики или диаграммы, чтобы проиллюстрировать ситуацию, в которой вам надо будет проявить навыки диагностики или конфигурирования. Необходимо со всей внимательностью подходить к информации, содержащейся в иллюстрациях. Будьте готовы к тому, что придется часто переключаться между вопросом и иллюстрацией. Стратегия сдачи экзаменов с фиксированным числом вопросов Хорошо известная стратегия сдачи экзаменов фиксированной длины — вначале прочитать все вопросы теста, ответив только на те, в ответах на которые вы полностью уверены. Проходя тест повторно, вы можете основательнее заняться более сложными вопросами, имея представление о том, сколько их еще осталось. К счастью, программное обеспечение для сдачи экзаменов Microsoft облегчает использование такой стратегии. В верхнем левом углу экрана можно установить флажок, чтобы пометить вопрос для последующего возвращения к нему. Заметьте: если вы пометили вопрос, вам будет легче к нему вернуться, но также вы сможете вернуться и к любому другому вопросу, нажимая кнопки Forward (Вперед) и Back (Назад). Прочитав вопрос, ответьте на него, если ответ ясен, или пометьте, если вы в нем не уверены, для того, чтобы потом работать уже с уменьшившимся списком самых сложных вопросов. Совет Есть по крайней мере одна причина, почему вначале следует прочитать весь тест целиком: иногда информация, которая содержится в последующих вопросах, прольет свет на предыдущий. В других случаях ответы на последующие вопросы помогут вам вспомнить какие- либо факты, черты, особенности работы SQL Server, что позволит дать правильный ответ на предыдущие вопросы. В любом случае двигайтесь вперед, если вам попался какой-нибудь вопрос, на который вы не можете пока ответить. Вот несколько полезных советов для сдачи тестов фиксированной длины: • Когда вы вернетесь к вопросу во второй раз, прочитайте снова каждое слово этого вопроса. Иногда повторное чтение позволит вам обратить внимание на то, что вы пропустили в первый раз. Однако бывает и так, что вы остаетесь в плену своего первого впечатления от вопроса. Постарайтесь этого избегать. • Если вы читаете вопрос уже не в первый и не во второй раз, постарайтесь произнести про себя то, что вы не можете понять в вопросе, — почему ответы представляются вам лишенными смысла или что-то кажется пропущенным. Если вы будете «пережевывать» вопрос в течение некоторого времени, может быть, подсознание подскажет вам недостающие детали или вы заметите скрытую в тексте вопроса ловушку. Во время сдачи экзамена нелишне обращать внимание еще на один счетчик — на сколько вопросов вы ответили и сколько еще осталось. Постарайтесь отвечать таким образом, чтобы за четверть отведенного времени вы ответили не менее чем на четверть вопросов, за три четверти времени — на три четверти вопросов и т. д. Если время подходит к концу, а вы не успеваете ответить на все вопросы, постарайтесь потратить последние 5 минут на то, чтобы быстро пробежаться по оставшимся вопросам и постараться хотя бы угадать ответы на них. Обычно угадывать все-таки полезнее, чем оставлять вопросы без ответа, хотя бы потому, что последнее точно не даст вам никаких баллов, а в случае угадывания шансы ответить правильно все-таки есть. Если нет совсем никаких мыслей насчет ответа, выбирайте случайные варианты — вдруг чтонибудь да и угадаете.
converted to PDF by BoJIoc
Совет Лучше ответить наугад, чем оставлять экзаменационный вопрос без ответа. Стратегия сдачи адаптивных экзаменов Если формулировать только один принцип сдачи адаптивных экзаменов, он прозвучит так: «Сразу выбирайте правильный ответ». Вы не можете пропустить вопрос и вернуться к нему позднее, так как программа тестирования использует ваш ответ для выбора следующего вопроса. У вас есть только один шанс, чтобы ответить на вопрос. Если вы ответите на вопрос правильно, вам будет предложен более сложный вопрос — чтобы можно было точнее определить уровень ваших знаний. Если ответ на предыдущий вопрос был неправильным, вам будет предложен более легкий вопрос (а уровень оценки ваших знаний снизится). Экзамен будет продолжаться до тех пор, пока тестирующая программа не решит, что уровень ваших знаний определен с достаточной точностью. Обычно количество вопросов в течение адаптивного экзамена — от 25 до 35. В адаптивном экзамене хорошо то, что, если вы знаете предмет, у вас есть шанс закончить экзамен минут за тридцать. С другой стороны, для того, чтобы сдать адаптивный экзамен, вы должны показать действительно хорошие знания. Вам обязательно попадутся настолько запутанные и тяжелые вопросы, что один-два неправильных ответа — вещь почти неизбежная. Так что чем лучше ваши знания и чем правильнее вы отвечаете на первые вопросы теста, тем более сложные вопросы ожидают вас дальше. Поскольку обычно о типе теста — адаптивный он или нет — вы сможете узнать, только начав его сдавать, есть смысл готовиться ко всем тестам как к адаптивным. Такой подход позволит вам быть готовым к любому типу экзамена. Но если окажется, что ваш тест — с фиксированным числом вопросов, воспользуйтесь советами, приведенными в предыдущем разделе. Если на адаптивном экзамене вам встретился какой-то вопрос, на который вы не знаете ответа, вам придется угадывать немедленно. При этом за правильную отгадку вам придется немедленно пострадать — следующий вопрос будет еще сложнее! Азбука сдачи экзамена Самый важный совет всем сдающим экзамены: читайте все вопросы очень внимательно! Некоторые вопросы намеренно формулируются двусмысленно, другие используют двойное отрицание, в третьих может использоваться необычная терминология. Авторы сдавали множество экзаменов — и пробных, и реальных — и всегда по меньшей мере один неправильный ответ был из-за невнимательного чтения. Несколько советов для борьбы с излишне быстрым чтением: • Убедитесь, что вы прочитали каждое слово в вопросе. Если вы заметили, что нетерпеливо прыгаете через какие-либо его части, лучше начать чтение сначала. • По прочтении попробуйте пересказать вопрос своими словами. Если вы сможете это сделать, вам будет проще выбрать правильный вариант. • Когда вы вернетесь к вопросу во второй раз, прочитайте снова каждое слово этого вопроса. Иногда повторное чтение вопроса позволяет вам обратить внимание на что-нибудь, что вы пропустили в первый раз, но нередко бывает и так, что вы остаетесь в плену своего первого впечатления от вопроса. Постарайтесь этого избегать. • Если вы читаете вопрос уже не в первый и не во второй раз, постарайтесь произнести про себя то, что вы не можете понять в вопросе, — почему ответы представляются вам лишенными смысла или что-то кажется пропущенным. Если вы будете «пережевывать» вопрос в течение некоторого времени, может быть, подсознание подскажет вам недостающие детали или вы заметите скрытую в тексте вопроса ловушку. Кроме того, постарайтесь оценить каждый вопрос через призму того, что вы знаете о разработке и внедрении баз данных с использованием SQL Server — характеристиках, особенностях работы, фактах, чертах. С помощью обзора всей известной вам информации, включая и ту, что вы записали на выданном листке перед началом экзамена, вы сможете лучше понять смысл вопроса и определить правильный ответ. Стратегия работы с вопросами Из опыта сданных нами экзаменов мы заметили интересную тенденцию. В вопросах, где нужно выбирать только один правильный ответ, обычно два или три варианта бывают очевидно неверны, два могут быть
converted to PDF by BoJIoc
правдоподобны и только один, разумеется, правилен. Даже если ответ явно напрашивается (если это так, лучше перечитайте вопрос — скорее всего, здесь какая-то ловушка), следует начинать отвечать на вопрос с выяснения того, почему остальные варианты неверны. Явно неверные ответы можно определить по несуществующим пунктам меню и утилитам, отсутствующим параметрам настройки и терминам, которые вы видите в первый раз. Если вы действительно готовились к экзамену, то правильные варианты ответа не должны содержать незнакомых вам понятий. Незнакомая или странная терминология обычно указывает на то, что вариант неверен. Во многих вопросах подразумевается, что в такой-то программе действуют настройки по умолчанию. Если вы будете знать настройки по умолчанию и на что они влияют, это поможет разрубить вам множество гордиевых узлов. Готовьте себя к победе Знания приводят к уверенности, а уверенность — к успеху. Если вы тщательно изучили материал этой книги и проработали вопросы в конце каждой главы, вам должно быть ясно, где нужно приложить дополнительные усилия. Мы советуем вам использовать те источники, которые названы в разделе «Дополнительная информация» в конце каждой главы. Мы рассчитываем, что вы используете концепции и ситуации пробных вопросов для того, чтобы не растеряться, когда схожие ситуации встретятся во время реального экзамена. Если вы знаете материал, будьте уверены, что вам удастся сдать экзамен. После того как вы проработаете материал данной книги, попробуйте сдать пробный экзамен, помещенный в конце книги. Это обеспечит реальную проверку ваших знаний и поможет определить те области, где нужна дополнительная подготовка. Будьте уверены, что вы действительно проработали все темы, в которых в пробном тесте сделали ошибки, прежде чем заказывать реальный экзамен. Только после того, как вы начали чувствовать себя комфортно, сдавая пробные экзамены, есть смысл отправляться сдавать реальный тест. Совет Если на пробном экзамене вы набрали менее 75% правильных ответов, продолжайте подготовку. Обычно Microsoft предлагает бесплатные пробные тесты (PEP tests) и экзамены для самооценки (self-assessment exams), которые можно загрузить с Web-узла Microsoft (рис. 1.1). Если вам нужны дополнительные возможности и вы можете потратить некоторую сумму денег, попробуйте приобрести пробные экзамены, предлагаемые разными фирмами. Вооружившись информацией из этой книги и будучи уверенными в уровне своих знаний, вы сможете сдать сертификационный экзамен. Однако вы должны действительно готовиться, в противном случае придется сдавать экзамен несколько раз. Если вы готовились серьезно, то сдадите экзамен. Удачи вам! Дополнительные ресурсы Лучший источник информации о сертификации Microsoft — это сама Microsoft. Поскольку изменения в ее продуктах и технологиях — и в соответствующих им экзаменах — происходят очень быстро, лучшее место для получения информации, относящейся к экзаменам, — это Интернет. Если вы еще не посещали Web-сайт Microsoft Certified Professional, есть смысл это сделать. Его адрес — www.microsoft.com/mcp (см. рис. 1.1). Внимание: возможно, что когда вы попытаетесь открыть эту страницу, ее уже не будет или она будет выглядеть по-другому. Изменения на Web-узле Microsoft происходят очень часто. Если это произошло, то прочитайте раздел «Борьба с изменениями в Web». Пункты меню в левой колонке ведут к наиболее важным источникам информации по сертификации. Куда есть смысл обратиться: • Программы сертификации (Certifications) — используйте эти ссылки для того, чтобы ознакомиться с разнообразными программами сертификации, предлагаемыми Microsoft.
converted to PDF by BoJIoc
• Найти экзамен (Find Exam) — этот пункт меню запускает поиск, с помощью которого можно получить список всех экзаменов, относящихся к определенной программе сертификации (MCPS, MCSE, MCT и т. д.), или найти все экзамены по определенному продукту. Его же можно использовать, чтобы получить не только список экзаменов, но и информацию о подготовке к конкретному экзамену, так как каждому экзамену соответствуют свои авторизованные курсы.
Рис. 1.1. Начальная страница сайта Microsoft Certified Professional • Загрузка (Downloads) — используйте этот пункт меню для того, чтобы найти файлы и пробные экзамены, которые Microsoft предоставляет для общего пользования. Обычно в этом есть смысл. Особенно полезно бывает загрузить информацию об изменениях в сертификации, пробные тесты (PEP tests), разного рода экзамены для самооценки и руководства для подготовки к экзаменам. Найдите время ознакомиться с этими материалами перед первым экзаменом. Следует просмотреть и другие ссылки на странице сертификации Microsoft — многие из них будут для вас, безусловно, полезны. Борьба с изменениями в Web Рано или поздно все ссылки, о которых мы говорим в этом разделе или в других частях книги, устареют или будут заменены новыми. В некоторых случаях вы сможете найти более свежую информацию по старому адресу, в других случаях вы получите только сообщение об ошибке 404 «File not found». Если такое произойдет, не сдавайтесь. Всегда есть возможность найти в Интернете то, что вам нужно, затратив на это некоторое время и силы. Большинство крупных или сложных Web-сайтов — а сайт Microsoft, безусловно, попадает в обе категории — предлагают средства поиска. Если мы посмотрим на рис. 1.1, то заметим кнопку Search (Поиск) в верхней части экрана. Пока вы находитесь на Web-сайте Microsoft (в адресе будет присутствовать www.microsoft.com), вы всегда сможете использовать эту опцию. Чем тщательнее вы подойдете к составлению условий поиска, тем больше вероятность, что вы найдете нужную информацию. Например, если вы пустите поиск на строчку «training and certification», вам вернется масса ссылок на страницы с общей информацией по этому предмету, но если вы ищете руководство по
converted to PDF by BoJIoc
подготовке к экзамену 70-029 «Разработка и внедрение баз данных при помощи Microsoft SQL Server», лучше будет набрать в строке поиска следующую строчку: "Exam 70-029" AND "preparation guide" Если вы ищете, что можно загрузить на свой компьютер по обучению и сертификации, введите в строке поиска "training and certification" AND "download page" Наконец, можно использовать и общие поисковые серверы — такие как www.search.com, www.altavista.com и www.excite.com — для того, чтобы найти требуемую информацию. Хотя Microsoft — наилучший источник информации по сертификационным экзаменам Microsoft, существует также множество других источников, информирующих об экзаменах, обучении и помощи в этой области и необязательно следующих линии Microsoft. В общем надо запомнить: если вы не нашли что-либо, на что ссылается эта книга, попробуйте найти это с помощью специальных инструментов. ГЛАВА 2
Модели данных Ключевые термины • • • • • • • • • • • • •
Реляционная база данных Сущность Атрибут Отношение Первичный ключ Внешний ключ Ссылочная целостность Целостность данных Запреты неопределенностей, дубликатов и изменений Нормализация Деловые правила Типы отношений Обязательность
Необходимые знания и приемы • Преобразование логической модели в физическую • Чтение физической модели • Поэтапное моделирование • Нормализация базы данных • Денормализация базы данных • Оптимизация быстродействия, удобства поддержки, возможности расширения, доступности и защищенности Общие сведения Термин «реляционный» означает «основанный на отношениях». Реляционная база данных состоит из сущностей («таблиц»), находящихся в некотором отношении друг с другом; записей («строк»), то есть экземпляров данных; и атрибутов («столбцов») данных. Существуют разные способы проектирования баз данных. Для вас важно запомнить, какой подход к проектированию баз данных является правильным с точки зрения Microsoft. Проектирование базы данных состоит из двух основных фаз: логического и физического моделирования. Во время фазы логического моделирования конструктор собирает требования и разрабатывает модель, не зависящую от конкретной СУБД (системы управления базами данных). СУБД позволяет хранить информацию в виде сущностей, выполнять математические операции пересечения и объединения сущностей. Во время фазы логического моделирования выполняется нормализация.
converted to PDF by BoJIoc
Во время фазы физического моделирования конструктор создает модель, оптимизированную для конкретного приложения и СУБД; именно эта модель реализуется на практике. Если вам известна трехфазовая методология проектирования, учтите, что Microsoft выделяет только логическую и физическую модели. Концептуальная фаза объединяется с фазой логического моделирования. Процесс проектирования базы данных состоит из следующих этапов: • • • • • • • •
сбор информации; идентификация объектов; моделирование объектов; идентификация типов информации для каждого объекта; идентификация отношений; нормализация; преобразование к физической модели; создание базы данных.
Этапы 1–6 образуют фазу логического моделирования. Этап 7 представляет собой фазу физического моделирования. Практически вся книга посвящена последнему этапу — фазе реализации. Базы данных с обработкой транзакций Базы данных делятся на два основных типа: базы с оперативной обработкой транзакций (OLTP, Online Transaction Processing — самый распространенный тип базы данных) и системы поддержки принятия решений (DSS, Decision Support Systems). Базы данных OLTP постоянно обрабатывают транзакции. Для них характерно большое количество пользователей и множество четко определенных транзакций, выполняющих чтение/запись данных. Базы данных с принятием решений Базы данных с принятием решений, также называемые системами с принятием решений DSS, являются вторым базовым типом баз данных. В них данные анализируются после выполнения периодической обработки. В частности, одной из специфических разновидностей DSS являются хранилища данных (data warehouse). Обычно в них малочисленные пользователи запускают малое количество запросов для особых случаев (ad hoc queries), выполняющихся в течение продолжительного времени. База данных DSS может представлять собой копию базы OLTP; кроме того, несколько баз OLTP могут объединяться в одну базу DSS. DSS также называются отчетными базами данных. Логическая фаза Фаза логического проектирования базы данных состоит из пяти основных этапов: сбор требований, идентификация сущностей, моделирование сущностей, идентификация типов данных (атрибутов) каждой сущности и идентификация отношений. Сбор требований На первом этапе проектирования базы данных необходимо точно определить, как будет использоваться база данных и какие данные в ней будут храниться. Если новая система замещает уже существующую, то большую часть необходимой информации можно получить из старой системы. Переговорите со всеми, кто имеет какое-либо отношение к существующей системе, определите их функции и место в работе системы, а также те данные, которые им необходимо хранить в базе. Кроме того, необходимо понять, что изменилось по сравнению с существующей системой, идентифицировать все потенциальные проблемы, ограничения и препятствия. Соберите как можно больше информации о том, что система должна и не должна делать. Как правило, достаточно следовать какой-либо стандартной методике по сбору требований. Моделирование объектов После того как идентификация объектов будет завершена, необходимо сохранить информацию о них. Для этого лучше всего воспользоваться визуальной моделью. В этой модели также должны учитываться все
converted to PDF by BoJIoc
основные данные, собранные на предыдущем этапе. Модель может использоваться в качестве образца на этапе реализации базы. В вашем распоряжении сотни средств моделирования — от карандаша с бумагой, редакторов и электронных таблиц до специализированных программ для моделирования данных при проектировании баз. Такие модели называются моделями отношения сущностей (сокращенно — диаграммы E/R). Для построения диаграмм E/R существуют различные наборы условных обозначений. Конкретная методология и условные обозначения зависят от выбранного вами инструмента. SQL Server Enterprise 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 keys), первичные ключи (primary keys), альтернативные ключи (alternate keys), общие ключи (common keys) и внешние ключи (foreign keys). Ключи также делятся на два класса: простые (singleton) и составные (composite). Таблица 2.1. Таблица «Издатель» с данными Код
Название
Город
Штат Страна
0736 New Moon Books
Бостон
MA
США
0877 Binnet & Hardley
Вашингтон DC
США
1389 Algodata Infosystems Беркли
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. Тип отношений (cardinality) отношения определяет количество записей сущности, связанных с записью другой сущности. Отношения делятся на три основных типа в зависимости от мощности: • Один к одному. Каждой записи первой сущности соответствует только одна запись второй сущности, а каждой записи второй сущности — только одна запись первой сущности. Пример — автор, у которого в
converted to PDF by BoJIoc
данный момент имеется лишь одна незавершенная книга. Отношения «один к одному» часто изображаются на диаграммах в виде простой линии между сущностями. • Один ко многим. Каждой записи первой сущности могут соответствовать несколько записей второй сущности, однако каждой записи второй сущности соответствует только одна запись первой сущности. Пример — издательство, выпустившее несколько книг. Отношения «один ко многим» часто изображаются на диаграммах в виде линии, разветвляющейся на одном из концов. • Многие ко многим. Каждой записи первой сущности могут соответствовать несколько записей второй сущности, а каждой записи второй сущности соответствют несколько записей первой сущности. Пример — один автор может написать несколько книг, а у одной книги может быть несколько авторов. Отношения «многие ко многим» изображаются на диаграммах в виде линии, разветвляющейся на обоих концах. В некоторых отношениях количество «многих» записей известно точно, однако все они интерпретируются одинаково. По критерию обязательности сущности, входящие в отношения, делятся на обязательные (mandatory) и необязательные (optional).
Рис. 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 Server требует выполнения некоторых вспомогательных задач (таких как проверка целостности или архивация базы данных). Все эти задачи следует учитывать на стадии проектирования физической базы данных. Позаботьтесь о том, чтобы объем вспомогательных операций и их влияние на пользователей были минимальными. Уменьшение размера базы данных приводит к ускорению многих вспомогательных операций. Нормализация базы данных приводит к уменьшению ее размера. В результате ускоряются операции архивации и восстановления. Реализуйте структуру, которая сводит к минимуму количество записей в активных таблицах. Для этого можно разделить таблицу или заносить старые данные в архив. Тем самым вы ускорите процесс создания индекса. Безопасность При реализации базы данных также необходимо выработать план защиты. Определите, кому из пользователей разрешено работать с той или иной таблицей. Графическая утилита SQL Server Enterprise Manager SQL Server Enterprise Manager содержит утилиту диаграммного моделирования, которая может использоваться при сопровождении баз данных SQL Server. Вы работаете с базой данных, к которой подключены в настоящий момент и которой принадлежат настраиваемые объекты. Утилита выполняет большинство стандартных функций реализации баз данных. Она позволяет просматривать таблицы и отношения между ними, вносить изменения и анализировать новую диаграмму без изменения базы. Нежелательные изменения можно попросту отменить. Если же изменения вас устраивают, можно сохранить диаграмму, чтобы они немедленно вступили в силу, или построить сценарий для последующего выполнения. Примеры экзаменационных вопросов Question 1 Which of the following statements are true about normalization? [Check all correct answers] • • • • •
A. Normalization is used to reduce the number of tables in a database. B. Normalization can remove redundant data from the database. C. Normalization can be used to speed up maintenance tasks. D. Normalization simplifies select statements. E. Most databases are in fifth normal form.
Вопрос 1 Что из нижеперечисленного является методом обеспечения целостности? [Выберите все правильные ответы] • • • • •
A. Нормализация используется для сокращения числа таблиц в базе данных. B. Нормализация может привести к удалению избыточных данных из базы. C. Нормализация может использоваться для ускорения вспомогательных операций. D. Нормализация упрощает команды выбора. E. Большинство баз данных находится в пятой нормальной форме.
Правильные ответы — B и C. Нормализация используется для удаления избыточных данных, а уменьшение таблиц ускоряет вспомогательные операции. Как правило, процесс нормализации увеличивает количество таблиц, поэтому ответ A неверен. При большем количестве таблиц команды выбора требуют большего числа объединений и потому усложняются; ответ D неверен. Ответ E также неверен — большинство баз данных находится в третьей нормальной форме. Question 2 Which of the following are integrity types? [Check all correct answers] • A. Domain integrity. • B. Attribute integrity.
converted to PDF by BoJIoc
• C. Entity integrity. • D. Referential integrity. • E. Table integrity. Вопрос 2 Какие из следующих утверждений о нормализации верны? [Выберите все правильные ответы] • • • • •
A. Целостность доменов. B. Целостность атрибутов. C. Целостность сущностей. D. Ссылочная целостность. E. Целостность таблиц.
Правильные ответы — A, C и D. В них указаны правильные типы целостности. Ответы B и Е не относятся к типам целостности. Question 3 Entity integrity should be enforced using which of the following? [Check all correct answers] • • • • •
A. Primary keys. B. Foreign keys. C. Unique indexes. D. Unique constraints. E. Identity.
Вопрос 3 Что из перечисленного ниже используется для обеспечения целостности сущностей? [Выберите все правильные ответы] • • • • •
A. Первичные ключи. B. Внешние ключи. C. Уникальные индексы. D. Ограничения уникальности. E. Счетчики.
Правильные ответы — A, D и E. Ответ C неверен; хотя уникальные индексы могут обеспечивать целостность сущностей, Microsoft не рекомендует использовать этот вариант. Ответ B также неверен, поскольку внешние ключи используются для обеспечения целостности ссылок, а не сущностей. Question 4 What should be done to convert the entity US Tax Payer into first normal form? US Tax Payer contains the following attributes: Social Security Number, First Name, Last Name, Street Address, City, State, Phone Number 1, Phone Number 2, Phone Number 3, Phone Number 4. • • • • •
A. Combine the phone numbers into one field. B. Make an entity to contain the phone numbers. C. Move City and State to another entity. D. All of the above. E. None of the above.
Вопрос 4 Что следует сделать для преобразования сущности «Налогоплательщик» в первую нормальную форму? Сущность «Налогоплательщик» содержит следующие атрибуты: Номер социального страхования, Имя, Фамилия, Адрес, Город, Штат, Телефон 1, Телефон 2, Телефон 3, Телефон 4. • • • • •
A. Объединить телефоны в одно поле. B. Создать сущность для хранения телефонов. C. Переместить Город и Штат в другую сущность. D. Все перечисленное выше. E. Ничего из перечисленного выше.
Правильный ответ — B; сущность в первой нормальной форме не должна содержать повторяющихся групп. Ответ A неверен. Он позволяет избавиться от повторяющихся групп, однако новый атрибут будет содержать более одного элемента данных. Ответ C неверен, поскольку даже после перемещения атрибутов Город и Штат сущность «Налогоплательщик» все равно будет содержать повторяющиеся группы.
converted to PDF by BoJIoc
Question 5 For the entity US Tax Payer, what attributes should be used as the primary key attributes for it to be in third normal form? After normalizing US Tax Payer into first normal form, it contains the following attributes: Social Security Number, First Name, Last Name, Street Address, City, State. • • • • •
A. Social Security Number, Last Name. B. First Name, Last Name. C. First Name, Last Name, City. D. First Name, Last Name, Street Address, City, State. E. None of the above.
Вопрос 5 Какие атрибуты следует включить в первичный ключ сущности «Налогоплательщик», чтобы она находилась в третьей нормальной форме? После преобразования сущности «Налогоплательщик» в первую нормальную форму она содержит следующие атрибуты: Номер социального страхования, Имя, Фамилия, Адрес, Город, Штат. • • • • •
A. Номер социального страхования, Фамилия. B. Имя, Фамилия. C. Имя, Фамилия, Город. D. Имя, Фамилия, Адрес, Город, Штат. E. Ничего из перечисленного выше.
Правильный ответ — E. У сущности, находящейся в третьей нормальной форме, все атрибуты зависят от полного набора атрибутов первичного ключа. Для данной сущности первичным ключом является атрибут «Номер социального страхования». Ответ A неверен; запись таблицы определяется номером социального страхования, и фамилия не участвует в идентификации записей. Ответы B, C и D неверны, поскольку данные таблицы не зависят от перечисленных атрибутов. ГЛАВА 3
Системные базы данных, таблицы и хранимые процедуры Ключевые термины • • • • • • • • •
Метаданные Словарь данных Системная база данных Системная таблица База данных master База данных tempdb База данных model База данных msdb Системная хранимая процедура
Необходимые знания и приемы • Анализ системных таблиц и баз данных При использовании SQL Server возникает задача сохранения информации о том, как хранятся данные в базе. Информация о хранении данных называется метаданными. Метаданные хранятся в словаре данных (набор системных таблиц), заполняемом командами CREATE и ALTER. Словарь данных, как и любые другие данные SQL Server, делится на таблицы. Например, при создании таблицы вы добавляете новую запись в таблицу sysobjects. В этой таблице присутствуют записи для каждого объекта базы данных. Кроме того, новая запись появляется и в таблице sysindexes, которая содержит запись для каждого индекса. А также несколько новых записей появляются в таблице syscolumns (по одной для каждого столбца данных). Помимо системных таблиц, многие из которых присутствуют во всех базах, существует несколько системных баз данных, содержащих информацию о конкретной системе и используемых при выполнении таких задач, как репликация. В SQL Server существуют четыре системных базы данных: master
converted to PDF by BoJIoc
(высокоуровневые данные о сервере), tempdb (временные таблицы, специфические для отдельных процессов или запросов), model (шаблон для создания новых баз данных) и msdb (данные для планировщика SQL Server Agent). Существуют два типа системных таблиц: присутствующие в каждой базе данных (метаданные каждой базы) и содержащиеся только в системных базах данных (информация о сервере в целом, а не о конкретной базе). Наконец, в SQL Server существует ряд системных хранимых процедур, используемых при работе с системными таблицами. Они используются при выполнении таких задач, как заполнение системных таблиц и обработка запросов к ним (например, процедура sp_who выдает сведения обо всех серверных процессах, работающих в данный момент). Системные процедуры важны по двум причинам: во-первых, они позволяют легко получить нужную информацию из системных таблиц, а во-вторых, они используются для заполнения системных таблиц. Системные базы данных Системные базы данных отделяют данные сервера от пользовательских данных. Можно рассматривать их как высокоуровневую форму нормализации. В системе Microsoft SQL Server существуют четыре системных базы данных: master, tempdb, model и msdb. В следующих разделах приведено подробное описание каждой из четырех системных баз SQL Server. master В базе данных master хранятся сведения о системе SQL Server на уровне сервера, среди которых — регистрация обращений к серверу, параметры конфигурации, базы данных и их отображение на физические устройства (другими словами, при записи в базу данных страница в действительности записывается в файл на диске). Все эти данные записываются в системные таблицы. Поскольку база данных master содержит данные о системе, специфические для SQL Server, а также некоторые данные уровня операционной системы (некоторые параметры памяти, физические имена файлов и т. д.), вы всегда должны иметь резервную копию базы данных master. tempdb В базе данных tempdb хранятся временные таблицы и хранимые процедуры SQL Server. Tempdb содержит временные таблицы, намеренно созданные разработчиком, а также все временные таблицы и промежуточные результаты, используемые SQL Server при обработке запросов. Более того, tempdb также применяется для хранения любых временных данных (например, создаваемых при обработке секций GROUP BY и союзов). Помните: tempdb является глобальным ресурсом. Другими словами, tempdb содержит временные таблицы и хранимые процедуры всех пользователей, подключенных к системе. Поскольку временные таблицы и хранимые процедуры автоматически удаляются при отключении пользователя, а при закрытии системы активных подключений не остается, содержимое tempdb никогда не сохраняется между сеансами работы с SQL Server. База данных tempdb заново создается по определению из sysdatabases и содержимому базы model при каждом запуске SQL Server. Это гарантирует чистоту базы (отсутствие каких-либо данных, кроме хранящихся в базе model). Файл базы данных tempdb на диске динамически увеличивается по мере необходимости. Автоувеличение (autogrow) — новая возможность, появившаяся в SQL Server 7. При каждом запуске системы размер tempdb сбрасывается до первоначального значения, которым является размер базы данных model. Чтобы избежать затрат, связанных с автоувеличением tempdb, увеличьте размер базы командой ALTER TABLE. В предыдущих версиях SQL Server содержимое tempdb могло храниться в памяти — теперь такая возможность отсутствует. model База данных model представляет собой шаблон, по которому создаются другие базы данных. При выполнении команды CREATE DATABASE содержимое model копируется в новую базу данных, а остаток
converted to PDF by BoJIoc
новой базы заполняется пустыми страницами, выделяемыми под таблицы при вставке новых данных. Как упоминалось выше, база данных tempdb создается заново при каждом запуске SQL Server; следовательно, при каждом запуске tempdb обращается к базе данных model. Это означает, что база данных model всегда должна присутствовать в системе SQL Server. msdb База данных msdb используется SQL Server Agent для планирования оповещений и заданий, а также для хранения данных об операторах. Каждая база данных SQL Server содержит системные таблицы, которые используются для записи данных, используемых компонентами SQL Server (то есть метаданных). Местонахождение файлов В SQL Server версии 7 каждая база данных имеет собственный набор системных файлов. По умолчанию файлы хранятся в каталоге C:\Msssql7\Data. Имена системных файлов и их размеры для типичной установки перечислены в табл. 3.1. Данные и журналы хранятся в разных файлах. В версии 7 журнал транзакций не выглядит как нормальная таблица, как это было в предыдущих версиях (таблица syslogs). В ранних версиях SQL Server системные базы данных master и model хранились в одном файле, который назывался главным устройством (master device). Первые 2 Мбайт пространства tempdb тоже хранились на главном устройстве. Из-за этого иногда возникали проблемы со свободным местом в базах master и model. Теперь каждая база данных имеет собственный набор файлов и может увеличиваться независимо от других баз. Таблица 3.1. Стандартные системные файлы Файл базы данных
Физическое имя файла Стандартный размер (для типичной установки)
master - основные данные Master.mdf
7,5 Мбайт
master - журнал
1 Мбайт
Mastlog.ldf
tempdb - основные данные Tempdb.mdf
8 Мбайт
tempdb - журнал
Templog.ldf
0,5 Мбайт
model - основные данные
Model.mdf
0,75 Мбайт
model - журнал
Modellog.ldf
0,75 Мбайт
msdb - основные данные
Msbdata.mdf
3,5 Мбайт
msdb - журнал
Msdblog.ldf
0,75 Мбайт
Системные таблицы Системные таблицы почти ничем не отличаются от обычных, кроме одного — вместо пользовательских данных в них хранится информация о содержимом базы или о сервере. Они автоматически заполняются при выполнении команды CREATE или некоторых системных хранимых процедур. Вы не должны непосредственно обновлять содержимое системных таблиц. Более того, для них нельзя устанавливать триггеры, поскольку это может привести к изменениям в работе системы. В системных таблицах хранятся данные двух типов: уровня сервера и относящиеся к конкретной базе данных. Как нетрудно предположить, информация о сервере хранится только в базе данных master. Информация о конкретной базе данных находится в каждой отдельной базе данных. В табл. 3.2–3.5 перечислены различные системные таблицы. В табл. 3.2 перечислены таблицы с системными данными уровня сервера, хранящиеся в таблице master. В табл. 3.3 перечислены таблицы с данными, используемыми SQL Server Agent. В табл. 3.4 представлены таблицы с данными, используемыми в операциях архивации и восстановления, а в табл. 3.5 — таблицы с системной информацией уровня базы данных, присутствующие в каждой базе. Таблица 3.2. Системные таблицы с данными о сервере (база данных MASTER) Имя таблицы
Содержимое
converted to PDF by BoJIoc
sysallocations
Одна запись на каждую единицу выделения.
sysaltfiles
Одна запись на каждый файл базы данных.
syscharsets
Одна запись на каждый установленный набор символов и порядок сортировки.
sysconfigures
Конфигурация системы, которая вступает в силу при перезагрузке сервера.
syscurconfigs
Текущая конфигурация системы.
sysdatabases
Одна запись на каждую базу данных.
sysdevices
Одна запись на каждое устройство.
syslanguages
Одна запись на каждый установленный язык.
syslockinfo
Одна запись на каждую блокировку.
syslogins
Одна запись на каждую учетную запись пользователя для входа.
sysmessages
Одна запись на каждое сообщение, определяемое для сервера.
sysoledbusers
Одна запись для каждого имени/пароля на заданном связанном сервере.
sysperfinfo
Внутренние счетчики быстродействия для Performance Monitor.
sysprocesses
Одна запись на каждый присоединенный процесс.
sysremotelogins Одна запись на каждую удаленную учетную запись для входа. sysservers
Одна запись на каждый доступный сервер, включая текущий.
Вам не придется запоминать имена или содержимое всех системных таблиц, однако бывает полезно знать, какая информация хранится в каждой системной таблице. В табл. 3.3 и 3.4 содержимое таблиц не указано, поскольку эти данные не обязательны для сдачи экзамена. Таблица 3.3. Системные таблицы уровня сервера для системного агента (база данных MSDB) Имя таблицы sysalerts syscategories sysdownloadlist sysjobhistory sysjobs sysjobsschedules sysjobservers sysjobsteps sysnotifications sysoperators systargetservergroupmembers systargetservergroups systargetservers systaskids Таблица 3.4. Системные таблицы базы данных MSDB Имя таблицы backupfile backupmediafamily backupmediaset backupset restorefile
converted to PDF by BoJIoc
restorefilegroup restorehistory Таблица 3.5. Системные таблицы уровня базы данных (присутствуют во всех базах данных) Имя таблицы
Содержимое
syscolumns
Одна запись на каждый столбец в каждой таблице.
syscomments
Текст создания всех пользовательских объектов.
sysconstraints
Одна запись на каждое определенное ограничение.
sysdepends
Одна запись на каждую зависимость объектов.
sysfilegroups
Одна запись на каждую группу файлов.
sysfiles
Одна запись на каждый файл.
sysforeignkeys
Одна запись на каждый внешний ключ.
sysfulltextcatalogs Набор текстовых каталогов. sysindexes
Одна запись на каждый индекс и таблицу.
sysindexkeys
Информация о каждом столбце индекса.
sysmembers
Одна строка для каждого члена роли базы данных.
sysobjects
Одна строка для каждого объекта базы данных.
syspermissions
Предоставленные и отозванные права доступа пользователей.
sysprotects
Предоставленные или отказанные права защиты.
sysreferences
Ограничения внешних ключей.
systypes
Типы данных, определяемые пользователем.
sysusers
Одна запись для каждого пользователя и группы.
Системные хранимые процедуры Для модификации системных таблиц следует использовать готовые системные хранимые процедуры. Системные хранимые процедуры делятся на категории в соответствии с областью применения (табл. 3.6). Если в документации явно не оговорено обратное, все системные хранимые процедуры возвращают значение 0 как признак успешного завершения. Иногда это раздражает новичков; многие интерфейсы не сообщают о завершении операций с нулевым кодом, из-за чего пользователь не получает положительной обратной связи в виде сообщения «Готово!». Когда у вас появится опыт работы с системными хранимыми процедурами, вы сможете модифицировать их или написать собственные процедуры. Таблица 3.6. Категории системных хранимых процедур Категория
Описание
Процедуры каталога
Реализация функций словаря данных ODBC и изоляция приложений ODBC от изменений в системных таблицах.
Процедуры курсоров
Реализация возможностей курсорных переменных.
Процедуры распределенных запросов
Реализация распределенных запросов и управление ими.
Процедуры SQL Server Agent
Управление операциями (запланированными или зависящими от событий) с помощью SQL Server Agent.
Процедуры репликации
Управление, разрешение или запрет задач репликации.
Процедуры безопасности Обеспечение защиты. Системные процедуры
Общее сопровождение SQL Server.
converted to PDF by BoJIoc
Процедуры Web Assistant Помощь в работе Web Assistant. Общие расширенные процедуры
Интерфейс SQL Server с внешними программами для различных вспомогательных операций.
Расширенные процедуры Работа с электронной почтой в SQL Server. SQL Mail Средства SQL Server Profiler. Для выполнения расширенных процедур SQL Server Расширенные процедуры Profiler на локальном сервере через SQL Server Query Analyzer следует SQL Server Profiler использовать средства аутентификации Windows NT. Процедуры OLE Automation
Применение стандартных объектов OLE Automation в стандартных пакетах Transact-SQL.
Процедуры Data Transformation Services
Управление службой преобразования данных, методами устойчивости и пространством имен.
Системные хранимые процедуры, определяемые администратором Администратор может создавать свои собственные системные процедуры. Они обладают многими достоинствами, в том числе и тем, что системные процедуры автоматически изменяют контекст базы данных (по умолчанию хранимые процедуры выполняются в контексте базы данных, в которой они были созданы; если процедура создавалась в контексте базы данных pubs, она всегда будет обращаться к объектам базы pubs, даже если она выполняется из другой базы данных). Чтобы создать собственную системную процедуру, воспользуйтесь базой данных master, снабдите имя процедуры префиксом sp_ и предоставьте право исполнения тем, кому разрешается запуск данной процедуры. Например: create proc sp_listtables as select name from sysobjects where type = 'U' Примеры экзаменационных вопросов Question 1 Which database(s) contains system tables? [Check all correct answers] • • • • •
A. master B. model C. tempdb D. msdb E. All of the above
Вопрос 1 Какие базы данных содержат системные таблицы? [Выберите все правильные ответы] • • • • •
A. master B. model C. tempdb D. msdb E. Все перечисленные
Правильный ответ — E. Системные таблицы присутствуют во всех базах данных. Question 2 Which database(s) contains server-specific system tables? [Check all correct answers] • • • • •
A. master. B. model. C. tempdb. D. msdb. E. All of the above.
Вопрос 2 Какие базы данных содержат системные таблицы с данными о сервере? [Выберите все правильные ответы]
converted to PDF by BoJIoc
• • • • •
A. master. B. model. C. tempdb. D. msdb. E. Все перечисленные.
Правильные ответы — A (данные о конфигурации сервера) и D (информация для System Agent). Ответы B и C неверны, поскольку эти базы данных содержат только информацию, относящуюся к конкретным таблицам. Question 3 Which system table contains information pertaining to who may access a server? • • • • •
A. syslogins. B. sysusers. C. sysaccesses. D. sysdatabaseaccess. E. None of the above.
Вопрос 3 Какая системная таблица содержит информацию о том, кто может работать на сервере? • • • • •
A. syslogins. B. sysusers. C. sysaccesses. D. sysdatabaseaccess. E. Ни одна из перечисленных выше.
Правильный ответ — A. Ответ B относится к конкретным базам данных, ответы C и D не существуют. Question 4 Which system table contains information pertaining to who may access a database? • • • • •
A. syslogins. B. sysusers. C. sysaccesses. D. sysdatabaseaccess. E. None of the above.
Вопрос 4 Какая системная таблица содержит информацию о том, кто может работать с базой данных? • • • • •
A. syslogins. B. sysusers. C. sysaccesses. D. sysdatabaseaccess. 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. Файлы делятся на три типа: • Первичные файлы. Используются для хранения данных и информации, определяющих начальные действия с базой. База данных содержит лишь один первичный файл. Стандартное расширение — .mdf. • Вторичные файлы. Одна или несколько вспомогательных областей для хранения данных. Могут использоваться для распределения операций чтения/записи по нескольким дискам. Стандартное расширение — .ndf. • Файлы журналов. Содержат журналы транзакций базы данных. База данных содержит по крайней мере один файл журнала. Стандартное расширение — .ldf. Перед непосредственной записью транзакций в файл данных все вносимые изменения записываются в журнал. Примечание Каждая база данных содержит по крайней мере один первичный файл и один файл журнала. SQL Server не накладывает жестких ограничений на расширения файлов, но мы рекомендуем следовать правилам Microsoft. Каждый файл может принадлежать лишь одной базе данных. Группы файлов Группы файлов предназначены для объединения нескольких файлов. Каждый файл может входить не более чем в одну группу. Файлы журналов не могут принадлежать никаким группам. Группы файлов используются для распределения операций чтения/записи по нескольким дискам. Если группа содержит более одного файла, операции записи распределяются между файлами группы. Базы данных могут содержать до 32 768 групп файлов. У каждой базы данных имеется первичная группа файлов. Она содержит первичный файл данных и все файлы, которые не были явно назначены в другую группу файлов. Имя первичной группы файлов — PRIMARY. Таблицы и индексы можно назначить в любую группу файлов. При отсутствии назначений они включаются в стандартную группу файлов. В любой момент времени лишь одна группа файлов может быть назначена стандартной. Проблемы файлов и групп
converted to PDF by BoJIoc
Файл или группа файлов может использоваться лишь одной базой данных. В свою очередь, файл может входить лишь в одну группу. Кроме того, данные и журналы должны храниться в отдельных файлах. Файлы журналов никогда не входят в группы. Как правило, база данных с одним файлом данных и одним файлом журнала удовлетворяет требованиям к быстродействию. Если вы собираетесь работать с несколькими файлами, воспользуйтесь первичным файлом только для системных таблиц и объектов. Затем создайте по крайней мере один вторичный файл для хранения пользовательских данных и объектов. Распределяйте файлы или группы по как можно большему числу локальных физических дисков. Объекты, занимающие много места, включаются в различные группы файлов. По соображениям быстродействия файлы базы данных не следует размещать на сетевых дисках. Разные таблицы, используемые в одном запросе, помещаются в разные группы файлов. Параллельный поиск на диске при вводе/выводе для объединенных данных повышает быстродействие. Кроме того, таблицы, к которым происходят частые обращения, и некластерные индексы, принадлежащие этим таблицам, также помещаются в разные группы. Быстродействие также повышается благодаря параллельному вводу/выводу, если файлы находятся на разных физических дисках. Для повышения быстродействия файлы журналов не должны находиться на одном устройстве с файлами данных. По возможности избегайте размещения файлов операционной системы на дисках, содержащих файлы данных или журналов SQL Server. Устройства SQL Server все еще позволяет создавать устройства (или предопределенные файлы данных) командой DISK INIT перед созданием базы данных. Однако Microsoft не рекомендует пользоваться командой DISK INIT, которая была включена в версию 7.0 лишь для обеспечения обратной совместимости. Команда DISK INIT имеет следующий синтаксис: DISK INIT NAME = 'логическое_имя' PHYSNAME = 'физическое_имя' VDEVNO = виртуальный_номер_устройства SIZE = количество_2-килобайтных_блоков [, VSTART = виртуальный_адрес] Устройство включается в таблицу sysdevices базы данных master. Таблица также содержит все устройства выгрузки и устройства баз данных master, model и tempdb. Создание базы данных Базы данных создаются командой CREATE DATABASE. Создание баз данных разрешается любому пользователю с ролью системного администратора или всем, кому системный администратор предоставил такое право. Команда CREATE DATABASE имеет следующий синтаксис: CREATE DATABASE имя_базы [ ON [PRIMARY] ([ NAME = логическое_имя_файла, ] FILENAME = 'имя_файла_ОС' [, SIZE = размер] [, MAXSIZE = { максимальный_размер | UNLIMITED } ] [, FILEGROWTH = приращение] ) | {FILEGROUP имя_группы_файлов FILEDEFINITIONS} [,...n] ] [LOG ON {[ NAME = логическое_имя_файла, ] [FILENAME = 'имя_файла_ОС' [, SIZE = размер] [, MAXSIZE = { максимальный_размер | UNLIMITED } ] [, FILEGROWTH = приращение] } [,...n] [FOR LOAD | FOR ATTACH] Команда CREATE DATABASE может использоваться для связывания базы данных с устройством, созданным командой DISK INIT. Мы рекомендуем использовать команду CREATE DATABASE для создания файлов базы
converted to PDF by BoJIoc
данных и связывания их с базой. Если при создании базы не указан первичный файл данных и/или файл журнала, то отсутствующий файл (или файлы) создается с именем по умолчанию. Физические файлы будут находиться в стандартном каталоге. Первичному файлу присваивается имя имя_базы.mdf, а файлу журнала — имя_ базы_log.ldf. Если размер файлов не задан, то при создании размер первичного файла совпадает с размером первичного устройства базы model, а размер файла журнала и вторичных файлов данных равен 1 Мбайт. Он может быть и больше, если размер первичного файла базы данных model превышает 1 Мбайт. Хотя имена и размеры файлов указывать не обязательно, на практике это всегда следует делать. SQL Server создает базу данных за два этапа. На первом этапе база model копируется в новую базу данных, а на втором этапе инициализируется все неиспользуемое пространство. Команда CREATE DATABASE имеет следующие параметры: • PRIMARY — файл определяется как первичное устройство. • NAME — логическое имя; по умолчанию совпадает с именем файла. • FILENAME — полное имя файла на диске. • SIZE — исходный размер файла. Минимальный размер файла журнала равен 512 Кбайт. • MAXSIZE — максимальный размер файла. • UNLIMITED — размер файла не ограничивается. • FILEGROWTH — приращение размера в мегабайтах (MB), килобайтах (KB) или процентах (%). По умолчанию приращение равно 10%. • FOR LOAD — обеспечивает обратную совместимость со сценариями SQL, написанными для предыдущих версий SQL Server. • FOR ATTACH — указывает, что файлы базы данных уже существуют. Пользователь, создавший базу данных, является ее владельцем. Все параметры конфигурации базы копируются из базы model, если только при создании базы не был указан параметр FOR ATTACH. В этом случае параметры конфигурации читаются из существующей базы данных. Рассмотрим некоторые примеры команды CREATE DATABASE: /* База данных со стандартным размером и именами файлов */ CREATE DATABASE test1 /* Данные — 2 Мбайт, файл журнала — по умолчанию */ CREATE DATABASE test2 ON (FILENAME = 'c:\d1.mdf', SIZE = 2, NAME = 'd1') /* Первичный файл — 10 Мбайт, одна группа файлов g1 и журнал размером 10 Мбайт */ CREATE DATABASE test3 ON PRIMARY (FILENAME ='c:\test3.mdf', SIZE = 10 , NAME = 'd1'), FILEGROUP g1 (FILENAME — 'c:\g1.mdf', SIZE = 10 , NAME = 'g1') LOG ON (FILENAME ='c:\test3.ldf', SIZE = 10, NAME = 'log1') Модификация баз данных В SQL Server 7.0 модификация баз данных выполняется нечасто. И все же не исключено, что вам придется добавить новые файлы или группы, уменьшить размер базы, сменить владельца или имя базы данных, заново сконфигурировать существующий файл или группу. Возможны любые модификации, кроме переименования базы в многопользовательском режиме. Удаление базы данных Базы данных удаляются командой DROP DATABASE. Команда DROP DATABASE имеет следующий синтаксис: DROP DATABASE имя_базы [, n]
converted to PDF by BoJIoc
Команда удаляет одну или несколько баз данных. При удалении базы удаляются файлы, используемые ею. Если база данных используется в настоящий момент, удаление невозможно. После удаления база и ее файлы не могут использоваться. Смена владельца базы данных Для изменения владельца базы данных используется хранимая процедура sp_changedbowner. Владельцем базы данных можно назначить любую учетную запись пользователя для входа, не являющуюся текущим пользователем базы. Если у текущего владельца базы данных существуют псевдонимы (aliases), вы можете указать, хотите ли вы назначить их новому владельцу. Хранимая процедура для смены владельца базы данных имеет следующий синтаксис: sp_changedbowner [@loginame =] 'имя' [.[@map =] [флаг_псевдонимов] Смена владельца выполняется только пользователями с правами системного администратора. Внимание Вы не можете сменить владельца системных баз данных. При смене владельца необходимо предварительно перейти к базе данных. Применение процедуры sp_changedbowner продемонстрировано в следующем примере: USE MyDb go sp_changedbowner @loginame='NewDBO' go Переименование баз данных Для смены имени базы данных в SQL Server существует хранимая процедура sp_renamedb. Процедура переименования базы данных имеет следующий синтаксис: sp_renamedb "старое_имя","новое_имя" Только системный администратор может переименовать базу данных. База данных должна быть предварительно переведена в однопользовательский режим (см. раздел «Настройка баз данных» этой главы). Рассмотрим пример использования процедуры sp_renamedb: use master go sp_dboption MyDB,'single','true' go sp_renamedb MyDB,'MyNewDB' go sp_dboption MyNewDB,'single','false' go Команда ALTER Команда ALTER DATABASE позволяет изменить как определение, так и размер базы данных. Она имеет следующий синтаксис: ALTER DATABASE база_данных { ADD FILE <спецификация> [,...n] [TO FILEGROUP имя_группы] | ADD LOG FILE <спецификация> [,...n] | REMOVE FILE логическое_имя_файла | ADD FILEGROUP имя_группы | REMOVE FILEGROUP имя_группы | MODIFY FILE <спецификация> | MODIFY FILEGROUP имя_группы свойство_группы }
converted to PDF by BoJIoc
<спецификация> ::= (NAME = 'логическое_имя_файла' [, FILENAME = 'имя_файла_ОС' ] [, SIZE = размер] [, MAXSIZE = { максимальный_ размер | UNLIMITED } ] [, FILEGROWTH = приращение] ) Команда ALTER DATABASE позволяет включать файлы в существующие группы или добавлять в базу данных новые файлы журналов. Если вы добавляете новый файл данных без указания группы, файл включается в первичную группу. Команда ALTER DATABASE также выполняет следующие функции: • Удаление пустых файлов. Первичная группа всегда должна содержать как минимум один первичный файл и один файл журнала в базе данных. При удалении файла удаляется физический файл. • Добавление новых групп файлов. При добавлении новой группы в нее не включаются никакие файлы. • Удаление групп файлов. Если в группе присутствуют какие-либо файлы, они должны быть пустыми; в противном случае удаление группы невозможно. Удалить первичную группу файлов невозможно. Используя команду ALTER DATABASE для модификации файлов, необходимо указывать логическое имя файла. Спецификация позволяет изменить все остальные параметры, однако в одной команде ALTER DATABASE можно указать лишь один параметр. Если вы изменяете размер файла, новый размер не может быть меньше текущего. При модификации группы файлов можно задавать свойства READONLY, READWRITE и DEFAULT: • Свойство READONLY говорит о том, что группа файлов доступна только для чтения. Оно предотвращает возможную модификацию объектов из этой группы. Для первичной группы установка этого свойства невозможна. Свойство READONLY может устанавливаться только пользователями, обладающими монопольным доступом к базе данных. • Свойство READWRITE обладает противоположным действием. Оно разрешает обновление объектов в группе. Свойство READWRITE может устанавливаться только пользователями, обладающими монопольным доступом к базе данных. • Свойство DEFAULT говорит о том, что группа назначается стандартной для базы данных. При установке свойства DEFAULT это свойство отменяется для группы, которая была назначена стандартной ранее. При создании базы стандартной группой назначается первичная группа файлов. Если в командах CREATE TABLE, ALTER TABLE и CREATE INDEX не указана группа файлов, новые таблицы и индексы создаются в стандартной группе. Непосредственное перемещение файлов из одной группы в другую невозможно. Вам придется сначала удалить файл, а затем включить его в новую группу. Приведем несколько примеров использования команды ALTER DATABASE: /* Следующий пример включает новый файл данных pubs_data.ndf размером 50 Мбайт в новую группу grp2 */ ALTER DATABASE pubs ADD FILEGROUP grp2 ALTER DATABASE pubs ADD FILE ( NAME = 'PubsFile2', FILENAME = 'c:\temp\pubsdata2.ndf', SIZE = 50 ) TO FILEGROUP grp2 /* Следующий пример удаляет группу grp2, созданную в предыдущем примере, из базы данных pubs */ ALTER DATABASE pubs REMOVE FILE PubsFile2 ALTER DATABASE pubs REMOVE FILEGROUP grp2 Уменьшение размера баз данных вручную Уменьшение размера баз данных вручную выполняется командой DBCC SHRINKDATABASE. Она имеет следующий синтаксис:
converted to PDF by BoJIoc
DBCC SHRINKDATABASE ( имя_базы [, процент] [, {NOTRUNCATE | TRUNCATEONLY}] ) При сжатии базы данных можно указать необязательный параметр — процент свободного места, которое вы хотите оставить в базе данных. Параметр NOTRUNCATE отменяет стандартное поведение и оставляет свободное место в файлах операционной системы после сжатия файла. Параметр TRUNCATEONLY возвращает операционной системе все неиспользуемое место в файлах данных и сокращает файл до последнего экстента. Команда не пытается переместить записи в невыделенные страницы. При наличии параметра NOTRUNCATE значение процент игнорируется. Параметр NOTRUNCATE не позволяет сократить файл ниже минимального размера. Команда DBCC SHRINKFILE не сжимает файл больше минимума, необходимого для хранения данных в файле. Если параметр NOTRUNCATE используется вместе с параметром процент, то последствия ограничиваются перемещением используемых страниц в начало файла. База данных не может стать меньше базы model. Сжатие файлов выполняется командой DBCC SHRINKFILE в базе данных, файлы которой требуется сжать. Команда SHRINKFILE имеет следующий синтаксис: DBCC SHRINKFILE { {имя_файла | идентификатор_файла } { [ , размер] | [, {EMPTYFILE | NOTRUNCATE | TRUNCATEONLY}] } ) Файл определяется по имени или по идентификатору. В процессе сжатия данные обычно перемещаются в страницы, находящиеся в начале файла. Параметр размер — целое число, определяющее требуемый размер файла. Если размер не указан, файл сжимается до минимального размера, необходимого для хранения данных. Параметр EMPTYFILE перемещает все данные из файла в другие файлы группы. После очистки файла SQL Server не позволяет заносить в него новые данные. Тем самым файл готовится к удалению командой ALTER DATABASE. Параметр NOTRUNCATE освобождает неиспользуемое место, но не перемещает записи данных. При его наличии параметр размер игнорируется. Настройка параметров баз данных Многие параметры конфигурации SQL Server настраиваются на уровне баз данных. Конфигурация может осуществляться хранимой процедурой sp_dboption. Процедура sp_dboption имеет следующий синтаксис: sp_dboption ['база_данных'] [, 'имя_параметра'] [, 'значение'] Если база данных не указана, sp_configure выводит список всех настраиваемых параметров. Допустимые параметры перечислены в табл. 4.1. Таблица 4.1. Параметры конфигурации баз данных Параметр
Описание
AUTOCLOSE
Если параметр равен TRUE, после выхода последнего пользователя база данных закрывается с освобождением всех ресурсов.
AUTOSHRINK
Если параметр равен TRUE, файлы базы данных являются кандидатами для периодического автоматического сжатия.
ANSI NULL DEFAULT
Если параметр равен TRUE и при создании или модификации таблицы для столбца не был задан параметр NOT NULL, то допустимость значений NULL в этом столбце определяется по правилам SQL-92.
ANSI NULLS
Если параметр равен TRUE, результат всех сравнений с NULL считается равным
converted to PDF by BoJIoc
UNKNOWN. Если параметр равен FALSE и при этом не используются значения UNICODE, результат NULL = NULL считается равным TRUE. ANSI WARNINGS
Если параметр равен TRUE, то при возникновении состояний типа "деления на ноль" выдаются ошибки или предупреждения.
CONCAT NULL YIELDS NULL
Если параметр равен TRUE и хотя бы один из операндов конкатенации равен NULL, результат также равен NULL.
CURSOR CLOSE ON COMMIT
Если параметр равен TRUE, любые курсоры, открытые на момент закрепления или отката изменений, закрываются. Если параметр равен FALSE, курсоры остаются открытыми при завершении транзакции. Откат транзакции при значении FALSE закрывает любые курсоры, кроме тех, которые определялись как INSENSITIVE или STATIC.
DBO USE ONLY
Если параметр равен TRUE, базу данных может использовать лишь ее владелец.
DEFAULT TO LOCAL CURSOR
Если параметр равен TRUE, при объявлениях курсоров по умолчанию принимается тип LOCAL.
MERGE PUBLISH
Если параметр равен TRUE, база данных может быть опубликована для репликации сведением..
OFFLINE
Если параметр равен TRUE, база данных находится в отключенном состоянии и не может никем использоваться.
PUBLISHER
Если параметр равен TRUE, база данных может быть опубликована для репликации.
QUOTED IDENTIFIER
Если параметр равен TRUE, идентификаторы могут заключаться в кавычки (").
READ ONLY
Если параметр равен TRUE, пользователи могут только читать данные из базы, не модифицируя ее.
RECURSIVE TRIGGERS
Если параметр равен TRUE, то модификация данных в результате срабатывания триггера может приводить к срабатыванию того же самого триггера.
SELECT INTO/BULKCOPY
Если параметр равен TRUE, разрешается команда SELECT INTO, WRITETEXT без записи в журнал, UPDATETEXT без записи в журнал и опрации с использованием команды BULK COPY..
SINGLE USER
Если параметр равен TRUE, то в произвольный момент времени с базой данных может работать лишь один пользователь.
SUBSCRIBED
Если параметр равен TRUE, база данных может быть подписана для публикации.
TORN PAGE DETECTION
Если параметр равен TRUE, становится возможным обнаружение незавершенных страниц.
TRUNC.LOG ON CHKPT.
Если параметр равен TRUE, при заполнении журнала на 70 процентов происходит автоматическое усечение, при этом для журнала устанавливается контрольная точка.
Для базы данных master можно задать лишь один параметр TRUNC.LOG ON CHKPT. При создании новой базы устанавливаются параметры, которые в данный момент установлены для базы model. Внимание Изменения конфигурационных параметров вступают в силу лишь после прохождения базой данных контрольной точки. Однако SQL Server автоматически устанавливает контрольную точку после вызова процедуры sp_configure. Просмотр сведений о базе данных SQL Server содержит три стандартных процедуры каталога (см. табл. 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 [[@filename = ] 'имя'] Если имя файла не указано, SQL Server возвращает информацию обо всех файлах базы данных. Хранимая процедура sp_helpfilegroup выдает информацию о группе файлов текущей базы. Она имеет следующий синтаксис: sp_helpfilegroup [[@filegroupname = ] 'имя'] Если имя группы не задано, программа возвращает информацию обо всех группах. При наличии параметра name хранимая процедура sp_ helpfilegroup также запускает sp_helpfile для каждого файла в группе. Чтобы получить информацию о первичной группе файлов, заключите имя в кавычки, поскольку оно является зарезервированным словом. Например: sp_helpfilegroup @filegroupname = 'primary' Enterprise Manager Для управления базами данных можно воспользоваться утилитой Enterprise Manager. Создание и модификации файлов в Enterprise Manager реализуются с помощью мастеров (wizards). Использование баз данных У любого пользовательского сеанса имеется текущая база данных; Microsoft называет это «использованием» базы данных. Системный администратор определяет для вас базу данных, которая должна использоваться по умолчанию при получении доступа к серверу. Если база данных не была указана при создании учетной записи, используется база master, однако она может быть в любой момент изменена системным администратором. Чтобы узнать имя текущей базы данных, воспользуйтесь встроенной функцией SQL: /* Вывод имени текущей базы данных */ SELECT db_name() Смена текущей базы данных выполняется командой USE. Все элементы синтаксиса SQL, следующие за командой USE, будут выполняться в контексте новой базы данных. Ниже показан пример использования команды USE: /* Назначить текущей базой данных "student07" */ USE student07 Примеры экзаменационных вопросов Question 1 If you want to remove a file from database, which of the following statements are true? [Check all correct answers] • • • • • • •
A. You must be in the database from which you want to remove the file. B. You must run the DBCC SHRINKFILE command to make sure that the file is empty. C. You cannot remove the file if its file group has data in it. D. You run the DBCC REMOVEFILE command to remove the file from the database. E. The OS file will still have the data in it after it is removed from the database. F. The database must be in single user mode. G. None of the above.
converted to PDF by BoJIoc
Вопрос 1 Если вы хотите удалить файл из базы данных, какие из следующих утверждений являются истинными? [Выберите все правильные ответы] • • • • • • •
A. Вы должны находиться в той базе данных, из которой удаляется файл. B. Вы должны выполнить команду DBCC SHRINKFILE, чтобы гарантировать, что файл пуст. C. Вы не можете удалить файл, если в его группе файлов имеются данные. D. Файл удаляется из базы данных командой DBCC REMOVEFILE. E. Файл ОС все еще будет содержать данные после его удаления из базы. F. База данных должна находиться в однопользовательском режиме. G. Ни одно из перечисленных.
Правильный ответ — G. Ответ A неверен, поскольку команда ALTER DATABASE не ограничивается текущей базой данных. Хотя файл не должен содержать данных, вы не обязаны сжимать его перед удалением, поэтому ответ B неверен. Ответ C тоже неверен; файл можно удалить даже в том случае, если другие файлы группы содержат данные. Команда DBCC REMOVEFILE не существует, поэтому ответ D неверен. После удаления из базы данных файл удаляется из операционной системы, следовательно, ответ E неверен. Question 2 Which of the following will create a database called MyDB with an initial size of 50 MB for the database files? • A. create database MyDB datasize=40 , logsize = 10 • B. create database MyDB on File1 =40 log on file2=10 • C. create database MyDB on NAME='File1', size = 40 log on name=file2, size = 10 • D. create database MyDB on( NAME='File1', size = 40) log on(name=file2, size = 10) • E. create database MyDB on (NAME='File1', size = 40 log on name=file2, size = 10) Вопрос 2 Какая из команд создает базу данных с именем MyDB и исходным размером файлов 50 Мбайт? • A. create database MyDB datasize=40 , logsize = 10 • B. create database MyDB on File1 =40 log on file2=10 • C. create database MyDB on NAME='File1', size = 40 log on name=file2, size = 10 • D. create database MyDB on( NAME='File1', size = 40) log on(name=file2, size = 10) • E. create database MyDB on (NAME='File1', size = 40 log on name=file2, size = 10) Единственный синтаксически правильный ответ — D. В ответе A отсутствуют ключевые слова on и log on. В ответе B используется синтаксис старых версий SQL Server. В ответе C не хватает скобок. В ответе E скобки расставлены неверно. Question 3 To find out information about all files used in the current database, you should use which of the following SQL statements? • • • •
A. sp_helpgroup B. sp_helpdb C. sp_helpfile D. sp_listfiles
Вопрос 3 Какую из перечисленных команд SQL следует использовать для получения информации обо всех файлах текущей базы данных?
converted to PDF by BoJIoc
• • • •
A. sp_helpgroup B. sp_helpdb C. sp_helpfile D. sp_listfiles
Правильный ответ — C. Ответ A (sp_helpgroup без имени файла) выводит только сведения о группах. Ответ B (sp_helpdb) без указания имени выводит только однострочную сводку о базах данных. Хранимая процедура sp_listfiles не существует. Question 4 How do you stop users from modifying data in a database? [Check all correct answers] • • • • •
A. Set the NOWRITE database configuration option. B. Set the READONLY file option for every file in the database. C. Set the READONLY file group option for every file in the database. D. Set the READONLY database configuration option. E. It cannot be done.
Вопрос 4 Как предотвратить модификацию данных в базе пользователями? [Выберите все правильные ответы] • • • • •
A. Установить параметр конфигурации базы данных NOWRITE. B. Установить параметр файла READONLY для каждого файла в базе данных. C. Установить параметр группы файлов READONLY для каждого файла в базе данных. D. Установить параметр конфигурации базы данных READONLY. E. Это сделать невозможно.
Правильный ответ — D. Параметр конфигурации базы NOWRITE не существует, следовательно, ответ 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 ] [ IDENTITY [(начало, приращение ) [ NOT FOR REPLICATION] ] ] [ ROWGUIDCOL ] [CONSTRAINT имя_ограничения] { { PRIMARY KEY | UNIQUE } [CLUSTERED | NONCLUSTERED] [WITH [FILLFACTOR = коэффициент_заполнения] [ON {группа_файлов | DEFAULT} ] | [FOREIGN KEY] REFERENCES ссылка_таблица [ ( ссылка_столбец ) ] [NOT FOR REPLICATION] | DEFAULT выражение_константа | CHECK [NOT FOR REPLICATION] (логическое_выражение) }] [ ...n] | имя_столбца AS вычисляемое_выражение | <ограничение_таблицы> } [, ...n] ) [ON {группа_файлов | DEFAULT} ] [TEXTIMAGE_ON {группа_файлов | DEFAULT} ] <определение_столбца> ::= { имя_столбца тип_данных } [ NULL | NOT NULL ] [IDENTITY [(начало, приращение ) [NOT FOR REPLICATION] ] ] [ ROWGUIDCOL ] [ <ограничение_столбца> ::= [CONSTRAINT имя_ограничения] { { PRIMARY KEY | UNIQUE } [CLUSTERED | NONCLUSTERED] [WITH [FILLFACTOR = коэффициент_заполнения] ] [ON {группа_файлов | DEFAULT} ] | [FOREIGN_KEY] REFERENCES ссылка_таблица [ ( ссылка_столбец ) ] [NOT FOR REPLICATION] | DEFAULT выражение_константа | CHECK [NOT FOR REPLICATION] (логическое_выражение) } ] [ ...n] Пример CREATE TABLE authors_short (author_id int not null, lastname varchar(40) not null, firstname varchar(20) null) В приведенном примере создается таблица с именем authors_short, предназначенная для хранения списка авторов. Таблица состоит из столбцов для фамилий и имен, а также кодов авторов. Структура таблицы показана в табл. 5.1. Имена таблиц
converted to PDF by BoJIoc
Имена таблиц ограничиваются 128 символами. Они должны быть уникальными по отношению к владельцу — то есть две таблицы с одинаковыми именами не могут принадлежать одному владельцу, но у другого пользователя может быть таблица с тем же именем. Столбцы Таблица может содержать до 1024 столбцов. Для каждого столбца определяются как минимум имя и тип данных. Имена столбцов имеют длину до 128 символов и являются уникальными в пределах таблицы. Имена столбцов соответствуют обычным правилам выбора имен идентификаторов и состоят из букв, цифр и служебных символов (_, @ и #). Таблица 5.1. Таблица authors author_id lastname
firstname
1
Bennet
Abraham
2
Blotchet-Halls Reginald
3
DeFrance
Cheryl
Типы данных В табл. 5.2 перечислены основные типы данных, используемые в SQL Server при создании столбцов. Совет При выборе типа данных столбца будьте внимательны. Например, для хранения данных типа int необходимо больше места, чем для tinyint. Следовательно, при создании столбца для хранения целых величин следует определить его максимальные значения. Если содержимое столбца никогда не превышает 10, логичнее выбрать тип tinyint, который позволяет более эффективно расходовать место хранения данных. Таблица 5.2. Основные типы данных в базах Тип данных
Описание
BIT
Целое значение 0 или 1.
INT
Целое число в интервале от -2147483648 до 2147483647.
SMALLINT
Целое число в интервале от -32768 до 32767.
TINYINT
Целое число в интервале от 0 до 255.
DECIMAL(p,s)
Числовые данные с фиксированной точностью (p) и количеством цифр после запятой (s). Интервал: от -1038-1 до 1038-1.
NUMERIC(p,s)
Синоним Decimal.
FLOAT
Число с плавающей запятой. Интервал: от -1.79E+308 до 1.79E+308.
REAL
Число с плавающей запятой. Интервал: от -3.40E+38 до 3.40E+38.
CHAR(N)
Строка фиксированной длины (n). Максимальная длина - 8000 символов.
VARCHAR(n)
Строка переменной длины (n). Максимальная длина - 8000 символов.
TEXT
Символьные данные переменной длины. Максимальная длина - 2147483647 символов.
MONEY
Денежная сумма. Интервал: от -922337203685477.5808 до 922.337.203.685.5807.
SMALLMONEY
Денежная сумма. Интервал: от -214748.3648 до 214748.3647.
DATETIME
Дата и время. Интервал: от 1 января 1753 г. до 31 декабря 9999 г. Обратите внимание: время хранится в виде интервалов продолжительностью 3,33 миллисекунды, поэтому точность данных составляет 3,33 миллисекунды.
SMALLDATETIME
Дата и время. Интервал: от 1 января 1900 г. до 6 июня 2079 г. Точность: 1 минута.
TIMESTAMP
Пометка времени. Величина, назначаемая компьютером и используемая для управления изменениями.
converted to PDF by BoJIoc
UNIQUEIDENTIFIER Глобально-уникальный идентификатор (GUID). BINARY(n)
Двоичные строковые данные фиксированной длины (n). Максимальная длина: 8000 байт.
VARBINARY
Двоичные строковые данные переменной длины (n). Максимальная длина: 8000 байт.
IMAGE
Двоичные данные. Максимальная длина: 2 Гбайт.
NCHAR
Символьная строка фиксированной длины в многобайтовой кодировке (Unicode). Максимальная длина: 4000 символов.
NTEXT
Текстовые данные переменной длины в многобайтовой кодировке (Unicode). Максимальная длина: 1073741823 символов.
NVARCHAR
Символьная строка переменной длины в многобайтовой кодировке (Unicode). Максимальная длина: 4000 символов.
SYSNAME
Синоним nvarchar(128).
NULL/NOT NULL Если столбец создается с параметром NULL, то при вводе данных в базу столбец можно оставить пустым. Если столбец содержит обязательные данные, его следует создавать с параметром NOT NULL. По умолчанию столбцы создаются с параметром NOT NULL (хотя в ODBC этот параметр изменяется). Уникальные идентификаторы Теория реляционных баз данных требует, чтобы в базе существовал способ однозначной идентификации записей. Иногда однозначная идентификация записей реализуется просто, но при отсутствии удобного способа приходится использовать ключ с последовательным приращением или другой неестественный механизм. В SQL Server существуют столбцы счетчика, в которых уникальность значений обеспечивается автоматически. Столбцы счетчика Столбец счетчика представляет собой автоматизированный столбец, генерирующий уникальные значения с некоторым приращением. Они часто используются для определения уникальности записей таблицы. Столбцы счетчика не могут содержать неопределенные значения и должны относиться к числовому типу данных (например, int, smallint, tinyint, numeric(p,0) или decimal(p,0)). Если при объявлении столбца не указаны начальное значение и приращение, столбец действует как счетчик с начальным значением 1 и приращением 1. Внимание Нумерация столбцов счетчика может содержать пропуски, обусловленные незавершенными транзакциями или непредвиденными сбоями сервера. При выборе типа данных для столбца счетчика следует быть внимательным. Как видно из предыдущего примера, недостаточный размер столбца счетчика может вызвать немало проблем. CREATE TABLE too_short (id_num tinyint IDENTITY, name varchar(25) NOT NULL) В этом примере столбец счетчика объявлен с типом tinyint, для которого максимальное значение равно 255. При достижении максимума таблица будет отвергать все дальнейшие операции вставки. Столбец счетчика не гарантирует уникальности значений. ROWGUIDCOL Свойство столбца ROWGUIDCOL в сочетании с типом данных UNIQUEIDENTIFIER обеспечивает глобальную уникальность значения для всех компьютеров сети. Такая возможность бывает полезной при работе с несколькими базами данных, содержимое которых требуется объединить.
converted to PDF by BoJIoc
Ограничения Ограничения накладывают определенные условия на данные, вводимые в таблицу. Условием может быть уникальность значения, принадлежность некоторому интервалу или наличие первичного ключа, соответствующего внешнему ключу (ограничения ссылочной целостности). SQL Server поддерживает четыре типа ограничений (PRIMARY KEY, FOREIGN KEY, CHECK и UNIQUE). Все четыре типа могут быть объявлены в определении столбца или присоединены в конце определения таблицы. PRIMARY KEY Ограничения первичного ключа требуют, чтобы содержимое ограничиваемых столбцов было уникальным. Объявление первичного ключа гарантирует однозначную идентификацию записей таблицы (ограничение PRIMARY KEY или UNIQUE является обязательным требованием для обеспечения ссылочной целостности посредством ограничения внешних ключей; другими словами, если вы начинаете определять внешние ключи, ссылающиеся на таблицы, для внешнего ключа должен быть определен первичный ключ). В следующем фрагменте ограничение первичного ключа объявляется при объявлении столбца. Обратите внимание на то, что ограничение включено в объявление столбца author_id. Такой способ подходит для первичных ключей, состоящих из одного столбца, но для объявлениямногостолбцового первичного ключа потребуется объявление на уровне таблицы. В листингах 5.2 и 5.3 приведены примеры команды CREATE TABLE с объявлением первичного ключа. Листинг 5.2. Создание таблицы с объявлением первичного ключа на уровне столбца CREATE TABLE authors_short (author_id int NOT NULL CONSTRAINT author_pk PRIMARY KEY, lastname varchar(40) NOT NULL, firstname varchar(20) NULL) Листинг 5.3 делает то же, что и листинг 5.2. Единственное отличие заключается в том, что ограничение объявляется после объявления последнего столбца (firstname). Обратите внимание на то, что в объявлении таблицы за ключевыми словами PRIMARY KEY следует список ограничиваемых столбцов. Это дает возможность объявлять многостолбцовые первичные ключи. Листинг 5.3. Создание таблицы с объявлением первичного ключа на уровне таблицы CREATE TABLE authors_short (author_id int NOT NULL, lastname varchar(40) NOT NULL, firstname varchar(20) NULL, CONSTRAINT author_pk PRIMARY KEY (author_id)) Указывать ключевое слово CONSTRAINT с именем ограничения необязательно. Тем не менее, если имя не указано, SQL Server присваивает его за вас. Для первичного ключа также по умолчанию генерируется кластерный индекс (индексы рассматриваются в главе 9). У ограничения PRIMARY KEY существует альтернатива — ограничение UNIQUE. Отличие между ними заключается в том, что ограничение UNIQUE допускает ввод неопределенных значений и генерирует некластерный индекс. FOREIGN KEY Как упоминалось выше, база данных представляет собой набор взаимосвязанных таблиц. Ограничение внешнего ключа является одним из способов выражения отношений, существующих между таблицами. При установке ограничения внешнего ключа SQL Server обращается к столбцу первичного ключа связанной таблицы и проверяет совпадение данные в общих столбцах. Это становится обязательным требованием при обеспечении ссылочной целостности. Пример ссылочного ограничения приведен в листинге 5.4. Листинг 5.4. Команда CREATE TABLE с ограничением ссылок на уровне столбца
converted to PDF by BoJIoc
CREATE TABLE book_author (book_name varchar(30) NOT NULL, Author_id int NOT NULL CONSTRAINT author_fk REFERENCES authors_short ( author_id)) Листинг 5.4 создает таблицу, содержащую имена книг и имена авторов. Ограничение REFERENCES требует, чтобы значение author_id уже присутствовало в таблице authors_short. Листинг 5.5. Команда CREATE TABLE с ограничением внешнего ключа на уровне таблицы CREATE TABLE book_author (book_name varchar(30) NOT NULL, author_id int NOT NULL, CONSTRAINT author_fk FOREIGN KEY (author_id) REFERENCES authors_short ( author_id)) Листинг 5.5 делает то же, что и предыдущий. Отличаются только синтаксис и функциональность. Во втором примере устанавливается ограничение уровня таблицы, поэтому в нем использована форма с ключевым словом FOREIGN_KEY, за которым указывается проверяемый столбец (столбцы) таблицы book_authors. Ограничение REFERENCES определяет таблицу authors_short и столбец author_id, в котором должны находиться существующие данные. Многостолбцовые ограничения внешнего ключа должны объявляться на уровне таблицы. Они ссылаются на столбцы, объявленные в качестве первичных ключей или имеющие уникальные индексы. Как и для ограничений первичного ключа, часть CONSTRAINT ИмяОграничения можно опустить; тем не менее, SQL Server присвоит ограничению имя за вас. Внимание Создание ограничений внешнего ключа не приводит к индексированию столбца, указанного в ограничении. CHECK В некоторых ситуациях проверяется не существование данных (как в ограничении внешнего ключа), а их правильность. Деловые правила могут предъявлять определенные требования к вводимым данным. Для их реализации можно воспользоваться ограничением проверки. Кроме того, ограничения проверки позволяют сравнивать данные из разных столбцов — при условии, что столбцы находятся в одной таблице, а ограничение объявлено на уровне таблицы. В листинге 5.6 создается таблица a_authors; в ней хранятся записи авторов, имена которых начинаются с буквы A. Листинг 5.6. Команда CREATE TABLE с ограничением проверки на уровне столбца CREATE TABLE a_authors (author_id int NOT NULL, lastname varchar(40) NOT NULL CONSTRAINT lastname_ck CHECK (lastname LIKE "A%" ), firstname varchar(20) NULL) Для столбца lastname установлено ограничение уровня столбца. Оно проверяет первую букву всех фамилий, вводимых в таблицу (листинг 5.7). Листинг 5.7. Команда CREATE TABLE с ограничением проверки на уровне таблицы CREATE TABLE a_authors (author_id int NOT NULL, lastname varchar(40) NOT NULL, firstname varchar(20) NULL, CONSTRAINT lastname_ck CHECK (lastname LIKE "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, Volume int NOT NULL CONSTRAINT vol_def DEFAULT 0) /* Объявление на уровне таблицы */ CREATE TABLE book_sales (book_id int NOT NULL, Volume int NOT NULL, CONSTRAINT vol_def DEFAULT 0 FOR Volume) Обратите внимание: при объявлении на уровне таблицы DEFAULT сопровождается ключевым словом FOR, определяющим конкретный столбец таблицы. Информацию о значениях по умолчанию, как и об остальных ограничениях, можно получить с помощью хранимых процедур sp_help или sp_helpconstraint. Вычисляемые столбцы SQL Server позволяет создавать виртуальные столбцы, значения которых вычисляются с использованием функций, констант или других столбцов таблицы. Вычисляемые столбцы определяются в виде выражений, которые представляют собой формулы T-SQL. В листинге 5.9 приведен пример таблицы с вычисляемым столбцом. Листинг 5.9. Команда CREATE TABLE с вычисляемым столбцом CREATE TABLE book_price (book_id int NOT NULL, whsl_price smallmoney NOT NULL, markup_pct numeric (5,2) NOT NULL, msrp AS whsl_price *(1+(markup_pct/100))) Команда создает таблицу, состоящую из трех столбцов: book_id, whsl_ price и markup_pct. Столбец msrp является вычисляемым и не сохраняется в таблице. В результате четыре столбца занимают место трех. Модификация таблиц После создания таблицы в базе данных в нее можно внести изменения. К числу возможных модификаций относится добавление столбцов, изменение типов данных в существующих столбцах, объявление первичных ключей и т. д. Обратите внимание на то, что вы не можете удалить ограничение первичного ключа при наличии ограничения внешнего ключа, ссылающегося на него. Полный синтаксис команды ALTER TABLE показан в листинге 5.10. Листинг 5.10. Синтаксис команды ALTER TABLE ALTER TABLE имя_таблицы { [WITH CHECK | WITH NOCHECK] { [ALTER COLUMN имя_столбца { [ новый_тип_данных [ (точность[, количество_ цифр_после_запятой] ) ] [ NULL | NOT NULL ] ] | [ {ADD | DROP} ROWGUIDCOL ]
converted to PDF by BoJIoc
} ] | ADD { [{ имя_столбца тип_данных } [ NULL | NOT NULL ] [ IDENTITY [(начало[, приращение] ) [NOT FOR REPLICATION] ] ] [ ROWGUIDCOL ] ] | имя_столбца AS вычисляемое_выражение | [[CONSTRAINT имя_ограничения] { [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED] { ( столбец[,...n] ) } [ WITH [FILLFACTOR = коэффициент_заполнения] ] [ON (группа_файлов | DEFAULT} ]] | FOREIGN KEY [(столбец[,...n])] REFERENCES ссылка_таблица [(ссылка_столбец[,...n])] [NOT FOR REPLICATION] | DEFAULT выражение_константа [FOR столбец] | CHECK [NOT FOR REPLICATION] (логическое_выражение) }] }[,...n] | DROP { [CONSTRAIN] ограничение | COLUMN столбец }[,...n] | {CHECK | NOCHECK} CONSTRAINT {ALL | ограничение[,...n]} } } Дополнение таблиц После создания таблицы в нее можно добавить новые столбцы, ограничения и значения по умолчанию. Добавление столбцов после определения таблицы осуществляется командой ALTER TABLE. Пример приведен в листинге 5.11. Листинг 5.11. Команда ALTER TABLE с новыми столбцами и ограничениями ALTER TABLE authors_short ADD MI char(1) NULL CONSTRAINT MI_ck CHECK (MI like "[A-Z]") ALTER TABLE authors_short ADD MI char(1) NULL, CONSTRAINT MI_ck CHECK (MI LIKE "[A-Z]") Две команды ALTER TABLE, приведенные в листинге 5.11, функционально идентичны. В первой ограничение проверки объявляется на уровне столбца, а во второй — на уровне таблицы. Модификация таблиц с помощью команды ALTER TABLE ADD SQL Server предполагает, что столбец может содержать неопределенные значения, если в объявлении не указано обратное. Если новый столбец не допускает неопределенных значений, необходимо определить для него значение по умолчанию. Новые столбцы могут представлять собой вычисляемые выражения и объявляться с ограничениями уровня столбцов. Удаление из таблиц
converted to PDF by BoJIoc
Из созданной таблицы можно удалить столбцы или ограничения. При удалении ограничений следует помнить, что выполнению команды могут помешать некоторые зависимости. Например, если столбец является первичным ключом, SQL Server не позволит удалить его до тех пор, пока не будет снято соответствующее ограничение. Если в другой таблице существует ссылка на столбец, SQL Server также не позволит удалить его до снятия ограничения. Синтаксис команды удаления показан в листинге 5.12. Листинг 5.12. Примеры команды ALTER TABLE DROP ALTER TABLE authors_short DROP CONSTRAINT MI_ck ALTER TABLE authors_short DROP COLUMN MI Модификация столбцов Иногда люди делают неверные предположения относительно типа данных, которые они собираются хранить в таблице. Неверный выбор приводит к неэффективному хранению данных или же данные могут оказаться слишком большими и не помещаться в столбцах. В таких ситуациях следует изменить исходное определение столбцов командой ALTER TABLE. Пример использования команды ALTER TABLE приведен ниже: ALTER TABLE authors_short ALTER COLUMN firstname varchar(40) В этом примере команда ALTER TABLE используется для увеличения столбца. При первоначальном объявлении таблицы authors_short столбец firstname был объявлен с типом varchar(25). Команда ALTER TABLE расширяет его до 40 символов. Примечание При модификации столбца должно существовать неявное преобразование старого типа данных в новый; новый тип данных не может иметь тип Timestamp. Если модифицированный столбец является столбцом счетчика, новый тип данных должен быть допустимым для столбцов счетчика. Временные таблицы Временные таблицы похожи на обычные, однако они не предназначены для постоянного хранения данных. Во временных таблицах часто хранятся данные, которые должны быть модифицированы или использованы позднее. Они создаются, удаляются и используются как обычные таблицы. Ниже перечислены главные отличия временных таблиц от обычных: • Имена временных таблиц должны начинаться с символов # или ##. • Имена временных таблиц ограничиваются 116 символами. • Временные таблицы удаляются при отключении пользователя от базы данных. • Временные таблицы используются так, как будто они входят в текущую базу данных, однако в действительности данные хранятся в TEMPDB. В SQL Server существуют два типа временных таблиц: локальные и глобальные. Локальные временные таблицы Локальные временные таблицы доступны лишь для своего владельца. Имена локальных временных таблиц всегда начинаются с префикса #. В следующем фрагменте создается локальная временная таблица: CREATE TABLE #temp1 ( a int NULL, b varchar(25) NULL) Команда создает временную таблицу с именем #temp1. Синтаксис команды отличается только тем, что имя таблицы начинается с символа #. Глобальные временные таблицы
converted to PDF by BoJIoc
Глобальные временные таблицы похожи на локальные, за исключением того, что они доступны для всех пользователей, а их имена должны начинаться с префикса ##. Следующий фрагмент создает глобальную временную таблицу: CREATE TABLE ##temp2 ( a int NULL, b varchar(25) NULL) Когда временная таблица становится ненужной, ее можно удалить, как и любую другую таблицу. Удаление таблиц Ненужные таблицы удаляются командой DROP. Удаленная таблица навсегда пропадает из базы данных. Это действие отменить невозможно. Команда DROP TABLE имеет следующий синтаксис: DROP TABLE имя_таблицы Пример DROP TABLE authors_short Внимание Удалять можно только пользовательские таблицы, но не системные таблицы SQL Server. Таблицу, на которую ссылаются какие-либо ограничения, удалить нельзя. Перед удалением таблицы эти ограничения необходимо отключить или удалить. Таблица может быть удалена только владельцем. Удаленную таблицу нельзя восстановить — «откат» в этой операции невозможен. Таблицу приходится создавать заново. Совет Рекомендуем хранить тексты всех команд, создающих ваши объекты, в отдельном файле, чтобы в экстренной ситуации (нарушении данных, миграции базы и т. д.) их можно было бы построить заново. Кроме того, это упрощает процесс миграции между различными системами. Примеры экзаменационных вопросов Question 1 What is the maximum length of a table name for SQL Server? • • • • •
A. 128. B. 116. C. 90. D. 30. E. None of the above.
Вопрос 1 Какова максимальная длина имени таблицы в SQL Server? • • • • •
A. 128. B. 116. C. 90. D. 30. E. Ни одно из перечисленных значений.
Правильный ответ — A. Тем не менее, в прежних версиях SQL Server максимальная длина имени была равна 30 символам. Question 2 What is the maximum character length for a char or varchar datatype? • • • •
A. 255. B. 128. C. 8000. D. 2000.
converted to PDF by BoJIoc
• E. None of the above. Вопрос 2 Чему равно максимальное количество символов в типе данных char или varchar? • • • • •
A. 255. B. 128. C. 8000. D. 2000. E. Ни одно из перечисленных значений.
Правильный ответ — C. В прежних версиях SQL Server эти типы данных могли содержать лишь до 255 символов. Question 3 Which of the following are true about local temporary tables? [Check all correct answers] • • • • •
A. Their names are preceded by #. B. They are stored in tempdb. C. The are accessible to other users. D. Their names are preceded by ##. E. They can be dropped like normal tables.
Вопрос 3 Какие из следующих утверждений истинны для локальных временных таблиц? [Выберите все правильные ответы] • • • • •
A. Их имена начинаются с #. B. Они хранятся в tempdb. C. Они доступны для других пользователей. D. Их имена начинаются с ##. E. Они могут быть удалены, как обычные таблицы.
Правильные ответы — A, B и E. Ответы C и D относятся к глобальным временным таблицам. Question 4 What datatypes are valid for an identity column? [Check all correct answers] • • • • •
A. numeric (5,1) B. decimal (4,0) C. int D. bit E. tinyint
Вопрос 4 Какие типы данных допускаются для столбцов счетчика? [Выберите все правильные ответы] • • • • •
A. numeric (5,1) B. decimal (4,0) C. int D. bit E. tinyint
Правильные ответы — B, C и E. Ответ A неверен, поскольку столбец счетчика должен содержать целые числа. Тип данных bit, приведенный в варианте D, слишком мал для столбца счетчика и потому недопустим. Question 5 A foreign key constraint can be created provided that: • • • • •
A. The referenced table already exists. B. Its referenced column(s) have a primary key or unique constraint. C. The constraint name is unique within the database. D. All of the above. E. None of the above.
Вопрос 5 Ограничение внешнего ключа может быть создано при следующем условии:
converted to PDF by BoJIoc
• A. Таблица, на которую оно ссылается, уже существует. • B. Столбец (столбцы), на который оно ссылается, имеет ограничение первичного ключа или уникальности. • C. Имя ограничения уникально в базе данных. • D. Все из перечисленного выше. • E. Ничего из перечисленного выше. Правильный ответ — D. Все остальные ответы неполны. Question 6 Which of the following correctly completes the phrase «A table may be dropped ...»: • • • • •
A. by using the ALTER TABLE table_name DROP command. B. by any user with access to the table. C. if there are no constraints referencing it. D. All of the above. E. None of the above.
Вопрос 6 Какой из следующих вариантов правильно завершает фразу «Таблица может быть удалена...»: • • • • •
A. командой ALTER TABLE имя_таблицы DROP. B. любым пользователем, имеющим доступ к таблице. C. если не существует ограничений, ссылающихся на нее. D. Все из перечисленного выше. E. Ничего из перечисленного выше.
Правильный ответ — C. Ответ А неверен, поскольку команда ALTER TABLE DROP удаляет столбцы, а не таблицы. Ответ B неверен, поскольку таблица может быть удалена только своим владельцем (независимо от того, кто ее создал). ГЛАВА 6
Выборка данных Ключевые термины • • • • • • • • •
Команда SELEСT Подзапрос Агрегат Союз SQL Объединение таблиц Использование подзапросов Уточнение имен объектов Запросы к типам данных text и image
Необходимые знания и приемы • • • • • • • • • •
Отбор записей Использование функций Использование ключевого слова like Форматирование и сортировка данных Группировка результатов Внешнее объединение Внутреннее объединение Ортогональное объединение Итоговый набор Производная таблица
Хранение данных в таблице принесет пользу лишь в том случае, если у вас есть возможность получить эти данные. Как нетрудно догадаться, для обращения к данным в таблицах Microsoft SQL Server используется язык SQL (Structured 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; HAVING; ORDER BY; COMPUTE.
Все части команды SELECT, кроме списка выборки, являются необязательными. Порядок их перечисления строго фиксирован. Синтаксис команды SELECT приведен в листинге 6.1. Листинг 6.1. Синтаксис команды SELECT SELECT [ ALL | DISTINCT ] [ TOP n [PERCENT] [WITH TIES] список_выборки [ INTO имя_таблицы ] [FROM {имя_таблицы | имя_представления} [ , {имя_таблицы | имя_представления} ... ] [ WHERE условия_поиска ] [ GROUP BY выражение_без_агрегатов [ , выражение_без_агрегатов ... ] [WITH CUBE|ROLLUP] ] [ HAVING условия_поиска ] [ ORDER BY { имя_столбца | список_выборки } [ ASC | DESC ] [ , { имя_столбца | список_выборки } [ ASC | DESC ] ... ] ] [ COMPUTE агрегат(имя_столбца) [ , агрегат(имя_столбца) ] ... [ BY имя_столбца [ , имя_столбца ] ... ] ] ] После выполнения команды SELECT вы получаете от SQL Server итоговый набор (таблицу результатов). Итоговый набор состоит из трех частей: столбцов, заголовков столбцов и записей. Итоговый набор может содержать один или несколько столбцов. Кроме того, он может содержать пустые заголовки столбцов, а также ноль и более записей данных. Примечание Имена таблиц и столбцов могут быть настроены так, чтобы в них различался или не различался регистр символов. В ключевых словах SQL регистр никогда не учитывается. В SQL Server имена могут заключаться в квадратные скобки, например [имя_объекта]. В следующем фрагменте приведены два варианта команды SELECT, с квадратными скобками и без них: SELECT [d]/[discounttype] FROM [dbo].[discount] d -- Эквивалентная команда select SELECT d.discounttype FROM dbo.discount d В следующих разделах мы подробнее рассмотрим каждую из семи частей команды SELECT. Чтобы изложение материала было последовательным, части будут описываться в порядке их следования в команде SELECT. Итак, начнем со списка выборки. Список выборки Начало команды SELECT выглядит следующим образом:
converted to PDF by BoJIoc
SELECT [ ALL | DISTINCT ] [ TOP n [PERCENT] [WITH TIES] список_выборки В этой секции вы указываете, какие столбцы включаются в итоговый набор команды SELECT. Столбцы возвращаются в порядке их перечисления в списке выборки. При выполнении команды SELECT возвращается виртуальная таблица результатов (итоговый набор). Таблица может содержать константы, столбцы, функции и производные столбцы. Например, следующая команда возвращает константу ('constant value'), столбец базы данных (Column1), функцию (@@SERVERNAME) и производный столбец (Column2+Column2): SELECT 'constant value', Column1, @@SERVERNAME, Column2+Column2 FROM MyTable Чтобы список выборки содержал все столбцы таблицы, можно либо перечислить имена всех столбцов, либо включить в список выборки символ «звездочка» (*). Если список выборки содержит звездочку, возвращаются все столбцы таблицы. Символ * может указываться наряду с ограничениями, столбцами и производными столбцами. Следующий пример демонстрирует использование звездочки в команде SELECT: SELECT * FROM MyTable SELECT *, Column1+Column2 FROM MyTable По умолчанию команда SELECT возвращает все записи, включая дубликаты. Чтобы явно запросить все записи, поместите ключевое слово ALL перед списком выборки. Без ключевого слова ALL всегда можно обойтись; оно поддерживается только для того, чтобы TSQL соответствовал стандарту ANSI. Чтобы команда SELECT возвращала только уникальные записи, поставьте перед списком выборки ключевое слово DISTINCT. Ключевое слово DISTINCT (или ALL, если оно используется) должно находиться сразу же после ключевого слова SELECT: SELECT DISTINCT 'constant value', Column1, @@SERVERNAME, Column2+Column2 FROM MyTable Команда SELECT позволяет присвоить значения переменным или получить итоговый набор. В одной команде SELECT нельзя сделать и то, и другое. Например, если @a — целая переменная, то следующая команда SELECT верна: SELECT @a = 5 Однако следующая команда SELECT недопустима: SELECT @a = 5, au_id FROM authors При выполнении команды SELECT в итоговый набор для каждого возвращаемого столбца включается заголовок по умолчанию. Значения констант, функции и производные столбцы имеют пустые заголовки. Заголовок столбца по умолчанию совпадает с его именем. Так, в предыдущем примере для константы был бы создан пустой заголовок, для столбца Column1 — заголовок Column1, а для @@SERVERNAME и Column2+Column2 — пустые строки. Чтобы изменить заголовки столбцов, назначьте им псевдонимы в списке выборки. В 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 JOIN <таблица_или_представление> { { INNER | { FULL | LEFT | RIGHT } [OUTER] JOIN } <таблица_или_представление> ON <условие_объединения> }[, ...n] Без секции FROM команда SELECT может лишь присваивать значения переменным, возвращать переменные и выполнять функции. Команда SELECT может содержать до 256 таблиц, представлений или производных таблиц. Приведем пример с двумя таблицами: SELECT * FROM MyTable, MyOtherTable Эта команда означает, что вы хотите выбрать все столбцы из таблиц MyTable и MyOtherTable. Для упрощения команд SQL можно воспользоваться псевдонимами таблиц. Псевдонимы таблиц Псевдоним (alias) представляет собой более короткое или легко запоминающееся имя для таблицы с длинным или трудным именем. Если для таблицы задается псевдоним, то вы уже не сможете ссылаться на нее по имени в командах SELECT, если только таблица не упоминается в секции FROM несколько раз: SELECT M.Column, MyTable.Column2 FROM MyTable M, MyTable В этом примере первому экземпляру MyTable назначается псевдоним M. Секция FROM также содержит MyTable без псевдонима. Столбец Column1 берется из экземпляра-псевдонима, а столбец Column2 — из обычного экземпляра MyTable. Следующий пример демонстрирует применение псевдонимов для сокращения длинного имени таблицы: SELECT M.Column1 FROM MyVeryVeryVeryVeryVeryVeryVeryLongTableName AS M В этом примере MyVeryVeryVeryVeryVeryVeryVeryLongTableName — таблица, а M — псевдоним. Поскольку таблице назначен псевдоним, вы не можете сослаться на нее в команде SELECT без указания псевдонима. Псевдонимы также применяются при создании производных таблиц. Производная таблица возникает в том случае, когда секция FROM вместо имени таблицы содержит команду SELECT. В этом случае данные производной таблицы состоят из данных, которые возвращаются командой SELECT, «встроенной» в секцию FROM. Если вы используете производную таблицу, ей необходимо назначить псевдоним: SELECT * FROM (SELECT * FROM master..sysprocesses) B В этом примере SELECT * FROM master..sysprocesses является производной таблицей, которой назначается псевдоним B.
converted to PDF by BoJIoc
Для упрощения команды SQL в секции FROM можно также назначить псевдонимы отдельным столбцам: SELECT AA FROM (SELECT LongColumnName FROM MyTable WHERE b != 123) AS t1 (AA) Пример создает псевдоним с именем t1 для таблицы, содержащей столбец LongColumnName таблицы MyTable. Столбцу назначается псевдоним AA. Примечание При использовании производной таблицы вы обязаны предоставить псевдонимы для всех производных столбцов. Псевдонимы таблиц и столбцов упрощают запись объектов, используемых в запросе. Полные имена объектов часто делают команды SQL излишне громоздкими. Уточнение имен объектов Уточненное имя таблицы записывается в форме ИмяСервера.ИмяБазы.ИмяВладельца.ИмяТаблицы: • ИмяСервера — по умолчанию — текущий сервер; • ИмяБазы — по умолчанию — текущая база данных; • ИмяВладельца — по умолчанию сначала проверяется, принадлежит ли таблица текущему пользователю; если не принадлежит, по умолчанию используется владелец базы данных; • ИмяТаблицы — имя таблицы; должно быть задано. Если задано имя сервера, необходимо либо задать имена базы и владельца, либо воспользоваться заполнителем (..). Если задано имя базы данных, необходимо либо задать имя владельца, либо включить заполнитель: pubs.dbo.titles pubs..titles otherserver.yourdb.user2.TheTable В первом примере pubs — имя базы данных, dbo — владелец, а titles — таблица. Во втором примере pubs — база данных, владелец таблицы — текущий пользователь или владелец базы данных, а таблица — titles. В третьем примере используется другой сервер с именем otherserver, база данных yourdb, владелец user2 и таблица TheTable. При использовании псевдонима таблицы уточненное имя столбца записывается в форме ПсевдонимТаблицы.ИмяСтолбца. Если псевдоним таблицы не используется, уточненное имя столбца записывается в форме ИмяСервера.ИмяБазы.ИмяВладельца.ИмяТаблицы.ИмяСтолбца: • ИмяСервера — по умолчанию — текущий сервер. • ИмяБазы — по умолчанию — текущая база данных. • ИмяВладельца — по умолчанию сначала проверяется, принадлежит ли таблица текущему пользователю; если не принадлежит, по умолчанию используется владелец базы данных. • ИмяТаблицы — имя таблицы, содержащей столбец. • ИмяСтолбца — имя столбца. Если имя столбца задается без уточнения, оно должно быть уникальным для всех таблиц секции FROM, поскольку в противном случае SQL Server не сможет определить, из какой таблицы следует брать столбец. При указании уточненного имени уточняющий префикс столбца должен точно совпадать с уточненным именем таблицы. Примечание Если в секции FROM не указана таблица, то вы не сможете уточнить имя столбца сведениями о владельце таблицы, имени базы данных или сервера. При использовании псевдонима уточненное имя столбца записывается в форме ПсевдонимТаблицы.ИмяСтолбца. Как и прежде, если псевдоним таблицы не указан, имя столбца должно быть уникальным. В следующем фрагменте приведены примеры уточнения имен столбцов:
converted to PDF by BoJIoc
Column1 titles.title pubs.dbo.titles.title Первый пример ссылается на столбец с именем Column1. Второй пример ссылается на столбец title из таблицы titles. Третий пример ссылается на столбец title из таблицы titles, принадлежащей владельцу базы, из базы данных pubs. Секция WHERE Секция WHERE определяет критерий отбора записей, включаемых в итоговый набор. Возвращаются только те записи, которые соответствуют условиям секции WHERE. Синтаксис секции WHERE приведен в листинге 6.3. Листинг 6.3. Синтаксис секции WHERE WHERE [ NOT ] <предикат> [ { AND | OR } [ NOT] <предикат> ] } [, ...n] <предикат> ::= { выражение { = | <> | != | > | >= | !> | < | <= | !< } выражение | строковое_выражение [NOT] LIKE строковое_выражение[ESCAPE 'метасимвол'] | выражение [NOT] BETWEEN выражение AND выражение | выражение IS [NOT] NULL | выражение [NOT] IN (подзапрос | выражение [,...n]) | выражение { = | <> | != | > | >= | !> | < | <= | !< } {ALL | SOME | ANY } (подзапрос) | EXISTS (подзапрос) } Секция WHERE позволяет сравнивать столбцы, переменные, константы, функции и любые другие выражения. Сравниваемые объекты не обязаны присутствовать в списке выборки. Вы можете объединять предикаты, называемые «условиями поиска» или «аргументами поиска», с помощью ключевых слов AND и OR. Ключевое слово NOT реализует логическое отрицание условий. Предикаты группируются с помощью скобок, что позволяет управлять порядком сравнений. Количество предикатов в секции WHERE не ограничено. Для сравнения двух выражений используются операторы сравнения. Стандартные операторы сравнения перечислены в табл. 6.1. В следующем примере продемонстрированы команды SQL с применением различных операторов сравнения: SELECT title, price FROM titles WHERE price = 19.99 SELECT title, price FROM titles WHERE SQRT(price) !< 19.99 SELECT title, price FROM titles WHERE NOT ( (price > 21.00) AND (price <30.00) ) Первая команда SELECT возвращает лишь те записи, в которых столбец price равен 19.99. Во втором примере для price вызывается функция SQRT и возвращаются только те записи, для которых полученный результат не меньше 19.99. Последняя команда проверяет, принадлежит ли столбец price к интервалу от 21.00 до 30.00; возвращаются лишь те записи, которые не входят в этот интервал. Важной составной частью секции WHERE является секция IN. Таблица 6.1. Операторы сравнения Оператор Значение =
Равно
<>
Не равно
converted to PDF by BoJIoc
!=
Не равно
>
Больше
>=
Больше или равно
!>
Не больше
<
Меньше
<=
Меньше или равно
!<
Не меньше
Секция IN Секция IN проверяет, принадлежит ли столбец набору (списку) значений. Команду IN всегда можно переписать в виде группы условий, объединяемых оператором OR. Ниже приведены два примера использования секций IN: SELECT title, WHERE price SELECT title, WHERE price
price FROM titles IN( 19.99, 21.00, 25.00, 29.99) price FROM titles NOT IN ( 19.99, 21.00, 25.00, 29.99)
Первый пример возвращает записи, у которых столбец price равен 19.99, 21.00, 25.00 или 29.99. Во втором примере возвращаются те записи, у которых значение price отлично от 19.99, 21.00, 25.00 или 29.99. Следующая часто используемая часть секции WHERE — секция LIKE. Секция LIKE Секция LIKE выполняет поиск по шаблону для символьных строк. Она используется в ситуациях, когда вас не интересует точное совпадение, — например, вы не знаете точного написания слова. Шаблон может содержать обычные и универсальные (wildcards) символы. В табл. 6.2 перечислены универсальные символы шаблонов и их смысл. Универсальные символы можно комбинировать в шаблоне. Для поиска символов, используемых в качестве универсальных, применяется служебный (escape) символ, определяемый ключевым словом ESCAPE. Стандартного служебного символа не существует. Следующие примеры демонстрируют применение секции LIKE. -- найти все значения Column1, содержащие два и более символа Column1 LIKE '_%_' -- найти все значения Column1 с открывающей квадратной скобкой Column1 LIKE '%\[%' ESCAPE '\' -- найти различные варианты написания имени smith Column1 LIKE '[Ss]m[iy]th' Таблица 6.2. Универсальные символы в шаблонах Универсальный символ
Описание
%
Ноль и более символов.
_ (подчеркивание)
Ровно один символ в строковом выражении.
[символы]
Один символ, определяемый выражением в скобках. В скобках указывается интервал ([L-Z]) или список конкретных символов ([AbK12M]).
[^символы]
Аналогичен предыдущему, однако ищет строки, не содержащие символы из заданного списка или интервала.
Первый пример ищет строку, которая содержит по крайней мере два символа. Во втором примере символ \ назначается служебным и используется для определения символа [. В результате секция LIKE находит все
converted to PDF by BoJIoc
значения Column1, содержащие символ [. Последний пример ищет варианты написания слова smith, начинающиеся со строчной или прописной буквы s и содержащие гласную i или y. Секция BETWEEN Секция BETWEEN определяет верхнюю и нижнюю границы интервала. Она применяется в случаях, когда вам известны минимальное и максимальное значения искомой величины. Если нижняя граница больше верхней, не возвращается ни одна запись. Выражения должны принадлежать к типам данных, неявно преобразуемым друг в друга, или их явное преобразование должно выполняться в команде SELECT (преобразование типов данных рассматривается ниже). Пример использования секции BETWEEN продемонстрирован в следующем фрагменте: SELECT title, price FROM titles WHERE price BETWEEN 10 AND 20 Команда находит все записи, у которых столбец price больше или равен 10, но меньше или равен 20. Ключевое слово NOT Ключевое слово NOT может включаться в любое сравнение секции WHERE. В этом случае проверяется условие, противоположное указанному. Рассмотрим пример с ключевым словом NOT: SELECT title, price FROM titles WHERE price NOT BETWEEN 10 AND 20 Команда возвращает все записи, у которых значение price либо меньше 10, либо больше 20. Проверка NULL Для поиска неопределенных значений NULL SQL Server следует воспользоваться расширением Transaction SQL =NULL. Вы можете включить в список выборки функцию IS NULL и вернуть другое значение в случае, если столбец содержит NULL. Следующий пример показывает, как проверяются неопределенные значения и как извлекаются записи, у которых столбец не равен NULL: SELECT SELECT SELECT SELECT
* * * *
FROM FROM FROM FROM
titles titles titles titles
WHERE WHERE WHERE WHERE
notes notes notes notes
IS NULL = NULL IS NOT NULL != NULL
Первые две команды выбирают из titles записи, у которых столбец notes содержит NULL. Две другие команды выбирают записи, у которых столбец notes содержит данные. Внимание Не путайте неопределенное значение NULL с текстовой строкой "NULL". Пустая текстовая строка ("") тоже не является неопределенным значением. Секция GROUP BY Секция GROUP BY предназначена для включения промежуточных результатов в итоговый набор. Она используется в сочетании с агрегатными функциями (агрегатные функции подробно описаны ниже) для получения обобщающих данных. Агрегатная функция обрабатывает данные нескольких записей и вычисляет обобщающий результат, возвращаемый как часть списка выборки. При использовании GROUP BY все столбцы итогового набора либо являются агрегатными функциями, либо включаются в секцию GROUP BY. Секция GROUP BY имеет следующий синтаксис: GROUP BY [ALL] список_группировки [WITH CUBE|ROLLUP] Ключевое слово ALL требует, чтобы SQL Server создавал записи для столбцов, для которых на основании секции WHERE не должны создаваться записи. Список группировки может содержать любые столбцы из списка выборки. Любое изменение значений в столбцах, входящих в список группировки, приводит к
converted to PDF by BoJIoc
вычислению нового результата. Кроме того, можно выбрать особый тип группировки с помощью необязательных ключевых слов CUBE или ROLLUP. CUBE и ROLLUP Ключевые слова CUBE и ROLLUP предназначены для выполнения многомерного анализа данных в одной команде SQL. Они не могут одновременно присутствовать в командах SQL. CUBE и ROLLUP создают итоговые наборы той формы, которая обычно используется в отчетах. Сводные данные возвращаются в виде отдельных итоговых наборов, смешанных с итоговыми наборами каждой группы, или дописываются в конец главного итогового набора. • При использовании CUBE или ROLLUP секция GROUP BY может содержать не более 10 столбцов или выражений, а возвращаемые данные должны иметь размер не более 8060 байт. • Секция GROUP BY должна содержать по крайней мере один столбец или выражение. • При использовании ключевых слов CUBE или ROLLUP ключевое слово DISTINCT нельзя использовать с агрегатными функциями. • С ключевыми словами CUBE или ROLLUP нельзя использовать формулировку GROUP BY ALL. • CUBE и ROLLUP могут использоваться с любыми агрегатными функциями. CUBE При наличии ключевого слова CUBE в дополнение к обычным сводным данным, обусловленным секцией GROUP BY, в итоговый набор включаются сводные записи (агрегаты). Эти записи генерируются посредством группировки подмножества столбцов в секции GROUP BY. Каждое сочетание значений столбцов, входящих в секцию GROUP BY, порождает совокупность групп. Для каждого неповторяющегося значения столбца из списка группировки CUBE создает дополнительную запись, в которой столбцу присвоено значение NULL. Это значение NULL представляет все значения данного столбца. Агрегатные функции в списке выборки применяются к этим группам для получения сводных данных, при этом генерируются дополнительные записи. Оператор CUBE позволяет строить перекрестные ссылки без необходимости написания дополнительных процедур. Оператор CUBE создает все сочетания группировок из списка столбцов в секции GROUP BY. Пример использования ключевого слова CUBE показан в листинге 6.4. Листинг 6.4. Пример использования CUBE SELECT stor_id, pub_name, title, AVG(qty) FROM sales, titles, publishers WHERE sales.title_id = titles.title_id AND publishers.pub_id = titles.pub_id GROUP BY pub_name, title, stor_id WITH CUBE Команда генерирует дополнительные агрегатные записи, при этом CUBE вычисляется для AVG(qty). ROLLUP Ключевое слово ROLLUP используется для определения агрегата. Это бывает удобно для вложенных наборов (например, сумм или средних арифметических столбцов). Основное отличие ROLLUP от CUBE заключается в том, что ROLLUP учитывает позицию столбца в секции GROUP BY. Группировка ROLLUP образуется из столбцов, расположенных справа от значения текущего столбца. Пример использования ключевого слова ROLLUP показан в листинге 6.5. Листинг 6.5. Пример использования ROLLUP SELECT stor_id, pub_name, title, AVG(qty) FROM sales, titles, publishers WHERE sales.title_id = titles.title_id AND publishers.pub_id = titles.pub_id GROUP BY pub_name, title, stor_id WITH ROLLUP
converted to PDF by BoJIoc
Команда генерирует дополнительные агрегатные записи, при этом ROLLUP вычисляется для AVG(qty). Сравнение CUBE с ROLLUP Из табл. 6.3 и 6.4 видно, чем результаты команды CUBE отличаются от результатов ROLLUP. Листинг 6.6 создает таблицу и заполняет ее данными. В листинге 6.7 приведены команды SELECT, выполняемые для этой таблицы. Результаты выполнения команд приведены в табл. 6.3 (для CUBE) и табл. 6.4 (для ROLLUP). Как видите, для ключевого слова CUBE возвращается больше записей, чем для ROLLUP. Записи с NULL содержат сводные данные. Таблица 6.3. Результат для CUBE A
b
c
SUM
1
abc
2
1
1
abc
NULL 1
1
def
3
1
def
NULL 2
1
NULL NULL 3
2
abc
2
2
abc
NULL 3
2
def
2
2
def
NULL 4
2
NULL NULL 7
3
abc
2
3
abc
NULL 5
3
def
2
3
def
NULL 6
3
NULL NULL 11
4
abc
2
4
abc
NULL 7
4
NULL NULL 7
5
def
2
5
def
NULL 8
5
NULL NULL 8
2
3 4
5 6
7
8
NULL NULL NULL 36 NULL abc
2
16
NULL abc
NULL 16
NULL def
2
18
NULL def
3
2
NULL def
NULL 20
1
NULL 2
1
2
NULL 2
7
3
NULL 2
11
4
NULL 2
7
5
NULL 2
8
NULL NULL 2
34
converted to PDF by BoJIoc
1
NULL 3
2
NULL NULL 3
2
Таблица 6.4. Результат для ROLLUP A
b
c
SUM
1
abc
2
1
1
abc
NULL 1
1
def
3
1
def
NULL 2
1
NULL NULL 3
2
abc
2
2
abc
NULL 3
2
def
2
2
def
NULL 4
2
NULL NULL 7
3
abc
2
3
abc
NULL 5
3
def
2
3
def
NULL 6
3
NULL NULL 11
4
abc
2
4
abc
NULL 7
4
NULL NULL 7
5
def
2
5
def
NULL 8
5
NULL NULL 8
2
3 4
5 6
7
8
NULL NULL NULL 36 Листинг 6.6. Таблица с данными CREATE table t1 ( a int, b char(10), c int, d int) go INSERT t1 VALUES (1,'abc',2,1) INSERT t1 VALUES (1,'def',3,2) INSERT t1 VALUES (1,'abc',2,3) INSERT t1 VALUES (1,'def',2,4) INSERT t1 VALUES (1,'abc',2,5) INSERT t1 VALUES (1,'def',2,6) INSERT t1 VALUES (1,'abc',2,7) INSERT t1 VALUES (1,'def',2,8) go Листинг 6.7. Команды SELECT SELECT a, b, c, SUM(d) FROM t1 GROUP BY a,b,c WITH CUBE
converted to PDF by BoJIoc
SELECT a,b,c, SUM(d) FROM t1 GROUP BY a,b,c WITH ROLLUP Секция HAVING Секция HAVING похожа на WHERE, однако она может использоваться только в сочетании с секцией GROUP BY. Секция HAVING содержит только те столбцы, которые присутствуют в списке выборки. В ней можно использовать агрегатные функции, отсутствующие в списке выборки. Следующий фрагмент демонстрирует применение секции HAVING: SELECT stor_id, pub_name, title, AVG(qty) FROM sales, titles, publishers WHERE sales.title_id = titles.title_id AND publishers.pub_id = titles.pub_id GROUP BY pub_name, title, stor_id HAVING AVG(qty) > 10 Данный пример вычисляет среднее арифметическое столбца qty для pub_name, title и stor_id. Возвращаются только те записи, в которых вычисленное среднее арифметическое больше 10. Внимание Главное отличие между секциями HAVING и WHERE заключается в моменте их выполнения. Секция WHERE выполняется во время построения результата, а секция HAVING — после того, как будет сгенерирован промежуточный набор. Вот почему агрегатные функции могут использоваться в секции HAVING, но не в секции WHERE. Секция ORDER BY В процессе выборки данные возвращаются в порядке их нахождения SQL Server. Ключевое слово ORDER BY позволяет отменить такое поведение и определить порядок возвращения записей. Конкретный порядок зависит от системного порядка сортировки. Результат можно сортировать по нескольким столбцам, однако общая длина данных во всех сортируемых столбцах должна быть меньше 8060 байт. Если превысить этот порог, запрос не будет работать. Столбцы, определяющие порядок записей, могут указываться с помощью заголовков столбцов, имен столбцов (даже если они отсутствуют в списке выборки) и целых чисел, определяющих порядок столбцов в списке выборки. Ключевые слова ASC и DESC определяют порядок сортировки (по возрастанию или по убыванию). По умолчанию данные сортируются по возрастанию. Ключевые слова ASC и DESC относятся лишь к одному столбцу. Приведем пример команды SELECT с секцией ORDER BY: SELECT au_lname FROM authors ORDER BY au_fname ASC Команда возвращает все значения au_lname из таблицы authors. Результат сортируется по возрастанию столбца au_fname (не включенного в список выборки). COMPUTE Расширения TSQL COMPUTE и COMPUTE BY позволяют включить в итоговый набор запроса SQL и основные, и сводные данные. COMPUTE и COMPUTE BY выполняют агрегатные функции (агрегатные функции подробно рассматриваются в следующем разделе) для вычисления общих и промежуточных итогов: COMPUTE агрегатная_функция(выражение) [,агрегатная_функция(выражение) ...] COMPUTE агрегатная_функция(выражение) [,агрегатная_функция(выражение) ...] BY список_столбцов
converted to PDF by BoJIoc
При использовании COMPUTE BY все столбцы списка должны присутствовать в секции ORDER BY в том же порядке. Столбцы нельзя пропускать, однако вы не обязаны использовать все столбцы из секции ORDER BY. Например, если в список секции ORDER BY входят столбцы LastName, FirstName и Zip, то секция COMPUTE BY может содержать LastName, или LastName и FirstName, или LastName, FirstName и Zip. Выражения в секциях COMPUTE и COMPUTE BY должны совпадать с выражениями списка выборки. Например, если в COMPUTE используется выражение price*2, оно также должно присутствовать в выражении SELECT. Может показаться, что вы используете агрегатную функцию для агрегатной функции, что обычно не разрешается. Следующий фрагмент демонстрирует применение секции COMPUTE: SELECT type, SUM(price) FROM titles GROUP BY type COMPUTE AVG(SUM(price)) Команда возвращает type и SUM(price) для значений type в таблице titles. Она создает завершающую запись, для которой выполняется секция COMPUTE; эта запись содержит среднее арифметическое всех сумм price. Внимание В секции COMPUTE нельзя использовать псевдонимы столбцов. Если вы попытаетесь это сделать, SQL Server выдаст сообщение о синтаксической ошибке. Функции Функции позволяют SQL Server выполнять вычисления с данными и генерировать результаты. Они похожи на функции любого другого языка программирования. Функции SQL Server делятся на три типа: • Скалярные — обрабатывают одно значение (или ни одного) и возвращают один результат. • Агрегатные — обрабатывают набор значений. • Функции наборов записей — заменяют имена таблиц. Каждый из трех типов более подробно рассматривается в следующих разделах. Скалярные функции Как упоминалось ранее, скалярные функции вызываются без параметров или с одним параметром и возвращают одно значение. Допускается вложенный вызов скалярных функций, то есть результат вызова одной функции является параметром другой. Скалярные функции делятся на семь основных типов, перечисленных в табл. 6.5. Таблица 6.5. Типы скалярных функций SQL Server Тип
Применение
Строковые функции
Операции со строками.
Математические функции
Базовые математические операции.
Функции даты
Операции с датами.
Системные функции
Получение системной информации.
Функции защиты
Получение информации безопасности.
Функции метаданных
Проверка сведений об объектах баз данных.
Текстовые и графические функции Чтение данных и модификация текстовых и графических столбцов. Внимание Если вы знакомы с предыдущими версиями SQL Server, учтите, что глобальные переменные теперь отнесены к разряду скалярных функций. Допускается использование этих функций в большинстве секций команды SELECT. Однако в секции HAVING они могут использоваться лишь в том случае, если они также присутствуют в списке выборки. Наиболее распространенные скалярные функции перечислены в табл. 6.6.
converted to PDF by BoJIoc
Внимание На экзамене вам может встретиться любая из скалярных функций, перечисленных в прил. Б. В табл. 6.6 перечислены лишь важнейшие функции, необходимые для изложения материала. Таблица 6.6. Распространенные скалярные функции Функция
Описание
@@CURSOR_ROWS
Возвращает количество записей в последнем открытом курсоре.
@@ERROR
Возвращает код ошибки для последней команды TSQL.
@@FETCH_STATUS
Возвращает состояние последней команды FETCH.
@@IDENTITY
Возвращает последнее вставленное значение счетчика.
@@NESTLEVEL
Возвращает уровень вложенности хранимой процедуры.
@@ROWCOUNT
Возвращает количество записей, участвовавших в выполнении последней команды SQL.
@@SERVERNAME
Возвращает имя локального сервера.
@@SPID
Возвращает идентификатор процесса.
@@VERSION
Возвращает дату и точную версию SQL Server, а также тип процессора.
ABS(числовое_выражение)
Возвращает модуль заданной величины.
ASCII(символьное_выражение)
Возвращает ASCII-код первого символа в строковом выражении.
CASE
Рассматривает последовательность условий и возвращает результат.
CAST
Преобразует тип данных.
CHAR
Преобразует целое число в строку символовASCII.
CONVERT(тип_данных, выражение[,стиль])
Преобразует столбцы, переменные и константы из одного типа данных SQL Server в другой.
DATALENGTH(символьное_выражение)
Возвращает длину символьной строки. Завершающие пробелы игнорируются.
DATEADD(компонент_даты, число, дата)
Возвращает дату, полученную прибавлением заданного числа компонентов (недель, месяцев и т. д.) к заданной дате. Вычитание реализуется прибавлением отрицательной величины.
DATEDIFF(компонент_даты, дата1, дата2)
Возвращает разность дата2 - дата1, измеряемую в заданных компонентах.
DATENAME(компонент_даты, дата)
Возвращает заданный компонент даты в виде строки, по возможности преобразованный в имя (например, June).
DATEPART(компонент_даты, дата)
Возвращает заданный компонент даты в виде целого числа.
DB_NAME([идентификатор_базы])
Определяет имя базы данных.
GETDATE()
Возвращает текущую системную дату и время.
ISDATE(выражение)
Возвращает 1, если выражение соответствует допустимой дате, и 0 в противном случае.
converted to PDF by BoJIoc
ISNULL(выражение, константа)
Заменяет значения NULL заданной константой.
ISNUMERIC(выражение)
Возвращает 1, если выражение является допустимым числом, и 0 в противном случае.
LEFT(символьное_выражение, целое_выражение)
Возвращает целое число символов от начала строки.
LEN(символьное_выражение)
Возвращает длину символьной строки. Завершающие пробелы игнорируются.
LOWER(символьное_выражение)
Преобразует символы выражения в нижний регистр.
LTRIM(символьное_выражение)
Удаляет начальные пробелы.
MONTH(дата)
Возвращает месяц в виде целого числа.
NULLIF(выражение1, выражение2)
Возвращает NULL, если значения выражений совпадают.
RIGHT(символьное_выражение, целое_выражение)
Возвращает целое число символов с конца строки.
RTRIM(символьное_выражение)
Удаляет завершающие пробелы.
STR(вещественное_выражение[,длина[,разрядность]])
Преобразует числовые данные в символьные.
STUFF(символьное_выражение1, начало, длина, символьное_выражение2)
Заменяет подстроку выражения1 с заданной начальной позицией и длиной выражением2.
SUBSTRING(выражение, начало, длина)
Возвращает часть строки.
SUSER_SID(['имя'])
Возвращает идентификатор пользователя SQL Server.
SUSER_SNAME([sid])
Возвращает регистрационное имя пользователя SQL Server.
UPPER(символьное_выражение)
Преобразует символы выражения в верхний регистр.
USER_NAME([идентификатор_пользователя]) или SESSION_USER
Возвращает имя пользователя из базы данных.
YEAR('дата')
Возвращает год в виде целого числа из четырех цифр.
Многие скалярные функции просты и не требуют подробных разъяснений. CASE, функции даты и преобразования не только отличаются повышенной сложностью, но и чаще встречаются в вопросах экзамена. Конструкция CASE В отличие от других скалярных функций, CASE скорее является синтаксической конструкцией — она рассматривает несколько условий для получения одного результата. В простейшем варианте выражение сравнивается с набором простых выражений. Более сложный вариант (формат CASE с поиском) вычисляет набор логических выражений. Синтаксис функции CASE показан в листинге 6.8. Листинг 6.8. Синтаксис CASE CASE входное_выражение WHEN выражение_when THEN выражение_результат [,...n] [ELSE выражение_результат_else] END -- или – CASE WHEN логическое_выражение THEN выражение_результат [,...n]
converted to PDF by BoJIoc
[ELSE выражение_результат_else] END Функция CASE возвращает результат для первого истинного сравнения. Если ни одно сравнение не является истинным, возвращается результат ELSE. Если секция ELSE отсутствует, возвращается NULL. Простая конструкция CASE показана в листинге 6.9, а вариант CASE с поиском — в листинге 6.10. Листинг 6.9. Простая конструкция CASE SELECT Category = CASE type WHEN 'popular_comp' THEN 'Popular Computing' WHEN 'mod_cook' THEN 'Cooking' WHEN 'business' THEN 'Business' WHEN 'psychology' THEN 'Psychology' WHEN 'trad_cook' THEN 'Cooking' ELSE 'unknown' END, title AS 'Book Title', price FROM titles ORDER BY Category Листинг 6.10. Конструкция CASE с поиском SELECT Category = CASE WHEN type = 'popular_comp' THEN 'Popular Computing' WHEN type like '%cook' THEN 'Cooking' WHEN type = 'business' THEN 'Business' WHEN type = 'psychology' THEN 'Psychology' WHEN type = 'trad_cook' THEN 'Cooking' ELSE 'unknown' END, title AS 'Book Title', price FROM titles ORDER BY Category В каждой секции WHEN может выполняться поиск по разным столбцам. Это позволяет сгенерировать столбцы результата на основании сильно отличающихся условий. Впрочем, на практике необходимость в подобных вычислениях возникает крайне редко. В следующем фрагменте показана конструкция CASE с разными столбцами при использовании выражения WHEN: SELECT Category = CASE WHEN price IS NULL THEN '!!Unpriced book!!' WHEN type = 'popular_comp' THEN 'Popular Computing' WHEN type like '%cook%' THEN 'Cooking' ELSE 'No Category' END, title AS 'Book Title', price FROM titles ORDER BY Category Функции даты SQL Server содержит много функций для работы с датами. В большинстве функций даты одним из параметров является компонент даты. Допустимые значения компонентов перечислены в табл. 6.7. Внимание Вы должны запомнить компоненты даты, перечисленные в табл. 6.7. Таблица 6.7. Компоненты даты
converted to PDF by BoJIoc
Компонент
Сокращение Допустимые значения
Год (Year)
Yy
1753-9999
Квартал (Quarter)
Qq
1-4
Месяц (Month)
Mm
1-12
День года (Dayofyear)
Dy
1-366
День месяца (Day)
Dd
1-31
Неделя (Week)
Wk
1-54
День недели (Weekday)
Dw
1-7 (1 = воскресенье)
Час (Hour)
Hh
0-23
Минута (Minute)
Mi
0-59
Секунда (Second)
Ss
0-59
Миллисекунда (Millisecond) Ms
0-999
При использовании компонентов даты в функциях указывается либо полное, либо сокращеное имя компонента. Самыми распространенными функциями даты являются DATEADD, DATEDIFF, DATENAME и DATEPART. Применение функций и компонентов даты продемонстрировано следующим фрагментом: SELECT DATENAME(DW,GETDATE()) SELECT title, "Days Since Published" = DATEDIFF(dd, pubdate, GETDATE()) FROM titles Первая команда определяет день недели для текущего дня. Вторая команда вычисляет количество дней, прошедших с момента публикации книги. Преобразование типов данных SQL Server выполняет неявное преобразование различных типов данных. При этом преобразуемые типы данных определяются в соответствии с правилами приоритета; типы данных с низким приоритетом преобразуются в данные с высоким приоритетом. Приоритеты различных типов данных (по убыванию) перечислены ниже: • • • • • • • • • • • • • • • • • • • •
DATETIME; SMALLDATETIME; FLOAT; REAL; DECIMAL; MONEY; SMALLMONEY; INT; SMALLINT; TINYINT; BIT; NTEXT; IMAGE; TIMESTAMP; NVARCHAR; VARCHAR; CHAR; VARBINARY; BINARY; UNIQUEIDENTIFIER.
При выполнении неявных преобразований типам данных, определяемым пользователем, назначается приоритет базовых типов данных. Если одно из выражений является агрегатной функцией (см. следующий раздел), тип данных выражения определяется типом данных агрегатной функции. Если одно из выражений
converted to PDF by BoJIoc
является столбцом, а другое не является столбцом или агрегатной функцией, тип данных выражения определяется типом данных столбца. В тех случаях, когда скрытых преобразований оказывается недостаточно, можно выполнять явные преобразования. Для этого существуют две функции, CAST и CONVERT. Функция CAST входит в стандарт ANSI и выполняет преобразования типов данных. Функция CONVERT является расширением T-SQL. Функции имеют следующий синтаксис: CONVERT (тип_данных [(длина)], выражение [,стиль]) CAST(выражение AS тип_данных) Функция CONVERT также позволяет выбрать стиль при преобразовании в символьные данные. В результате появляется возможность форматирования данных в SQL. Стили могут использоваться при преобразовании чисел и дат. Стили для различных типов данных и преобразованные значения показаны в табл. 6.8, 6.9 и 6.10. Таблица 6.8. Стили преобразования даты Без указания века С указанием века Формат преобразованной строки -
0 или 100
mon dd yyyy hh:miAM (или PM)
1
101
mm/dd/yy
2
102
yy.mm.dd
3
103
dd/mm/yy
4
104
dd.mm.yy
5
105
dd-mm-yy
6
106
dd mon yy
7
107
mon dd,yy
8
108
hh:mm:ss
-
9 или 109
mon dd,yyyy hh:mi:ss:mmmAM (или PM)
10
110
mm-dd-yy
11
111
yy/mm/dd
12
112
Yymmdd
13
113
dd mon yyyy hh:mi:ss:mmm (24-часовая шкала)
14
114
hh:mi:ss:mmm (24-часовая шкала)
20
120
Yyyy-mm-dd hh:mi:ss (24-часовая шкала)
21
121
yyyy-mm-dd hh:mi:ss:mmm (24-часовая шкала)
Таблица 6.9. Стили преобразования чисел (вещественных и с плавающей запятой) Значение Описание
Пример
0
Стандартное преобразование; 6 цифр; экспоненциальная запись там, где это оправдано.
1.23457e+006
1
Экспоненциальная запись с мантиссой из 8 знаков.
1.2345671e+006
2
Экспоненциальная запись с мантиссой из 16 знаков.
1.234567125000000e+006
Таблица 6.10. Стили преобразования денежных сумм Значение Описание
Пример
0
Стандартное преобразование; без запятых; 2 цифры в дробной части.
123456.12
1
Каждые 3 разряда слева от десятичной точки отделяются запятой; 2 цифры в дробной части.
123,234.12
2
Без запятых; 4 цифры в дробной части.
1234.1234
converted to PDF by BoJIoc
Не все типы данных можно преобразовать друг в друга, даже при использовании явных преобразований. Допустимые преобразования показаны на рис. 6.1. Агрегатные функции Агрегатные функции обобщают информацию нескольких элементов данных и возвращают одно значение. Они используются в сочетании с секциями GROUP BY и HAVING. Агрегатные функции перечислены в табл. 6.11. Агрегатные функции не могут работать со значениями типа NULL. В отличие от скалярных функций, агрегатные функции не могут вызываться в параметрах других агрегатных функций. Кроме того, агрегатные функции не могут присутствовать в секции WHERE, если они не определяют подзапросы. Однако в секции HAVING допускается присутствие агрегатных функций.
Рис. 6.1. Допустимые преобразования данных Таблица 6.11. Агрегатные функции Функция
Описание
SUM([all|distinct] выражение)
Вычисляет общее количество (разных) значений в числовом столбце.
AVG([all|distinct] выражение)
Вычисляет среднее арифметическое (разных) значений в числовом столбце.
COUNT([all|distinct] выражение)
Вычисляет количество (разных) значений в числовом столбце, отличных от NULL.
COUNT(*)
Вычисляет количество выбранных записей. Единственная агрегатная функция, учитывающая значения NULL.
MAX(выражение)
Определяет максимум среди выбранных значений.
converted to PDF by BoJIoc
MIN(выражение)
Определяет минимум среди выбранных значений.
STDEV(выражение)
Вычисляет среднее квадратическое отклонение.
STDEVP(выражение)
Вычисляет среднее квадратическое отклонение для выборки.
VAR(выражение)
Вычисляет статистическую дисперсию.
VARP(выражение)
Вычисляет статистическую дисперсию для выборки.
Внимание Если агрегатная функция используется в списке выборки, все не-столбцовые выражения, не являющиеся агрегатными функциями, должны присутствовать в секции GROUP BY. Функции наборов записей Функции наборов записей (rowset) могут использоваться в команде SELECT вместо имен таблиц. Данная категория содержит четыре функции: • • • •
CONTAINSINTABLE; FREETEXTTABLE; OPENQUERY; OPENROWSET.
Первые две функции используются при расширенном поиске текста, а следующие две — при подключении к удаленным источникам данных через OLE DB. Отличие между OPENQUERY и OPENROWSET заключается в том, что для OPENQUERY необходимо предварительно установить связь с удаленным сервером. SELECT * FROM OPENQUERY(MyServer, 'SELECT au_fname, au_lname FROM pubs..titles') В этом примере существующее подключение с именем MyServer используется для обращения к таблице titles базы данных pubs. Многие запросы ограничиваются одной таблицей. Но для выполнения более сложных операций приложению часто требуются данные из нескольких таблиц. Конструкция SQL JOIN позволяет извлечь данные из нескольких таблиц одной командой SQL. Объединение таблиц Довольно часто данные, которые требуется извлечь, находятся в нескольких таблицах. Конструкция JOIN позволяет создать объединение, то есть выбрать данные из многих (до 256) таблиц, представлений или производных таблиц. • Не допускается прямое объединение столбцов типа NTEXT, TEXT и IMAGE. • Если таблица объединяется сама с собой, для нее необходимо создать псевдоним. • Подзапросы являются особым случаем объединения данных нескольких таблиц в одной команде SELECT. Объединения делятся на три типа: ортогональные, внутренние и внешние. Ортогональные объединения Ортогональное объединение, также называемое «декартовым произведением», возвращает все записи из всех объединяемых таблиц. Общее количество возвращаемых записей равно произведению количества записей в каждой из таблиц. Предположим, в объединении участвуют три таблицы. Первая таблица возвращает 30 000 записей, а остальные — по 1000 записей каждая. Общее число записей, возвращаемых ортогональным объединением, будет равно 30 000*1000*1000, или 30 000 000 000 записей. Конечно, при организации ортогональных объединений следует быть очень осторожными. Примеры ортогональных объединений приведены в следующем фрагменте: SELECT * FROM titles CROSS JOIN titleauthor SELECT * FROM titles, titleauthor Первая команда создает стандартное ортогональное объединение таблиц titles и titleauthor в стандарте ANSI. Вторая команда делает то же самое, но с применением расширений TSQL.
converted to PDF by BoJIoc
Внутренние объединения Внутреннее объединение является самым распространенным видом объединений. В нем используется оператор сравнения, ограничивающий число возвращаемых записей. Во внутреннем объединении вы задаете общие столбцы (называемые общими ключами), используемые для связи таблиц. Пример внутреннего объединения показан в следующем фрагменте: SELECT * FROM titles, titleauthor WHERE titles.title_id = titleauthor.title_id Внешние объединения Внешние объединения тоже используются для связывания таблиц, однако результат возвращается в том случае, когда условие объединения не выполняется. Внешние объединения делятся на три типа: левые, правые и полные. Левое внешнее объединение Левое внешнее объединение возвращает все записи левой таблицы объединения даже в том случае, если записи в правой таблице не существуют. Если условие объединения не выполняется, столбцы правой таблицы заполняются неопределенными значениями NULL. Пример левого внешнего объединения приведен в следующем фрагменте: SELECT * FROM titles, titleauthor WHERE titles.title_id *= titleauthor.title_id Команда возвращает все записи левой таблицы (titles) даже в том случае, если соответствующие записи правой таблицы (titleauthor) не существуют. Правое внешнее объединение Правое внешнее объединение возвращает все записи правой таблицы объединения даже в том случае, если записи в левой таблице не существуют. Если условие объединения не выполняется, столбцы правой таблицы заполняются неопределенными значениями NULL. Пример левого внешнего объединения приведен в следующем фрагменте: SELECT * FROM titles, titleauthor WHERE titleauthortitles.title_id =* titles.title_id Команда возвращает все записи правой таблицы (titles) даже в том случае, если соответствующие записи левой таблицы (titleauthor) не существуют. Полное внешнее объединение Полное внешнее объединение возвращает все записи левой и правой таблиц даже в том случае, если условие не выполняется. Там, где между таблицами находится совпадение, все столбцы заполняются соответствующими значениями. При отсутствии совпадения возвращаются значения одной таблицы и NULL — для столбцов другой таблицы. В SQL Server существуют два вида объединений: стандартные объединения ANSI и расширенные объединения T-SQL. Оба вида могут одновременно присутствовать в команде SELECT, хотя это не рекомендуется. Расширенные объединения TSQL Расширенные объединения TSQL находятся в секции WHERE. В объединениях TSQL оператор сравнения используется для столбцов объединяемых таблиц или для выражений, содержащих столбцы: SELECT * FROM titles, titleauthor WHERE titles.title_id = titleauthor.title_id
converted to PDF by BoJIoc
Если между таблицами отсутствует оператор сравнения, выполняется ортогональное объединение. Внутренние объединения выполняются с помощью стандартных операторов сравнения между столбцами. Для внешних объединений в SQL Server существуют специальные операторы сравнения: *= используется для левых внешних объединений, а =* — для правых внешних объединений. Внимание В расширениях TSQL не существует оператора для выполнения полного внешнего объединения. При попытке воспользоваться оператором *=* выдается сообщение об ошибке. В расширенных объединениях TSQL действуют некоторые ограничения. Например, если таблица использовалась в качестве внешней во внешнем объединении, она может быть внутренней таблицей внешнего или внутреннего объединения. Расширенные объединения TSQL продемонстрированы в нескольких примерах. Первая команда выполняет ортогональное объединение: SELECT * FROM titles t, titleauthor ta Возвращаются все записи из таблиц title и titleauthor. Общее число возвращаемых записей равно количеству записей в title, умноженному на количество записей в titleauthor. Следующая команда выполняет внутреннее объединение: SELECT * FROM titles t, titleauthor ta WHERE t.title_id = ta.title_id Команда возвращает только те записи, в которых содержимое title_id совпадает в таблицах titles и titleauthor. Последний пример демонстрирует внешнее объединение: SELECT * FROM titles t, titleauthor ta WHERE t.title_id *= ta.title_id -- внешнее объединение Команда возвращает все записи titles даже в том случае, если для title_id не находится соответствующего значения title_id в таблице titleauthor. Расширенные объединения TSQL являются традиционным способом связывания таблиц; новые команды SQL рекомендуется записывать в стандарте ANSI. Объединения ANSI SQL Server поддерживает объединения стандарта ANSI. В объединениях ANSI тип и условие объединения задаются в секции FROM. Стандарт ANSI поддерживает внутренние, внешние и ортогональные объединения. В отличие от расширенных объединений TSQL, объединения ANSI допускают использование таблицы в качестве как внутренней, так и внешней таблицы объединения. Ортогональные объединения идентифицируются ключевыми словами CROSS JOIN между именами таблиц в секции FROM. При выполнении ортогонального объединения нельзя задавать никаких условий. Внутреннее объединение идентифицируется ключевыми словами INNER JOIN между таблицами, а внешнее объединение — типом LEFT, RIGHT или FULL, за которым следует необязательное ключевое слово OUTER, а затем — ключевое слово JOIN (например, LEFT OUTER JOIN). Для внутренних и внешних объединений должно быть задано условие объединения. Условие сокращает количество возвращаемых записей. Одна секция может содержать несколько условий, объединенных с помощью ключевых слов AND и OR. Как видно из листинга 6.11, условие объединения похоже на другие условия секции WHERE. Листинг 6.11. Примеры объединений FROM title t INNER JOIN titleauthor ta ON t.title_id = ta.title_id AND ta.au_id > 10 FROM author a LEFT OUTER JOIN titleauthor ON a.au_id = ta.au_id INNER JOIN title t ON t.title_id = ta.title_id AND t.ytd_sales > 4000
converted to PDF by BoJIoc
Предыдущий пример показывает, как в синтаксисе JOIN стандарта ANSI реализуется объединение нескольких условий. Следующие примеры демонстрируют различные типы объединений ANSI. Первый пример создает ортогональное объединение: SELECT * FROM titles t CROSS JOIN titleauthor ta Команда возвращает все записи из таблиц title и titleauthor. Общее число возвращаемых записей равно произведению количества записей в title и titleauthor. Следующая команда выполняет внутреннее объединение: SELECT * FROM titles t INNER JOIN titleauthor ta ON t.title_id = ta.title_id Команда возвращает только те записи, в которых содержимое title_id совпадает в таблицах titles и titleauthor. Последний пример демонстрирует внешнее объединение: SELECT * FROM titles t LEFT OUTER JOIN titleauthor ta ON t.title_id = ta.title_id -- левое внешнее объединение Возвращаются все записи titles даже в том случае, если для title_id не находится соответствующего значения title_id в titleauthor. SELECT * FROM titles t FULL OUTER JOIN titleauthor ta ON t.title_id = ta.title_id -- полное внешнее объединение В этом примере показано полное внешнее объединение; возвращаются все записи titles и titleauthor даже в том случае, если условие не выполняется. Синтаксис объединений ANSI читается намного проще, чем синтаксис TSQL. В нем сразу видно, какие таблицы объединяются и как выглядит условие объединения. Возможно, расширенные объединения TSQL не будут поддерживаться будущими версиями SQL Server. Подзапросы Подзапросы (subquery) позволяют включать команды SELECT в другие запросы. Если таблица принадлежит не внешнему запросу, а вложенному подзапросу, то столбцы этой таблицы могут использоваться только в подзапросе. Подзапросы не могут содержать секций ORDER BY, COMPUTE или FOR BROWSE. Они могут присутствовать в секциях FROM в качестве производных таблиц, а также в секциях WHERE и HAVING. Если подзапрос находится в секции WHERE или HAVING, он может использоваться в сочетании с ключевыми словами EXIST, ANY, SOME, ALL или IN. Внимание Подзапросам особого типа, называемым коррелированными подзапросами, могут передаваться столбцы основного запроса. Они используются для ограничения записей, возвращаемых подзапросом. В следующем фрагменте показан пример коррелированного подзапроса: SELECT title_id, ( SELECT SUM(royaltyper) FROM titles_authors ta WHERE ta.title_id = t.title_id) FROM titles t В этом примере коррелированный подзапрос является частью списка выборки. UNION Союз (union) позволяет связать данные двух и более итоговых наборов в один. В отличие от объединений, которые включают в итоговые наборы дополнительные столбцы, союзы связывают воедино данные, полученные от нескольких команд SELECT. Команда UNION имеет следующий синтаксис: Команда_SELECT UNION [ALL]
converted to PDF by BoJIoc
Команда_SELECT [ ... ] Все списки выборки в UNION должны содержать одинаковое число столбцов, в противном случае SQL Server выдаст сообщение об ошибке. Соответствующие столбцы должны принадлежать к одному типу данных или преобразовываться в него (неявно или с применением функций преобразования). Неявные преобразования типов подчиняются правилам приоритетов. Первая команда SELECT в конструкции UNION определяет заголовки столбцов результата. В каждой команде SELECT могут присутствовать секции GROUP BY или HAVING. Они относятся только к конкретной команде SELECT — вы не сможете применить их к союзу в целом. Если вы используете секции ORDER BY или COMPUTE, они могут задаваться только в последней команде SELECT союза. Содержимое ORDER BY и COMPUTE относится ко всей конструкции UNION. По умолчанию UNION возвращает только различающиеся записи. Ключевое слово ALL говорит о том, что возвращаться должны все записи без исключения. В одной команде можно смешивать UNION и UNION ALL. Внимание Если в одной команде встречаются и UNION, и UNION ALL, для выбора удаляемых дубликатов можно воспользоваться скобками. Секция TOP SQL Server позволяет указать в списке выборки, что вас интересует лишь часть возвращаемого итогового набора. Для этой цели используется секция TOP, которая должна находиться до списка выборки. Секция TOP имеет следующий синтаксис: [ TOP n [PERCENT] [WITH TIES] ] Если секция TOP используется с ALL или DISTINCT, она должна находиться после этих ключевых слов. Секция TOP говорит, что после того, как будут сгенерированы первые n записей, удовлетворяющих запросу, обработку данных следует прекратить. При отсутствии секции ORDER BY записи будут находиться в порядке их нахождения SQL Server. В простейшем варианте секция TOP делает то же, что и ROWCOUNT. Значение n является неотрицательным целым числом. Если n равно нулю, не возвращается ни одна запись. Если n превышает количество записей в таблице, возвращаются все записи. При наличии параметра PERCENT значение n интерпретируется не как количество записей, а как процент от него. Любое значение больше 100 приводит к возвращению всех записей таблицы. Если в соответствии с заданным процентом должна быть возвращена лишь часть записи, возвращается целая запись. При наличии параметра WITH TIES секция TOP распространяется на все записи, в которых значение столбца совпадает с его значением в последней возвращенной записи итогового набора. Параметр WITH TIES может использоваться только при наличии секции ORDER BY. Ключевое слово ALL не действует на записи, возвращенные с применением секции TOP. Ключевое слово DISTINCT действует как обычно — возвращается лишь одна копия записей из итогового набора. Следующий фрагмент демонстрирует применение команды TOP: SELECT TOP 6 * FROM authors ORDER BY qty DESC Команда возвращает первые шесть записей таблицы authors, упорядоченные по столбцу qty в порядке убывания. В следующем примере продемонстрирован отбор процента записей: SELECT TOP 6 PERCENT * FROM authors ORDER BY qty DESC Команда возвращает первые шесть процентов записей таблицы authors, упорядоченные по столбцу qty в порядке убывания. Следующий пример демонстрирует применение параметра TIES в конструкции TOP: SELECT TOP 6 WITH TIES * FROM authors ORDER BY qty DESC
converted to PDF by BoJIoc
Команда возвращает первые шесть записей таблицы authors, упорядоченных по столбцу qty в порядке убывания. Если у каких-либо записей после шестой значение qty совпадает с его значением в шестой записи, эти записи также возвращаются. Выборка данных из столбцов типа TEXT и IMAGE При выборке данных из столбцов типа TEXT, NTEXT или IMAGE SQL Server извлекает данные объема @@TEXTSIZE. Для управления выборкой данных типов TEXT, NTEXT или IMAGE в SQL Server существует команда READTEXT, обладающая следующим синтаксисом: READTEXT {база.владелец.}таблица.столбец {указатель смещение размер} [HOLDLOCK] Чтение данных командой READTEXT возможно лишь при наличии в столбце текстового указателя. Указатель создается при обновлении или вставке в столбцах TEXT, NTEXT или IMAGE данных, отличных от NULL. Смещение определяет количество байтов, пропускаемых перед началом выборки данных из столбца, а размер — количество читаемых байтов. Если размер равен 0, читается блок размером 4 Кбайт. Если размер превышает @@TEXTSIZE, объем читаемого блока ограничивается @@TEXTSIZE. Чтобы прочитать данные командой READTEXT, необходимо предварительно считать текстовый указатель в переменную типа BINARY или VARBINARY длиной минимум 16 байт, после чего выполнить команду SELECT с функцией TEXTPTR. Если команда SELECT возвращает несколько записей, текстовый указатель устанавливается на последнюю прочитанную запись. Следующий фрагмент демонстрирует процесс чтения из текстового столбца: DECLARE @Tpoint BINARY(16) SELECT @Tpoint = TEXTPTR(MyTextColumn) FROM MyTextTable READTEXT MyTextTable.MyTextColumn @Tpoint 200 2024 В этом фрагменте объявляется локальная переменная @Tpoint (локальные переменные рассматриваются ниже). Команда SELECT инициализирует текстовый указатель. Затем текстовый указатель используется для чтения байтов с 200-го по 2024-й столбцов MyTextColumn. Внимание Запомните: параметры команды READTEXT не разделяются запятыми. Примеры экзаменационных вопросов Question 1 Which of the following SQL statements retrieves the unique list of cities from the publisher table with a column heading of Publisher City? [Check all correct answers] • • • • •
A. select distinct Publisher City = city from publishers B. select unique city as "Publisher City" from publishers C. select distinct "Publisher City" = city from publisher D. select "Publisher City" = distinct city from publisher E. select distinct city as "Publisher City" from publisher
Вопрос 1 Какие из следующих команд SQL извлекают список уникальных городов из таблицы publisher с заголовком столбца Publisher City? [Выберите все правильные ответы] • • • • •
A. select distinct Publisher City = city from publishers B. select unique city as "Publisher City" from publishers C. select distinct "Publisher City" = city from publisher D. select "Publisher City" = distinct city from publisher E. select distinct city as "Publisher City" from publisher
Правильные ответы — C и E. В них используются разные формы псевдонимов столбцов. Команды из ответов A, B и D имеют неверный синтаксис.
converted to PDF by BoJIoc
Question 2 Which of the following SQL statements returns all authors whose last name has I as the second-to-last character and a zip code greater than 50 000? [Check all correct answers] • • • • • •
A. select * from authors where au_lname like '_I%' and zip > 50 000 B. select * from authors where au_lname like '%I_' and zip !< 50 001 C. select * from authors where au_lname = '%I_' and zip > 50 000 D. select * from authors where au_lname like '%I%' and zip > 50 000 E. select * from authors where au_lname like '%I_ ' escape 'I' and zip > 50 000 F. You cannot return the request data.
Вопрос 2 Какие из следующих команд SQL возвращают всех авторов, предпоследним символом фамилии которых является буква I, а zip-код превышает 50000? [Выберите все правильные ответы] • A. select * from authors where au_lname like '_I%' and zip > 50 000 • B. select * from authors where au_lname like '%I_' and zip !< 50 001 • C. select * from authors where au_lname like '%I_' and zip > 50 000 • D. select * from authors where au_lname like '%I%' and zip > 50 000 • E. select * from authors where au_lname like '%I_ ' escape 'I' and zip > 50 000 • F. Получить данные с помощью запроса невозможно. Правильный ответ — B; команда возвращает всех авторов, у которых предпоследним символом фамилии является буква I, а zip-код превышает 50 000. Ответ A неверен, поскольку буква I ищется во второй позиции от начала фамилии. Ответ C неверен, поскольку ключевое слово LIKE в нем заменено знаком равенства. В ответе D ищутся фамилии, содержащие I в любой позиции, поэтому он неверен. Наконец, ответ E тоже неверен, поскольку он ищет любую фамилию, состоящую по крайней мере из одного символа. Question 3 Which of the following SQL statements returns the job ID, job description, and the employee’s full name from the job and employee table, even if there are no employees with the job? • A. select j.job_id, job_desc, fname, lname from jobs j left outer join employee e on j.job_id *= e.job_id • B. select j.job_id, job_desc, fname, lname from jobs j left outer join employee e on j.job_id = e.job_id • C. select job_id, job_desc, fname, lname from jobs j, employee e where j.job_id *= e.job_id • D. select j.job_id, job_desc, fname, lname from jobs j left outer join employee e where j.job_id = e.job_id • E. select j.job_id, job_desc, fname, lname from jobs j right outer join employee e on j.job_id = e.job_id Вопрос 3 Какая из следующих команд SQL возвращает код (job_id) и описание должности (job_desc), имя (fname) и фамилию (lname) работника из таблиц jobs и employee, даже если не существует ни одного работника с данной должностью? • A. select j.job_id, job_desc, fname, lname from jobs j
converted to PDF by BoJIoc
left outer join employee e on j.job_id *= e.job_id • B. select j.job_id, job_desc, fname, lname from jobs j left outer join employee e on j.job_id = e.job_id • C. select job_id, job_desc, fname, lname from jobs j, employee e where j.job_id *= e.job_id • D. select j.job_id, job_desc, fname, lname from jobs j left outer join employee e where j.job_id = e.job_id • E. select j.job_id, job_desc, fname, lname from jobs j right outer join employee e on j.job_id = e.job_id Правильный ответ — B. Запрос возвращает необходимые данные посредством внешнего объединения таблиц job и employee. Ответ A неверен, поскольку оператор *= не может использоваться в объединениях ANSI. Ответ C неверен; столбец job_id в списке выборки не уточняется именем таблицы, и SQL Server не будет знать, из какой таблицы следует брать столбец job_id. Ответ D неверен, поскольку в нем отсутствует секция ON, обязательная для стандарта ANSI. Ответ E неверен — он возвращает записи всех работников, даже не имеющих должности. Question 4 Review the following entry: select title, count(*) from titles t left outer join sales s on t.title_id = s.title_id where stor_id > 4000 order by 1 group by all title Which of the following statements are true in relation to the preceding query? [Check all correct answers] • • • • •
A. No rows will be returned. B. It will return the number of a count of sales for each title. C. Data will be sorted by title. D. Data will be sorted by the number of sales. E. It will return zero for the second column when stor_id<=4000.
Вопрос 4 Имеется следующая команда: select title, count(*) from titles t left outer join sales s on t.title_id = s.title_id where stor_id > 4000 order by 1 group by all title Какие из следующих утверждений истинны по отношению к этому запросу? [Выберите все правильные ответы] • • • • •
A. Не будет возвращена ни одна запись. B. Запрос возвратит количество записей в sales для каждого названия. C. Данные будут отсортированы по названию (title). D. Данные будут отсортированы по количеству записей в sales. E. Если stor_id<=4000, во втором столбце возвращается ноль.
converted to PDF by BoJIoc
Правильный ответ — A, поскольку в приведенной команде SQL нарушен порядок следования секций, следовательно, команда не возвратит ни одной записи и все остальные ответы неверны. Question 5 Which of the following queries return all titles that contain the word IS without concern for the case? [Check all correct answers] • A. select title from titles where UPPER(title) = '%IS%' • B. select title from titles where upper(title) like 'IS%' or lower (title) like '%is%' or title like '%[Ii][Ss]%' • C. select title from titles where upper(title) like '%IS' • D. select title from titles where title in ['IS %', '% IS %', '% IS'] Вопрос 5 Какие из следующих запросов возвращают все значения столбца title, содержащие слово IS, независимо от регистра символов? [Выберите все правильные ответы] • A. select title from titles where UPPER(title) = '%IS%' • B. select title from titles where upper(title) like 'IS%' or lower (title) like '%is%' or title like '%[Ii][Ss]%' • C. select title from titles where upper(title) like '%IS' • D. select title from titles where title in ['IS %', '% IS %', '% IS'] Правильный ответ — B, поскольку первое условие возвращает значения, начинающиеся с IS, а второе и третье условия возвращают значения, содержащие is (независимо от регистра). Ответ A неверен, поскольку условие '%IS' требует точного совпадения в верхнем регистре. Ответ C неверен, поскольку он находит только те значения, которые оканчиваются на 'IS'; экземпляры IS внутри строк пропускаются. Ответ D тоже неверен, поскольку в нем пропускаются экземпляры IS, записанные символами нижнего регистра. Question 6 Which SELECT statements return all authors’ first and last names as well as all employees’ first and last names? [Check all correct answers] • A. select au_lname, au_fname, fname, employee.lname from employee e cross join authors a • B. select au_lname, au_fname from authors union select lname, fname from employee • C. select au_lname, au_fname from authors union all select lname, fname from employee • D. None of the above. Вопрос 6 Какие из команд SELECT возвращают имена (fname) и фамилии (lname) всех авторов, а также имена и фамилии всех работников? [Выберите все правильные ответы]
converted to PDF by BoJIoc
• A. select au_lname, au_fname, fname, employee.lname from employee e cross join authors a • B. select au_lname, au_fname from authors union select lname, fname from employee • C. select au_lname, au_fname from authors union all select lname, fname from employee • D. Ни одна из перечисленных. Правильные ответы — B и C. Обе команды возвращают желаемый результат. Ответ B возвращает набор уникальных записей, а ответ C — набор с дубликатами. Ответ A неверен из-за ошибки в синтаксисе команды. Используя псевдоним таблицы, нельзя ссылаться на таблицу по ее настоящему имени без указания псевдонима. Question 7 Which SELECT statement returns the five characters immediately following the first occurrence of the from a string (if the is not found, the statement must return N/A)? • A. select ISNULL( substring(title,CHARINDEX ('the', LOWER(title)),3),'N/A') from titles • B. select case when title like ' %the%' then next('the',5) else 'N/A' end from titles • C. select ISNULL(substring (title,charindex ('the',lower(title))+3 , charindex ('the',lower(title))+5) , 'N/A') from titles • D. select case when charindex ('the',lower(title)) = 0 then 'N/A' else substring (title, charindex('the',lower(title))+3,5) end from titles • E. None of the above. Вопрос 7 Какая команда SELECT возвращает пять символов, следующих после первого экземпляра слова the в строке (если слово the не найдено, команда должна возвращать строку N/A)? • A. select ISNULL( substring(title,CHARINDEX ('the', LOWER(title)),3),'N/A') from titles • B. select case when title like ' %the%' then next('the',5) else 'N/A'
converted to PDF by BoJIoc
end from titles • C. select ISNULL(substring (title,charindex ('the',lower(title))+3 , charindex ('the',lower(title))+5) , 'N/A') from titles • D. select case when charindex ('the',lower(title)) = 0 then 'N/A' else substring (title, charindex('the',lower(title))+3,5) end from titles • E. Ни одна из перечисленных команд. Правильный ответ — D. Эта команда возвращает пять символов, расположенные сразу же после первого экземпляра the в строке; если слово the не найдено, команда возвращает N/A. Ответ A неверен; если слово the находится в строке, то команда возвращает the вместо пяти символов, следующих за ним. Ответ B неверен, поскольку функции NEXT не существует. Наконец, ответ C тоже неверен, поскольку для строк без слова the не возвращается строка N/A. Question 8 Which of the following queries return publisher names and the maximum last name of their employees, even if they have no employees, for publishers that have not published cooking books? [Check all correct answers] • A. select pub_name, max(lname) from publishers p left join employee e on p.pub_id = e.pub_id inner join titles t on t.pub_id = p.pub_id and t.type not like '%cooking' group by pub_name • B. select pub_name , max(lname)from (select pub_name, p_pub_id from publishers p inner join titles t on t.pub_id = p.pub_id where t.type not like '%cooking') AS t1 left outer join employee e on t1.pub_id = e.pub_id group by pub_name • C. select distinct pub_name ,(select max(lname)from employee e where e.pub_id = t1.pub_id) from ( select pub_name, p.pub_id from publishers p inner join titles t on t.pub_id = p.pub_id where t.type not like '%cooking') AS t1 • D. None of the above. Вопрос 8 Какие из следующих запросов возвращают имя издателя (publisher) и последнюю по алфавиту фамилию работника (даже если работников нет) тех издателей, которые еще не издавали книг по кулинарии (слово cooking в столбце type)? [Выберите все правильные ответы]
converted to PDF by BoJIoc
• A. select pub_name, max(lname) from publishers p left join employee e on p.pub_id = e.pub_id inner join titles t on t.pub_id = p.pub_id and t.type not like '%cooking' group by pub_name • B. select pub_name , max(lname)from (select pub_name, p_pub_id from publishers p inner join titles t on t.pub_id = p.pub_id where t.type not like '%cooking') AS t1 left outer join employee e on t1.pub_id = e.pub_id group by pub_name • C. select distinct pub_name ,(select max(lname)from employee e where e.pub_id = t1.pub_id) from ( select pub_name, p.pub_id from publishers p inner join titles t on t.pub_id = p.pub_id where t.type not like '%cooking') AS t1 • D. Ни один из перечисленных запросов. Правильные ответы — A, B и C. Все команды возвращают имя издателя и последнюю фамилию работника (даже в том случае, если работников нет) для издателей, не выпускавших книг по кулинарии. Question 9 Which of the following SELECT statements return the titles and the total order number for titles that have at least 5000 books ordered? [Check all correct answers] • A. select title, sum(qty) from titles t inner join sales s on t.title_id = s.title_id having count(qty) > 5000 • B. select title , total(qty) from titles t inner sales s on t.title_id = s.title_id group by title having count(qty) > 5000 • C. select title , sum(qty) from titles t inner join sales s on t.title_id = s.title_id where sum(qty) > 5000 group by title • D. select title, sum(qty) from titles t inner join sales s on t.title_id = s.title_id group by title_id having sum(qty) > 5000 • E. None of the above.
converted to PDF by BoJIoc
Вопрос 9 Какие из следующих команд SELECT возвращают названия (title) и общий объем заказов (qty) для книг, которые были заказаны в количестве не менее 5000 экземпляров? [Выберите все правильные ответы] • A. select title, sum(qty) from titles t inner join sales s on t.title_id = s.title_id having count(qty) > 5000 • B. select title, total(qty) from titles t inner join sales s on t.title_id = s.title_id group by title having count(qty) > 5000 • C. select title, sum(qty) from titles t inner join sales s on t.title_id = s.title_id where sum(qty) > 5000 group by title • D. select title, sum(qty) from titles t inner join sales s on t.title_id = s.title_id group by title_id having sum(qty) > 5000 • E. Ни одна из приведенных команд. Правильный ответ — E, поскольку ни одна из приведенных команд не удовлетворяет заданным условиям. Ответ A неверен, поскольку в списке выборки присутствуют столбцы, не являющиеся агрегатными функциями и не присутствующие в GROUP BY. Ответ B неверен, поскольку агрегатной функции total не существует. Неверен и ответ C; агрегатные функции не могут использоваться в секции WHERE. Ответ D тоже неверен, поскольку столбец title_id в секции GROUP BY может принадлежать любой из таблиц. Для неоднозначных столбцов необходимо указать ссылку на таблицу. Question 10 Which of the following SELECT clauses can you use to limit the rows returned in a SELECT statement? [Check all correct answers] • • • • •
A. WHERE. B. HAVING. C. FROM using ANSI joins. D. FROM using TSQL joins. E. None of the above.
Вопрос 10 Какие из перечисленных секций SELECT могут использоваться для ограничения количества записей, возвращаемых командой SELECT? [Выберите все правильные ответы] • • • • •
A. WHERE. B. HAVING. C. FROM с использованием объединений ANSI. D. FROM с использованием объединений TSQL. E. Ни одна из перечисленных.
Правильные ответы — A, B и C. Количество записей, возвращаемых командой SELECT, может ограничиваться в секциях WHERE и HAVING, а также в секциях FROM, использующих объединения ANSI. Ответ D неверен; хотя объединения TSQL могут ограничивать количество возвращаемых записей, но в секции WHERE, а не FROM. Question 11 For the following table, CREATE TABLE MyTable (a int , b text)
converted to PDF by BoJIoc
what happens when the following SQL statements are executed? DECLARE @TP BINARY(15) SELECT @TP =TEXTPTR(b) FROM MyTable ORDER BY a DESC READTEXT MyTable.b @TP 10 20 • • • • •
A. The 10 through 30 characters are retrieved for every row. B. The 10 through 30 characters are retrieved for the row with the lowest value for a. C. The 10 through 30 characters are retrieved for the row with the highest value for a. D. The 10 through 20 characters will be retrieved for the row with the lowest value for a. E. An error will be generated.
Вопрос 11 Имеется таблица: CREATE TABLE MyTable (a int , b text) Что произойдет при выполнении следующих команд SQL? DECLARE @TP BINARY(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
Модификация данных в таблицах Ключевые термины • • • • • • •
INSERT BULK INSERT SELECT INTO UPDATE WRITETEXT UPDATETEXT Типы данных TEXT и IMAGE
Необходимые знания и приемы • • • • •
Вставка данных Обновление данных Использование SELECT INTO Использование BULK INSERT Работа с типами данных TEXT и IMAGE
В большинстве данных не хранятся статические данные. Обычно данные приходится добавлять и обновлять. Microsoft SQL Server поддерживает несколько способов модификации данных в таблицах. В вашем распоряжении следующие команды: • • • • • •
INSERT; SELECT INTO; BULK INSERT; UPDATE; WRITETEXT; UPDATETEXT.
INSERT
converted to PDF by BoJIoc
Команда INSERT имеет четыре основные синтаксические формы. В первых двух формах задаются значения столбцов одной записи. Две другие формы позволяют добавить несколько записей, основанных на результатах команды SELECT или хранимой процедуры. Синтаксис всех четырех форм INSERT выглядит следующим образом: INSERT [INTO] {таблица|представление} {список_столбцов} VALUES ({DEFAULT | выражение_константа }[,...n]) INSERT [INTO] {таблица|представление} {список_столбцов}DEFAULT VALUES INSERT [INTO] {таблица|представление} {список_столбцов}команда_select INSERT [INTO] {таблица|представление} {список_столбцов}команда_execute Основные сведения об INSERTM Помните: команда INSERT дописывает записи в таблицу, а не модифицирует существующие записи. Модификация существующих данных в результате INSERT возможна лишь в результате срабатывания триггера (см. главу 12), модифицирующего записи. Вы должны помнить о некоторых особенностях команды INSERT, среди которых — списки столбцов, столбцы счетчика, UNIQUEIDENTIFIER, символьное и двоичное выравнивание столбцов и @@ROWCOUNT. Списки столбцов Список столбцов представляет собой перечень имен столбцов, разделенных запятыми и заключенных в круглые скобки: INSERT PhoneList ( PersonName, PhoneNumber) VALUES (John Doe, 200-567-1234) В этом примере список столбцов состоит из PersonName и PhoneNumber. Порядок столбцов в списке может отличаться от порядка столбцов в таблице. Тем не менее, в списке столбцов команды INSERT должны присутствовать все столбцы с запрещением значений типа NULL, не имеющие значений по умолчанию или получающие значения от триггера. Производные столбцы не могут присутствовать в списке столбцов. Если в команде INSERT отсутствует список столбцов, она выполняется так, словно список содержит все столбцы в том же порядке, что и в таблице, за исключением производных столбцов (которые автоматически пропускаются). Это означает, что при отсутствии списка столбцов порядок значений соответствует порядку столбцов в таблице. Столбец счетчика Обычно вставка данных в столбцы счетчика (см. главу 5) невозможна. Чтобы вставить данные в столбец счетчика, следует установить для таблицы свойство IDENTITY_INSERT: SET IDENTITY_INSERT [база.[владелец.]]{таблица} {ON|OFF} Установка свойства IDENTITY_INSERT разрешает вставку данных в столбец счетчика. Если столбец счетчика таблицы не указан в команде INSERT, ему будет присвоено следующее значение. Можно явно указать присваиваемое значение для столбца счетчика. Если присваиваемое значение превышает текущее значение столбца счетчика, дальнейший отсчет в столбце будет вестись от новой величины. Как говорилось в главе 5, столбец счетчика не гарантирует уникальности. UNIQUEIDENTIFIER При вставке данных в столбцы с типом данных UNIQUEIDENTIFIER необходимо учитывать особенности поведения этих столбцов. Если для столбца UNIQUEIDENTIFIER не задано значение по умолчанию, присваиваемые значения не будут автоматически заноситься в базу данных. Значения столбцов UNIQUEIDENTIFIER представляют собой шестнадцатеричные числа, состоящие из 36 цифр в формате xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Присутствие дефисов обязательно. Для получения глобальноуникального идентификатора, присваиваемого столбцу, можно воспользоваться функцией NEWID().
converted to PDF by BoJIoc
Следующий фрагмент показывает, как происходит вставка данных в таблице со столбцом типа UNIQUEIDENTIFIER: INSERT MyPhoneList (PhoneId, PersonName, PhoneNumber) VALUES (NEWID(), "John Doe", "200-000-0000") Символьное и двоичное выравнивание столбцов При использовании команды INSERT для модификации данных типов CHAR, VARCHAR или VARBINARY фактическое вставляемое значение зависит от состояния параметра ANSI_PADDING в момент создания таблицы (процесс создания таблиц описан в главе 5, а настройка параметров конфигурации — в главе 8). Если для параметра ANSI_PADDING установлено значение OFF: • значения типа CHAR дополняются пробелами до ширины столбца; • в значениях типа VARCHAR удаляются завершающие пробелы, а строки, состоящие из одних пробелов, заменяются одним пробелом; • в значениях типа VARBINARY удаляются завершающие нули. Если для параметра ANSI_PADDING установлено значение ON: • значения типа CHAR дополняются пробелами до ширины столбца; • значения типов VARCHAR и VARBINARY не обрезаются, но и не дополняются. По умолчанию параметр ANSI_PADDING равен OFF. Тем не менее, и драйвер ODBC Microsoft SQL Server, и провайдер OLE DB Microsoft SQL Server устанавливают для него значение ON при подключении. Microsoft рекомендует всегда устанавливать для этого параметра значение ON. @@ROWCOUNT После выполнения команды INSERT функция @@ROWCOUNT возвращает количество вставленных записей. Ноль вставленных записей еще не означает, что произошла ошибка. Например, это может означать, что команда SELECT или хранимая процедура, которая генерирует вставляемые записи, не вернула ни одной записи. Перечисленные базовые функции используются одинаково независимо от того, какой синтаксис INSERT вы используете. Следующий раздел посвящен вставке отдельной записи. Вставка отдельной записи Команда INSERT чаще всего применяется для вставки в таблицу отдельной записи. Обычно при этом используется ключевое слово VALUES, за которым следует необязательный список значений. Он содержит значения, присваиваемые соответствующим столбцам в списке столбцов. В следующих примерах продемонстрированы различные варианты вставки записи в таблицу с именем MyTable, состоящую из двух столбцов (a и b): INSERT MyTable VALUES ('a',1234) Команда вставляет новую запись в таблицу MyTable. Столбцу a присваивается значение "a", а столбцу b — значение 1234: INSERT INTO MyTable (a) VALUES ('ccc') В команде использовано необязательное ключевое слово INTO, не влияющее на выполнение команды INSERT. Список столбцов состоит из одного столбца a: INSERT MyTable DEFAULT VALUES При наличии ключевых слов DEFAULT VALUES список столбцов не допускается. Каждому столбцу MyTable присваивается значение по умолчанию: INSERT MyTable VALUES (DEFAULT,5) В этом примере список столбцов тоже не используется. Столбцу a присваивается значение по умолчанию, а столбцу b — значение 5.
converted to PDF by BoJIoc
INSERT MyTable (b, a) VALUES (@@ROWCOUNT, user_name()) На этот раз столбец b стоит на первом месте в списке, а столбец a — на втором. Столбцу b присваивается значение, полученное при вызове функции @@ROWCOUNT, а столбцу a — значение, полученное при вызове функции USER_NAME(). Каждому столбцу соответствует скалярное выражение в списке значений. Это выражение может представлять собой константу, скалярную функцию, любое сочетание констант и скалярных функций или ключевое слово DEFAULT. В списке значений не допускается использование подзапросов, столбцов или агрегатных функций. Присваиваемое значение либо неявно преобразуется к типу данных столбца, либо вы должны выполнить явное преобразование. Иногда при вставке данных в таблицу требуется, чтобы SQL Server присвоил столбцу значение по умолчанию. Для этого используется ключевое слово DEFAULT. Существует два возможных применения ключевого слова DEFAULT в команде INSERT. Если DEFAULT используется в списке значений, оно относится к соответствующему столбцу списка. Если ключевое слово DEFAULT находится перед началом списка, оно относится ко всем непроизводным столбцам таблицы, в этом случае список столбцов должен быть пустым. Ключевое слово DEFAULT обрабатывается следующим образом: • Если у столбца имеется значение по умолчанию, оно заносится в столбец. • Если у столбца нет значения по умолчанию, присваивается значение типа NULL. • Если столбец не допускает значений типа NULL, SQL Server выдает сообщение об ошибке. • Если столбец имеет тип TIMESTAMP, столбцу присваивается следующая пометка времени. • SQL Server не разрешает использовать DEFAULT в списке значений для столбца счетчика, однако использование ключевых слов DEFAULT VALUES допускается. Применение ключевого слова DEFAULT для столбцов счетчика демонстрирует следующий пример: -- таблица CREATE TABLE Test( Col1 NUMERIC(10) IDENTITY, Col2 VARCHAR(32) DEFAULT 'Test' NOT NULL) -- допустимая вставка INSERT Test DEFAULT VALUES -- недопустимая вставка INSERT Test VALUES ( DEFAULT,DEFAULT) Первая команда INSERT вставляет запись со следующим значением в столбце Col1 и значением 'Test' в столбце Col2. Вторая команда INSERT завершится неудачей, даже если в таблице установлен параметр, разрешающий выполнение команды INSERT для столбцов счетчика. Вставка нескольких записей Команда INSERT позволяет вставить в таблицу несколько записей. Для этого список значений заменяется командой SELECT или хранимой процедурой. Использование команды SELECT Большинство синтаксически правильных команд SELECT может использоваться в командах INSERT для вставки нескольких записей в таблицу. Если команда SELECT является частью команды INSERT, она не может содержать секций COMPUTE или COMPUTE BY. Допускается применение команды SELECT для выборки записей из таблицы, в которую вы собираетесь вставлять данные, но при этом необходимо проследить за сохранением уникальности индексов, или операция вставки завершится неудачей. • Если значение ROWCOUNT (см. главу 8) текущего сеанса отлично от нуля, команда INSERT прекращает работу после вставки количества записей, равного этому значению. • Команда SELECT, являющаяся частью INSERT, может не возвратить ни одной записи. Это не является ошибкой. • Если хотя бы одна вставленная запись нарушает ограничение таблицы, вся команда INSERT не может быть выполнена. Приведем пример команды INSERT с внутренней командой SELECT:
converted to PDF by BoJIoc
INSERT MyTable( a, b ) SELECT c,SUM(d) FROM MyTable2 GROUP BY c Команда вставляет в таблицу MyTable каждую запись, возвращаемую командой SELECT. Использование хранимых процедур Записи, включаемые в таблицу, могут быть получены с помощью хранимой процедуры. При этом допускается использование любой хранимой процедуры, которая возвращает данные с помощью команд SELECT или READTEXT. Хранимые процедуры в команде INSERT подчиняются следующим правилам: • Если процедура производит выборку данных из текстового столбца с помощью команды READTEXT, при каждом вызове READTEXT возвращается не более 1024 Кбайт данных. • Хранимая процедура, используемая для создания нескольких записей, также может выполнять обновление и вставку в других таблицах. • Процедура может находиться на локальном или удаленном сервере, а также может быть расширенной хранимой процедурой. • Выполняя несколько команд SELECT, процедура может извлекать несколько итоговых наборов. • Полученные данные должны соответствовать типу и количеству столбцов в списке. • Если значение ROWCOUNT текущего сеанса отлично от нуля, команда INSERT прекращает работу после вставки количества записей, равного этому значению. Иногда хранимая процедура не возвращает ни одной записи. Это не является ошибкой. Если хотя бы одна вставляемая запись нарушает ограничение таблицы, вся команда INSERT завершается неудачей. Ниже показан пример вставки записей с помощью хранимой процедуры: INSERT MyTable ( a, b ) EXECUTE SomeValidProcedure Процедура SomeValidProc должна возвращать один или несколько итоговых наборов. Каждый итоговый набор содержит два значения, вставляемые в столбцы a и b таблицы MyTable. SELECT INTO Команда SELECT с параметром INTO позволяет одновременно создать таблицу и заполнить ее данными. Чтобы воспользоваться этим средством заполнения таблицы, необходимо установить параметр базы данных SELECT INTO. Как правило, команда SELECT INTO не используется при создании рабочих баз данных. Примечание Если команда SELECT INTO все же применяется при создании рабочих баз данных, обычно ее использование ограничивается созданием временных таблиц. Команда SELECT с параметром INTO имеет следующий синтаксис: SELECT список_выборки INTO имя_таблицы FROM список_таблиц [секции_where][секция_groupby][секция_having] [секция_orderby] Список_выборки может быть любым допустимым списком выборки, а имя_таблицы — именем любой таблицы, не существующей в данный момент (имена таблиц рассматриваются в главе 5, а глава 6 содержит подробное описание всех секций команды SELECT). Команда SELECT INTO создает новую таблицу, содержащую результаты выборки. Новая таблица состоит из столбцов, присутствующих в списке выборки. В команде могут использоваться любые секции SELECT, за исключением COMPUTE и COMPUTE BY. Присутствие секции FROM обязательно. Каждый столбец в списке выборки должен иметь уникальное непустое имя. Если два столбца имеют одинаковые имена, одному из них необходимо назначить псевдоним. Псевдоним столбца может быть назначен любому выражению или функции. Кроме того, не допускается выполнение SELECT INTO внутри транзакции. Внимание Таблица, создаваемая командой SELECT INTO, не должна существовать перед выполнением этой команды. Секции WHERE и HAVING ограничивают количество вставляемых записей. Если команда SELECT не возвращает ни одной записи, создается пустая таблица. Довольно часто встречаются таблицы, созданные
converted to PDF by BoJIoc
командой SELECT INTO с секцией WHERE 1=2, — команда создает пустую таблицу, которая будет заполнена позднее. При выполнении команды SELECT INTO свойства счетчика наследуются, если только SELECT не содержит объединения, агрегатной функции, секции GROUP BY, UNION, нескольких столбцов счетчика в списке выборки или столбца, используемого в выражениях. В новой таблице не создаются ограничения и индексы, а вычисляемые столбцы становятся обычными, невычисляемыми столбцами. Для выполнения команды SELECT INTO необходимо иметь привилегии создания таблиц для базы данных, в которую осуществляется выборка, и привилегии чтения данных для таблиц, из которой выбираются данные; в противном случае команда не будет выполнена. База данных, в которой создается таблица, должна иметь установленный параметр SELECT INTO/BULKCOPY. Приведем пример использования SELECT с секцией INTO: SELECT * INTO TestTable FROM authors Команда копирует все записи и столбцы из таблицы authors в новую таблицу TestTable. Внимание Таблица, в которую записываются данные, не обязана принадлежать текущей базе данных. Вы можете использовать любое полностью определенное имя таблицы, не существующей в данный момент. Кроме того, таблица может быть временной. BULK INSERT В SQL Server 7 появился новый способ загрузки данных в таблицу — команда BULK INSERT (листинг 7.1). Команда работает аналогично программе BCP, запускаемой из командной строки, и тоже используется для вставки пакетов данных в существующую таблицу. Для каждого параметра команды BULK INSERT существует эквивалентный параметр программы BCP. Внимание Одно из отличий между BULK INSERT и программой BCP заключается в том, что BULK INSERT только заполняет таблицы и не может экспортировать данные из SQL Server в файлы данных. Программа BCP импортирует и экспортирует данные. Листинг 7.1. Синтаксис BULK INSERT BULK INSERT [['имя_базы'.]['владелец'].] {'имя_таблицы' FROM файл_данных} [WITH ( [ BATCHSIZE = размер_пакета] [[,] CHECK_CONSTRAINTS] [[,] CODEPAGE = ACP | OEM |RAW | кодировка] [[,] DATAFILETYPE = {'char' | 'native' | 'widechar' | 'widenative'}] [[,] FIELDTERMINATOR = 'разделитель_полей'] [[,] FIRSTROW = первая_запись] [[,] FORMATFILE = 'полное_имя_файла_форматирования'] [[,] KEEPIDENTITY] [[,] KEEPNULLS] [[,] LASTROW = последняя_запись] [[,] MAXERRORS = максимум_ошибок] [[,] ORDER ({столбец [ASC | DESC]} [,...n])] [[,] ROWTERMINATOR = 'разделитель_записей'] [[,] TABLOCK] ) ]
converted to PDF by BoJIoc
Любые параметры команды BULK INSERT могут встретиться в вопросах экзамена. К счастью, многие параметры достаточно просты. Помните о том, что параметры разделяются запятыми, и о том, что перечень после ключевого слова WITH заключается в скобки. В команде BULK INSERT обязательно присутствует только имя таблицы, в которую вставляются данные, и файл данных. Все остальные части являются необязательными. Для них действуют следующие правила: • Если имя базы данных не указано, по умолчанию используется текущая база данных. • Если владелец не указан, по умолчанию используется текущий владелец. • По умолчанию SQL Server пытается занести данные в таблицу, владельцем которой является владелец базы данных. Если вы не являетесь владельцем базы данных, попытка завершится неудачей — вставка данных в таблицу, принадлежащую кому-то другому, возможна лишь для владельца базы данных. В приведенном выше фрагменте файл_данных содержит полный путь к загружаемому файлу. Путь определяется по отношению к компьютеру, на котором работает SQL Server, а не вашему локальному компьютеру. Чтобы загрузить файл данных с локального компьютера, следует ввести имя файла с указанием полного пути, содержащее сетевое имя локального компьютера. После исходной команды BULK INSERT следует секция WITH с параметрами. В следующем списке кратко описан каждый из параметров BULK INSERT: • BATCHSIZE — определяет количество записей, передаваемых серверу в пакете. По умолчанию все пакеты передаются в одной транзакции. При аварийном завершении команды BULK INSERT выполняется откат текущего пакета. Откат всех предыдущих пакетов производиться не будет. Размер пакета оказывает заметное влияние на скорость загрузки. • CHECK_CONSTRAINTS — приказывает SQL Server проверить все ограничения в таблице. Без этого параметра команда BULK INSERT может загрузить данные, недопустимые в обычных условиях из-за нарушения ограничений. • CODEPAGE — определяет кодовую страницу для данных в файле. Параметр влияет только на символьные столбцы. Он действует лишь при наличии символов с ASCII-кодами меньше 32 или больше 127. Значение ACP означает, что файл содержит текст в кодировке ANSI/Microsoft Windows ISO 1252. Значение OEM используется для файлов в кодировке OEM. Значение RAW говорит о том, что преобразование символов не выполняется; этот параметр обеспечивает самую быструю загрузку. Любое другое значение определяет конкретную кодовую страницу. • DATAFILETYPE — определяет тип файла данных. • CHAR — все данные файла хранятся в символьном формате, с полями, разделенными символами табуляции, и символами перевода строки в конце строк. Данный тип используется по умолчанию. • NATIVE — файл содержит данные SQL Server. Используется для файлов, экспортированных из SQL Server утилитой BCP. • WIDECHAR — файл содержит символы в кодировке UNICODE. В остальном аналогичен CHAR. • WIDENATIVE — файл содержит данные SQL Server, но все символьные поля хранятся в кодировке UNICODE. Для файлов CHAR и WIDECHAR вы можете изменить разделители полей и записей. • FIELDTERMINATOR — позволяет заменить стандартный разделитель полей (символ табуляции) любой символьной строкой. • FIRSTROW — позволяет загрузить фрагмент файла. Если значение FIRSTROW превышает количество записей в файле, не загружается ни одна запись и выдается сообщение об ошибке. Значение FIRSTROW должно быть меньше или равно LASTROW. В противном случае LASTROW игнорируется. • FORMATFILE — позволяет работать с широким спектром файлов данных. Файл форматирования позволяет определять поля фиксированной длины, использовать разные разделители для каждого поля и пропускать столбцы (перечислены лишь некоторые возможности). • KEEPIDENTITY — загружает значения столбца счетчика из данных файла. • KEEPNULLS — игнорирует значения по умолчанию для столбцов, не загружаемых из файла. Все незагруженные столбцы заполняются значениями NULL. • LASTROW — позволяет загрузить фрагмент файла. Если LASTROW превышает количество записей в файле, загрузка данных прекращается в конце файла и не выдается сообщение об ошибке. Значение FIRSTROW должно быть меньше или равно LASTROW. В противном случае LASTROW игнорируется. • MAXERRORS — позволяет задать количество ошибок перед остановкой BULK INSERT. По умолчанию BULK INSERT прекращает работу после 10 ошибок. • ORDER — позволяет отсортировать файл данных в соотвествии с кластерным индексом для ускорения загрузки. Если данные не отсортированы, параметр ORDER игнорируется. Если вы отсортировали данные,
converted to PDF by BoJIoc
но в соответствии со своим порядком сортировки SQL Server отсортировал их иначе, данные считаются неотсортированными. • ROWTERMINATOR — позволяет выбрать другой разделитель записей. В качестве разделителя записей может использоваться любая строка, состоящая из одного и более символов. • TABLOCK — вместо стандартной страничной блокировки SQL Server использует блокировку таблиц. Ниже приведен пример команды BULK INSERT: BULK INSERT pubs.dbo.authors FROM 'c:\data\authors.blk' WITH FIELDTERMINATOR '||', LASTROW = 300 При наличии соответствующих привилегий эта команда загрузит из файла данных до 300 записей. Файл содержит данные в символьном формате. Поля разделяются двойной вертикальной чертой ('||'), а в конце каждой записи находится стандартный разделитель — символ перевода строки. SQL Server выполняет быструю пакетную загрузку без записи в журнал при следующих условиях: • • • •
Для параметра базы данных SELECT INTO/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 titles SET ytd_sales = 123 FROM titleauthor ta WHERE ta.au.ord = 1 AND titles.title_id = ta.title_id В первом примере продемонстрировано применение расширенных объединений TSQL для объединения обновляемой таблицы с другой таблицей. UPDATE titles SET ytd_sales = 123 FROM titleauthor ta join titles t ON t.title_id = ta.title_id WHERE ta.au.ord = 1 Команда делает в точности то же самое, что и предыдущая, но вместо расширенных объединений TSQL в ней используется объединение ANSI. Продолжим знакомство с синтаксисом UPDATE. Секция WHERE подчиняется тем же правилам, что и секция WHERE команды SELECT. Она может содержать столбцы из обновляемой таблицы и любых таблиц, перечисленных в секции FROM. При отсутствии секции WHERE, ссылающейся на столбец обновляемой таблицы, обновляются все записи. Если команда присваивает значение переменной и из-за содержимого секции WHERE ни одна запись не изменяется, переменная также сохраняет прежнее значение. Параметр CURRENT OF используется с курсорами и будет подробнее рассмотрен в главе 11. При выполнении UPDATE нельзя изменять столбцы счетчика. Если какая-либо из модифицированных записей нарушает правило или ограничение таблицы, вся команда UPDATE не может быть выполнена. Вы не можете изменять кластерный индекс для нескольких записей и модифицировать столбцы типов TEXT, IMAGE или типов данных, использующих символы UNICODE в одной команде. Рассмотрим несколько примеров, демонстрирующих использование параметров команды UPDATE: UPDATE authors SET au_fname = 'hi' + au_fname Следующая команда UPDATE присваивает значение переменной и модифицирует столбец. Если ни в одной записи таблицы authors столбец au_id не равен "172-32-1176", значение переменной @a не присваивается: DECLARE @a int UPDATE authors SET au_lname = 'Smith' , @a = -99 WHERE au_id = "172-32-1176" В следующем примере обновляемые записи отбираются с помощью подзапроса в секции WHERE: UPDATE titles SET advance = advance * 1.5 WHERE pub_id in (SELECT pub_id FROM publishers WHERE state = "CA") Последний пример показывает, что обновляемая таблица может присутствовать в секции FROM: UPDATE titles SET advance = advance * 1.5 FROM publishers p, titles t WHERE p.pub_id = t.pub_id AND state = "CA" Работа с типами данных TEXT и IMAGE В MS SQL Server 7 обычные команды INSERT и UPDATE используются для модификации типов данных TEXT и IMAGE без каких-либо ограничений. Кроме того, в SQL Server существуют команды WRITETEXT и UPDATETEXT, обладающие повышенным быстродействием и более широкими возможностями при работе с данными типа TEXT. Команды WRITETEXT и UPDATETEXT имеют следующий синтаксис:
converted to PDF by BoJIoc
WRITETEXT {таблица.столбец указатель_для_TEXT} [WITH LOG] {данные} UPDATETEXT {имя_таблицы.имя_столбца_приемника указатель_ приемника} { NULL | смещение_вставки} { NULL | длина_удаления} [WITH LOG] [ вставляемые_данные | [{имя_таблицы.имя_столбца_ источника указатель_источника}] Перед чтением и модификацией данных типа TEXT и IMAGE необходимо предварительно инициализировать текстовые указатели. Текстовый указатель создается при вставке или обновлении поля значением, не являющимся NULL. Операция создает текстовый указатель, а также выделяет для поля первую 8килобайтную страницу. Затем текстовый указатель сохраняется в переменной типа BINARY, имеющей длину не менее 16 байт. По умолчанию операции WRITETEXT и UPDATETEXT производятся без записи в журнал. Чтобы база данных позволяла выполнять операции без записи в журнал, необходимо присвоить параметру SELECT INTO/BULKCOPY значение TRUE. В противном случае команды могут выполняться только с параметром WITH LOG, в результате чего изменения данных записываются в журнал транзакций. Команда UPDATETEXT позволяет указать позицию поля типа TEXT для удаления существующих или вставки новых данных. Параметр смещение определяет позицию, с которой начинается вставка данных. Нулевое значение соответствует началу поля, а NULL — присоединению данных в конец поля. Параметр длина_удаления определяет количество удаляемых байт от позиции смещения. Если он равен NULL, данные перезаписываются от смещения до конца поля. Команда UPDATETEXT вставляет новые данные с позиции смещение и удаляет байты старых данных в количестве, равном велечине длина_удаления. Например, если смещение равно 10, а длина_удаления — 20, будут удалены 20 байтов существующих данных, начиная с 10 байта. Новые данные вставляются в столбец с 10-го байта. Команда UPDATETEXT также позволяет взять данные из одного столбца с типом данных TEXT или IMAGE и скопировать с тем же типом данных. Такая возможность может пригодиться при копировании столбцов типа TEXT и IMAGE, а также при внесении в них одинаковых изменений. Если вы хотите присвоить для столбца с типом данных TEXT значения NULL без записи операций в журнал, выполните команду WRITETEXT с указанием значений типа NULL. При выполнении команды WRITETEXT с указанием значений типа NULL в текстовое поле заносится пустая строка. Чтобы использовать команды WRITETEXT или UPDATETEXT, необходимо сначала создать текстовый указатель. Он представляет собой внутренний указатель SQL Server на область данных столбца типа TEXT или IMAGE. Текстовый указатель создается либо командой INSERT с данными, отличными от NULL, либо командой UPDATE с присваиванием столбцу произвольного значения (включая NULL). Работа с текстовыми указателями продемонстрирована в листинге 7.2. Листинг 7.2. Инициализация текстовых указателей CREATE TABLE MyBook ( ChapterNumber INT NOT NULL, Chapter TEXT NULL ) -- установка текстового указателя командой insert INSERT MyBook (ChapterNumber, Chapter) VALUES (7,"") -- установка текстового указателя командой insert -- с последующей командой update INSERT MyBook(ChapterNumber) VALUES(7) UPDATE MyBook SET Chapter = NULL WHERE ChapterNumber = 7
converted to PDF by BoJIoc
Фрагмент создает таблицу MyBook, состоящую из двух столбцов, а затем демонстрирует два способа инициализации текстовых указателей. В первом примере (команда INSERT) в столбец Chapter заносится пустая строка. Во втором примере в MyBook вставляется новая запись, однако для столбца Chapter не указывается значение. Столбец Chapter получает значение по умолчанию NULL. Не забывайте о том, что при вставке NULL в столбец типа TEXT текстовый указатель не инициализируется. Второй пример обновляет MyBook, присваивая Chapter значение NULL. При выполнении команды UPDATE, присваивающей столбцу типа TEXT значения NULL, создается правильный текстовый указатель. Следующим шагом является сохранение текстового указателя в локальной переменной. Переменная, предназначенная для хранения текстового указателя, должна относиться к типу BINARY или VARBINARY с длиной не менее 16 байт. Обращение к текстовому указателю производится с помощью функции TEXTPTR. Следующий пример показывает, как сохранить текстовый указатель: DECLARE @MyPtr BINARY(16) SELECT @MyPtr = TEXTPTR(Chapter) FROM MyBook WHERE ChapterNumber = 7 В этом примере создается локальная переменная @MyPtr типа BINARY длиной 16 байтов. Команда SELECT обращается к текстовому указателю для столбца Chapter и присваивает @MyPtr значение этого указателя. После сохранения текстового указателя в переменной можно использовать команды WRITETEXT и UPDATETEXT. WRITETEXT MyBook.Chapter @MyPtr WiTH LOG "Chapter 7 Terms you'll need to Understand ..." WRITETEXT MyBook.Chapter @MyPtr 33 1 WITH LOG "u" В этом примере команда WRITETEXT перезаписывает значение столбца Chapter с текстовым указателем @MyPtr. Затем команда UPDATETEXT использует тот же текстовый указатель для замены 33-го символа, "U", символом нижнего регистра "u". Примечание После того как текстовый указатель был инициализирован, он не изменяется при изменении данных в столбце. Модификация данных с использованием представлений Модификация данных с использованием представлений имеет много общего с непосредственной модификацией данных в таблицах. Представления допускают как вставку, так и обновление данных. Модификация данных в представлениях рассматривается в главе 10. Примеры экзаменационных вопросов Question 1 Using the Pubs database in Appendix A, which answers are true about the following INSERT statement? [Check all correct answers] insert discounts ( stor_id, lowqty, discount,discounttype ) values (6380, 10, 20, 'MyDiscount') • • • • •
A. The statement will insert one row into the discount table if the stor_id 6380 exists in the stores table. B. The INSERT will fail, because stor_id is a character column and you are trying to insert an integer into it. C. The column highqty will be set to NULL. D. If a discounttype 'MyDiscount' already exists, the row will not be added. E. None of the above.
Вопрос 1 Используется база данных Pubs из приложения А. Какие утверждения будут истинны для следующей команды INSERT? [Выберите все правильные ответы] insert discounts ( stor_id, lowqty, discount,discounttype ) values (6380, 10, 20, 'MyDiscount') • A. Команда вставит одну запись в таблицу discount, если в таблице stores существует stor_id 6380.
converted to PDF by BoJIoc
• B. Команда INSERT не будет выполнена, поскольку stor_id является символьным столбцом, а вы пытаетесь вставить в него целое число. • C. Столбцу highqty будет присвоено значение NULL. • D. Если discounttype 'MyDiscount' уже существует, запись не добавляется. • E. Ни одно из перечисленных утверждений. Правильные ответы — A и C. Ответ A правилен, поскольку правила ссылочной целостности требуют, чтобы значение stor_id присутствовало в таблице stores перед его включением в таблицу discount. Ответ C тоже правилен, поскольку для столбца highqty не определено значение по умолчанию, однако столбец допускает NULL; это значение и будет автоматически присвоено ему SQL Server. SQL Server автоматически преобразует целое число в символьные данные, поэтому ответ B неверен. Ответ D неверен, поскольку в таблице не существует уникальных индексов, ограничений или триггеров, обеспечивающих уникальность. Question 2 Using the Pubs database in Appendix A, which SQL statement will update the employee table by setting the hire date to the publish date of the most recent book published when the hire date is before Jan 1, 1992? If there is no publish date, it will set the hire date to the current date and time. [Check all correct answers] • A. update employee set hire_date = isnull(( select max(pubdate) from titles t where employee.pub_id = t.pub_id and hire_date <'Jan 1 1992'), getdate()) • B. update [employee] set [hire_date] = isnull(( select max([pubdate]) from [titles] t where employee.[pub_id] = t.[pub_id]).getdate()) where [hire_date] < 'Jan 1 1992' • C. update employee set hire_date = isnull(( select max(pubdate) from titles t where employee.pub_id = t.pub_id),getdate()) where hire_date < 'Jan 1 1992' • D. update [employee] set [hire_date] = isnull( max([pubdate]), GETDATE()) from [titles] t where employee.[pub_id] = t.[pub_id] and [hire_date] > 'Jan 1 1992' • E. update employee set hire_date = isnull(pubdate,getdate()) from titles t where employee.pub_id *= t.pub_id and hire_date <'Jan 1 1992' and t.pubdate = (select max(pubdate) from titles2 where t2.pub_id = employee.pub_id) Вопрос 2 Используется база данных Pubs из приложения А. Какая команда SQL обновляет таблицу employee, присваивая столбцу hire_date дату публикации (pubdate) самой последней опубликованной книги, если дата hire_date предшествует 1 января 1992 года? Если дата публикации не задана, столбцу hire_date присваиваются текущая дата и время. [Выберите все правильные ответы] • A. update employee set hire_date = isnull(( select max(pubdate)
converted to PDF by BoJIoc
from titles t where employee.pub_id = t.pub_id and hire_date <'Jan 1 1992'), getdate()) • B. update [employee] set [hire_date] = isnull(( select max([pubdate]) from [titles] t where employee.[pub_id] = t.[pub_id]).getdate()) where [hire_date] < 'Jan 1 1992' • C. update employee set hire_date = isnull(( select max(pubdate) from titles t where employee.pub_id = t.pub_id),getdate()) where hire_date < 'Jan 1 1992' • D. update [employee] set [hire_date] = isnull( max([pubdate]), GETDATE()) from [titles] t where employee.[pub_id] = t.[pub_id] and [hire_date] > 'Jan 1 1992' • E. update employee set hire_date = isnull(pubdate,getdate()) from titles t where employee.pub_id *= t.pub_id and hire_date <'Jan 1 1992') and t.pubdate = (select max(pubdate) from titles2 where t2.pub_id = employee.pub_id) Правильные ответы — B и C. Оба ответа, B и C, выполняют одни и те же действия — вычисляют максимальное значение pubdate для издателя, на которого трудится работник. Если опубликованных книг нет, pubdate присваивается текущая дата. Модификация выполняется лишь в том случае, если значение hire_date меньше 1 января 1992 г. Команда из ответа A синтаксически правильна, однако в ней отсутствует секция WHERE, поэтому команда обновляет все записи таблицы employee. Ответ D содержит неверную команду SQL, поскольку секция SET содержит агрегатную функцию. Команда из ответа E тоже неверна — таблица titles входит во внутреннее и внешнее объединения T-SQL. Question 3 Which answers are true regarding the following SQL? [Check all correct answers] declare @a varbinary(16) select @a = textptr(logo) from pub_info updatetext pub_info.logo @a 3 10 '000123' • • • • •
A. The statement will fail, because you cannot use UPDATETEXT with an image column. B. The statement will fail, because 10 characters are being replaced with 6 characters. C. The statement will fail, because the variable @a is a VARBINARY, not a BINARY. D. The statement will remove 10 bytes starting with byte 3 and insert the bytes for '000123'. E. None of the above.
Вопрос 3 Какие утверждения верны по отношению к следующему фрагменту кода SQL? [Выберите все правильные ответы] declare @a varbinary(16) select @a = textptr(logo) from pub_info updatetext pub_info.logo @a 3 10 '000123' • A. Команда не будет выполена, поскольку UPDATETEXT не может использоваться для столбцов типа image. • B. Команда не будет выполнена, поскольку 10 символов заменяются 6 символами.
converted to PDF by BoJIoc
• C. Команда не будет выполена, поскольку переменная @a относится к типу VARBINARY, а не к BINARY. • D. Команда удалит 10 байт, начиная с третьего, и вставит байты '000123'. • E. Ни одно из перечисленных утверждений. Правильный ответ — D. Смещение равно 3, длина заменяемого фрагмента — 10, а заменяющий фрагмент — '000123'. Ответ A неверен, поскольку команда UPDATETEXT модифицирует любые типы неструктурированных двоичных данных (BLOB). Ответ B неверен, поскольку команда UPDATETEXT позволяет сокращать размер текстовых и графических столбцов. Наконец, ответ C тоже неверен; текстовый указатель может иметь тип BINARY или VARBINARY длиной не менее 16 байт. Question 4 Which answers are true about the following SQL statements? [Check all correct answers] select * into #pubs1 from authors where au_id > '123-45-6789' select * into #pubs1 from authors where au_fname like 'A%' • • • • •
A. A table will be created in the current database. B. A table will be created in tempdb. C. The statements will only work if the 'Select Create' database option is turned on. D. The table created will only have the rows from the first SELECT statements. E. None of the above.
Вопрос 4 Какие утверждения верны по отношению к следующим командам SQL? [Выберите все правильные ответы] select * into #pubs1 from authors where au_id > '123-45-6789' select * into #pubs1 from authors where au_fname like 'A%' • • • • •
A. Таблица будет создана в текущей базе данных. B. Таблица будет создана в tempdb. C. Команды будут работать лишь в том случае, если установлен параметр базы данных 'Select Create'. D. Созданная таблица будет содержать записи лишь из первой команды SQL. E. Ни одно из перечисленных утверждений.
Правильный ответ — E. Все остальные ответы неверны, поскольку к моменту компиляции второй команды SELECT INTO таблица #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 DATEFIRST и SET DATEFORMAT. SET DATEFIRST Команда SET DATEFIRST определяет день, который считается первым днем недели. Команда имеет следующий синтаксис: SET DATEFIRST число, где число принимает значения от 1 до 7. В табл. 8.1 перечислены допустимые значения параметра команды SET DATEFIRST. Таблица 8.1. Значения параметра DATEFIRST Значение Значение 1
Понедельник
2
Вторник
3
Среда
4
Четверг
5
Пятница
6
Суббота
7
Воскресенье
По умолчанию первым днем недели назначается воскресенье (7). При использовании функции DATEPART для получения дня недели возвращаемое значение основано на текущем выборе первого дня недели (дополнительные сведения о функции DATEPART приведены в главе 6). Например, в стандартной конфигурации пятница является шестым днем недели. Если назначить первым днем недели понедельник, то пятница будет пятым днем недели. Совет Чтобы узнать, какой день недели в настоящее время является первым, воспользуйтесь функцией @@DATEFIRST. SET DATEFORMAT
converted to PDF by BoJIoc
Команда SET DATEFORMAT определяет формат, используемый при выводе данных в символьных строках SQL Server. Помните о том, что SET DATEFORMAT не влияет на формат возвращаемых дат или строк, полученных при преобразовании даты в символьные строки. DATEFORMAT влияет только на символьные значения, преобразуемые в дату. Команда SET DATEFORMAT имеет следующий синтаксис: SET DATEFORMAT {формат | @форматная_переменная} В табл. 8.2 перечислены допустимые форматы для команды SET DATEFORMAT. Таблица 8.2. Допустимые форматы даты для команды SET DATEFORMAT Формат Описание
Пример
mdy
Месяц, дата, год 07/30/99
myd
Месяц, год, дата 07/99/30
dym
День, год, месяц 30/99/07
dmy
День, месяц, год 30/07/99
ymd
Год, месяц, день 99/07/30
ydm
Год, день, месяц 99/30/07
При преобразовании строки в поле DATETIME формат даты определяет порядок следования дня, месяца и года в строке. Если выбран формат mdy, дата 01/07/1999 соответствует 7 января 1999 года. Если выбрать формат dmy, то 01/07/1999 соответствует 1 июля 1999 года. Если SQL Server настроен на стандарт USEnglish, по умолчанию используется формат mdy. Формат даты не влияет на даты, отформатированные в числовом виде. Числовой формат всегда интерпретируется в порядке ymd. Например, значение 19990730 соответствует 30 июля 1999 г. Команды блокировки Команды блокировки управляют блокировкой данных в SQL Server. Они позволяют управлять взаимными блокировками (deadlocks) и тайм-аутом (интервалом времени, в течение которого подключение ожидает снятия блокировки). SET DEADLOCK_PRIORITY Команда SET DEADLOCK_PRIORITY управляет взаимными блокировками. Ситуация взаимной блокировки возникает тогда, когда два подключения блокируют некоторые ресурсы и для продолжения работы каждому из них нужен доступ к ресурсу другого подключения. Команда SET DEADLOCK_PRIORITY имеет следующий синтаксис: SET DEADLOCK_PRIORITY { LOW | NORMAL | @переменная } Как видно из синтаксиса, приоритет взаимной блокировки может быть низким (LOW) или стандартным (NORMAL). Приоритет также может определяться переменной, содержащей LOW или NORMAL. При выборе приоритета LOW SQL Server повышает вероятность того, что ваша блокировка будет выбрана в качестве жертвы взаимоблокировки. Приоритет NORMAL означает, что SQL Server выполняет обычную обработку взаимных блокировок, а ваша блокировка выбирается жертвой взаимной блокировки со стандартной вероятностью. По умолчанию для взаимных блокировок используется приоритет NORMAL. SET LOCK_TIMEOUT По умолчанию подключение переходит в состояние ожидания до тех пор, пока заблокированный ресурс не освободится. Команда SET LOCK_TIMEOUT позволяет изменить это поведение и задать интервал в миллисекундах, в течение которого подключение ждет освобождения заблокированных ресурсов до наступления тайм-аута. Команда SET LOCK_TIMEOUT имеет следующий синтаксис: SET LOCK_TIMEOUT число_миллисекунд Если присвоить LOCK_TIMEOUT значение –1, SQL Server переходит к стандартной обработке блокировок; для подключений, ожидающих снятия блокировки, тайм-аут не наступает никогда. Любое положительное
converted to PDF by BoJIoc
число определяет интервал ожидания в миллисекундах. Текущее значение тайм-аута определяется функцией @@LOCK_TIMEOUT. Разные команды Категория объединяет все команды, которые Microsoft не относит ни к одной из других категорий. В частности, команды этого типа определяют обработку значений типа NULL, поведение курсоров и столбцов счетчика. SET CONCAT_NULL_YIELDS_NULL Команда SET CONCAT_NULL_YIELDS_NULL определяет поведение SQL Server при конкатенации строк со значениями типа NULL. Она имеет следующий синтаксис: SET CONCAT_NULL_YIELDS_NULL { ON | OFF } Если флаг CONCAT_NULL_YIELDS_NULL установлен, то при конкатенации строки с NULL результат равен NULL. Если флаг сброшен, поведение определяется флагом CONCAT_NULL_YIELDS_NULL базы данных. Если оба флага сброшены, то результат конкатенации строки с NULL равен NULL. Если флаг подключения сброшен, а флаг базы данных установлен, результат конкатенации также равен NULL. По умолчанию флаг подключения CONCAT_NULL_YIELDS_NULL установлен. SET CURSOR_CLOSE_ON_COMMIT Команда SET CURSOR_CLOSE_ON_COMMIT определяет поведение курсора при выполнении команды COMMIT. Она имеет следующий синтаксис: SET CURSOR_CLOSE_ON_COMMIT { ON | OFF } Если флаг CURSOR_CLOSE_ON_COMMIT установлен, то каждый раз, когда подключение выполняет команду COMMIT или ROLLBACK, курсоры закрываются (курсоры подробно рассматриваются в главе 11). Если флаг сброшен, то поведение курсоров при выполнении COMMIT или ROLLBACK определяется флагом CURSOR_CLOSE_ON_COMMIT базы данных. Если оба флага сброшены, то при выполнении команды COMMIT курсоры остаются открытыми. Если хотя бы один из флагов CURSOR_CLOSE_ON_COMMIT находится в состоянии ON, откат приведет к закрытию всех курсоров, за исключением INSENSITIVE или STATIC. Драйвер OLE DB Microsoft, драйвер ODBC и DB-Library автоматически сбрасывают флаг CURSOR_CLOSE_ON_COMMIT. SET FIPS_FLAGGER Команда SET FIPS_FLAGGER используется для проверки SQL на соответствие стандарту ANSI SQL-92. Если параметр FIPS_FLAGGER установлен, то для любой команды, нарушающей стандарт ANSI SQL-92 на уровне параметра, выдается сообщение об ошибке. Команда SET FIPS_FLAGGER имеет следующий синтаксис: SET FIPS_FLAGGER { ENTRY | INTERMEDIATE | FULL | OFF } По умолчанию параметр FIPS_FLAGGER находится в состоянии OFF, и SQL Server не проверяет нарушения стандарта ANSI SQL-92 в командах T-SQL. Если параметр равен ENTRY, INTERMEDIATE или FULL, SQL Server ищет в командах T-SQL нарушения соответствующего уровня ANSI SQL-92. По умолчанию параметр находится в состоянии OFF. SET IDENTITY_INSERT По умолчанию вставка или обновление столбца счетчика с использованием явно заданных значений не разрешается. Команда SET IDENTITY_INSERT позволяет задать значение столбца счетчика. Она имеет следующий синтаксис: SET IDENTITY_INSERT имя_таблицы { ON | OFF } Если для таблицы установлен флаг IDENTITY_INSERT, ее столбец счетчика можно модифицировать. В любой момент времени допускается установка параметра IDENTITY_INSERT лишь для одной таблицы в базе данных. Если флаг IDENTITY_INSERT сброшен, столбец счетчика таблицы модифицировать нельзя.
converted to PDF by BoJIoc
Если значение, присвоенное столбцу счетчика, превышает текущее максимальное значение столбца, то значения счетчика новых записей будут отсчитываться от новой величины. SET LANGUAGE Команда SET LANGUAGE позволяет выбрать для подключения другой языковой стандарт. Выбранный язык определяет форматы DATETIME и язык системных сообщений. Команда SET LANGUAGE имеет следующий синтаксис: SET LANGUAGE { язык | переменная } Параметр язык определяет любой язык из системной таблицы syslanguages базы данных master. SET OFFSETS Команда SET OFFSETS используется в сочетании с приложениями DB-Library для поиска ключевых слов в SQL. В экзамене она не встречается. SET PROCID Команда SET PROCID используется в сочетании с приложениями DB-Library для возврата идентификатора хранимой процедуры приложению DB-Library. SET QUOTED_IDENTIFIER Команда SET QUOTED_IDENTIFIER требует, чтобы SQL Server подчинялся правилам использования кавычек стандарта ANSI SQL-92. При установке флага QUOTED_IDENTIFIER кавычки (") интерпретируются как идентификаторы объектов, а апострофы (') используются для строковых литералов. Если флаг QUOTED_IDENTIFIER находится в состоянии OFF, то строковые литералы заключаются как в кавычки, так и в апострофы, а в идентификаторах объектов эти символы не используются. Команда SET QUOTED_IDENTIFIER имеет следующий синтаксис: SET QUOTED_IDENTIFIER { ON | OFF } При использовании DB-Library флаг QUOTED_IDENTIFIER по умолчанию равен OFF. В приложениях ODBC и OLE DB он по умолчанию равен ON. Команды выполнения запросов Команды выполнения запросов влияют на обработку команд SQL. Например, с их помощью можно ограничивать количество записей, определять, будет ли команда выполняться, управлять выполнением команд и обработкой различных математических условий. SET ARITHABORT Команда SET ARITHABORT определяет поведение SQL Server при возникновении математического переполнения или деления на ноль, когда математическая функция пытается присвоить столбцу значение, не помещающееся в его типе данных. Команда SET ARITHABORT имеет следующий синтаксис: SET ARITHABORT { ON | OFF } Если флаг ARITHABORT находится в состоянии OFF, при возникновении математического переполнения или деления на ноль SQL Server выдает предупреждающее сообщение и продолжает работу. Если присвоить ARITHABORT значение ON, то при возникновении математического переполнения или деления на ноль SQL Server завершает текущий запрос или пакет. Примечание В качестве результата операций, вызвавших деление на ноль или переполнение, SQL Server генерирует значение NULL. SET ARITHIGNORE
converted to PDF by BoJIoc
Команда SET ARITHIGNORE определяет, должен ли SQL Server выдавать сообщения об ошибках при возникновении математического переполнения или деления на ноль в командах SELECT. Команда SET ARITHIGNORE имеет следующий синтаксис: SET ARITHIGNORE { ON | OFF } Если флаг ARITHIGNORE находится в состоянии OFF, при возникновении математического переполнения или деления на ноль SQL Server выдает предупреждающее сообщение. Если присвоить ARITHIGNORE значение 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 NUMERIC_ROUNDABORT Команда SET NUMERIC_ROUNDABORT определяет действия SQL Server в ситуациях, когда арифметическое округление приводит к потере точности в запросе. Она имеет следующий синтаксис: SET NUMERIC_ROUNDABORT { ON | OFF } По умолчанию флаг NUMERIC_ROUNDABORT находится в состоянии OFF — это означает, что при потере точности SQL Server не выдает ошибок и предупреждений. Если флаг ARITH_ROUNDABORT сброшен, а NUMERIC_ ROUNDABORT установлен, потеря точности сопровождается выдачей предупреждения. Если установлены оба флага, ARITH_ROUNDABORT и NUMERIC_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_LIMIT Команда SET QUERY_GOVERNOR_COST_LIMIT позволяет ограничить выполнение запросов в зависимости от времени, которое будет затрачено на обработку данного запроса по оценке SQL Server. Это называется управлением запросами (query governing). Команда имеет следующий синтаксис: SET QUERY_GOVERNOR_COST_LIMIT целое_число Если целое_число равно нулю, все запросы выполняются независимо от затрат (под затратами понимается совокупность ресурсов, необходимых для выполнения запроса). Если параметр является любым положительным числом, то при выполнении любого запроса SQL Server оценивает затраты. Если они превышают заданный порог, выполнение запроса не разрешается. По умолчанию параметр QUERY_GOVERNOR_ COST_LIMIT равен 0. SET ROWCOUNT Команда SET ROWCOUNT позволяет ограничить количество записей, участвующих в выполнении команды SQL. Она имеет следующий синтаксис: SET ROWCOUNT целое_число Если целое_число равно 0, SQL Server не накладывает искусственных ограничений на количество обрабатываемых записей. Если параметр является любым положительным числом, то после обработки заданного числа записей команда SQL прекращает работу (например, команда SELECT перестает возвращать записи). Все команды модификации (INSERT, UPDATE, DELETE) при достижении порогового значения завершают модификацию записей. SET TEXTSIZE Команда SET TEXTSIZE используется с типами данных TEXT и IMAGE и определяет количество байт, возвращаемых командой SELECT. Она имеет следующий синтаксис: SET TEXTSIZE { целое_число | @переменная_int) Неотрицательное целое_число определяет количество байт, возвращаемых клиентской программе при выборке данных из столбцов типа TEXT или IMAGE. Максимальный объем блока равен 2 Гбайт. При значении 0 объем блока равен 4 Кбайт (значение TEXTSIZE по умолчанию). Выполняя команду TEXTSIZE, вы изменяете значение функции @@TEXTSIZE. Примечание При подключении к SQL Server через драйвер Microsoft ODBC или OLE DB размер блока 2 147 483 647 байт устанавливается автоматически. Команды настройки SQL-92 Команды 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_PADDING; ANSI_WARNINGS; CURSOR_CLOSE_ON_COMMIT; IMPLICIT TRANSACTIONS; QUOTED_IDENTIFIER.
Если флаг ANSI_DEFAULTS переводится в состояние OFF, устанавливается флаг ANSI_NULL_DFLT_OFF, а следующие флаги сбрасываются: • • • • • •
ANSI_NULLS; ANSI_PADDING; ANSI_WARNINGS; CURSOR_CLOSE_ON_COMMIT; IMPLICIT TRANSACTIONS; QUOTED_IDENTIFIER.
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 Server по умолчанию). В любой момент времени может быть установлен лишь один из флагов 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 возвращает все записи, у которых в поле SpouseName находится NULL:
converted to PDF by BoJIoc
SELECT * FROM Person WHERE SpouseName = NULL Если флаг ANSI_NULLS установлен, приведенная команда не возвратит ни одной записи. В соответствии со стандартом ANSI при сравнениях столбца с NULL должны использоваться конструкции IS NULL и IS NOT NULL. Следующая команда возвращает все записи из таблицы Person, независимо от значения ANSI_NULLS: SELECT * FROM Person WHERE SpouseName IS NULL SET ANSI_PADDING Команда SET ANSI_PADDING управляет хранением данных типа CHAR, BINARY, VARCHAR и VARBINARY, которые либо завершаются последовательностью пробелов, либо имеют длину меньше максимальной длины столбца. Команда имеет следующий синтаксис: SET ANSI_PADDING { ON | OFF } Если флаг ANSI_PADDING находится в состоянии OFF: • CHAR — данные дополняются пробелами до ширины столбца; • VARCHAR — из данных удаляются завершающие пробелы, а строки; состоящие из одних пробелов, преобразуются в один пробел; • VARBINARY — из данных удаляются завершающие нули. Если флаг ANSI_PADDING находится в состоянии ON: • CHAR — данные дополняются пробелами до ширины столбца; • VARCHAR — данные не обрезаются и не дополняются; • VARBINARY — данные не обрезаются и не дополняются. Примечание Microsoft рекомендует всегда устанавливать флаг ANSI_PADDING в состояние ON. SET ANSI_WARNINGS Команда SET ANSI_WARNINGS определяет действия при возникновении ошибок, соответствующие стандарту ANSI. Она имеет следующий синтаксис: SET ANSI_WARNINGS { ON | OFF } Если флаг ANSI_WARNINGS установлен, следующие условия обрабатываются в соответствии со стандартом ANSI: • При наличии NULL в любой записи, используемой в агрегатной функции, выдается предупреждение. • Деление на ноль или математическое переполнение приводит к откату команды и выдаче сообщения об ошибке. Хотя флаг ANSI_WARNINGS по умолчанию находится в состоянии 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 STATISTICS IO По команде SET STATISTICS IO SQL Server возвращает сведения о дисковых операциях, выполняемых командой SQL. Команда имеет следующий синтаксис: SET STATISTICS IO { ON | OFF } Если флаг STATISTICS IO установлен, SQL Server возвращает информацию обо всех операциях чтения базы данных, производимых при выполнении команды SQL. SQL Server не возвращает сведений о записи на диск. SET STATISTICS TIME По команде SET STATISTICS TIME SQL Server возвращает количество миллисекунд, затраченных на выполнение команд SQL. Команда имеет следующий синтаксис: SET STATISTICS TIME { ON | OFF } Если флаг STATISTICS TIME установлен, SQL Server возвращает количество миллисекунд, затраченных на анализ, компиляцию и выполнение каждой команды SQL. Команды транзакций Команды этой категории управляют обработкой транзакций в SQL Server. В частности, они определяют, следует ли интерпретировать каждую команду SQL как отдельную транзакцию, а также выбирают уровень изоляции транзакций. SET IMPLICIT_TRANSACTIONS
converted to PDF by BoJIoc
Команда SET IMPLICIT_TRANSACTIONS управляет автоматическим инициированием транзакций в SQL Server. Она имеет следующий синтаксис: SET IMPLICIT_TRANSACTIONS { ON | OFF } Если флаг IMPLICIT_TRANSACTIONS установлен, SQL Server автоматически начинает транзакцию при выполнении любой из перечисленных ниже команд SQL и при отсутствии незавершенных транзакций: • • • • • • • • • • • •
ALTER TABLE; CREATE; DELETE; DROP; FETCH; GRANT; INSERT; OPEN; REVOKE; SELECT; TRUNCATE TABLE; UPDATE.
Примечание Если флаг IMPLICIT_TRANSACTIONS находится в состоянии OFF (значение по умолчанию в SQL Server), транзакции инициируются командой BEGIN TRANSACTION. Команда BEGIN TRANSACTION рассматривается в главе 13. SET REMOTE_PROC_TRANSACTIONS Команда SET REMOTE_PROC_TRANSACTIONS управляет поведением SQL Server при вызове удаленных процедур. Она имеет следующий синтаксис: SET REMOTE_PROC_TRANSACTIONS { ON | OFF } Если флаг REMOTE_PROC_TRANSACTIONS установлен, при каждом дистанционном вызове процедуры RPC SQL Server начинает распределенную транзакцию. Запускается Microsoft Distributed Transaction Manager (MS DTC), который управляет выполнением транзакции RPC. Если флаг REMOTE_PROC_TRANSACTIONS находится в состоянии OFF, вызов RPC не начинает распределенную транзакцию. SET TRANSACTION ISOLATION LEVEL Команда SET TRANSACTION ISOLATION LEVEL управляет работой механизма блокировки. Она имеет следующий синтаксис: SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITED | REPEATABLE READ | SERIALIZABLE } В любой момент времени может быть установлено лишь одно значение параметра TRANSACTION ISOLATION LEVEL. По умолчанию в SQL Server используется значение READ COMMITED. Различные значения TRANSACTION ISOLATION LEVEL описаны ниже: • READ COMMITTED — запрещает «грязное чтение» (чтение изменений данных, не закрепленных в базе). Разрешается доступ лишь к тем данным, которые не были заблокированы другим подключением. • READ UNCOMMITED — разрешает чтение данных сквозь блокировки, установленные другими пользователями. Вы сможете читать изменения данных, не закрепленные в базе. • REPEATABLE READ — заставляет SQL Server устанавливать блокировки и запрещает другим пользователям обновлять данные, используемые в команде SQL. Однако REPEATABLE READ не мешает добавлению новых записей в таблицу. Такие записи называются фантомными (phantom rows) и появляются при повторном чтении данных. • SERIALIZABLE — обеспечивает самый высокий уровень изоляции транзакций. SERIALIZABLE запрещает другим пользователям обновлять данные, открытые для чтения, а также добавлять данные, которые должны участвовать в выборке текущей команды SQL.
converted to PDF by BoJIoc
SET XACT_ABORT Команда SET XACT_ABORT управляет обработкой ошибок времени выполнения (run-time errors) в SQL Server. Она имеет следующий синтаксис: SET XACT_ABORT { ON | OFF } Если флаг XACT_ABORT установлен, то при возникновении ошибки времени выполнения SQL Server отменяет транзакцию. Если флаг XACT_ABORT сброшен, SQL Server ограничивается отменой команды SQL, вызвавшей ошибку. Просмотр пользовательских параметров конфигурации После изменения параметров командой SET иногда бывает необходимо просмотреть их текущие значения. Для просмотра параметров конфигурации используется команда DBCC USEROPTIONS или функция @@OPTIONS. DBCC USEROPTIONS Команда DBCC USEROPTIONS возвращает все параметры SET для текущего подключения. Она имеет следующий синтаксис: DBCC USEROPTIONS Команда DBCC USEROPTIONS возвращает параметры подключения в стандартном табличном формате. В одном столбце таблицы выводятся имена параметров, а в другом — их текущие значения. Команда DBCC USEROPTIONS может быть выполнена любым пользователем. Следующий пример DBCC USEROPTIONS предполагает, что команды SET не выполнялись и все параметры сохранили значения по умолчанию: Set Option
Value
-------------------------------- -----------------------------textsize
64512
language
us-english
dateformat
mdy
datefirst
7
ansi_null_dflt_on
SET
Как видно из приведенного примера, в результатах команды DBCC USEROPTIONS выводятся лишь явно заданные параметры. Например, в таблице отсутствуют строки для параметров ROWCOUNT или TRANSACTION ISOLATION LEVEL. В следующем примере команда DBCC USEROPTIONS выполняется после изменения параметров ROWCOUNT или TRANSACTION ISOLATION LEVEL следующими командами: SET ROWCOUNT 100 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED DBCC USEROPTIONS Результаты команды DBCC USEROPTIONS принимают следующий вид: Set Option
Value
-------------------------------- -----------------------------textsize
64512
rowcount
100
language
us-english
dateformat
mdy
datefirst
7
ansi_null_dflt_on
SET
isolation level
read uncommited
converted to PDF by BoJIoc
В таблице появились дополнительные строки для параметров ROWCOUNT или TRANSACTION ISOLATION LEVEL. Обратите внимание на одну важную деталь: имена параметров, задаваемых командой SET, не всегда совпадают с именем параметра в результатах DBCC USEROPTIONS; например, параметр TRANSACTION ISOLATION LEVEL выводится с именем isolation level. @@OPTIONS Функция @@OPTIONS возвращает битовую маску, определяющую установленные параметры SET для текущего подключения. Главный недостаток команды @@OPTIONS заключается в том, что не все параметры влияют на состояние возвращаемой битовой маски. В табл. 8.3 перечислены устанавливаемые биты маски и параметры, связанные с каждым битом. В первом столбце таблицы указан номер бита от правого края результата команды @@OPTIONS. Во втором столбце находится десятичное число, равное 2 в степени позиции устанавливаемого бита. В последнем столбце указывается параметр SET, который находится в состоянии ON для установленного бита. Единственным исключением является флаг ANSI NULL DEFAULT, для которого в маске выделено два разряда (бит 10 — флаг установлен, бит 11 — флаг сброшен). Применение функции @@OPTIONS демонстрирует следующий пример: IF @@OPTIONS & 64 != 0 SELECT 'ARITHABORT IS SET' Таблица 8.3. Биты функции @@OPTIONS Бит Десятичное значение Параметр 0
1
DISABLE DEFAULT CONSTRAIN CHECK
1
2
IMPLICIT TRANSACTIONS
2
4
CURSOR CLOSE ON COMMIT
3
8
ANSI WARNINGS
4
16
ANSI PADDING
5
32
ANSI NULLS
6
64
ARITHABORT
7
128
ARITHIGNORE
8
256
QUOTED IDENTIFIER
9
512
NOCOUNT
10
1024
ANSI NULL DEFAULT ON
11
2048
ANSI NULL DEFAULT OFF
В этом примере поразрядная функция AND (&) проверяет, установлен ли шестой бит маски (десятичное число 64). Если бит установлен, следовательно, флаг ARITHABORT находится в состоянии ON. Пользовательские параметры конфигурации по умолчанию При подключении к SQL Server пользователь получает набор параметров по умолчанию. Значения по умолчанию задаются хранимой процедурой sp_configure, имеющей следующий синтаксис: sp_configure 'user options', маска Битовая маска определяет параметры, устанавливаемые по умолчанию. Если какой-то бит в маску не включен, это означает установку данного параметра в значение OFF. Биты и связанные с ними параметры перечислены в табл. 8.3. Даже несмотря на то, что флаги ANSI NULL DEFAULT ON и ANSI NULL DEFAULT OFF представлены разными битами, их нельзя установить одновременно. Совет Вы не сможете изменить значения по умолчанию для всех параметров конфигурации. Допускается
converted to PDF by BoJIoc
изменение только тех параметров, которые перечислены в табл. 8.3. Примеры экзаменационных вопросов Question 1 Which of the following SET statements can be used to stop SQL statements from affecting 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_limit 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_limit 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_LIMIT 0 отключает управление запросами, но не мешает их выполнению. Question 2 If the current default user options only have ANSI WARNINGS and NOCOUNT turned on, which of the following SQL statements will also set the QUOTED IDENTIFIER and IMPLICIT TRANSACTIONS as default options? • A. sp_configure 'user options', 778 • B. set default_option, 'quoted_identifier', on set default_option, 'implicit_transactions', on • C. sp_configure 'user options', +258 • D. set quoted_identifier on set implicit_transactions on • E. None of the above. Вопрос 2 Если из текущих пользовательских параметров по умолчанию установлены только ANSI WARNINGS и NOCOUNT, какая из перечисленных команд SQL также установит по умолчанию параметры QUOTED IDENTIFIER и IMPLICIT TRANSACTIONS? • A. sp_configure 'user options', 778 • B. set default_option, 'quoted_identifier', on set default_option, 'implicit_transactions', on • C. sp_configure 'user options', +258 • D. set quoted_identifier on set implicit_transactions on
converted to PDF by BoJIoc
• E. Ни одна из перечисленных. Правильный ответ — A. Он устанавливает параметры ANSI WARNINGS (8), NOCOUNT (512), QUOTED IDENTIFIER (256) и IMPLICIT TRANSACTIONS (2). Если сложить десятичные числа, соответствующие битам маски, в сумме получается 778. Ответ B неверен, поскольку команды SET DEFAULT_OPTION не существует. Ответ C тоже неверен; значение 258 устанавливает только флаги QUOTED IDENTIFIER (256) и IMPLICIT TRANSACTIONS (2), а команда sp_configure 'user options' устанавливает только те флаги, которые непосредственно заданы в маске. Все остальные флаги сбрасываются, поэтому ответ С сбросит флаги ANSI WARNINGS и NOCOUNT. Ответ D неверен, поскольку флаги QUOTED IDENTIFIER и IMPLICIT TRANSACTIONS устанавливаются только для текущего подключения. Question 3 Which of the following SQL statements will show you the value that all the current user options are set to? • • • • •
A. dbcc useroptions B. select @@options C. sp_configure D. sp_options E. None of the above.
Вопрос 3 Какая из следующих команд SQL выводит значения всех текущих пользовательских параметров? • • • • •
A. dbcc useroptions B. select @@options C. sp_configure D. sp_options E. Ни одна из перечисленных.
Правильный ответ — E; ни одна из приведенных команд не решает поставленную задачу. Ответ A неверен, поскольку он не возвращает значения всех пользовательских параметров. Команда DBCC USEROPTIONS не возвращает сведения о параметрах, имеющих значения по умолчанию, и описывает лишь часть параметров. Ответ B неверен, поскольку он выдает информацию о 12 параметрах, перечисленных в табл. 8.3. Ответ C неверен, поскольку он возвращает сведения о конфигурации сервера. Ответ D не является допустимой командой SQL и потому вообще не возвращает никакой информации. Question 4 The following statement set lock_timeout 0 will have which of the following effects when the connections has to wait for a lock? • • • •
A. The connection will perform the default behavior and wait until the locked resource is released. B. The connection will immediately return with an error stating that the lock time period has been exceeded. C. The SET statement is invalid, so it will have no effect on the lock. D. The connection will force the locked resources to immediately be released by the other connection.
Вопрос 4 Имеется следующая команда: set lock_timeout 0 Каковы будут ее последствия в случае, когда подключению приходится ждать снятия блокировки? • • • •
A. Подключение сохраняет стандартное поведение и ожидает, пока блокировка не будет снята. B. Подключение немедленно выходит из ожидания с ошибкой превышения тайм-аута блокировки. C. Команда SET неверна и потому не влияет на блокировку. D. Подключение заставит другое подключение немедленно освободить заблокированные ресурсы.
Правильный ответ — B; команда SET устанавливает нулевой интервал тайм-аута. Ответ A неверен, поскольку, в отличие от других команд, установка для параметра LOCK_TIMEOUT значения 0 не возвращает его к значению по умолчанию. Чтобы подключение бесконечно ожидало снятия блокировки, следует присвоить LOCK_TIMEOUT значение -1. Ответ C неверен, поскольку команда имеет правильный синтаксис SQL. Ответ D неверен, поскольку описанный в нем вариант не реализуется ни одной командой SQL. ГЛАВА 9
converted to PDF by BoJIoc
Индексы Ключевые термины • • • • • •
Индекс B-дерево (B-tree) Кластерный индекс Некластерный индекс Страница Уникальность
Необходимые знания и приемы • Выбор между кластерными и некластерными индексами • Переход от логической модели к физической • Выбор индексов для повышения быстродействия Индекс представляет собой физический объект базы данных, имеющий структуру b-дерева и используемый оптимизатором для ускорения доступа к данным по сравнению с линейным просмотром таблиц. Дополнительное преимущество индексов заключается в том, что они используются для обеспечения уникальности ключа, — это означает, что конкретные значения ключа в столбце не должны повторяться. В SQL Server существуют индексы двух типов: кластерные и некластерные. Кластерные и некластерные индексы SQL Server позволяет создавать кластерные или некластерные индексы. Определяя для таблицы кластерный индекс, вы тем самым приказываете серверу физически отсортировать данные в порядке индекса. Поскольку создание кластерного индекса приводит к физической сортировке данных, у каждой таблицы может быть лишь один кластерный индекс. Однако одного индекса обычно оказывается недостаточно. При работе с базой данных часто приходится обращаться к данным несколькими способами; наличие нескольких индексов упрощает эту задачу. Как упоминалось ранее, физическая сортировка данных возможна лишь в одном порядке, следовательно, таблица может иметь лишь один кластерный индекс. К счастью, в SQL Server существует механизм для выборки данных в порядке, отличном от порядка физической сортировки. Для этого используются некластерные индексы, позволяющие индексировать данные на основании значения ключа в каждой записи. SQL Server позволяет создать до 249 некластерных индексов. Между кластерными и некластерными индексами существует много различий. В следующих разделах рассматриваются механизмы реализации для каждого типа индексов. Механизмы реализации кластерных индексов Одна из важнейших особенностей кластерного индекса заключается в том, что один элемент индекса соответствует странице данных. Страница представляет собой физический блок для хранения данных объемом 8 Кбайт. После того как сервер определит страницу (посредством перебора индекса или просмотра таблицы), он находит на странице нужную запись. Поскольку кластерный индекс позволяет выйти на первую запись результата и организовать последующий перебор таблицы (вместо повторного перемещения по индексу) в поисках остальных записей без возврата на уровень индекса, кластерные индексы отлично подходят для выборки интервалов данных. К этой категории относятся внешние ключи (объединения), списки имен и любые другие совокупности данных с последовательными ключами. Внимание Для повышения быстродействия одна страница должна соответствовать как можно большему числу элементов индекса, а ширина индекса (количество байт на элемент) должна быть как можно меньше. В SQL Server индексы могут иметь длину до 900 байт и содержать до 16 столбцов данных, однако для оптимизации количества элементов индекса на страницу следует держать параметры индекса на как можно более низком уровне.
converted to PDF by BoJIoc
Кластерный индекс и данные также совместно используют запись в таблице sysindexes (присутствующей в каждой базе данных). Когда серверу требуется найти место, выделяемое для таблицы, он просматривает столбец segment таблицы sysindexes. Вероятно, вы уже встречались с b-деревьями при изучении структур данных. Как известно, b-деревья ускоряют поиск данных. Вы начинаете поиск с корня и продолжаете перемещаться по дереву до тех пор, пока не найдете нужный индекс. Рассмотрим структуру b-дерева для кластерного индекса. На рис. 9.1 изображен индекс для столбца last_name. Поиск элементов индекса всегда начинается с корневой страницы (root page), которая является отправной точкой для любых перемещений по дереву. Предположим, вы пытаетесь найти запись «Baker». При входе в индекс с корневой страницы выясняется, что элемент «Baker» находится между «Albert» и «Jones» (учтите, что в SQL Server понятие «между» включает обе границы интервала). Таким образом вы переходите за указателем «Albert» на следующий уровень индекса. Поиск элемента «Baker» продолжается; на этот раз он находится между «Albert» и «Brown». Указатель «Albert» переводит вас на следующий уровень индекса. В нашем примере следующий уровень индекса представляет собой страницу данных, на которой ищется запись(и) «Baker».
Рис. 9.1. Структура b-дерева для кластерного индекса Благодаря структуре кластерных индексов поиск в них обычно выполняется быстрее, чем при выборке произвольных записей для соответствующих некластерных индексов. Впрочем, это лишь условное правило. Оно в значительной степени зависит от количества указателей, необходимых для индекса каждого типа, а также от их ширины. Иногда кластерный индекс работает значительно быстрее, а иногда вообще не дает никакого выигрыша в скорости. Впрочем, для большинства запросов кластерные индексы работают быстрее некластерных. Конечно, при необходимости некластерный индекс все же дает выигрыш по сравнению с альтернативой — отсутствием какого-либо индекса. Учитывая сказанное, давайте подробнее познакомимся с механизмами реализации некластерных индексов. Механизмы реализации некластерных индексов Некластерные индексы имеют много общего с кластерными. Важнейшая особенность некластерного индекса заключается в том, что один элемент индекса приходится на одну запись. Когда запись будет идентифицирована, к ней происходит непосредственное обращение. Каждой записи в таблице назначается идентификатор. Поскольку в некластерном индексе каждый указатель соответствует одной записи, а также потому, что их указатели имеют больший размер, чем у кластерных индексов (поскольку содержат идентификатор записи, а не просто идентификатор страницы), некластерные индексы обычно занимают намного больше места. Рассмотрим структуру b-дерева для некластерного индекса (рис. 9.2). Предположим, у нас имеется некластерный индекс для столбца first_ name и мы хотим найти в нем все элементы «Amy».
converted to PDF by BoJIoc
Рис. 9.2. Структура b-дерева для некластерного индекса Как упоминалось выше, поиск в индексе всегда начинается с корневой страницы. На корневой странице выясняется, что «Amy» находится между элементами «Amy» и «George» (не забывайте о включении границ интервала). Указатель «Amy» ведет на следующий уровень индекса. На этот раз элемент «Amy» находится между «Amy» и «Bob», и мы снова переходим на следующий уровень. В данном примере следующий уровень является завершающим (листовым) уровнем дерева некластерного индекса. На листовом уровне с помощью указателей определяются записи результата. В нашем примере находятся два элемента индекса со значением «Amy». Обратите внимание: у вас имеются два указателя на записи, по одному для каждого найденного элемента, и для каждого элемента приходится запросить одну страницу. Совет Оптимизатор SQL Server использует специальную методику получения индекса, называемую наложением индексов (index covering). При этом листовой уровень некластерного индекса интерпретируется как уровень данных кластерного индекса. Наложение индексов способно кардинально ускорить некоторые типы запросов, для которых все необходимые данные находятся внутри индекса. Например, если записи (title, qty_sold) индексируются по столбцу title, то при выполнении команды SELECT title, sub(qty_sold) from titles group by title вся необходимая информация находится в индексе и серверу не придется заново читать базовую страницу. Наложение индексов часто используется для оптимизации и повышения быстродействия. Индексы не следует создавать до загрузки данных (кроме ситуаций, когда это неизбежно), поскольку в течение некоторого периода времени статистика индекса не будет соответствовать действительности. Кроме того, при создании индекса необходимо учитывать ряд других соображений. Создание индексов Для повышения быстродействия кластерный индекс следует создавать раньше некластерных индексов. Создание кластерного индекса требует физической сортировки записей, а некластерные индексы содержат указатели на страницы и записи, которые приходится модифицировать при перемещении записей. Внимание При создании кластерного индекса вам понадобится свободное место в базе данных в объеме отсортированной копии с индексом, или примерно 120–150% объема таблицы. Упрощенный вариант создания индекса имеет следующий синтаксис: CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX имя_индекса ON имя_таблицы (столбец [,...]) Команда содержит следующие параметры: • UNIQUE — запрещает наличие повторяющихся ключей в таблице. Обычно используется для столбцов первичного ключа. По умолчанию индекс не является уникальным. • CLUSTERED — создает кластерный индекс. • NONCLUSTERED — создает некластерный индекс (используется по умолчанию). • имя_индекса — определяет имя индекса, уникальное в пределах таблицы.
converted to PDF by BoJIoc
• столбец — определяет столбцы, включаемые в индекс. Индекс может содержать до 16 столбцов общим объемом до 900 байт. Следующая команда создает кластерный индекс с именем name_index: CREATE UNIQUE CLUSTERED index_name ON authors (au_lname, au_fname) Создается уникальный кластерный индекс для таблицы authors; индексация ведется сначала по столбцу au_lname, а затем — по столбцу au_fname. Другая команда создает некластерный индекс с именем fname_index: CREATE INDEX fname_index ON authors (au_fname, au_lname) На этот раз команда создает неуникальный, некластерный индекс для таблицы authors с индексацией по столбцам au_fname и au_lname. Внимание При создании кластерного индекса для таблицы, уже имеющей некластерные индексы, SQL Server автоматически строит заново все некластерные индексы, поскольку в процессе построения кластерного индекса изменяются страницы и позиции записей. Индексы принадлежат к числу объектов базы данных, и потому с ними периодически выполняются вспомогательные операции. Управление индексами Чтобы изменить индекс таблицы, необходимо удалить его и затем создать заново в соответствии с новым определением. Удаление и повторное создание индексов часто выполняется в рабочих базах данных для пересчета коэффициента заполнения или модификации индексных структур в случае их смещения или нарушения сбалансированности со временем. В этих ситуациях повторное создание индекса выполняется по соображениям быстродействия, а не вследствие необходимости. Команда удаления индекса из таблицы имеет следующий синтаксис: DROP INDEX имя_таблицы.имя_индекса Команда удаляет из базы данных всю структуру индекса, удаляет из системных таблиц все записи индекса и освобождает использовавшиеся страницы. Для получения информации о текущих индексах таблицы используются команды sp_help или sp_helpindex: sp_helpindex go index_name index_description index_keys ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------UPKCL_titleidind clustered, unique, primary key located on PRIMARY title_id titleind nonclustered located on PRIMARY title Совет Для управления свойствами индексов и получения о них информации можно воспользоваться утилитой SQL Enterprise Manager. Некоторые сведения об индексах
converted to PDF by BoJIoc
Перед тем как завершить главу, мы приводим некоторые факты об индексах, которые следует знать перед сдачей экзамена: • Если индекс определен как уникальный (UNIQUE), никакие две записи не могут иметь одинакового значения индекса (NULL также считается значением). Проверка уникальности осуществляется при создании индекса, а также при последующих операциях вставки и удаления. • Выбор индекса определяется соображениями быстродействия, а не первичным ключом или другими обстоятельствами. Нередко сгруппированный индекс используется в качестве первичного ключа. Такое решение не всегда обеспечивает оптимальное быстродействие. • Для оптимизации физического размещения данных желательно иметь сгруппированный индекс в большинстве таблиц. • С ростом количества индексов (свыше пяти) затраты, связанные с поддержанием индексов, становятся чрезмерными. • В информационных системах, используемых для поддержки управленческих решений (EIS, Executive Information Systems), где обновление практически не осуществляется в реальном времени, единственным ограничением количества индексов является объем дискового пространства. • В системах с оперативной обработкой транзакций (OLTP, Online Transaction Processing) обычно создается минимальное количество индексов, что позволяет ускорить выполнение команд UPDATE, INSERT и DELETE. Примеры экзаменационных вопросов Question 1 What are the characteristics of a clustered index? [Check all correct answers] • • • •
A. Physically sorts data in clustered index order. B. Tends to be smaller then nonclustered indexes. C. Should be clustered on primary keys. D. Tends to be one IO faster than a nonclustered index.
Вопрос 1 Какими особенностями обладает кластерный индекс? [Выберите все правильные ответы] • • • •
A. Физически сортирует данные в порядке кластерного индекса. B. Обычно занимает меньше места, чем некластерные индексы. C. Должен использовать те же столбцы, что и первичный ключ. D. Обычно работает быстрее некластерного индекса.
Правильные ответы — A, B и D, все они относятся к кластерным индексам. Ответ C является решением, принимаемым на стадии физического проектирования, и притом не всегда удачным. Question 2 What are the characteristics of a non-clustered index? [Check all correct answers] • • • • •
A. Physically sorts data in clustered index order. B. Tends to be small compared to clustered indexes. C. Should be clustered on primary keys. D. Tends to be one IO faster than a clustered index. E. None of the above.
Вопрос 2 Какими особенностями обладает некластерный индекс? [Выберите все правильные ответы] • • • • •
A. Физически сортирует данные в порядке некластерного индекса. B. Обычно занимает меньше места, чем кластерные индексы. C. Должен использовать те же столбцы, что и первичный ключ. D. Обычно работает на порядок быстрее кластерного индекса. E. Ни одно из перечисленных утверждений.
Правильный ответ — E. Ответы A, B и D неверны, поскольку все они относятся к кластерным индексам. Ответ C неверен, поскольку он соответствует решению стадии физического проектирования, а не характеристике индекса. Question 3 If you are designing an EIS (executive information system) or a DSS (decision support system), what is true about index selection? [Check all correct answers]
converted to PDF by BoJIoc
• • • • •
A. Avoid clustered indexes. B. Avoid nonclustered indexes. C. The number of indexes you choose is largely irrelevant. D. The number of indexes you choose should be minimal. E. You ignore, for the most part, update ramifications.
Вопрос 3 Если вы проектируете EIS (информационную поддержку принятия управленческих решений) или DSS (систему поддержки принятия решений), какие из следующих утверждений истинны по отношению к выбору индекса? [Выберите все правильные ответы] • • • • •
A. Следует избегать кластерных индексов. B. Следует избегать некластерных индексов. C. Количество выбираемых индексов почти ни на что не влияет. D. Количество выбираемых индексов должно быть минимальным. E. Влияние индексов на операции обновления в основном игнорируется.
Правильные ответы — C и E. Ответ C правилен, поскольку общее количество индексов отрицательно сказывается только на операциях обновления. Ответ A неверен — кластерные индексы ускоряют доступ к данным. Ответ B тоже неверен, поскольку в системе обработки запросов должно присутствовать несколько индексов, а кластерный индекс может быть только один. Ответ D неверен по тем же причинам, что и B. Ответ E правилен, поскольку ни в одной из указанных систем пользователи не выполняют немедленного обновления данных. Question 4 If you are designing an OLTP (online transaction processing) system, what is true about index selection? • • • • •
A. Avoid clustered indexes. B. Avoid nonclustered indexes. C. The number of indexes you choose is largely irrelevant. D. The number of indexes you choose should be minimal. E. You ignore, for the most part, update ramifications.
Вопрос 4 Если вы проектируете OLTP (систему оперативной обработки транзакций), какие из следующих утверждений истинны по отношению к выбору индекса? • • • • •
A. Следует избегать кластерных индексов. B. Следует избегать некластерных индексов. C. Количество выбираемых индексов почти ни на что не влияет. D. Количество выбираемых индексов должно быть минимальным. E. Влияние индексов на операции обновления в основном игнорируется.
Правильный ответ — D. Ответ A неверен, поскольку кластерные индексы ускоряют доступ к данным. Ответ B тоже неверен, поскольку в системе обработки запросов должно присутствовать несколько индексов, а кластерный индекс может быть только один. Неправилен и ответ C — общее количество индексов отрицательно сказывается на операциях обновления (обновление нескольких индексов требует больше времени). Ответ E тоже неверен, поскольку именно обновления имеют принципиальное значение в системах OLPT. Question 5 Which statement is true about clustered indexes? • • • • •
A. Clustered indexes are the quickest way to resolve any query. B. Clustered indexes are always faster than nonclustered indexes. C. Clustered indexes are always faster than table scans. D. None of the above. E. All of the above.
Вопрос 5 Какое утверждение истинно по отношению к кластерным индексам? • • • •
A. Кластерные индексы являются самым быстрым способом выполнения любого запроса. B. Кластерные индексы всегда работают быстрее некластерных. C. Кластерные индексы всегда работают быстрее, чем поиск в таблице. D. Ни одно из перечисленных утверждений.
converted to PDF by BoJIoc
• E. Все перечисленные утверждения. Правильный ответ — D. Ответ A неверен, поскольку наложение индексов или поиск в таблице может происходить быстрее, чем поиск по кластерному индексу. Ответ B неверен, поскольку кластерные индексы часто работают медленнее некластерных индексов с наложением. Ответ C неверен — если индекс не используется в запросе или при выборке всех данных, поиск в таблице выполняется быстрее. Question 6 Which statement is true about nonclustered indexes? • • • • •
A. Nonclustered indexes are the quickest way to resolve any query. B. Nonclustered indexes are always faster than clustered indexes. C. Nonclustered indexes are always faster than table scans. D. None of the above. E. All of the above.
Вопрос 6 Какое утверждение истинно по отношению к некластерным индексам? • • • • •
A. Некластерные индексы являются самым быстрым способом выполнения любого запроса. B. Некластерные индексы всегда работают быстрее кластерных. C. Некластерные индексы всегда работают быстрее, чем поиск в таблице. D. Ни одно из перечисленных утверждений. E. Все перечисленные утверждения.
Правильный ответ — D. Ответ A неверен, поскольку наложение индексов может работать быстрее кластерного индекса, но лишь в некоторых типах запросов. Ответ B неверен — некластерные индексы обычно работают медленнее кластерных. Наконец, ответ C тоже неверен; если объем выборки не ограничивается малым процентом данных, из-за затрат на перемещение по индексу и многочисленных обращений к логическим страницам поиск в таблице работает быстрее. ГЛАВА 10
Правила, представления и значения по умолчанию Ключевые термины • • • •
Связывание Правило Значение по умолчанию Представление
Необходимые знания и приемы • Создание правил и значений по умолчанию • Связывание правил и значений по умолчанию со столбцами • Создание и использование представлений Правила, представления и значения по умолчанию используются для ограничения или изменения режима доступа к данным таблиц SQL Server. С их помощью можно обеспечить соблюдение простых ограничений доменов; для более сложных доменных ограничений используются триггеры. Объекты всех трех типов (правила, представления, значения по умолчанию) могут существовать самостоятельно; они имеют смысл и без связывания с таблицами. Правила, значения по умолчанию и представления кратко определяются следующим образом: • Правило (rule) — автономный объект базы данных, который связывается со столбцами таблицы и ограничивает их домены. • Значение по умолчанию (default) — автономный объект базы данных, который связывается со столбцами таблицы в базе данных и предоставляет значение столбца в том случае, если столбец отсутствует в команде INSERT. • Представление (другое название – вид) (view) — автономный объект базы данных, содержащий предварительно проанализированное дерево запроса для команды SELECT.
converted to PDF by BoJIoc
В этой главе мы рассмотрим все три ключевых объекта баз данных. Правила Правило (rule) представляет собой выражение, вычисляемое при вставке или обновлении записи. Если это выражение принимает значение FALSE, команда INSERT или UPDATE, ставшая причиной нарушения, отменяется. Полный синтаксис создания правил выглядит следующим образом: CREATE RULE имя_правила @переменная оператор выражение [{AND|OR}...] Определение правил лучше всего рассматривать на примере: CREATE RULE AgeRule AS @age between 16 and 21 В этом примере переменная @age обозначает позицию, в которую подставляется значение столбца. Имя переменной не влияет на выполнение правила. В табл. 10.1 приведены результаты вставки различных значений в столбец age из приведенного примера. Обратите внимание: запись вставляется лишь в том случае, если вычисленное выражение равно TRUE (помните о том, что связка BETWEEN включает границы интервала). Для удаления правил используется команда DROP RULE: DROP RULE имя_правила Таблица 10.1. Результаты вставки при использовании правила AgeRule Значение Правило 6
FALSE
20
TRUE
30
FALSE
Удаляемое правило исчезает из базы данных. Чтобы использовать правило, необходимо ассоциировать его со столбцом. Этот процесс называется связыванием (binding). Связывание правила со столбцом Для связывания правил со столбцами в SQL Server применяется хранимая процедура sp_bindrule. Следующий фрагмент демонстрирует синтаксис связывания правил со столбцами таблицы: sp_bindrule имя_правила, 'имя_таблицы.имя_столбца' Примечание Имена таблиц и столбцов должны заключаться в апострофы или кавычки, поскольку аргумент содержит специальный символ — точку. В этом примере хранимая процедура sp_bindrule приказывает SQL Server установить правило с заданным именем для столбца. В результате в таблицу не удастся ввести никакие дополнительные данные, нарушающие это правило. Примечание При вызове процедуры sp_bindrule устанавливаемое правило не распространяется на данные, уже находящиеся в таблице.
converted to PDF by BoJIoc
После того как правило будет связано с таблицей, оно начинает действовать автоматически. Если новое правило накладывается поверх предыдущего, оно немедленно вступает в силу. Для разрыва связи правил со столбцами применяется процедура sp_unbindrule: sp_unbindrule 'имя_таблицы.имя_столбца' При вызове sp_unbindrule не нужно указывать имя правила, поскольку сервер уже знает, какое правило связано с данным столбцом. Установление и разрыв связи правил со столбцами или типами данных может осуществляться на соответствующих вкладках диалогового окна Rules Property (с помощью щелчка правой кнопкой мыши на правиле) утилиты Enterprise Manager. Ограничения для правил Для правил установлен целый ряд ограничений. Пользуясь правилами, помните следующее: • В правиле могут участвовать только константы, функции SQL Server и маски редактирования. Другими словами, правило ограничивается простыми вычислениями. • Правило не может выполнять просмотр таблицы. Если уровень сложности делового правила требует выполнения просмотра, следует воспользоваться триггером или декларативным ограничением. • В правилах не могут сравниваться столбцы таблиц. Если это неизбежно, воспользуйтесь ограничением. • С каждым столбцом может быть связано лишь одно правило. Чтобы установить второе правило, следует создать ограничение или объединить всю логику в триггер. • Если со столбцом связано некоторое правило, оно замещается новым устанавливаемым правилом. SQL Server рассматривает последовательность правил как стек единичной глубины. • Значения, используемые в правилах, должны быть совместимы с типом данных связанного столбца. При возникновении конфликта снижается быстродействие или возникают ошибки времени выполнения (в зависимости от того, существует ли возможность неявного преобразования типа данных). • Правила не применяются к данным, уже находящимся в таблице, но действуют при обновлении существующих данных. • Правило, связанное со столбцом или пользовательским типом данных, нельзя удалить. Предварительно необходимо разорвать связь правила со всеми столбцами и типами данных. • Правила не действуют при вводе данных с помощью BCP. Если вам необходимо использовать их, воспользуйтесь другой программой ввода (например, напишите собственную программу на C). • Microsoft не рекомендует пользоваться правилами. Правила оставлены в SQL Server лишь для обеспечения обратной совместимости. Вместо правил Microsoft предлагает использовать ограничения (см. главу 5). Значения по умолчанию, как и правила, являются самостоятельными объектами базы данных, которые могут связываться со столбцами. Значения по умолчанию Значения по умолчанию (default) используются для заполнения столбцов, отсутствующих в команде INSERT. Они создаются следующим образом: 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 не нужно указывать имя значения по умолчанию, поскольку сервер уже знает, какое значение по умолчанию связано с данной таблицей. Установление и разрыв связи значений по умолчанию со столбцами или типами данных могут осуществляться на соответствующих вкладках диалогового окна Defaults Property утилиты SQL Enterprise Manager. Ограничения для значений по умолчанию Значения по умолчанию имеют крайне ограниченную область применения и подчиняются следующим ограничениям: • В определении значения по умолчанию может использоваться лишь одна константа или функция SQL Server — логические возможности в них отсутствуют. • В значениях по умолчанию не могут использоваться механизмы принятия решений или просмотра таблицы. В таких ситуациях следует использовать триггеры. • С каждым столбцом может быть связано лишь одно значение по умолчанию. Это вполне логично, поскольку столбец не может иметь несколько значений по умолчанию. • При попытке задать второе значение по умолчанию для столбца, у которого уже имеется значение по умолчанию, выдается сообщение об ошибке. • Тип данных значения по умолчанию должен быть совместим с типом данных столбца. Проверка осуществляется во время выполнения, а не во время создания.
converted to PDF by BoJIoc
• Значения по умолчанию не применяются к данным, уже находящимся в таблице. Вместо этого следует написать команду UPDATE для модификации всех записей, у которых значение для данного столбца равно NULL. • Необходимо проследить за тем, чтобы значения по умолчанию не нарушали никаких правил или ограничений столбца. В противном случае любые операции вставки, использующие значение по умолчанию, не будут выполнены. • Значение по умолчанию применяется до применения правила (следовательно, если правило требует присутствия значения в столбце, значение по умолчанию поможет избежать ошибки при вставке). • Значения по умолчанию действуют при пакетном копировании, но не применяются к данным, уже находящимся в таблице. • Значение по умолчанию, связанное со столбцом или пользовательским типом данных, нельзя удалить. Предварительно необходимо разорвать связь значения по умолчанию со всеми столбцами и типами данных. Представления Представлением (view) называется логический «вид» физических данных, хранящихся в базе. Команда создания вида имеет следующий синтаксис: CREATE VIEW имя_представления [ (имя_столбца, ...) ] [WITH ENCRYPT] AS команда_select [ WITH CHECK OPTION ] С практической точки зрения представление является предварительно проанализированной командой SELECT, которая может интерпретироваться как таблица. Формально представление является не физической, а логической таблицей. Другими словами, представление изменяет способ восприятия данных, не изменяя базового объекта базы данных. Как вы вскоре убедитесь, в большинстве ситуаций (в том числе и в командах SELECT) представления работают так же, как обычные таблицы. С помощью представления можно ограничить доступ к записям и столбцам, скрыть объединения или упростить SQL-код посредством предварительного кодирования агрегатов, групп и других сложных конструкций. Если в команде новые имена столбцов не заданы явно, они наследуются из таблиц базы. Обратите внимание на то, что при использовании агрегатов имена столбцов задаются явно. Параметры команды управляют доступом к представлению со стороны пользователей. Например, параметр ENCRYPT запрещает доступ к SQL-коду представления всем, кроме его создателя. Другими словами, при использовании параметра ENCRYPT никто, кроме создателя представления, не сможет просмотреть базовый SQL-код. При установке параметра WITH CHECK OPTION вставка и обновление записей через представление возможны лишь в том случае, если эти записи могут быть получены выборкой из представления. Следующий пример создает представление с именем FLAuthorsView, которое выглядит и работает, как таблица: CREATE VIEW FLAuthorsView AS select from authors where state = 'FL' Из «таблицы» FLAuthors можно осуществлять выборку данных: SELECT * FROM FLAuthorsView Команда возвращает все столбцы и записи таблицы authors, для которых значение поля STATE равно 'FL'. При попытке вставить данные в представление с установленным параметром WITH CHECK OPTION операция INSERT завершится неудачей, если значение поля STATE вставляемой записи отлично от 'FL'. Иначе говоря, если команда INSERT нарушает представление, параметр WITH CHECK OPTION запрещает вставку. Представление, создаваемое следующей командой, содержит лишь два столбца из таблицы authors (au_lname и au_fname).
converted to PDF by BoJIoc
CREATE VIEW author_name AS SELECT last = au_lname, first = au_fname FROM authors Если в команде CREATE VIEW указаны названия столбцов, как в показанном примере, они становятся именами столбцов представления. Внимание Создавая представление, проследите за тем, чтобы имена столбцов соответствовали правилам выбора имен SQL Server. Следующая команда извлекает все записи и столбцы из представления author_name: SELECT * FROM author_name Представления удаляются командой DROP VIEW, имеющей следующий синтаксис: DROP VIEW имя_представления Следующая команда удаляет представление author_name: DROP VIEW author_name При удалении представления его определение удаляется из базы. Внимание Команду DROP нельзя отменить. К удалению объекта следует относиться осторожно, особенно если у вас нет возможности создать его заново. Представления могут использоваться для различных целей, связанных с защитой данных, от ограничения доступа к столбцам (вертикальная защита) до ограничения доступа к записям (горизонтальная защита). Представления: вертикальная защита данных С помощью представления можно ограничить доступ к некоторым столбцам таблицы. Для этого в список выборки включаются лишь те столбцы, к которым вы хотите разрешить доступ пользователям. В следующем примере пользователи могут получать данные трех из четырех столбцов таблицы titleauthor — они не имеют доступа к столбцу royalty: CREATE VIEW ta_limited as SELECT au_id, title_id, au_ord FROM titleauthor Работая с представлением ta_limited вместо таблицы, пользователь может выполнять любые действия со всеми данными, кроме столбца royalty. Результат выглядит следующим образом: au_id
title_id au_ord royalty
-----
-------- ------
----------
172-32-1176 PS3333 1
100
213-46-8915 BU1032 2
40
213-46-8915 BU2075 1
100
... 998-72-3567 PS2106 1
100
Теперь можно разрешить пользователю выборку данных из этого представления, не предоставляя права выборки из базовой таблицы. Представление ta_limited может использоваться для объединения таблиц titles и authors, как показано ниже: SELECT * FROM authors a, titles t, ta_limited ta WHERE a.au_id = ta.au_id AND t.title_id = ta.title_id
converted to PDF by BoJIoc
Команда выбирает столбцы с именами авторов и названиями книг с помощью представления ta_limited. При этом столбец royalty остается невидимым для пользователя. Вы можете предоставить доступ к представлению, но не к базовой таблице, если вам принадлежат и представление, и таблица. Такая методика может использоваться для ограничения доступа к некоторым частям таблицы без защиты на уровне столбцов, которая сделала бы невозможной выполнение команд SELECT *. Представления: горизонтальная защита данных Представления также могут использоваться для ограничения доступа к отдельным записям базовой таблицы. Секция WHERE ограничивает записи, входящие в представление. Например, следующее представление ограничивает пользователю доступ к записям издателей, находящихся в Калифорнии: CREATE VIEW cal_publishers AS SELECT * FROM publishers WHERE state = "CA" Команда SELECT для получения всех записей и столбцов представления, созданного в предыдущем фрагменте, выглядит следующим образом: SELECT * FROM cal_publishers Обратите внимание: команда ничем не отличается от обычной выборки из таблицы. Упрощение SQL-кода с помощью представлений Представления используются для упрощения запросов, а также для маскировки сложных объединений и денормализованных таблиц от пользователя. Например, следующий фрагмент создает представление для работы с трехсторонним объединением: CREATE VIEW titles_and_authors AS SELECT title, au_lname, au_fname, type FROM titles t, ta_limited ta, authors a WHERE t.title_id = ta.title_id AND a.au_id = ta.au_id Новое представление содержит созданное выше представление ta_limited. Следующая команда выбирает все записи и столбцы из представления titles_and_authors: SELECT * FROM titles_and_authors WHERE type = "business" Представления и команды INSERT, UPDATE, DELETE SQL Server разрешает вставлять, удалять и обновлять данные в представлениях. Команда INSERT добавляет записи в базовую таблицу. Команды UPDATE и DELETE модифицируют записи базовой таблицы. Например, следующий фрагмент удаляет записи из базовой таблицы через представление: DELETE author_name WHERE last = "Smith" AND first = "Joseph" UPDATE cal_publishers SET pub_name = "Joe's Books and Magazines" WHERE pub_id = "1389" Каждая из приведенных команд модифицирует базовую таблицу. Если представление содержит столбцы из нескольких таблиц, вы не сможете удалить записи из представления или обновить столбцы нескольких таблиц в одной команде UPDATE. Например, следующая команда недопустима:
converted to PDF by BoJIoc
UPDATE titles_and_authors SET type = "mod_cook", au_fname = "Mary" WHERE title = "The Gourmet Microwave" Из-за подобных ограничений могут возникнуть проблемы, поскольку одна команда может модифицировать лишь одну из базовых таблиц. Проблема решается поочередным обновлением таблиц: UPDATE titles_and_authors SET type = "mod_cook" WHERE title = "The Gourmet Microwave" UPDATE titles_and_authors SET au_fname = "Mary" WHERE title = "The Gourmet Microwave" Вставка в представлениях допускается лишь при условии, что все столбцы базовой таблицы, не включенные в представление, допускают значения NULL или для них определены значения по умолчанию. Если представление содержит объединение, вставка допускается при условии, что все вставляемые столбцы принадлежат одной базовой таблице. Таким образом, вы не можете обновлять, удалять или вставлять данные в представлении с секцией DISTINCT, поскольку DISTINCT создает временную рабочую таблицу. В такой ситуации вместо настоящей базовой таблицы будет модифицироваться временная таблица. WITH CHECK OPTION В предыдущих версиях SQL Server пользователь мог посредством вставки или обновления создать запись, которая не могла быть выбрана из этого представления командой SELECT. Ниже приведен пример создания «невидимой» записи: INSERT INTO cal_publishers (pub_id, pub_name, city, state) VALUES ("1234", "Joe's Books", "Canton", "OH") /* Создается «невидимая» запись */ UPDATE cal_publishers SET state = "OH" В SQL Server 7 флаг WITH CHECK OPTION запрещает пользователям вставку и обновление записей, не входящих в представление. Команда CREATE VIEW с параметром WITH CHECK OPTION имеет следующий синтаксис: CREATE VIEW имя_представления [ (имя_столбца, ...) ] AS команды_select [WITH CHECK OPTION] В следующем представлении параметр WITH CHECK OPTION разрешает пользователям выборку, модификацию и вставку лишь тех записей, которые входят в представление: CREATE VIEW cal_publishers ASt SELECT *t FROM publisherst WHERE state = "CA"t WITH CHECK OPTION Получение информации о представлениях Хранимая процедура sp_help выводит информацию обо всех объектах базы данных, включая представления и таблицы. К сожалению, список может оказаться необъятным. Чтобы ограничиться списком представлений, определенным в таблицах базы данных, воспользуйтесь командой SELECT:
converted to PDF by BoJIoc
SELECT name FROM sysobjects WHERE type = "V" Список столбцов, входящих в представление, выводится командой вида sp_help имя_представления Чтобы просмотреть SQL-код, создавший представление, воспользуйтесь командой sp_helptext имя_представления ALTER VIEW Для модификации представлений используется команда ALTER VIEW. Команда модифицирует существующее представление и не влияет на зависящие от него хранимые процедуры или триггеры, а также не изменяет прав пользователей. В прежних версиях единственным способом модификации представления было его удаление с повторным созданием. При этом менялся идентификатор объекта, что приводило к перекомпиляции хранимых процедур и триггеров, зависящих от представления. Кроме того, приходилось заново предоставлять права пользователям, поскольку при удалении объекта права терялись. Команда ALTER VIEW имеет следующий синтаксис: ALTER VIEW имя_представления [(столбец [, ...n])] [WITH ENCRYPTION] AS команда_select [WITH CHECK OPTION] Команда ALTER VIEW принадлежит к числу новых возможностей SQL Server 7 и позволяет модифицировать представления без их удаления и повторного создания. Аргументы ALTER VIEW имеют следующий смысл: • n — заполнитель, обозначающий n-кратное повторение аргумента столбец. • ENCRYPTION — шифрует элементы syscomments, содержащие текст команды CREATE VIEW. Это означает, что никто из пользователей, кроме владельца объекта, не сможет обратиться к SQL-коду представления. • CHECK OPTION — производит проверку соответствия модифицированных данных критериям команды SELECT в определении представления. Примечание Права доступа к столбцам сохраняются лишь в том случае, если столбцы сохраняют одинаковые имена до и после выполнения команды ALTER VIEW. Если представление было создано с флагами WITH ENCRYPTION или WITH CHECK OPTION, эти флаги остаются в модифицированном представлении лишь в том случае, если они присутствуют в команде ALTER VIEW. Другими словами, вы можете случайно отменить флаги WITH ENCRYPTION или WITH CHECK OPTION, если забудете включить их в ALTER VIEW. Представление, используемое в настоящий момент, модифицировать нельзя. При попытке модификации Microsoft SQL Server устанавливает для представления монопольную (exclusive) блокировку. Если блокировка была предоставлена (что означает отсутствие активных пользователей у представления), SQL Server удаляет все копии представления из кэша процедур. Все существующие планы выполнения процедур, содержащие ссылки на представление, остаются в кэше, однако при следующем вызове они автоматически перекомпилируются. Наконец, по умолчанию право выполнения ALTER VIEW предоставляется членам db_owner и db_ddladmin, а также владельцу представления. Это право не может передаваться. Некоторые сведения о представлениях Вопросы, связанные с представлениями, часто встречаются на экзамене. Ниже перечислены наиболее важные факты, которые следует запомнить:
converted to PDF by BoJIoc
• Представления могут создаваться только в той базе данных, которую вы используете, хотя к представлениям можно обращаться и из других баз — для этого необходимо ввести полностью определенное имя представления. • Вы должны указать имя для каждого столбца в представлении, если выполняется одно из следующих условий: · Любой столбец представления является производным от константы, встроенной функций или математического выражения. Обратите внимание на возможность присвоения имен столбцам в команде SELECT. · Два и более столбцов таблицы имеют одинаковые имена. · Вы хотите переименовать столбец. • Представление может содержать до 1024 столбцов. В предыдущих версиях максимальное количество столбцов было равно 255. • При обновлении столбцов записи через представление каждая команда UPDATE должна обновлять лишь одну базовую таблицу (она может ссылаться на несколько таблиц, но должна обновлять только одну). • Представления не могут содержать следующие конструкции: · SELECT INTO; · COMPUTE; · ORDER BY (однако секция ORDER BY может использоваться при выборке из представления); · Ссылки на временные таблицы. Внимание Представления могут содержать агрегатные функции и группировки, объединения, другие представления, секцию DISTINCT и союзы (последняя возможность появилась относительно недавно). Примеры экзаменационных вопросов Question 1 How are business rules currently enforced at the database level? [Check all correct answers] • • • • •
A. By defining a rule at the database level. B. By defining a default. C. By using declarative constraints. D. This has to be handled programmatically. E. None of the above.
Вопрос 1 Каким образом в настоящее время обеспечивается выполнение деловых правил на уровне базы данных? [Выберите все правильные ответы] • • • • •
A. Определением правила на уровне базы данных. B. Определением значения по умолчанию. C. Посредством использования декларативных ограничений. D. Задача решается на программном уровне. E. Ни одним из перечисленных способов.
Правильные ответы — A и C, хотя предпочтительным является ответ C. Ответ B неверен, поскольку значения по умолчанию не обеспечивают выполнения деловых правил. Ответ D неверен, поскольку вы можете создать правило. Ответ E неверен, поскольку среди ответов присутствует правильный. Question 2 What step is necessary to instruct the server to use a rule for a row? • • • • •
A. The create rule statement B. The bind rule statement C. sp_bindrule D. sp_bindefault E. None of the above.
converted to PDF by BoJIoc
Вопрос 2 Что необходимо сделать для того, чтобы сервер использовал правило для записей? • • • • •
A. Команда create rule B. Команда bind rule C. sp_bindrule D. sp_bindefault E. Ни один из перечисленных ответов.
Правильный ответ — E, поскольку выполнение правила обеспечивается не для записей, а для столбцов в границах роли. Ответ B неверен, поскольку команды BIND RULE не существует. Ответ D также неверен, поскольку он относится к значениям по умолчанию. Question 3 How many rules can be enforced on a row in a table? • • • • •
A. None. B. One per table. C. One per column in the table. D. 16. E. None of the above.
Вопрос 3 Сколько правил может быть установлено в таблице? • • • • •
A. Ни одного. B. Одно на каждую таблицу. C. Одно на каждый столбец таблицы. D. 16. E. Ни один из перечисленных ответов.
Правильный ответ — C. Question 4 How long does a rule persist in а database? • • • • •
A. Until the session is terminated. B. Until the rule is dropped. C. Until a new rule is created. D. Until a constraint replaces the rule. E. None of the above.
Вопрос 4 Как долго правило продолжает существовать в базе данных? • • • • •
A. До завершения сеанса. B. До удаления правила. C. До создания нового правила. D. До замены правила ограничением. E. Ни один из перечисленных ответов.
Правильный ответ — B, поскольку правило является хранимым объектом базы данных. Question 5 A rule can be dropped: • • • • •
A. By the owner of the rule. B. By using the drop rule statement. C. If it is not bound to a database object. D. All of the above. E. None of the above.
Вопрос 5 Правило может быть удалено: • A. Владельцем правила. • B. Командой drop rule.
converted to PDF by BoJIoc
• C. Если оно не связано с объектом базы данных. • D. Все перечисленные ответы. • E. Ни один из перечисленных ответов. Правильный ответ — D. Question 6 A default is used [Check all correct answers]: • • • • •
A. To modify existing data in a database. B. To place a value in a column that is inserted null. C. To place a value in the column that was included in the column list in the insert statement. D. Commonly in current MS SQL applications. E. None of the above.
Вопрос 6 Значения по умолчанию используются [Выберите все правильные ответы]: • • • • •
A. Для модификации существующих данных в базе. B. Для включения значений в столбец, для которого при вставке указано значение null. C. Для включения значений в столбец, включенный в список столбцов команды insert. D. Обычно в современных приложениях MS SQL. E. Ни один из перечисленных ответов.
Правильный ответ — B. Ответ A неверен, поскольку значение по умолчанию не влияет на существующие данные. Ответ C неверен, поскольку значение по умолчанию действует на столбцы, отсутствующие в списке столбцов. Ответ D тоже неверен — Microsoft не рекомендует использовать отдельные пользовательские объекты. Ответ E неверен, в списке присутствует правильный ответ. Question 7 The preferred method of defaulting a value in a column is: • • • • •
A. To use a constraint. B. To use a default. C. Write the application code correctly. D. None of the above. E. All of the above.
Вопрос 7 Предпочтительным способом определения значения по умолчанию для столбца является: • • • • •
A. Использование ограничения. B. Использование объекта DEFAULT. C. Правильное написание кода приложения. D. Ни один из перечисленных ответов. E. Все перечисленные ответы.
Правильный ответ — A. Microsoft в настоящее время рекомендует пользоваться именно этим способом. Ответ D неверен, поскольку в списке присутствует правильный ответ. Ответ E неверен, поскольку ответы B и C не принадлежат к числу рекомендуемых способов определения значений по умолчанию в столбцах. Question 8 If you bind a rule or default over an existing rule or default: • • • • •
A. You will get a runtime error. B. The first rule or default to be bound will take effect. C. The last rule or default to be bound will take effect. D. The action is different for rules and defaults. E. None of the above.
Вопрос 8 Если вы связываете правило или значение по умолчанию поверх существующего правила или значения по умолчанию: • A. Вы получите ошибку времени выполнения. • B. Действует правило или значение по умолчанию, которое было связано первым. • C. Действует правило или значение по умолчанию, которое было связано последним.
converted to PDF by BoJIoc
• D. Для правил и значений по умолчанию будут выполнены разные действия. • E. Ни один из перечисленных ответов. Правильный ответ — C. В столбце может существовать лишь одно правило или значение по умолчанию, а именно то, которое было определено последним. Ответ E неверен, поскольку правильный ответ присутствует в списке. Question 9 A view can be used: [Check all correct answers] • • • • •
A. To simplify code. B. As horizontal security. C. As vertical security. D. To hide data. E. To hide underlying database changes.
Вопрос 9 Представление может использоваться: [Выберите все правильные ответы] • • • • •
A. Для упрощения кода. B. Как средство горизонтальной защиты. C. Как средство вертикальной защиты. D. Для маскировки данных. E. Для маскировки изменений в базе данных.
Правильные ответы — A, B, C, D и E. Во всех ответах даны правильные применения представлений. Question 10 You can insert rows into a view: [Check all correct answers] • • • • •
A. If all the underlying tables are being updated. B. If only one underlying table is being updated. C. If the With Check Option is set and the inserted row does not violate the view’s select. D. If the With Check Option is set and the inserted row violates the view’s select. E. You cannot insert rows into a view.
Вопрос 10 Вы можете вставлять записи в представление: [Выберите все правильные ответы] • A. Если обновляются все базовые таблицы. • B. Если обновляется лишь одна базовая таблица. • C. Если флаг With Check Option установлен и вставляемая запись не нарушает критерия выборки представления. • D. Если флаг With Check Option установлен и вставляемая запись нарушает критерий выборки представления. • E. В представление нельзя вставлять записи. Правильные ответы — B и C. Именно в них описаны условия вставки записей через представление. Ответ A неверен — справедливо противоположное утверждение. То же самое относится и к ответу D. Ответ E неверен, подобных ограничений не существует. ГЛАВА 11
Программирование на Transact-SQL Ключевые термины • • • • •
Пакет Комментарии Курсор Хранимая процедура Переменная
Необходимые знания и приемы • Программирование на Transact-SQL
converted to PDF by BoJIoc
• Обработка сообщений • Обработка ошибок Язык SQL стандарта ANSI позволяет создавать и модифицировать базы данных и читать из них информацию. Для программирования этого недостаточно. Программирование требует дополнительных возможностей, от управления потоком команд до модульности. По этой причине SQL Server содержит расширенную версию SQL, которая называется Transact-SQL, или TSQL. В этой главе представлены различные компоненты языка T-SQL, от определений пакетов до отличительных особенностей конкретных команд. Хотя вы не найдете в ней подробного описания каждой команды T-SQL, многочисленные примеры помогут лучше освоить материал. Мы рассмотрим следующие конструкции: • • • • • •
пакеты; комментарии; переменные; команды TSQL; курсоры; хранимые процедуры.
Пакеты Пакет (batch) представляет собой группу команд, передаваемых от клиента к серверу. Пакеты являются основой для программ SQL Server. После подключения вы начинаете передавать пакеты SQL Server. Транзакция (см. главу 13) может включать в себя несколько пакетов. Пакет содержит одну или несколько команд SQL. Например, следующий пакет состоит из двух команд SELECT: SELECT * FROM authors SELECT * FROM authors Обе команды передаются серверу и выполняются им, а их результаты вместе возвращаются клиенту. Команды пакета анализируются, компилируются и выполняются как единая группа. Если сервер обнаруживает синтаксические ошибки, весь пакет не может быть выполнен. Наконец, если вызов хранимой процедуры не является первой командой пакета, перед именем процедуры должно стоять ключевое слово exec. Например: exec sp_who Комментарии Любой хороший программист знает, что программа нуждается в комментариях — без них сопровождение программы превращается в исключительно сложную задачу. Существует несколько основных вариантов записи комментариев. Комментарии бывают однострочными и многострочными. Как правило, многострочные комментарии используются в «шапке» программы — краткое описание, версия и т. д. Однострочные комментарии обычно комментируют отдельную строку программного кода. Они располагаются в отдельной строке или следуют за командой программы. Ниже приведены примеры многострочных и однострочных комментариев: /* Многострочные комментарии **используются для различных целей */ -- Однострочный комментарий может находиться в отдельной строке select getdate() -- или продолжать строку команды Совет Если ваша программа выдает ошибки, для которых трудно найти логическое объяснение, проверьте завершение всех многострочных комментариев. Переменные SQL Server поддерживает два типа переменных — локальные и глобальные. Локальные переменные существуют только в пределах сеанса, во время которого они были созданы. Глобальные переменные
converted to PDF by BoJIoc
(которые Microsoft постепенно преобразует в функции) используются для получения информации о сервере в целом. Локальные переменные Для хранения временной информации, которую нет смысла заносить в таблицы, следует использовать локальные переменные. Локальные переменные объявляются командой DECLARE и существуют лишь во время выполнения пакета. Следовательно, после завершения пакета вы уже не сможете обратиться к значению переменной. Значения переменных задаются командой SELECT или SET; если значение присваивается одной переменной, эти команды эквивалентны. Команда SELECT может присвоить значения сразу нескольким переменным. В следующем примере команда DECLARE объявляет две переменные. Значение одной переменной задается командой SELECT, а значение другой — командой SET. Затем программа читает значения обеих переменных: DECLARE @today datetime, @counter int SELECT @counter = 1 SET @today = getdate() SELECT @counter, @today Результатом выполнения пакета является вывод значений переменных. Встроенная функция getdate() возвращает текущие дату и время. Совет Для повышения эффективности следует присваивать значения нескольких переменных в одной команде SELECT и объявлять несколько переменных в одной команде DECLARE. Microsoft рекомендует для присваивания переменным констант использовать команду SET вместо SELECT. Команда SET работает немного быстрее. Глобальные переменные Глобальные переменные используются сервером для отслеживания информации уровня сервера или данных, относящихся к конкретному сеансу. Для глобальных переменных невозможно явное присваивание или объявление. В табл. 11.1 представлены некоторые глобальные переменные, которые могут вам встретиться как на экзамене, так и на практике. В следующем примере глобальная переменная @@VERSION проверяет версию SQL Server: SELECT @@VERSION GO ---------------------------------------------------------------Microsoft SQL Server 7.00 – 7.00.517 (Intel X86) Jun 19 1998 17:06:54 Copyright (c) 1988-1998 Microsoft Corporation Enterprise version on Windows NT Таблица 11.1. Некоторые глобальные переменные Глобальная переменная Описание @@ROWCOUNT
Количество записей, обработанных предыдущей командой.
@@ERROR
Код ошибки для последней команды SQL.
@@TRANCOUNT
Уровень вложенности транзакции.
@@SERVERNAME
Имя локального сервера
@@VERSION
Номер версии SQL Server, дата и тип процессора
@@SPID
Идентификатор текущего процесса
@@IDENTITY
Последнее значение счетчика, используемое в операции вставки
converted to PDF by BoJIoc
@@NESTLEVEL
Количество уровней вложенности для хранимой процедуры или триггера
@@FETCH_STATUS
Статус предыдущей команды выборки для курсора
Команды TSQL Transact-SQL (TSQL) дополняет стандарт ANSI, не обладающий возможностями обработки сообщений или управления потоком команд. В сущности, все ваши программы будут написаны именно на TSQL. Команда PRINT Команда PRINT передает сообщения длиной до 1024 байт обработчику сообщений клиента. Не путайте обработчики сообщений с обработчиками ошибок. Как правило, обработчик сообщения выглядит, как раскрывающееся окно интерфейсного модуля, а обработчик ошибок изменяет порядок выполнения команд программы. Следующая команда PRINT просто передает клиентскому обработчику сообщения текст, заключенный в кавычки: PRINT "This is a message" В следующем фрагменте команда PRINT выводит результат конкатенации строки «Hello» с именем пользователя, полученным от сервера: /* Передать обработчику сообщения переменную ** Переменная должна относиться к символьному типу */ DECLARE @msg VARCHAR(30) SELECT @msg = "Hello " + user_name() PRINT @msg print convert(char,123) RAISERROR Команда RAISERROR передает состояния, коды и сообщения ошибок на программном уровне. Длина стандартных сообщений не может превышать 8000 символов, а длина незапланированных сообщений — 14 000 символов. Синтаксис RAISERROR, показанный в следующем фрагменте, позволяет использовать стандартное сообщение или определить новое сообщение непосредственно в команде: RAISERROR ({код_ошибки | символьная_строка}, код_серьезности, состояние [, список_аргументов]) [WITH параметр] Коды ошибок должны быть больше 50 и меньше 2 147 483 647. Незапланированные сообщения (ad hoc messages) автоматически инициируют ошибку с кодом 50 000. Код ошибки идентифицирует сообщение из таблицы sysmessages. Следующий пример генерирует незапланированное сообщение со списком аргументов: DECLARE @tab_name VARCHAR(30), @count int SELECT @tab_name = "authors" SELECT @count = count(*) FROM authors RAISERROR ("%d rows exist in table '%s'". 16, 1, @count, @tab_name) /* То же самое, но код имеет длину 10 символов, ** выравнивается по левому краю и выводится с префиксом 0x */ RAISERROR ("%-#10x rows exist in table '%s'", 16, 1, @count, @tab_name) Сообщения об ошибках можно (и должно) стандартизировать и использовать многократно. Для этого сообщения следует определять в базе данных. Синтаксис включения сообщения в базу данных выглядит следующим образом:
converted to PDF by BoJIoc
sp_addmessage код_сообщения, важность, текст_сообщения [, язык[, [FALSE|TRUE] [, REPLACE]]] Здесь важность совпадает со значением код_важности для RAISERROR, а текст_сообщения содержит до 255 символов и может содержать заполнители. Флаг FALSE|TRUE определяет, должно ли сообщение записываться в журнал ошибок SQL Server. По умолчанию язык равен NULL, что по умолчанию совпадает с языком текущего сеанса. Наконец, параметр REPLACE заменяет существующее сообщение с указанным кодом. Добавленное сообщение можно удалить хранимой процедурой sp_ dropmessage или модифицировать сохраненной процедурой sp_altermessage: sp_dropmessage код_сообщения,язык sp_altermessage код_сообщения, WITH_LOG, {TRUE | FALSE} Следующий пример объявляет и использует хранимое сообщение: EXEC sp_addmessage 52345, 16, 'Row not found' EXEC sp_addmessage 55555, "No rows exist in table '%1!'" /* Чтобы использовать сообщение, вызовите RAISERROR ** без указания строки сообщения */ RAISERROR (52345, 16, 1) DECLARE @tab_name VARCHAR(30) SELECT @tab_name = "authors" RAISERROR (55555, 16, 1, @tab_name) /* Удалить пользовательское сообщение */ EXEC sp_dropmessage 66666 Для управления сообщениями можно воспользоваться утилитой SQL Enterprise Manager — выберите команду Tools|Manage SQL Server Messages из меню Server. Перейдите на вкладку Message и нажмите кнопку New (рис. 11.1). Команды условного выполнения Термин «условное выполнение» означает, что команды выполняются лишь в случае истинности некоторого критерия (условия). IF…ELSE Конструкция IF…ELSE определяет команды, выполнение которых зависит от некоторого критерия. Она присутствует в большинстве языков программирования. Команда IF…ELSE имеет следующий синтаксис: IF логическое_выражение {команда | блок_команд} [ELSE {команда | блок_команд}
converted to PDF by BoJIoc
Рис. 11.1. Управление сообщениями в SQL Enterprise Manager В следующем примере команда IF…ELSE проверяет среднюю цену книг, посвященных бизнесу, и возвращает соответствующий текст: IF (SELECT AVG(price) FROM titles WHERE type = "business") > $19.95 PRINT "The average price of business books is greater than $19.95" ELSE PRINT "The average price of business books is less than $19.95" Функциональным подмножеством команды IF является проверка существования IF EXISTS. IF EXISTS Команда IF EXISTS позволяет узнать, существуют ли какие-либо экземпляры, определяемые условием. Команда IF EXISTS заменяет конструкцию COUNT(*) > 0 при проверке существования, поскольку при обнаружении первой совпадающей записи обработка команды SELECT прекращается. Команда из следующего примера определяет, присутствуют ли в таблице данные об авторах по фамилии Smith. Программа не подсчитывает количество записей, а всего лишь проверяет факт их существования: DECLARE @lname VARCHAR(40) SELECT @kname = "Smith" IF EXISTS (SELECT * FROM titles WHERE au_lname = @lname) PRINT "Author's name found !" ELSE PRINT "Author's name not found !" Если логическое выражение содержит команду SELECT, эта команда должна быть заключена в скобки. Количество уровней вложенности для команды IF не ограничивается. Команда IF EXISTS часто используется при проверке ссылочной целостности. Внимание
converted to PDF by BoJIoc
Условие IF распространяется ровно на одну команду или блок команд. Из-за этого часто возникают трудноуловимые ошибки. BEGIN…END Конструкция BEGIN…END используется для создания блока команд. Все, что находится между BEGIN и END, является частью блока. Следующий пример проверяет, существует ли в таблице запись автора с фамилией Smith, и выполняет некоторые действия в зависимости от результата проверки: IF EXISTS (SELECT * FROM authors) WHERE au_lname = "Smith" BEGIN PRINT "Smith exists" EXEC found_proc END ELSE BEGIN PRINT "Smith not found" EXEC not_found_proc END Если запись Smith существует, выполняется процедура found_proc, а если не существует — процедура not_found_proc. CASE Для тех ситуаций, когда проверка нескольких условий требует многих команд IF, в 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 SUBSTRING (title, 1, 20) CASE type WHEN 'popular_comp' THEN ' Computer book' WHEN 'mod_cook' THEN ' Cook book' WHEN 'trad_cook' THEN ' Cook book' ELSE ' Unknown book' END, 'Sales are ' + CASE WHEN ytd_sales < 5000 THEN "Poor" WHEN ytd_sales between 5001 AND 10000 THEN "Good" WHEN ytd_sales > 10000 THEN "Awesome" ELSE "Unknown" END FROM titles -------------------- -------------- ---------------The Busy Executive's Unknown book Sales are Poor Cooking with Compute Unknown book Sales are Poor
converted to PDF by BoJIoc
You can Combat Compu Unknown book Sales are Awesome Straight Talk About Unknown book Sales are Poor Silicon Valley Gastr Cook book Sales are Poor The Gourmet Microwav Cook book Sales are Awesome The Psychology of Co Unknown book Sales are unknown But it is User Frien Computer book Sales are Good Secrets of Silicon V Computer book Sales are Poor Net Etiquette Computer book Sales are unknown Computer Phobic AND Unknown book Sales are Poor Is Anger the Enemy? Unknown book Sales are Poor Life Without Fear Unknown book Sales are Poor Prolonged Data Depri Unknown book Sales are Poor Emotional Security: Unknown book Sales are Poor Onions, Leeks, and G Cook book Sales are Poor Fifty Years in Bucki Cook book Sales are Awesome Sushi, Anyone? Cook book Sales are Poor Без конструкции CASE в этом примере пришлось бы использовать временную таблицу. Циклы WHILE Конструкция WHILE используется для многократного выполнения команд. Команда WHILE вычисляет условие цикла и, если оно равно TRUE, выполняет команду или блок. Команда WHILE имеет следующий синтаксис: WHILE логическое_условие [{команда | блок_команд}] [BREAK] [CONTINUE] Команда BREAK безусловно завершает выполнение цикла WHILE и продолжает выполнение с первой команды после END. Команда CONTINUE заново вычисляет логическое условие и, если оно равно TRUE, продолжает выполнение с начала цикла. В следующем примере цикл выполняется до тех пор, пока средняя цена остается меньшей $25: WHILE (SELECT AVG(price) FROM titles) < $25 BEGIN UPDATE titles SET price = price * 1.05 /* Если количество книг с ценой < $15 меньше 10, ** продолжить обработку */ IF (SELECT COUNT(*) FROM titles WHERE price < $15) < 10 CONTINUE ELSE /* Если максимальная цена одной книги превышает ** $50, выйти из цикла */ IF (SELECT MAX(price) FROM titles) > $50 BREAK END Внимание Обратите внимание на знак доллара ($) в программе. Он упрощает идентификацию аргументов денежного типа при анализе команды. GOTO Существует и другой способ многократного повторения вычислений — с помощью команды GOTO. Однако учтите, что применение GOTO может вызвать насмешки у других программистов (эта команда вышла из моды много лет назад). Пример использования GOTO показан ниже:
converted to PDF by BoJIoc
DECLARE @counter TINYINT SELECT @counter = 0 top: SELECT @counter = @counter + 1 PRINT "Structured programming scoffs at the goto" IF @counter <= 10 GOTO top Строка top: является меткой. Если значение счетчика меньше либо равно 10, управление снова передается метке top:. WAITFOR Команда WAITFOR переводит запрос в состояние ожидания в течение некоторого интервала или до наступления заданного времени (и потому называется обработчиком события). Команда WAITFOR имеет следующий синтаксис: WAITFOR {DELAY "время" | TIME "время"} Параметр DELAY заставляет пакет или процесс сделать паузу заданной длины (максимальное значение — 24 часа). Если в команде указан параметр TIME, процесс приостанавливается до наступления заданного времени. В обоих случаях время задается в формате hh:mi:ss — дату задать нельзя. Следующие примеры описаны во встроенных комментариях: /* Пауза до 22:00 */ WAITFOR TIME "22:00:00" /* Выводить текущий список пользователей каждые 30 секунд */ WHILE 1 < 2 BEGIN WAITFOR DELAY "00:00:30" EXEC sp_who END RETURN Безусловный выход из пакета осуществляется командой RETURN. При желании в команде можно задать код возврата (обратите внимание: эта возможность используется только при выходе из хранимой процедуры). Команда RETURN имеет следующий синтаксис: RETURN {целое} Применение команды RETURN демонстрирует следующий пример: SELECT * FROM authors PRINT "finishing now" RETURN /* return может использоваться с условными конструкциями */ IF NOT EXISTS (SELECT * FROM inventory WHERE item_num = @item_num) BEGIN RAISERROR ("Not found", 16, 1) RETURN END PRINT "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 statistics io on statistics time on nocount on showplan on noexec on parseonly on
Параметры настраиваются на уровне сеанса или на уровне процедуры. Они не сохраняются между сеансами. Если параметр изменяется в хранимой процедуре, при выходе из нее параметр восстанавливает прежнее значение. Курсоры Курсоры позволяют приложениям выполнять действия с отдельными записями, входящими в результат запроса, вместо обработки итогового набора в целом. SQL проектировался как язык обработки данных, ориентированный на работу с наборами. Некоторые деловые правила требуют выполнения действий с отдельными записями. По возможности старайтесь избегать подобных ситуаций. Поскольку SQL ориентирован на обработку наборов, переход между отдельными записями снижает быстродействие программы. Предположим, если книга стоит дешевле $15, вы хотите увеличить ее цену на 15%, а если дороже $15 — уменьшить цену на 10%. Выполните следующую команду UPDATE: UPDATE titles SET price = price * $1.15 WHERE price <= $15. UPDATE titles SET price = price * $.90 WHERE price > $15. Что произойдет, если книга стоит $14.95? Должна ли цена измениться в обоих направлениях? С помощью курсора можно определить цену для каждой записи и обновить ее соответствующим образом. SQL Server поддерживает два основных типа курсоров: курсоры 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
• Динамические курсоры — курсоры, при использовании которых изменения данных отображаются при перемещении курсора. Динамические курсоры используют минимальное количество ресурсов сервера за пределами базы данных. Кроме того, они в наименьшей степени используют tempdb. • Статические курсоры — курсоры, изолированные от изменений в данных. Сервер сохраняет весь итоговый набор курсора в tempdb при первой выборке. • Ключевые курсоры — курсоры, в которых отображается большая часть изменяемых данных, хотя новые записи и не появляются. При открытии курсора сервер сохраняет ключи возвращаемых записей в tempdb. Ключевые курсоры умеренно используют tempdb. Новые записи не включаются в курсор, а при обращении к записи, удаленной другим пользователем, происходит ошибка. Работа с курсорами в T-SQL Ниже приведена последовательность действий при использовании курсора. Проследите за тем, чтобы все операции выполнялись в нужном порядке: 1. Объявите курсор. 2. Откройте курсор. 3. Произведите выборку записей. 4. Модифицируйте или удалите записи из курсора. 5. Продолжайте выборку записей до завершения всей обработки. 6. Закройте курсор. 7. Освободите ресурсы курсора. Объявление курсоров Полный синтаксис объявления курсора выглядит следующим образом: DECLARE имя_курсора CURSOR [LOCAL | GLOBAL ] [FORWARD ONLY | SCROLL][STATIC | KEYSET | DYNAMIC] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] FOR команда_select [FOR UPDATE [OF список_столбцов] } ] Курсор из следующего примера последовательно перебирает записи таблицы authors, у которых в столбце city находится значение "Los Angeles". DECLARE authors_curs CURSOR for SELECT * FROM authors WHERE city = "Los Angeles" FOR READ ONLY Курсор обращается к таблице authors и отбирает все записи авторов, живущих в Лос-Анжелесе. Более того, объявление запрещает обновление данных через курсор. Имя курсора подчиняется стандартным правилам выбора имен для объектов баз данных. Объявление курсора с ключевым словом INSENSITIVE заставляет сервер создать копию данных во временной рабочей таблице. При работе с курсором вы в действительности работаете с содержимым временной таблицы, которое не изменяется с модификацией настоящей таблицы. Этот механизм позволяет создать «снимок» данных в определенный момент времени, а затем использовать курсор для перебора и обработки данных. Курсоры типа INSENSITIVE не обновляются. Параметр SCROLL разрешает дополнительные методы перемещения —переход к первой, последней, а также к предыдущей записям. В курсорах T-SQL может использоваться любая команда SELECT, допустимая в T-SQL и удовлетворяющая следующим условиям:
converted to PDF by BoJIoc
• Команда SELECT не может содержать секции SELECT INTO, COMPUTE, COMPUTE BY и FOR BROWSE. • При использовании секций GROUP BY, HAVING, DISTINCT или UNION курсор становится статическим. • Если все таблицы, используемые в курсоре, не имеют уникального индекса, курсор становится статическим. • Если все столбцы, используемые в ORDER BY, не входят в уникальный индекс, динамический курсор преобразуется в ключевой или статический. Остальные аргументы в синтаксисе DECLARE имеют следующий смысл: • LOCAL — курсор является локальным по отношению к пакету, хранимой процедуре или триггеру, где объявляется курсор. В конце процедуры или триггера локальные курсоры автоматически освобождаются (de-allocated). Если курсор передается в качестве выходного параметра, он освобождается лишь после освобождения последней переменной, ссылающейся на него. • GLOBAL — курсор доступен в любой момент в течение подключения. Глобальный курсор освобождается явно или уничтожается в конце сеанса. • FORWARD_ONLY — курсор допускает перебор записей только в прямом направлении (от первой к последней). Если ключевое слово STATIC|KEYSET|DYNAMIC не указано, курсор является динамическим. При отсутствии этих ключевых слов параметр FORWARD_ONLY используется по умолчанию; в противном случае по умолчанию используется SCROLL. • STATIC — статический курсор, доступный только для чтения. • KEYSET — ключевой курсор. • DYNAMIC — динамический курсор. • READ_ONLY — курсор доступен только для чтения. • SCROLL_LOCKS — параметр гарантирует, что операции обновления и удаления с использованием выражения WHERE CURRENT будут успешными, а блокировки сохраняются до выборки следующей записи. • OPTIMISTIC — успешность операций обновления и удаления с использованием команды WHERE CURRENT не гарантируется, а блокировки не сохраняются до выборки следующей записи. • FOR READ ONLY — данные не могут обновляться командой UPDATE WHERE CURRENT (ANSI). • FOR UPDATE — режим используется по умолчанию, если при объявлении курсора не указано обратное. • COLUMN_LIST — список всех обновляемых столбцов. SQL Server разрешает всем пользователям объявлять и использовать курсоры. Объявленный курсор готов к открытию. Открытие курсоров Открытие курсора начинает обработку команды SELECT и готовит курсор к выборке записей. Команда открытия курсора имеет следующий синтаксис: OPEN {{ [GLOBAL] имя_курсора }|@переменная} Параметр GLOBAL означает, что курсор является глобальным. Если существуют локальный и глобальный курсоры с одинаковыми именами, для открытия глобального курсора необходимо задать параметр GLOBAL. Переменная @переменная содержит имя курсора. Приведем пример открытия курсора: DECLARE authors_curs CURSOR FOR SELECT * FROM authors WHERE city = "Los Angeles" FOR READ ONLY OPEN authors_curs Приведенный фрагмент объявляет и открывает курсор. Открыть можно только объявленный курсор. Для курсоров INSENSITIVE и STATIC количество записей в итоговом наборе курсора должно быть меньше максимального количества записей в таблице SQL Server. Глобальная переменная @@CURSOR_ROWS содержит количество записей, полученных последней командой открытия курсора. После открытия курсора следующим шагом является выборка записей. Выборка записей Выборка записей курсора осуществляется командой FETCH. Для выборки записей необходимо предварительно открыть курсор. Синтаксис выборки записей выглядит следующим образом:
converted to PDF by BoJIoc
FETCH [направление FROM] {{[GLOBAL] имя_курсора } | @переменная } [ INTO список_переменных] Параметры GLOBAL, имя_курсора и @переменная имеют тот же смысл, что и при открытии курсора. Если при объявлении курсора указано ключевое слово SCROLL, параметр направление может принимать следующие значения: • FIRST — курсор перемещается к первой записи итогового набора; • LAST — курсор перемещается к последней записи итогового набора; • NEXT — курсор перемещается на одну запись вперед в текущем наборе (действие по умолчанию при выборке); • PRIOR — курсор перемещается на одну запись назад в текущем наборе; • ABSOLUTE n/-n — если n является положительным числом, курсор перемещается к n-й записи от начала. Если n является отрицательным числом, курсор перемещается к последней записи набора и отсчитывает n записей в обратном направлении. Если n = 0, записи не возвращаются. • RELATIVE n/-n — если n является положительным числом, курсор перемещается на n записей вперед от текущей позиции. Если n является отрицательным числом, курсор перемещается на n записей назад. Если n = 0, возвращается текущая запись. • В качестве аргументов при использовании параметров ABSOLUTE и RELATIVE курсор может получать целые переменные или параметры хранимых процедур. Следующий фрагмент объявляет и открывает курсор, после чего выбирает из него данные: DECLARE authors_curs CURSOR SCROLL FOR SELECT au_lname, au_fname FROM authors WHERE state = "CA" FOR READ ONLY OPEN authors_curs FETCH NEXT FROM authors_curs DECLARE @lname VARCHAR(40) DECLARE @fname VARCHAR(20) /* Прочитать следующую запись в локальные переменные */ FETCH NEXT FROM authors_curs INTO @lname, @fname /* Прочитать 10-ю запись от текущей */ FETCH RELATIVE 10 FROM authors_curs CLOSE authors_curs DEALLOCATE authors_curs Если при объявлении курсора не указано ключевое слово SCROLL, допускается выборка только следующей записи (FETCH NEXT). При наличии списка переменных их типы должны совпадать со списком выборки. Если список переменных не задан, результат возвращается непосредственно. В табл. 11.2 перечислены глобальные переменные, значения которых можно проверять при работе с курсорами. Таблица 11.2. Глобальные переменные, используемые с курсорами Глобальная переменная
Описание
@@CURSOR_ROWS
Количество записей в последнем открытом курсоре: -# = количество записей, находящихся в данный момент в ключевом наборе, если выборка происходит асинхронно. # = количество записей после завершения выборки. 0 = открытые курсоры отсутствуют.
@@FETCH_STATUS
Результат команды FETCH: 0 = выборка успешна.
converted to PDF by BoJIoc
-1 = выборка завершилась неудачей или запрашиваемая запись выходит за границы диапазона. -2 = возвращенная запись отсутствует в таблице (она была удалена после открытия курсора). В следующем примере переменная @@FETCH_STATUS использована в условии цикла WHILE при обработке курсора: DECLARE title_curs CURSOR FOR SELECT title, type, price, ytd_sales FROM titles FOR READ ONLY DECLARE @type VARCHAR(30), @price MONEY, @title VARCHAR(80), @total_sales int OPEN title_curs FETCH title_curs INTO @title, @type, @price @total_sales WHILE @@FETCH_STATUS = 0 /* Продолжать, пока остаются необработанные записи */ BEGIN IF @type = "business" SELECT Title = @title, "Net Profit" = (@price * .5) * total_sales ELSE SELECT Title = @title, "Net Profit" = (@price * .7) * total_sales FETCH title_curs INTO @title, @type, @price, @total_sales END IF @@FETCH_STATUS = -2 /* Выход из цикла по ошибке выборки */ RAISERROR ("Row fetched has been deleted", 16, 1) CLOSE title_curs DEALLOCATE title_curs Модификация записей с помощью курсоров Вы можете модифицировать записи с помощью курсора, для чего в команды UPDATE и DELETE включается секция WHERE CURRENT OF: UPDATE имя_таблицы SET имя_столбца = выражение [, ... ] [FROM имя_таблицы [, имя_таблицы] ] WHERE CURRENT OF имя_курсора [ {AND | OR} ... ] DELETE [FROM] имя_таблицы [FROM имя_таблицы [, имя_таблицы] ] WHERE CURRENT OF имя_курсора [ {AND | OR} ... ] /* Поменять код города в номере телефона */ UPDATE authors SET phone = stuff(phone, 1, 3, "310") WHERE CURRENT OF authors_curs
converted to PDF by BoJIoc
/* Удалить текущую запись */ DELETE authors WHERE CURRENT OF authors_curs Не разрешается удаление из многотабличных курсоров (то есть курсоров, объявленных с секцией JOIN или представлением, содержащим JOIN). Обновление многотабличного курсора разрешается лишь в том случае, если оно затрагивает одну таблицу. Операция удаления удаляет запись из таблицы. Обновление не изменяет текущей позиции курсора, что делает возможным многократное обновление записи. При попытке выполнить команду UPDATE или DELETE для курсора READ_ONLY выдается сообщение об ошибке, в котором говорится, что курсор доступен только для чтения. Закрытие курсоров Команда CLOSE переводит курсор в неактивное состояние и фактически удаляет его итоговый набор. Она имеет следующий синтаксис: CLOSE {{[GLOBAL] имя_курсора}|{@переменная} Приведем пример закрытия курсора: CLOSE authors_curs Команда CLOSE завершает обработку курсора. Курсор можно открыть повторно, при этом все его указатели сбрасываются. Освобождение курсоров В процессе освобождения курсора удаляется ссылка на него. Допускается освобождение курсора даже в том случае, если в нем остались незавершенные транзакции. Команда освобождения курсора имеет следующий синтаксис: DEALLOCATE {{GLOBAL} имя_курсора}|{@переменная} Приведем пример освобождения курсора: DEALLOCATE author_curs После выполнения команды имя курсора может быть использовано в другой команде DECLARE CURSOR. Если эта ссылка на курсор была последней, команда освобождает всю память, занятую структурой курсора. Чтобы заново открыть курсор, необходимо повторно объявить его. Хранимые процедуры Хранимые процедуры — программы, находящиеся в базе данных и выполняемые по требованию клиента. Хранимая процедура представляет собой набор совместно откомпилированных команд SQL. Одним из преимуществ хранимых процедур является повышение быстродействия вследствие снижения сетевого трафика. В версии 7 планы выполнения обычных команд SQL могут использоваться повторно, поэтому предварительная компиляция планов выполнения хранимых процедур уже не дает столь значительного повышения быстродействия. Хранимые процедуры обладают и другими преимуществами, среди которых — модульность программирования и тестирования, а также ограниченный доступ к таблицам, построенный на базе функций. Это помогает изолировать пользователей от базовых табличных структур, сокращает ошибки в операторах, обеспечивает согласованность в программировании и автоматизирует выполнение сложных или неустойчивых транзакций. Хранимые процедуры являются объектами, находящимися в базе данных. Синтаксис их создания выглядит следующим образом: CREATE PROC[EDURE] имя_процедуры [;номер] [@параметр тип_данных [VARYING] [= значение ] [OUTPUT] [, ...] ]
converted to PDF by BoJIoc
[WITH {RECOMPILE|ENCRYPTION|RECOMPILE|ENCRYPTION} ] [FOR REPLICATION] AS команды SQL [RETURN [код_статуса]] Ниже описаны аргументы, используемые при создании хранимых процедур: • Имя_процедуры — подчиняется стандартным правилам выбора имен объектов: · в рамках одной базы данных для процедур с одинаковыми именем и владельцем номер должен быть уникальным; · имена локальных временных процедур должны начинаться с символа #; · имена глобальных временных процедур должны начинаться с символов ##. • Номер — используется для группировки процедур как единого целого (часто в сочетании с версией приложения). • @параметр — представляет параметр, передаваемый и/или получаемый из процедуры. Процедура имеет до 1024 параметров. Параметры могут принимать значения NULL. Они не могут использоваться в процедуре вместо объектов баз данных, если только они не включаются в команду EXEC. Параметры относятся к встроенным либо пользовательским типам данных. Обратите внимание — правила, значения по умолчанию и свойства столбцов не относятся к параметрам, определяемым пользовательскими типами данных. Параметр может относиться к любому типу данных SQL Server, в том числе TEXT, IMAGE или CURSOR. Для параметров типа CURSOR ключевые слова VARYING и OUTPUT являются обязательными. • VARYING — означает, что параметр возвращает итоговый набор. Используется только для типа данных CURSOR. • Значение — определяет значение параметра по умолчанию. Может быть любой константой или NULL. • OUTPUT — означает, что параметр является выходным, то есть может возвращаться стороне, вызвавшей процедуру. Параметры типа CURSOR обязаны быть выходными. • RECOMPILE — отменяет кэширование плана выполнения в SQL Server. Параметр ENCRYPTION означает, что таблица syscomment должна шифроваться (благодаря чему текст процедуры скрывается от постороннего взгляда). • FOR REPLICATION — означает, что процедура участвует в процессе репликации. Обратите внимание: параметры FOR REPLICATION и RECOMPILE являются взаимоисключающими. • Команды SQL — произвольное количество команд SQL, составляющих тело процедуры. Максимальный объем команд не должен превышать 128 Кбайт. Помимо знания аргументов существующих процедур при работе с хранимыми процедурами следует учитывать ряд ограничений: • Постоянные (а не временные) процедуры создаются только в текущей базе данных. • Ссылки на объекты интерпретируются на стадии выполнения, а не во время создания процедуры. • Временные процедуры автоматически удаляются при отключении пользователя, создавшего их. • Глобальные временные процедуры могут выполняться другими пользователями. • Процедуры не могут содержать команд ALTER TABLE, CREATE INDEX, CREATE TABLE, DROP TABLE, DROP INDEX, TRUNCATE TABLE, UPDATE STATISTICS и любых команд DBCC. Ниже приведен пример хранимой процедуры, которая выводит названия книг с данными издателей: CREATE PROC pub_titles AS SELECT t.title, p.pub_name FROM publishers p, titles t WHERE p.pub_id = t.pub_id RETURN GO /* Пример процедуры с параметром-курсором */ CREATE PROCEDURE acur @auth_cur CURSOR VARYING OUTPUT, @state char(2) = "CA", @ctype int = 1 AS
converted to PDF by BoJIoc
IF (@ctype = 1) SET @auth_cur = CURSOR SCROLL FOR SELECT au_lname FROM authors WHERE state = @state ELSE SET @auth_cur = CURSOR SCROLL FOR SELECT au_lname, au_fname FROM authors OPEN @auth_cur Как упоминалось ранее в этой главе, процедуры вызываются с помощью ключевого слова EXECUTE (EXEC). Использование EXECUTE обязательно, если вызов сохраненной процедуры не является первой командой пакета. При вызове процедуры должны передаваться все параметры, для которых не определены значения по умолчанию. Синтаксис вызова процедуры выглядит следующим образом: [EXEC[UTE]] [@код_возврата = ] имя_процедуры [;номер ] [@список_параметров] [WITH RECOMPILE] В этом фрагменте: • @код_возврата — переменная для сохранения кода возврата процедуры. • Номер — числовой идентификатор процедуры. При отсутствии этого аргумента выполняется процедура с максимальным номером версии. • @список_параметров — список параметров процедуры. Параметры передаются как по имени (имя = значение), так и по позиции в списке, но если некоторый параметр передается по имени, все последующие параметры в списке тоже должны передаваться по имени. Чтобы пропустить параметр в середине списка, следует передавать остальные параметры по имени. • WITH RECOMPILE — процедура заново компилируется при выполнении. В следующих двух строках выполняется процедура с именем pub_titles. Обратите внимание на то, что ключевое слово EXEC необходимо лишь во второй строке: pub_titles — Пакет начинается с вызова процедуры exec pub_titles go Команда удаления хранимых процедур имеет следующий синтаксис: DROP PROC имя_процедуры [, имя_процедуры[, ...] ] Хранимая процедура является постоянным объектом базы данных, поэтому ее удаление должно осуществляться специальной командой. Команда DROP PROC удаляет одну или несколько процедур. Для заданного имени процедуры удаляются все процедуры с разными номерами (то есть удаляется вся группа процедур). Внимание Нельзя удалить отдельную процедуру из группы. Традиционным способом модификации хранимых процедур было удаление процедуры и ее повторное создание с повторной выдачей всех разрешений. В версии 7 появилась возможность модификации хранимых процедур командой ALTER: ALTER PROC[EDURE] имя_процедуры [;номер] [ @параметр тип_данных [VARYING] [= значение ] [OUTPUT] [, ... ] ] [WITH {RECOMPILE|ENCRYPTION} ] [FOR REPLICATION] AS команды SQL [RETURN [код_возврата]]
converted to PDF by BoJIoc
Команда ALTER ведет себя так же, как и CREATE PROCEDURE. Она не изменяет зависимостей или разрешений, поэтому вы не сможете модифицировать несуществующую процедуру. Хранимые процедуры можно не только модифицировать, но и переименовывать. Переименование осуществляется системной процедурой sp_rename: sp_rename процедура, новое_имя Наконец, вывод текста хранимой процедуры в той базе данных, где она создавалась, осуществляется командой sp_helptext: sp_helptext имя_процедуры Процедура sp_help выводит имена и типы данных параметров хранимой процедуры. Для создания, удаления и модификации хранимых процедур можно воспользоваться утилитой SQL Enterprise Manager. Нажатие кнопки OK или Apply выполняет команды SQL, находящиеся в окне. Окно SQL Enterprise Manager показано на рис. 11.2.
Рис. 11.2. Создание процедуры в SQL Enterprise Manager Примеры экзаменационных вопросов Question 1 Which are the characteristics of the batch? [Check all correct answers] • A. A batch is always a transaction. • B. A batch can be a transaction. • C. A batch can be part of transaction.
converted to PDF by BoJIoc
• D. A single syntax error in a batch will cause an entire batch to fail. • E. SQL Server does not support batch processing. Вопрос 1 Какими характеристиками обладает пакет? [Выберите все правильные ответы] • • • • •
A. Пакет всегда является транзакцией. B. Пакет может быть транзакцией. C. Пакет может быть частью транзакции. D. Одна синтаксическая ошибка в пакете приводит к отмене всего пакета. E. SQL Server не поддерживает пакетную обработку.
Правильные ответы — B, C и D; пакет может быть частью транзакции. Ответ D правилен, поскольку пакет обрабатывается как единое целое. Ответ A неверен, поскольку транзакции не зависят от пакетов. Ответ E неверен и лишь сбивает с толку, поскольку пакеты не всегда связаны с пакетной обработкой. Question 2 Which are valid applications of procedures? [Check all correct answers] • • • • •
A. Passing parameters. B. Managing transactions. C. Reducing network traffic. D. Modularizing applications. E. Managing a cursor.
Вопрос 2 Для каких целей применяются процедуры? [Выберите все правильные ответы] • • • • •
A. Передача параметров. B. Управление транзакциями. C. Сокращение сетевого трафика. D. Обеспечение модульной структуры приложений. E. Управление курсорами.
Правильные ответы — A, B, C, D и E. Question 3 What is the maximum stored procedure size? • • • • •
A. 128 SQL statements. B. 128 K. C. 64 SQL statements. D. 64 K. E. There is no size limit on a stored procedure.
Вопрос 3 Чему равен максимальный размер хранимой процедуры? • • • • •
A. 128 команд SQL. B. 128 Kбайт. C. 64 команды SQL. D. 64 Кбайт. E. Размер хранимой процедуры не ограничивается.
Правильный ответ — B. Ответы A и C неверны, поскольку размер процедуры не измеряется в командах SQL. Ответ D тоже неверен, приведенное значение слишком мало. Неверен и ответ E, поскольку размер хранимых процедур ограничен. Question 4 When is using a cursor is a good idea? [Check all correct answers] • • • • •
A. Never, because it causes a performance hit. B. When there is no set-processing method of solving a business problem. C. When you are defeated in your attempts to write set-processing code. D. When you are too lazy to write set-processing code. E. None of the above.
converted to PDF by BoJIoc
Вопрос 4 Когда следует пользоваться курсорами? [Выберите все правильные ответы] • • • • •
A. Никогда, поскольку это приводит к снижению быстродействия. B. Когда деловая проблема не решается методами обработки наборов. C. Если все ваши попытки написать код обработки наборов ни к чему не привели. D. Если вы слишком ленивы, чтобы писать код обработки наборов. E. Ни в одном из перечисленных случаев.
Правильный ответ — B. Ответ A неверен, поскольку иногда специфика задачи заставляет действовать на уровне записей. Ответ C неверен; проблему нужно решать, а не искать обходные пути. Ответ D тоже неверен, поскольку леность вообще не является оправданием. Question 5 What is the WAITFOR statement? • • • • •
A. An event handler. B. An error handler. C. A deadlock avoidance mechanism. D. A programming technique no longer supported in SQL Server 7. E. None of the above.
Вопрос 5 Что собой представляет команда WAITFOR? • • • • •
A. Обработчик событий. B. Обработчик ошибок. C. Механизм обхода взаимных блокировок. D. Методика программирования, не поддерживаемая в SQL Server 7. E. Ни один из перечисленных ответов.
Правильный ответ — A. Ответ B неверен, поскольку обработчик ошибок прерывает работу программы. Ответ C неверен, поскольку команда WAITFOR при открытой транзакции может стать причиной взаимной блокировки. Ответ D неверен, поскольку команда продолжает существовать. ГЛАВА 12
Триггеры Ключевые термины • • • •
Триггер Вставленная таблица Удаленная таблица Журнал транзакций
Необходимые знания и приемы • Определение триггеров • Модификация триггеров • Понимание ограничений, связанных с триггерами Триггеры (trigger) являются особой разновидностью хранимых процедур, выполняемых автоматически (срабатывающих) при модификации данных таблицы. Триггеры находят разное применение — от проверки данных до обеспечения сложных деловых правил. Особенно полезным свойством триггеров является то, что они имеют доступ к образам записи до и после модификации; таким образом вы можете сравнить две записи и принять соответствующее решение. На экзамене вы должны знать, что такое триггеры, как они создаются и используются. Поэтому в этой главе наряду с созданием, удалением и модификацией триггеров также рассматривается их применение. Характерные примеры использования триггеров иллюстрируются примерами. Использование триггеров Триггеры используются для различных целей, в том числе:
converted to PDF by BoJIoc
• Обеспечения ссылочной целостности. Триггеры используются для поддержания ссылочной целостности, когда ее критерии слишком сложны для определения на уровне таблиц. В частности, сюда относится возможность каскадных обновлений и удалений первичных ключей. • Комплексного обеспечения целостности доменов. При необходимости триггеры могут использоваться для проверки значений в других таблицах и базах данных, а также для сравнения образов данных до и после обновления. • Обеспечения сложных деловых правил. С помощью триггеров решаются такие задачи, как автоматическое оформление заказов на покупку при малом количестве товара на складе или отмена поставки при задержке платежей. • Выбор сложных значений по умолчанию. Триггеры позволяют принимать решения при выборе значения по умолчанию для столбцов. Это полезная возможность, поскольку пользовательские значения по умолчанию допускают лишь одно конкретное значение для каждого столбца. • Обработки дубликатов. Триггеры используются для обеспечения целостности данных. Такая возможность бывает полезной при логическом сегментировании данных или при обработке дубликатов данных по соображениям быстродействия (например, для получения сводной информации). Срабатывание триггеров Триггеры закрепляются за таблицей и срабатывают в ответ на определенные команды DML (Data Modification Language, поднабор команд Transact-SQL). Иначе говоря, выполнение команды, модифицирующей запись, всегда приводит к срабатыванию триггера. Поскольку триггер является частью исходной транзакции, он может вызвать откат отдельной команды или всей транзакции. Благодаря этому у вас появляется возможность контролировать модификацию таблиц с помощью логики, связанной с таблицей.
Рис. 12.1. Команда модификации данных без триггера Чтобы пояснить сказанное, рассмотрим пример — удаление записей из таблицы publishers командой DELETE. На рис. 12.1 показано, как команда DELETE работает без триггера. Как видно из рис. 12.1, при удалении записи таблицы в игру может вступить любое ограничение ссылочной целостности, являющееся частью таблицы publishers. Если ограничение ссылочной целостности существует, оно будет проверено. Если ограничение не нарушается (или не существует), запись удаляется. Если команда не является частью отдельной транзакции, в этот момент происходит закрепление транзакции. На рис. 12.2 показано, как команда модификации данных работает при использовании триггера. Сначала происходит проверка всех ограничений. Если ограничение не нарушено (или не существует), запись удаляется. Затем перед завершением транзакции выполняется триггер, который принимает решение об откате или закреплении транзакции. Внимание Триггеры выполняются только один раз для одной команды модификации данных, независимо от количества обрабатываемых записей (даже если команда не влияет ни на одну запись или, наоборот, обрабатывает все записи таблицы). Мы кратко рассмотрели примеры использования триггеров, а также время их срабатывания. Перейдем к созданию триггеров.
converted to PDF by BoJIoc
Рис. 12.2. Команда модификации данных с использованием триггера Создание триггеров Таблица может содержать триггеры трех типов — вставки, обновления или удаления (или любую комбинацию этих трех типов). Количество триггеров в таблице теперь не ограничивается. Внимание Обратите внимание: это новая особенность SQL Server. В предыдущих версиях SQL Server (до версии 7) таблица могла содержать лишь один экземпляр триггера каждого типа. Команда создания триггера имеет следующий синтаксис: CREATE TRIGGER имя_триггера ON имя_таблицы [WITH ENCRYPTION] FOR {INSERT | UPDATE | DELETE} [,...] [WITH APPEND] [NOT FOR REPLICATION] AS [команды SQL] [RETURN] Синтаксические компоненты имеют следующий смысл: • Имя_триггера — определяет имя объекта с необязательным включением имени владельца (например, mytrigger или dbo.mytrigger). • Имя_таблицы — определяет имя таблицы, для которой срабатывает триггер. Обратите внимание, что таблица может быть лишь одна. • INSERT|UPDATE|DELETE — модификация данных, приводящая к срабатыванию триггера. При создании триггера можно задать одну, две или три операции. В случае выбора нескольких операций их следует разделить запятыми (INSERT, UPDATE, DELETE). • WITH APPEND — триггер добавляется в список триггеров, срабатывающих для указанного действия (действий). SQL Server можно настроить так, что добавление будет происходить автоматически. Если SQL Server не настроен таким образом, создание триггера приводит к удалению существующего триггера для данного действия (действий). • NOT FOR REPLICATION — означает, что триггер не выполняется в процессе репликации. Следующий фрагмент создает триггер, который выводит сообщение при каждой вставке записи в таблицу titles: CREATE TRIGGER titles_trigger ON titles FOR INSERT AS PRINT "title inserted" RETURN При создании триггеров необходимо учитывать некоторые второстепенные обстоятельства: • Если вы задаете владельца триггера, также необходимо задать владельца таблицы (особенность синтаксиса языка). • Хотя триггеры во многих отношениях похожи на хранимые процедуры, они не получают параметров при вызове и не могут явно вызываться или выполняться из программы. • Команда CREATE TRIGGER должна быть первой командой в пакете. • Триггеры не могут создаваться для представлений. Они действуют лишь в базовых таблицах. Тем не менее, можно создавать представления для таблиц, содержащих триггеры. • Триггеры не срабатывают при выполнении команды TRUNCATE TABLE. Команда TRUNCATE TABLE не регистрируется в журнале, а триггеру необходим доступ к информации журнала. • Команда WRITETEXT не приводит к срабатыванию триггеров. Эта команда не регистрируется в журнале. • Чтобы создать триггер, необходимо либо быть владельцем объекта, либо обладать ролью db_owner или db_ddladmin.
converted to PDF by BoJIoc
В триггерах запрещены следующие команды SQL: • • • • • • • • • • •
Любые команды CREATE; Любые команды DROP; ALTER TABLE/DATABASE; DENY; GRANT; REVOKE; SELECT INTO; TRUNCATE TABLE; UPDATE STATISTICS; RECONFIGURE; LOAD/RESTORE DATABASE/TRANSACTION.
Удаление триггеров Триггеры удаляются командой DROP TRIGGER, имеющей следующий синтаксис: DROP TRIGGER имя_триггера [,имя_триггера [,... ] ] Команда удаляет триггер с заданным именем. При замене триггеров команда DROP TRIGGER не нужна. Чтобы заменить существующий триггер, достаточно не указывать ключевые слова WITH APPEND при создании нового триггера. Внимание Помните: при удалении таблицы удаляются также все связанные с ней триггеры. Модификация триггеров Когда-то модификация триггеров сводилась к простому удалению триггера с повторным созданием. В SQL Server 7 появилась новая возможность — модификация триггеров командой ALTER TRIGGER. Команда имеет следующий синтаксис: ALTER TRIGGER имя_триггера ON имя_таблицы [WITH ENCRYPTION] FOR {INSERT | UPDATE | DELETE} [, ...] [WITH APPEND] [NOT FOR REPLICATION] AS [команды SQL] [RETURN] Параметры команды ALTER TRIGGER такие же, как и команды CREATE TRIGGER. Команда ALTER TRIGGER была введена главным образом для логической согласованности команд, поскольку все остальные команды создания объектов теперь допускают возможность модификации. Существуют особые представления журнала — таблицы inserted и deleted, которые открывают доступ к образам, данным до и после модификации. Таблицы deleted и inserted Таблицы deleted и inserted являются специальными представлениями журнала транзакций, доступными лишь во время срабатывания триггера и в пределах триггера. В этих таблицах отражаются изменения, внесенные в таблицу командой, которая привела к срабатыванию триггера. Структуры таблиц inserted и deleted в точности совпадают со структурой таблицы, для которой создавался триггер. Таблица inserted содержит новые записи, созданные командой INSERT или UPDATE. Таблица deleted содержит записи, удаленные вследствие выполнения DELETE или UPDATE. SQL Server обычно интерпретирует команду UPDATE как DELETE с последующей INSERT. Вставляемые и удаляемые записи включаются в таблицы inserted и deleted. Эти таблицы могут использоваться только
converted to PDF by BoJIoc
внутри триггеров для определения того, какое событие вызвало срабатывание триггера. Записи таблицы inserted создаются при вставке или обновлении, а записи таблицы deleted — при удалении или обновлении. Нередко триггер включает таблицы inserted и deleted в объединение для обеспечения ссылочной целостности и целостности внешних ключей. Примечание Таблицы inserted и deleted видны только внутри триггера, для которого они создавались, — но не во вложенных триггерах (вложенные триггеры более подробно рассматриваются далее в этой главе). Чтобы пояснить сказанное, рассмотрим пример, демонстрирующий применение таблицы deleted. В этом примере из таблицы publishers удаляется определенная запись (рис. 12.3). При срабатывании триггера транзакция еще не была закреплена. Триггер может обратиться к таблице deleted и просмотреть удаляемую информацию. Например, триггер может запретить удаление записи при наличии внеочередного заказа на книгу, опубликованную этим издателем. На рис. 12.4 показано, что происходит при обновлении записи. Во время обновления триггер, как обычно, видит обновленный вариант таблицы. Таблица deleted содержит образы записей до обновления, а таблица inserted — образы после обновления. Обратите внимание: все три таблицы имеют одинаковую структуру. Просмотр таблиц deleted и inserted В этом разделе приведен пример использования таблиц inserted и deleted. Мы напишем триггер обновления для таблицы publishers, выполняющий каскадное удаление в таблице titles. Внимание Термин «каскадное удаление» означает, что из таблицы titles удаляются любые записи, зависящие от удаляемой записи таблицы publishers. Не забывайте о проверке количества записей, участвующих в операции (через @@ROWCOUNT), поскольку команда DELETE заставляет триггер сработать ровно один раз, независимо от того, удаляла она записи или нет. Следующий триггер производит каскадное удаление подчиненных записей.
Рис. 12.3. Триггер удаления
converted to PDF by BoJIoc
Рис. 12.4. Обновление записи Листинг 12.1. Триггер каскадного удаления CREATE TRIGGER cascade_del_trigger ON publishers FOR DELETE AS IF @@ROWCOUNT = 0 -- Удаленных записей нет RETURN /* Каскадное удаление записей из таблицы titles, */ /* связанных по полю pub_id */ DELETE titles FROM titles t, deleted d WHERE t.pub_id = d.pub_id IF @@ERROR != 0 BEGIN PRINT "Error occurred during related titles" ROLLBACK TRAN END RETURN На рис. 12.5 показано, что происходит при вставке записи в таблицу publishers. Триггер вставки «видит» пустую таблицу deleted и таблицу inserted, содержащую вставленную запись(и). Обратите внимание: структура таблиц deleted и inserted идентична структуре базовой таблицы. Вставка и удаление нескольких записей SQL Server позволяет вставить несколько записей в одной команде INSERT с помощью конструкции INSERT…SELECT. Если в процессе вставки или обновления участвуют несколько значений внешнего ключа, триггер должен сравнить количество вставленных или обновленных записей с количеством записей,
converted to PDF by BoJIoc
являющихся допустимыми ключами. Такое сравнение проверяет, что для модифицированных записей имеются соответствующие ключи (проверку также можно организовать с помощью декларативных ограничений — см. главу 6). Для проверки ссылочной целостности можно воспользоваться агрегатной функцией COUNT(*) для соединения таблицы inserted с таблицей первичного ключа. Например, в начале триггера можно сравнить SELECT COUNT(*) со значением @@ROWCOUNT. Значение @@ROWCOUNT необходимо проверить (а лучше сохранить в локальной переменной) до выполнения в триггере каких-либо операций, способных повлиять на @@ROWCOUNT. Дело в том, что любая команда SQL приводит к изменению @@ROWCOUNT (в том числе и та, которая проверяет @@ROWCOUNT).
Рис. 12.5. Вставка записи Количество записей таблицы inserted, успешно соединяемых с записями таблицы первичного ключа, не совпадает с общим количеством вставленных или удаленных записей; по крайней мере одна запись неверна. Следующий фрагмент программы демонстрирует методику проверки ссылочной целостности в триггере: CREATE TRIGGER tr1 ON... FOR INSERT, UPDATE AS DECLARE @ROWS INT SELECT @rows = @@rowcount ... IF (SELECT COUNT(*) FROM inserted i, pkey_tab p WHERE i.fkey = p.pkey) != @rows /* По крайней мере одна из вставленных/удаляемых записей ** не совпадает с первичным ключом */ /* Начать обработку ошибок */ ... Проверка столбцов при модификации Выполняемая в таблице команда INSERT или UPDATE приводит к срабатыванию триггера вставки или обновления. Если триггер проектировался для обеспечения ссылочной целостности, возможно, вас интересует лишь обновление или вставка в столбцах первичного или внешнего ключа. Конструкция IF
converted to PDF by BoJIoc
UPDATE позволяет определить, выполнялась ли вставка или модификация для конкретного столбца. Синтаксис IF UPDATE выглядит следующим образом: IF UPDATE (имя_столбца) [ { AND | OR } UPDATE (имя_столбца)...] Результат проверки IF UPDATE равен TRUE в случае истинности одного из следующих условий: • В столбец было вставлено значение, отличное от NULL. • Столбец был включен в секцию SET команды UPDATE. Функция COLUMNS_UPDATED() позволяет узнать, входил ли конкретный столбец в команду INSERT или UPDATE. Оператор COLUMNS_UPDATED() имеет следующий синтаксис: IF (COLUMNS_UPDATED() {поразрядный оператор} маска_обновления) {оператор_сравнения} маска_столбцов ] Проверка может выполняться в триггерах вставки или обновления; с ее помощью можно узнать о факте обновления нескольких столбцов. Параметры имеют следующий смысл: • • • •
Поразрядный_оператор — определяет оператор, используемый при сравнении. Маска_обновления — определяет обновляемые столбцы. Маска_столбцов — определяет проверяемые столбцы. Оператор_сравнения — определяет оператор, используемый для проверки столбцов:
· = означает, что все столбцы маски должны обновляться. · > означает, что не все столбцы маски должны обновляться. Итак, мы довольно подробно рассмотрели теоретические принципы, используемые в триггерах вставки, удаления и обновления. Перейдем к практическим примерам. Сначала мы рассмотрим типичный триггер вставки, затем — условный триггер и, наконец, перейдем к примеру триггера обновления. Триггер вставки В листинге 12.2 записи, вставляемые в таблицу titles, проверяются на ссылочную целостность по отношению к таблице publishers. Если какая-либо запись нарушает правила ссылочной целостности, транзакция вставки откатывается. Листинг 12.2. Триггер вставки с проверкой ссылочной целостности CREATE TRIGGER tr_titles_i ON titles FOR INSERT AS DECLARE @rows int -- Переменная для хранения @@ROWCOUNT SELECT @rows = @@rowcount IF @rows = 0 -- Вставленных записей нет, выйти из триггера RETURN /* Проверить вставку в столбец pub_id, а также наличие ** pub_id в таблице publishers для всех вставленных pub_id */ IF UPDATE(pub_id) – Было ли вставлено новое значение pub_id? AND SELECT COUNT(*) FROM inserted i, publishers p WHERE p.pub_id = i.pub_id ) != @rows BEGIN RAISERROR ("Invalid pub_id inserted", 16, 1) ROLLLBACK TRANSACTION END RETURN
converted to PDF by BoJIoc
Следующий раздел расширяет приведенный пример и показывает, как проверить ссылочную целостность записей, вставленных в таблицу titles, посредством сравнения внешних ключей с первичными ключами таблицы publishers. Условный триггер вставки Записи, нарушающие ссылочную целостность, удаляются из titles, а остальные записи остаются в таблице. В листинге 12.3 приведена реализация условного триггера вставки, решающего эту задачу. Листинг 12.3. Условный триггер вставки CREATE TRIGGER tr_titles_i ON titles FOR INSERT AS DECLARE @rows int -- Переменная для хранения @@ROWCOUNT SELECT @rows = @@ROWCOUNT IF @rows = 0 -- Вставленных записей нет, выйти из триггера RETURN /* Проверить вставку в столбец pub_id, а также наличие ** pub_id в таблице publishers для всех вставленных pub_id ** Все нарушающие записи удаляются из titles */ IF UPDATE(pub_id) – Было ли вставлено новое значение pub_id? AND SELECT COUNT(*) FROM inserted i, publishers p WHERE p.pub_id = i.pub_id ) != @rows BEGIN DELETE titles FROM titles t, inserted i WHERE t.pub_id NOT IN (SELECT pub_id FROM publishers) RAISERROR ("Some invalid pub_id not inserted", 16, 1) END RETURN Триггер обновления В этом примере при вставке или обновлении записи sales мы обновляем соответствующий итоговый столбец, ytd_sales, в таблице titles. Листинг 12.4 показывает, как обновление сводных данных реализуется с помощью триггеров. Листинг 12.4. Обновление сводной величины CREATE TRIGGER tr_total_sales ON sales FOR UPDATE, INSERT AS DECLARE @rows int -- Переменная для хранения @@ROWCOUNT SELECT @rows = @@ROWCOUNT IF @rows = 0 -- Вставленных записей нет, выйти из триггера RETURN IF EXISTS (SELECT * FROM deleted) AND @rows > 1 BEGIN PRINT "Multi-row updates to sales not allowed!" ROLLBACK TRAN RETURN END /* Обновить ytd_sales в таблице titles значением qty ** в модифицированных записях sales */
converted to PDF by BoJIoc
IF UPDATE(qty) BEGIN UPDATE titles SET ytd_sales = ISNULL(ytd_sales, 0) /* Функция ISNULL используется на случай отсутствия значений */ /* Сумма по вставкам и удалениям вычисляется в подзапросе */ + (SELECT ISNULL(SUM(i.qty), 0) FROM inserted i WHERE i.title_id = titles.title_id) - (SELECT ISNULL(SUM(d.qty), 0) FROM deleted d WHERE d.title_id = titles.title_id) END RETURN Триггеры в транзакциях Как говорилось ранее, триггер является неотъемлемой частью команды, вызвавшей его срабатывание, и транзакции, в которую входит эта команда. Выполнение ROLLBACK TRAN в триггере приводит к откату всех операций, начиная с самой внешней команды BEGIN TRAN, завершает вычисления в триггере и прерывает текущий пакет. Например, следующий триггер вызывается при вставке записей в таблицу titles: CREATE TRIGGER tr_titles_i ON titles FOR INSERT AS DECLARE @rows int -- Переменная для хранения @@ROWCOUNT SELECT @rows = @@ROWCOUNT IF @rows = 0 IF UPDATE(pub_id) AND (SELECT COUNT(*) FROM INSERTED i, publishers p WHERE p.pub_id = i.pub_id ) != @rows BEGIN ROLLBACK TRANSACTION RAISERROR ("Invalid pub_id inserted", 16, 1) END RETURN /* Транзакция вставляет записи в таблицу */ BEGIN TRAN add_titles INSERT titles (title_id, pub_id, title) VALUES ('BU1234', '0736', 'Tuning SQL Server') INSERT titles (title_id, pub_id, title) VALUES ('BU1235', 'abcd', 'Tuning SQL Server') INSERT titles (title_id, pub_id, title) VALUES ('BU1236', '0877, 'Tuning SQL Server') COMMIT TRAN Сколько записей будет вставлено, если 'abcd' является недопустимым значением pub_id? Ни одной; в отличие от ROLLBACK TRAN в процедуре, ROLLBACK TRAN в триггере отменяет выполнение оставшейся части пакета. При использовании триггеров в транзакциях необходимо помнить о некоторых нюансах: • Команды, следующие в триггере за ROLLBACK TRAN, будут выполнены. Откат относится к обработке транзакций, а не к потоку команд (весьма распространенная ошибка). • Не забывайте ставить RETURN после ROLLBACK TRAN в триггере, чтобы предотвратить нежелательные последствия; это необходимо делать из-за странных проблем, возникающих в некоторых интерфейсных клиентских программах. • Не включайте в триггер команду BEGIN TRAN — вы уже находитесь в транзакции, поэтому лишняя команда BEGIN TRAN не нужна. В триггере можно установить точку сохранения и вернуться к ней (см. следующий раздел). Откат будет выполнен только для команд триггера, находящихся за точкой сохранения. • Транзакция остается активной до последующего закрепления или отката, а выполнение пакета продолжится. • Не выполняйте в триггере откат для именованной транзакции. Это приведет к ошибке времени выполнения, откату всей работы и отмене пакета.
converted to PDF by BoJIoc
• Для получения оптимальных результатов не включайте в триггеры команды BEGIN TRAN и ROLLBACK TRAN (в том числе и ROLLBACK TRAN до отката к точке сохранения). Использование точек сохранения в триггерах Команда SAVEPOINT позволяет избежать отката всей транзакции в триггере. Вы определяете точку сохранения и по своему желанию ограничиваете откат транзакции точкой сохранения с заданным именем. В этом случае следует немедленно выполнить команду RAISERROR или RETURN и передать код ошибки вызывающему процессу. Вызывающий процесс проверяет код ошибки и предпринимает необходимые действия — откат транзакции, откат до точки сохранения, игнорирование ошибки и закрепление модификации данных. В листинге 12.5 приведен триггер для таблицы titles. Листинг 12.5. Триггер вставки с использованием точки сохранения /* Триггер для таблицы titles, вызываемый при вставке */ CREATE TRIGGER tr_titles_i ON titles FOR INSERT AS DECLARE @rows int -- Переменная для хранения @@ROWCOUNT SELECT @rows = @@ROWCOUNT IF @rows = 0 RETURN SAVE TRAN titlestrig IF UPDATE(pub_id) AND (SELECT COUNT(*) FROM inserted i, publishers p WHERE p.pub_id = i.pub_id ) != @rows BEGIN ROLLBACK TRANSACTION titlestrig RAISERROR "Invalid pub_id inserted", 16, 1) END RETURN Команда INSERT из листинга 12.6 приводит к срабатыванию триггера, показанного в листинге 12.5. Листинг 12.6. Вставка в таблицу titles и вызов триггера /* Транзакция вставляет записи в таблицу */ BEGIN TRAN add_titles INSERT titles (title_id, pub_id, title) VALUES ('BU1234', '0736', 'Tuning SQL Server') IF @@ERROR = 50000 BEGIN ROLLBACK TRAN add_titles RETURN END INSERT titles (title_id, pub_id, title) VALUES ('BU1235', 'abcd, 'Tuning SQL Server') IF @@ERROR = 50000 BEGIN ROLLBACK TRAN add_titles RETURN END INSERT titles (title_id, pub_id, title) VALUES ('BU1236', '0877, 'Tuning SQL Server') IF @@ERROR = 50000 BEGIN ROLLBACK TRAN add_titles RETURN END COMMIT TRAN
converted to PDF by BoJIoc
Фрагмент вставляет записи в таблицу, для которой определен триггер вставки. После каждой вставки мы проверяем значение @@ERROR, чтобы узнать, произошел ли в триггере откат, и если произошел — откатываем всю транзакцию. Если триггер модифицирует таблицу, для которой, в свою очередь, определен триггер, обычно это приводит к срабатыванию триггера модифицируемой таблицы. Такие триггеры называются «вложенными» (nested triggers). Вложенные триггеры Предположим, триггер A выполняет команду INSERT, UPDATE или DELETE для другой таблицы, в которой для выполняемой операции определен триггер B. В результате сработает и триггер B. Этот пример поясняет концепцию вложенных триггеров — эта модель поведения используется сервером по умолчанию. Триггеры ограничиваются 32 уровнями вложенности. Если вы полагаете, что ограничение на глубину вложенности триггеров может оказаться существенным для вашего приложения (хотя в большинстве ситуаций такое ограничение не вызывает проблем), проверьте глобальную переменную @@NESTLEVEL или вызовите функцию NEST_LEVEL(), чтобы избежать превышения. Для вложенных триггеров недоступно содержимое таблиц inserted или deleted других триггеров — в них видны только таблицы inserted или deleted триггера, вызвавшего срабатывание вложенного триггера. Системный администратор может запретить вложение триггеров на уровне сервера с помощью хранимой процедуры sp_configure. Обычно триггеры не являются рекурсивными. Иначе говоря, при модификации собственной таблицы они не срабатывают, хотя при желании рекурсию можно включить. Команды модификации данных внутри триггера не влияют на содержимое таблиц inserted или deleted для данного триггера. Это означает, что значения в базовой таблице можно заменить без входа в циклическую рекурсию. Если для некоторого действия в таблице определено сразу несколько триггеров, эти триггеры срабатывают в порядке определения. Если порядок важен, будет проще (и разумнее) использовать всего один триггер. Триггеры не отменяют существующих разрешений; вместо этого они используют схему текущих разрешений. Если пользователь не имеет разрешения на прямое обновление таблицы, то он не сможет обновить таблицу с помощью триггера или другой таблицы, для которой он обладает разрешением на обновление. Триггеры не могут определяться для временных таблиц или представлений. При модификации данных через представление будут выполнены все триггеры для базовых таблиц. Триггеры могут выполнять хранимые процедуры, в том числе и удаленные хранимые процедуры. В триггерах можно использовать курсоры, хотя это и не рекомендуется, — триггеры выполняются часто, а курсоры работают медленно. В частности, курсоры в триггерах применяются для ведения нестандартных журналов, обработки дубликатов данных и выполнения действий с отдельными записями таблиц inserted/deleted. Затраты ресурсов для триггеров, как и для хранимых процедур, относительно невелики. Триггер вставки не срабатывает во время медленной загрузки данных с использованием BCP (Bulk Copy Program). Триггер удаления не срабатывает во время выполнения команды TRUNCATE TABLE. Результаты работы триггера направляются вызывающей программе, хотя пользоваться этим не рекомендуется. Не используйте в триггерах команды SELECT, которые возвращают пользователю итоговые наборы. Приложение, выдавшее команду INSERT, вряд ли будет ожидать или обрабатывать итоговые наборы. Для возврата информации из триггеров следует использовать команды PRINT и RAISERROR. Просмотр триггеров Чтобы вывести список всех таблиц с триггерами, воспользуйтесь следующей командой SELECT: SELECT name, user_name(uid), "insert trigger" = object_name(instrig), "update trigger" = object_name(updtrig),
converted to PDF by BoJIoc
"delete trigger" = object_name(deltrig) FROM sysobjects WHERE type = "U" ORDER BY name Приведенный фрагмент выводит все таблицы вместе с триггерами. Чтобы вывести SQL-команды триггера, воспользуйтесь следующей процедурой: sp_helptext имя_триггера Следующая команда выводит список всех объектов, на которые существует ссылка в триггере: sp_depends имя_триггера Чтобы вывести все триггеры и сохраненные процедуры, ссылающиеся на таблицу, воспользуйтесь следующей командой: sp_depends имя_таблицы Наконец, для создания, удаления, модификации и просмотра триггеров можно воспользоваться утилитой SQL Enterprise Manager. Выделите таблицу, откройте меню Manage и выберите Task д Manage Triggers. На рис. 12.6 изображен триггер, созданный в SQL Enterprise Manager.
Рис. 12.6. Создание триггера в SQL Enterprise Manager Примеры экзаменационных вопросов Question 1 What are triggers used for? [Check all correct answers] • • • • •
A. Enforcing referential integrity by defining a default. B. Complex domain enforcement. C. Enforcing complex business rules. D. Enforcing complex defaults. E. Maintaining duplicate data.
converted to PDF by BoJIoc
Вопрос 1 Для каких целей используются триггеры? [Выберите все правильные ответы] • • • • •
A. Реализация ссылочной целостности посредством определения значений по умолчанию. B. Реализация сложных доменов. C. Реализация сложных деловых правил. D. Реализация сложных значений по умолчанию. E. Обработка дубликатов данных.
Правильные ответы — A, B, C, D и E. Question 2 When is a trigger fired? [Check all correct answers] • • • • •
A. When the trigger fire statement is executed. B. Before data modification. C. Before constant validation. D. After the transaction completes. E. After constraint validation, but before the transaction commits.
Вопрос 2 Когда срабатывает триггер? [Выберите все правильные ответы] • • • • •
A. При выполнении команды, вызывающей срабатывание триггера. B. Перед модификацией данных. C. Перед проверкой констант. D. После завершения транзакции. E. После проверки ограничений, но перед завершением.
Правильные ответы — A и E. Ответы B и C неверны, поскольку действия, описанные в них, выполняются раньше. Ответ D неверен, поскольку в этом случае триггер не мог бы откатить транзакцию. Ответ E тоже правилен, хотя его формулировка способна ввести в заблуждение. Question 3 How many triggers can exist on a table? • • • • •
A. None. B. No effective limit. C. Three. D. One for each type of data modification statement. E. None of the above.
Вопрос 3 Сколько триггеров может существовать в таблице? • • • • •
A. Ни одного. B. Количество практически не ограничено. C. Три. D. По одному для каждого типа команд модификации данных. E. Ни один из перечисленных вариантов.
Правильный ответ — B. Количество триггеров, существующих в таблице, практически не ограничено. Ответ A неверен, иначе триггеры бы вообще не существовали. Ответы C и D неверны; в них указаны ограничения, действовавшие в предыдущих версиях SQL Server. Question 4 How long does a trigger persist in a database? [Check all correct answers] • • • • •
A. Until the session is terminated. B. Until it is dropped. C. Until a new trigger is created without the append option. D. Until another trigger replaces it. E. Until the table it is created for is dropped.
Вопрос 4 Как долго триггер существует в базе данных? [Выберите все правильные ответы]
converted to PDF by BoJIoc
• • • • •
A. До завершения сеанса. B. До удаления. C. До создания нового триггера без параметра append. D. До его замены другим триггером. E. До удаления таблицы, для которой он создавался.
Правильные ответы — B, C, D и E. Ответ A неверен, поскольку триггер представляет собой объект, хранящийся в базе данных. Question 5 What are the inserted and deleted tables? • • • • •
A. Temporary tables located in the tempdb database. B. Special views of the transaction log. C. Separate database tables. D. All of the above. E. None of the above.
Вопрос 5 Что представляют собой таблицы inserted и deleted? • • • • •
A. Временные таблицы, находящиеся в базе данных tempdb. B. Специальные представления журнала транзакций. C. Отдельные таблицы базы данных. D. Все перечисленное. E. Ничего из перечисленного.
Правильный ответ — B. Таблицы inserted и deleted являются специальными представлениями журнала транзакций. Ответ A неверен, поскольку таблицы inserted и deleted не являются временными. Ответ С тоже неверен, таблицы являются представлениями журнала. Question 6 When can you access the inserted and deleted tables? • • • • •
A. You cannot access these tables, because they are log tables. B. Only within the transaction in which they are created. C. Only within the trigger that is firing. D. In the trigger in which it fires and in any nested trigger fired from the trigger. E. None of the above.
Вопрос 6 Каким образом можно получить доступ к таблицам inserted и deleted? • • • • •
A. К этим таблицам обратиться нельзя, поскольку они являются таблицами журнала. B. Только из транзакции, в рамках которой они были созданы. C. Только из срабатывающего триггера. D. Из сработавшего триггера и из всех вложенных триггеров, сработавших из этого триггера. E. Ничего из перечисленного.
Правильный ответ — C, поскольку эти таблицы доступны только из триггера. Question 7 What is the structure of the inserted and deleted tables? [Check all correct answers] • • • • •
A. Predefined. B. Set by the server defaults. C. Identical to each other. D. Identical to the base table. E. None of the above.
Вопрос 7 Какую структуру имеют таблицы inserted и deleted? [Выберите все правильные ответы] • • • •
A. Заранее определенную. B. Зависящую от настроек по умолчанию сервера. C. Идентичную друг другу. D. Идентичную базовой таблице.
converted to PDF by BoJIoc
• E. Ничего из перечисленного. Правильные ответы — C и D. Ответ B неверен, поскольку параметров по умолчанию для таблиц inserted и deleted не существует. Question 8 What are the contents of the inserted and deleted tables? [Check all correct answers] • • • • •
A. The inserted table contains all rows inserted or updated. B. The deleted table contains all rows deleted or updated. C. The inserted table contains only rows inserted. D. The deleted table contains only rows deleted. E. None of the above.
Вопрос 8 Как выглядит содержимое таблиц inserted и deleted? [Выберите все правильные ответы] • • • • •
A. Таблица inserted содержит все вставленные или обновленные записи. B. Таблица deleted содержит все удаленные или обновленные записи. C. Таблица inserted содержит только вставленные записи. D. Таблица deleted содержит только удаленные записи. E. Ни один из перечисленных ответов.
Правильные ответы — A и B. Ответ C неверен, поскольку таблица inserted содержит обновленные записи. Неверен и ответ D, поскольку таблица deleted тоже содержит обновленные записи. ГЛАВА 13
Транзакции Ключевые термины • • • • • • • •
Закрепление Взаимная блокировка Distributed Transaction Coordinator Блокировка Восстановление Откат Транзакция Журнал транзакций
Необходимые знания и приемы • • • • • • •
Управление транзакциями Использование команд управления транзакциями Понимание последовательности выполнения транзакций Знание ограничений, связанных с транзакциями Использование распределенных транзакций Понимание структуры журнала транзакций Блокировка транзакций
Транзакции являются одной из самых важных концепций, необходимых для построения приложений SQL Server. Механизм транзакций тесно связан с природой реляционных СУБД, поскольку именно транзакции обеспечивают целостность данных в любых ситуациях. Природа транзакций Транзакция представляет собой команду SQL или группу команд SQL, которые успешно завершаются или отменяются как единое целое. Транзакция является логической единицей работы, обладающей следующими свойствами: • Атомарность — транзакция является автономной единицей работы. • Согласованность — транзакция обеспечивает целостность данных и внутренних структур данных. • Изолированность — две транзакции могут работать с одними и теми же данными независимо от изменений, вносимых другой транзакцией.
converted to PDF by BoJIoc
• Устойчивость — последствия транзакции продолжают действовать до тех пор, пока не будут модифицированы другой транзакцией. Классическим примером транзакции является пересылка денег через банкомат. Предположим, вы хотите воспользоваться банкоматом для перевода $5000 с накопительного счета на текущий. Программа вычитает $5000 с накопительного счета, после чего увеличивает текущий счет на $5000. Во время работы программы после вычитания денег с накопительного счета, но до увеличения текущего счета на банкомате происходит сбой питания. Вопрос: что происходит с $5000? Деньги возвращаются на накопительный счет, помещаются на текущий счет или пропадают навеки? Если эти две команды объединены в транзакцию, проблем нет. Это гарантирует, что обе команды либо успешно завершатся, либо не завершится ни одна из них. Без транзакций существует опасность того, что будет выполнена лишь одна команда. Перейдем к менее классическому, но более реальному примеру. Предположим, вы выполняете команду UPDATE, обновляющую несколько записей. В процессе обновления происходит сбой (нарушение питания, выключение SQL Server или физический сбой на сервере). Что произойдет в тот момент, когда данные снова станут доступными? Завершится ли операция обновления? Нет. Произойдет откат. В системах «клиент/сервер» при разрыве связи подключение не восстанавливается. Вместо этого создается новое подключение. Сервер не располагает средствами, позволяющими связать старое подключение с новым. В результате SQL Server не пытается продолжить выполнение незавершенных транзакций. Следовательно, в приведенном примере выполнение команды UPDATE будет прервано и вам придется выполнить ее заново. Внимание Эта глава не слишком длинна, однако в ней представлены многие определения, критически важные для понимания SQL Server и потому часто встречающиеся на экзаменах. По умолчанию любая команда SQL представляет собой транзакцию. Кроме того, несколько команд SQL также могут быть объединены в одну транзакцию. Транзакции используются для различных целей, в том числе: • для соблюдения деловых правил или ссылочной целостности; • управления отдельными единицами работы; • обеспечения согласованности данных, особенно для избыточных или сводных данных. В SQL Server возможности управления транзакциями существуют во всех пользовательских базах данных. Для этого в SQL Server предусмотрено несколько механизмов, в том числе: • • • •
команды управления транзакциями; журналы транзакций с опережающей записью (write-ahead); автоматическое восстановление; автоматическая блокировка.
Команды управления транзакциями Команды управления транзакциями определяют логические единицы выполняемой работы. В табл. 13.1 перечислены команды управления транзакциями SQL Server и приведены краткие описания. Следует помнить, что команды управления транзакциями не влияют на последовательность выполнения программы. В листинге 13.1 приведен пример транзакции, демонстрирующий применение пар BEGIN TRAN…COMMIT TRAN для объединения нескольких команд SQL в одну логическую единицу работы. Листинг 13.1. Пример транзакции BEGIN TRAN UPDATE savings_account SET balance = balance - $5000 WHERE account_number = @sav_account IF @@error != 0 BEGIN
converted to PDF by BoJIoc
ROLLBACK TRAN RETURN END UPDATE checking_account SET balance = balance + $5000 WHERE account_number = @chk_account IF @@error != 0 BEGIN ROLLBACK TRAN RETURN END COMMIT TRAN В листинге 13.1 команда BEGIN TRAN сообщает серверу о начале транзакции. Это означает, что до получения сервером команды завершения транзакции (COMMIT TRAN) все изменения являются временными. Следовательно, если на сервере произойдет сбой после первого обновления, произойдет откат транзакции. Термин «откат» означает, что все последствия транзакции будут отменены; данные на сервере будут выглядеть так, словно никаких изменений не было. Чтобы обеспечить согласованность транзакций, фрагмент в листинге 13.1 блокирует модифицированную информацию до завершения транзакции. Термин «блокировка» (lock) означает, что никакой процесс не сможет обратиться к данным до их освобождения (посредством закрепления или отката транзакции). Таблица 13.1. Команды управления транзакциями и их применение Синтаксис
Применение
BEGIN TRAN[SACTION] [имя_транзакции|@переменная]
Определяет начало транзакции и заставляет сервер занести в журнал запись BEGIN TRAN.
COMMIT TRAN[SACTION] [имя_транзакции|@переменная]
Информирует сервер о завершении текущей транзакции, заставляет занести в журнал запись COMMIT TRAN и делает изменения данных постоянными.
COMMIT WORK Работает аналогично COMMIT TRAN, но без имени транзакции.
Соответствует синтаксису ANSI-92.
ROLLBACK TRAN[SACTION] [имя_транзакции|имя_точки_сохранения|@переменная]
Заставляет сервер отменить все изменения данных от последней определенной точки сохранения или от начала транзакции.
ROLLBACK WORK Работает аналогично ROLLBACK TRAN, но без имени транзакции.
Соответствует синтаксису ANSI-92.
SAVE TRAN[SACTION] имя_транзакции|@переменная
Регистрирует промежуточную точку, к которой может выполняться откат (обеспечивает возможность частичного отката). Транзакция остается активной.
Внимание Только процесс, являющийся владельцем блокировки, сможет просмотреть заблокированную модифицированную страницу. Если во время транзакции произойдут ошибки (или если этого требует логика программы), выполняется команда ROLLBACK TRAN. Внимание Команда ROLLBACK TRAN не влияет на последовательность выполнения команд программы. Следовательно, после отката необходимо выполнить команду RETURN. Команды управления транзакциями не влияют на последовательность выполнения программы.
converted to PDF by BoJIoc
Последовательность выполнения транзакций Последовательность выполнения транзакций проще всего продемонстрировать на каком-нибудь примере. Рассмотрим рис. 13.1. На этом рисунке транзакция начинается в первой строке кода. Сервер запоминает этот факт, обновляя глобальную переменную @@TRANCOUNT. Переменная @@TRANCOUNT равна 0 для открытой транзакции и 1 или больше в зависимости от уровня вложенности транзакции.
Рис. 13.1. Последовательность выполнения вложенных транзакций Внимание Проверка значения @@TRANCOUNT в программе позволяет узнать о наличии открытой транзакции. После открытия транзакции команда INSERT добавляет запись в таблицу tally. Добавленная запись находится в таблице и может участвовать в запросах со стороны процесса, открывшего транзакцию, но не со стороны всех остальных процессов. До закрепления транзакции она не является постоянным объектом базы данных. Команда SAVE TRAN используется в качестве «закладки». Она не влияет на значение @@TRANCOUNT и не изменяет уровня вложенности транзакции, а лишь позволяет позднее вернуть транзакцию к точке сохранения. Обратите внимание: откаты, закрепления и команды BEGIN TRAN не обязаны образовывать пары, аналогичные традиционным (и необходимым с точки зрения синтаксиса) парам BEGIN/END. Каждая транзакция завершается откатом или закреплением, однако для упрощения логики программа может содержать несколько команд отката и/или закрепления.
converted to PDF by BoJIoc
Независимо от количества вложенных команд BEGIN TRAN вложенность является лишь синтаксической. Другими словами, действительно активной является лишь одна транзакция. Эта открытая транзакция закрепляется в базе данных только командой COMMIT самого верхнего уровня. SQL Server следит за этим, уменьшая значение @@TRANCOUNT на единицу для каждого закрепления. Хотя закрепление уменьшает значение @@TRANCOUNT, неуточненная команда ROLLBACK вызывает откат к самой внешней транзакции. Если глобальная переменная @@TRANCOUNT так и не возвращается к нулевому значению, транзакция считается незавершенной и откатывается. Блокировка сохраняется до завершения транзакции по той или иной причине. Тем не менее, существуют некоторые действия, которые не могут выполняться в транзакциях. Ограничения транзакций Транзакции SQL Server должны подчиняться некоторым ограничениям. Например, транзакция относится к конкретному серверу (то есть не может распространяться на несколько серверов). Для создания мультисерверных транзакций следует использовать Distributed Transaction Coordinator. Другое ограничение связано с дистанционным вызовом процедур (RPC). RPC представляют собой хранимые процедуры, находящиеся на других серверах и не являющиеся локальными по отношению к серверу. Следовательно, RPC не могут управляться локальным журналом транзакций и потому не могут быть отменены откатом локального процесса (снова приходится использовать Distributed Transaction Coordinator). Наконец, некоторые команды DDL (Data Definition Language) не могут использоваться в транзакциях. Их список приведен ниже: • ALTER/CREATE/DROP DATABASE; • DUMP/LOAD DATABASE/TRANSACTION; • UPDATE STATISTICS. Распределенные транзакции (то есть транзакции, распространяющиеся на две и более базы данных) обладают собственным набором правил и ограничений. Распределенные транзакции Как упоминалось выше, распределенной транзакцией называется транзакция, распространяющаяся на две и более базы данных. Если обе базы данных находятся на одном сервере, Distributed Transaction Coordinator позволяет SQL Server управлять ходом транзакции. Если базы данных находятся на разных серверах, Distributed Transaction Coordinator использует в журналах транзакций процесс «двухфазового закрепления» (two-phase commit). Распределенные транзакции проходят двухфазовое закрепление. В первой (подготовительной) фазе диспетчер транзакции посылает всем серверам-участникам команду «приготовиться к закреплению». Непосредственное закрепление происходит во второй фазе, когда диспетчер транзакции после успешного завершения первой фазы посылает всем серверам оповещение. Если где-нибудь произойдет сбой, все компоненты транзакции откатываются на всех серверах. Кроме двухфазового закрепления существуют дополнительные команды управления транзакциями, используемые для управления распределенными транзакциями: BEGIN DISTRIBUTED TRAN[SACTION] [имя_транзакции|переменная] По этой команде сервер запускает Distributed Transaction Coordinator. Распределенные транзакции закрепляются командой COMMIT TRAN, завершающей любую другую транзакцию. Команда закрепления или отката распределенной транзакции выдается тем же сервером, на котором была выполнена команда BEGIN DISTRIBUTED TRANSACTION. Этот сервер называется управляющим (controlling server). Включение серверов в распределенную транзакцию осуществляется сервером, непосредственно инициировавшим транзакцию, или любым другим сервером, участвующим в транзакции. Добавленные серверы называются координирующими серверами (coordinating servers).
converted to PDF by BoJIoc
Обратите внимание: координирующие серверы не запрашивают участие в транзакции, а получают требование извне. Внимание Распределенные транзакции могут вызывать лишь хранимые процедуры на распределенных серверах. Координирующий сервер использует либо хранимую процедуру, либо встроенный SQL-код. Перейдем к следующему важнейшему компоненту управления транзакциями — журналу транзакций. Журнал транзакций Каждый экземпляр SQL Server ведет журнал транзакций, в котором регистрируются все изменения данных в базе. Формат журнала транзакций не подходит для чтения или модификации со стороны пользовательского процесса. Для некоторых операций (например, CREATE INDEX) регистрируются не изменения данных, а сведения об использовании страниц. Внимание В SQL Server 7 журнал транзакций представляет собой файл, отдельный от базы данных. В предыдущих версиях журнал транзакций был таблицей базы данных с именем syslogs. В этом заключается одно из принципиальных отличий новой версии SQL Server. Журналы транзакций обеспечивают прямое и обратное восстановление транзакций. Восстановление автоматически происходит при запуске сервера. В процессе восстановления данные синхронизируются с журналом (синхронизация может быть нарушена в процессе сброса данных из кэша на диск). В журнале транзакций также регистрируются изменения, производимые текущей транзакцией, что позволяет выполнить откат и вернуть данные к состоянию, действовавшему до начала изменений. Что же в действительности происходит в процессе регистрации транзакции? Последовательность событий при регистрации транзакций Процесс регистрации транзакций существует для того, чтобы обеспечивать транзакционную целостность данных. Сначала команда BEGIN TRAN записывается в журнал, находящийся в кэше; при этом запоминается уникальный номер транзакции, а также ее номер последовательности. Затем в кэше модифицируются страницы журнала (в SQL Server реализован журнал транзакций с опережающей записью). Далее в кэше модифицируются страницы данных. Наконец, команда COMMIT TRAN записывается в журнал, находящийся в кэше, после чего кэш с журналом сбрасывается на диск. Обратите внимание на то, что не стоит торопиться с перенесением на диск страниц данных, поскольку в процессе восстановления сервер может воссоздать страницы данных по страницам журнала. Контрольные точки «Контрольная точка» (checkpoint) — это процесс записи всех грязных страниц данных (dirty pages) из кэша на диск. «Грязными» называются страницы данных в кэше, которые были модифицированы, однако эти модификации еще не были отражены на диске. Сначала на диск записываются страницы журнала, а затем — страницы данных. Затем на диск записывается маркер контрольной точки. Маркер контрольной точки представляет собой механизм, уменьшающий время восстановления, поскольку к моменту завершения контрольной точки база данных на диске полностью синхронизирована (то есть журнал соответствует данным). Контрольные точки устанавливаются в следующих ситуациях: • • • •
Превышен интервал восстановления сервера. На сервере не осталось свободного места в кэше и он выгружает грязные страницы. Владелец базы данных выполняет команду CHECKPOINT. Выполняется резервное копирование журнала транзакций.
Транзакции устанавливают блокировку записей, страниц или таблиц. Это делается для того, чтобы никто не мог модифицировать или просмотреть данные незавершенной транзакции. Блокировка в транзакциях Блокировка объектов обеспечивает согласованность данных. Пока один процесс модифицирует данные, другой процесс не должен работать с ними. Как упоминалось выше в этой главе, блокировка сохраняется
converted to PDF by BoJIoc
до завершения транзакции. Существует несколько уровней блокировки, предназначенных для разных приложений в разных ситуациях. Уровни блокировки определяются стандартом SQL ANSI-92. Уровни изоляции ANSI-92 Стандарт SQL ANSI-92 определяет четыре уровня изоляции транзакций SQL. Каждый уровень изоляции описывает типы действий, выполнение которых для данного уровня запрещено. В следующих разделах описаны все уровни изоляции ANSI. Помните о том, что высокие уровни включают в себя низкие уровни. Также обратите внимание на альтернативные имена различных уровней изоляции: • • • •
READ UNCOMMITED — ANSI-уровень 0; READ COMMITED — ANSI-уровень 1; REPEATABLE READ — ANSI-уровень 2; SERIALIZABLE — ANSI-уровень 3.
Уровень изоляции 0 — READ UNCOMMITED Уровень 0 допускает грязное чтение. Процесс, выполнящий чтение данных, не нуждается в блокировках и не получает их. Уровень 0 реализуется командой NOLOCK или параметром READUNCOMMITED команд SELECT и SET. Этот уровень блокировки гарантирует лишь то, что данные не будут физически нарушены. Уровень изоляции 1 — READ COMMITED Уровень 1 является уровнем блокировки по умолчанию; он предотвращает грязное чтение. В SQL Server уровень 1 реализуется с помощью механизма монопольных блокировок. SQL Server также позволяет переопределить альтернативный уровень изоляции командой SET LOCKIMPLEMENTS или параметром READ COMMITED команд SELECT и SET. Уровень изоляции 2 — REPEATABLE READ Уровень 2 запрещает неповторяемые операции чтения. Таким образом, вторая транзакция не сможет модифицировать запись, которая в настоящее время читается текущей транзакцией. В SQL Server уровень 2 реализуется параметром REPEATABLE команд SELECT и SET. Уровень изоляции 3 — SERIALIZABLE Уровень 3, последний уровень изоляции, запрещает чтение фантомных записей. Он предотвращает ситуацию, при которой набор выбранных записей отличается от набора, прочитанного ранее в этой транзакции с тем же критерием выборки. В SQL Server уровень 3 реализуется параметрами HOLDLOCK и SERIALIZABLE команд SELECT и SET. Уровень изоляции по умолчанию Как упоминалось выше, по умолчанию в SQL Server используется уровень изоляции 1. В соответствии со стандартом ANSI для транзакций должна существовать возможность установки уровня изоляции 3. Уровень изоляции, используемый по умолчанию для сеанса, задается командой SET: SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITED | REPEATABLE READ | SERIALIZABLE } При установке значения SERIALIZABLE ко всем командам SELECT транзакции автоматически применяется параметр HOLDLOCK. Уровень изоляции транзакции продолжает действовать на протяжении всего сеанса или до установки нового уровня. Чтобы узнать текущий уровень изоляции, воспользуйтесь командой DBCC USEROPTIONS. Все блокировки в SQL Server устанавливаются автоматически. В табл. 13.2 перечислены уровни гранулярности, а в табл. 13.3 — различные типы блокировок. Таблица 13.2. Гранулярность блокировок Ресурс
Описание
Идентификатор записи Отдельная запись по идентификатору записи (rid).
converted to PDF by BoJIoc
Ключ
Отдельная запись по уникальному индексу (ключу).
Страница
8-килобайтная страница данных или страница индекса.
Блок страниц (extent)
Смежная группа из 8 страниц данных или страниц индекса.
Таблица
Вся таблица, включая все данные и индексы.
База данных
Вся база данных.
Таблица 13.3. Типы блокировок Тип
Описание
Монопольная блокировка(X)
Разрешает читать или записывать данные только тому процессу, которому принадлежит блокировка. Всем остальным одновременно работающим пользователям это запрещается. Монопольная блокировка обычно используется при модификации данных.
Условная разделяемая блокировка(IS)
Принимает запросы на чтение данных.
Условная блокировка модификации (IX)
Принимает запросы на модификацию данных.
Разделяемая (S)
Чтение данных разрешается любому процессу, но записывать не может никто. Количество одновременно работающих пользователей не ограничено.
Разделяемая Устанавливает параллельные блокировки для ресурсов высокого уровня (таблиц) и блокировка с условно- монопольные блокировки для некоторых ресурсов низкого уровня монопольной (SIX) (страницы/записи).
Структурная
Применяется для системных таблиц и индексов. По сравнению с остальными типами структурные блокировки расходуют намного больше ресурсов и обеспечивают большую степень параллельности. Структурная блокировка модификации (SCH-M) используется при модификации структуры данных и выполнении DDL. Раздельная структурная блокировка (SCH-S) используется при компиляции запросов. Раздельная структурная блокировка не запрещает никакие блокировки.
Модификации (U)
Действует как "закладка", помогающая SQL Server избежать взаимных блокировок. Разрешает разделяемые блокировки, но запрещает другие блокировки модификации или монопольные блокировки.
Механизм расширения блокировок (lock escalation) позволяет повысить быстродействие при запросе чрезмерного количества блокировок для страницы или таблицы в одной транзакции. Расширение блокировок SQL Server стремится устанавливать блокировку на уровне записей, чтобы обеспечить максимальную параллельность в работе. При этом SQL Server устанавливает для страниц и таблиц условные блокировки. С увеличением количества блокировок записей для одной команды SQL Server может перейти к блокировке страниц, если количество записей превышает пороговое значение. При расширении блокировки все блокировки более низкого уровня снимаются. SQL Server динамически определяет пороги расширения, для них не существует параметров конфигурации. Некоторые сведения о блокировках Если процесс получает монопольную блокировку для записи, страницы или таблицы, то до закрепления или отката транзакции ни один процесс не сможет прочитать этот объект или установить для него блокировку. Если процесс устанавливает разделяемую блокировку объекта, то другие процессы не смогут установить монопольную блокировку до снятия разделяемой блокировки. Если это приводит к возникновению проблем, сервер может перейти к блокировке по требованию (demand lock). Конкуренция процессов из-за блокировок может отрицательно сказаться на быстродействии системы. Старайтесь работать с базой данных с помощью хранимых процедур, чтобы свести к минимуму время, затрачиваемое на блокировку.
converted to PDF by BoJIoc
Совет Постарайтесь сократить объем транзакций и убрать из них лишние команды SELECT. Тем самым вы сокращаете время, в течение которого сохраняется блокировка объектов. Приложение никогда не должно держать блокировку в ожидании ввода данных от пользователя. Разделяемые блокировки обычно снимаются после чтения страницы или записи. Переопределение блокировок на уровне запросов Вы можете переопределить тип блокировки, используемый сервером, однако этой возможностью не стоит злоупотреблять. Помимо HOLDLOCK MS SQL Server позволяет определять на уровне запросов и другие типы блокировок. Если после имени таблицы в секции FROM следует одно из перечисленных ниже ключевых слов, запрос вмешивается в работу диспетчера блокировок SQL Server и применяет заданный тип блокировки. Блокировка сохраняется на время выполнения команды или транзакции, содержащей команду. Возможны следующие типы блокировок: • • • • • •
NOLOCK — разрешает грязное чтение; PAGLOCK — блокировка на уровне страниц, возможно расширение; ROWLOCK — блокировка на уровне записей; TABLOCK — разделяемая блокировка таблицы; TABLOCKX — монопольная блокировка таблицы; UPDLOCK — вместо разделяемой блокировки используется блокировка модификации.
Приведем примеры команд SELECT, в которых переопределяется механизм блокировки по умолчанию: SELECT * FROM titles NOLOCK WHERE title_id = "394-92-9841" SELECT * FROM publishers TABLOCKX HOLDLOCK Помните: каждая блокировка, установленная вами, мешает другим процессам получить доступ к информации. Выбор уровня блокировки для индексов Процедура sp_indexoption позволяет запрещать уровни блокировки для индексов. Например, для системы DSS с незначительным количеством обновлений можно ограничиться только разделяемыми блокировками. Для отключения блокировки на уровне страниц и/или записей используется хранимая процедура sp_indexoption: sp_indexoption имя_индекса, имя_параметра, значение Имя_параметра принимает значения AllowRowLocks или AllowPageLocks, а значение — TRUE или FALSE. Следующий пример показывает, как отключить блокировку на уровне записей с помощью хранимой процедуры sp_indexoption: sp_indexoption 'mytable.myindex',AllowRowLocks,'FALSE' Команда запрещает блокировку на уровне записей для индекса myindex таблицы с именем mytable. Совет Процедурой sp_indexoption следует пользоваться крайне осторожно. Примеры экзаменационных вопросов Question 1 When is a transaction made permanent in a database? [Check all correct answers] • A. After the first commit. • B. After the final commit. • C. After any checkpoint.
converted to PDF by BoJIoc
• D. When the session terminates. • E. All of the above. Вопрос 1 Когда результаты выполнения транзакции заносятся в базу данных? [Выберите все правильные ответы] • • • • •
A. После первой команды commit. B. После завершающей команды commit. C. После любой контрольной точки. D. При завершении сеанса. E. Во всех перечисленных случаях.
Правильный ответ — B. Единственное действие, в результате которого транзакция заносится в базу данных, — переход @@TRANCOUNT в нулевое значение, что означает завершающее закрепление транзакции. Ответ A неверен, поскольку транзакция может содержать более одного уровня. Ответ C тоже неверен; контрольные точки не имеют никакого отношения к уровням вложенности транзакций. Наконец, ответ D неверен, поскольку он приводит к откату. Question 2 When does recovery occur? • • • • •
A. Automatically when the server is started. B. Automatically when the server is stopped. C. Only during the recover server command. D. After each rolled back transaction. E. All of the above.
Вопрос 2 Когда происходит восстановление? • • • • •
A. Автоматически при запуске сервера. B. Автоматически при остановке сервера. C. Только по команде recover server. D. После каждого отката транзакции. E. Во всех перечисленных случаях.
Правильный ответ — A. Восстановление автоматически выполняется при запуске сервера. Ответ B неверен, поскольку при остановке выполняется процесс контрольной точки. Ответ C неверен — команды recover server не существует. Ответ D неверен, поскольку процесс восстановления не запускается после каждого отката транзакции. Question 3 How many transaction isolation levels does the ANSI standards board define? • • • • • •
A. Zero. B. One. C. Two. D. Three. E. Four. F. None of the above.
Вопрос 3 Сколько уровней изоляции транзакций определяет комитет по стандартам ANSI? • • • • • •
A. Ноль. B. Один. C. Два. D. Три. E. Четыре. F. Ни один из перечисленных ответов.
Правильный ответ — E. Комитет по стандартам ANSI определяет четыре уровня изоляции. Question 4 How long does a completed transaction persist in a database? • A. Until it is rolled back.
converted to PDF by BoJIoc
• • • •
B. Until it is committed. C. Until the locks are released. D. Until another transaction replaces it. E. None of the above.
Вопрос 4 До какого времени завершенная транзакция продолжает существовать в базе данных? • • • • •
A. До отката. B. До закрепления. C. До снятия блокировок. D. До ее замены другой транзакцией. E. Ни один из перечисленных ответов.
Правильный ответ — E. Question 5 What lock types are supported by SQL Server? [Check all correct answers] • • • • •
A. Row level. B. Page level. C. Table level. D. Database level. E. Server level.
Вопрос 5 Какие типы блокировок поддерживаются в SQL Server? [Выберите все правильные ответы] • • • • •
A. На уровне записей. B. На уровне страниц. C. На уровне таблиц. D. На уровне баз данных. E. На уровне серверов.
Правильные ответы — A, B, C и D. SQL Server поддерживает блокировку на уровне записей, страниц, таблиц и баз данных (а также на некоторых других уровнях). Ответ E неверен, поскольку блокировки на уровне серверов не существует. ГЛАВА 14
Импорт, экспорт и преобразование данных Ключевые термины • • • •
Импорт Экспорт Преобразование Утилита dtswiz
Необходимые знания и приемы • Использование программы BCP • Использование Data Transformation Service При работе с базой данных необходимо иметь возможность как внести в нее новые данные, так и извлечь уже существующие данные. В SQL Server существует несколько способов импорта и экспорта данных в базах. Термин «импорт» означает загрузку данных в базу, а «экспорт» — перенос данных из базы. Кроме того, данные можно преобразовать из одного формата в другой. В этой главе рассматриваются импорт и экспорт данных SQL Server с помощью программ BCP (Bulk Copy Program) и DTS (Data Transformation Service). BCP
converted to PDF by BoJIoc
Программа bcp.exe (BCP) предназначена для импорта и экспорта данных из таблиц баз данных SQL Server. Она устанавливается во время установки SQL Server и находится в подкаталоге binn основного каталога SQL Server. Внимание Данные, загружаемые в SQL Server, считаются импортированными. Когда BCP копирует данные в базу из файла (при осуществлении импорта), данные присоединяются к существующим таблицам. При копировании данных из базы в файл (экспорте) BCP стирает все текущее содержимое файла. Программа BCP способна читать и записывать данные в нескольких форматах. Различные форматы, используемые BCP, будут перечислены при описании параметров. Наиболее распространенным форматом в SQL Server является символьный формат с разделением полей запятыми. Примечание Если предыдущие версии bcp.exe подключались к SQL Server через DB-library, то BCP версии 7 использует для этой цели ODBC. При загрузке данных в таблицу базы данных с помощью BCP таблица должна заранее существовать в базе. Кроме того, для нее необходимо иметь разрешения на вставку и выборку данных. Количество и порядок полей в файле не обязательно должны совпадать со структурой таблицы. Однако в том случае, если между ними существуют отличия, необходимо использовать файл форматирования. В файле форматирования перечисляются импортируемые и экспортируемые столбцы, их порядок, длина и символы-разделители столбцов. Более того, типы данных файла форматирования должны быть совместимы с типами данных столбцов. В первой строке файла форматирования указывается номер версии BCP, а во второй — количество импортируемых или экспортируемых столбцов. Остальные строки файла форматирования содержат группы из семи полей в следующем порядке: • • • • • • •
Позиция поля в файле данных. Тип данных поля. Длина префикса (0, 1, 2 или 4). Максимальная длина поля в файле данных. Разделитель полей (обычно используется символ табуляции \t). Номер столбца в таблице SQL Server. Имя столбца в таблице SQL Server. Не обязательно должно совпадать с настоящим именем столбца.
Поведение BCP при импорте и экспорте данных зависит от множества параметров. Синтаксис запуска утилиты BCP показан в листинге 14.1. Листинг 14.1. Синтаксис BCP bcp [[имя_базы.][владелец].]имя_таблицы {in | out | format} файл_данных [-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 INSERT. Внимание Если параметр содержит какие-либо специальные символы, он должен заключаться в кавычки. Например: bcp pubs..authors out au.dat -U"My Account" Ниже перечислены параметры BCP: • IN|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 Server 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 — определяет рекомендации (hints) для оптимизатора, используемые в процессе пакетного копирования данных в таблицу. Допустимые рекомендации оптимизатора BCP перечислены в табл. 14.1. Таблица 14.1. Рекомендации оптимизатора BCP Рекомендация
Значение
ORDER (столбец[ASC|DESC][,n])
Порядок сортировки данных в файле данных.
ROWS_PER_BATCH = bb
Количество записей данных в пакете. Не используется совместно с параметром -b.
KILOBYTES_PER_BATCH = cc
Количество килобайт данных в пакете.
TABLOCK
На время операции пакетного копирования устанавливается блокировка на уровне таблицы.
CHECK_CONSTRAINTS
В процессе загрузки данных SQL Server проверяет ограничения таблиц.
Запуск BCP При копировании данных (импортировании или экспортировании) с параметрами -n или -c BCP запрашивает только пароль (при условии, что он не был передан с параметром -P). Если в командной строке не используются ни параметр -n, ни параметр -c, BCP запрашивает информацию о каждом поле в таблице. При каждом запросе в квадратных скобках выводится значение по умолчанию, которое можно принять нажатием клавиши Enter. Запрашивается следующая информация: • • • •
тип данных в файле (может быть символьным или любым допустимым типом данных SQL Server); длина префикса в байтах; объем данных в файле; разделитель поля (любая символьная строка).
После ответов на вопросы о каждом поле утилита BCP спрашивает, хотите ли вы сохранить сведения о формате в файле. Внимание Вы можете одновременно выполнить несколько операций пакетного копирования, запуская несколько экземпляров BCP для одной таблицы. Это возможно лишь в том случае, если выполняются все требования пакетного копирования без регистрации в журнале (установлен флаг SELECT INTO/BULKCOPY базы данных, таблица не имеет триггеров и не участвует в репликации) и если таблица не имеет индексов. Data Transformation Service DTS (Data Transformation Service) используется для импортирования, экспортирования и преобразования данных между несколькими разнородными источниками данных. DTS может использоваться для любого источника данных, с которым можно работать через OLE DB. Если для этого источника данных отсутствует драйвер OLE DB, можно воспользоваться драйвером OLE DB для ODBC. Data Transformation Service использует мастера DTS (DTS Wizard) для создания DTP (Data Transformation Package). Запуск DTP выполняет преобразование данных. DTS можно вызвать непосредственно из SQL Server Enterprise Manager, запустить программу dtswiz.exe или обратиться к DMO (Distributed Management Object). Компоненты DTS DTS состоит из четырех компонентов: • • • •
мастер импорта (Import Wizard); мастер экспорта (Export Wizard); конструктор пакетов (Package Designer); программные COM-интерфейсы.
Все компоненты кратко описаны в следующих разделах.
converted to PDF by BoJIoc
DTS Import Wizard Мастер импорта руководит вашими действиями по импорту данных в базу SQL Server. Выполните следующие действия: 1. Запустите DTS Import Wizard и нажмите кнопку Next. 2. В следующем окне выберите источник данных, содержащий импортируемые данные. Затем введите все параметры, необходимые для подключения (параметры зависят от источника данных). Нажмите кнопку Next. 3. В следующем окне выберите приемник данных и введите параметры, необходимые для подключения. Нажмите кнопку Next. 4. На следующем экране выберите команду Copy Tables (выбор копируемых таблиц) или Use Query (ввод команды SQL, определяющей копируемые данные). Нажмите кнопку Next. 5. Если в предыдущем окне была выбрана команда Copy Tables, появляется окно для выбора копируемых таблиц. Если была выбрана команда Use Query, вам придется либо вручную ввести запрос в следующем окне, либо воспользоваться услугами конструктора запросов Query Builder (запускается кнопкой Query Builder). Нажмите кнопку Next. 6. Выберите нужное действие — запустить пакет, сохранить пакет, создать пакет для репликации или запланировать выполнение пакета. Нажмите кнопку Next. Если вы решили запустить пакет, появляется окно, в котором выводится статус выполнения. В случае сохранения пакета вам будет предложено ввести имя и описание пакета, а также сведения о сервере. 7. В следующем окне нажмите кнопку Finish, чтобы выполнить все выбранные действия. DTS Export Wizard Мастер экспорта руководит вашими действиями по экспорту данных из базы SQL Server. Выполните следующие действия: 1. Запустите DTS Export Wizard и нажмите кнопку Next. 2. В следующем окне выберите источник данных, содержащий экспортируемые данные. Введите все параметры, необходимые для подключения. Нажмите кнопку Next. 3. В следующем окне выберите приемник данных и введите параметры, необходимые для подключения. Нажмите кнопку Next. 4. На следующем экране выберите команду Copy Tables или Use Query. Нажмите кнопку Next. 5. Если в предыдущем окне была выбрана команда Copy Tables, появляется окно для выбора копируемых таблиц. Если была выбрана команда Use Query, вам придется либо вручную ввести запрос в следующем окне, либо воспользоваться услугами конструктора запросов Query Builder (запускается кнопкой Query Builder). Нажмите кнопку Next. 6. Выберите нужное действие — запустить пакет, сохранить пакет, создать пакет для репликации или запланировать выполнение пакета. Нажмите кнопку Next. Если вы решили запустить пакет, появляется окно, в котором выводится статус выполнения. В случае сохранения пакета вам будет предложено ввести имя и описание пакета, а также сведения о сервере. 7. В следующем окне нажмите кнопку Finish, чтобы выполнить все выбранные действия. DTS Package Designer Конструктор пакетов предназначен для графического конструирования пакетов DTS. Пакет DTS определяет последовательность действий, выполняемых в процессе преобразования данных. В простейшем случае пакет DTS содержит одно действие по импорту или экспорту, определенное мастерами импорта или экспорта. Конструктор пакетов является частью SQL Server Enterprise Manager. Он позволяет сохранить пакет DTS в базе данных MSDB SQL Server, в Microsoft Repository или в структурированном файле COM. Более того, пакет DTS можно запланировать для последующего выполнения.
converted to PDF by BoJIoc
Программные COM-интерфейсы COM-интерфейсы предназначены для создания и выполнения пакетов DTS. С COM-интерфейсами можно работать в любом языке программирования с поддержкой OLE Automation. Они позволяют создавать специализированные приложения, использующие пакеты DTS и объекты Data Pump. Преобразование данных Одной из самых полезных возможностей DTS является преобразование данных. В процессе преобразования DTS определяет набор операций, выполняемых с данными при передаче в приемник. Новые значения вычисляются по одному или нескольким полям источника. Преобразование позволяет организовать сложную проверку, чистку и дополнение данных в процессах экспортирования или импортирования. Внимание DTS копирует только структуру данных и сами данные. Другие объекты баз данных (триггеры, хранимые процедуры, правила, значения по умолчанию, ограничения и пользовательские типы данных) не преобразуются. При работе с мастерами импорта и экспорта DTS можно определить взаимную привязку столбцов, а также ввести информацию о преобразованиях. Отображения столбцов В окне Column Mappings (рис. 14.1) определяется структура таблиц, в которую передаются данные, а также соответствия между столбцами источника и приемника.
Рис. 14.1. Окно Column Mappings DTS позволяет создать таблицы-приемники, а также удалять и заново создавать существующие таблицы. Если создание таблицы-приемника не является частью операции DTS, можно удалить содержимое существующей таблицы или присоединить новые данные к уже существующим. Как видно из рис. 14.1, окно Column Mappings позволяет указать, какое поле источника соответствует каждому полю приемника. Кроме того, для каждого выходного столбца можно изменить тип данных, разрешить или запретить значения типа NULL, а также задать размер и точность. Кнопка Edit SQL (рис. 14.2) позволяет ввести команду SQL для таблицы-приемника. Преобразования В окне Transformations (рис. 14.3) можно непосредственно скопировать столбцы источника в столбцы приемника или задать сценарий, который будет выполняться DTS для преобразования данных.
converted to PDF by BoJIoc
Если выбрать непосредственное копирование данных, в окне Advanced Transformation Options можно задать значения дополнительных флагов, управляющих процессом преобразования. Флаги, устанавливаемые в этом окне, перечислены в табл. 14.2. Как правило, эти флаги обеспечивают все необходимые функциональные возможности. Если вам потребуется более сложное преобразование, установите переключатель Transfer Information на вкладке Transformations и выберите тип сценария (Java Script, Perl Script или Visual Basic Script). Для каждого типа DTS генерирует сценарий по умолчанию. В листинге 14.2 приведен пример сценария, написанного на Visual Basic.
Рис. 14.2. Окно Create Table SQL Statement
Рис. 14.3. Вкладка Transformations
converted to PDF by BoJIoc
Таблица 14.2. Флаги преобразования данных Флаг
Эффект
Default transformation flags (Стандартные флаги преобразования) All possible Conversions are allowed (Разрешить любые преобразования)
Разрешает преобразования без потерь данных, понижение типа данных и преобразования NULL.
Require exact match between source and destination (Требовать точного соответствия между источником и приемником)
Означает, что столбцы источника и приемника должны иметь одинаковый тип данных, размер, точность и возможность NULL. Это самое строгое ограничение.
Custom transformation flags (Нестандартные флаги преобразования) Allow data type promotion (Разрешить повышение типов данных)
Разрешает преобразование числовых типов в числовые типы большего размера. Например, столбец TINYINT может быть преобразован в INTEGER.
Allow data type demotion (Разрешить понижение типов данных)
Разрешает преобразование числовых типов в числовые типы меньшего размера. Например, столбец INTEGER может быть преобразован в TINYINT. Если преобразуемое число оказывается слишком большим для столбца приемника, происходит ошибка переполнения.
Allow NULL conversion (Разрешить преобразование NULL)
Разрешает преобразование столбца источника с запрещенными значениями типа NULL в столбец приемника с разрешенными значениями NULL.
Листинг 14.2. Сценарий преобразования данных, написанный на Visual Basic '*************************************************************** ' Visual Basic Transformation Script ' Copy each source column to the ' destination column '*************************************************************** Function Transform() DTSDestination("au_id") = DTSource("au_id") DTSDestination("au_lname") = DTSource("au_lname") DTSDestination("au_fname") = DTSource("au_fname") DTSDestination("au_lname") = DTSource("au_lname") DTSDestination("address") = DTSource("address") DTSDestination("city") = DTSource("city") DTSDestination("state") = DTSource("state") DTSDestination("zip") = DTSource("zip") DTSDestination("contract") = DTSource("contract") Transform = 1 End Function Утилита dtswiz Утилита dtswiz запускает процесс преобразования данных в режиме командной строки. Параметры dtswiz определяют данные, вводимые в окнах импорта, экспорта и преобразования данных DTS. При вызове утилиты dtswiz используется следующий синтаксис: dtswiz [/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 — программа dtswiz скрывает системные таблицы и базы данных. Примеры экзаменационных вопросов Question 1 DTS Export wizard allows you to perform which of the following ? [Check all correct answers] • • • • •
A. Migrate data from a SQL Server to another SQL Server. B. Migrate data from a SQL Server to any ODBC data source. C. Migrate data from Oracle to SQL Server. D. Migrate data from a SQL Server to Oracle. E. None of the above.
Вопрос 1 Что из перечисленного можно делать с помощью мастера экспорта DTS? [Выберите все правильные ответы] • • • • •
A. Перенос данных из одного экземпляра SQL Server в другой экземпляр SQL Server. B. Перенос данных из SQL Server в любой источник данных ODBC. C. Перенос данных из Oracle в SQL Server. D. Перенос данных из SQL Server в Oracle. E. Ничего из перечисленного.
Правильные ответы — A, B, C и D. Хотя мастер называется «мастером экспорта», он позволяет импортировать данные из базы SQL Server в любой источник данных OLE DB. К этой категории относятся и источники данных ODBC. Ответ E неверен, поскольку в списке присутствуют правильные ответы. Question 2 What option is used to direct BCP to redirect the errors to a file? • • • • •
A. -e B. -o C. -m D. -f E. None of the above.
Вопрос 2 Какой параметр приказывает BCP осуществлять запись всех ошибок в файл? • • • • •
A. -e B. -o C. -m D. -f E. Ни один из перечисленных параметров.
Правильный ответ — A; в BCP для записи ошибок в файл используется параметр -e имя_файла. Ответ B неверен, поскольку параметр -o работает с данными на выходе BCP, а не с ошибками. Ответ C неверен — параметр -m ограничивает максимальное количество ошибок, допускаемых BCP до аварийного завершения. Ответ D тоже неверен, поскольку параметр -f определяет первую импортируемую или экспортируемую запись. Правильный ответ присутствует в списке, поэтому ответ E тоже неверен. Question 3 What dtswiz parameter can be used to specify what login to use when connecting to a SQL Server? [Check all correct answers] • A. -n
converted to PDF by BoJIoc
• • • •
B. -u C. -I D. U E. None of the above.
Вопрос 3 Какой параметр dtswiz определяет входное имя, используемое при подключении к SQL Server? [Выберите все правильные ответы] • • • • •
A. -n B. -u C. -I D. U E. Ни один из перечисленных параметров.
Правильный ответ — E, поскольку нужный параметр отсутствует в списке. Все параметры dtswiz начинаются с наклонной черты (/), а не с дефиса (-). Question 4 Which of the following are true about the following BCP statement? [Check all correct answers] Bcp c in -Uaaaaaa -P xyccc • • • • •
A. The statement will try to connect to a local server. B. The statement will fail, because the database name is missing. C. The statement will connect to the user’s aaaaaa default database. D. The statement will prompt the user for information about the file’s format. E. None of the above.
Вопрос 4 Какие из следующих утверждений истинны по отношению к следующей команде BCP? [Выберите все правильные ответы] Bcp c in -Uaaaaaa -P xyccc • • • • •
A. Команда попытается подключиться к локальному серверу. B. Команда не может быть выполнена, поскольку не указано имя базы данных. C. Команда попытается подключиться к базе данных по умолчанию для пользователя aaaaaa. D. Команда запросит у пользователя информацию о формате файла. E. Ничего из перечисленного.
Правильный ответ — E, поскольку правильный ответ отсутствует в списке. Первый параметр после in (Uaaaaaa) интерпретируется как имя входного файла. Если -Uaaaaaa является допустимым именем файла, команда попытается подключиться к локальному серверу как именем текущего пользователя и паролем xyccc. Если файл не существует, произойдет ошибка, поэтому ответы A, B, C и D неверны. Question 5 The DTS data transformation GUI can use which of the following programming languages to directly transform data? [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 напрямую. ГЛАВА 15
Полнотекстовый поиск Ключевые термины • Индекс для полнотекстового поиска • Запрос, использующий полнотекстовый поиск • Каталоги индексов для полнотекстового поиска Необходимые знания и приемы • Подготовка индекса для полнотекстового поиска • Создание индекса для полнотекстового поиска • Выполнение запроса, использующего полнотекстовый поиск В типичной реляционной СУБД, к которой относится SQL Server, все данные, в том числе и типа TEXT, хранятся в столбцах с конкретным типом данных. При вставке данных в таблицу можно создать индекс, ускоряющий выборку данных. Однако при работе с данными типа TEXT сама возможность построения индекса выглядит сомнительно. Поиск для данных типа TEXT Рассмотрим несколько вариантов запроса для поиска слова computer. Первый пример находит только те значения title, которые начинаются со слова computer: SELECT title FROM titles WHERE title LIKE "Computer%" В другом варианте этот запрос записывается в виде SELECT title FROM titles WHERE title >= "Computer" Подобный тип аргумента поиска позволяет оптимизатору SQL Server использовать индекс. Следующий пример находит слово computer в любой позиции столбца title: SELECT title FROM titles WHERE title LIKE "%Computer%" Такой вариант работает крайне медленно, поскольку серверу приходится выполнять сканирование таблицы. Альтернативное решение заключается в реализации полнотекстового поиска. Стандартный индекс сортирует столбец по возрастанию или убыванию символов. Полнотекстовый поиск упрощает нахождение слов или фраз1 в полях типа TEXT, поскольку он создает индекс слов столбца. Однако перед тем, как использовать полнотекстовый поиск, необходимо выполнить ряд подготовительных действий. Подготовка к полнотекстовому поиску Подготовка к полнотекстовому поиску состоит из настройки параметров, активизирующих полнотекстовый поиск, и объявления индексов. Прежде всего необходимо разрешить полнотекстовый поиск для базы данных, как показано в следующем примере: sp_fulltext_database ['Enable']['DISABLE'] sp_fulltext_database enable Для выполнения процедуры sp_fulltext_database пользователь должен обладать ролью db_owner. Команда активизирует возможность выполнения полнотекстового поиска текста.
converted to PDF by BoJIoc
Все остальные процедуры, относящиеся к полнотекстовому поиску, окажутся бесполезными, если не выполнить эту хранимую процедуру. Чтобы узнать, разрешен ли полнотекстовый поиск для базы данных, воспользуйтесь следующим запросом: SELECT DATABASEPROPERTY ('имя_базы', 'IsFullTextEnabled') Активизируя полнотекстовый поиск для базы данных, будьте внимательны: если в файловой системе имеются существующие каталоги индексов полнотекстового поиска, они будут удалены. Кроме того, при активизации полнотекстового поиска для базы данных будут заново созданы все созданные ранее индексы полнотекстового поиска. Внимание При отключении полнотекстового поиска все каталоги индексов удаляются из файловой системы. Информация об отключении заносится в системные таблицы. Наконец, перед выполнением запросов, использующих полнотекстовый поиск в SQL Server, необходимо создать индексы для полнотекстового поиска. Процесс построения индексов для полнотекстового поиска описан в следующем разделе. Создание индекса для полнотекстового поиска Для успешного выполнения полнотекстовых запросов необходимо создать индексы, с помощью которых будет осуществляться поиск. Индексы привязывают значащие слова зарегистрированных столбцов базы данных к записям соответствующих таблиц. Подготовка индекса состоит из нескольких этапов: • • • • •
Построение каталога для полнотекстового индекса. Регистрация таблиц для полнотекстового поиска. Регистрация столбцов для полнотекстового поиска. Активизация таблиц для полнотекстового индекса. Запуск полнотекстового индекса.
Создание полнотекстового индекса начинается с проверки того, было ли полнотекстовое индексирование разрешено для базы данных. Затем для индексов создается полнотекстовый каталог. Построение полнотекстового индекса Полнотекстовый каталог представляет собой файл, в котором хранится настоящий полнотекстовый индекс. В процессе построения полнотекстового каталога в базу данных включается новый файл операционной системы, а необходимые метаданные полнотекстового каталога заносятся в системные таблицы. Команда построения полнотекстового каталога имеет следующий синтаксис: sp_fulltext_catalog 'имя_полнотекстового_каталога' ['create'|'drop' |'start_incremental'|'start_full' |'stop'|'rebuild'] [, 'корневой_каталог'] При построении полнотекстового каталога хранимой процедуре необходимо передать имя каталога, уникальное для базы данных, а также задать нужное действие. Возможны следующие варианты действий: • CREATE — создать файл в каталоге файловой системы, определяемом последним параметром, и включить информацию о нем в таблицу sysfulltextcatalogs. • DROP — удалить сведения о полнотекстовом каталоге из sysfulltextcatalogs и удалить файл из файловой системы. • START_INCREMENTAL — начать заполнение полнотекстового индекса для изменившихся записей. Индексируемая таблица должна содержать столбец типа TIMESTAMP. • START_FULL — начать заполнение полнотекстового каталога для всех записей таблицы, зарегистрированной в указанном каталоге. • STOP — остановить заполнение полнотекстового индекса. • REBUILD — заново построить полнотекстовый индекс. Файл каталога удаляется из операционной системы и строится заново.
converted to PDF by BoJIoc
В следующем примере создается каталог с именем PubsCatalog: sp_fulltext_catalog 'PubsCatalog', 'create' После создания файла полнотекстового каталога необходимо зарегистрировать таблицы базы данных для полнотекстового поиска. Регистрация таблиц для полнотекстового поиска В результате регистрации в базе данных таблица помечается как подходящая для полнотекстового поиска. В ней начинают создаваться структуры метаданных для хранения индекса, которые будут дополняться позднее. Процесс регистрации начинается хранимой процедурой sp_fulltext_table со следующим синтаксисом: sp_fulltext_table ['имя_таблицы'] ['create'|'drop' | 'activate' | 'deactivate'] ['имя_каталога', 'имя_индекса'] Как видно из описания синтаксиса, параметры процедуры sp_fulltext_ table позволяют зарегистрировать новые таблицы для полнотекстового поиска или отменить эту возможность для существующих таблиц: • CREATE — генерирует метаданные для полнотекстового индекса таблицы. Чтобы для таблицы можно было создать полнотекстовый индекс, в ней должен существовать хотя бы уникальный индекс. Имя индекса является обязательным при использовании параметра CREATE. • DROP — удаляет метаданные для полнотекстового индекса в таблице. Перед удалением метаданных активные таблицы необходимо деактивизировать. • ACTIVATE — разрешает сбор данных полнотекстового индекса. Чтобы таблица могла активизироваться, она должна иметь по крайней мере один столбец, участвующий в индексе. • DEACTIVATE — прекращает использование полнотекстового индекса в таблице. В дальнейшем индекс не заполняется, однако полнотекстовые метаданные продолжают существовать. Индекс может быть активизирован заново с параметром ACTIVATE. В следующем примере метаданные для полнотекстового поиска в таблице titles создаются в каталоге PubsCatalog на основании индекса PK_titles: sp_fulltext_table 'titles', 'create', 'PubsCatalog', 'PK_titles' После регистрации таблиц выполняется следующий шаг в процессе создания полнотекстового индекса — регистрация столбцов, участвующих в полнотекстовом индексе. Регистрация столбцов для полнотекстового поиска Столбцы регистрируются с помощью хранимой процедуры sp_fulltext_ columns. Процедура имеет следующий синтаксис: sp_fulltext_column 'имя_таблицы', 'имя_столбца', {'ADD'|'DROP'} Параметр ADD регистрирует столбец, участвующий в полнотекстовом индексе, а параметр DROP удаляет столбцы из индекса. Первая команда в следующем фрагменте регистрирует столбец title таблицы titles для полнотекстового поиска. Вторая команда исключает столбец title из полнотекстового индекса: sp_fulltext_column 'titles', 'title', 'ADD' sp_fulltext_column 'titles', 'title', 'DROP' После регистрации всех необходимых столбцов необходимо активизировать полнотекстовый индекс. Активизация таблицы для полнотекстового индекса Активизация таблицы означает, что все столбцы, участвующие в полнотекстовом индексе, были зарегистрированы, а таблица готова к заполнению индекса. Полнотекстовый индекс активизируется хранимой процедурой sp_fulltext_table:
converted to PDF by BoJIoc
sp_fulltext_table 'имя_таблицы', 'activate' После активизации индекса для каталога наступает последний этап — запуск индекса. Запуск индекса Чтобы приступить к фактическому заполнению индекса, каталог должен получить команду запуска. Такой командой является хранимая процедура sp_fulltext_catalog. Запуск выполняется следующим образом: sp_fulltext_catalog 'PubsCatalog', 'start_full' Каталог PubsCatalog начинает заполняться данными всех зарегистрированных столбцов всех зарегистрированных таблиц индексного каталога. Выполнение полнотекстовых запросов После завершения всех подготовительных действий вы можете выполнять запросы, в которых используется индекс. Однако до того, как сервер закончит заполнение индекса, делать этого не следует. Статус заполнения индекса проверяется следующим запросом: SELECT fulltextcatalogproperty('имя_каталога','PopulateStatus') Запрос возвращает двоичную величину. Значение 0 означает, что заполнение индекса завершено. Значение 1 означает, что сервер все еще продолжает заполнение индекса. Чтобы узнать, включен ли конкретный столбец в полнотекстовый индекс, воспользуйтесь следующим запросом: SELECT ColumnProperty (Object_Id('имя_таблицы'), 'имя_столбца', 'IsFullTextIndexed') В приведенном примере возвращаемое значение 1 означает, что столбец является частью полнотекстового индекса, а значение 0 — что столбец не входит в полнотекстовый индекс. Кроме того, существует несколько хранимых процедур для проверки полнотекстового индексирования столбцов и таблиц: • sp_help_fulltext_catalogs — выводит идентификатор, имя, каталог на диске, статус и количество таблиц для заданного полнотекстового каталога. • sp_help_fulltext_tables — возвращает список таблиц, зарегистрированных для полнотекстового индексирования. • sp_help_fulltext_columns — возвращает список таблиц и столбцов, зарегистрированных для полнотекстового индексирования. Создание и заполнение каталогов завершено. Поиск данных в полнотекстовых индексах осуществляется с помощью полнотекстовых запросов. Полнотекстовые запросы Полнотекстовые запросы находят записи баз данных с помощью индексов, созданных для полнотекстовых запросов. Для выполнения полнотекстовых запросов используется команда SELECT. SQL Server поддерживает два предиката для реализации полнотекстовых запросов, CONTAINS и FREETEXT. CONTAINS Ключевое слово CONTAINS организует полнотекстовый поиск слова или фразы в зарегистрированном столбце. Помните — при использовании предиката CONTAINS фразы должны заключаться в кавычки. Если полнотекстовый поиск выполняется для отдельного слова, это слово не обязательно заключать в кавычки. Более того, условие поиска может состоять из начальных символов слова, за которыми следует звездочка (универсальный символ). Синтаксис предиката CONTAINS выглядит следующим образом: CONTAINS ({имя_столбца|*}, 'критерий_поиска') Приведем пример полнотекстового поиска с использованием предиката CONTAINS:
converted to PDF by BoJIoc
SELECT title, notes FROM titles WHERE CONTAINS (notes, 'Computer') Запрос выбирает из таблицы titles столбцы title и notes для тех записей, у которых столбец notes содержит слово «Computer». Приведем пример поиска фразы: SELECT title, notes FROM titles WHERE CONTAINS (notes, '"favorite recipes"') В этом примере выбираются записи, в которых столбец notes содержит фразу «favorite recipes». В последнем примере предикат CONTAINS используется для поиска начальных символов слова с произвольным продолжением: SELECT title, notes FROM titles WHERE CONTAINS( notes, '"CO*"') Примечание Перед вами одна из немногочисленных ситуаций, где * (звездочка) используется в качестве универсального символа. Запрос возвращает записи таблицы titles, в которых столбец notes содержит слова, начинающиеся с символов "CO". Поиск слов, расположенных рядом Чтобы система поиска была более гибкой, SQL Server также позволяет искать слова, находящиеся поблизости друг от друга. Для выполнения такого поиска в критерий включается функция NEAR(). Функция вызывается без параметров, однако по обе стороны от нее располагаются искомые слова или фразы: SELECT title, notes FROM titles WHERE CONTAINS (notes, 'cooking near() computers') Запрос возвращает записи, в которых слова «cooking» и «computers» находятся в столбце notes вблизи друг от друга. Поиск единственного и множественного числа В SQL Server существует функция FORMSOF(), предназначенная для поиска слов в различных грамматических формах. Функция FORMSOF() ищет как единственное, так и множественное число слов (существительных и глаголов). Одна функция FORMSOF() может работать либо с существительными, либо с глаголами, но не с обеими категориями одновременно. Функция FORMSOF() имеет следующий синтаксис: FORMSOF(INFLECTIONAL, 'фраза') Приведем пример использования FORMSOF(): SELECT title, notes FROM titles WHERE CONTAINS (notes, FORMSOF(INFLECTIONAL, 'computer')) Запрос возвращает записи, в которых столбец notes содержит слово «computer» или любую из его грамматических форм. Весовые коэффициенты в критериях поиска
converted to PDF by BoJIoc
Функция ISABOUT() в сочетании с функцией WEIGHT() позволяет задать весовые коэффициенты, определяющие относительную значимость критериев поиска. Функция ISABOUT() определяет список весовых коэффициентов. В качестве параметра функции WEIGHT() передается весовой коэффициент — десятичное число в интервале от 0.0 до 1.0. Синтаксис выглядит следующим образом: ISABOUT('фраза' weight(весовой_коэффициент,...)) Приведем пример использования весовых коэффициентов в критерии: SELECT title FROM titles WHERE CONTAINS (title, 'ISABOUT ( cooking weight (.8), computer weight (.4) )' ) Запрос возвращает записи таблицы titles, содержащие слово «cooking» или «computer», в столбец title. Однако в данном примере слову «cooking» назначен более высокий весовой коэффициент, поэтому сервер присваивает записям, содержащим слово «cooking», более высокий ранг. Логические операторы Предикаты поиска (такие как CONTAINS, FORMSOF() или ISABOUT()), используемые при полнотекстовом поиске, объединяются с помощью логических операторов AND, OR и AND NOT. Кроме того, предикаты полнотекстового поиска могут использоваться в сочетании с другими традиционными предикатами команды SELECT. Ниже приведен пример использования логических операторов при полнотекстовом поиске. Запрос возвращает записи, в которых в столбце title присутствует слово «cooking», но при этом отсутствуют слова «computers» или «computer»: SELECT title_id, title, ytd_sales FROM titles WHERE CONTAINS (title, 'cooking AND NOT (computers OR computer)') SELECT title_id, title, ytd_sales FROM titles WHERE CONTAINS (title, 'cooking AND NOT FORMSOF(INFLECTIONAL, 'computer')') FREETEXT В качестве альтернативы CONTAINS при проведении полнотекстового поиска используется предикат FREETEXT. Он позволяет обращаться к базе данных с запросами, основанным на значащих словах из произвольной текстовой строки. Механизм полнотекстовых запросов SQL Server анализирует текст, выделяет все значащие слова и обороты, после чего генерирует запрос на основании полученных результатов. Предикат FREETEXT имеет следующий синтаксис: FREETEXT ( 'имя_столбца', 'искомый_текст') Приведем пример использования предиката FREETEXT: SELECT title FROM titles WHERE FREETEXT (notes, 'The quick brown fox jumped over the lazy dog ' ) Запрос возвращает записи таблицы titles со словами, похожими на слова приведенной фразы. Примеры экзаменационных вопросов Question 1 Which of the following statements are true about full-text queries? [Check all correct answers] • A. Full-text queries can be performed with a FREETEXT clause. • B. Full-text queries require a full-text index. • C. Full-text queries can only be applied to registered columns.
converted to PDF by BoJIoc
• D. Full-text queries will only return exact matches. • E. Full-text 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(). Question 2 Which of the following statements are true about full-text indexes types? [Check all correct answers] • • • • •
A. Full-text indexes require at least a unique index on the respective tables. B. Full-text indexes can be implemented by any user. C. Full-text indexes are stored in the database. D. Full-text indexes are populated by sp_fulltext_database. E. Full-text indexes require a timestamp column.
Вопрос 2 Какие из следующих утверждений истинны по отношению к полнотекстовым индексам? [Выберите все правильные ответы] • A. Полнотекстовые индексы требуют существования хотя бы уникального индекса для соответствующих таблиц. • B. Полнотекстовые индексы могут быть реализованы любым пользователем. • C. Полнотекстовые индексы хранятся в базе данных. • D. Полнотекстовые индексы заполняются процедурой sp_fulltext_ database. • E. Для полнотекстовых индексов необходим столбец типа timestamp. Правильный ответ — A, поскольку регистрация таблицы для полнотекстового поиска возможна лишь при наличии для нее уникального индекса. Ответ B неверен, поскольку для реализации полнотекстовых индексов пользователь должен обладать по крайней мере ролью db_owner. Ответ C неверен, поскольку полнотекстовый индекс хранится в файловой системе. Ответ D неверен, поскольку заполнение индекса осуществляется процедурой sp_fulltext_catalog. Ответ E неверен, поскольку наличие столбца типа TIMESTAMP необходимо лишь при заполнении индекса с приращениями. Question 3 Consider the following statement: Sp_fulltext_column 'authors','last_name','ADD' What tasks must be completed first before this command can be run? [Check all correct answers] • • • • •
A. The full-text index must be started for population. B. The author’s table must be registered for use with a full-text index. C. The full-text index option must be enabled for the database. D. A full-text catalog must be created for the index. E. The columns for the author’s table must be registered for the full-text indexes.
Вопрос 3 Имеется следующая команда: Sp_fulltext_column 'authors','last_name','ADD' Какие задачи должны быть выполнены перед запуском этой команды? [Выберите все правильные ответы] • A. Должно быть начато заполнение полнотекстового индекса. • B. Таблица authors должна быть зарегистрирована для использования с полнотекстовым индексом.
converted to PDF by BoJIoc
• C. Для базы данных должно быть разрешено использование полнотекстового индекса. • D. Для индекса должен быть создан полнотекстовый каталог. • E. Столбцы таблицы authors должны быть зарегистрированы для использования в полнотекстовых индексах. Правильные ответы — B, C и D. Приведенная команда регистрирует столбец last_name таблицы authors для использования в полнотекстовом индексе. Ответ B правилен, поскольку таблицы регистрируются в полнотекстовом индексе раньше столбцов. Ответ C правилен, поскольку выполнение любой команды, относящейся к полнотекстовому индексированию, возможно лишь после разрешения самой возможности полнотекстового поиска. Ответ D тоже правилен — столбец может быть зарегистрирован для полнотекстового индексирования лишь при условии существования каталога, в котором хранится индекс. Ответ A неверен. Прежде чем начинать заполнение индекса, необходимо сначала зарегистрировать все необходимые таблицы и столбцы. Ответ E неверен, поскольку он не отвечает на вопрос, а лишь поясняет эффект приведенной команды. Question 4 Examine the following query: Sp_fulltext_catalog 'author_catalog','start_full' Which of the following statements are true about full-text index types? [Check all correct answers] • • • • •
A. The full-text index will begin to populate for all rows that have changed. B. The full-text index will begin to populate based on all the data in the registered columns. C. The full-text index will be activated and ready for population. D. The full-text index catalog author_catalog will be created. E. The full-text index author_catalog table will be registered for the start_full index.
Вопрос 4 Рассмотрим следующий запрос: Sp_fulltext_catalog 'author_catalog','start_full' Какие из следующих утверждений истинны по отношению к полнотекстовым индексам? [Выберите все правильные ответы] • A. Начинается заполнение полнотекстового индекса для всех изменившихся записей. • B. Начинается заполнение полнотекстового индекса на основании всех данных в зарегистрированных столбцах. • C. Полнотекстовый индекс активизируется и становится готовым к заполнению. • D. Создается каталог полнотекстового индекса author_catalog. • E. Таблица полнотекстового индекса author_catalog регистрируется для индекса start_full. Правильный ответ — B, поскольку параметр start_full начинает заполнение индекса на основании всех данных в зарегистрированных столбцах. Ответ A неверен, поскольку заполнение индекса на основании изменений выполняется с параметром start_incremental. Ответ C неверен, поскольку индекс должен быть активизирован и готов к заполнению до выполнения приведенного фрагмента. Ответ D неверен, поскольку каталог author_catalog должен быть создан до начала заполнения. Ответ E неверен, поскольку приведенный фрагмент не имеет никакого отношения к регистрации. ГЛАВА 16
Диагностика и сбор данных Ключевые термины • • • • •
Команда SHOWPLAN Оптимизатор Статистика Взаимная блокировка dbcc showcontig
Необходимые знания и приемы • Использование SHOWPLAN • Обновление статистики • Диагностика и решение проблем с блокировкой
converted to PDF by BoJIoc
• Использование SQL Server Profiler Итак, вы написали приложение базы данных и реализовали его на сервере. Теперь необходимо позаботиться о том, чтобы приложение работало с максимальной эффективностью. Однако при этом также необходимо осуществлять мониторинг и оптимизацию работы SQL Server. Microsoft предоставляет в ваше распоряжение ряд инструментов. Они помогают следить за приложениями и запросами, выполняемыми сервером, а также за решениями, принимаемыми SQL Server при их запуске. Другие инструменты предназначены для наблюдения за работой сервера и проверки эффективности его работы. Один из вариантов оптимизации SQL Server заключается в том, чтобы запросы работали в соответствии с исходными планами. Скажем, индексы создаются для ускорения работы приложений. Предполагается, что индекс позволит SQL Server более эффективно находить данные. Команда SQL Server SET SHOWPLAN позволяет узнать, какие решения принимает SQL Server. В частности, вы узнаете, используется индекс или нет и почему это происходит. Полученные результаты помогут улучшить структуру запросов и обеспечить их максимальную эффективность. Кроме того, вы сможете определить, когда следует создавать новые индексы. SHOWPLAN Флаги SHOWPLAN используются до выполнения незапланированных (ad hoc) запросов. С их помощью можно предварительно оценить затраты ввода/вывода, связанные с выполнением запроса. На основании полученной оценки можно отменить выполнение неудачно сконструированных запросов (например, создающих декартово произведение или возвращающих чрезмерное количество записей) до исправления проблемы. В SQL Server существуют две версии команды SHOWPLAN: • SET SHOWPLAN_TEXT; • SET SHOWPLAN_ALL. SQL Query Analyzer позволяет работать с графической версией SHOWPLAN. Внимание Новые параметры SHOWPLAN_TEXT и SHOWPLAN_ALL выводят информацию о решениях, принимаемых SQL Server при обработке запроса. Microsoft включила в SQL Server немало новых планов обработки запросов — пользователям следует познакомиться с ними. SHOWPLAN_TEXT Флаг SHOWPLAN_TEXT отображает данные в виде текстовых сообщений в большинстве редакторов запросов (например, isql или SQL Query Analyzer) и предоставляет информацию о том, как SQL Server собирается выполнять запрос. Данные выдаются лишь при установке параметра SHOWPLAN_TEXT в isql, SQL Query Analyzer или другом редакторе сценариев. Команда SHOWPLAN_TEXT имеет следующий синтаксис: SET SHOWPLAN_TEXT [ON|OFF] В листинге 16.1 показан запрос, запущенный при включенном параметре SHOWPLAN_TEXT. Листинг 16.1. Запрос с установленным флагом SHOWPLAN_TEXT и его результаты StmtText ----------------------------------------------------select * from titles where title_id = 'BU1111' (1 row(s) affected) StmtText ----------------------------------------------------|--Clustered Index Seek(pubs..titles.UPKCL_titleidind, SEEK:(titles.title_id=@1) ORDERED)
converted to PDF by BoJIoc
Как видно из листинга 16.1, выполняется запрос SELECT * FROM titles WHERE title_id='BU111'. Для обработки запроса оптимизатор решил использовать поиск в кластерном индексе. Имя индекса определяется строкой UPKCL_titleidind — именем кластерного индекса в таблице titles. SHOWPLAN_ALL Флаг SHOWPLAN_ALL, как и SHOWPLAN_TEXT, предоставляет пользователям подробные сведения о том, что SQL Server знает о запросе и как собирается его выполнять. Однако SHOWPLAN_ALL следует использовать во время выполнения программы, а SHOWPLAN_TEXT — при интерпретации незапланированных запросов. При установленном флаге SHOWPLAN_ALL вы получаете таблицу, содержащую информацию о плане запроса. Табличные данные удобнее форматировать и анализировать, чем текстовый вывод SHOWPLAN_TEXT. Пока флаг SHOWPLAN_ALL остается установленным, запросы только анализируются, но не выполняются. Чтобы выполнить запрос, необходимо сбросить флаг SHOWPLAN_ALL. Выходная таблица SHOWPLAN_ALL содержит следующие столбцы: • StmtText — исходный запрос SQL, проанализированный SHOWPLAN. Кроме того, этот столбец также содержит параметр PLAN_ROWS с описанием того, каким образом запрос будет выполняться SQL Server. По нему можно узнать, собирается ли SQL Server применять сканирование таблицы или поиск в индексе. • StmtId — номер команды в текущем пакете. Если пакет состоит из нескольких команд, номер может быть больше 1. • NodeId — узловой идентификатор текущего запроса. • Parent — узловой идентификатор родительской операции, если операция инициируется другой операцией. • PhysicalOp — физическая реализация запроса. Используется только в сочетании с PLAN_ROWS. • LogicalOp — логическая реализация запроса. Используется только в сочетании с PLAN_ROWS. • Argument — выводится дополнительная информация о запросе, основанная на аргументах поиска. • DefinedValues — список значений, используемых запросом. В частности, содержит столбцы, указанные в секциях SELECT и WHERE. Используется только в сочетании с PLAN_ROWS. • EstimateRows — количество выходных записей по оценке SQL Server для PLAN_ROW. • EstimateIO — примерный объем операций ввода/вывода для запроса на основании PLAN_ROW. • EstimateCPU — примерные затраты процессорного времени для PLAN_ROW. • AvgRowSize — примерный размер возвращаемой записи. • TotalSubtreeCost — примерные затраты на выполнение запроса. Данная величина является накапливаемой. • OutputList — список столбцов, выводимых запросом. • Warnings — предупреждающие сообщения для запроса. • Type — узловой тип запроса. Значение может описывать тип запроса (SELECT, INSERT, DELETE или EXECUTE) или быть равным PLAN_ROW. Команда SHOWPLAN_ALL имеет следующий синтаксис: SET SHOWPLAN_ALL [ON|OFF] Обновление статистики Для определения лучшего способа выполнения запроса, оптимального по затратам ввода/вывода, в SQL Server используется оптимизатор. Чтобы флаги SHOWPLAN и оптимизатор могли оценивать запросы, SQL Server необходимо передать некоторую информацию с описанием данных и их распределения. Эта информация сохраняется в статистических страницах при создании индекса. В часто изменяющейся таблице статистика может устареть. На основании устаревшей информации оптимизатор принимает неверные решения, относящиеся к оптимизации запросов, поскольку статистика дает неверные оценки. Чтобы оптимизатор выбирал оптимальные способы выполнения запросов, статистические данные таблиц должны регулярно обновляться. В прежних версиях SQL Server эта задача поручалась системному администратору, в SQL Server 7 процесс обновления статистики автоматизирован. По умолчанию статистика автоматически обновляется на основании периодической случайной выборки данных из таблицы. Период обновления зависит от размера таблицы и скорости ее увеличения. Если случайная выборка не обеспечивает оптимального планирования запросов, статистику можно обновить вручную — для этого следует выполнить команду UPDATE STATISTICS. В листинге 16.2 показан синтаксис команды SQL, используемой при обновлении статистики.
converted to PDF by BoJIoc
Листинг 16.2. Синтаксис команды UPDATE STATISTICS UPDATE STATISTICS { имя_таблицы } [имя_индекса | (индекс_или_список_столбцов [, ... n]) ] [WITH [[FULLSCAN]| SAMPLE номер {PERCENT | ROWS}]] [[,] [ALL | COLUMNS | INDEX] [[,] NORECOMPUTE] ] Команда UPDATE STATISTICS обладает множеством параметров, управляющих процессом обновления статистики. Статистика может собираться для таблицы и всех ее индексов или, если это занимает слишком много времени, для конкретного индекса. Ниже приведена более подробная информация о параметрах команды UPDATE STATISTICS, приведенных в листинге 16.2: • FULLSCAN — заставляет SQL Server выполнить полное сканирование индекса или таблицы в процессе сбора статистики. Но полное сканирование таблицы или индекса может занять много времени. Альтернативный вариант — определение размера выборки. • SAMPLE — вместо накопления статистики для всей таблицы можно приказать SQL Server построить новые страницы статистики на основании выборки табличных данных. Размер выборки задается в виде количества записей или процента от их общего числа. • ALL|COLUMNS|INDEX — по умолчанию команда UPDATE STATISTICS обновляет только статистику индексов. Команда UPDATE STATISTICS позволяет обновлять статистику столбцов (COLUMNS), индексов (INDEX) или одновременно столбцов и индексов (ALL). • NORECOMPUTE — параметр запрещает автоматическое обновление статистики с помощью сохраненной процедуры sp_autostats. Sp_updatestats В прежних версиях SQL Server команда UPDATE STATISTICS выполнялась отдельно для каждой таблицы. Хранимая процедура sp_updatestats выполняет команду UPDATE STATISTICS для всех таблиц текущей базы данных. Выполнение процедуры разрешается только пользователям с ролью SA или владельцам базы данных. Sp_autostats В прошлом обновление статистики регулярно выполнялось системным администратором. В SQL Server 7 статистика может обновляться автоматически; данная возможность включается хранимой процедурой sp_autostats. Процедура sp_autostats разрешает или запрещает автоматическое обновление статистики для всей таблицы или для конкретного индекса. Настройка автоматического обновления статистики с применением sp_autostats выполняется следующим образом: sp_autostats 'имя_таблицы'[,'ON'|'OFF']['имя_индекса'] Совет В прошлом на обновление статистики расходовалось чрезвычайно много ресурсов. Из-за этого обновление обычно выполнялось в то время, когда на сервере работало относительно мало процессов. Правило действует и в наши дни. Единственный способ снизить эту нагрузку — строить статистику не для всей таблицы, а для выборки данных. Хотя при этом обновление статистики требует меньше ресурсов и может выполняться даже в периоды максимальной загрузки, статистика перестает адекватно отражать распределение данных в таблице. Это может повлиять на точность оценки планов запросов в оптимизаторе. Альтернативным решением является запланированное выполнение команды UPDATE STATISTICS с параметром FULLSCAN в периоды минимальной загрузки. Диагностика и решение проблем блокировки По умолчанию читаемые или модифицируемые данные блокируются сервером на уровне 8-килобайтных страниц. Подобная форма блокировки может стать причиной проблем конкуренции (попытки нескольких пользователей заблокировать одну и ту же страницу данных) и потенциальных ситуаций взаимной блокировки, приводящих к отмене транзакций некоторых пользователей.
converted to PDF by BoJIoc
В SQL Server используются различные типы блокировок. При выборке данных устанавливаются разделяемые блокировки, а при удалении —монопольные блокировки. Чтобы определить, какие типы блокировок используются в настоящее время, следует выполнить хранимые процедуры sp_lock и sp_who. Эти хранимые процедуры помогут узнать, какие ресурсы заблокированы в настоящее время, кем и почему. Выходные данные хранимой процедуры sp_lock состоят из следующих столбцов: • • • • • • •
Spid — идентификатор системного процесса; Dbid — идентификатор базы данных; ObjID — идентификатор объекта; IndID — идентификатор индекса; Type — тип блокировки; Resource — информация о заблокированных ресурсах, хранящаяся в текстовой таблице syslockifo.res; Mode — режим блокировки. Допускаются следующие значения:
· S — разделяемая блокировка; · U — блокировка модификации; · E — монопольная блокировка; · IS — условная разделяемая; · IX — условная монопольная; · SIX — разделяемая блокировка с условно-монопольной; · Status — статус запроса блокировки (например, GRANT, WAIT или CONVERT). В листинге 16.3 приведен пример выходных данных процедуры sp_lock. Листинг 16.3. Пример вывода sp_lock spid dbid ObjId
IndId Type Resource
Mode Status
---- ---- --------
------ ---- -------------
------ ------
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) IS-S GRANT
9
5
261575970 1
KEY (42b753b7aa62) IS-S GRANT
10
5
0
DB
S
GRANT
10
5
261575970 1
PAG 1:103
IS
GRANT
10
5
261575970 0
TAB
IS
GRANT
10
5
261575970 1
KEY (42b753b5aa62) IS-S GRANT
10
5
261575970 1
KEY (45bc55b3aa64) IS-S GRANT
0
По выходным данным sp_lock в сочетании с хранимой процедурой sp_who можно узнать, кто предоставил блокировку и не мешает ли она другим процессам или пользователям. Хранимая процедура sp_who выводит следующие данные (см. листинг 16.4): • spid — идентификатор системного процесса;
converted to PDF by BoJIoc
• • • • • •
status — статус процесса; loginame — имя пользователя, запустившего данный процесс; hostname — имя хоста или системы, вызывающей процесс; blk — идентификатор процесса, мешающего завершению данного процесса; dbname — имя базы данных, используемой процессом; cmd — тип команды SQL Server, выполняющей процесс.
Листинг 16.4. Пример вывода sp_who spid status
loginame
hostname blk dbname cmd
—
—————
————————
———
1
sleeping
sa
0
master SIGNAL HANDLER
2
sleeping
sa
0
pubs
3
sleeping
sa
0
pubs
LAZY WRITER
4
sleeping
sa
0
pubs
LOG WRITER
5
sleeping
sa
0
pubs
CHECKPOINT SLEEP
6
background sa
0
pubs
AWAITING COMMAND
7
sleeping
NT AUTHORITY\SYSTEM TENCHI
0
master AWAITING COMMAND
8
sleeping
NT AUTHORITY\SYSTEM TENCHI
0
master AWAITING COMMAND
9
sleeping
user1
KEYONE
10 pubs
UPDATE
10
runnable
user2
KEYONE
0
SELECT
— ———
pubs
———————LOCK MONITOR
Из листингов 16.3 и 16.4 видно, что выполнению процесса 9 мешает процесс 10. Пользователь user1, запустивший процесс 9, должен ждать освобождения ресурсов, занятых процессом 10. Взаимные блокировки Взаимной блокировкой (deadlock) называется ситуация, в которой два процесса не позволяют друг другу продолжить работу. Каждый процесс занимает ресурс, необходимый другому процессу, и не может освободить его (рис. 16.1). SQL Server обнаруживает взаимные блокировки посредством поиска циклических цепочек запросов на блокировку. При обнаружении взаимной блокировки один из двух процессов объявляется «жертвой» (victim) и аварийно завершается. Другой процесс продолжает работу. Жертва генерирует ошибку 1205 и получает от сервера сообщение о взаимной блокировке и необходимости перезапустить транзакцию. Если это происходит в хранимой процедуре, возвращаемое значение равно –3. В приложениях, написанных для SQL Server, следует предусмотреть обработку этих кодов ошибок.
converted to PDF by BoJIoc
Рис. 16.1. Взаимная блокировка По умолчанию SQL Server выбирает жертвой транзакцию с минимальными затратами. Тем не менее, команда SET DEADLOCK_PRIORITY LOW позволяет назначить сеансу низкий приоритет взаимных блокировок и определить его потенциальной жертвой. Команда SET DEADLOCK_PRIORITY NORMAL возвращает процесс к нормальной схеме обработки взаимных блокировок. Команда установки флага DEADLOCK_PRIORITY имеет следующий синтаксис: SET DEADLOCK_PRIORITY {[LOW][NORMAL]} dbcc showcontig Команда DBCC SHOWCONTIG анализирует фрагментацию области, занимаемой данными и индексами. Фрагментация возникает в том случае, когда SQL Server вынужден нарушить непрерывную последовательность хранения страниц данных (например, при включении данных в существующие заполненные страницы). Кроме того, фрагментация возникает и в страницах индексов. По выходным данным dbcc showcontig можно обнаружить фрагментацию и исправить ее. Исправление осуществляется посредством удаления и повторного создания кластерного индекса для таблицы. Команда DBCC SHOWCONTIG имеет следующий синтаксис: DBCC SHOWCONTIG [ ( идентификатор_таблицы [, индентификатор_индекса])] В листинге 16.5 продемонстрирован пример выполнения DBCC SHOWCONTIG для таблицы с именем rawdata и приведены выходные данные команды. Листинг 16.5. Пример выполнения DBCC SHOWCONTING dbcc showcontig (197575742) DBCC SHOWCONTIG scaning 'lookup' table... Table: 'lookup' (309576141); index ID: 1, database ID: 8 TABLE level scan performed. - Pages Scanned................................: 38 - Extents Scanned..............................: 5 - Extent Switches..............................: 4 - Avg. Pages per Extent........................: 7.6
converted to PDF by BoJIoc
-
Scan Density [Best Count:Actual Count].......: 100.00% [5:5] Logical Scan Fragmentation ..................: 0.00% Extent Scan Fragmentation ...................: 20.00% Avg. Bytes Free per Page.....................: 199.3 Avg. Page Density (full).....................: 97.54%
Выходные данные DBCC SHOWCONTIG интерпретируются следующим образом: • Pages Scanned — количество страниц в таблице или индексе; • Extents Scanned — количество экстентов в таблице или индексе; • Extent Switches — количество переходов между экстентами при переборе страниц таблицы или индекса; • Avg. Pages per Extent — количество страниц на экстент в цепочке страниц; • Scan Density [Best Count:Actual Count] — оптимальное и фактическое число переходов между блоками страниц; • Logical Scan Fragmentation — процент страниц, нарушающих непрерывный порядок. Вычисляется при сканировании листовых страниц индекса; • Extent Scan Fragmentation — процент экстентов, нарушающих непрерывный порядок. Вычисляется при сканировании листовых страниц индекса; • Avg. Bytes Free per Page — среднее количество свободных байт на сканированных страницах; • Avg. Page Density (full) — средний процент заполнения страниц. Как видно из листинга 16.5, таблица состоит из 38 страниц и 5 блоков. По количеству переходов таблица получает идеальный рейтинг 100%, поскольку оптимальное количество совпадает с фактическим [5:5]. Таблица не требует дополнительной модификации. SQL Server Profiler В комплект SQL Server 7 входит продукт SQL Server Profiler — диагностическая утилита, позволяющая администратору следить за некоторыми стандартными событиями (например, попытками регистрации, подключениями и отключениями, выполнением пакетов SQL), а также обнаруживать взаимные блокировки. SQL Server Profiler создает на сервере трассировочные файлы или таблицы с данными. Если данные хранятся в таблицах SQL Server, Profiler может воспроизвести запросы и облегчить анализ проблем. Profiler является составной частью Enterprise Manager и вызывается из меню Tools. Кроме того, утилиту можно запустить из группы SQL Server 7 меню «Пуск». Примеры экзаменационных вопросов Question 1 By default, how often are statistics updated? • • • • •
A. Once a day. B. Once a week. C. Once a year. D. With each SQL statement. E. Never.
Вопрос 1 С какой частотой обновляется статистика по умолчанию? • • • • •
A. Один раз в день. B. Один раз в неделю. C. Один раз в год. D. С каждой командой SQL. E. Никогда.
Правильный ответ — E. По умолчанию страницы статистики создаются при создании индекса. Однако эти страницы не обновляются до тех пор, пока для таблицы или индекса не будет выполнена команда UPDATE STATISTICS. Это стандартное поведение переопределяется хранимой процедурой sp_autostats. Ответы A, B, C и D неверны, поскольку по умолчанию автоматическое обновление страниц статистики не происходит никогда. Question 2 By default, what statistics get updated with an UPDATE STATISTICS statement?
converted to PDF by BoJIoc
• • • • •
A. Indexes. B. Columns. C. Rows. D. Indexes and columns. E. Indexes, columns and rows.
Вопрос 2 Статистика каких объектов обновляется командой UPDATE STATISTICS по умолчанию? • A. Индексы. • B. Столбцы. • C. Записи. • D. Индексы и столбцы. • E. Индексы, столбцы и записи. Правильный ответ — A. По умолчанию команда UPDATE STATISTICS обновляет только статистику индексов. Ответы B, C, D и E неверны, поскольку команда UPDATE STATISTICS по умолчанию не обновляет столбцы и записи. Question 3 What kind of lock is described by the following sp_lock output? spid dbid ObjId IndId Type Resource Mode Status ---- ---- ---------- ------ ---- -------------- ------ -----9 5 26157970 1 PAG 1:103 IS GRANT • • • • •
A. An exclusive lock on the entire table. B. An exclusive lock on a page. C. A shared lock on a page. D. An intent shared lock on a page. E. An intent shared lock on a table.
Вопрос 3 Какой тип блокировки описывают следующие выходные данные sp_lock? spid dbid ObjId IndId Type Resource Mode Status ---- ---- ---------- ------ ---- -------------- ------ -----9 5 26157970 1 PAG 1:103 IS GRANT • • • • •
A. Монопольная блокировка всей таблицы. B. Монопольная блокировка страницы. C. Разделяемая блокировка страницы. D. Условная разделяемая блокировка страницы. E. Условная разделяемая блокировка таблицы.
Правильный ответ — D. Сокращение IS означает условную разделяемую блокировку (Intent Shared), а тип PAG — страницу (page). Во всех остальных ответах приведены неверные типы блокировок. Question 4 Which of the following takes place when a deadlock occurs? [Check all correct answers] • • • • •
A. Only one process is blocking another process. B. Two processes are blocking each other. C. One process will be declared a victim. D. A 1205 error will be returned. E. -1 will be returned by the stored procedure.
Вопрос 4 Что из перечисленного происходит при наступлении взаимной блокировки? [Выберите все правильные ответы] • • • • •
A. Только один процесс блокирует работу другого процесса. B. Два процесса блокируют друг друга. C. Один процесс объявляется жертвой. D. Возвращается ошибка 1205. E. Хранимая процедура возвращает -1.
Правильные ответы — B, C и D. Ответ B правилен, поскольку взаимная блокировка возникает в случае, если как минимум два процесса блокируют друг друга. Ответ C правилен, поскольку при обнаружении сервером взаимной блокировки процесс с меньшими затратами процессорного времени объявляется
converted to PDF by BoJIoc
жертвой и аварийно завершается. Ответ D тоже правилен — при обнаружении взаимной блокировки обработчику ошибок возвращается код ошибки 1205. Ответ A неверен, поскольку при взаимной блокировке оба процесса мешают работе друг друга. Ответ E неверен, поскольку хранимая процедура возвращает код – 3. Question 5 Sp_autostats performs what functions? [Check all correct answers] • • • • •
A. Activates the automatic updating of table statistics. B. Deactivates the automatic updating of table statistics. C. Activates the automatic updating of index statistics. D. Deactivates the automatic updating of column statistics. E. Deactivates the automatic updating of index statistics.
Вопрос 5 Какие функции выполняет sp_autostats? [Выберите все правильные ответы] • • • • •
A. Активизирует автоматическое обновление статистики таблиц. B. Деактивизирует автоматическое обновление статистики таблиц. C. Активизирует автоматическое обновление статистики индексов. D. Деактивизирует автоматическое обновление статистики столбцов. E. Деактивизирует автоматическое обновление статистики индексов.
Правильные ответы — A, B и C; в них описываются стандартные функции хранимой процедуры sp_autostats. Ответ D неверен, поскольку sp_autostats не работает на уровне столбцов. ГЛАВА 17
Удаленный доступ к данным Ключевые термины • • • • • • • • • • •
Удаленный вызов процедур (RPC) Распределенная транзакция Распределенный запрос Связанный сервер Полное имя объекта Набор записей Дружественное имя Distributed Transaction Service Диспетчер ресурсов Диспетчер транзакций Двухфазовое закрепление
Необходимые знания и приемы • • • • •
Вызов удаленных процедур Понимание отличий между RPC и распределенным запросом Обращение к удаленным данным через связанные серверы Обращение к удаленным данным посредством незапланированных запросов Понимание преобразований данных, выполняемых при распределенных запросах
Обычно все данные, с которыми должно работать приложение базы данных, находятся на одном сервере. Но иногда данные хранятся на нескольких серверах или находятся под управлением системы, отличной от SQL Server. Microsoft SQL Server поддерживает два способа обращения к данным, находящимся на разных серверах: удаленный вызов процедур (RPC) и распределенные запросы. В обоих случаях для обращения к удаленным данным используется распределенный запрос. RPC Механизм RPC используется для работы с данными, находящимися на другом сервере SQL Server. Он поддерживается в SQL Server для обеспечения обратной совместимости и не может работать с данными, не хранящимися в SQL Server.
converted to PDF by BoJIoc
Внимание SQL Server 7 обслуживает вызовы RPC от SQL Server версии 4.2 и выше. Однако при этом SQL Server 7 может обратиться с вызовом RPC только к SQL Server версии 6 и выше. Чтобы вызов RPC стал возможным, системный администратор должен настроить оба сервера на взаимодействие друг с другом. После завершения настройки для вызова процедуры RPC используется полное имя хранимой процедуры. Синтаксис удаленного вызова приведен ниже: [EXEC[UTE]] имя_сервера.[имя_базы].[владелец].[хранимая_процедура] [параметры[, параметр ...]] Удаленные хранимые процедуры могут использоваться в SQL везде, где допускается использование локальных хранимых процедур. Иначе говоря, удаленная хранимая процедура может: • • • •
являться самостоятельным пакетом; использоваться в пакете совместно с другими запросами; вызываться из хранимой процедуры; входить в команду INSERT в виде команды EXECUTE.
Приведем пример удаленного вызова хранимой процедуры: EXEC MyOtherServer...sp_who В этом примере показан простейший вариант вызова удаленной хранимой процедуры — системная хранимая процедура sp_who выполняется на сервере MyOtherServer без параметров. Следующий пример не столь тривиален: INSERT Names EXECUTE MyOtherServer.pubs.joe.RetrieveAuthorsNames @parm1 = 'A' В этом примере механизм RPC используется для выборки данных, вставляемых в таблицу Names. Процедура RetrieveAuthorNames (владелец — joe) базы данных pubs на сервере MyOtherServer выполняется с параметром @parm1, равным 'A'. Удаленная хранимая процедура выполняет любые действия, выполняемые локальными процедурами. Следовательно, механизм RPC позволяет выполнить на удаленном сервере любую процедуру, которую вы могли бы выполнить после непосредственной регистрации на сервере. RPC возвращает данные с помощью трех стандартных механизмов, используемых в локальных хранимых процедурах: • Итоговые наборы. Записи и отдельные значения. • Выходные параметры. Общий набор выходных значений для всей процедуры. • Передача кода возврата команде SQL Server. Одно целое число. В листинге 17.1 приведена хранимая процедура, которая использует все три механизма передачи данных. Листинг 17.1. Удаленная хранимая процедура -- Выполняется на удаленном сервере в tempdb CREATE PROC SysObjName @NumObj INT OUTPUT AS SELECT name FROM sysobjects WHERE type = 'S' SELECT @NumObj = @@ROWCOUNT RETURN -30000 Go -- Выполняется на локальном сервере DECLARE @RetCnt INT, @result INT EXEC @result = MyRemoteServer.tempdb..myp1 @RetCnt output
converted to PDF by BoJIoc
SELECT ReturnStatus = @result, OutputParm = @RetCount GO -- Итоговый набор name ----------sysobjects sysindexes syscolumns systypes syscomments sysfiles1 syspermissions sysusers sysdepends sysreferences sysfulltextcatalogs sysindexkeys sysforeignkeys sysmembers sysprotects sysfiles sysfilegroups sysallocations -- Код возврата и выходной параметр ReturnStatus OutputParm ------------ ----------30000 18 Распределенные запросы Механизм распределенных запросов Server позволяет работать с данными любого источника через провайдеры OLE DB. Это означает, что вы можете обращаться к данным любого источника OLE DB. Распределенные запросы работают с данными одного или нескольких удаленных источников так, словно эти данные находятся в локальной таблице. Между распределенными запросами и RPC существует два основных отличия: • Распределенные запросы позволяют обратиться к данным из нескольких источников в одном запросе. • Распределенный запрос выполняет на локальном сервере команду SQL, которая влияет на данные удаленного сервера. Перед использованием распределенных запросов подключение должно установить флаги ANSI_NULLS и ANSI_WARNINGS, как показано в следующем фрагменте: SET ANSI_NULLS ON SET ANSI_WARNINGS ON Хотя источники в распределенных запросах обычно представляют собой базы данных, существуют провайдеры OLE DB для различных типов и форматов файлов, включая текстовые файлы и электронные таблицы. Если для вашего конкретного источника данных не существует провайдера OLE DB, вероятно, вы сможете обратиться к нему через провайдера OLE DB для ODBC. Связанный сервер Связанный сервер (linked server) представляет собой заранее сконфигурированный источник данных OLE DB. Команды SQL ссылаются на связанный сервер по полному имени объекта. Перед использованием связанного сервера необходимо предварительно настроить локальный SQL Server на работу с удаленным источником данных OLE DB. Полное имя объекта выглядит следующим образом: имя_сервера.имя_базы.владелец_объекта.имя_объекта
converted to PDF by BoJIoc
В следующем примере показана ссылка на связанный сервер в команде SELECT: SELECT * FROM OtherServer.SalesDB.dbo.Sale Помимо уточнения имени удаленного сервера необходимо указать имя связанного сервера при вызове функции OPENQUERY (см. далее). Функция OPENQUERY возвращает набор записей (rowset), который может использоваться в командах SQL вместо таблицы или представления. Внимание Наборы записей являются основными объектами, используемыми провайдерами OLE DB для возвращения итоговых наборов в табличной форме. Основные преимущества связанных серверов: • Связанный сервер обеспечивает удаленный доступ к данным. • Связанный сервер позволяет использовать распределенные запросы и транзакции для разнородных источников данных. • Связанный сервер обеспечивает возможность одинаковой работы с несколькими разнородными источниками данных. Функция OPENQUERY Функция OPENQUERY предназначена для выполнения сквозных (pass-through) запросов в источниках данных OLE DB. Она имеет следующий синтаксис: OPENQUERY(связанный_сервер, 'запрос') Параметры функции OPENQUERY определяют имя связанного сервера и исполняемый запрос. Перед использованием функции OPENQUERY необходимо настроить локальный SQL Server на работу со связанным сервером. В следующем примере функция OPENQUERY использована для выполнения команды SELECT на связанном сервере: SELECT * FROM OPENQUERY(OtherSvr, 'SELECT au_lname, au_fname FROM pubs..authors') Незапланированные распределенные запросы Даже если удаленный источник данных не был определен заранее, вы все равно можете обратиться к удаленным данным в незапланированном распределенном запросе с помощью функции OPENROWSET. При использовании функции OPENROWSET указываются параметры, необходимые для подключения к связанному серверу. На полученный набор записей можно ссылаться точно так же, как и на таблицу. Синтаксис OPENROWSET выглядит следующим образом: OPENROWSET('имя_провайдера' {'источник';'имя_пользователя';'пароль' | 'строка_ провайдера'}, {[каталог.][схема.]объект | 'запрос'}) Как видно из синтаксиса, функции OPENROWSET передается вся информация, необходимая для подключения к удаленному источнику данных. Аргументы перечислены ниже: • 'Имя_провайдера' — строка определяет зарегистрированное имя провайдера OLE DB, хранящееся в системном реестре. Также встречается термин «дружественное (friendly) имя». • 'Источник' — строка, определяющая источник данных OLE DB. Формат строки зависит от конкретного источника данных OLE DB. • 'Имя_пользователя' — имя пользователя, передаваемое провайдеру OLE DB. • 'Пароль' — пароль, ассоциируемый с именем пользователя. • 'Строка_провайдера' — информация подключения, необходимая для инициализации источника данных OLE DB (зависит от конкретного провайдера). • Каталог — имя каталога или базы данных, к которой обращается незапланированный запрос. • Схема — имя владельца структуры или объекта.
converted to PDF by BoJIoc
• Объект — имя объекта. • 'Запрос' — запрос, передаваемый провайдеру для выполнения. Внимание Если запрос возвращает несколько итоговых наборов, функция OPENROWSET вернет только первый итоговый набор. Преобразования данных При работе с удаленными данными происходят преобразования типа данных и кодировки, используемых на локальном сервере. При выборке данных командами SELECT, UPDATE, INSERT или DELETE удаленные данные преобразуются в тип данных и кодировку локального сервера. При модификации данных командами INSERT и UPDATE данные локального сервера преобразуются к типу данных и кодировке удаленного сервера. Если кодировка удаленных данных отличается от кодировки локального сервера, результаты запроса могут оказаться бессмысленными. Рассмотрим следующий пример: SELECT FirstName, LastName FROM OtherDataSource.DBName.ObjectOwner.PersonNames WHERE PersonKey = 'ABC' ORDER BY LastName, FirstName Если кодировка удаленного источника данных отличается от кодировки локального сервера, результаты сравнения в секции WHERE могут оказаться неожиданными. Если показанный запрос выполняется на удаленном сервере, он возвращает все записи, у которых столбец PersonKey равен 'ABC'. Но если запрос запускается на локальном сервере, PersonKey перед сравнением преобразуется в локальную кодировку. Ограничения распределенных запросов При использовании распределенных запросов в SQL Server действует целый ряд правил и ограничений. Если провайдер не в полной степени обеспечивает функциональность OLE DB, возможны дополнительные ограничения для команд SQL. Правила и ограничения, действующие в отношении распределенных запросов, перечислены ниже: • В распределенных запросах разрешаются команды SELECT, состоящие только из секций SELECT, FROM и WHERE. • Секция INTO разрешается при условии, что создаваемая таблица находится на локальном сервере. • Если список выборки содержит столбец типа BLOB из удаленной таблицы, команда SELECT не может содержать секции ORDER BY. • Локальные команды SQL не могут ссылаться на удаленные столбцы BLOB с ключевыми словами IS NULL и IS NOT NULL. • Команды INSERT, UPDATE и DELETE, модифицирующие данные на удаленном сервере, должны соответствовать требованиям OLE DB к модификации данных. • При работе с удаленной таблицей с помощью курсора секция обновления и удаления WHERE CURRENT OF может выполняться лишь в том случае, если провайдер OLE DB поддерживает данную возможность. • Команды READTEXT, WRITETEXT и UPDATETEXT не поддерживаются для удаленных таблиц. • Команды CREATE, DROP и ALTER не могут использоваться для удаленных серверов. • Курсоры типов STATIC и INSENSITIVE могут ссылаться на удаленные таблицы. • Курсоры типа KEYSET могут ссылаться на удаленные таблицы лишь в том случае, если провайдер OLE DB соответствует требованиям, документированным в описании функциональных возможностей курсоров KEYSET. • Курсоры FORWARD-ONLY не работают с удаленными таблицами. Совет Хотя к данным на удаленном сервере можно обратиться и через RPC, и с помощью распределенного запроса, Microsoft рекомендует при работе с удаленными данными использовать распределенные запросы. Распределенные транзакции
converted to PDF by BoJIoc
Распределенная (distributed) транзакция работает с данными, находящимися на двух и более серверах. В механизме распределенных транзакций участвуют два основных компонента: диспетчер ресурсов и диспетчер транзакций. SQL Server (версии 6.5 и выше) может участвовать в распределенной транзакции с другим экземпляром SQL Server (версии 6.5 и выше) или любым источником данных, соответствующим спецификации X/Open XA для обработки распределенных транзакций. Внимание Транзакция на одном сервере, распространяющаяся на две и более базы данных, в действительности является распределенной. В этом случае SQL Server выполняет обычные действия по управлению распределенными транзакциями. Диспетчер ресурсов Диспетчером ресурсов (resource manager) называется сервер, содержащий данные, к которым обращается распределенный запрос. Функция диспетчера ресурсов — предоставление ресурсов, являющихся частью распределенной транзакции. SQL Server выполняет функции диспетчера ресурсов для распределенных транзакций, соответствующих спецификации X/Open XA для обработки распределенных транзакций. Диспетчер транзакций Диспетчер транзакций координирует прохождение транзакции между диспетчерами ресурсов. Диспетчером распределенных транзакций может быть MS DTC (Microsoft Distributed Transaction Coordinator) или любой диспетчер транзакций с поддержкой спецификации X/Open XA в части обработки распределенных транзакций. Диспетчер транзакций координирует транзакции совместно с диспетчерами ресурсов, чтобы гарантировать закрепление или откат всей транзакции. Примечание Распределенную транзакцию можно создать лишь при работающем диспетчере транзакций. Двухфазовое закрепление Распределенная транзакция обрабатывается аналогично локальным транзакциям. Когда транзакция завершается, приложение выдает команду закрепления или отката транзакции. Затем диспетчер транзакций координирует выполнение команды закрепления или отката с применением двухшагового процесса, называемого двухфазовым закреплением. Процесс двухфазового закрепления состоит из подготовительной фазы и фазы закрепления. Подготовительная фаза В подготовительной фазе диспетчер транзакций посылает команду подготовки всем диспетчерам ресурсов, участвующим в распределенной транзакции. Диспетчеры ресурсов подготавливают транзакцию так, чтобы для нее можно было выполнить закрепление или откат, и сообщают диспетчеру транзакций о завершении подготовительной фазы. Если какому-либо диспетчеру ресурсов не удается обработать запрос на подготовку, транзакция откатывается. Фаза закрепления После того как все диспетчеры ресурсов сообщат диспетчеру транзакций о завершении подготовительной фазы, диспетчер транзакций передает диспетчерам ресурсов требование на закрепление или откат. Если какой-либо диспетчер ресурсов не сможет завершить свою часть транзакции, вся транзакция откатывается. SQL Server в распределенных транзакциях Существует несколько ситуаций, при которых SQL Server включается в распределенную транзакцию: • Если при активной локальной транзакции выдается запрос на распределенную транзакцию, локальная транзакция преобразуется в распределенную. Следующий фрагмент демонстрирует преобразование локальной транзакции в распределенную: BEGIN TRANSACTION GO UPDATE authors SET contract = 1 GO -- на данный момент транзакция является локальной UPDATE MyServer.Pubs.dbo.authors SET contract = 1 GO -- транзакция преобразуется в распределенную
converted to PDF by BoJIoc
COMMIT TRANSACTION GO • Для явного создания распределенной транзакции используется команда BEGIN DISTRIBUTED TRANSACTION. • Удаленные вызовы процедур могут привести к повышению локальной транзакции до распределенной. • Распределенная транзакция может запускаться методами ODBC или OLE DB. Экземпляр SQL Server, инициирующий распределенную транзакцию, управляет ее завершением. Когда после инициирования распределенной транзакции подключение выполняет команду COMMIT TRANSACTION или ROLLBACK TRANSACTION, управляющий сервер обращается к диспетчеру транзакций с требованием завершить распределенную транзакцию на всех участвующих в ней диспетчерах ресурсов. BEGIN DISTRIBUTED TRANSACTION Команда BEGIN DISTRIBUTED TRANSACTION используется для явного создания распределенных транзакций. Она имеет следующий синтаксис: BEGIN DISTRIBUTED TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции] Повышение транзакций при вызовах RPC SQL Server можно настроить так, чтобы при выполнении RPC локальная транзакция повышалась до распределенной. Для настройки используется хранимая процедура sp_configure. Синтаксис sp_configure для повышения локальных транзакций выглядит следующим образом: sp_configure "remote proc trans", [1 | 0] Если параметр remote proc trans процедуры sp_configure равен 0, то при удаленном вызове процедуры локальная транзакция не преобразуется в распределенную. Если параметр remote proc trans процедуры sp_configure равен 1, вызов RPC приводит к преобразованию локальной транзакции в распределенную. Совет После настройки SQL Server не забудьте выполнить команду RECONFIGURE; без нее изменения конфигурации не вступят в силу. Примеры экзаменационных вопросов Question 1 In the following SELECT statement, what are the names of the tables being accessed? [Check all correct answers] select * from sales..thisyear cross join old.othersales.joe.lastweek • • • • •
A. thisyear B. lastweek C. sales D. old E. joe
Вопрос 1 Что является именами таблиц в следующей команде SELECT? [Выберите все правильные ответы] select * from sales..thisyear cross join old.othersales.joe.lastweek • • • • •
A. thisyear B. lastweek C. sales D. old E. joe
converted to PDF by BoJIoc
Правильные ответы — A и B. Команда SELECT обращается к таблицам thisyear и lastweek. Ответ C неверен, поскольку sales является именем базы данных. Ответ D неверен, поскольку old является именем удаленного сервера. Ответ E тоже неверен; joe — владелец таблицы lastweek. Question 2 Which of the following SQL batches will run a distributed transaction? [Check all correct answers] • a. begin transaction go delete table1 go update MyServer.dbo.MyTable set Column1 = 1234 go commit transaction go • b. sp_configure 'remote proc tran',1 reconfigure go exec Server2.mydb.myproc go • c. begin distributed transaction go update server2.pubs..authors set contract = 1 go commit transaction go • d. begin transaction go delete mydb..table1 delete m2.mydb..table2 go rollback transaction go Вопрос 2 Какие из приведенных пакетов SQL запускают распределенный запрос? [Выберите все правильные ответы] • A. begin transaction go delete table1 go update MyServer.dbo.MyTable set Column1 = 1234 go commit transaction go • B. sp_configure 'remote proc tran',1 reconfigure go exec Server2.mydb.myproc go • C. begin distributed transaction go update server2.pubs..authors set contract = 1 go
converted to PDF by BoJIoc
commit transaction go • D. begin transaction go delete mydb..table1 delete m2.mydb..table2 go rollback transaction go Правильные ответы — C и D. В ответе C использовано явное создание распределенной транзакции. Ответ B косвенно начинает распределенную транзакцию, обращаясь к удаленному источнику данных при наличии активной транзакции. Ответ A неверен, поскольку в команде UPDATE имя My Server относится к базе данных, а не к удаленному серверу. Следовательно, распределенная транзакция не создается. Ответ B неверен. Даже несмотря на то, что сервер настроен на автоматическое преобразование локальных транзакций в распределенные при вызовах RPC, в момент вызова RPC локальной транзакции не существует. Question 3 The OPENQUERY function is used to do which of the following? • • • • •
A. The OPENQUERY function is used to modify data on a remote server. B. The OPENQUERY function is used to execute an RPC. C. The OPENQUERY function is used to make an ad hoc connection to an OLE DB data source. D. The OPENQUERY function is used to access predefined remote data source. E. All of the above.
Вопрос 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. Question 4 Which of the following SQL statements are valid in distributed queries? [Check all correct answers] • • • •
A. select * into MyServer.tempdb..t1 from pubs..authors B. insert S2.pubs..jos (jobs_desc, min_lvl, mxm_lvl) values ('MyJob',1,2) C. select * from s3.pubs..authors D. drop table S2.tempdb..t3
Вопрос 4 Какие из следующих команд SQL допустимы в распределенных запросах? [Выберите все правильные ответы] • • • •
A. select * into MyServer.tempdb..t1 from pubs.authors B. insert S2.pubs..jos (jobs_desc, min_lvl, mxm_lvl) values ('MyJob',1,2) C. select * from s3.pubs..authors D. drop table S2.tempdb..t3
Правильные ответы — B и C. В обоих ответах происходит обращение к данным, находящимся на другом сервере. Ответ A неверен, поскольку удаленная таблица не может быть указана в качестве создаваемой в
converted to PDF by BoJIoc
команде SELECT INTO. Ответ D неверен, поскольку команда DROP TABLE в распределенных запросах не разрешается. ГЛАВА 18
Пример экзамена Приведенные в этой главе рекомендации помогут вам выработать стратегию успешной сдачи экзамена. В частности, вы научитесь выбирать правильные ответы, расшифровывать неоднозначности в тексте и работать с экзаменационной программой Microsoft. Вы узнаете, какую информацию следует запоминать и как готовиться к экзамену. В конце главы приведена подборка из 40 вопросов по темам, относящимся к экзамену Microsoft Exam 70-029: «Designing and Implementing Databases with Microsoft SQL Server 7». Вопросы, вопросы, вопросы… Не сомневайтесь, при сдаче экзамена вам предстоит ответить на множество специфических и конкретных вопросов. В настоящее время экзамен по SQL Server 7 может быть фиксированным или адаптивным. Фиксированный экзамен состоит из 49 вопросов, на которые отводится 150 минут. Если экзамен является адаптивным (программа сообщит вам об этом в начале экзамена), он содержит от 25 до 75 вопросов (в среднем) и занимает от 30 до 90 минут. Независимо от типа экзамена вопросы делятся на четыре основных типа: • • • •
многовариантные с одним правильным ответом; многовариантные с несколькими правильными ответами; многофазовые с одним правильным ответом; многофазовые с одним или несколькими ответами.
Перед тем как выбрать ответ, обязательно дважды перечитайте текст вопроса. Кроме того, поищите кнопку Exhibit. Кнопка Exhibit выводит графическую информацию, относящуюся к вопросу, как правило — экранную копию выходных данных программы или элементы графического интерфейса, которые необходимо проанализировать при изучении вопроса и формулировке ответа. Кнопка Exhibit выводит также графику и диаграммы, которые поясняют текст вопроса, содержат дополнительные данные, демонстрируют структуру страниц или поведение программы. Не у каждого вопроса есть лишь один ответ; многие вопросы имеют несколько ответов. Следовательно, вы должны внимательно прочитать текст вопроса и определить, какие ответы являются обязательными или возможными, а также поискать дополнительные подсказки или инструкции при выборе ответа. Такие инструкции часто выводятся в квадратных скобках сразу же после текста вопроса (как в многовариантных ответах, где допускается выбор одного или нескольких вариантов). Выбор правильных ответов Разумеется, единственный способ сдать экзамен — найти достаточное количество правильных ответов и набрать проходной балл. Однако экзамены 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 Manipulation Language); T-SQL DDL (Data Definition Language); команды управления транзакциями T-SQL и их поведение.
Если вы читали эту книгу за компьютером, на котором установлен SQL Server, и пытались экспериментировать с различными возможностями и функциями по мере изложения материала, вам удастся справиться с этой задачей без особых затруднений. Кроме того, не забывайте о «шпаргалке» в конце книги — в ней изложен материал, который важнее всего запомнить; пользуйтесь ею при подготовке к экзамену. Подготовка к экзамену Лучший способ подготовки к экзамену (разумеется, после изучения материала) — сдать хотя бы один пробный экзамен. Мы включили в эту главу вопросы такого экзамена. Эти вопросы приведены в следующем разделе. В отличие от предыдущих глав, ответы не следуют сразу же за вопросами; чтобы просмотреть ответы, вам придется обратиться к главе 19. На сдачу экзамена отводится 105 минут. Ведите себя честно, не подглядывайте в текст книги или в ответы. Когда время выйдет или вы ответите на все вопросы, проверьте свои ответы по главе 19. Обратите особое внимание на объяснение неправильных ответов; это поможет укрепить ваше знание материала. Конечно, умение находить правильные ответы — вещь хорошая, но не менее важно понять, почему неправильный ответ неправилен. На экзамене Прежде всего — успокойтесь. Когда вы окажетесь перед экзаменационным компьютером, то уже никак не сможете получить дополнительные знания или подготовку. Сделайте глубокий вдох, потянитесь и беритесь за первый вопрос. Не торопитесь — времени с избытком хватает на то, чтобы ответить на каждый вопрос и вернуться к пропущенным вопросам (для фиксированных или укороченных экзаменов). Если вы дважды прочитали вопрос и понятия не имеете, что с ним делать, пометьте его и двигайтесь дальше (для фиксированных или укороченных экзаменов; на адаптивном экзамене придется гадать). Простые и сложные вопросы распределены в экзамене случайным образом. Если вы сдаете фиксированный или укороченный экзамен, не обманывайте себя и не тратьте слишком много времени на сложный вопрос в самом начале — это помешает вам ответить на несколько простых вопросов в конце. На фиксированном или укороченном экзамене вы можете прочитать все вопросы экзамена. Перед тем как возвращаться к пропущенным вопросам, оцените свой запас времени. По мере ответов на вопросы
converted to PDF by BoJIoc
снимайте пометки. Продолжайте просматривать оставшиеся помеченные вопросы до тех пор, пока не кончится время или не будут введены ответы на все вопросы. На адаптивном экзамене установите максимальное время ответа на вопрос (мы рекомендуем выделять не более пяти минут, и то, только если вы находитесь в полном замешательстве) и следите за временем, отвечая на длинные или сложные вопросы. Если время истекло, попробуйте угадать ответ и следуйте дальше. Не лишайте себя возможности ответить на большее число вопросов и не тратьте время на долгие размышления над вопросами, если только вам не кажется, что вы сможете найти ответ. В противном случае вы лишь упускаете собственные возможности. На этом наши рекомендации кончаются. Далее следуют вопросы, на которых можно потренироваться в сдаче экзамена. Question 1 Which of the following SQL statements will place the dash in a nine-digit zipcode field from the address table? That is, what will convert 557460001 to 55746-0001? [Check all correct answers] • • • • •
A. select stuff(zipcode, 6,1,'-') from address B. select substring(zipcode,0,4)+'-'+substring(zipcode,5,8) from address C. select stuff(zipcode,6,0,'-') from address D. select substring(zipcode,1,5)+'-'+substring(zipcode,6,4) from address E. select substring(zipcode,1,5)+'-'+substring(zipcode,6,9) from address
Вопрос 1 Какие из следующих команд SQL включают дефис в поле zipcode таблицы address, состоящее из девяти цифр? Иначе говоря, какие команды преобразуют 557460001 в 55746-0001? [Выберите все правильные ответы] • • • • •
A. select stuff(zipcode, 6,1,'-') from address B. select substring(zipcode,0,4)+'-'+substring(zipcode,5,8) C. select stuff(zipcode,6,0,'-') from address D. select substring(zipcode,1,5)+'-'+substring(zipcode,6,4) from address E. select substring(zipcode,1,5)+'-'+substring(zipcode,6,9) from address
Question 2 What is a primary key constraint used for? • • • •
A. Identify a row in a database table. B. Improve the performance of database queries. C. Reduce contention when updating data. D. Enforce domain integrity.
Вопрос 2 Для чего используется ограничение первичного ключа (PRIMARY KEY)? • • • •
A. Для идентификации записи в таблице базы данных. B. Для повышения быстродействия запросов. C. Для уменьшения конкуренции при обновлении данных. D. Для обеспечения целостности доменов.
Question 3 The following table will take up how much disk space for 100 000 rows? create table MyTable ( a int not null, b char(400) not null, c datetime 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
create table MyTable ( a int not null, b char(400) not null, c datetime not null ) • • • • •
A. 800 000 Кбайт. B. 50 000 Кбайт. C. 40 000 Кбайт. D. 44 480 Кбайт. E. 42 112 Кбайт.
Question 4 You have two tables — table Order is the parent table and OrderLine is the child table. How would you set up a delete trigger to cascade queries? • • • •
A. The trigger should set up on OrderLine to remove Order rows when OrderLine is deleted. B. The trigger should be set up on Order to remove OrderLine rows when the Order is deleted. C. The trigger should be set up on Order to prevent the delete if OrderLine exists. D. None of the above.
Вопрос 4 Имеются две таблицы — таблица Order является базовой, а таблица OrderLine является подчиненной. Как установить триггер для каскадного удаления? • A. Триггер следует установить в OrderLine для удаления записей Order при удалении из OrderLine. • B. Триггер следует установить в Order для удаления записей Orderline при удалении из Order. • C. Триггер следует установить в Order для предотвращения удаления в том случае, если запись в OrderLine существует. • D. Ни один из перечисленных ответов не подходит. Question 5 Which normal form is the following table in? create table Address ( AddressId int not null, StreetAddress varchar(120), City varchar(120), State varchar(120), ZipCode char(9), PhoneNumber1 varchar(10), PhoneNumber2 varchar(10), PhoneNumber3 varchar(10), StateTaxRate numeric(5,3), PriceOfTea numeric(10,2), primary key ( AddressId) ) • • • •
A. First normal form. B. Second normal form. C. Third normal form. D. It is not normalized.
Вопрос 5 В какой нормальной форме находится следующая таблица? create table Address ( AddressId int not null, StreetAddress varchar(120), City varchar(120), State varchar(120), ZipCode char(9), PhoneNumber1 varchar(10), PhoneNumber2 varchar(10), PhoneNumber3 varchar(10), StateTaxRate numeric(5,3),
converted to PDF by BoJIoc
PriceOfTea numeric(10,2), primary key ( AddressId) ) • • • •
A. Первая нормальная форма. B. Вторая нормальная форма. C. Третья нормальная форма. D. Таблица не нормализована.
Question 6 Which normal form is the following table in? create table Address ( AddressId int not null, StreetAddress varchar(120), City varchar(120), State varchar(120), ZipCode char(9), StateTaxRate numeric(5,3), PriceOfTea numeric(10,2), primary key ( AddressId) ) • • • •
A. First normal form. B. Second normal form. C. Third normal form. D. It is not normalized.
Вопрос 6 В какой нормальной форме находится следующая таблица? create table Address ( AddressId int not null, StreetAddress varchar(120), City varchar(120), State varchar(120), ZipCode char(9), StateTaxRate numeric(5,3), PriceOfTea numeric(10,2), primary key ( AddressId) ) • • • •
A. Первая нормальная форма. B. Вторая нормальная форма. C. Третья нормальная форма. D. Таблица не нормализована.
Question 7 Which normal form is the following table in? create table Address ( AddressId int not null, StreetAddress varchar(120), City varchar(120), State varchar(120), ZipCode char(9), primary key ( AddressId) ) • • • •
A. First normal form. B. Second normal form. C. Third normal form. D. It is not normalized.
Вопрос 7 В какой нормальной форме находится следующая таблица? create table Address
converted to PDF by BoJIoc
( AddressId int not null, StreetAddress varchar(120), City varchar(120), State varchar(120), ZipCode char(9), primary key ( AddressId) ) • • • •
A. Первая нормальная форма. B. Вторая нормальная форма. C. Третья нормальная форма. D. Таблица не нормализована.
Question 8 What will happen with the following CREATE DATABASE command? create database MyDb on ( name = dev1, filename='C:\mssql7\dev1', size=10) • • • •
A. An error will be generated, because a log file was not specified. B. A database will be created that has data and log stored on dev1. C. A database will be created that has data stored on dev1 and a log stored in a file called MyDB.ldf. D. An error will be generated, because the extension .mdf was not specified for the file name.
Вопрос 8 Что произойдет при выполнении следующей команды CREATE DATABASE? create database MyDb on ( name = dev2, filename='C:\mssql7\dev1', size=10) • • • •
A. Произойдет ошибка, поскольку файл журнала не указан. B. На dev1 создается база данных, содержащая данные и журнал. C. Создается база данных, хранящая данные на dev1, а журнал — на MyDB.ldf. D. Произойдет ошибка, поскольку в имени файла не указано расширение .mdf.
Question 9 You want to create a Sales table that meets the following conditions: • You plan on having remote servers set up in Denver, Tampa and Minneapolis with a central site in Dallas. • You want to be able to insert new customers in each remote server. • You want to be able to report on the data from the central server in Dallas. • You want unique IDs across all the servers. • You will use replication to keep the data synchronized across the databases. How do you create the Sales table? • A. Create all the tables with the ID being an identity column. • B. Create the remote tables with an identity column, and, on the central table, make sure the ID column is not an identity. • C. Create the tables with the ID column being an uniqueidentifier data type. • D. Create the tables with the ID column being a uniqueidentifier data type with a default of GETID(). • E. Create the tables with the ID column being a uniqueidentifier data type with a default of NEWID(). Вопрос 9 Вы хотите создать таблицу Sales, удовлетворяющую следующим условиям: • Вы планируете установить удаленные серверы в Денвере, Тампа и Миннеаполисе, а центральный сервер будет находиться в Далласе. • Вы хотите иметь возможность вставлять данные новых клиентов на каждом удаленном сервере. • Вы хотите иметь возможность строить отчеты по данным на центральном сервере в Далласе. • Вы хотите создать поле ID, значения которого уникальны на всех серверах. • Для синхронизации данных между базами будет использоваться репликация. Как создать таблицу Sales? • A. Создать все таблицы, в которых столбец ID является столбцом счетчика. • B. Создать все удаленные таблицы со столбцами счетчика и проследить за тем, чтобы в центральной таблице столбец не был столбцом счетчика. • C. Создать таблицы, в которых столбец ID имеет тип данных uniqueidentifier.
converted to PDF by BoJIoc
• D. Создать таблицы, в которых столбец ID имеет тип данных uniqueidentifier и по умолчанию равен GETID(). • E. Содать таблицы, в которых столбец ID имеет тип данных uniqueidentifier и по умолчанию равен NEWID(). Question 10 Consider the following stored procedure: create procedure MyP1 (@a varchar(32)) as begin tran declare @b int delete from a1 where au_lname like @a select @b = @@rowcount if ( @@error != 0) begin rollback tran return -200 end delete from a2 where au_lname like @a select @b = @b + @@rowcount if ( @@error != 0) begin rollback tran return -200 end commit tran return @b Which of the following statements are true? [Check all correct answers] • • • • •
A. The procedure can only be run from inside a transaction. B. If an error occurs in deleting from table a1, it will not delete from table a2. C. If an error occurs in deleting from table a2, the rows deleted from table a1 will be rolled back. D. The stored procedure is invalid and will not be created. E. None of the above.
Вопрос 10 Имеется следующая хранимая процедура: create procedure MyP1 (@a varchar(32)) as begin tran declare @b int delete from a1 where au_lname like @a select @b = @@rowcount if ( @@error != 0) begin rollback tran return -200 end delete from a2 where au_lname like @a select @b = @b + @@rowcount if ( @@error != 0) begin rollback tran return -200 end commit tran return @b Какие из следующих утверждений истинны? [Выберите все правильные ответы] • A. Процедура может запускаться только из транзакции. • B. Если при удалении из таблицы a1 произойдет ошибка, процедура не будет производить удаление из таблицы a2. • C. Если при удалении из таблицы a2 произойдет ошибка, записи, удаленные из таблицы a1, будут возвращены на место. • D. Хранимая процедура написана неправильно и не будет создана. • E. Ни одно из перечисленных утверждений.
converted to PDF by BoJIoc
Question 11 You currently have the following table: create table Sale ( SaleId numeric(10) identity, CustomerId numeric(10), SaleNote varchar(2000) default 'NONE', SaleDate datetime) You no longer want to store the SaleNote in this table. Which of the following is the best way to remove the SaleNote column from the table? • A. Bulk copy the Sale table out of the database, drop the Sale table, create a new Sale table, and bulk copy the data back into the new Sale table, ignoring the SaleNote column. • B. Alter the Sale table by dropping the SaleNote column. • C. Rename the Sale table. Use DTS to migrate the data creating a Sale table, skipping the SaleNote column. Then, drop the original Sale table. • D. Alter the Sale table by dropping the default on the SaleNote column and then dropping the SaleNote column. Вопрос 11 Имеется следующая таблица: create table Sale ( SaleId numeric(10) identity, CustomerId numeric(10), SaleNote varchar(2000) default 'NONE', SaleDate datetime) Вы хотите отказаться от хранения SaleNote в таблице. Как лучше всего удалить столбец SaleNote из таблицы? • A. Выполнить пакетное копирование таблицы Sale из базы данных, удалить таблицу Sale, создать новую таблицу Sale и выполнить пакетное копирование данных обратно в таблицу Sale, игнорируя столбец SaleNote. • B. Модифицировать таблицу Sale table с удалением столбца SaleNote. • C. Переименовать таблицу Sale. Воспользоваться DTS для переноса данных и создать таблицу Sale, пропуская столбец SaleNote. Затем удалить исходную таблицу Sale. • D. Модифицировать таблицу Sale, удалить значение по умолчанию для столбца SaleNote и затем удалить столбец SaleNote. Question 12 You have a blank table that contains identity columns, and you want to load a data file that currently contains values for the identity column into the table. Which of the following statements are true? • • • •
A. To load the B. To load the C. To load the D. You cannot
data using bcp, you must use the –I parameter. data using bcp, you must use the –E parameter. data using bcp, you must first configure the database to allow identity inserts. load the data with bcp.
Вопрос 12 Имеется пустая таблица, содержащая столбцы счетчика. Вы хотите загрузить в таблицу файл данных, содержащий значения столбца счетчика. Какие из следующих утверждений верны? • A. Для загрузки данных с использованием bcp необходимо использовать параметр –I. • B. Для загрузки данных с использованием bcp необходимо использовать параметр –E. • C. Чтобы загрузить данные с использованием bcp, необходимо предварительно настроить базу данных и разрешить вставку в столбцы счетчика. • D. Вы не cможете загрузить данные с помощью bcp. Question 13 You want to enforce domain integrity on a table. Which of the following SQL Server features can you use? [Check all correct answers] • • • •
A. Defaults. B. Rules. C. Triggers. D. Foreign key.
converted to PDF by BoJIoc
Вопрос 13 Вы хотите обеспечить целостность доменов для таблицы. Какими из следующих возможностей SQL Server можно воспользоваться? [Выберите все правильные ответы] • • • •
A. Значения по умолчанию. B. Правила. C. Триггеры. D. Внешний ключ.
Question 14 What will happen when you execute the following SQL statement? [Check all correct answers] select au_id, sum(royaltyper) from titleauthor group by au_id, title_id order by title_id, au_id compute avg(sum(royaltyper)) by title_id • A. The statement will fail. • B. There will be a row for each autor_id and title_id combination. • C. There will be a row each time the title_id changes showing the average for each author that worked on that title_id. • D. There will be a row each time the autor_id changes showing the average for each author that worked on that title_id. Вопрос 14 Что произойдет при выполнении следующей команды SQL? [Выберите все правильные ответы] select au_id, sum(royaltyper) from titleauthor group by au_id, title_id order by title_id, au_id compute avg(sum(royaltyper)) by title_id • A. Команда завершится неудачей. • B. Для каждого сочетания autor_id и title_id создается запись. • C. Для каждого изменения title_id создается запись, в которой показано среднее значение выплат для всех авторов, работавших над книгой с данным названием (title_id). • D. Для каждого изменения autor_id создается запись, в которой показано среднее значение выплат для всех авторов, работавших над книгой с данным названием (title_id). Question 15 Consider the following table definition: Create table autos (make varchar(20) not null, model varchar(20) not null, acquisition_cost money null, acquisition_date datetime null) What will happen when the following SQL is executed? [Check all correct answers] Truncate table autos Begin tran Insert autos (make, model) values ('Tucker', "Torpedo") If exists(select * from autos) Rollback tran Else Commit tran • • • • •
A. The batch will fail, because the begin tran…commit tran pair are not properly nested. B. At the end of the batch, no rows will be in the table. C. At the end of the batch, one row will be in the table. D. All proper error handling will be performed. E. All proper error handling will not be performed.
Вопрос 15 Имеется следующее определение таблицы: Create table autos (make varchar(20) not null, model varchar(20) not null,
converted to PDF by BoJIoc
acquisition_cost money null, acquisition_date datetime null) Что произойдет при выполнении следующего фрагмента SQL ? [Выберите все правильные ответы] Truncate table autos Begin tran Insert autos (make, model) values ('Tucker', "Torpedo") If exists(select * from autos) Rollback tran Else Commit tran • A. Пакет не будет выполнен, поскольку пара begin tran…commit tran не находится на должном уровне вложенности. • B. После выполнения пакета в таблице не останется ни одной записи. • C. После выполнения пакета в таблице останется одна запись. • D. Будет выполнена надлежащая обработка ошибок. • E. Не будет выполнена надлежащая обработка ошибок. Question 16 Consider the following table definition: Create table autos (make varchar(20) not null, model varchar(20) not null, acquisition_cost money null, acquisition_date datetime null) What will happen when the following SQL is executed? [Check all correct answers] Truncate table autos Begin tran Insert autos (make, model) values ('Tucker', "Torpedo") If exists(select * from autos) Commit tran Else Print "Error: the row was not inserted into the table" Rollback tran • • • • •
A. The batch will fail, because the begin tran…commit tran pair are not properly nested. B. At the end of the batch, no rows will be in the table. C. At the end of the batch, one row will be in the table. D. All proper error handling will be performed. E. All proper error handling will not be performed.
Вопрос 16 Имеется следующее определение таблицы: Create table autos (make varchar(20) not null, model varchar(20) not null, acquisition_cost money null, acquisition_date datetime null) Что произойдет при выполнении следующего фрагмента SQL ? [Выберите все правильные ответы] Truncate table autos Begin tran Insert autos (make, model) values ('Tucker', "Torpedo") If exists(select * from autos) Commit tran Else Print "Error: the row was not inserted into the table" Rollback tran • A. Пакет не будет выполнен, поскольку пары begin tran…commit tran не находятся на должном уровне вложенности. • B. После выполнения пакета в таблице не останется ни одной записи. • C. После выполнения пакета в таблице останется одна запись. • D. Будет выполнена надлежащая обработка ошибок.
converted to PDF by BoJIoc
• E. Не будет выполнена надлежащая обработка ошибок. Question 17 Consider the following table definition: Create table autos (make varchar(20) not null, model varchar(20) not null, acquisition_cost money null, acquisition_date datetime null) What will happen when the following SQL is executed? [Check all correct answers] Truncate table autos Insert autos (make, model) values ('Plymouth, "Prowler") If @@error != 0 return Begin tran Insert autos (make, model) values ('Tucker', "Torpedo") If @@error != 0 return If (select count(*) from autos) = 2 Commit tran Else begin Print "Error: the row was not inserted into the table" Rollback tran end • • • • • •
A. The batch will fail, because the begin tran…commit tran pair are not properly nested. B. At the end of the batch, no rows will be in the table. C. At the end of the batch, two rows will be in the table. D. All proper error handling will be performed. E. All proper error handling will not be performed. F. The batch will fail, because of mismatched quotes in the insert statements.
Вопрос 17 Имеется следующее определение таблицы: Create table autos (make varchar(20) not null, model varchar(20) not null, acquisition_cost money null, acquisition_date datetime null) Что произойдет при выполнении следующего фрагмента SQL ? [Выберите все правильные ответы] Truncate table autos Begin tran Insert autos (make, model) values ('Plymouth, "Prowler") If @@error != 0 return Begin tran Insert autos (make, model) values ('Tucker', "Torpedo") If @@error != 0 return If (select count(*) from autos) = 2 Commit tran Else begin Print "Error: the row was not inserted into the table" Rollback tran end • A. Пакет не будет выполнен, поскольку пары begin tran…commit tran не находятся на должном уровне вложенности. • B. После выполнения пакета в таблице не останется ни одной записи. • C. После выполнения пакета в таблице останутся две записи.
converted to PDF by BoJIoc
• D. Будет выполнена надлежащая обработка ошибок. • E. Не будет выполнена надлежащая обработка ошибок. • F. Пакет не будет выполнен из-за несовпадения кавычек и апострофов в командах вставки. Question 18 You are creating a database to contain member information for a social group. What is wrong with he following design? [Check all correct answers] Create table member (last_name char(20) null, first_name varchar(30) not null, address_line1 varchar(30) null, address_line2 varchar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_name char(30) not null) • • • • • • •
A. This table is not normalized. B. Data types are chosen poorly. C. Column null properties are not chosen well. D. All fields are required. E. No fields are required. F. Some fields are required that probably should not be. G. Some fields are not required that probably should be.
Вопрос 18 Вы создаете базу данных для хранения информации о членах общественной группы. Какими недостатками обладает следующая структура? [Выберите все правильные ответы] Create table member (last_name char(20) null, first_name varchar(30) not null, address_line1 varchar(30) null, address_line2 varchar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_name char(30) not null) • • • • • • •
A. Таблица не нормализована. B. Неудачно выбраны типы данных. C. Неудачно выбраны свойства обязательности полей (null/not null). D. Все поля являются обязательными. E. Ни одно поле не является обязательным. F. Некоторые из обязательных полей следовало бы сделать необязательными. G. Некоторые из необязательных полей следовало бы сделать обязательными.
Question 19 You are creating a database to contain member information for a social group. What could you change to make the design better? [Check all correct answers] Create table member (last_name char(20) null, first_name varchar(30) not null, address_line1 varchar(30) null, address_line2 varchar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_name char(30) not null) • • • • •
A. Make last name not null. B. Create a candidate key for the table. C. Normalize the address fields into a different table. D. Make all character columns fixed length. E. Make all character columns variable length.
converted to PDF by BoJIoc
Вопрос 19 Вы создаете базу данных для хранения информации о членах общественной группы. Как можно улучшить структуру базы? [Выберите все правильные ответы] Create table member (last_name char(20) null, first_name varchar(30) not null, address_line1 varchar(30) null, address_line2 varchar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_name char(30) not null) • • • • •
A. Запретить null в столбце фамилии (last_name). B. Создать для таблицы возможный ключ. C. Нормализовать адресные поля в отдельную таблицу. D. Объявить все символьные столбцы с фиксированной длиной. E. Объявить все символьные столбцы с переменной длиной.
Question 20 The following table will take up how many pages for 100 000 rows? create table MyTable ( a int not null, b char(400) not null, c datetime not null ) • • • • •
A. 100 000. B. 50 000. C. 20 000. D. 10 000. E. 6000.
Вопрос 20 Сколько страниц потребуется для 100 000 записей следующей таблицы? create table MyTable ( a int not null, b char(400) not null, c datetime not null ) • • • • •
A. 100 000. B. 50 000. C. 20 000. D. 10 000. E. 6000.
Question 21 The following table, with a clustered index on column a, will take up how many pages for 100 000 rows? create table MyTable ( a int not null, b char(400) not null, c datetime not null ) • • • • •
A. 100 000. B. 50 000. C. 20 000. D. 10 000. E. 6000.
Вопрос 21 Сколько страниц потребуется для 100 000 записей следующей таблицы с кластерным индексом по столбцу a? create table MyTable
converted to PDF by BoJIoc
( a int not null, b char(400) not null, c datetime not null ) • • • • •
A. 100 000. B. 50 000. C. 20 000. D. 10 000. E. 6000.
Question 22 What do you need to do to place the following table in third normal form? [Check all correct answers] create table Address ( AddressId int not null, StreetAddress varchar(120), City varchar(120), State varchar(120), ZipCode char(9), PhoneNumber1 varchar(10), PhoneNumber2 varchar(10), PhoneNumber3 varchar(10), StateTaxRate numeric(5,3), PriceOfTea numeric(10,2), primary key ( AddressId) ) • • • • •
A. Remove the phone repeating group. B. Turn the phone repeating group into an array. C. Remove the state tax rate. D. Remove the price of tea. E. This table is already in third normal form.
Вопрос 22 Что необходимо сделать для преобразования следующей таблицы в третью нормальную форму? [Выберите все правильные ответы] create table Address ( AddressId int not null, StreetAddress varchar(120), City varchar(120), State varchar(120), ZipCode char(9), PhoneNumber1 varchar(10), PhoneNumber2 varchar(10), PhoneNumber3 varchar(10), StateTaxRate numeric(5,3), PriceOfTea numeric(10,2), primary key ( AddressId) ) • • • • •
A. Удалить повторяющуюся группу с номерами телефонов. B. Преобразовать повторяющуюся группу с номерами телефонов в массив. C. Удалить налоговую ставку штата (StateTaxRate). D. Удалить цену чая (PriceOfTea). E. Таблица уже находится в третьей нормальной форме.
Question 23 Consider the following table definition: Create table member (last_name char(20) null, first_name varchar(30) not null, address_line1 varchar(30) null, address_line2 varchar(30) null,
converted to PDF by BoJIoc
address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_name char(30) not null) Assuming this is the only query on the table, how would you index for a name search (on last name, on last name and first name, or partial string searches)? • • • • • •
A. Clustered on (first_name, last_name). B. Nonclustered on (first_name, last_name). C. Clustered on (last_name, first_name). D. Nonclustered on (last_name, first_name). E. No index is necessary. F. None of the above.
Вопрос 23 Имеется следующее определение таблицы: Create table member (last_name char(20) null, first_name varchar(30) not null, address_line1 varchar(30) null, address_line2 varchar(30) null, address2_line1 varchar(30) not null, address2_line2 char(30) null, spouse_name char(30) not null) Как индексировать таблицу для поиска по имени (по last_name, по last_name и first_name или по частичному вхождению строк) в предположении, что это единственный тип запросов? • • • • • •
A. Создать кластерный индекс по (first_name, last_name). B. Создать некластерный индекс по (first_name, last_name). C. Создать кластерный индекс по (last_name, first_name). D. Создать некластерный индекс по (last_name, first_name). E. Индекс не требуется. F. Ни один из перечисленных ответов.
Question 24 Which of the following can be accomplished with triggers? [Check all correct answers] • • • • •
A. Referential integrity enforcement. B. Complex business rule checking based on before and after images of the data. C. Rolling back the transaction that fired the trigger. D. Additional table modifications of the base table or other tables. E. Triggers are no longer available in version 7.
Вопрос 24 Какие из следующих задач решаются с помощью триггеров? [Выберите все правильные ответы] • • • • •
A. Обеспечение ссылочной целостности. B. Проверка сложных деловых правил, основанных на образах данных до и после операции. C. Откат транзакции, вызвавшей срабатывание триггера. D. Дополнительные модификации базовой таблицы или других таблиц. E. В версии 7 триггеры не поддерживаются.
Question 25 What is the value of @@trancount prior to entering a transaction? • • • • •
A. null B. 0 C. 1 D. 10 E. Insufficient information is provided.
Вопрос 25 Чему равно значение @@trancount до входа в транзакцию? • A. null • B. 0 • C. 1
converted to PDF by BoJIoc
• D. 10 • E. Приведенной информации недостаточно. Question 26 What is the value of @@trancount after an unqualified rollback? • • • • •
A. null B. 0 C. 1 D. 10 E. Insufficient information is provided.
Вопрос 26 Чему равно значение @@trancount после неопределенного отката? • • • • •
A. null B. 0 C. 1 D. 10 E. Приведенной информации недостаточно.
Question 27 Consider the following stored procedure: Create procedure lookup (@a int) As If @a is null Begin Print "You forgot to pass in a parameter" Return End select * from sysobjects where id = @a return What will happen if this stored procedure is executed without a parameter? • • • • •
A. The stored procedure will print "You forgot to pass in a parameter" B. The stored procedure will do a lookup based on no parameter, returning all rows in a table. C. The stored procedure will fail before it is run. D. The server will print a message stating that you must provide a default value. E. The server will print an error stating that you must provide a default value.
Вопрос 27 Имеется следующая хранимая процедура: Create procedure lookup (@a int) As If @a is null Begin Print "You forgot to pass in a parameter" Return End select * from sysobjects where id = @a return Что произойдет, если выполнить эту процедуру без параметра? • • • • •
A. Хранимая процедура выведет сообщение "You forgot to pass in a parameter". B. Хранимая процедура выполнит просмотр без параметров и вернет все записи таблицы. C. Хранимая процедура не будет выполнена. D. Сервер выведет сообщение, напоминающее о необходимости задать значение по умолчанию. E. Сервер выдаст сообщение об ошибке с напоминанием задать значение по умолчанию.
Question 28 The following statement was executed in osql: create table MyTable ( a int null, b char(400) null, c datetime
converted to PDF by BoJIoc
) Which answers best describe the results of the statement? [Check all correct answers] • • • • •
A. MyTable is created in the database. B. All the columns in the table allow nulls. C. All the columns except column C allow nulls. D. MyTable is not created, because char cannot be 400 characters. E. Column a has been declared the primary key.
Вопрос 28 В osql была выполнена следующая команда: create table MyTable ( a int null, b char(400) null, c datetime ) Какие ответы лучше всего описывают результаты команды? [Выберите все правильные ответы] • • • • •
A. В базе данных создается таблица MyTable. B. Все столбцы таблицы допускают значения null. C. Все столбцы таблицы, кроме столбца C, допускают значения null. D. Таблица MyTable не создается, поскольку тип char не может иметь длину 400 символов. E. Столбец A объявляется первичным ключом.
Question 29 Which of the following answers best describes the results of the following CREATE TABLE statement? Create table MyTable (id int not null, price smallmoney not null, markup numeric (5,2) not null, msrp as price *(1+(markup/100))) • • • •
A. SQL Server stores a four-column table. B. SQL Server stores a three-column table that acts like a four-column table. C. A table is created that only allows null in the msrp column. D. The markup column is seven digits wide.
Вопрос 29 Какое из перечисленных утверждений лучше всего описывает результаты выполнения следующей команды CREATE TABLE? Create table MyTable (id int not null, price smallmoney not null, markup numeric (5,2) not null, msrp as price *(1+(markup/100))) • A. SQL Server создает таблицу, состоящую из четырех столбцов. • B. SQL Server создает таблицу, состоящую из трех столбцов, которая работает как таблица с четырьмя столбцами. • C. Значения null допускаются только в столбце msrp созданной таблицы. • D. Ширина столбца markup равна шести символам. Question 30 Which of the following statements are true about the REFERENCES CONSTRAINT? [Check all correct answers] • • • • •
A. Inserts into the referencing table that violate the reference constraint will not be completed. B. The referenced table must already exist when the referencing table is created. C. The referenced column must already exist when the referencing table is created. D. The referenced column must be the primary key or have a unique constraint. E. The referencing table can have only one reference constraint.
Вопрос 30 Какие из следующих утверждений истинны по отношению к ссылочным ограничениям? [Выберите все правильные ответы] • A. Операции вставки в ссылающуюся таблицу, нарушающие ссылочную целостность, не завершаются.
converted to PDF by BoJIoc
• B. Таблица, на которую указывает ссылка, должна существовать к моменту создания ссылающейся таблицы. • C. Столбец, на который указывает ссылка, должен существовать к моменту создания ссылающейся таблицы. • D. Столбец, на который указывает ссылка, должен быть первичным ключом или иметь ограничение уникальности. • E. Ссылающаяся таблица может иметь лишь одно ссылочное ограничение. Question 31 Which of the following statements are true about the ALTER TABLE statement? • A. Columns can be dropped with the ALTER TABLE statement, even if they are referenced by a foreign key. • B. NOT NULL columns can be added to a table with the ALTER TABLE statement, provided the columns are declared with a default value. • C. Identity columns cannot be added to a table with the ALTER TABLE statement after is has been populated. • D. None of the above. Вопрос 31 Какие из следующих утверждений истинны по отношению к команде ALTER TABLE? • A. Команда ALTER TABLE может удалять столбцы даже в том случае, если на них имеется ссылка во внешнем ключе. • B. Команда ALTER TABLE может включать в таблицу столбцы NOT NULL при условии, что эти столбцы объявлены со значением по умолчанию. • C. Команда ALTER TABLE не может добавить в таблицу столбцы счетчика после ее заполнения. • D. Ни одно из перечисленных утверждений. Question 32 Consider the following table: Create table #atable ( a int null, b varchar(25) null) Which of the following statements are true? [Check all correct answers] • • • • •
A. #atable is a temporary table. B. #atable is accessible to all users. C. #atable is accessible only to its creator. D. #atable is deleted when a creator disconnects. E. #atable is created in the current database.
Вопрос 32 Имеется следующая таблица: Create table #atable ( a int null, b varchar(25) null) Какие из следующих утверждений истинны? [Выберите все правильные ответы] • • • • •
A. Таблица #atable является временной. B. Таблица #atable доступна для всех пользователей. C. Таблица #atable доступна только для своего создателя. D. Таблица #atable удаляется при отключении создателя. E. Таблица #atable создается в текущей базе данных.
Question 33 Which of the following is true about full-text indexing? • • • •
A. Full-text indexes are stored in the file system. B. Tables are allowed multiple full-text indexes. C. Full-text indexes are created, managed, and dropped by Transact-SQL statements. D. None of the above.
Вопрос 33 Какие из следующих утверждений истинны по отношению к полнотекстовому индексированию? • A. Полнотекстовые индексы хранятся в файловой системе. • B. Таблицы могут содержать несколько полнотекстовых индексов. • C. Полнотекстовые индексы создаются, обрабатываются и удаляются командами Transact-SQL.
converted to PDF by BoJIoc
• D. Ни одно из перечисленных утверждений. Question 34 Which stored procedure enables full-text indexing for a database? • • • •
A. sp_full_text_database. B. sp_fulltext_database. C. sp_fulltext_enable. D. None of the above.
Вопрос 34 Какая хранимая процедура разрешает полнотекстовое индексирование для базы данных? • • • •
A. sp_full_text_database. B. sp_fulltext_database. C. sp_fulltext_enable. D. Ни одна из перечисленных.
Question 35 What will happen with the following query? SELECT Titles FROM MyBooks WHERE CONTAINS(Description, ' "Cajun Cooking" ') • A. A query will be performed on MyTable looking to find Descriptions containing the phrase "Cajun Cooking". • B. A full-text query will be performed on MyTable looking to find Descriptions containing the phrase "Cajun Cooking". • C. A query will be performed on MyTable looking to find Descriptions starting with the phrase "Cajun Cooking". • D. A full-text query will be performed on MyTable looking to find Descriptions containing the words "Cajun" and "Cooking". Вопрос 35 Что произойдет при выполнении следующего запроса? SELECT Titles FROM MyBooks WHERE CONTAINS(Description, ' "Cajun Cooking" ') • A. К MyTable будет применен запрос для поиска всех записей, у которых столбец Description содержит фразу "Cajun Cooking". • B. К MyTable будет применен полнотекстовый запрос для поиска всех записей, у которых столбец Description содержит фразу "Cajun Cooking". • C. К MyTable будет применен запрос для поиска всех записей, у которых столбец Description начинается с фразы "Cajun Cooking". • D. К MyTable будет применен полнотекстовыйый запрос для поиска всех записей, у которых столбец Description содержит слова "Cajun" и "Cooking". Question 36 What will happen with the following query? SELECT Titles, CategoryName FROM MyBooks WHERE CONTAINS(Description, 'FORMSOF(INFLECTIONAL, "Spicy")') • A. A full-text query will be performed looking for Descriptions containing the word "Spicy". • B. A query will be performed looking for Descriptions containing the word "Spicy". • C. A full-text query will be performed looking for Descriptions starting with the word "Spicy". • D. A query will be performed looking for Descriptions starting with the word "Spicy". • E. A full-text query will be performed looking for Descriptions containing the word or any forms of the word "Spicy". Вопрос 36 Что произойдет при выполнении следующего запроса? SELECT Titles, CategoryName FROM MyBooks WHERE CONTAINS(Description, 'FORMSOF(INFLECTIONAL, "Spicy")')
converted to PDF by BoJIoc
• A. Будет применен полнотекстовый запрос для поиска записей, в которых столбец Description содержит слово "Spicy". • B. Будет применен запрос для поиска записей, в которых столбец Description содержит слово "Spicy". • C. Будет применен полнотекстовый запрос для поиска записей, в которых столбец Description начинается со слова "Spicy". • D. Будет применен запрос для поиска записей, в которых столбец Description начинается со слова "Spicy". • E. Будет применен полнотекстовый запрос для поиска записей, в которых столбец Description содержит слово "Spicy" или любые его формы. Question 37 Which of the following statements are true? [Check all correct answers] SELECT title FROM MyBooks WHERE CONTAINS(Description, 'ISABOUT (Cajun WEIGHT(0.9), Cooking WEIGHT(0.5))') • A. The phrase "Cajun Cooking" is given more weight than just the word "Cooking" itself. • B. The word "Cooking" should be near "Cajun". • C. The full-text query will be done on MyTable looking to find Descriptions containing the words "Cajun" and "Cooking". • D. A full-text query will be done on the phrase "Cajun Cooking". • E. None of the above. Вопрос 37 Какие из следующих утверждений истинны? [Выберите все правильные ответы] SELECT title FROM MyBooks WHERE CONTAINS(Description, 'ISABOUT (Cajun WEIGHT(0.9), Cooking WEIGHT(0.5))') • A. Фразе "Cajun Cooking" присваивается больший вес, чем отдельному слову "Cooking". • B. Слово "Cooking" должно находиться рядом с "Cajun". • C. К MyTable будет применен полнотекстовый запрос для поиска всех записей, в которых столбец Description содержит слова "Cajun" и "Cooking". • D. Будет выполнен полнотекстовый запрос для поиска фразы "Cajun Cooking". • E. Ни одно из перечисленных утверждений. Question 38 What methods can be used to minimize deadlock occurrences? [Check all correct answers] • A. Avoid the use of holdlock. • B. Write transactions so that when different transactions modify the same tables, the tables are accessed in the same order. • C. Do not allow user interaction with the database during a transaction. • D. All of the above. Вопрос 38 Какими способами можно уменьшить частоту возникновения взаимных блокировок? [Выберите все правильные ответы] • A. Избегать использования holdlock. • B. Записывать транзакции так, чтобы при модификации одних и тех же таблиц несколькими транзакциями обращения к таблицам происходили в одинаковом порядке. • C. Не разрешать пользователям взаимодействовать с базой данных во время транзакции. • D. Всеми перечисленными способами. Question 39 Given the following query and SHOWPLAN_TEXT output, what is true about the query? select * from titles where title_id = 'BU1111' StmtText ----------------------------------------------------------------------|--Clustered Index Seek(pubs..titles.UPKCL_titleidind, SEEK:(titles.title_id=@1) ORDERED)
converted to PDF by BoJIoc
• • • • •
A. The query would be executed using the clustered index. B. The query would be executed using the nonclustered index. C. The clustered index, UPKCL_titleidind, would be used to execute the query. D. A table scan is performed. E. The nonclustered index, UPKCL_titleidind, would be used to execute the query.
Вопрос 39 Какие утверждения являются истинными для следующего запроса и результата его выполнения при включенном параметре SHOWPLAN_TEXT? select * from titles where title_id = 'BU1111' StmtText ----------------------------------------------------------------------|--Clustered Index Seek(pubs..titles.UPKCL_titleidind, SEEK:(titles.title_id=@1) ORDERED) • • • • •
A. Запрос будет выполнен с использованием кластерного индекса. B. Запрос будет выполнен с использованием некластерного индекса. C. Для выполнения запроса будет использован кластерный индекс UPKCL_ titleidind. D. Будет выполнено сканирование таблицы. E. Для выполнения запроса будет использован некластерный индекс UPKCL_titleidind.
Question 40 What stored procedures would be used to help identify lock usage on a server? • • • •
A. sp_help. B. sp_who. C. sp_help 'locks'. D. sp_lock.
Вопрос 40 Какие хранимые процедуры следует использовать для идентификации блокировок на сервере? • • • •
A. sp_help. B. sp_who. C. sp_help 'locks'. D. sp_lock.
ГЛАВА 19
Ответы на вопросы экзамена 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 неверен — третий параметр stuff определяет количество удаляемых символов, поэтому
converted to PDF by BoJIoc
шестой символ будет заменен дефисом (-). Ответ B неверен, нумерация позиций в функции substring начинается с 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 не связано с AddressId. Ответ C неверен; если таблица не находится во второй нормальной форме, она не может находиться в третьей нормальной форме. Ответ D неверен, поскольку таблица нормализована. Вопрос 7 Правильный ответ — C. Таблица находится в третьей нормальной форме, она была нормализована с исключением повторяющихся групп атрибутов. Из таблицы удалены все избыточные данные и частичные зависимости, а все существующие атрибуты зависят от первичного ключа. Ответ B неверен; хотя таблица находится во второй нормальной форме, это не лучший ответ. Ответ A неверен; хотя таблица находится в первой нормальной форме, это не лучший ответ. Ответ D неверен, поскольку таблица находится в третьей нормальной форме. Вопрос 8 Правильный ответ — C. Ответ C правильно описывает последствия приведенной команды. Поскольку файл журнала не задан, он автоматически создается с именем базы данных и расширением .ldf. Ответ A неверен, вы не обязаны задавать имена файлов в команде CREATE DATABASE. Ответ B неверен, поскольку в SQL Server 7 данные и журнал не могут храниться в одном файле. Ответ D неверен, поскольку использование стандартных расширений файлов — всего лишь рекомендация, а не обязательное требование. Вопрос 9 Правильный ответ — E. Ответы A и B неверны, поскольку уникальность столбцов счетчика не распространяется на разные таблицы, не говоря уже о разных серверах. Ответ C неверен, поскольку создание таблиц со столбцом ID типа uniqueidentifier позволит генерировать уникальные идентификаторы, но он уступает ответу E, в котором уникальные идентификаторы генерируются автоматически. Ответ D неверен, поскольку функции GETID() не существует.
converted to PDF by BoJIoc
Вопрос 10 Правильный ответ — E. Ответ A неверен, поскольку процедура может вызываться как внутри транзакции, так и за ее пределами. Ответы B и C неверны, поскольку MyP1 присваивает значение переменной @B до проверки @@ERROR. Следовательно, значение @@ERROR будет потеряно. Ответ D неверен, поскольку хранимая процедура имеет правильный синтаксис SQL. Вопрос 11 Правильный ответ — D. Ответ A неверен; хотя он и вносит нужные изменения, но содержит лишние действия, замедляющие работу. Ответ B неверен, поскольку модификация таблицы завершится неудачей. Нельзя удалить столбец, имеющий значение по умолчанию. Ответ C неверен; хотя он и будет работать, но потребует больше времени и ресурсов, чем ответ D. Ответ D позволяет удалить столбец без повторного создания таблицы и учитывает значение по умолчанию. Вопрос 12 Правильный ответ — B. Параметр -E разрешает вставку значений столбцов счетчика программой bcp. Ответ A неверен, поскольку параметр -I не относится к числу допустимых параметров bcp. Ответ C неверен, поскольку вставка столбцов счетчика не разрешается на уровне базы данных. Ответ D неверен, поскольку данные можно загрузить с параметром -E. Вопрос 13 Ответы A, B и C верны, поскольку для обеспечения доменной целостности используются значения по умолчанию, правила и триггеры. Ответ D неверен, поскольку внешние ключи используются для ограничения ссылочной, а не доменной целостности. Вопрос 14 Правильные ответы — B и C. Ответ A неверен, поскольку команда имеет правильный синтаксис SQL и будет выполнена. Ответ D неверен, поскольку COMPUTE будет генерировать запись при каждом изменении title_id, а не au_id. Вопрос 15 Правильные ответы — B и E. Ответ A неверен, поскольку пары BEGIN TRAN...COMMIT TRAN не обязаны быть вложенными. Ответ C неверен, поскольку запись будет удалена либо по команде ROLLBACK TRAN, либо вследствие ошибки базы данных. Ответ D неверен, поскольку значение @@ERROR не проверяется после каждой команды SQL. Ответ B правилен, поскольку команда IF EXISTS проверяет наличие записей в таблице. Если записи остались, вставки откатываются. Поскольку перед транзакцией выполнялась команда TRUNCATE TABLE, записей не останется. Вопрос 16 Правильные ответы — C и E. Ответ C правилен, поскольку команда ROLLBACK TRAN выполняется всегда, но не является частью транзакции. Ответ A неверен, поскольку пары BEGIN TRAN...COMMIT TRAN не обязаны быть вложенными. Ответ D неверен, поскольку значение @@ERROR не проверяется после каждой команды SQL. Вопрос 17 Правильные ответы — C и D. Ответ C правилен, поскольку обе записи будут успешно вставлены. Ответ A неверен, поскольку пары BEGIN TRAN...COMMIT TRAN не обязаны быть вложенными. Ответ B неверен, поскольку ROLLBACK TRAN не влияет на записи, не участвующие в транзакции. Ответ E неверен, поскольку значение @@ERROR проверяется после каждой команды SQL. Остается правильный ответ — D. Ответ F неверен, поскольку в команде вставки допускаются как кавычки, так и апострофы (при условии, что для кавычек существуют парные кавычки, а для апострофов — парные апострофы). Вопрос 18 Правильные ответы — A, B, C, F и G. Утверждение A истинно, поскольку наличие двух наборов адресов в таблице означает, что таблица еще не была должным образом нормализована. Ответ B правилен, поскольку аналогичные типы данных не согласованы (например, тип Address2_ line2 должен совпадать с типом Address1_line2, а тип first_name — с типом spouse_name). Ответ C тоже верен, поскольку выбранные типы предполагают наличие супруга (spouse) у каждого члена группы, а также обязательное наличие второго адреса при возможном отсутствии первого. Таким образом, ответы F и G тоже оказываются верными. Ответы D и E неверны, поскольку NULL соответствует необязательным атрибутам, а NOT NULL — обязательным атрибутам.
converted to PDF by BoJIoc
Вопрос 19 Правильные ответы — A, B, C и E. Ответ A правилен, поскольку поле фамилии (last_name), скорее всего, должно быть обязательным. Ответ B правилен, поскольку в настоящий момент в таблице отсутствует ключ, а первичный ключ рекомендуется иметь в каждой таблице. Ответ C правилен, поскольку таблица не нормализована до уровня первой нормальной формы. Для этого следует выделить адресную информацию в отдельную таблицу. Ответ D неверен, поскольку VARCHAR занимает меньше памяти и быстрее работает. Вопрос 20 Правильный ответ — 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 неверны, поскольку в них указано неверное число страниц. Вопрос 21 Правильный ответ — 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 неверны, поскольку в них указано неверное число страниц. Вопрос 22 Правильные ответы — A, C и D. Ответ A правилен, поскольку повторяющиеся группы нарушают требования первой нормальной формы. Ответы C и D верны, поскольку указанные атрибуты не зависят от первичного ключа и, следовательно, нарушают требования третьей нормальной формы. Ответ B неверен — в SQL нет такой структуры данных, как массив. Ответ E неверен, поскольку для соответствия таблицы третьей нормальной форме необходимо выполнить действия, описанные в ответах A, C и D. Вопрос 23 Правильный ответ — D. Некластерный индекс по (last_name, first_ name) позволит использовать наложение индекса. Ответы A и C неверны, поскольку запрос не будет накладываться. Ответ B неверен, поскольку некластерный индекс по (first_name, last_name) не поможет с поиском last name. Ответ E неверен, поскольку индекс необходим. Ответ F неверен, поскольку правильный ответ присутствует в списке. Вопрос 24 Правильные ответы — A, B, C и D. Все они описывают стандартные функциональные возможности триггеров. Ответ E неверен, поскольку триггеры поддерживаются в SQL Server 7. Вопрос 25 Правильный ответ — E. В тексте вопроса не содержится никакой информации о том, является ли транзакция вложенной, первой или именованной, — мы не можем определить, на каком уровне вложенности она находится. Вопрос 26 Правильный ответ — B. Неопределенный откат всегда сбрасывает локальную переменную @@TRANCOUNT в 0. Вопрос 27 Правильный ответ — C. Если для параметров хранимой процедуры не определены значения по умолчанию, то попытка вызова без параметров не будет выполнена. Ответы A и B неверны, поскольку процедура работать не будет. Ответы D и E неверны, поскольку сервер не выводит сообщений или ошибок, относящихся к кодированию процедур. Вопрос 28 Правильные ответы — A и B. Ответ A правилен, поскольку команда имеет правильный синтаксис, она успешно выполняется и создает MyTable. Ответ B правилен, поскольку в osql сеанс по умолчанию настраивается на допустимость NULL при создании таблиц. Следовательно, все столбцы, включая столбец C, будут допускать NULL. По этой причине ответ C неверен. Ответ D тоже неверен, поскольку максимальная
converted to PDF by BoJIoc
длина столбца типа CHAR равна 8000 символам. Ответ E неверен, поскольку для таблицы не определено ограничение первичного ключа. Вопрос 29 Правильный ответ — B, поскольку таблица создается с вычисляемым столбцом. Его значение основано на данных, хранящихся в других столбцах, поэтому данные в нем не хранятся, а вычисляются в момент использования. По этой причине ответ A неверен. Ответ C неверен, поскольку столбцы price и markup, используемые для вычисления msrp, не допускают NULL, и потому вычисляемый столбец тоже никогда не будет равен NULL. Ответ D неверен, поскольку запись NUMERIC(5,2) означает пять цифр с двумя разрядами после десятичной запятой. Вопрос 30 Правильные ответы — A, B, C и D. Ответ A правильно описывает действие ссылочных ограничений при вставке в ссылающуюся таблицу. Ответы B и C правильны, поскольку суть ссылочного ограничения заключается в том, что таблицы и столбцы, на которые указывает ссылка, должны существовать при создании ограничения. Ответ D правилен, поскольку столбец, на который указывает ссылка, должен быть уникальным или первичным ключом. Ответ E неверен, поскольку таблица может иметь несколько ссылочных ограничений. Вопрос 31 Правильный ответ — B. SQL Server позволяет добавлять в таблицу столбцы NOT NULL при условии, что во все существующие записи может быть включено значение этого столбца по умолчанию. Ответ A неверен, поскольку столбцы, на которые имеется ссылка в ограничениях первичного ключа, уникальности, внешнего ключа или проверки, не удаляются. Ответ C неверен, поскольку столбцы счетчика могут включаться в таблицу после ее заполнения. Ответ D неверен, поскольку в списке имеется правильный ответ. Вопрос 32 Правильные ответы — A, C и D. Ответ A правилен, поскольку символ # является признаком временной таблицы. Ответ C правилен, поскольку временные таблицы доступны лишь для своих создателей. Ответ D верен, поскольку временная таблица автоматически удаляется при отключении пользователя. Ответ B неверен, поскольку временные таблицы доступны не для всех пользователей, а лишь для своих создателей. Ответ E неверен, поскольку временные таблицы хранятся в tempdb. Вопрос 33 Правильный ответ — A, поскольку полнотекстовые индексы хранятся в файловой системе. Ответ B неверен, поскольку таблица может иметь лишь один полнотекстовый индекс. Ответ C неверен, поскольку для работы с расширенными индексами используются хранимые процедуры1. Вопрос 34 Правильный ответ — B. Полнотекстовое индексирование в базах данных SQL Server включается хранимой процедурой sp_fulltext_database. Ответы A и C неверны, поскольку хранимые процедуры sp_full_text_ database и sp_fulltext_enable не существуют. Ответ D неверен, поскольку в списке присутствует правильный ответ. Вопрос 35 Правильный ответ — B. Команда определяет полнотекстовый запрос, который ищет в столбце Description фразу «Cajun Cooking». Ответы A и C неверны, поскольку в них упоминаются обычные запросы, а предикат CONTAINS используется только в полнотекстовых запросах. Ответ D неверен, поскольку слова «Cajun Cooking» заключены в кавычки, и их поиск осуществляется как поиск единой фразы. Вопрос 36 Правильный ответ — E, поскольку функция FORMSOF(INFLECTIONAL) разрешает SQL Server искать другие формы указанного слова. Ответ A неверен, поскольку в нем поиск ограничен только исходным словом без других форм. Ответы B и D неверны, поскольку в них упоминаются обычные, а не полнотекстовые запросы. Ответ C неверен, поскольку в нем утверждается, что столбец Description должен начинаться со слова «Spicy». Вопрос 37 Правильные ответы — A, B и C. Они правильно описывают аспекты выполнения полнотекстовых запросов с применением весовых коэффициентов. Ответ D неверен, поскольку в нем упоминается поиск целой фразы. Ответ E неверен, поскольку в списке присутствует правильный ответ.
converted to PDF by BoJIoc
Вопрос 38 Правильный ответ — D. Методы, описанные в ответах A, B и C, могут использоваться для уменьшения числа взаимных блокировок. Использование holdlock в хранимых процедурах легко может привести к появлению взаимных блокировок. Транзакции, сохраняющие одинаковый порядок обращения к одним таблицам, помогают избежать взаимных блокировок. Кроме того, взаимодействие с пользователем во время транзакции оставляет открытые монопольные или разделяемые блокировки на время, намного превышающее обычное. Это тоже может стать причиной взаимных блокировок. Вопрос 39 Правильный ответ — C. Из результата выполнения запроса видно, что индекс называется UPKCL_titleidind и является кластерным. С технической точки зрения, ответ A правилен, но ответ C является более точным и потому предпочтительным. Ответы B и E неверны, поскольку из них видно, что для выполнения запроса будет выбран кластерный индекс. Ответ D неверен, поскольку при выборе индекса сканирование таблицы не выполняется. Вопрос 40 Правильный ответ — D. Процедура sp_lock используется для идентификации блокировок, используемых на сервере. Ответы A и C неверны, поскольку sp_help выводит список или описание объектов баз данных, но не блокировок. Ответ B неверен, поскольку процедура sp_who может использоваться для идентификации процессов, заблокированных вследствие конкуренции запросов на блокировку, но не самих блокировок. Приложение А
База данных Pubs
Рис. А.1. Диаграмма базы данных Pubs Pubs SQL EXEC sp_addtype N'empid', N'char (9)', N'NOT NULL' GO EXEC sp_addtype N'id', N'varchar (11)', N'not null' GO
converted to PDF by BoJIoc
EXEC sp_addtype N'tid', N'varchar (6)', N'not null' GO CREATE TABLE [dbo].[stores] ( [stor_id] [char] (4) NOT NULL , [stor_name] [varchar] (40) NULL , [stor_address] [varchar] (40) NULL , [city] [varchar] (20) NULL , [state] [char] (2) NULL , [zip] [char] (5) NULL , CONSTRAINT [UPK_storeid] PRIMARY KEY CLUSTERED ([stor_id]) ON [PRIMARY] ) GO CREATE TABLE [dbo].[publishers] ( [pub_id] [char] (4) NOT NULL , [pub_name] [varchar] (40) NULL , [city] [varchar] (20) NULL , [state] [char] (2) NULL , [country] [varchar] (30) NULL CONSTRAINT [DF__publishers__country__0EA330E9] DEFAULT ('USA'), CONSTRAINT [UPKCL_pubind] PRIMARY KEY CLUSTERED ([pub_id]) ON [PRIMARY] , 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].[authors] ( [au_id] [id] NOT NULL , [au_lname] [varchar] (40) NOT NULL , [au_fname] [varchar] (20) NOT NULL , [phone] [char] (12) NOT NULL CONSTRAINT [DF__authors__phone__09DE7BCC] DEFAULT ('UNKNOWN'), [address] [varchar] (40) NULL , [city] [varchar] (20) NULL , [state] [char] (2) NULL , [zip] [char] (5) NULL , [contract] [bit] NOT NULL , CONSTRAINT [UPKCL_auidind] PRIMARY KEY CLUSTERED ([au_id]) ON [PRIMARY] , CHECK (([au_id] like '[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 INDEX [aunmind] ON [dbo].[authors]([au_lname], [au_fname]) ON [PRIMARY] GO CREATE TABLE [dbo].[titles] ( [title_id] [tid] NOT NULL , [title] [varchar] (80) NOT NULL , [type] [char] (12) NOT NULL CONSTRAINT [DF__title__type__117F9D94] DEFAULT ('UNDECIDED), [pub_id] [char] (4) NULL ,
converted to PDF by BoJIoc
[price] [money] NULL , [advance] [money] NULL , [royalty] [int] NULL , [ytd_sales] [int] NULL , [notes] [varchar] (200) NULL , [pubdate] [datetime] NOT NULL CONSTRAINT [DF__titles__pubdate__1367E606] DEFAULT (getdate()), CONSTRAINT [UPKCL_titleidind] PRIMARY KEY CLUSTERED ([title_id] ) ON [PRIMARY] , FOREIGN KEY ([pub_id]) REFERENCES [dbo].[publishers] ([pub_id]) ) GO CREATE INDEX [titleind] ON [dbo].[titles]([title]) ON [PRIMARY] GO CREATE TABLE [dbo].[discounts] ( [discounttype] [varchar] (40) NOT NULL , [stor_id] [char] (4) NULL , [lowqty] [smallint] NULL , [highqty] [smallint] NULL , [dicount] [decimal](4, 2) NOT NULL , FOREIGN KEY ([stor_id]) REFERENCES [dbo].[stores] ([stor_id]) ) ON [PRIMARY] GO CREATE TABLE [dbo].[jobs] ( [job_id] [smallint] IDENTITY (1, 1) NOT NULL , [job_desc] [varchar] (50) NOT NULL , CONSTRAINT [DF__jobs__job_desc__239E4DCF] DEFAULT ("New position – title not formalized yet"), [min_lvl] [tinyint] NOT NULL , [max_lvl] [tinyint] NOT NULL , PRIMARY KEY CLUSTERED ([job_id]) ON [PRIMARY] CHECK ([max_lvl] <= 250), CHECK ([min_lvl] >= 10) ) GO CREATE TABLE [dbo].[employee] ( [emp_id] [empid] NOT NULL , [fname] [varchar] (20) NOT NULL , [minit] [char] (1) NULL , [lname] [varchar] (30) NOT NULL , [job_id] [smallint] NOT NULL CONSTRAINT [DF__employee__job_id__2C3393D0] DEFAULT (1), [job_lvl] [tinyint] NOT NULL CONSTRAINT [DF__employee__job_lvl__2E1BDC42] DEFAULT (10), [pub_id] [char] (4) NOT NULL CONSTRAINT [DF__title__pub_id__2F10007B] DEFAULT ('9952'), [hire_date] [datetime] NOT NULL CONSTRAINT [DF__employee_hire_date__30F848ED] DEFAULT (getdate()), CONSTRAINT [PK_emp_id] PRIMARY KEY NONCLUSTERED
converted to PDF by BoJIoc
([emp_id]) ON [PRIMARY] , FOREIGN KEY ([job_id]) REFERENCES [dbo].[jobs] ([job_id]), FOREIGN KEY ([pub_id]) REFERENCES [dbo].[publishers] ([pub_id]), CONSTRAINT [CK_emp_id] CHECK (([emp_id] like '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]') or ([emp_id] like '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')) ) GO CREATE TABLE [dbo].[pub_info] ( [pub_id] [char] (4) NOT NULL , [logo] [image] NULL , [pr_info] [text] NULL , CONSTRAINT [UPKCL_pubinfo] PRIMARY KEY CLUSTERED ([pub_id]) ON [PRIMARY] , FOREIGN KEY ([pub_id]) REFERENCES [dbo].[publishers] ([pub_id]) ) GO CREATE TABLE [dbo].[roysched] ( [title_id] [tid] NOT NULL , [lorange] [int] NULL , [hirange] [int] NULL , [royalty] [int] NULL , FOREIGN KEY ([title_id]) REFERENCES [dbo].[titles] ([title_id]) ) ON [PRIMARY] GO CREATE INDEX [titleidind] ON [dbo].[roysched]([title_id]) ON [PRIMARY] GO CREATE TABLE [dbo].[sales] ( [stor_id] [char] NOT NULL , [ord_num] [varchar] (20) NOT NULL , [ord_date] [datetime] NOT NULL , [qty] [smallint] NOT NULL , [payterms] [varchar] (12) NOT NULL , [title_id] [tid] NOT NULL , CONSTRAINT [UPKCL_sales] PRIMARY KEY CLUSTERED ([stor_id],[ord_num],[title_id]) ON [PRIMARY] , FOREIGN KEY ([stor_id]) REFERENCES [dbo].[stores] ([stor_id]), FOREIGN KEY ([title_id]) REFERENCES [dbo].[titles] ([title_id]) ) GO CREATE INDEX [titleidind] ON [dbo].[sales]([title_id]) ON [PRIMARY] GO CREATE TABLE [dbo].[titleauthor] ( [au_id] [id] NOT NULL , [title_id] [tid] NOT NULL , [au_ord] [tinyint] NULL , [royaltyper] [int] NULL , CONSTRAINT [UPKCL_taind] PRIMARY KEY CLUSTERED
converted to PDF by BoJIoc
([au_id],[title_id]) ON [PRIMARY] , FOREIGN KEY ([au_id]) REFERENCES [dbo].[authors] ([au_id]), FOREIGN KEY ([title_id]) REFERENCES [dbo].[titles] ([title_id]) ) GO CREATE INDEX [auidind] ON [dbo].[titleauthor]([au_id]) ON [PRIMARY] GO CREATE INDEX [titleidind] ON [dbo].[titleauthor]([title_id]) ON [PRIMARY] GO CREATE VIEW titleview AS select title, au_ord, au_lname, price, ytd_sales, pub_id from authors, titles, titleauthor where authors.au_id = titleauthor.au_id AND titles.title_id = titleauthor.title_id GO CREATE PROCEDURE acur @auth_cur cursor varying output, @state char(2) = "CA", @ctype int = 1 AS if (@ctype = 1) set @auth_cur = cursor SCROLL for select au_lname from authors where state = @state else set @auth_cur = cursor SCROLL for select au_lname, au_fname from authors open @auth_cur return 1 CREATE PROCEDURE byroyalty @percentage int AS select au_id from titleauthor where titleauthor.royaltyper = @percentage GO CREATE PROCEDURE reptq1 AS select pub_id, title_id, price, pubdate from titles where price is NOT NULL order by pub_id COMPUTE avg(price) BY pub_id COMPUTE avg(price) GO CREATE PROCEDURE reptq2 AS select type, pub_id, titles.title_id, au_ord, Name = substring (au_lname, 1, 15), ytd_sales from titles, authors, titleauthor where titles.title_d = titleauthor.title_id AND authors.au_id = titleauthor.au_id AND pub_id is NOT NULL
converted to PDF by BoJIoc
order by pub_id, type COMPUTE avg(ytd_sales) BY pub_id, type COMPUTE avg(ytd_sales) BY pub_id GO CREATE PROCEDURE reptq3 @lolimit money, @hilimit money, @type char(12) AS select pub_id, type, title_id, price from titles where price>@lolimit AND prce <@hilimit AND type = @type OR type LIKE '%cook%' order by pub_id, type COMPUTE count(title_id) BY pub_id, type GO CREATE TRIGGER employee_insupd ON employee FOR insert, UPDATE AS --Get the range of level for this job from the jobs table declare @mi_lvl tinyint, @max_lvl tinyint, @emp_lvl tinyint, @job_id smallint select @min_lvl = min_lvl, @max_lvl = max_lvl, @emp_lvl = i.job_lvl, @job_id = i.job_id from employee e, jobs j, inserted i where e.emp_id = i.emp_id AND i.job_id = j.job_id IF (@job_id = 1) and (@emp_lvl <> 10) begin raiseerror ('Job id 1 expects the default level of 10.', 16.1) ROLLBACK TRANSACTION end ELSE IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl) begin raiseerror('The level for job_)id:%d should be between %d and %d.', 16, 1, @job_id, @min_lvl, @max_lvl) ROLLBACK TRANSACTION end GO Приложение Б
Функции Таблица Б.1. Компоненты даты Компонент
Сокращение Допустимые значения
Год (Year)
Yy
1753-9999
Квартал (Quarter)
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
Минута (Minute)
Mi
0-59
Секунда (Second)
Ss
0-59
Миллисекунда (Millisecond) Ms
0-999
Таблица Б.2. Полный список функций SQL Server 7 Функция
Описание
@@CONNECTIONS
Количество успешных подключений плюс количество неудачных попыток подключения с момента запуска SQL Server.
@@CPU_BUSY
Время работы процессора с момента запуска SQL Server в миллисекундах.
@@CURSOR_ROWS
Количество записей в последнем открытом курсоре.
@@DATEFIRST
Значение параметра SET DATEFIRST.
@@DBTS
Текущее значение TIMESTAMP для текущей базы.
@@ERROR
Номер ошибки для последней команды TSQL.
@@FETCH_STATUS
Статус выборки для последнего курсора.
@@IDENTITY
Последнее вставленное значение счетчика.
@@IDLE
Продолжительность периода пассивности SQL Server в миллисекундах.
@@IO_BUSY
Продолжительность выполнения операций ввода/вывода SQL Server в
converted to PDF by BoJIoc
миллисекундах. @@LANGID
Идентификатор текущего языка.
@@LANGUAGE
Название текущего языка.
@@LOCK_TIMEOUT
Тайм-аут, установленный для блокировок текущего соединения в миллисекундах.
@@MAX_CONNECTIONS
Максимальное количество одновременных подключений, разрешенное SQL Server.
@@MAX_PRECISION
Максимальная точность числовых типов.
@@NESTLEVEL
Уровень вложенности хранимой процедуры.
@@OPTIONS
Текущие значения параметров.
@@PACK_RECEIVED
Количество полученных входных сетевых пакетов.
@@PACK_SENT
Количество отправленных сетевых пакетов.
@@PACKET_ERRORS
Количество ошибок пакетов.
@@PROCID
Идентификатор объекта для текущей хранимой процедуры.
@@REMSERVER
имя удаленной базы данных SQL Server.
@@ROWCOUNT
Количество записей, участвовавших в выполнении последней команды.
@@SERVERNAME
Имя локального сервера.
@@SERVICENAME
Раздел реестра, ассоциированный с SQL Server.
converted to PDF by BoJIoc
@@SPID
Серверный идентификатор процесса для текущего подключения.
@@TEXTSIZE
Текущее значение TEXTSIZE.
@@TIMETICKS
Количество миллисекунд на один такт таймера.
@@TOTAL_ERRORS
Общее количество ошибок чтения/записи.
@@TOTAL_READ
Общее количество физических операций чтения с диска.
@@TOTAL_WRITE
Общее количество физических операций записи на диск.
@@TRANCOUNT
Количество активных транзакций.
@@VERSION
Дата, версия SQL Server и тип процессора.
ABS(числовое_выражение)
Модуль числа.
ACOS(вещественное_выражение)
Арккосинус (в радианах).
APP_NAME()
Имя приложения для клиентского процесса.
ASCII(символьное_выражение)
ASCII-код первого символа в строке.
ASIN(вещественное_выражение)
Арксинус (в радианах).
ATAN(вещественное_выражение)
Арктангенс (в радианах).
ATAN2(вещественное_выражение1, вещественное_выражение2)
Определяет арктангенс для тангенса, находящегося в промежутке между двумя выражениями с плавающей запятой.
CASE
Вычисление результата по списку выражений.
CAST
Преобразование типа данных.
converted to PDF by BoJIoc
CEILING
Наименьшее целое, большее либо равное заданной величине.
CHAR(целое_выражение)
Преобразование целого числа в ASCII-символ.
CHARINDEX(символьное_выражение,выражение, начало)
Начальная позиция подстроки в выражении (0, если подстрока не найдена).
COALESCE(выражение1, выражение2)
Первое выражение, отличное от NULL.
COL_LENGTH(имя_объекта, имя_столбца)
Ширина столбца.
COL_NAME(идентификатор_объекта,идентификатор_столбца)
Имя столбца для заданного объекта.
COLUMNPROPERTY(идентификатор, столбец, свойство)
Информация о свойстве столбца или параметре процедуры.
CONVERT(тип_данных,выражение[,стиль])
Преобразование типа данных
COS(вещественное_выражение)
Косинус угла.
COT(вещественное_выражение)
Котангенс угла.
CURRENT_TIMESTAMP
Эквивалент GETDATA().
CURRENT_USER
Эквивалент USER_NAME().
DATABASEPROPERTY(база, свойство)
Информация о свойстве базы данных.
DATALENGTH(символьное_выражение)
Целое число символов в выражении, не считая завершающих пробелов.
DATEADD(компонент,число,выражение_дата)
Дата, полученная прибавлением указанного числа компонентов к заданной дате.
DATEDIFF(компонент,выражение_дата1, выражение_дата2)
Разность дат, выраженная в заданных компонентах.
DATENAME(компонент,выражение_дата)
Компонент даты, выраженный в виде строки. По возможности преобразуется в имя (например,
converted to PDF by BoJIoc
June). DATEPART(компонент,выражение_дата)
Заданный компонент даты в виде целого числа.
DAY(дата)
Целое число, определяющее день месяца.
DB_ID([идентификатор_базы])
Идентификатор базы данных.
DB_NAME([идентификатор_базы])
Имя базы данных.
DEGREES(числовое_выражение)
Преобразование радианов в градусы.
DIFFERENCE(символьное_выражение1, символьное_выражение2)
Разность между значениями SOUNDEX двух выражений.
EXP(вещественное_выражение)
Экспонента заданного числа.
FILE_ID(имя_файла)
Идентификатор логического файла базы данных.
FILE_NAME(идентификатор_файла)
Имя файла, соответствующее заданному идентификатору.
FILEGROUP_ID(имя_группы)
Идентификатор, соответствующий имени группы.
FILEGROUP_NAME(идентификатор_группы)
Имя идентификатора.
FILEGROUPPROPERTY(имя_группы, свойство)
Значение свойства для заданной группы и имени свойства.
FILEPROPERTY(имя_файла,свойство)
Значение свойства по именам файла и свойства.
FLOOR(числовое_выражение)
Наибольшее целое, меньшее либо равное заданной величине.
FORMATMESSAGE(номер_сообщения,значение_параметра[,...n])
Форматирование сообщения.
FULLTEXTCATALOGPROPERTY(каталог,свойство)
Получение данных о полнотекстовомом каталоге.
FULLTEXTSERVICEPROPERTY(свойство)
Получение данных о возможности полнотекстового поиска.
converted to PDF by BoJIoc
GETANSINULL([база_данных])
Получение данных о разрешении NULL для базы данных по умолчанию.
GETDATE()
Текущая системная дата и время.
HOST_ID()
Текущий идентификатор клиентского процесса на узле.
HOST_NAME()
Текущее имя узла для клиентского процесса.
IDENT_INCR({имя_таблицы|имя_представления})
Величина приращения столбца счетчика.
IDENT_SEED({имя_таблицы|имя_представления})
Начальное значение столбца счетчика.
IDENT_COL(имя_объекта,идентификатор_индекса,номер_ключа)
Имя индексированного столбца.
INDEXPROPERTY(идентификатор_таблицы,индекс,свойство)
Получение сведений об индексе.
IS_MEMBER({группа|роль})
1, если текущий пользователь является членом группы NT или роли SQL Server, 0 - если не является, и NULL, если группа/роль не определена.
IS_SRVROLEMEMBER(роль[,имя])
1, если имя пользователя входит в роль SQL Server.
ISDATE(выражение)
1, если выражение определяет допустимую дату.
ISNULL(выражение,константа)
заменяет значения NULL заданной константой.
ISNUMERIC(выражение)
1, если выражение является числовым.
LEFT(символьное_выражение,целое_выражение)
Заданное число символов от начала строки.
LEN(символьное_выражение)
Длина строки в символах без учета завершающих пробелов.
converted to PDF by BoJIoc
LOG(вещественное_выражение)
Натуральный логарифм.
LOG10(вещественное_выражение)
Десятичный логарифм.
LOWER(символьное_выражение)
Преобразование строки в нижний регистр.
LTRIM(символьное_выражение)
Удаление начальных пробелов.
MONTH(дата)
Целый номер месяца.
NCHAR(целое_выражение)
Преобразование целого числа в символы Unicode.
NEWID()
Создание нового уникального значения для типа данных UNIQUEIDENTIFIER.
NULLIF(выражение1,выражение2)
NULL, если выражения равны.
OBJECT_ID(имя_объекта)
Идентификатор объекта базы данных.
OBJECT_NAME(идентификатор_объекта)
Имя объекта базы данных.
OBJECTPROPERTY(идентификатор,свойство)
Получение сведений об объектах.
PARSE_NAME(имя_объекта,часть_объекта)
Выделение заданной части полного имени объекта: 1 - имя объекта, 2 - имя владельца, 3 - имя базы данных, 4 имя сервера.
PATINDEX(%шаблон%,выражение)
Начальная позиция заданного шаблона в строке.
PERMISSIONS([идентификатор_объекта],столбец])
Маска, определяющая разрешения для пользователя объекта.
PI()
Константа 3,1415926…
POWER(основание,степень)
Возведение в степень.
QUOTENAME(символьное_выражение[символ_ограничитель])
Преобразование строки в идентификатор.
converted to PDF by BoJIoc
Ограничителем могут быть апострофы, кавычки или пара квадратных скобок. RADIANS()
Преобразование градусов в радианы.
RAND([целое_выражение])
Получение случайного вещественного числа в интервале от 0 до 1 (необязательное целое выражение используется для раскрутки генератора случайных чисел.).
Замена всех экземпляров строки REPLACE(символьное_выражение1,символьное_выражение2,символьное_выражение3) 2 в строке 1 на строку 3. REPLICATE(символьное_выражение,целое_выражение)
Повторение строки заданное число раз.
REVERSE(символьное_выражение)
Обратная перестановка строки.
RIGHT(символьное_выражение,целое_выражение)
Заданное число символов в конце строки.
ROUND(числовое_выражение,целое_выражение[,функция])
Округление числового выражения до позиции, задаваемой целым выражением. Если третий аргумент отличен от 0, ROUND не округляет, а отбрасывает цифры.
RTRIM(символьное_выражение)
Удаление завершающих пробелов.
SIGN(целое_выражение)
+1 для положительных чисел, -1 для отрицательных и 0 для нуля.
SIN(вещественное_выражение)
Синус угла.
SOUNDEX(символьное_выражение)
Четырехсимвольная величина,
converted to PDF by BoJIoc
используемая при сравнении строк. SPACE(целое_выражение)
Построение строки из заданного количества пробелов.
SQRT(вещественное_выражение)
Извлечение квадратного корня.
SQUARE(вещественное_выражение)
Возведение в квадрат.
STATS_DATE(идентификатор_таблицы,идентификатор_индекса)
Время последнего обновления статистики для заданного индекса.
STR(вещественное_выражение[,длина[,точность]])
Преобразование числа в строку.
STUFF(символьное_выражение1,начало,длина,символьное_выражение2)
n символов строки 1, начиная с заданной начальной позиции, заменяются строкой 2.
SUBSTRING(выражение,начало,длина)
Получение подстроки.
SUSER_ID([имя_пользователя])
Идентификатор пользователя SQL Server.
SUSER_NAME([идентификатор_пользователя])
Имя пользователя SQL Server.
SUSER_SID([имя_пользователя])
Идентификатор пользователя SQL Server.
SUSER_SNAME([идентификатор_пользователя])
Имя пользователя SQL Server.
SYSTEM_USER
Имя текущего пользователя SQL Server.
TAN(вещественное_выражение)
Тангенс угла.
TSEQUAL(маркер1,маркер2)
Сравнение двух маркеров TIMESTAMP. Если значения не совпадают, выдается сообщение об ошибке.
TYPEPROPERTY(тип,свойство)
Получение сведений о типе данных.
UNICODE(выражение_nchar)
Код Unicode первого символа строки.
converted to PDF by BoJIoc
UPPER(символьное_выражение)
Преобразование строки в верхний регистр.
USER()
Имя текущего пользователя.
USER_ID([имя_в_базе])
Идентификатор пользователя в базе данных.
USER_NAME([идентификатор_пользователя]) или SESSION_USER
Имя пользователя в базе данных.
USERID([пользователь])
Идентификатор пользователя.
VALID_NAME(символьное_выражение)
0, если строка не является допустимым идентификатором.
YEAR(выражение_дата)
Год в виде четырех цифр.
Таблица Б.3. Стили преобразования даты Без указания века С указанием века Формат преобразованной строки -
0 или 100
mon dd yyyy hh:miAM(или PM)
1
101
mm/dd/yy
2
102
yy.mm.dd
3
103
dd/mm/yy
4
104
dd.mm.yy
5
105
dd-mm-yy
6
106
dd mon yy
7
107
mon dd,yy
8
108
hh:mm:ss
-
9 или 109
mon dd,yyyy hh:mi:ss:mmmAM (или PM)
10
110
mm-dd-yy
11
111
yy/mm/dd
12
112
Yymmdd
13
113
dd mon yyyy hh:mi:ss:mmm (24-часовая шкала)
14
114
hh:mi:ss:mmm (24-часовая шкала)
20
120
Yyyy-mm-dd hh:mi:ss (24-часовая шкала)
21
121
yyyy-mm-dd hh:mi:ss:mmm (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|distinct] выражение)
Вычисляет общее количество (разных) значений в числовом столбце.
avg([all|distinct] выражение)
Вычисляет среднее арифметическое (разных) значений в числовом столбце.
count([all|distinct] выражение)
Вычисляет количество (разных) значений в числовом столбце, отличных от NULL.
count(*)
Вычисляет количество выбранных записей. Единственная агрегатная функция, учитывающая значения NULL.
max(выражение)
Определяет максимум среди выбранных значений.
min(выражение)
Определяет минимум среди выбранных значений.
STDEV(выражение)
Вычисляет среднее квадратическое отклонение.
STDEVP(выражение)
Вычисляет среднее квадратическое отклонение для выборки.
VAR(выражение)
Вычисляет статистическую дисперсию.
VARP(выражение)
Вычисляет статистическую дисперсию для выборки.
Таблица Б.7. Функции, используемые в полнотекстовых и удаленных запросах Функция
Описание
CONTAINSTABLE(таблица,{столбец|*},<условие_поиска>)
Неформальный поиск в полнотекстовых запросах.
FREETEXTTABLE(таблица,{столбец|*},"искомая строка")
Поиск смысловых значений, а не конкретных слов в полнотекстовых запросах.
OPENQUERY(связанный_сервер,"запрос")
Выполнение запроса для другого источника данных.
Выполнение разового OPENROWSET('имя_провайдера' {'источник';'имя_пользователя';'пароль' незапланированного запроса для | 'строка_провайдера'}, {[каталог.][схема.]объект | 'запрос'}) удаленного источника данных.
Приложение C
Синтаксис Transact-SQL Условные обозначения Таблица B.1. Условные обозначения Обозначение Смысл КОМАНДА
Имена команд, параметров и другие ключевые слова.
Переменная Значения, указываемые вами. {}
Необходимо выбрать хотя бы один из перечисленных вариантов.
converted to PDF by BoJIoc
[]
Значение/ключевое слово является необязательным.
()
Круглые скобки являются частью команды.
|
Вы можете выбрать лишь один из перечисленных вариантов (по аналогии с логическим оператором "или").
,
Вы можете выбрать любое число перечисленных вариантов, разделяя их запятыми.
...
Повторение предыдущего варианта.
Выражение
Любое выражение, возвращающее одно значение, может принадлежать к одному из следующих типов: символьное_выражениевыражение_ константавещественное_выражениецелое_ выражениечисловое_выражениедвоичное_выражение
BCP Листинг В.1. Полный синтаксис BCP bcp [[имя_базы.][владелец].]имя_таблицы {in | out | format} файл_данных [-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.
KILOBATCH_PER_BATCH = cc
Количество килобайт данных в пакете.
TABLOCK
На время операции пакетного копирования устанавливается блокировка на уровне таблицы.
CHECK_CONSTRAINTS
В процессе загрузки данных SQL Server проверяет ограничения таблиц.
BULK INSERT Листинг В.2. Полный синтаксис BULK INSERT BULK INSERT [['имя_базы'.]['владелец'].] {'имя_таблицы' FROM файл_данных} [WITH ( [ BATCHSIZE = размер_пакета] [[,] CHECK_CONSTRAINTS] [[,] CODEPAGE = ACP | OEM |RAW | кодировка] [[,] DATAFILETYPE = {'char' | 'native' | 'widechar' | 'widenative'}] [[,] FIELDTERMINATOR = 'разделитель_полей'] [[,] FIRSTROW = первая_запись] [[,] FORMATFILE = 'полное_имя_файла_форматирования'] [[,] KEEPIDENTITY] [[,] KEEPNULLS] [[,] LASTROW = последняя_запись]
converted to PDF by BoJIoc
[[,] [[,] [[,] [[,] ) ]
MAXERRORS = максимум_ошибок] ORDER ({столбец [ASC | DESC]} [,...n])] ROWTERMINATOR = 'разделитель_записей'] TABLOCK]
Операторы сравнения Таблица В.3. Операторы сравнения Оператор Значение =
Равно
<>
Не равно
!=
Не равно
>
Больше
>=
Больше или равно
!>
Не больше
<
Меньше
<=
Меньше или равно
!<
Не меньше
Команда SELECT Листинг В.3. Полный синтаксис команды SELECT SELECT [ ALL | DISTINCT ] [ TOP n [PERCENT] [WITH TIES] список_ выборки [ INTO имя_таблицы ] [FROM {имя_таблицы | имя_представления} [ , {имя_таблицы | имя_представления} ... ] [ WHERE условия_поиска ] [ GROUP BY выражение_без_агрегатов [ , выражение_без_агрегатов ... ] [WITH CUBE|ROLLUP] ] [ HAVING условия_поиска ] [ ORDER BY { имя_столбца | список_выборки } [ ASC | DESC ] [ , { имя_столбца | список_выборки } [ ASC | DESC ] ... ] ] [ COMPUTE агрегат(имя_столбца) [ , агрегат(имя_столбца) ] ... [ BY имя_столбца [ , имя_столбца ] ... ] ] ] Секция FROM Листинг В.4. Полный синтаксис секции FROM FROM { <таблица_или_представление>| (команда_выборки) [AS] псевдоним_таблицы (псевдоним_столбца , ...] | <таблица_или_представление>| CROSS JOIN <таблица_или_представление> { { INNER | { FULL | LEFT | RIGHT } [OUTER] JOIN } <таблица_или_представление> ON <условие_соединения> }[, ...n] Секция WHERE
converted to PDF by BoJIoc
Листинг В.5. Полный синтаксис секции WHERE WHERE [ NOT ] <предикат> [ { AND | OR } [ NOT] <предикат> ] } [, ...n] <предикат> ::= { выражение { = | <> | != | > | >= | !> | < | <= | !< } выражение | строковое+выражение [NOT] LIKE строковое_выражение[ESCAPE 'метасимвол'] | выражение [NOT] BETWEEN выражение AND выражение | выражение IS [NOT] NULL | выражение [NOT] IN (подзапрос | выражение [,...n]) | выражение { = | <> | != | > | >= | !> | < | <= | !< } {ALL | SOME | ANY } (подзапрос) | EXISTS (подзапрос) } CASE Листинг В.6. Полный синтаксис команды CASE CASE выражение WHEN выражение THEN выражение [...] [ELSE выражение] END Листинг В.7. Полный синтаксис команды CASE с поиском CASE WHEN столбец = выражение THEN выражение [...] [ELSE выражение] END Курсоры Листинг В.8. Объявление курсора DECLARE имя_курсора [INSENSITIVE] {SCROLL] CURSOR FOR команда_select [FOR READ ONLY | UPDATE [OF список_столбцов] } ] Листинг В.9. Открытие объявленного курсора OPEN имя_курсора Листинг В.10. Выборка записей с помощью курсора FETCH [[NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | RELATIVE n] FROM] имя_курсора [INTO @имя_переменной,...] Листинг В.11. Закрытие открытого курсора CLOSE имя_курсора Листинг В.12. Удаление структур данных курсора DEALLOCATE имя_курсора Обработка данных Листинг В.13. Включение записей в таблицу
converted to PDF by BoJIoc
INSERT [INTO] имя_таблицы [(список_столбцов)] {VALUES ({DEFAULT | выражение_константа }[,...n]) | команда_select} Листинг В.14. Модификация записей в таблице UPDATE {<таблица_или_представление>} SET {имя_столбца = {выражение | DEFAULT} | @переменная = выражение } [,...n] [FROM секция_from] [WHERE <условия_поиска> | CURRENT OF { { [GLOBAL] имя_курсора } | имя_переменной_курсора} } ] Листинг В.15. Удаление записей из таблицы DELETE [FROM] имя_таблицы [FROM {имя_таблицы | имя_представления} [,...]] [WHERE критерии_поиска] Листинг В.16. Быстрое удаление всех записей из таблицы TRUNCATE TABLE имя_таблицы Определение таблиц Листинг В.17. Полный синтаксис создания таблицы CREATE TABLE имя_таблицы ( { имя_столбца тип_данных [ NULL | NOT NULL ] [ IDENTITY [(начало, приращение ) [ NOT FOR REPLICATION] ] ] [ ROWGUIDCOL ] [CONSTRAINT имя_ограничения] { { PRIMARY KEY | UNIQUE } [CLUSTERED | NONCLUSTERED] [WITH [FILLFACTOR = коэффициент_заполнения] [ON {файловая_группа | DEFAULT} ] | [FOREIGN KEY] REFERENCES ссылка_таблица [ ( ссылка_столбец ) ] [NOT FOR REPLICATION] | DEFAULT выражение_константа | CHECK [NOT FOR REPLICATION] (логическое_выражение) }] [ ...n] | имя_столбца AS вычисляемое_выражение | <ограничение_таблицы> } [, ...n] ) [ON {файловая_группа | DEFAULT} ] [TEXTIMAGE_ON {файловая_группа | DEFAULT} ] <определение_столбца> ::= { имя_столбца тип_данных } [ NULL | NOT NULL ] [IDENTITY [(начало, приращение ) [NOT FOR REPLICATION] ] ] [ ROWGUIDCOL ] [ <ограничение_столбца> ::= [CONSTRAINT имя_ограничения] { { PRIMARY KEY | UNIQUE } [CLUSTERED | NONCLUSTERED]
converted to PDF by BoJIoc
[WITH [FILLFACTOR = коэффициент_заполнения] ] [ON {файловая_группа | DEFAULT} ] | [FOREIGN_KEY] REFERENCES ссылка_таблица [ ( ссылка_столбец ) ] [NOT FOR REPLICATION] | DEFAULT выражение_константа | CHECK [NOT FOR REPLICATION] (логическое_выражение) } ] [ ...n] Листинг В.18. Полный синтаксис модификации таблицы ALTER TABLE имя_таблицы { [WITH CHECK | WITH NOCHECK] { [ALTER COLUMN имя_столбца { [ новый_тип_данных [ (точность[, scale] ) ] [ NULL | NOT NULL ] ] | [ {ADD | DROP} ROWGUIDCOL ] } ] | ADD { [{ имя_столбца тип_данных } [ NULL | NOT NULL ] [ IDENTITY [(начало[, приращение] ) [NOT FOR REPLICATION] ] ] [ ROWGUIDCOL ] ] | имя_столбца AS вычисляемое_выражение | [[CONSTRAINT имя_ограничения] { [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED] { ( столбец[,...n] ) } [ WITH [FILLFACTOR = коэффициент_заполнения] ] [ON (файловая_группа | DEFAULT} ]] | FOREIGN KEY [(столбец[,...n])] REFERENCES ссылка_таблица [(ссылка_столбец[,...n])] [NOT FOR REPLICATION] | DEFAULT выражение_константа [FOR столбец] | CHECK [NOT FOR REPLICATION] (логическое_выражение) }] }[,...n] | DROP { [CONSTRAIN] ограничение | COLUMN столбец }[,...n] | {CHECK | NOCHECK} CONSTRAINT {ALL | ограничение[,...n]} } } Индексы Листинг В.19. Создание индекса CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX имя_индекса
converted to PDF by BoJIoc
ON [[имя_базы,]владелец.] имя_таблицы (столбец [,...]) [WITH [FILLFACTOR = x] [[,] IGNORE_DUP_KEY] [[,] {SORTED_DATA | SORTED_DATA_REORG}] [[,] {IGNORE_DUP_ROW | ALLOW_DUP_ROW}]] [ON имя_сегмента] Листинг В.20. Удаление индекса DROP INDEX [владелец.]имя_таблицы.имя_индекса [,[владелец.]имя_таблицы.имя_индекса...] Правила и значения по умолчанию Листинг В.21. Создание правил CREATE RULE имя_правила @переменная оператор выражение [{AND|OR} ...] Листинг В.22. Удаление правил DROP RULE [владелец.]имя_правила[, [владелец.]имя_правила...] Листинг В.23. Связывание правил со столбцами sp_bindrule имя_правила, 'таблица.имя_столбца' Листинг В.24. Отсоединение правил от столбцов sp_unbindrule 'таблица.имя_столбца' Листинг В.25. Создание значений по умолчанию CREATE DEFAULT [владелец]имя_значения AS выражение_константа Листинг В.26. Удаление значений по умолчанию DROP DEFAULT [владелец.]имя_значения[, [владелец.]имя_значения...] Листинг В.27. Связывание значений по умолчанию со столбцами sp_bindefault имя_значения, 'таблица.имя_столбца' Листинг В.28. Отсоединение значений по умолчанию от столбцов sp_bindefault 'таблица.имя_столбца' Базы данных: создание, модификация, удаление Листинг В.29. Создание базы данных CREATE DATABASE имя_базы [ ON [PRIMARY] ([ NAME = логическое_имя_файла, ] FILENAME = 'имя_файла_ОС' [, SIZE = размер] [, MAXSIZE = { максимальный_размер | UNLIMITED } ]
converted to PDF by BoJIoc
[, FILEGROWTH = приращение] ) | {FILEGROUP имя_файловой_группы FILEDEFINITIONS} [,...n] ] [LOG ON {[ NAME = логическое_имя_файла, ] [FILENAME = 'имя_файла_ОС' [, SIZE = размер] [, MAXSIZE = { максимальный_размер | UNLIMITED } ] [, FILEGROWTH = приращение] } [,...n] [FOR LOAD | FOR ATTACH] Листинг В.30. Модификация базы данных ALTER DATABASE база_данных { ADD FILE <спецификация> [,...n] [TO FILEGROUP имя_группы] | ADD LOG FILE <спецификация> [,...n] | REMOVE FILE логическое_имя_файла | ADD FILEGROUP имя_группы | REMOVE FILEGROUP имя_группы | MODIFY FILE <спецификация> | MODIFY FILEGROUP имя_группы свойство_группы } <спецификация> ::= (NAME = 'логическое_имя_файла' [, FILENAME = 'имя_файла_ОС' ] [, SIZE = размер] [, MAXSIZE = { максимальный_размер | UNLIMITED } ] [, FILEGROWTH = приращение] ) Листинг В.31. Загрузка базы данных LOAD DATABASE {имя_базы | @переменная} FROM устройство[, ...] [WITH OPTIONS [[,] STATS [ = процент]]] Листинг В.32. Загрузка транзакций LOAD TRANSACTION {имя_базы | @переменная} FROM устройство[, ...] [WITH OPTIONS] Листинг В.33. Выгрузка базы данных DUMP DATABASE {имя_базы | @переменная} TO устройство[, ...]] [WITH OPTIONS [[,] STATS [ = процент]]] Листинг В.34. Полный синтаксис сжатия базы данных DBCC SHRINKDATABASE ( имя_базы [, процент] [, {NOTRUNCATE | TRUNCATEONLY}] ) Листинг В.35. Выгрузка журнала транзакций DUMP TRANSACTION {имя_базы | @переменная} [TO устройство[, ...]] [WITH {TRUNCATE_ONLY | NO_LOG |
converted to PDF by BoJIoc
NO_TRUNCATE} {OPTIONS}] Листинг В.36. Переименование баз данных sp_renamedb "старое_имя","новое_имя" Листинг В.37. Полный синтаксис сжатия файлов DBCC SHRINKFILE { {имя_файла | идентификатор_файла } { [ , размер] | [, {EMPTYFILE | NOTRUNCATE | TRUNCATEONLY}] } ) Листинг В.38. Инициализация диска DISK INIT NAME = 'логическое_имя' PHYSNAME = 'физическое_имя' VDEVNO = виртуальный_номер_устройства, SIZE = количество_2-килобайтных_блоков, [, VSTART = виртуальный_адрес] Вывод сообщений Листинг В.39. Синтаксис команды PRINT PRINT "ASCII_текст" | @локальная_переменная | @@глобальная_переменная Листинг В.40. Синтаксис команды RAISERROR RAISERROR ({код_ошибки | символьная_строка}, код_важности, состояние [, список_аргументов]) [WITH LOG] Полнотекстовый поиск Листинг В.41. Создание полнотекстового каталога sp_fulltext_catalog 'имя_полнотекстового_каталога' ['create'|'drop' |'start_incremental'|'start_full' |'stop'|'rebuild'] [, 'каталог_на_диске'] Листинг В.42. Регистрация таблиц для полнотекстового поиска sp_fulltext_table ['имя_таблицы'] ['create'|'drop' | 'activate' | 'deactivate'] ['имя_каталога', 'имя_индекса'] Листинг В.43. Регистрация столбцов для полнотекстового поиска sp_fulltext_column 'имя_таблицы', 'имя_столбца', {'ADD'|'DROP'} Листинг В.44. Регистрация столбцов для полнотекстового поиска
converted to PDF by BoJIoc
sp_fulltext_table 'имя_таблицы', 'activate' Листинг В.45. Полный синтаксис удаленного вызова процедур (RPC) [EXEC[UTE]] имя_сервера.[имя_базы].[владелец].[хранимая_процедура] [параметры[, параметр ...]] Безопасность Листинг В.46. Полный синтаксис добавления учетной записи для входа sp_addlogin имя, пароль [, база_по_умолчанию [, язык_по_умолчанию [, полное_имя ] ] ]] Листинг В.47. Удаление учетной записи для входа sp_droplogin имя Листинг В.48. Добавление пользователя базы данных sp_adduser имя [, имя_в_базе [, группа]] Листинг В.49. Удаление пользователя sp_dropuser имя Листинг В.50. Предоставление и отмена разрешений для объектов GRANT { ALL | список_разрешений} ON [имя_таблицы [(список_столбцов)] | имя_представления [(список_столбцов)]| имя_хранимой_процедуры | расширенное_имя_хранимой_процедуры} TO {PUBLIC | список_имен} REVOKE { ALL | список_разрешений} ON [имя_таблицы [(список_столбцов)] | имя_представления [(список_столбцов)]| имя_хранимой_процедуры | расширенное_имя_хранимой_процедуры} FROM {PUBLIC | список_имен} DENY { ALL | список_разрешений} ON [имя_таблицы [(список_столбцов)] | имя_представления [(список_столбцов)]| имя_хранимой_процедуры | расширенное_имя_хранимой_процедуры} FROM {PUBLIC | список_имен} Листинг В.51. Предоставление и отмена разрешений для команд GRANT { ALL | список_команд} TO {PUBLIC | список_имен} REVOKE { ALL | список_команд} FROM {PUBLIC | список_имен} DENY { ALL | список_команд} FROM {PUBLIC | список_имен} Листинг В.52. Вывод информации о пользователях базы данных sp_helpuser [имя_пользователя]
converted to PDF by BoJIoc
Листинг В.53. Вывод информации о защите объектов и пользователей sp_helprotect {имя_объекта | имя_пользователя} Листинг В.54. Создание динамических псевдонимов владельцем для других пользователей базы данных setuser ["имя_пользователя" [WITH NORESET]] Команды SET Таблица В.4. Команды SET Команда
Описание
SET DATEFIRST число
Определяет первый день недели.
SET DATEFORMAT {формат|@переменная}
Определяет формат даты в символьных строках, используемых SQL Server.
SET DEADLOCK_PRIORITY {LOW|NORMAL|@переменная}
Управляет обработкой взаимных блокировок в SQL Server.
SET LOCK_TIMEOUT миллисекунды
Изменяет значение по умолчанию и вызывает таймаут при блокировании ресурсов.
SET CONCAT_NULL_YIELDS_NULL {ON|OFF}
При установке TRUE результатом конкатенации строки с NULL является NULL, в противном случае - строка.
SET CURSOR_CLOSE_ON_COMMIT
Определяет поведение курсора при выполнении команды COMMIT.
SET IDENTITY_INSERT
Разрешает вставку значений в столбцы счетчика.
SET FIPS_FLAGGER{ENTRY|INTERMEDIATE|FULL|OFF}
Разрешает проверку SQL на соответствие стандарту ANSI SQL-92.
SET LANGUAGE {язык|переменная}
Разрешает выбрать для сеанса другой язык.
SET OFFSETS
Используется в сочетании с приложениями DBLibrary для поиска ключевых слов SQL.
SET PROCID
Используется в сочетании с приложениями DBLibrary для возвращения из хранимых процедур в вызывающие приложения DBLibrary.
SET QUOTED_IDENTIFIER{ON|OFF}
Форсирует применение стандарта ANSI SQL-92 в SQL Server.
SET ARITHABORT {ON|OFF}
Определяет действия SQL Server при математическом переполнении или делении на ноль.
SET ARITHIGNORE {ON|OFF}
Определяет сообщение об ошибке, генерируемое SQL Server при математическом переполнении или делении на ноль в командах выборки.
SET FMTONLY{ON|OFF}
Разрешает настроить SQL Server так, чтобы клиенту возвращались только данные столбцов.
SET NOCOUNT {ON|OFF}
Запрещает SQL Server передавать клиенту информацию о количестве выбираемых записей после каждой команды.
SET NOEXEC {ON|OFF}
Запрещает выполнение команд SQL.
SET NUMERIC_ROUNDABORT {ON|OFF}
Определяет действия SQL Server при потере точности вследствие математического округления.
converted to PDF by BoJIoc
SET PARSEONLY {ON|OFF}
Переводит SQL Server в режим проверки команд SQL.
SET QUERY_GOVERNOR_COST_LIMIT целое
Ограничивает выполнение запросов на основании предполагаемого объема работы по оценке SQL Server.
SET ROWCOUNT целое
Ограничивает количество записей, участвующих в выполнении команд SQL.
SET TEXTSIZE {целое|@целая_переменная}
Определяет количество байт, возвращаемых командой выборки.
SET ANSI_DEFAULTS {ON|OFF}
Управляет соблюдением стандарта ANSI SQL.
SET ANSI_NULLS {ON|OFF}
Определяет поведение SQL Server при проверке NULL в столбцах.
SET ANSI_PADDING {ON|OFF}
Определяет формат хранения столбцов типов VARCHAR, BINARY и VARBINARY, которые завершаются пробелами или имеют длину меньше максимальной ширины столбца.
SET ANSI_WARNINGS {ON|OFF}
Определяет поведение стандарта ANSI для ошибок.
SET FORCEPLAN {ON|OFF}
Определяет оптимальный порядок объединения.
SET SHOWPLAN_ALL {ON|OFF}
Сбор данных о выполнении каждой команды SQL.
SET SHOWPLAN_TEXT {ON|OFF}
Сбор данных о выполнении каждой команды SQL.
SET STATISTICS IO {ON|OFF}
SQL Server возвращает данные о дисковых операциях, выполняемых командами SQL.
SET STATISTICS TIME {ON|OFF}
SQL Server возвращает данные о количестве миллисекунд, затрачиваемых на анализ, компиляцию и выполнение каждой команды SQL.
SET IMPLICIT_TRANSACTIONS {ON|OFF}
Управляет неявным инициированием транзакций в SQL Server.
SET REMOTE_PROC_TRANSACTIONS {ON|OFF}
Влияет на поведение SQL Server при удаленном вызове процедур.
SET XACT_ABORT{ON|OFF}
Управляет поведением SQL Server при возникновении любых ошибок времени выполнения.
SET NO EXEC ON
Предотвращает выполнение любых команд, кроме SET NO EXEC.
SET TRANSACTION ISOLATION LEVEL {READ COMMITED|READ UNCOMMITED|REPEATABLE READ|SERIALIZABLE}
Управляет поведением SQL Server при установке блокировок.
Хранимые процедуры Листинг В.55. Создание хранимой процедуры CREATE PROCEDURE [владелец.]имя_процедуры [;номер] [параметр1 [, параметр2]...[параметр255])] [{FOR REPLICATION} | {WITH RECOMPILE} [{[WITH] | [,] ENCRYPTION]] AS команды SQL Листинг В.56. Выполнение хранимой процедуры
converted to PDF by BoJIoc
[[EXECUTE] {[@код_возврата = ] {[[[сервер.],база.]владелец.]имя_процедуры[;номер] @переменная} [[@имя_параметра = ] {значение | @переменная OUTPUT [,[...]]] [WITH RECOMPILE] Листинг В.57. Вывод информации по объекту sp_help {имя_типа | имя_процедуры | имя_таблицы | имя_представления | имя_правила | имя_значения_по_умолчанию} Листинг В.58. Вывод индексов, определенных для таблицы sp_helpindex имя_таблицы Листинг В.59. Вывод текста объекта sp_helptext {имя_правила | имя_значения_по_умолчанию | имя_представления | имя_процедуры | имя_триггера } Листинг В.60. Переименование объекта sp_rename {старое_имя | 'имя_таблицы.старое_имя_столбца'}, новое_имя Листинг В.61. Вывод сведений об ограничениях sp_helpconstraint имя_таблицы [, детализация] Листинг В.62. Вывод сведений о зависимых объектах sp_depends {имя_триггера | имя_процедуры } Листинг В.63. Вывод сведений обо всех триггерах и хранимых процедурах, ссылающихся на таблицу или представление sp_depends {имя_таблицы | имя_представления } Листинг В.64. Просмотр текущих блокировок sp_lock [spid] Листинг В.65. Просмотр текущих блокировок sp_who [spid] Листинг В.66. Вывод списка баз данных sp_helpdb [имя_базы] Листинг В.67. Определение нестандартных сообщений об ошибках sp_addmessage код_сообщения, текст_сообщения, [,язык[,{TRUE | FALSE} [,REPLACE]]] Листинг В.68. Определение и вывод ключей
converted to PDF by BoJIoc
sp_primarykey имя_таблицы, столбец1 [, ...] sp_foreignkey имя_таблицы1, имя_таблицы2, столбец1 [,столбец2, ...] sp_commonkey имя_таблицы1, имя_таблицы2, столбец1a, столбец2а [,столбец1б, столбец2б , ...] sp_helpkey имя_таблицы Таблицы и представления Листинг В.69. Удаление таблицы DROP TABLE [[база_данных.]владелец.]имя_таблицы [,[[[база_данных.]владелец.]имя_таблицы...] Листинг В.70. Создание представления CREATE VIEW [владелец.]имя_представления [ (имя_столбца, ...) ] [WITH ENCRYPTION] AS команда_select [ WITH CHECK OPTION ] Листинг В.71. Удаление представления DROP VIEW [владелец.]имя_представления[, [владелец.]имя_представления...] Листинг В.72. Полный синтаксис модификации представления ALTER VIEW имя_представления [(столбец [, ...n])] [WITH ENCRYPTION] AS команда_select [WITH CHECK OPTION] Транзакции и блокировка Листинг В.73. Начало транзакции BEGIN TRANSACTION [имя_транзакции] Листинг В.74. Начало транзакции COMMIT TRANSACTION [имя_транзакции] Листинг В.75. Откат транзакции ROLLBACK TRANSACTION [имя_транзакции | имя_точки_сохранения] Листинг В.76. Сохранение транзакции SAVE TRANSACTION имя_точки_сохранения Листинг В.77. Установка уровня изоляции транзакций SET TRANSACTION ISOLATION LEVEL {READ COMMITED|READ UNCOMMITED|REPEATABLE READ|SERIALIZABLE} Триггеры Листинг В.78. Создание, удаление и модификация триггеров
converted to PDF by BoJIoc
CREATE TRIGGER имя_триггера ON имя_таблицы [WITH ENCRYPTION] FOR {INSERT | UPDATE | DELETE} [,...] [WITH APPEND] [NOT FOR REPLICATION] AS [команды SQL] [RETURN] DROP TRIGGER имя_триггера [,имя_триггера [,... ] ] ALTER TRIGGER имя_триггера ON имя_таблицы [WITH ENCRYPTION] FOR {INSERT | UPDATE | DELETE} [, ...] [WITH APPEND] [NOT FOR REPLICATION] AS [команды SQL] [RETURN] Листинг В.79. Проверка вставки или обновления столбцов IF UPDATE (имя_столбца) [ { AND | OR } UPDATE (имя_столбца)...] Обновление статистики Листинг В.80. Полный синтаксис обновления статистики UPDATE STATISTICS { имя_таблицы } [имя_индекса | (индекс_или_список_столбцов [, ... n]) ] [WITH [[FULLSCAN]| SAMPLE номер {PERCENT | ROWS}]] [[,] [ALL | COLUMNS | INDEX] [[,] NORECOMPUTE] ] Пользовательские типы данных Листинг В.81. Определение типа данных sp_addtype имя_типа, тип_данных, [{NULL | NOT NULL}] Листинг В.82. Удаление типа данных sp_droptype имя_типа Команды WRITETEXT и UPDATETEXT Листинг В.83. Полный синтаксис команд WRITETEXT и UPDATETEXT WRITETEXT {таблица.столбец текстовый_указатель} [WITH LOG] {данные} UPDATETEXT {имя_таблицы.имя_столбца_приемника указатель_ приемника} { NULL | смещение_вставки} { NULL | длина_удаления}
converted to PDF by BoJIoc
[WITH LOG] [ вставляемые_данные | [{имя_таблицы.имя_столбца_ источника указатель_источника}]
Глоссарий ANSI (American National Standards Institute) — организация американских промышленных и деловых групп, занимающаяся разработкой торговых и коммуникационных стандартов в США. bcp, утилита — утилита, запускаемая в режиме командной строки и предназначенная для копирования данных между таблицей SQL Server и файлом операционной системы в формате, определяемом пользователем. BINARY — тип данных SQL Server, предназначенный для хранения шестнадцатеричных чисел. Данные типа BINARY могут содержать от 0 до 8000 байт. BIT — тип данных SQL Server, принимающий значения 1 или 0. BLOB — тип данных SQL Server, предназначенный для хранения неструктурированных двоичных данных (например, графики, звука или откомпилированного кода). Данные типа BLOB занимают до 2 Гбайт. CHAR(n) — тип данных SQL Server, содержащий от 0 до 8000 символов. CHECK — ограничение, которое проверяет, что сохраняемые в столбце значения входят в его домен. DATETIME — тип данных SQL Server для хранения даты и времени. Тип данных DATETIME состоит из двух 4байтовых целых чисел. DBCC (Database Consistency Checker) — команда SQL Server, предназначенная для проверки логической и физической согласованности базы данных, а также для выполнения других системных функций. DB-Library — набор высокоуровневых функций API в системах «клиент/сервер». DCL (Data Control Language) — подмножество команд SQL, управляющих разрешениями для объектов баз данных. DDL (Data Definition Language) — подмножество команд SQL для создания таблиц и структур баз данных. DML (Data Manipulation Language) — подмножество команд SQL для вставки, обновления, удаления и выборки данных. DTS (Data Transformation Service) — компонент SQL Server, предназначенный для импортирования, экспортирования и преобразования данных. FLOAT — тип данных, используемый для хранения чисел с плавающей запятой. IDENTITY — атрибут столбца счетчика. Значения столбцов счетчика генерируются SQL Server. IMAGE — тип данных SQL Server для хранения двоичной информации. Данные типа IMAGE занимают до 2 Гбайт. INT (INTEGER) — тип данных SQL Server для хранения целых чисел в интервале от –2 147 483 648 до 2 147 483 647. Данные типа INT занимают 4 байта. master, база данных — системная база данных SQL Server, содержащая информацию о ресурсах уровня сервера. model, база данных — системная база данных, используемая в качестве шаблона для каждой создаваемой базы данных.
converted to PDF by BoJIoc
MONEY — тип данных SQL Server, используемый для хранения денежных величин с точностью до четырех цифр после запятой. Тип данных MONEY хранит числа из интервала от –922337203685477,5808 до 922337203685477,5807. NCHAR — тип данных SQL Server, позволяющий хранить до 4000 символов в кодировке UNICODE. NTEXT — тип данных SQL Server, позволяющий хранить до 1 073 741 823 символов в кодировке UNICODE. NULL — неопределенное значение столбца при отсутствии присвоенного значения. NVARCHAR — тип данных SQL Server, позволяющий хранить до 4000 символов в кодировке UNICODE. ODBC (Open Database Connectivity) — прикладной интерфейс для работы с базами данных, приведенный в соответствие с интерфейсами баз данных уровня вызова (Call-Level Interface) стандартов ANSI и ISO. ODBC, драйвер — модуль DLL, обеспечивающий работу приложения с источником данных ODBC. OLE (Object Linking and Embedding) — прикладной интерфейс для совместного использования объектов между приложениями. OLE DB — прикладной интерфейс для работы с данными, построенный на базе COM. OLE DB позволяет работать с данными в любом формате (базы данных, электронной таблицы, текстового файла и т. д.), для которого существует провайдер OLE DB. OLTP (Online Transaction Processing) — приложение и база данных, разработанные для выполнения конкретной деловой задачи. В системах OLTP обычно выполняются запросы с заранее известной структурой. Performance Monitor — приложение Windows NT, предназначенное для сбора информации о характеристиках системы. Применяется для наблюдения за работой SQL Server. pubs, база данных — один из примеров баз данных, входящий в SQL Server. REAL — тип данных SQL Server для хранения чисел с точностью в 7 цифр. SELECT — команда SQL, возвращающая данные из базы данных SQL Server. SMALLDATETIME — тип данных SQL Server для хранения времени и даты. SMALLINT — тип данных для хранения целых чисел в интервале от –32 767 до 32 768. SQL (Structured Query Language) — язык запросов и программирования баз данных. SQL Server Agent — компонент SQL Server, отвечающий за создание и управление локальными и мультисерверными заданиями, оповещениями и операторами. SQL-3 — последняя версия стандарта SQL; в настоящее время еще не утверждена. SQL-92 — последняя утвержденная версия стандарта SQL, опубликованная в 1992 году; также известна как SQL-2. В США иногда используется термин «ANSI SQL». tempdb — системная база данных для хранения временных рабочих объектов. TEXT — тип данных, используемый для хранения символьных данных объемом до 2 Гбайт. TIMESTAMP — тип данных, автоматически генерирующий уникальное значение для базы данных. Каждое новое сгенерированное значение должно быть больше предыдущего. TINYINT — тип данных для хранения целых чисел в интервале от 0 до 255. Unicode — кодировка, используемая в типах данных NCHAR, NVARCHAR и NTEXT.
converted to PDF by BoJIoc
UNIQUE — ограничение, обеспечивающее уникальность значений столбцов в таблице. UNIQUEIDENTIFIER — тип данных SQL Server для хранения глобально-уникальных идентификаторов (GUID) в виде 16-байтовой двоичной строки. VARBINARY — тип данных для хранения двоичных данных объемом до 8000 байт. VARCHAR — тип данных для хранения символьных данных объемом до 8000 байт. автоматическая синхронизация (automatic synchronization) — автоматический процесс репликации, синхронизирующий подписчика с издателем при создании подписки. автоматическое восстановление (automatic recovery) — автоматический откат или завершение транзакций при перезапуске SQL Server. Автоматическое восстановление обеспечивает целостность баз данных. агрегатные функции (aggregate functions) — функции для вычисления сводных показателей. Агрегатными являются следующие функции: AVG, COUNT, COUNT(*), MAX, MIN, STDEV, STDEVP, SUM, VAR и VARP. агрегатный запрос (aggregate query) — любой запрос, в котором используется агрегатная функция. анонимная подписка (anonymous subscription) — pull-подписка, которая позволяет любому серверу, известному издателю, получать подписку на публикацию, но лишь на время подключения. архивация (backup) — процесс создания копии базы данных, журнала транзакций, файла или группы файлов с использованием магнитной ленты, именованного канала или жесткого диска. архивный носитель (backup media) — тип устройства, на котором хранится архив. Для хранения архивных наборов используются файлы, магнитные ленты или именованные каналы. архивный файл (backup file) — файл, содержащий архивную копию данных. аутентификация (authentication) — процесс идентификации пользователей и проверки разрешений при подключении к SQL Server. база данных по умолчанию (default database) — база данных, которая автоматически становится текущей при подключении пользователя к SQL Server. базовая таблица (base table) — таблица, на основе которой создается представление. блок (block) — одна или несколько команд SQL, расположенных между командами BEGIN и END. блокировка (lock) — ограничение доступа к ресурсу со стороны других подключений. блокировка таблицы (table lock) — режим блокировки, при котором блокируется целая таблица. вертикальное разбиение (vertical partitioning) — физический процесс разделения одной таблицы на несколько наборов столбцов. Каждой записи исходной таблицы соответствует запись в каждой из полученных таблиц. взаимная блокировка (deadlock) — ситуация, при которой два и более пользователя блокируют некоторый ресурс и ожидают снятия блокировок со стороны других пользователей. владелец базы данных (dbo, database owner) — пользователь, которому принадлежит база данных; не обязан быть владельцем объектов базы. владелец объекта (object owner) — пользователь, создавший объект. владелец объекта базы данных (database object owner) — пользователь базы данных, создавший объект базы данных. вложенный запрос (nested query) — запрос, являющийся составной частью другого запроса.
converted to PDF by BoJIoc
внешнее объединение (outer join) — внешнее объединение, которое возвращает записи даже в том случае, если в другой таблице не находится записи, соответствующей критерию объединения. внешний ключ (foreign key) — один или несколько столбцов таблицы, совпадающих с первичным ключом другой таблицы. В SQL Server внешний ключ может совпадать с любым ограничением уникальности другой таблицы. внутреннее объединение (inner join) — объединение двух таблиц, результаты которого определяются совпадающими значениями объединяемых полей. возможный ключ (candidate key) — любая комбинация столбцов, однозначно идентифицирующая запись данных. Возможные ключи также называются суррогатными ключами. временная хранимая процедура (temporary stored procedure) — хранимая процедура, создаваемая в системной базе данных tempdb. Признаком временной процедуры является префикс имени #. выгрузка (dump) — архивация. выражение (expression) — произвольный столбец, функция, переменная, подзапрос или произвольная комбинация имен столбцов, констант и функций, объединенных с помощью операторов, дающих одно значение и используемых в команде SQL вместо столбца. горизонтальное разбиение (horizontal partitioning) — физический процесс разделения одной таблицы на несколько таблиц на основании выбранных записей. группа файлов (filegroup) — один или несколько файлов данных в базе, объединяемых под общим именем для упрощения администрирования. грязное чтение (dirty read) — чтение данных, которые были модифицированы, но не закреплены в базе данных. декартово произведение (Cartesian product) — объединение двух таблиц без аргументов. Декартово произведение содержит все возможные комбинации записей из таблиц, участвующих в операции объединения. денормализация (denormalization) — процесс добавления избыточных данных в базу. Приводит к изменению нормальной формы таблицы. диаграмма базы данных (database diagram) — графическое представление полной структуры базы данных или ее некоторой части. динамическая блокировка (dynamic locking) — процесс SQL Server, определяющий наиболее эффективную схему блокировки для каждого запроса. динамический курсор (dynamic cursor) — курсор с изменяющимся итоговым набором. Другими словами, при перемещении курсора все изменения данных отображаются в итоговом наборе. домен (domain) — набор допустимых значений атрибута. журнал ошибок (error log) — ASCII-файл операционной системы, в который SQL Server записывает сообщения. журнал приложений (application log) — файл Windows NT, в котором регистрируются события. SQL Server можно настроить на использование журнала приложений Windows NT. журнал событий (event log) — системный файл NT, содержащий сообщения от всех процессов на компьютере. журнал транзакций (transaction log) — специальный файл базы данных, в который записываются все изменения данных перед записью в базу. закрепление (commit) — процесс сохранения изменений в базе данных.
converted to PDF by BoJIoc
запись (row, record) — набор из одного или нескольких столбцов. запланированная архивация (scheduled backup) — архивация, автоматически выполняемая SQL Server Agent в том случае, если архивация была определена и запланирована как задание. идентификатор (identifier) — имя объекта базы данных. В границах своей области видимости идентификатор должен быть уникальным. столбец счетчика (identity column) — столбец, сгенерированный системой и обладающий атрибутом IDENTITY. В таблице может быть лишь один столбец счетчика. именованный канал (named pipe) — механизм межпроцессных взаимодействий (IPC), используемый для доступа к общим сетевым ресурсам. имя базы данных (database name) — имя, однозначно идентифицирующее базу данных в SQL Server. имя незапланированного подключения (ad hoc connector name) — функция OpenRowset секции FROM используется для одноразового подключения к внешнему источнику данных. индекс (index) — объект баз данных, ускоряющий доступ к данным по сравнению с просмотром каждой записи таблицы в поисках нужного результата. интервальный запрос (range query) — запрос на выборку записей данных, у которых значение столбца принадлежит заданному интервалу. источник данных (data source) — любые внешние данные, доступ к которым осуществляется через SQL Server. итоговый набор (result set) — записи, возвращаемые командой SELECT. каскадное обновление (cascading update) — обновление всех зависимых записей (или столбцов). каскадное удаление (cascading delete) — удаление зависимых записей (или столбцов) из зависимых таблиц. каталог базы данных (database catalog) — системные таблицы с информацией, описывающей объекты базы данных. кластерный индекс (clustered index) — индекс, при котором данные сортируются в порядке значений индекса. клиент (client) — процесс (программа или задача), обращающийся к приложению-серверу с запросом на обслуживание. Кроме того, в локальной сети — компьютер, работающий с общими сетевыми ресурсами, предоставляемыми сервером. клиент/сервер (client/server) — архитектура, при которой обработка данных распределяется между клиентами (программами, обычно оптимизированными для взаимодействия с пользователем) и серверами (программами, отвечающими за централизованное управление данными, сетевое администрирование и безопасность) в локальной сети. По сравнению со старыми архитектурами, архитектура «клиент/сервер» повышает эффективность обработки данных. клиентский курсор (client cursor) — курсор, реализуемый клиентом через API. ключ (key) — один или несколько столбцов, однозначно определяющих таблицу или отношения между таблицами. ключевой курсор (keyset-driven cursor) — курсор, в котором не учитываются результаты вставок и удалений, но отображаются все модификации базовых данных. кодировка (character set) — набор символов, используемый SQL Server для типов данных CHAR, VARCHAR или TEXT. Кодировка состоит из 256 букв, цифр или символов, относящихся к определенной стране или языку. Первые 128 символов совпадают во всех кодировках.
converted to PDF by BoJIoc
кодовая страница (code page) — см. кодировка. конкатенация (concatenation) — объединение двух и более символьных строк, выражений или двоичных цепочек. одновременность (concurrency) — возможность одновременного обращения к SQL Server со стороны нескольких пользователей. константа (constant) — любая статическая величина, используемая в запросе (не содержащая вызовов функций, столбцов или объектов баз данных). контрольная точка (checkpoint) — системное событие SQL Server. При прохождении контрольной точки на диск записываются все модифицированные страницы данных. коррелированный подзапрос (correlated subquery) — подзапрос, в котором возвращаемые записи определяются по результатам внешнего запроса. коэффициент заполнения (fill factor) — параметр, резервирующий свободное место в индексе при его создании. Коэффициент заполнения уменьшает разбивку страниц при увеличении таблицы. критерий объединения (join condition) — логическое условие, определяющее способ объединения таблиц. курсор (cursor) — механизм последовательной обработки записей, входящих в итоговый набор. Курсоры делятся на клиентские и серверные. левое внешнее объединение (left outer join) — внешнее объединение, в результат которого включаются все записи первой таблицы, даже при отсутствии связанных записей во второй таблице. Также см. объединение и внешнее объединение. логические операторы (logical operators) — операторы AND, NOT и OR. логическое выражение (Boolean expression) — любое выражение, возвращающее TRUE, FALSE или NULL. логическое имя (logical name) — внутреннее имя, используемое в SQL Server для идентификации файлов. локальная переменная (local variable) — переменная, определяемая пользователем. местонахождение (locale) — информация, описывающая языковые и национальные стандарты при регистрации пользователя в SQL Server. локальный сервер (local server) — сервер, к которому в данный момент подключен пользователь. метаданные (metadata) — данные, описывающие другие объекты баз данных. См. системный каталог. «многие ко многим», отношение (many-to-many, relationship) — отношение, при котором одной записи первой сущности соответствуют несколько записей второй сущности, а каждой записи второй сущности — несколько записей первой сущности. монопольная блокировка (exclusive lock) — режим блокировки, при котором другие процессы не могут установить блокировку для заблокированных записей. некластерный индекс (non-clustered index) — индекс, в котором физический порядок данных отличается от порядка следования индекса. нормализация (normalization) — процесс удаления избыточных данных из сущности. объединение (join) — процесс объединения данных из двух и более таблиц, представлений или процедур. объект базы данных (database object) — один из следующих элементов базы данных: таблица, индекс, триггер, представление, ключ, ограничение, значение по умолчанию, правило, пользовательский тип данных или хранимая процедура.
converted to PDF by BoJIoc
ограничение (constraint) — свойство одного или нескольких столбцов таблицы. Ограничение сужает круг значений, которые могут храниться в столбце(ах). ограничение уровня столбца (column-level constraint) — ограничение, обеспечивающее целостность столбца. «один к одному», отношение (one-to-one, relationship) — отношение, при котором одной записи первой сущности соответствует одна запись второй сущности, а каждой записи второй сущности соответствует ровно одна запись первой сущности. «один ко многим», отношение (one-to-many, relationship) — отношение, при котором одной записи первой сущности соответствует несколько записей второй сущности, но каждой записи второй сущности соответствует лишь одна запись первой сущности. однородные данные (homogeneous data) — данные, поступающие из одного источника, обслуживаемого одним провайдером. оповещение (alert) — реакция на событие SQL Server, определяемая системным администратором откат (rollback) — отмена транзакции и возврат модифицированных ею данных к исходному состоянию. отношение (relationship) — ситуация, при которой одна сущность ссылается на первичный ключ второй сущности. пакет (batch) — одна или несколько команд SQL, выполняемых SQL Server. параметр (parameter) — в хранимых процедурах параметр определяет величину, конкретное значение которой задается при вызове процедуры. Параметру может быть присвоена константа или переменная. первичный ключ (primary key) — возможный ключ, выбранный для идентификации записей данных в таблице. перекрестное объединение (cross join) — объединение, результат которого представляет собой декартово произведение. переменная (variable) — объект для хранения временных значений. Имена переменных начинаются с символа @. перенос данных (data migration) — перемещение данных из одного источника в другой. Также называется пересылкой данных. подзапрос (subquery) — команда SELECT, создающая новый запрос. подключение (connection) — установление соединения с SQL Server. поле (field) — часть записи, соответствующая столбцу в таблице базы данных. полное внешнее объединение (full outer join) — внешнее объединение, которое возвращает все записи из обоих таблиц даже в том случае, если критерий объединения не дает совпадений в записях. См. также объединение и внешнее объединение. пользовательский тип данных (user-defined data type) — тип данных, определенный пользователем. Должен быть основан на одном из стандартных типов SQL Server. порядок сортировки (sort order) — порядок, в котором SQL Server располагает символьные строки. посторонние слова (noise words) — слова, не участвующие в полнотекстовых запросах. правило (rule) — объект базы данных, который определяет, какие данные могут находиться в столбце. правое внешнее объединение (right outer join) — внешнее объединение, в результат которого включаются все записи второй таблицы, даже при отсутствии связанных записей в первой таблице.
converted to PDF by BoJIoc
представление (view) — логическая таблица, созданная командой SELECT путем выборки данных из одной или нескольких таблиц. преобразование данных (data transformation) — изменение структуры или значений данных в процессе переноса. прикладной интерфейс (API) — набор функций, вызываемых приложениями. провайдер OLE DB (OLE DB provider) — программный модуль, обслуживающий работу с источником данных через прикладной интерфейс OLE DB. проверка разрешений (permissions validation) — процесс, задача которого — проверить, обладает ли пользователь правом выполнения той команды SQL Server, которую он пытается выполнить. прямой курсор (forward-only cursor) — курсор, допускающий перебор записей только от первой к последней. псевдоним (alias) — альтернативное имя таблицы или столбца в выражении. разделяемая блокировка (shared lock) — блокировка, при которой другим пользователям разрешается читать заблокированные данные. разнородные данные (heterogeneous data) — данные, поступающие из двух и более источников данных, обслуживаемых разными провайдерами. разрешения (permissions) — права доступа к объекту или команде. разрешения объекта (object permissions) — разрешения, предоставленные или отозванные для доступа к таблице или представлению. распределенная база данных (distributed database) — база данных, которая физически находится на нескольких серверах. полнотекстовый запрос (full-text query) — команда SELECT с неформальной логикой и поиском приблизительных совпадений. полнотекстовый индекс (full-text index) — особый индекс таблицы, который во включенном состоянии разрешает выполнять полнотекстовый поиск в таблице. Полнотекстовый индекс, в отличие от обычного, не изменяется автоматически при модификации данных. полнотекстовый каталог (full-text catalog) — механизм хранения полнотекстового индекса базы данных. Полнотекстовый каталог хранится во внешнем (по отношению к SQL Server) файле операционной системы. разностная архивация базы данных (differential database backup) — архивация базы данных, в которой участвуют только записи, изменившиеся с момента последней полной архивации. рекурсивное отношение (recursive relationship) — отношение, в котором таблица связана сама с собой. Также называется «рефлективным» (reflective) отношением. реляционная база данных (relational database) — база данных, построенная на основе реляционной модели. реляционная модель базы данных (relational database model) — модель данных, построенная на основе теории множеств, реляционной алгебры и реляционных вычислений. роль (role) — механизм обеспечения безопасности SQL Server, используемый для объединения пользователей с похожими правами. роль приложения (application 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) — приложение баз данных, используемое для анализа данных. системные базы данных (system databases) — четыре базы данных, создаваемые при установке SQL Server: master, tempdb, model и msdb. системные таблицы (system tables) — таблицы, образующие системный каталог и каталог баз данных. системные хранимые процедуры (system stored procedures) — набор хранимых процедур SQL Server для работы с системными таблицами. системный администратор (system administrator) — любой пользователь с ролью sysadmin. системный каталог (system catalog) — системные таблицы базы данных master, содержащие информацию об SQL Server. Не содержат информации о таблицах, входящих в базу. скалярный агрегат (scalar aggregate) — функция, которая применяется ко всем записям таблицы и генерирует сводное значение в виде одного из возвращаемых столбцов. словарь данных (data dictionary) — системные таблицы с описанием объектов баз данных. составной индекс (composite index) — индекс, состоящий из нескольких столбцов. составной ключ (composite key) — ключ, состоящий из нескольких столбцов. союз (union) — слияние результатов двух и более запросов. список выборки (select list) — элементы, возвращаемые командой SELECT. ссылочная целостность (referential integrity) — правило, которое гарантирует, что для внешних ключей существуют ассоциированные первичные ключи. статический курсор (static cursor) — курсор, в котором отображается состояние данных на момент открытия. статья (article) — базовая единица репликации. Статья может представлять собой таблицу или хранимую процедуру. столбец (column) — отдельный атрибут данных в записи. страница (page) — внутренняя единица хранения данных в SQL Server. Размер страниц в SQL Server равен 8 Кбайт. страница индекса (index page) — страница базы данных с данными, образующими индекс. СУБД (DBMS) — программа, управляющая доступом к данным. суррогатный ключ (surrogate key) — возможный ключ в терминологии Microsoft. В нормальной терминологии так называется искусственно сгенерированный ключ. структура (schema) — описание базы данных на DDL. таблица (table) — объект базы данных, содержащий информацию в табличной форме (то есть в виде строк и столбцов).
converted to PDF by BoJIoc
тип данных (data type) — атрибут столбца, определяющий, какая информация может храниться в данном столбце. точка сохранения (savepoint) — маркер, определяемый пользователем и обеспечивающий возможность частичного отката транзакций. транзакция (transaction) — логическая единица выполняемой работы. триггер (trigger) — аналог хранимых процедур. Автоматически выполняется при модификации данных. увеличение уровня блокировки (lock escalation) — процесс, в результате которого несколько блокировок, сгенерированных командой SQL, превращаются в блокировку более высокого уровня. удаленный сервер (remote server) — сетевой сервер, доступ к которому осуществляется через локальный сервер. универсальные символы (wildcard characters) — символы, используемые при поиске по шаблону (например, с ключевым словом LIKE в секции WHERE). уникальный индекс (unique index) — индекс, однозначно определяющий запись в таблице. уровень изоляции (isolation level) — параметр, определяющий степень блокировки данных в SQL Server. устройство архивации (backup device) — магнитная лента, файл или именованный канал, используемые для архивации или восстановления базы данных. файл (file) — единица хранения информации в операционной системе. Базы данных SQL Server состоят из двух и более файлов операционной системы. файл базы данных (database file) — файл данных или файл журнала транзакций. файл данных (data file) — файл с данными, образующими базу данных (в отличие от файла, в котором хранится журнал транзакций). файл журнала (log file) — файл или набор файлов, в которых записываются текущие транзакции в базе данных. хранимая процедура (stored procedure) — совокупность команд SQL, хранящихся в SQL Server. целостность данных (data integrity) — правильность и надежность данных в таблицах. целостность доменов (domain integrity) — процесс, в ходе которого проверяется соответствие значений всех атрибутов их доменам. целостность сущностей (entity integrity) — процесс, проверяющий наличие в таблице уникального первичного ключа. экстент (extent) — единица, используемая SQL Server для выделения места под таблицу или индекс. Экстент состоит из восьми смежных страниц одного файла общим объемом 64 Кбайт. ядро (kernel) — главный модуль SQL Server. язык по умолчанию (default language) — язык, используемый сеансом для взаимодействия с SQL Server.
Центры обучения и сертификации в СНГ Таблица 1. Центры авторизованного обучения Microsoft в странах СНГ Местонахождение Наименование
Как связаться
converted to PDF by BoJIoc
центра www.rcom.ru/limtuт.293-29-59 ф.291-37-84 196135, ул. Гастелло,
[email protected]
Санкт-Петербург
ЛИМТУ
Санкт-Петербург
Учебно-технический www.it.spb.ruт.185-49-88 ф.184-42-97 198255, центр АйТи Санктул. Возрождения, д.4
[email protected] Петербург
Санкт-Петербург
Компьютерная академия СофтДжойс
www.softjoys.ruт.108-5463 196135, ул. Гастелло, д. 16
[email protected]
Санкт-Петербург
Факультет переподготовки специалистов СПбГТУ
www.avalon.ru/educationт.552-76-90 ф.552-6521 195251, ул. Политехническая, д.29, 4-й корп., ауд. 306
[email protected]
Санкт-Петербург
Computer Education Center "Support"
www.educate.spb.ruт.443-96-98 ф.443-95-65 196135, Россия, Санкт-Петербург, ул. Ленсовета, 14, оф. 227
[email protected]
Санкт-Петербург
Digital 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.microtest.ruт. 605-253 ф. 605-175 620142, ул. Щорса, д.15
[email protected]
Киев
Квазар-Микро
www.kvazar-micro.comт. 443-83-96 ф. 434-8322 254136, ул. Северо-Сырецкая, д.3
[email protected]
Красноярск
MaxSoft
www.maxsoft.ruт. 65-13-85 660049, ул. Урицкого
[email protected]
Минск
Nef
www.minsk.nef.byт. 232-5713 220013, пер. Якуба Коласа
[email protected]
Москва
Академия АйТи
www.it.ruт.127-90-10 ф.129-12-75 117218, ул. Кржижановского, д.21а
[email protected]
Москва
Академия народного Microsoft microsoft.economy.ruт./ф. 564-8588 хозяйства, Сертифицированный (многоканальный), 117571, Пр. Вернадского, д. центр технического 82, 2-й учебный корп., комн. 207
[email protected] обучения
Москва
Анкей/Обучение
www.ankey.ru/eduт.258-38-01 ф.258-3808113114,ул. Летниковская, д.4, строение 5
[email protected]
Москва
Training.ru (Весть)
www.training.ruт. 115-60-01 ф. 112-23-33 115446, Коломенский проезд, д.1а, 4 этаж
[email protected]
Москва
Звезды и С
www.stars-s.ruт. 251-06-33 ф.251-0633125040, Ленинградский проспект д.5, стр. 2
[email protected]
Москва
Микроинформ
www.microinform.ru/training/microsoft.htmт.95300-06 ф.238-83-19113184, ул. Малая Ордынка, д.44
[email protected]
Москва
Оптима
www.optima.ru/trainingт. 263-9946 107082, Рубцовская наб., д.
[email protected]
converted to PDF by BoJIoc
Москва
САМАН-МАТИ
www.education.ruт.915-35-80 ф.915-33-58 109240, Берниковская наб., д.14, стр. 2, 4 этаж
[email protected]
Москва
Сетевая Академия
www.academy.ruт.967-66-70 ф.265-51-01 107066, ул. Доброслободская, д.5, стр.1
[email protected]
Москва
Учебный центр ФОРС
www.fors.comт.129-06-45 ф.332-48-45 117218, Нахимовский проспект, д.32, 6-й этаж, офис 625
[email protected]
Москва
Хьюлетт-Паккард А.О.
www.hp.ruт.978-39-54 ф.973-04-86 103055, ул. Новослободская, д.58
[email protected]
Москва
Центр Информационных Технологий
www.citmgu.ruт.932-92-12 ф.939-08-05 119899, Воробьевы горы, МГУ им.Ломоносова
[email protected]
Москва
Центр компьютерного обучения УНЦ НПФ "Мастак" при МГТУ
www.cko.bmstu.ruт.263-6963 2-ая Бауманская, д. 5, ком. 703
[email protected]
Москва
REDCENTER
www.redcenter.ruт./ф. 932-91-71 до 932-91-75 119899, Москва, Воробьевы горы, МГУ, Научный парк МГУ, корпус 2,
[email protected]
Москва
Xylos
www.xylos.comт.202-62-75 ф.202-88-73121019, Малый Знаменский пер., д.8, #
[email protected]
Новосибирск
SibInfocenter
www.sibinfo.ruт.33-36-29 ф.39-78-95 630090, ул. Пирогова, 2, ком
[email protected]
Ташкент
NetDec
т. 132-0815 Ташкент, 700060, Азимов кучаси, 72А
[email protected]
Ташкент
www.ucdmicros.comт. 132-0661, 133-9913 ф. Uzbekistan Computer 136-2935 700000, ул. С.Азимова, 72а (здание Design group Micros НПО "Коинот", центральный (UCD Micros) вход)
[email protected]
Томск
Stack Systems Integrator
www.stack.ru/educationт. 553-433 ф. 554-431 634012 г.Томск, ул.Щорса, 2а
[email protected] (iao?aiea)
[email protected] (сертификация)
Уфа
Центр информационных технологий
т. 253-853 ф. 253-771 450001, ул. Степана Халтурина, д.39
[email protected]
Таблица 2. Центры тестирования Sylvan Prometric Местонахождение Наименование центра
Как связаться
Санкт-Петербург
ЛИМТУ
www.rcom.ru/limtuт.293-29-59 ф.291-37-84 196135, ул. Гастелло,
[email protected]
Санкт-Петербург
Санкт-Петербургский Электротехнический Университет
т.234-59-68 ф.234-59-68197376 ул. Проф. Попова, д.3, 5-й корпус
[email protected]
Алматы
АЛСИ
www.alsi.comт. 47-62-00 ф. 47-31-50 480070, Коктем-2, дом 19-А
[email protected]
Екатеринбург
Микротест
www.microtest.ruт. 605-253 ф. 605-175 620142, ул. Щорса, д.15
converted to PDF by BoJIoc
[email protected] Екатернибург
НПВП "ЛАНТЕС"
www.lantes.ruт.555-432 ф.568-206620075 ул. Луначарского, д
[email protected]
Екатенринбург
Уральский центр тестирования
www.usu.ru/aptcт.55-74-40 ф.55-7385620083, ул.Тургенева, 4 , ауд. 524а
[email protected]
Киев
Квазар-Микро
www.kvazar-micro.comт. 443-83-96 ф. 43483-22 254136, ул. Северо-Сырецкая, д.3
[email protected]
Москва
НТ-Центр
www.ntc.ruт.256-16-92 ф.956-37-92123022 ул. 2-я Звенигородская, д
[email protected]
Москва
САМАН-МАТИ
www.education.ruт.915-35-80 ф.915-33-58 109240, Берниковская наб., д.14, стр. 2, 4 этаж
[email protected]
Москва
Учебный центр ФОРС
www.fors.comт.129-06-45 ф.332-48-45 117218, Нахимовский проспект, д.32, 6-й этаж, офис 625
[email protected]
Новосибирск
Вест Про
т.326-244 ф.355-237630081 Красный проспект, д
[email protected]
Новосибирск
"Новосибиркий Государственный Университет"
т.205-823 ф.216-164630090 ул. Пирогова, д
[email protected]
ПетропавловскКамчатский
КИТС
т.11-28-08 ф.11-20-12683000, ул. Ленинская,
[email protected]
Саратов УЦ
"Трайтек"
www.tritec.ru/ucт.(095) 733-93-32 ф.(8452) 50-88-95, (8452) 50-43-09, 50-8476410026, Привокзальная пл.1, офис
[email protected]@tritec.ru
Томск
Центр обучения и сертификации, фирма "Стек"
www.stack.ruт.553-433 ф.554-431634012, ул.Щорса, 2а
[email protected]
Таблица 3. Центры тестирования VUE Местонахождение
Наименование центра
Как связаться
Санкт-Петербург
ЛИМТУ
www.rcom.ru/limtuт.293-29-59 ф.291-37-84 196135, ул. Гастелло,
[email protected]
Санкт-Петербург
Computer Education Center "Support"
www.educate.spb.ru443-96-98/443-9565196135, ул. Ленсовета, 14, оф.
[email protected]
Алматы
Manon Trading Group 642-691/646-765480100, проспект Абая 4info@ Inc.manon.kimep.kz manon.kimep.kztrain_cert@ manon.kimep.kz
Киев
Квазар-Микро
www.kvazar-micro.com т. 443-83-96 ф. 434-8322 254136, ул. Северо-Сырецкая, д.3
[email protected]
Красноярск
MaxSoft
www.maxsoft.ruт. 65-13-85 660049, ул. Урицкого
[email protected]
Москва
Академия народного microsoft.economy.ruт./ф. 564-8588 хозяйства, (многоканальный), 117571, Пр. Вернадского, д. Сертифицированный 82, 2-й учебный корп., комн. 207
[email protected] центр технического
converted to PDF by BoJIoc
обучения Microsoft Москва
Звезды и С
www.stars-s.ruт. 251-06-33 ф.251-0633125040, Ленинградский проспект д.5, стр. 2
[email protected]
Москва
Микроинформ
www.microinform.ru/training/microsoft.htmт.95300-06 ф.238-83-19113184, ул. Малая Ордынка, д.44
[email protected]
Москва
Сетевая Академия
www.academy.ruт.967-66-70 ф.265-51-01 107066, ул. Доброслободская, д.5, стр.1
[email protected]
Москва
Анкей/Обучение
www.ankey.ru/eduт.258-38-01 ф.258-3808113114,ул. Летниковская, д.4, строение 5
[email protected]
Москва
Учебный центр ФОРС
www.fors.comт.129-06-45 ф.332-48-45 117218, Нахимовский проспект, д.32, 6-й этаж, офис 625
[email protected]
Москва
САМАН-МАТИ
www.education.ruт.915-35-80 ф.915-33-58 109240, Берниковская наб., д.14, стр. 2, 4 этаж
[email protected]
Москва
Training.ru (Весть)
www.training.ruт. 115-60-01 ф. 112-23-33 115446, Коломенский проезд, д.1а, 4 этаж
[email protected]
ПетропавловскКамчатский
КИТС
т.11-28-08 ф.11-20-12683000, ул. Ленинская,
[email protected]
Ташкент
www.ucdmicros.comт. 132-0661, 133-9913 ф. Uzbekistan Computer 136-2935 700000, ул. С.Азимова, 72а (здание Design group Micros НПО "Коинот", центральный (UCD Micros) вход)
[email protected]
Томск
Stack Systems Integrator
www.stack.ru/educationт. 553-433 ф. 554-431 634012 г.Томск, ул.Щорса, 2а
[email protected] (обучение)
[email protected] (сертификация)
Шпаргалка
Database Design on SQL Server 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. Значение столбца с типом данных UNIQUEIDENTIFIER (GUID) уникально для всех серверов. 13. Столбец счетчика не гарантирует глобальной уникальности значений. 14. Если при ручной вставке в столбец счетчика новое значение превышает текущий максимум, автоматическая генерация значений столбца счетчика будет продолжена с новой величины. 15. Столбец нельзя удалить, если он используется в репликации, индексе, ограничении, имеет значение по умолчанию или связан с правилом. 16. Внимание: в таких программах, как Query Analyzer и OSQL, по умолчанию для столбцов разрешены значения NULL. Однако в SQL Server по умолчанию значения NULL запрещаются. Команда SELECT 17. При использовании функции SUBSTRING нумерация начальной позиции начинается с 1. 18. Функция может быть вызвана для результата вызова другой функции. 19. Команда SELECT без секций WHERE или HAVING возвращает каждую запись. 20. При использовании агрегатной функции все столбцы итогового набора либо являются агрегатными функциями, либо включаются в секцию GROUP BY. 21. Агрегатные функции могут включаться в секцию WHERE только как компоненты подзапросов. 22. Любая команда SQL присваивает значение @@ERROR. Модификация данных 23. Даже если команда UPDATE не модифицирует ни одной записи, это не приводит к возникновению ошибки. 24. При использовании секции LIKE символ % означает любую строку, а символ _ — любой символ. Индексы 25. Коэффициент заполнения определяет объем свободного места, резервируемого при создании индекса или при выполнении команды DBCC DBREINDEX. Свободное место может повысить скорость вставки. 26. При снижении быстродействия стоит обновить статистику. Представления, правила и значения по умолчанию
converted to PDF by BoJIoc
27. В SQL Server представление может содержать союз. 28. С каждым столбцом могут быть связаны лишь одно правило и одно значение по умолчанию. Программирование 29. Выполняется лишь команда, непосредственно следующая за командой IF. Чтобы выполнить несколько команд после IF, необходимо воспользоваться блоком. 30. Команды IF влияют на значение глобальной переменной @@ROWCOUNT. 31. В SQL Server 7 при создании хранимых процедур не проверяется существование объектов (например, таблиц). Триггеры 32. Чтобы при удалении из базовой таблицы происходило автоматическое удаление из подчиненной таблицы, следует воспользоваться триггером DELETE. 33. Для одной таблицы можно определить несколько триггеров одного типа. Загрузка данных 34. BCP и BULK INSERT используются для загрузки файлов с простыми данными, не нуждающимися в преобразованиях. 35. Если загружаемые данные требуется преобразовать, воспользуйтесь DTS. Полнотекстовый поиск 36. Полнотекстовый поиск позволяет находить неточные совпадения. 37. При архивации или загрузке базы данных полнотекстовый индекс не архивируется и не загружается вместе с данными. 38. В полнотекстовых запросах используются предикаты CONTAINS и FREETEXT. Диагностика и сбор данных 39. Если в выходных данных DBCC SHOWCONTIG фактическое число переходов между страницами отличается от оптимального, значит, таблица фрагментирована. 40. SQL Server регистрирует ошибки в журнале ошибок SQL Server, в журнале приложений NT или в обоих журналах, если SQL Server был запущен как служба. 41. SQL Server регистрирует ошибки только в журнале ошибок SQL Server лишь в том случае, если он был запущен в режиме командной строки. 42. По выходным данным sp_who можно узнать, мешает ли один процесс работе другого; SPID блокирующего процесса указан в столбце BLK. 43. По выходным данным sp_lock можно узнать тип блокировок, установленных процессом, а также определить заблокированные объекты.