В. SQL Server 7.0 позволяет загружать данные при помощи службы Data Transformation Services (DTS), программы bulk copy program (bcp) или нового оператора BULK INSERT. Какой способ предпочтительнее при загрузке очень большого объема данных?
О. SQL Server 7.0 предлагает несколько высокоскоростных механизмов для загрузки данных. Программа bcp - это высокопроизводительная утилита импорта файлов, которую Microsoft поддерживает с первых дней существования SQL Server. Механизм bcp позволяет очень быстро загружать файлы большого размера, но, к сожалению, им не слишком удобно пользоваться.
В версии SQL Server 7.0 разработчики Microsoft расширили возможности импорта данных SQL Server, введя поддержку службы DTS и новую команду T-SQL BULK INSERT. Служба DTS предлагает более гибкую обработку большого объема данных, но BULK INSERT при равных условиях способна обрабатывать информацию вдвое быстрее, чем bcp или DTS.
Дело в том, что BULK INSERT - это команда T-SQL, и ее исполнение протекает как процесс внутри SQL Server Engine, это внутрипроцессная (in-process) команда. Поэтому SQL Server не нуждается в передаче данных на сетевом уровне через API-клиента (Network Library, NetLib), как это происходит в других случаях. Обход NetLib заметно ускоряет работу.
Кроме того, SQL Server 7.0 поддерживает механизм настраиваемых расширений (custom task add-on), с помощью которых можно внести задачу обработки BULK INSERT непосредственно в модуль DTS. Специалисты Microsoft интегрировали эту возможность в версию SQL Server 2000. Если требуется оптимальное сочетание скорости и возможности программно управлять обработкой данных, решение BULK INSERT поверх DTS может оказаться именно тем, что вы ищете.
В. Я использую SQL Profiler для сохранения трассы данных в таблице SQL Server. Периодически я опрашиваю эти данные, задавая класс события, но никак не могу определить, что означают целые значения в колонке EventClass. Каким образом можно соотнести эти целые значения и имена классов событий, которые я вижу, с помощью SQL Profiler?
О. Используя SQL Server 7.0, запустите команду master..xp_trace_geteventnames. Результат выполнения этой хранимой процедуры представляет собой таблицу соответствия целых значений EventClass и соответствующих им значений EventNames.
Я не уверен в том, что аналогичная процедура входит в состав SQL Server 2000, но при желании необходимую информацию можно получить из SQL Server Books Online (BOL) по ссылке на sp_trace_setevent. Если кому-нибудь удастся отыскать более подходящий способ непосредственно из SQL Server 2000, прошу мне об этом сообщить.
В. Зачем нужна утилита Data Transformation Services (DTS) ScriptPkg и где ее можно найти?
О. Входящий в пакет SQL Server 7.0 DTS Package Designer представляет собой графическое приложение на базе DTS COM. К сожалению, этот инструмент не настолько гибкий, как хотелось бы большинству разработчиков. Больше всего нареканий связано с тем, что для работы с DTS не предусмотрен редактор сценариев. Если разработчик испытывает трудности с написанием программ для DTS, он быстро обнаружит, что ошибки DTS, которые SQL Server отметил в файле обработки ошибок, описаны настолько невнятно, что практически бесполезны для анализа. В подобной ситуации можно воспользоваться утилитой ScriptPkg для включения модуля DTS в состав программы на Visual Basic (VB). Программа ScriptPkg - это бесплатная утилита, написанная на основе VB, которой можно воспользоваться для генерации VBScript-файла для модуля DTS. Эта утилита поставляется на компакт-диске с SQL Server 7.0, но так хорошо спрятана, что большинство пользователей ничего о ней не знают. Ниже последовательно рассказано, как ее найти и установить (потребуется версия VB 6.0).
1. Распакуйте архив DTSDemo.exe из каталога DevToolsSamplesDTS.
2. Из подкаталога Designer запустите проект VB под названием ScriptPkg.vbp.
3. Находясь в среде VB, меню File, создайте исполняемый файл и назовите его ScriptPkg.exe.
4. Запустите SQL Server 7.0 Enterprise Manager для создания модуля DTS и сохраните его на локальной системе SQL Server.
5. Запустите ScriptPkg.exe и введите имя созданного модуля. ScriptPkg создаст файл сценария (его имя - package-name.txt) и запишет его в каталог emp.
6. Скопируйте полученный код из файла сценария в VB-приложение. Добавьте Microsoft ActiveX Data Objects (ADO) 2.1 (или более поздней версии) и библиотеки объектов Microsoft DTS Package Designer к приложению или поэкспериментируйте с имеющимися примерами VB DTS из каталога DevToolsSamplesDTS.
ScriptPkg записывает весь модуль DTS как единую процедуру, а максимальный размер процедуры на языке VB - 64 Кбайт. По этой причине, если файл сценария ScriptPkg оказался больше 64 Кбайт, придется разделить его код на более мелкие части.
ScriptPkg способен оказать неоценимую помощь на этапе отладки и служит замечательным подспорьем для обучения COM-программированию DTS: можно использовать ScriptPkg для просмотра недокументированных возможностей DTS. Если же вы не программируете на VB, то теперь самое время заняться его изучением. Знание языка VBScript послужит базой для решения задач администрирования SQL Server. В версии SQL Server 2000 разработчики Microsoft включили программу ScriptPkg непосредственно в состав DTS Package Designer.
В. Я установил новую копию SQL Server - SQL Server 2000, и все мои инструменты для работы с SQL Server 7.0 пропали. Что случилось?
О. Хотя ничто не мешает загрузить множество копий Server Engine на одну и ту же машину, несколько копий клиента и инструментов администрирования установить на одну машину не получится. Когда устанавливается несколько копий SQL Server, при подключении к копии SQL Ser-ver 7.0 используются новые утилиты из состава SQL Server 2000 (Query Analyzer, SQL Enterprise Manager, Microsoft Data Access Components - MDAC). Не устанавливайте новые копии SQL Server, если необходимо сохранить набор старых инструментов администрирования.
В. Мне нужно сохранить описания колонок некоторой таблицы и одновременно нужно отобразить смысловое значение этих колонок. К примеру, если в таблице Order у меня есть колонка, называемая OrderDate, мне хотелось бы иметь описание, на основании которого можно было бы понять, это дата размещения заказа или дата его исполнения. Как следует настроить программу Microsoft Repository для решения такой задачи?
О. SQL Server 2000 разрешает хранить расширенные свойства (extended property) для многих типов объектов базы данных. Расширенные свойства определяются самим пользователем, при этом значения имеют тип SQL_VARIANT. Программисты, пишущие на VB, хорошо знают этот новый тип данных. Подобно типу variant в VB, SQL_VARIANT позволяет сохранить значения данных различных типов в одной и той же колонке, параметре или переменной. Каждый экземпляр колонки с типом SQL_VARIANT содержит два элемента: собственно значение и метаданные, которые описывают это значение (т. е. основной тип данных, максимальное значение, масштаб, точность и сравнение). Можно использовать функцию SQL_VARIANT_ PROPERTY для извлечения информации о метаданных для любой копии SQL_VARIANT.
К примеру, если нужно в таблице Authors сохранить описание колонки au_id в базе данных Pubs, щелкните правой кнопкой мыши на имени колонки в среде Object Browser (функция, поддерживаемая в программе Query Analyzer), а затем выберите Extended Properties. Предположим, мы решили добавить новое свойство с именем WhatAmI, значение которого I am the author id column!!! Аналогичного результата можно достичь с помощью процедуры sp_addextendedproperty:
sp_addextendedproperty `WhatAmI2`, `This is a new property value`, `user`, dbo, `table`, authors, `column`, au_id
После этого, воспользовавшись стандартным предложением SELECT и новой функцией fn_listextendedproperty, можно извлечь записанную в расширенном свойстве информацию (см. Листинг 1).
В. Изменилась ли поддержка декларативной целостности - Declarative Referential Integrity (DRI) - в версии SQL Server 2000?
О. Несколько лет тому назад разработчики Microsoft объявили о своем намерении обеспечить каскадирование DRI, и многие пользователи были разочарованы, не найдя такую возможность в версии SQL Server 7.0. Однако с выходом версии SQL Server 2000 обещание было выполнено. SQL Server 2000 поддерживает каскадную ссылочную целостность - возможность, доступную пользователям Microsoft Access на протяжении уже нескольких лет. В чем разница между поддержкой «запрещающей» DRI, применявшейся в более ранних версиях SQL Server, и каскадируемой DRI? Предположим, что имеется классическое отношение «родитель-дети» (один-ко-многим) между заказчиком и заказами. Запрещающий механизм DRI не дает удалить заказчика с активными заказами, в то время как с точки зрения каскадного DRI пользователь знает, что делает, и он просто удаляет заказы, относящиеся к удаляемому заказчику.
В версии SQL Server 2000 применяется синтаксис SQL-92 для команды CREATE TABLE (см. Листинг 2), в котором поддерживаются каскадируемые действия, связанные с обновлением и удалением данных. Можно самостоятельно организовать каскадное удаление в SQL Server 7.0 и более ранних версиях, написав соответствующий код или настроив триггеры обновления и удаления.
В. Могу ли я сгенерировать список всех запросов или идентификаторов серверных процессов (server process ID, SPID), исполняемых внутри транзакции?
О. Таблица Sysprocesses в базе данных Master содержит много ценной информации, в том числе колонку open_tran. Для каждого уникального идентификатора серверного процесса (SPID) в рамках одного SQL-соединения в таблице Sysprocesses имеется отдельная строка. В колонке open_tran содержится текущее значение @@trancount для идентификатора SPID, участвующего в просмотре таблицы Sysprocesses. Значение больше 0 в колонке open_tran говорит о том, что данный SPID принадлежит транзакции; 1 - SPID принадлежит транзакции верхнего уровня, 2 - вложенной транзакции 1-го уровня и т. д.
Чтобы установить, какие SQL-соединения охвачены транзакцией, нужно воспользоваться следующей командой:
SELECT spid, open_tran FROM master..sysprocesses WHERE open_tran > 0
Для определения исполняющейся команды используйте конструкцию dbcc inputbuffer. Например, dbcc inputbuffer (10) покажет 255 символов самой последней исполненной команды для SPID 10.
В. Я открыл для себя, что группы новостей по Microsoft SQL Server - это исключительно ценный источник информации. Но иногда я наталкиваюсь на сайт, который не пропускает пакеты Network News Transfer Protocol (NNTP), и не могу получить доступ к серверам новостей. Существуют ли Web-версии новостных групп?
О. Да, существуют. Доступ к группам новостей Microsoft можно получить через сайт http://msdnnews.microsoft.com. К сведению пользователей, которые не могут посещать регулярные NNTP-группы, за поддержкой всегда можно обратиться на бесплатный сайт новостей Microsoft по адресу: http://msnews.microsoft.com.
Брайан Моран - президент группы пользователей и директор по технологиям СУБД в Spectrum Technology Group. Имеет сертификаты MCSE, MCSD и MCT. Ему можно написать по адресу: brian@spectrumtech.com.
Листинг 1. Пример предложения SELECT и использования функции fn_listextendedproperty.
SELECT * FROM ::fn_listextendedproperty (NULL, `user`, `dbo`, `table`, `authors`, `column`, default) objtype objname name value COLUMN au_id WhatAmI I am the author id column!!! COLUMN au_id WhatAmI2 This is a new property value SELECT * FROM ::fn_listextendedproperty (NULL, `user`, `dbo`, `table`, `authors`, `column`, default)
Листинг 2. Синтаксис SQL-92 для команды CREATE TABLE.
CREATE TABLE mytable (mycol1 character (30) NOT NULL, -more column names, data types go here CONSTRAINT mytable_pk PRIMARY KEY (mytableID) -note syntax to designate primary key -column -naming the constraint is optional CONSTRAINT mytable_fk FOREIGN KEY (mytableID) REFERENCES mydependent_table, ON DELETE|UPDATE CASCADE)