Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Вопросы и ответы по MS SQL Server" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
MS SQL Server - дело тонкое...
Информационный Канал Subscribe.Ru |
#097<< #098 |
СОДЕРЖАНИЕ СОВЕТЫ
XML в MS SQL Server 2000 и технологиях доступа к данным Автор: Алексей Шуленин 1. Введение.
Несколько слов о том, что за текст попался вам на глаза и стоит ли вам его читать, а мне, соответственно,
браться сейчас писать. Ну поддерживает SQL Server XML, ну так что с того? Его сейчас поддерживают все,
кому не лень, потому что это круто. А если разобраться по существу, то с какого бока приличному серверу баз
данных этот XML вообще сдался? Вот с этого философского вопроса, пожалуй, и начнем.
С моей сугубо прагматичной точки зрения это, конечно, не дань моде. Наши с вами реалии сегодня таковы,
что большинство корпоративных бизнес-сценариев давно вышли за рамки локальных сетей и предусматривают
работу с базами данных через Интернет. Кроме того, эта работа ведется чаще всего в гетерогенных средах, где
перемешаны и Windows, и Linux, и Solaris, и FreeBSD, и много чего еще. Во-первых, представление как запроса,
так и его результатов в виде XML существенно упрощает передачу данных через межсетевые экраны. Понятно,
например, что передать recordset как COM-объект через брандмауэр скорее всего не удастся, потому что ни один
администратор в здравом уме не откроет порты для произвольных RPC-вызовов снаружи. Издавна придумывались
лазейки и средства: вспомните, например, Remote Data Service (RDS), появившуюся еще в составе ADO 1.5 во
второй половине 1997 г. (а ее предшественник Advanced Data Connector - ADC - и того раньше). Она
позволила-таки маршалировать recordset'ы через HTTP и DCOM, хотя и не скажу, что это было тривиально.
Сериализация объекта в XML решает эту задачу легко. Во-вторых, XML и HTTP, являясь де юре и де факто
общепринятыми стандартами, упрощают взаимодействие между базами данных различных производителей,
на какой бы платформе и ОС они ни стояли. Причем, даже не только между базами данных, но и напрямую с
серверами электронной коммерции и бизнес-интеграции. Например, с Commerce Server, BizTalk Server и др.
Причем не только с серверами промежуточного слоя, но и вообще между гетерогенными приложениями,
поскольку SOAP легко решает извечную задачу мостования между СОМ и CORBA. Впрочем, о SQL Server как
о веб-сервисе мы еще поговорим. В-третьих, преимущество поддержки XML в СУБД состоит в том, что на
компьютер конечного пользователя или приложения, работающего с базой данных, не требуется устанавливать
никакой клиентской части, специфичной для данной СУБД, т.к. все, что ему нужно, - это стандартные
протоколы и форматы Интернета, априори поддерживаемые практически всеми современными платформами.
Впервые возможность сохранять (есть еще замечательное слово "персистить") результаты запроса в виде XML
появилась в ADO 2.1 (1999 г.) До этого в ADO 2.0 объект Recordset сохранялся только в частном бинарном
формате ADTG (Advanced Data TableGram), который использовался для передачи recordset'a при удаленном
доступе с помощью RDS.
Скрипт 1
Получается действительно нормальный XML, как видно на Рис.1.
Его можно открыть при помощи объектной модели DOM, выполнить XPath-запрос, возвращающий узлы заказов,
сделанные клиентом по имени Maria Larsson, и другие подобающие XML действия. Что-то можно заложить в
первоначальный SQL-запрос:
SELECT count(1) FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID WHERE c.
ContactName = 'Maria Larsson'
но согласитесь, чтобы показать работу с сохраненным recordset'ом как с XML, часть работы для приличия надо
проделать средствами XPath, а не SQL. По соображениям экономии места данный пример, как и все
последующие, написаны на C#. Обратите внимание, что в нем используется не ADO.Net, а классическая
объектная модель ADO (2.7). Для нее не требуется делать tlbimp из библиотек классов в ...
\Program Files\Common Files\System\ado, потому что соответствующая обертка существует изначально как Primary
Interop Assembly.
В рассмотренном примере XML передавался от ADO к DOM через внешний файл. В ADO 2.5 появилась
возможность сохранения recordset'a в виде XML не только в файл, но и в любой объект, поддерживающий
интерфейс IStream. В Скрипте 2
recordset записывается в поток объекта DOMDocument из СОМовской библиотеки MSXML4
(WINNT\System32\msxml4.dll). Полученный из recordset'a xmlDoc затем подвергается XSLT-преобразованию,
заданному в xslDoc, которое выбирает все элементы, относящиеся к заказчику Maria Larsson. Полученная в
результате преобразования строка записывается в файл, который отображается в браузере.
ПРОДОЛЖЕНИЕ СЛЕДУЕТ
Разрешение проблем контекста безопасности при выполнении DTS пакета в задании по
расписанию
По материалам статьи Microsoft:
INF: How to Run a DTS Package as a Scheduled Job (Q269074)
Информация в этой статье относиться к Microsoft SQL Server версий 7.0 и 2000 (все издания)
Одной из распространённых проблем, связанных с использованием Data Transformation Services (DTS), состоит
в том, что DTS пакет выполняется без ошибок в SQL Server Enterprise Manager, но наблюдаются сбои в работе
DTS пакета, когда он выполняется как задание по расписанию. Обычно, это происходит из-за отличий в
контексте безопасности, когда пакет выполняется как задание и когда он выполняется в интерактивном режиме.
Эта статья призвана помочь в разрешении проблем безопасности, связанных с запуском на выполнение DTS пакетов.
Кто является владельцем DTS пакета?
Пакеты оформленные, как задание по расписанию, соответственно управляются сервисом SQL Agent. Это
задание, как любое другое задание по расписанию, имеет владельца (Owner). Владельцем может быть SQL Server
логин или учетная запись Windows NT.
Определить владельца задания можно следующим образом:
Дважды щёлкните по заданию в Enterprise Manager, и затем посмотрите поле с раскрывающимся списком
Owner.
Контекст безопасности, в котором задание выполняется, определяется владельцем задания. Если задание
принадлежит логину, который не является членом серверной роли Sysadmin, то пакет будет исполнен в контексте
специальной учетной записи SQLAgentCmdExec, и задание будет иметь её права и разрешения.
Как устанавливается владелец задания?
Когда Вы щёлкаете правой кнопкой мыши по DTS пакету и определяете его в виде задания по расписанию,
присвоение владельца этому заданию зависит от того, как SQL Server зарегистрирован в Enterprise Manager.
Если SQL Server зарегистрирован через Windows NT аутентификацию, владельцем задания по расписанию
будет учетная запись, от имени которой стартует сервис SQL Agent. Если SQL Server зарегистрирован в EM с
помощью собственной аутентификации SQL Server (например, под логином SA), владельцем задания будет
тот же самый логин SQL сервера.
Изменение владельца пакета осуществляется следующим образом:
1. Дважды щёлкните по заданию в Enterprise Manager.
Также Вы можете использовать системную хранимую процедуру msdb.dbo.sp_update_job, с помощью которой
можно изменить владельца пакета.
Если Вы запускаете пакет вручную, используя утилиту командной строки DTSrun.exe, контекст безопасности
будет как у учётной записи Windows, под которой Вы зарегистрировались на компьютере. Если Вы запускаете
пакет, используя DTSrun.exe через расширенную хранимую процедуру xp_cmdshell, пакет будет выполнен в
контексте учетной записи, от имени которой стартует сервис SQL Server, при условии, что пользователь,
который выполнил xp_cmdshell, является членом роли Sysadmin. Если пользователь, который выполнил
xp_cmdshell, не включён в роль Sysadmin, то DTSrun.exe выполнится в контексте учетной записи
SQLAgentCmdExec.
Как Windows NT аутентификация используется при подключениях?
Иногда DTS пакет содержит объект, который создаёт подключение к источнику данных используя Windows NT
аутентификацию. Контекст безопасности, используемый для этого подключения, будет тот же самый, как у
контекста пакета, который выполняется. Если пакет запускается из командной строки через DTSRun.exe,
используются права учетной записи Windows NT, под которой зарегистрировались на компьютере. Если
пакет выполняется как задание SQL Server Agent, то подключение будет создано от учетной записью, от
имени которой стартован сервис SQL Agent (принимаем, что владелец пакета является членом роли Sysadmin).
Ниже представлено описание нескольких типичных проблем, с которыми Вы можете столкнуться при запуске
DTS пакетов в виде заданий по расписанию.
Обозначенные буквой диски (Mapped Drives):
Если в пакете используется путь к файлу с обозначенным буквой, распределённым в сети диском, исполнение
пакета по расписанию завершиться неудачно независимо от того, кто является владельцем пакета. SQL Agent -
как сервис Windows NT и любой сервис Windows NT не могут видеть обозначенные буквой, распределённые в
сети диски. Обозначенные буквой диски являются частью профиля пользователя, который загружается при его
входе в сеанс Windows NT. Сервисы не работают с параметрами пользователя. Используйте путь в формате
UNC вместо обозначенных буквой дисков.
Относительный путь (путь через имя диска) может определять текущее расположение пакета (например: C:\).
Если пакет разработан на рабочей станции и используется в задании по расписанию, относительные пути,
использованные в пакете при его исполнении на сервере, могут измениться. Относительный путь это ссылка,
которая может указывать на другое физическое расположение на сервере. Если указываемые в этой ссылке
файлы на сервере не будут находиться в таком же, как на рабочей станции месте, произойдёт сбой в
выполнении пакета.
Использование COM компонент в ActiveX сценариях:
Если компоненты COM (например, запросы Microsoft ActiveX Data Objects (ADO), Remote Data Objects (RDO)
или объекты Decision Support Object (DSO)) вызываются в сценарии ActiveX, эти компоненты должны
существовать на компьютере, на котором DTS пакет будет исполняться. Если Вы выполняете пакет с помощью
DTS Designer в EM или через DTSrun.exe, эти компоненты должны существовать на компьютере, на котором
Вы в этот момент работаете. Если пакет оформлен, как задание по расписанию, необходимые компоненты
должны быть загружены на компьютере, где запущен SQL Server.
DTS пакеты могут использовать пароль владельца и пользовательские пароли. Эти пароли существенны
только для тех, кто может редактировать и исполнять пакеты. Ни один из них не влияет на контекст
безопасности, в котором пакет исполняется.
Разрешения для SQLAgentCmdExec:
Если задание выполняется в контексте учетной записи SQLAgentCmdExec, и учетная запись SQLAgentCmdExec
не имеет прав входа в SQL Server, задание может закончиться неудачно со следующим сообщением об ошибке:
DTSRun: Loading... DTSRun: Executing... DTSRun OnStart: DTSStep_DTSExecuteSQLTask_1 DTSRun OnError:
DTSStep_DTSExecuteSQLTask_1, Error = -2147217843 (80040E4D) Error string: Login failed for user
'NT_name\SQLAgentCmdExec'. Error source: Microsoft OLE DB Provider for SQL Server Help file: Help context: 0
Error Detail Records: Error: -2147217843 (80040E4D); Provider Error: 18456 (4818) Error string: Login failed for user
'NT_name\SQLAgentCmdExec'. Error source: Microsoft OLE DB Provider for SQL Server Help file: Help context: 0
DTSRun OnFinish: DTSStep_DTSExecuteSQLTask_1 DTSRun: Package execution complete. Process Exit Code 1.
The step failed.
Вы должны обеспечить для SQLAgentCmdExec необходимый для правильной работы логин с соответствующими
правами к базе данных.
ССЫЛКИ НА СТАТЬИ
Отечественные статьи
Администрирование CVS
Новые технические статьи Microsoft
BUG: DTS
Package Execution Is Canceled Unexpectedly in a Visual Basic Application
(Q319058)
ФОРУМ SQL.RU
Самые популярные темы недели
Нынче
по небу правильно солнце идет
Вопросы остались без ответа
"Зависание"
транзакции
|
#097<< #098 |
|
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||