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

MS SQL Server

  Все выпуски  

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


Информационный Канал Subscribe.Ru


#122<<  #123

СОДЕРЖАНИЕ

1.СОВЕТЫ
1.1.SQL Server Notification Services. ПРОДОЛЖЕНИЕ
2.ССЫЛКИ НА СТАТЬИ
2.1.Отечественные статьи
2.2.Новые технические статьи Microsoft
2.3.Англоязычные статьи
3.ФОРУМ SQL.RU
3.1.Самые популярные темы недели
3.2.Вопросы остались без ответа

СОВЕТЫ

SQL Server Notification Services
Доклад на конференции Microsoft «Платформа 2003» и на XII ежегодной конференции проводимой TALGAR «ТЕХНИКОН 2002»

Автор: Александр Гладченко

По материалам Notification Services Books Online и презентации, которую подготовил Алексей Шуленин.

1.Введение
2.Распространенные бизнес-сценарии оповещений
2.1.Потребительские
2.2.Промышленные
2.2.1.Жизненный цикл
2.2.2.Операционная поддержка
2.2.3.Бизнес-логика
2.2.4.Информационная поддержка
2.3.Практический пример использования сценариев оповещения в United Airlines
3.Основные понятия
4.Как выглядит оповещающее приложение
4.1.Более подробно о конвейере сервиса оповещений.
4.2.Итак, еще раз
4.3.Конвейер в архитектуре оповещений
5.Архитектура Notification Services
5.1.Архитектура управления подпиской
5.2.Архитектура Event Collection
5.3.Провайдеры событий
5.3.1.Стандартные и пользовательские провайдеры
5.3.2.Hosted и Non-Hosted (Independent) провайдеры
5.3.3.Пакетные события
5.3.4.Функциональность провайдера событий

5.4 Передача событий в коллектор

· Event Object
· XMLLoader Object
· Event Submission SQL Server Stored Procedures

5.4.1 Передача через EventObject

· Пользовательский провайдер.
  - Принимает данные из внешнего источника.
  - Создает и наполняет объект события данными.
  - Вызывает метод “Write” Event Collector’a для каждого события.
  - Вызывает метод “Commit” Event Collector’a, когда пакет событий сформирован, который вставляет события в таблицу.
  - Может сказать Abort.
  - Обычно события передаются пакетами для лучшей производительности Генератора.
  - Когда сервис NS стопится, хост провайдеров вызывает метод Terminate, который может быть реализован в пользовательском провайдере.

5.4.2 Передача через XMLLoader

· Используется SQLXML 3.0.
· Пользовательский провайдер.
  - Принимает данные из внешнего источника.
  - Создает объект EventLoader на основе аннотированной схемы, задающей XML-представление таблицы событий на SQL Server.
  - Стандартными средствами XML BulkLoad документ грузится в таблицу.
    ° Таким образом, здесь пакет событий передается в виде XML-документа.

5.4.3 Хранимые процедуры для передачи событий

· Event Class stored procedures
  - NSEventBeginBatch<eventClassName>
    ° ProviderName, BatchId out

  - NSEventWrite<eventClassName>
    ° BatchId, Column1, Column2, ...

  - NSEventFlushBatch<eventClassName>
    ° BatchId

· Создаются для каждого уведомляющего приложения
  - Во время запуска nscontrol create
· При создании используется схема описания класса событий, определенная в ADF (Application Definition File)

5.4.4 NSEventSubmitBatchEventClassName

· Предполагается, что внешние события уже лежат в виде записей в каких-то таблицах
  - @EventsQuery определяет запрос для их выборки
  - @PostQuery – возможные последующие действия по очистке временных таблиц, ...

· Пример
...


SET @eventQuery = SELECT stocksymbol, stockprice from RDT1 UNION SELECT stocksymbol, stockprice from RDT2
SET @postQuery = DELETE RDT1 DELETE RDT2
SET @providerName=‘StockEP’
EXEC NSEventSubmitBatchStockEvent @providerName, @eventQuery, @postQuery

5.5 Архитектура обработки подписок

После того, как события собраны в таблице, можно преступить к обработке подписки. Анализ принадлежности событий подпискам выполняет генератор.

Чтобы сгенерировать оповещение, разработчик создаёт одно или более правил для каждого приложения. Эти правила представляют собой Transact-SQL запросы, которые определяют состав относящихся к подписке событий, а также все другие условия, которые должны быть выполнены при генерации оповещения.

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

Созданное таким образом оповещение фактически не будет немедленно отослано подписчикам. Вместо этого, генератор записывает оповещения в специальную таблицу. Когда пакет оповещение готов к отправке, он форматируется и рассылается дистрибутором.

Обработка оповещений может быть и более сложной, чем прямое сопоставление события подписке. Оповещения могут генерироваться в соответствии с преопределённым для подписки расписанием и могут использовать хронологические данные.

Если приложение использует подписки с расписанием, при их обработке, генератор видит только те подписки, которые соответствуют этим расписаниям. Например, если генератор запускается каждые 15 минут, в 8:00 генератор обработает все подписки, расписание которых укладывается в диапазон между 7:45 и 8:00.

Если приложение использует хронологические данные, оно может хранить данные в специальной таблице. Применяя правила, предписанные для приложения, приложение использует эту таблицу для того, чтобы хранить события или генерировать оповещения.

5.5.1 Генератор

· Сопоставляет пришедшие события подпискам, чтобы определить, какие из них должны генерировать уведомления.
· Правила соответствия описываются при помощи SQL.
  - Это просто join записей из таблицы событий и таблицы подписок.
  - Может быть задействован весь функционал SQL: хранимые процедуры, транзакции, ...


SELECT StockNotificationNotify(
            S.SubscriberId,
            S.DeviceName,
            S.Locale,
            S.Symbol,
            E.Price)
FROM
            StockEvents  E,
            StockSubscriptions S
WHERE
     E.Symbol = S.Symbol  AND
     E.Price >= S.TriggerPrice

5.5.2 Функция оповещения

· Notify Function.
  - В предыдущем примере – StockNotificationNotify ( S.SubscriberId, S.DeviceName, S.Locale, S.Symbol, E.Price).
  - Кладет информацию о событии, соответствующем данной подписке, в таблицу оповещений.
    ° Т.е. в таблице оповещений в виде записей хранятся «сырые» (не отформатированные) оповещения.

  - NS генерирует уникальную функцию оповещения, которая программируется под каждый класс оповещений.
    ° Так, что она «знает» имя и тип каждого поля в таблице оповещений.

5.5.3 Квант генератора

· Интервал времени, определяющий с какой частотой будут срабатывать системные функции Notification Services.
· Задается в ADF


<ApplicationExecutionSettings> <QuantumDuration>P0DT00H05M00S</QuantumDuration>
 ...
</ApplicationExecutionSettings>

· Выбор кванта позволяет найти баланс между скоростью работы приложения и потреблением ресурсов.
  - Чем меньше квант, тем чаще срабатывает генератор.
· По умолчанию 1 мин.

5.5.4 Правила подписки

Оперируя генератором с помощью определённых на Transact-SQL сценариев логики работы приложения, можно создавать правила следующих двух типов:

· Subscription event rules – правила для подписанных событий.
  - Как генерировать оповещение для данной подписки, когда произошло событие данного класса.
  - Для подписок, основанных на событиях.
    ° Известить, когда курс MSFT перевалит за $70.00.
  - Содержится внутри класса подписки, ссылается на класс событий.
  - Сюда же может входить event chronicle rule (см. дальше).
· Subscription scheduled rules – правила подписок по расписанию.
  - Как генерировать оповещение, когда наступило время Ч.
  - Для подписок, основанных на расписании
    ° Присылать курс MSFT в 13:00 с пн по пт
  - Сюда же может входить chronicle rule

5.5.5 Поддержка хроники событий

· Данные оповещений могут сохраняться в таблицах хроники после того, как оповещение было отправлено.
  - Например, для подготовки summary.
· Event Chronicle Rules определяют правила (insert, update, delete) в таблицах хроники.
· Определяются в классе события.
  - <ChronicleRule>
· Или в классе подписки (см. пункт: Правила подписки).
  - <EventRules>

5.5.6 Последовательность срабатывания правил

· Как мы уже знаем, подписка может содержать несколько event rules и несколько scheduled rules.
· Нет предопределенного порядка срабатывания правил одного класса внутри подписки.
  - Это следует иметь в виду при разработки бизнес-логики под каждое правило.
· В остальном порядок срабатывания зависит от установки <ProcessEventsInOrder> в <ApplicationExecutionSettings> в ADF.
  - True означает субквантовую последовательность.
    ° Пакеты событий обрабатываются строго в порядке поступления.
    ° Сначала к ним применяются event chronicle rules, затем - subscription event rules.
    ° Подписки по расписанию также срабатывают в порядке очередности в свое время до или после обработки пакета в зависимости от того, когда он пришел.
  - False означает квантовую последовательность.
    ° Порядок обработки пакетов событий внутри кванта никак не соблюдается, они все обрабатываются синхронно.
    ° Гарантируется только порядок срабатывания по типам правил: Event chronicle rules, Subscription event rules, Subscription scheduled rules.

5.5.7 Лимиты по времени

· Когда нагрузка на генератор высока, он может не успеть обработать все, что полагается в этом кванте.
· Можно ему сказать, чтобы он не обрабатывал хронику старше <ChronicleQuantumLimit> и события подписки старше <SubscriptionQuantumLimit>
  - С одной стороны это все равно уже, скорее всего, неактуально
  - С другой стороны позволит ему нагнать запаздывание
· Дает возможность установить баланс между скоростью работы и корректностью данных.
· Задается в квантах.
  - По умолчанию, 1440 и 30, соответственно.

5.5.8 Функциональность генератора

Event-triggered subscriptions
Известить меня, как только курс акций Microsoft перейдёт границу $60.
Scheduled subscriptions
Посылай мне оповещения о стоимости моего портфеля акций регулярно в 17:00 с понедельника по пятницу.
Application State
· История событий.
  - Курс акций MS на последних торгах составил $75.
  - Вчера температура воздуха в Сиэтле была 12°С.
· История подписчика.
  - Пришли мне все документы, модифицированные с момента последнего уведомления .
Leverage external data
Возьми из базы мою персональную информацию и добавь ее к уведомлению.

5.6 Архитектура форматирования и рассылки оповещений

Форматирование и рассылка оповещений выполняется дистрибутором. После того, как генератор создал пакет оповещений, дистрибутор считывает данные о подписчиках для каждого оповещения, определяя, какое требуется форматирование. После этого, дистрибутор соответствующим образом форматирует оповещение и посылает его, используя один из каналов доставки, например: SMTP сервер (Simple Mail Transfer Protocol).

5.6.1 Схема работы дистрибутора

· Для каждого Notification Class генератор подготавливает «сырые» оповещения
  - Хранятся как записи в таблицах SQL Server.
· Цикл работы дистрибутора.
  - Периодически сканирует таблицы в поисках пакетов оповещений, готовых к распространению.
  - Форматирует «сырые» данные оповещений из SQL Server.
  - Производит сборку отформатированных оповещений в пакеты, специфичные для протокола доставки.
  - Доставляет пакет по протоколу (HTTP, SMTP, …).
  - Обрабатывает ошибки доставки.

5.6.2 Форматирование контента

· Превращает «сырые» оповещения из таблиц SQL Server в сообщения, удобные для восприятия подписчиком.
  - При этом учитывается язык, региональные настройки и тип устройства.
· Определяется на каждый NotificationClass.
  - Оповещения о биржевых котировках, очевидно, выглядят иначе, нежели расписание авиарейсов.
· Встроенный XSLT Formatter.
· Можно также написать свой.
  - Реализовав интерфейс IcontentFormatterInterface.
  - Методы Initialize, ContentFormat, Close.

5.6.3 Каналы доставки

Сервис оповещений не занимается непосредственно доставкой оповещений. Он использует каналы доставки, которые являются внешними службами, такими, как SMTP сервер. Сервис оповещений посылает оповещения по одному или более каналам доставки, которые упаковывают оповещения в пакет соответствующего протокола и затем отсылают его по назначению. Сервисы доставки занимаются рассылкой самостоятельно.

Сервис оповещений использует следующие, наиболее распространённые протоколы, которые обеспечивают стандартный набор каналов поставки для оповещающих приложений. Для каждого из этих протоколов может быть задано несколько каналов доставки:

· SMTP протокол для оповещений, рассылаемых через Microsoft Exchange Server или другой SMTP сервер.
· Расширенный HTTP протокол, который может использоваться для Simple Object Access Protocol (SOAP), SMS, .NET Alerts или другие, основанные на HTTP протоколы.
· Протокол работы с файлами для посылки оповещений в виде файлов операционной системы, используемый, прежде всего, для отладки программ.
· Дополнительные протоколы, которые может выбрать разработчик прикладных программ.

Чтобы обеспечить необходимую логику повторных попыток доставки, контроль эффективности и облегчить разрешение проблем, сервис оповещений хранит информацию о доставке в таблице оповещений. Каналы доставки имеют обратную связь, которая информирует об успешной или неудачной доставке каждого оповещения. При этом, обновляется таблица оповещений, в которой храниться такая информация.

Вы можете настроить сервис оповещений так, что автоматически будут предприниматься повторные попытки неудавшейся доставки, причём, с заданной частотой и в заданный интервал времени, после чего оповещение будет помечено, как неудавшееся.

5.6.4 Дайджест и мультикаст

В дополнение к стандартному форматированию типа сообщение - в - сообщение и соответствующей доставке, сервис оповещений предлагает вам ещё две опции: дайджест рассылка (группирующая в одном оповещении множество сообщений для отдельного подписчика) и мультикаст рассылка, которая посылает отдельное оповещение множеству подписчиков.

· Дайджест: когда несколько индивидуальных оповещений для данного подписчика комбинируются в одно.
  - Напр., оповещения о курсе акций MSFT, IBM, CSCO,… посылаются как одно совокупное оповещение.
  - Можно назначить на каждый Notification Class.
  - Способствует повышению производительности.
· Мультикаст: одно и то же оповещение рассылается нескольким подписчикам.
  - Напр., прогноз погоды в Москве, очевидно, одинаков для всех на него подписавшихся.
  - Можно назначить на каждый Notification Class.
  - Форматирование происходит один раз.
  - Нижележащий протокол может выбрать посылку одного сообщения или каждого отдельно.
  - Меньшая нагрузка на каналы.

5.6.5 Логика повторных попыток

· Обрабатывает сбои доставки.
  - Если доставка не состоялась, дистрибутор может предпринять повторные попытки.
· Разработчик уведомляющего приложения задает расписание повторных попыток на каждый класс оповещений (и на каждый протокол).
  - Кол-во попыток и интервалы.
· Если оповещение устареет раньше, чем закончится расписание, оно не будет доставляться.
· Если расписание закончилось безуспешно, оповещение помечается флажком done & failed.
  - Пылесос периодически чистит как успешно доставленные, так и не состоявшиеся оповещения.

5.6.6 Взаимодействие с Message Queuing и .NET Alerts

Сервис оповещений и Microsoft .NET Alerts являются дополняющими друг друга технологиями. После того, как сервис оповещений создал оповещение, доставить его подписчикам может служба .NET Alerts Web, которая может использовать ряд устройств, таких, как e-mail, Microsoft Windows Messenger или мобильные телефоны.

Сообщениями в очереди могут быть и события от оповещающего приложения, которые отправлены посредством MSMQ или Microsoft BizTalk через каналы доставки, используемые этим приложением.

5.6.7 Функциональность дистрибутора

Formatting · Выбор модели форматирования (xslt или пользовательское).
· Зависит от устройства (мобильный тел., email, Instant Manager, ...).
· Зависит от региональных предпочтений (формат даты, валюты, язык, ...).
Multi protocols Delivery
· File, SMTP, .NET Alerts.
· Пользовательские протоколы доставки.
· Среда расширения для доставки, базирующейся на http.
Digested notifications
· Извещать меня каждый час о горячих новостях финансового рынка (присылай мне все в одном сообщении).
· Пришли мне список всех документов, модифицированных с момента последнего уведомления.
‘Multicast’ notifications
· Форматирование происходит один раз для всей группы.
· Одно и то же сообщение рассылается многим подписчикам.
· Пришли мне прогноз погоды по Москве и области.

5.7 Приложение управления подписками

· Пишется в виде:
  - Управляемого кода: ASP .NET, C#, VB.Net, ...
  - Неуправляемого кода: ASP, C++, VB6, ...
· Работает с 3 классами:
  - Subscriber
    ° Представляет того, кто получает оповещения.
    ° Обычно один на пользователя.
  - Subscription
    ° Какая информация и когда должна отправляться.
    ° Несколько подписок на одного подписчика.
  - SubscriberDevice
    ° Куда отправляется информация.
    ° Несколько устройств на подписчика.
· Метод Add добавляет свойства объекта в таблицу SQL Server.

5.7.1 Примеры существующих приложений управления подписками

Система SmartDelivery, разработанная компанией Centerpost на основе платформы Microsoft .NET, осуществляет рассылку диалоговых оповещений и другой информации клиентам и своим служащим; используя голосовые сообщения, беспроводную связь, электронную почту, факс и Microsoft .NET Alerts.

Другая система: MobileSys Network DeliveryChannel (MNDC) является приложением, работающим с Microsoft SQL Server 2000 Notification Services. MNDC позволяет рассылать ключевую информацию и предупреждения в виде оповещений от SQL Server по беспроводным линиям связи на обычные телефоны или мобильные устройства.

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

[Содержание]

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

Отечественные статьи

СИСТЕМА.ADO.OLEDB.JET.Access Violation при передаче неполного параметра
Проблема обнаружена под операционной системой Windows 2000 SP3, в среде Delphi6, Delphi7 (скорее всего не зависит от версии Delphi) с использованием Microsoft Jet DB Engine версия 4, SP3...
Многопоточный доступ к базам данных
По этой теме очень мало информации, особенно в части, касающейся доступа к SQL-серверам (например IB). Мне пришлось несколько дней активно заниматься всем этим – не нашел достойной замены для VirtualTree и решил заполнять дерево с помощью потока. Отмечу, что мои ранние попытки использовать потоки для обращения к Interbase не увенчались успехом, да и дискуссии по теме на форуме epsylon.public.interbase не особо вдохновляли. Жизнь заставила пересмотреть подходы к проблеме и вот что получилось...
Наследование реализации в распределенных объектных системах
Как известно, объектно-ориентированное программирование — это методология, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром того или иного класса....
Маленькие хитрости: StoredProc становится удобнее...
Примерно через неделю после того, как программист впервые сталкивается с компонентом TStoredProc, предназначенным для вызова хранимых процедур БД, приходит понимание, что для работы с процедурами, которые не возвращают наборов данных (курсоров) лучше работать через один и тот же компонент, просто перенастраивая его. Итогом становится нагромождение однотипных строк кода, которые делают одно и то же. Сэкономлю вам еще одну неделю и предложу метод, который позволяет, как минимум, сократить количество строк, которые надо писать для вызова хранимых процедур...

[Содержание]

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

HOW TO: Read and Write a File to and from a BLOB Column by Using Chunking in ADO.NET and Visual Basic .NET
HOW TO: Read and Write a File to and from a BLOB Column by Using Chunking in ADO.NET and Visual C++ .NET
HOW TO: Troubleshoot a SQL Server Desktop Engine 2000 Installation and Upgrade
INF: Transaction Log Grows Unexpectedly or Becomes Full on SQL Server

[Содержание]

Англоязычные статьи

Building a Demo Server - Part 2 Moving Data
Steve Jones
Ahh, the demo server. If your company is selling things, you probably will get asked to setup a system that allows the sales people to demonstrate your products without affecting live or production systems. Sort of a playground where salespeople and customers can make changes, try out the system and simulate any customizations you offer for potential customers or clients.
User-defined Data Type Basics
Don Frazier
As SQL Server DBAs, most of us are familiar with native column data types like INTEGER, DATETIME, CHAR, DECIMAL, etc. From a system point of view, these types are necessary so SQL Server can efficiently store and manipulate the data stored in the column. But these intrinsic data types don't really offer much value when it comes to modeling real-world entities.
Securing Your SQL Server
by Ron Talmage
A growing consciousness of security has brought Microsoft SQL Server database security into focus as never before. Planning for database security should begin early in the development process and there are important vulnerabilities that you need to prevent in your application's SQL Server.
Beware of Mixing Collations - Part 1
by Gregory A. Larsen
A few months back I was running a stored procedure (SP) that performed a cross database joins on our SQL Server 2000 box. This particular procedure was processing records from a table in one database (database A), that was originally created on our SQL Server 2000 box, while also processing records from a table in another database (database B), that was also on our SQL Server 2000 box, but was created by restoring a SQL Server 7.0 database backup. The SQL Server 7 machine had a different character set and sort order than our SQL Server 2000 database. The SELECT statement the SP was running was joining records from the table in database A with the table in database B on a varchar key field. Can you imagine what happened? The SP failed with a "collation error".
Using SQL Trace to Audit Database Access
Haidong Ji
As a new DBA, you will probably walk into an environment that is poorly documented and nobody has any idea of how many SQL Servers are on the network (To find out this, see one of my FAQs). All developers are in the SYSADMIN role on both the development server and production server. In addition, you'll need to schmooze with the network people so they could give you access to the SQL servers that you are supposed to administrator; You will need to monitor the hard drive spaces on each server; You'll need to perform a benchmark analysis for all the servers you're responsible for later tuning; You will need to create maintenance plans for each server; You will need to practice emergency recovery; You will also need to test and practice software upgrade, since about half of your servers are in SQL 7.0; You will need to help the developers tune their queries and convince them that they really should be using stored procedures, etc. The list just goes on and on

[Содержание]

ФОРУМ SQL.RU

Самые популярные темы недели

Boys & Girls нужна информация для простой бд!
Среда программирования под MS SQL
Глюк с округлением
База данных - хранилище объектов
Кто на чем пишет клиентов под SQL Server?
ПОМОГИТЕ девушке установить SQL!!! PLEASE...
Новость No.1 - ICQ Active List SQL.RU
Дистрибьютор на отдельный сервер (за и против)
IIS+SSL+SQL
Атрибуты сущностей в отдельных таблицах
Семинар: Организация репликации MS SQL Server 2000 через интернет
Минус SQL как языка или мое незнание?
проверка прав пользователя
Скопирвать временно табличку с данными + добавить поле
Как ускорить запрос?
Макрозапрос с временной таблицей
генерация значения на основе max
Как автоматом изменять View?
Посоветуйте по строке запроса для MS SQL
Дефрагментация базы данных (Тема для обсуждения)
переменные в ХП как поля рекордсета
Отражение состояния SP на клиенте (ProgressBar)
Хранимые процедуры MS SQL
SQL2000+Delphi+ADO
Существует ли возвомность зеркалирования MS SQL?
почему это не тормозит и как с этим бороться? [new]
Создание запроса для вычисления остатков по счетам
DTS по расписанию не проходит...СПАСИТЕ
Обрезается строка
Где можно найти (взять и т.д.)
проблема родственных связей
Возможно ли из процедуры запустить какой-либо .exe файл?
Про гетерогенные запросы
Загрузка файлов XLS c FTP
Как заставить сервер работать?
Спасите!!! Сдохла база....
загрузка файла в таблицу с полями ID INT IDENTITY(1,1), FileBody IMAGE
Как выделить число из строки ?
Подскажите, почему TableScan если есть индекс?
Как выбрать из всего множества ближайшее по времени значение?
Microsoft SQL Server 2000 Resource Kit: где это взять?
Replication - Distributor !!!
Случайное заполнение и построение таблиц
Как добавить поддержку кирилицы в ErWin4.0
Можно ли передать в триггер переменную ?
Смена имени у SQL сервера
Упала БД на MS SQL SERVER 2000
IS_MEMBER
Репликация + Navision Attain
help!!!
Kak polu4it CREATE TABLE iz SYSTEMI

[Содержание]

Вопросы остались без ответа

Not associated with a trusted SQL Server connection???
error 2453
в свойствах расписания соответствующий чекбокс стоит на no end date ...
Репликация (и ее снапшот)
SyncML
Как безболезненно поменять DBuser на DBRole?

[Содержание]

#122<<  #123

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

sql.ru Описание рассылки

МИНИФОРМА
ПОДПИСКИ




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

В избранное