Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Служба Рассылок Subscribe.Ru

#090<<  #091

СОДЕРЖАНИЕ

СОВЕТЫ
   Сервис событий в SQL-сервере
   Нумерация записей в запросе
   Настройка Proxy Server для поддержки репликации SQL Server 7.0 через Internet
ПОЛЕЗНОСТИ
   Обновлён SQL Server 2000 Books Online
ССЫЛКИ НА СТАТЬИ
   Новые технические статьи Microsoft
ФОРУМ SQL.RU: САМЫЕ ПОПУЛЯРНЫЕ ТОПИКИ
ФОРУМ SQL.RU: ВОПРОСЫ ОСТАЛИСЬ БЕЗ ОТВЕТА

СОВЕТЫ

Сервис событий в SQL-сервере
Автор статьи: Глеб Уфимцев

Погружение в проблематику

Достаточно нередко у разработчиков клиент-серверных приложений возникает необходимость организовать некий механизм, позволяющий по событию на SQL-сервере уведомить того или иного клиента. Ещё чаще это является розово-голубой мечтой заказчика, чтобы разработчик реализовал такой механизм. Например, при превышении лимитов отгрузки какому-либо потребителю, должны быть немедленно уведомлены менеджеры, работающие с этим потребителем. Некоторые заказчики систем требуют (а мечтают об этом все заказчики без исключения), чтобы при изменении каких-то данных, у остальных пользователей системы эта информация автоматически обновлялась, причем незамедлительно. Здесь не будет обсуждаться целесообразность такого требования (оно имеет много оснований для критики), здесь будут обсуждаться только пути решения. Microsoft SQL-сервер имеет штатное средство для организаций уведомлений - alerts, но это средство имеет весьма ограниченное применение, по большому счету не дающее возможность создать на его основе гарантированно работающий механизм. И вот почему: Связь с клиентской программой может быть осуществлена путем посылки e-mail или эмуляцией посылки "net send". И то, и другое неудобно для получения уведомления.

Средство e-mail неудобно по причинам:

a) нет гарантии доставки, почта может теряться.
b) почта может "застрять" на промежуточных узлах.
c) требуется обязательно наличие протокола TCP/IP
d) требуется наличие smtp-сервера и настройка почтового профиля.
e) требуется особая настройка SQL-сервера, чтобы он смог посылать письма.
f) требуется наличие у каждого клиента, ждущего события, почтового ящика.
g) в клиентской программе требуется организовать почтовый клиент.

Посылка путем "net send" неудобна по следующим причинам:

a) нет гарантии доставки, так как это организовано через средство mailslot, не имеющее такой гарантии.
b) требуется наличие корректного разрешения имен NETBIOS в сети.
c) требуется наличие на клиенте "Клиент для сетей Микрософт".
d) задействован стандартный mailslot, это может иметь пересечение с другими программами.

И в целом средство alerts неудобно необходимостью регистрации каждого клиента в качестве оператора и соответствующей настройкой. Т.е. для простейших случаев alerts применить можно. Но для большинства случаев оно неприменимо.

Известные реализации и концепции

Широкой общественности известны несколько вариантов реализации механизма уведомления сервером клиента. Это:

1. Создание объекта (Extended Stored Procedure или ActiveX), посредством которого SQL-сервер уведомляет клиента через сокеты TCP/IP. При этом на клиенте организована прослушка, т.е. клиентская программа стала сервером TCP/IP.
Недостатки этого метода:
a) Привязка к протоколу TCP/IP. В сети, где используется только IPX, NETBEUI или AppleTalk, такой механизм не применить.
b) Нет асинхронности. Если это событие генерируется из триггера, будут проблемы производительности.

2. Создание объекта (Extended Stored Procedure или ActiveX), посредством которого SQL-сервер уведомляет клиента через named pipes или mailslots. При этом на клиенте организована прослушка того или другого.
Недостатки этого метода:
a) требуется наличие корректного разрешения имен NETBIOS в сети.
b) требуется наличие на клиенте "Клиент для сетей Микрософт".
c) в случае использования mailslot нет гарантии доставки.
d) в случае использования named pipes, это нельзя применить на клиентских компьютерах с операционной системой Windows 95/98/Me, так как named pipe можно создать только в операционной системе на архитектуре NT.
e) Нет асинхронности. Если это событие генерируется из триггера, будут проблемы производительности.

3. Периодический опрос SQL-сервера клиентом (периодическое чтение специальной таблички евентов). Это очень простой путь, но, тем не менее, свободный от большинства вышеперечисленных недостатков. К сожалению, этот метод имеет свои специфичные 2 недостатка: a) получение уведомления может быть задержано на величину таймаута опроса и b) при маленьком таймауте возникает существенный трафик. Тем не менее, при небольшом кол-ве сессий, этот метод вполне пригоден и незаслуженно обойден вниманием.

Предлагаемый вариант решения

Вашему вниманию предлагается вариант решения проблемы, свободный от вышеперечисленных (всех вышеперечисленных!) проблем, но вместе с тем достаточно простой. Идея такова: на сервер помещается некий двоичный объект, который sql-сервер может вызывать (а это может быть только Extended Stored Procedure или ActiveX-объект), имеющий два невзаимосвязанных метода.
Первый метод создает с помощью функции Win32API CreateEvent объект ядра Win32, именуемый "event" с уникальным наименованием, переданным параметром. Далее вызывается функция Win32API WaitForSingleObject, наткнувшись на которую, поток останавливается и стоит в ожидании, пока этот объект ядра не засигналит. Обращаю ваше внимание, на тот факт, что таких объектов ядра может быть создано сколько угодно. Это ограничено только кол-вом хендлов в системе.
Второй метод вызывает объект ядра event по имени, заданным параметром, с помощью функции Win32API SetEvent и выставляет ему свойство "signaled". Как только это произойдет, поток с первым методом пробуждается и возвращает управление вызвавшему процессу. Второй метод, не ожидает результата, а возвращает управление своему вызвавшему процессу сразу же после выставления свойства "signaled". Таким образом достигается асинхронность.
Теперь остается только сделать хранимые процедуры T-SQL, управляющие этим объектом и нужная функциональность "у нас в кармане". Клиентская программа в отдельном потоке запускает хранимую процедуру ожидания события, передавая параметром уникальный признак-адрес. Это может быть и имя пользователя, и имя компьютера, и любая строка. Главное, чтобы это была уникальный идентификатор в пределах клиент-серверной системы. Хранимая процедура вернет результат только в случае, если для этого адресата будет сгенерировано событие. При получении события, процедура перезапускается. При закрытии программы поток ожидания события просто прибивается через TerminateThread.
На первый взгляд эта метода обладает "ужасным" недостатком - существует постоянный коннект с sql-сервером, который большую часть времени ничего не делает. Но это только первое впечатление. На самом деле, задействуются ресурсы здесь только на поддержание коннекта - это что-то несколько килобайт на сессию. И все! Больше никаких осязаемых ресурсов не тратиться, особенно на фоне преимуществ, которые описаны ниже. О дополнительных лицензиях можно тоже не беспокоиться, если выбрана модель лицензирования "Per server". В этом случае с одной машины может быть сколько угодно коннектов к sql-серверу, это все равно будет занимать ровно одну клиентскую лицензию.

Готовое решение

Решение состоит из ActiveX-объекта в виде файла AlgoEvt.dll и двух хранимых процедур spWaitForEvent и spRaiseEvent. Перед использованием этот файл надо поместить на сервер и зарегистрировать ActiveX-объект с помощью системной утилиты regsvr32.exe. Дальше вся работа будет производиться через хранимые процедуры. В готовом решении реализована несколько бОльшая функциональность, чем в описанной концепции. Кроме самого факта события, можно передать также произвольную информацию в виде строки в размере до 250 символов. Каждая процедура имеет два параметра. Первая - это уникальный идентификатор-адрес, о котором говорилось выше, а второй параметр - дополнительная передающаяся информация. spWaitForEvent надо вызвать с клиента из отдельного потока (приоритет потока можно выбрать самый низкий). При получении события, процедуру надо перезапустить. Тайм-аут исполнения запроса надо задать бесконечный.

Решение здесь: SQLEventsService.zip

Преимущества решения

1. Независимость от сетевого протокола и настроек сети. Был бы коннект к sql-серверу.
2. Асинхронность. Инициатор события не ждет, когда клиент получит событие. Можно инициировать события в триггере, возврат происходит моментально.
3. Отсутствие задержки доставки.
4. Гарантия доставки.
5. Отсутствие практических ограничений на кол-во клиентов, ожидающих события.
6. Не тратятся ресурсы, за исключением незначительных ресурсов на поддержание соединений.
7. Отсутствие "левого" сетевого трафика.
8. Не требуется дополнительных сервисов и программ.
9. Не требуется дополнительных настроек sql-сервера.

Нумерация записей в запросе
Автор статьи: Чичилимов Александр

Время от времени на форуме Microsoft SQL Server возникает вопрос по нумерации записей в запросе. На досуге я написал DLL, которая решает этот вопрос без применения временных таблиц. В представленном ниже ZIP-архиве находиться два файла Counter.dll и Counter.sql. Всё описание и руководство к использованию содержит файл Counter.sql, вместе со скриптом.

Скачать файл можно тут: Counter.zip

Настройка Proxy Server для поддержки репликации SQL Server 7.0 через Internet
По материалам статьи Microsoft: Configuring Proxy Server for SQL Server 7.0 Replication Over the Internet

Эта статья посвящена совместному использованию Microsoft SQL Server 7.0 и Microsoft Proxy Server для обеспечения поддержки репликации через Internet и защиты баз данных. Репликация может осуществляться между базами данных, находящимися на одном сервере или на разных серверах, соединение между которыми осуществляется через LAN, WAN или Internet. Используя связку SQL Server и Microsoft Proxy Server, можно реплицировать данные через Internet. Для этого необходимо иметь возможность внесения изменений в конфигурацию топологии сети, понимать методы защиты сети и СУБД, а также, иметь возможность настройки Proxy Server и SQL Server.

Конфигурация топологии сети

Внесение изменений в конфигурацию топологии сети - это первое, что необходимо рассмотреть, для обеспечения взаимодействия SQL Server и Proxy Server. Proxy Server обеспечивает прямое подключение через Internet к внутреннему серверу, на котором запущен SQL Server в роли издателя. Этот SQL Server обеспечивает в репликации исполнение ролей издателя (publisher) и дистрибутора (distributor). Второй SQL Server исполняет роль подписчика (subscriber), в нашем примере, это pull subscriber, а репликация между ними организована через Internet.

Издатель,
 Дистрибутор 
   Прокси     Интернет     Подписчик 
 ЛВС   ЛВС   ЛВС 
Windows NT
MS SQL Server
  Windows NT
Windows NT Option PN IIS 4.0
Proxy Server
      Windows NT
MS SQL Server

Рисунок 1. Топология сети

Требования к системному программному обеспечению, необходимому для организации работы Proxy сервера:
- Microsoft Windows NT version 4.0 с установленным Service Pack 4;
- Windows NT 4.0 Option Pack;
- Microsoft Internet Information Services (IIS) version 4.0;
- Proxy Server version 2.0.

Требования к системному программному обеспечению, необходимому для обеспечения работы MS SQL Server:
- Windows NT Server 4.0 с установленным Service Pack 4;
- Microsoft Internet Explorer version 4.01 с установленным Service Pack 1;
- SQL Server 7.0.

Proxy сервер должен быть настроен как multihomed сервер, что предотвратит доступ неавторизованных пользователей из Internet к внутренним ресурсам сети. Multihomed Proxy сервер имеет две сетевые платы (NIC), которые обеспечивают безопасность подключений в гомогенных сетях. Первый NIC называется внешним Proxy интерфейсом и изолирует пользователей Internet от внутренней сети. Внутренняя сеть имеет доступ к Proxy серверу через второй NIC, называемый внутренним Proxy интерфейсом. Соединение может быть установлено между внутренним и внешним Proxy интерфейсом, когда внутреннему пользователю предоставлено соответствующее разрешение Proxy сервером.
Proxy Server отслеживает, какие сервисы или пользователи из внутренней сети могут использовать подключение или соединение с портами на Proxy сервере. Такие подключения требуется определять до того, как будут определены любые внешние пользователи или серверы из Internet, которые смогут обращаться к данным или ресурсам внутренней сети.
Чтобы обеспечить подключение к сервису Proxy, пользователь Internet должен ввести соответствующую информацию о Proxy сервере, что бы использовать внешний Proxy интерфейс и организовать подключение к одному из его портов. Организация подключения к порту на Proxy сервере обеспечивает доступ только к тем сервисам Proxy сервера, на которые пользователь имеет разрешение, например, к каталогам и файлам. Пользователь не сможет получать прямой доступ к сервисам или иным ресурсам внутренней сети. Чтобы получить доступ к ресурсам внутренней сети, внутренний пользователь или сервис, обладающий соответствующими разрешениями, должен соединиться с портом, используя внешний Proxy интерфейс. В течение процесса связывания (binding process), Proxy сервер подтверждает подлинность пользователя и, если он имеет необходимые разрешения, разрешает подключение. Представленная на рисунке №1 конфигурация подключения через Internet не затрагивает основные свойства безопасности SQL Server. Легитимные во внутренней сети пользователи могут обращаться к данным SQL Server, однако, чтобы получить доступ к SQL Server и любой из публикаций, пользователи из Internet должны сначала указать IP адрес, потом соединиться с соответствующим портом на Proxy сервере, а затем, обеспечить регистрацию на SQL Server посредством действительной учетной записи.

Использование подсетей

Не определяйте заданный по умолчанию шлюз для внутренних подсетей, а также для работы SQL или Proxy серверов. Заданный по умолчанию шлюз внешнего интерфейса должен указать на IP адрес соответствующего маршрутизатора.

ПРОДОЛЖЕНИЕ СЛЕДУЕТ

ПОЛЕЗНОСТИ

Обновлён SQL Server 2000 Books Online

Выложена для загрузки обновлённая документация по Microsoft SQL Server 2000. Обновлённый SQL Server Books Online включает документацию конечного пользователя, которая относится к SQL Server 2000 и имеет незначительные изменения.

Обновлённый SQL Server 2000 Books Online доступен для загрузки как cab-файл (.cab). Этот файл содержит множество файлов, которые были упакованы в один файл. Вы можете извлечь файлы из архива, используя утилиту Expand.exe из поставки Microsoft Windows.

Инструкция по загрузке и установке обновления

Загрузить файл English – версии

Размер загружаемого файла - 35.8 МБ
Ориентировочное время загрузки для канала 28.8 kbps - 2 часа 54 минуты

ССЫЛКИ НА СТАТЬИ

Как создать корпоративную автоматизированную систему для расчета прозрачных плановых затрат
Автор: К. Шлемензон
Для крупного предприятия планирование деятельности обычно заключается не в использовании методов оптимизации, а в вариантных расчетах с оценкой ожидаемой себестоимости и прибыли по товарной продукции. В процесс калькулирования задействовано много людей, каждый из которых решает свои локальные задачи. Они вынуждены обмениваться информацией друг с другом. Не редки ситуации, когда один работник изменил свои цифры, а другой перенос данных и пересчет не выполнил. Уследить за этим очень трудно. Наличие компьютерной сети частично облегчает работу по передаче данных, но принципиально проблему не решает. Степень достоверности конечных плановых цифр не всегда на высоте. Большим желанием начальника ПЭС является автоматизация пересчета плана загрузки предприятия без привлечения множества работников. В идеале хотелось бы, чтобы основная масса экономистов, связанная с калькулированием продукции, собирала и вводила в ПЭВМ первичную информацию, а все вариантные расчеты выполнял один человек, например, сам начальник ПЭС... [подробнее]
Некоторые соображения о роли и месте технологии OLAP
Автор: Interface Ltd.
Для сложных систем характерно то, что управлять ими приходится, как правило, в условиях не полной информации, незнания закономерностей функционирования и постоянного изменения внешних факторов. Поэтому процесс управления имеет итерационный характер. После принятия решения и применения управляющего воздействия необходимо вновь оценить состояние, в котором находится система, и решить вопрос, о том правильно ли мы движемся по намеченному пути. Если отклонения нас не удовлетворяют, то необходимо переопределить процесс управления...
[подробнее]
Методология функционально-стоимостного анализа ABC (ФСА)
Автор: В. Ивлев, Т. Попова
Многие пользователи считают функционально-стоимостной анализ (ФСА) достаточно сложным для понимания. Возможно это связано с тем, что существует слишком мало информации, объясняющей, что же он собственно из себя представляет. Целью данной статьи является раскрытие сущности функционально-стоимостного анализа, простоты его применения, а также исключение элемента загадочности, связанного с ним...
[подробнее]
Работа с данными вчера, сегодня, завтра. DataReader
Автор: Serg Vorontsov
В данной публикации мы рассмотрим то, что идеально подходит под поговорку «все новое, это хорошо забытое старое». В данном случае нельзя сказать, что DataReader это хорошо забытое старое. Скорее даже наоборот – это то, чем активно оперировали в предыдущей технологии доступа к данным ADO (Ole Db) и то, что очень удобно вписалось в абсолютно новую идеологию доступа к данным такую как ADO.NET...
[подробнее]
Сортировка в DataGrid
Автор: Dimon aka Manowar
Достаточно простой вопрос сортировки данных в DataGrid, неплохо освещенный в тех же квикстартах, оказывается все таки вызывает вопросы его реализации у начинающих ASP.NET программистов. Что в итоге и послужило поводом написания этой статьи...
[подробнее]

Новые технические статьи Microsoft

FIX: Unable to Perform Automated Installation of SQL 7.0 Using File Images (Q229875)
How to Enable Commerce Server 2000 OLAP Reports Over HTTPS with SQL Server 2000 (Q280431)
BUG: Dialog Box Opens During Backup Process Prompting You To Insert Disk in Drive A (Q281345)
HOW TO: Send E-Mail Without Using SQL Mail in SQL Server (Q312839)
PRB: Removal of Guest Account May Cause Handled Exception Access Violation in SQL Server (Q315523)
BUG: Running a Stored Procedure by Using a Remote Procedure Call May Cause an Exception in the int_sendreturnparam Function (Q319126)
FIX: Anonymous or Local Merge Subscriber Fails with Error 8152 (Q319258)
PRB: SQL Server 2000 Cluster May Not Bind to Port If SQL Server IP Address Is Changed (Q319578)
INF: Frequently Asked Questions - SQL Server 7.0 - Failover (Q195761)
INF: Clustered SQL Server Do's, Don'ts, and Basic Warnings (Q254321)
INF: Reset Proxy and the SQLAgentCmdExec Account (Q264155)
INF: How to Configure SQL Mail (Q263556)
INF: Understanding and Troubleshooting the Copy Database Wizard in SQL Server 2000 (Q274463)
FIX: Error Message 20026 When You Upgrade a SQL Server 7.0 Republishing Merge Subscriber to SP2 (Q276533)
PRB: Foreign Key Conflicts at Merge Subscriber Result in DELETE During Next Upload (Q307482)
FIX: "Incorrect Syntax Near COLLATE" During DTS Transfer on SQL Server 7.0 Database Restored to SQL Server 2000 (Q288411)

ФОРУМ SQL.RU: САМЫЕ ПОПУЛЯРНЫЕ ТОПИКИ

Репликация на дискетах или по мылу
Нынче по небу правильно солнце идет
SQL вешает систему на 2х-процессорной тачке :(
Шмат из нутрей
Как отредактировать теблицы SQL через MS ACCESS 2000 ?
Replication, ntext & NULL values
Execute & Return

ФОРУМ SQL.RU: ВОПРОСЫ ОСТАЛИСЬ БЕЗ ОТВЕТА

Перекачать процедуры из БД в БД
double precision однако!
!!!! problem in merge replication !!!!
Может у кого есть скриптик валидации штрихкода EAN-13?
IMPORT E-Mail list from EXCHANGE Server into table
Вопрос по select
Материализованные представления - кто прокомментирует?
MDX (Использование Member properties)
Exporting Data to dbf
Extended Stored Proc......
jobs
Запрос с разными значениями вып. разное время
Как для конкретного логина получить список всех доступных (selectable) таблиц ?
Error: 15457, Severity: 0, State: 1
Обновленный
Replication Task
ASP вызов sp, RETURN_VALUE (различия в SQL 7.0 и 2000) наблюдения
Перевод (транслирование) в другой Collation.
Подскажите как проставить в таблицах not for replicaton
как в COALESCE запихать переменную типа table
Восстановление DB из резервной копии. Погибаю!!!

#090<<  #091

Вопросы, предложения, коментарии, замечания, критику и т.п. присылайте Александру Гладченко на адрес: mssqlhelp@pisem.net

sql.ru

Описание рассылки
 Поиск на SQL.RU
Искать: 
Результатов на странице: Формат:
Тип запроса: Раздел:
МИНИФОРМА
ПОДПИСКИ




http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное