Перенос данных

В: У меня есть пакет утилит преобразования данных DTS (Data Transformation Services), который переносит данные из файла dBase V (в нем находится только одна таблица) в таблицу базы данных SQL Server. Каким образом можно сообщить пакету утилит DTS о местоположении источника и получателя данных, если оно меняется при каждом новом запуске приложения, написанного на VB?

О: В Листинге 1 приведен текст подпрограммы, которая берет существующий пакет (сохраненный в виде файла СОМ),

Листинг 1. Модуль DTE с полным доступом к модели объектов DTE.

Sub Main()

Dim oPackage As New DTS.Package
Dim oConnection As DTS.Connection

oPackage.LoadFromStorageFile 
?d:Test.dts?, ??

Set oConnection = oPackage
.Connections(?MyData?)

oConnection.DataSource = ?Enter 
you new server name here?
oConnection.Catalog = ?Enter 
you new database name here?

oPackage.Execute

Set oConnection = Nothing
Set oPackage = Nothing

End Sub
загружает его и переустанавливает свойство DataSource (источник данных). Обратите внимание, что можно получить полный доступ ко всей модели объектов DTS после того, как пакет будет загружен. Это позволяет изменять любые атрибуты, если только вы знаете имя своего соединения.

Создание хронологического журнала

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

О:Для записи информации о том, кто производит изменения данных и таблиц, можно использовать SQL Profiler. Применение триггеров нежелательно, потому что они не очень стабильно работают при пакетных загрузках и, кроме того, излишне перегружают систему.

Репликация из 6.5 в 7.0

В: Следуя совету, изложенному в рубрике «Вопросы и ответы» июльского номера журнала за 1999 г. мне хотелось бы совершить репликацию с версии SQL Server 6.5 на версию 7.0, до тех пор пока мы не перейдем полностью на версию 7.0. Синхронизация выполняется благополучно, а распределение завершается некорректно. При этом выдается сообщение о том, что невозможно соединение с MAINFRAME01 (Unable to connect to MAINFRAME01). Почему диспетчер задач производит соединение для синхронизации и не выполняет его для распределения?

О: Агент моментального снимка памяти соединяется только с издателем и с распространителем, а агент распределения должен связаться с распространителем и подписчиками. Вам следует проверить, указаны ли в учетной записи услуг для SQLServerAgent соединения со всеми участвующими в работе машинами, что необходимо для успешного завершения распространения. Войдите с учетной записью услуг в машину, выполняющую роль сервера распространения, и убедитесь, что сможете подключиться к другим машинам SQL Server. По окончании такой проверки вы будете в состоянии выполнить соединение для задачи распределения.

Восстановление одиночной таблицы

В: Правда ли, что возможность восстановления из резервной копии одиночных таблиц, введенная в SQL Server 6.5, в версии 7.0 отсутствует?

О: Возможность восстановления одиночных таблиц впервые появилась в версии 6.5, но опыт показал, что у нее есть ряд ограничений и уязвимых мест. К примеру, процесс резервирования и восстановления одиночной таблицы не гарантирует целостности транзакций. В связи с тем, что одной из основополагающих задач Microsoft является обеспечение надлежащей целостности транзакций, разработчики новой версии SQL Server 7.0 не включили в нее такую услугу. Однако, учитывая желание пользователей иметь в своем распоряжении подобную возможность, в Microsoft планируют вновь ввести ее в будущих версиях, но уже на другой основе, в соответствии с новой файловой архитектурой Microsoft.

Контроль доступа

В: Недавно я перешел с версии SQL Server 6.5 на версию 7.0 и установил Service Pack I (SPI). Мое приложение в большой степени зависит от работы xp_cmdshell и от считывания и записи файлов из удаленных серверов в нескольких доверенных доменах. В SQL Server 6.5 можно считывать и записывать файлы в удаленных серверах, если назначить службе SQL Server бюджет домена и предоставить право доступа к бюджету службы и к различным разделяемым ресурсам в доверенных доменах. Но в SQL Server 7.0 по умолчанию пользователи, не наделенные полномочиями администратора, получают учетную запись SQLAgentCmdExec при использовании xp_cmdshell для запуска команд. Как отключить опцию Nonadministrators use SQLAgentCmdExec account при запуске команд через xp_cmdshell?

О: Разработчики Microsoft устранили данную возможность в версии SQL Server 7.0. Вместо этого можно сделать пользователей членами ролевой группы sa, дабы исключить расширение их полномочий за пределы, установленные посредством xp_cmdshell. Предоставить соответствующие права на доступ к файлам, с которыми пользователям будет разрешено работать, можно с помощью бюджета SQLAgentCmdExec.

Просмотр описателей таблиц

В: Можно ли показать описание (а не имя) таблицы в SQL Server 7.0 таким же образом, как это делается в Sybase Database Server и в DB2 Server?

О: Если вам нужно просмотреть все данные о таблице в SQL Server 7.0, запустите команду:

EXEC sp_help <имя таблицы>

Еще можно получить эту информацию, заглянув в папку таблицы (Tables) в разделе базы данных (Databases) в SQL Server Enterprise Manager. Чтобы получить описание любой таблицы или информацию из нее, следует просто дважды щелкнуть на ней мышью.

Переименование файлов

В: С помощью DTS я создал задание в SQL Server, которое загружает в таблицу данные из файла .csv. Теперь мне хотелось бы переименовать этот файл так, чтобы именем служила текущая дата, а расширение было .txt (например, 11-15-99.txt). При этом дату надо менять одновременно с системной датой, а переименовывать файл сразу после того, как успешно завершится выгрузка данных.

О: Вам необходимо добавить в свой пакет задачу со сценарием ActiveX, которую следует запускать по окончании импорта данных из файла .csv в таблицу, как если бы она использовала ограничение предшествования On success (при успешном завершении). Затем в задаче со сценарием ActiveX можно применить функции VBScript, которые позволяют выйти в файловую систему и переименовать файл.

Определение значений параметров

В: Я использую SQL Server 6.5 для приложения, которое работает с хранилищем данных. Процесс, запускаемый каждую ночь, вставляет строки и агрегирует данные в еженедельные, ежемесячные и годовые таблицы. Я постоянно получаю в журнале ошибок приложения Windows NT следующее сообщение:

Предупреждение: значение параметра Open Objects может быть недостаточным (WARNING: OpenObjects parameter may be too low). Ошибка: была сделана попытка освободить описатели в localdes (Error: attempt was made to free up descriptors in localdes). Ошибка: запустите процедуру sp_configure для увеличения значения параметра (Error: run sp_configure to increase parameter value).

Значение параметра OPEN OBJECTS я установил равным 5000. Как определить подходящее значение параметра?

О: Разработчики Microsoft выявили ошибку, связанную с временными таблицами и открытыми объектами, и предложили применять пакет Service Pack 3 (SP3) для ее устранения в SQL Server 6.5. Убедитесь в том, что вы обновили свою версию хотя бы до уровня SP3, хотя сейчас рекомендуется применять SP5. Мне не известен способ определения количества обработчиков объектов, одновременно используемых в SQL Server. Если памяти у вас достаточно, лучше всего увеличить значение этого параметра, исходя из максимально допустимого числа открытых таблиц, хранимых процедур, представлений и т. п.

Обработка ошибок

В: При работе с SQL Server 6.5 мне часто приходится получать от Open Data Services (ODS) сообщение об ошибке с кодом 17832. Я изучил всю сеть и не могу понять, в чем проблема. Сейчас мой журнал событий полон сообщений с этим кодом ошибки. Что мне делать?

О: Сообщения ODS являются информационными. Нельзя сделать так, чтобы они не появлялись. Если хотите прочитать более подробную информацию об этой конкретной ошибке, то просмотрите по адресу: http://support.microsoft.com/ servicedesks/msdn/ статью Q109787. В ней говорится о том, что пользователи могут получать множество сообщений об ошибках, связанных с коммуникационными аспектами SQL Server. Такая ситуация свидетельствует не о наличии ошибок в SQL Server, а скорее о том, что имеются ошибки в сети — либо в ее конфигурации, либо в клиентских приложениях.


Ричард ВеймАйер

(rwaymi@microsoft.com) работает менеджером в подразделении корпорации Microsoft по разработке SQL Server. Он является основным автором книги «Teach Yourself SQL Server 7.0 in 21 Days» («Как изучить SQL Server 7.0 за 21 день»), выпущенной издательством Sams Publishing.

Поделитесь материалом с коллегами и друзьями