Подробности реализации образца сценария Sales Orders

В этом разделе приведены некоторые подробные сведения о реализации, а также проектные решения для образца приложения Adventure Works Sales Orders. В этом образце, который поставляется с Microsoft SQL Server, демонстрируются преимущества программирования репликации слиянием от сервера к клиенту. Дополнительные сведения см. в разделе Файл Readme: образец репликации слиянием Sales Orders.

Общие сведения об архитектуре

Само по себе приложение — это управляемый клиент на основе Microsoft Windows Forms, разработанный с помощью Microsoft Visual Studio 2005. Это клиентское приложение подключается к данным о заказах на продажу в локальном экземпляре SQL Server (всех выпусков) с помощью средств доступа к данным, предоставляемых платформой Microsoft .NET Framework 2.0. Топология репликации слиянием обеспечивает поддержку согласованного набора данных между компьютером менеджера по продажам и главной базой данных AdventureWorks в центральном офисе, а сами эти данные секционируются таким образом, чтобы каждый менеджер по продажам получал только те данные, которые необходимы ему для обслуживания клиентов. Публикация слиянием настраивается программными средствами с помощью хранимых процедур репликации. При первом запуске приложения Sales Orders с помощью управляющих объектов SQL Server программно создается локальная база данных, а с помощью объектов RMO определяется подписка по запросу на публикации слиянием. Мониторинг и поддержка подписки осуществляется программно с помощью объектов RMO.

Функции репликации

Благодаря использованию топологии репликации слиянием менеджеры по продажам могут работать со своими данными о продажах в локальном режиме, например во время выезда к клиенту или в отсутствие соединения с базой данных AdventureWorks. Периодически менеджер по продажам будет подключаться к Интернету, чтобы передать издателю изменения в заказах на продажу и загрузить изменения в заказах на продажу и обновленную информацию о продуктах на подписчик. В топологии репликации слиянием для этого образца предусмотрена поддержка нескольких подписчиков, работающих на всех выпусках SQL Server 2005 (или более поздней версии), включая SQL Server Express и SQL Server Compact 3.5 SP1. Топология репликации слиянием этого типа обсуждается более подробно в разделе Обмен данными с мобильными пользователями.

Параметризованные фильтры строк

На практике данные о продажах, принадлежащие одному менеджеру по продажам, должны проходить горизонтальную фильтрацию с помощью функции SUSER_SNAME на основе данных об имени входа в систему в столбце Employee.LoginID. Фильтрация повышает производительность, уменьшает размер исходного моментального снимка, снижает вероятность конфликта измененных данных между подписчиками и упрощает логику приложения. Однако в образце приложения нет смысла выполнять фильтрацию с помощью функции SUSER_SNAME. Вместо этого в образце данные секционируются с помощью функции HOST_NAME. Кроме того, репликация позволяет перегружать функцию HOST_NAME для указания любого критерия фильтрации по данным секционирования, и в данном образце горизонтальный фильтр для статьи Таблица сотрудников определен с помощью предложения WHERE HumanResources.Employee.LoginID = HOST_NAME. С помощью фильтров соединения данный параметризованный фильтр строк распространяется на другие связанные таблицы по продажам.

ms147881.note(ru-ru,SQL.100).gifВажно!
Существует проблема безопасности, если используется параметризованный фильтр, содержащий HOST_NAME(). Дополнительные сведения см. в подразделе «Фильтрация с использованием HOST_NAME()» раздела Параметризованные фильтры строк.

Принимая во внимание параметры фильтрации статьи в этом образце, следует предоставить другое значение Hostname для каждой подписки в публикации. В данном образце в разделе Hostname можно использовать значения Employee.EmployeeID:

  • adventure-works\michael9
  • adventure-works\pamela0
  • adventure-works\tsvi0
  • adventure-works\shu0
  • adventure-works\rachel0
  • adventure-works\lynn0

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

Подготовка секционированных снимков

Публикация настраивается таким образом, чтобы подписчикам было разрешено запрашивать создание секционированного снимка при инициализации подписки. Однако можно также создавать эти моментальные снимки до инициализации, тогда расходы на обработку этих данных будут возникать предсказуемым образом в заданное время. Дополнительные сведения см. в разделе Как создать моментальный снимок в публикации слиянием с параметризованными фильтрами (программирование репликации на языке Transact-SQL).

Параметры схемы

Параметры схемы статьи определяют способ репликации объекта базы данных на подписчике. Дополнительные сведения см. в разделе Публикация данных и объектов базы данных. Применяемые параметры схемы, используемые в образце, зависят от типа объекта и функциональных возможностей, необходимых на подписчике.

Объекты программирования

  • Для хранимых процедур доступа к данным и определяемых пользователем функциям сценариями реализуются только команды создания объектов, например CREATE PROCEDURE и CREATE FUNCTION.

Это соответствует значению 0x00001 параметра @schema_option.

Объекты таблицы

  • На подписчике создаются объекты таблицы.
  • Репликации подвергаются кластеризованные и некластеризованные индексы в таблицах.
  • Репликации подвергаются проверочные ограничения и ограничения внешнего ключа.
  • Репликации подвергаются уникальные ключи.
  • Определяемые пользователем типы данных преобразуются в базовые типы данных подписчика.
  • Определяемые пользователем триггеры в таблицах не реплицируются.
  • Создаются схемы, которых еще нет на подписчике.

Это соответствует значению 0x8004EF1 общего параметра @schema_option.

Состояние подписки

В этом образце вызывается класс SubscriberMonitor, отображающий сведения о состоянии подписки. Этот класс реализуется как компонент образца, а также как изолированный мониторинг в проекте SubscriberMonitorUtility. Дополнительные сведения см. в разделе Использование образца Subscriber Monitor.

Веб-синхронизация

Веб-синхронизация включена для публикации при ее создании. Однако для использования веб-синхронизации необходимо запустить мастер настройки веб-синхронизации и настроить сертификаты для SSL на веб-сервере и подписчике. В образце используется обычная проверка подлинности HTTP через соединение по протоколу SSL. Этот способ является рекомендуемым для веб-синхронизации. Дополнительные сведения см. в разделе Настройка веб-синхронизации. Если веб-синхронизация включена в форме Параметры веб-синхронизации и введено имя входа и пароль для обычной проверки подлинности HTTP, то приложение задает свойству UseWebSynchronization для подписки значение true, а также свойства InternetLogin и InternetPassword для синхронизации по протоколу HTTPS. При использовании образца необходимо указать учетную запись Windows и пароль для использования при веб-синхронизации. Эти учетные данные веб-сервер использует при соединении с издателем. Если агенту слияния не удается подключиться к веб-серверу с помощью протокола HTTPS в расположении, заданном свойством InternetUrl, то возвращается ошибка.

Пользовательская бизнес-логика

Поскольку заказы на продажу обычно размещаются, когда менеджер по продажам не подключен к Интернету, заказ может быть размещен на задержанные товары. Согласно политике компании, заказы не отгружаются до тех пор, пока не будут заполнены все пункты заказа. Если заказ невозможно выполнить незамедлительно, то в столбце Состояние таблицы SalesOrderHeader задается значение 3, показывающее, что весь заказ задерживается. В подобных случаях приложение должно как можно скорее уведомить менеджера по продажам о том, что заказ задерживается, о чем следует сообщить клиенту.

В образце Sales Orders реализован класс BusinessLogicModule пространства имен Microsoft.SqlServer.Replication.BusinessLogicSupport, который встраивает в процесс синхронизации пользовательскую бизнес-логику. При каждом изменении в строке таблицы SalesOrderDetail, отправляемом издателю, пользовательская логика соединяется с издателем и проверяет запас продукции на наличие нужного продукта по таблице ProductInventory. Если приложение обнаружит, что заказанное количество превышает количество товаров на складе, то оно присвоит столбцу Состояние в таблице SalesOrderHeader значение 3. Затем приложение записывает в журнал синхронизации сообщение, где описана задержка заказа. Поскольку структуру бизнес-логики, обеспечиваемую репликацией, можно использовать для реализации любых функций, поддерживаемых платформой .NET Framework, то с помощью пользовательской бизнес-логики можно легко вызывать диалоговые окна или автоматически отправлять клиентам сообщения электронной почты.

ms147881.note(ru-ru,SQL.100).gifПримечание.
Сообщения, записываемые в журнал обработчиком бизнес-логики при веб-синхронизации подписки, не отображаются на подписчике.

В пользовательской бизнес-логике реализованы методы InsertHandler и UpdateHandler, обрабатывающие вставку строк и обновление. Также реализован метод Initialize. При инициализации пользовательской бизнес-логики репликация передает сведения издателя, которые используются для программного создания строки соединения для объекта SqlConnection с помощью класса SqlConnectionStringBuilder.

Состояние синхронизации

Агенты репликации можно запускать из задания (асинхронно) или непосредственно из кода (синхронно). Одно из основных преимуществ синхронного выполнения агентов репликации — это возможность получения и отображения сообщений о состоянии агентов с помощью встроенной функции обратного вызова. В образце Sales Orders событие Status (обратный вызов) обрабатывается с помощью обработчика StatusEventHandler, который получает и отображает сообщения о состоянии возвращенных объектов StatusEventArgs. Кроме того, возвращается целое число, которое показывает приблизительное процентное соотношение выполненной синхронизации. Это число отображается пользователям в строке состояния. Поскольку фоновая синхронизация может приводить к устареванию сведений в форме Subscription Status (Состояние подписки), менеджер по продажам может загрузить последние сеансы с помощью кнопки Refresh (Обновить).

Синхронизация при подключении

Образец Sales Orders демонстрирует сильные стороны репликации слиянием при синхронизации данных в отсутствие соединения. Однако бывают случаи, например, во время собраний в центральном офисе, когда соединение с Интернетом доступно. Кроме того, этот образец можно использовать для непрерывной синхронизации при наличии постоянного соединения с Интернетом. Если в меню Advanced Options (Дополнительные параметры) включен параметр Synchronize when connected (Синхронизировать при наличии соединения), то элемент управления Timer будет доступен. Когда таймер отсчитывает интервал, заданный в файле конфигурации приложения, срабатывает событие таймера, и приложение запрашивает у поставщика инструментария управления Windows (WMI) (с помощью пространства имен System.Management) проверку наличия связи. Если связь есть, то подписка синхронизируется в фоновом режиме. Чтобы избежать проблем с вводом данных, образец запрещает фоновую синхронизацию, если фокус находится вне формы Sales Orders (Заказы на продажу). Поскольку образец использует свойство инструментария WMI, недоступное в операционных системах Microsoft Windows 2000, то параметр меню Synchronize when connected (Синхронизировать при наличии соединения) будет недоступен на компьютерах под управлением ОС Windows 2000.

ms147881.note(ru-ru,SQL.100).gifПримечание.
В этом образце синхронизация при соединении реализована в едином потоке. В идеале эта функциональная возможность реализована в отдельном потоке. При запуске агентов репликации в едином потоке рекомендуется использовать класс BackgroundWorker.

Развертывание

Все программные объекты, которые используются для обращения к данным в базе данных подписки (хранимые процедуры, определяемые пользователем типы и функции), создаются только на издателе в базе данных публикации и публикуются на подписчике в виде статей. При первом запуске образца Sales Orders на компьютере менеджера по продажам приложение соединяется с издателем, загружает и применяет исходный моментальный снимок, включая программные объекты для доступа к данным. После успешного применения моментального снимка приложение загружает локальные данные в форму Sales Orders, после чего оно готово к вводу данных.

С помощью новой функции развертывания Visual Studio 2005 ClickOnce можно публиковать установочный пакет приложения на веб-узле. Подписчики могут загружать и устанавливать приложение с узла развертывания ClickOnce и удаленно инициализировать подписки через виртуальную частную сеть (VPN) из удаленного расположения при условии, что платформа .NET Framework 2.0 уже установлена. Кроме того, функция ClickOnce предоставляет служебные обновления с веб-узла. Дополнительные сведения о развертывании ClickOnce см. в разделе «Общие сведения о развертывании ClickOnce» в документации по Visual Studio 2005.

Пошаговые инструкции по установке и запуске этого образца см. в разделе Файл Readme: образец репликации слиянием Sales Orders.

Элементы пользовательского интерфейса

В образце Sales Order реализованы следующие элементы пользовательского интерфейса.

Имя элемента Описание

Форма Sales Orders (Заказы на продажу)

Это основной элемент пользовательского интерфейса и точка входа приложения. В этой форме менеджер по продажам работает с заказами, выбирая клиента из поля со списком Customer и заказ из поля со списком Order. При нажатии на кнопку Edit (Изменить) выбранный заказ отображается для редактирования в форме Edit Order (Изменить заказ). При нажатии на кнопку New (Создать) отображается пустая форма Edit Order (Изменить заказ).

Форма Edit Order (Редактирование формы)

С помощью этой формы менеджер по продажам может изменить заказ. Элементы строк можно изменять на сетке Order Items (Элементы формы), а новые заказы можно присоединять к сетке и сохранять с помощью кнопки Add (Добавить). Можно выбирать элементы и удалять их из сетки с помощью кнопки Delete (Удалить). После заполнения заказа кнопка Save (Сохранить) фиксирует изменения в базе данных.

Форма Synchronize Sales Data (Синхронизация данных о продажах)

Эта форма используется для инициализации, синхронизации и повторной инициализации подписки. Сообщения о состоянии от агента слияния отображаются в поле Synchronization Status (Состояние синхронизации), и в строке состояния отображается процент выполнения

Форма Merge Subscriber Monitor (Монитор подписчиков на публикации слиянием)

Форма реализована в отдельной сборке. Она вызывается из меню Advanced Options (Дополнительные параметры) и отображает сведения о подписке с помощью MergeSubscriberMonitor. Дополнительные сведения см. в разделе Использование образца Subscriber Monitor.

Форма Web Synchronization Options (Параметры веб-синхронизации)

Эта форма вызывается путем выбора пункта Web Synchronization Options (Параметры веб-синхронизации) в меню Advanced Options (Дополнительные параметры). Она используется для управления параметрами веб-синхронизации для данной подписки. Вместо управления этими параметрами в приложении объект MergePullSubscription используется для хранения параметров веб-синхронизации, а также для их получения из метаданных подписки. В данном образце необходимо ввести имя входа Windows и пароль, передаваемые на веб-сервер с помощью обычной проверки подлинности HTTP по SSL-соединению. Дополнительные сведения см. под заголовком «Веб-синхронизация» подраздела «Рассмотрение образца» далее в этом разделе.

Форма Logon User (Вход пользователя)

Эта форма вызывается при создании подписки. При создании подписки с параметром CreateSyncAgentByDefault в значении true необходимо ввести допустимое имя входа Windows и пароль в объекте Mergepullsubscription. Это требуется постольку, поскольку образцу необходимо создать взаимосвязанные метаданные агента для хранения параметров веб-синхронизации. Если параметр CreateSyncAgentByDefault имеет значение false, то задание агента не создается, и метаданные веб-синхронизации и другие метаданные подписки необходимо поддерживать с помощью приложения. Дополнительные сведения см. под заголовком «Веб-синхронизация» подраздела «Рассмотрение образца» далее в этом разделе. Для подписчика SQL Server Express метаданные по-прежнему создаются, даже если выпуск не поддерживает агент SQL Server и само задание агента не создано.

Меню Synchronize (Синхронизация)

Пункты этого меню запускают сеанс синхронизации и включают синхронизацию при соединении.

Меню Advanced Options (Дополнительные параметры)

Пункты этого меню повторно инициализируют подписку, включают веб-синхронизацию и отображают форму Merge Subscriber Monitor (Монитор подписчиков на публикации слиянием).

Вопросы, связанные с образцом

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

Поддержка подписчиков выпуска SQL Server Compact

Основное соображение по топологии репликации — это поддержка публикаций подписчиков SQL Server Compact 3.5 SP1. Поскольку SQL Server Compact 3.5 SP1 поддерживает только моментальные снимки данных в символьном режиме, публикация имеет некоторые дополнительные ограничения, которых не было бы в случае моментальных снимков в стандартном режиме. Это можно использовать в том случае, если все подписчики работают на других выпусках SQL Server. Ниже перечислены эти ограничения.

  • Выполнение сценариев Transact-SQL до и после применения моментального снимка. Это позволило бы создавать локальную базу данных и любые определяемые пользователем типы или схемы на подписчике с помощью языка Transact-SQL вместо необходимости загружать сборки управляющих объектов SQL Server во время выполнения.
  • Вычисляемые столбцы. Некоторые ключевые столбцы в схеме заказов на продажу AdventureWorks недоступны для репликации. К ним относятся LineTotal в таблице SalesOrderDetail, а также TotalDue и SalesOrderNumber в таблице SalesOrderHeader. Для отображения сведений пользователям приложению приходится выполнять собственные вычисления.
  • С помощью логических записей можно было бы гарантировать, что продаваемые товары в таблице SalesOrderDetail отправляются на издатель только со строками в таблице SalesOrderHeader, которой они принадлежат. Однако при поддержке подписчиков SQL Server Compact 3.5 SP1 логические записи недоступны для использования.

Производительность репликации слиянием

Поскольку образец базы данных AdventureWorks спроектирован в расчете на имитацию многих рабочих баз данных, реализованных с помощью SQL Server, его схема довольно сложна, а данные имеют высокую степень нормализации. Последняя позволяет улучшить производительность зависящих от индекса операций, но может отрицательно сказываться на производительности репликации слиянием. В данном образце пять фильтров соединения должны распространяться на параметризованный фильтр строк из Employee Table на таблицу SalesOrderDetail. К репликации относятся функции, оптимизирующие производительность параметризованных фильтров строк, например предварительно вычисляемых секций. Однако в случаях, когда производительность репликации слиянием снижается, следует денормализовать опубликованные таблицы, чтобы сократить число фильтров соединения менее чем до трех. Дополнительные сведения см. в разделе Повышение производительности репликации слиянием.

Веб-синхронизация

На архитектуру образца повлияла возможность для пользователей беспрепятственно переключаться между веб-синхронизацией и обычной синхронизацией путем прямого соединения с издателем. В образце используется класс MergePullSubscription, обеспечивающий защищенное хранение и получение свойств, необходимых для веб-синхронизации, что также упрощает логику приложения. Для получения этой возможности из класса MergePullSubscription необходимо при создании подписки для свойства CreateSyncAgentByDefault указать значение true. Вместе со строкой в таблице MSsubscription_properties, которая позволяет задавать эти свойства в объекте MergePullSubscription, класс также создает задание агента для подписки. Поскольку приложение всегда начинает синхронизацию напрямую и не использует агент SQL Server, это задание никогда не используется. Задание агента не будет создаваться для подписчика SQL Server Express, поскольку агент SQL Server не поддерживается в этом выпуске, но требуемые метаданные по-прежнему создаются. Когда вызывается метод Create, а свойство CreateSyncAgentByDefault имеет значение true, то необходимо предоставить сведения SynchronizationAgentProcessSecurity. Именно поэтому при создании подписки отображается форма Logon User (Вход пользователя). Эти учетные данные хранятся в SQL Server, но никогда не используются. Вместо этого запускается агент слияния в контексте пользователя, запустившего образец.

В образце используется встроенная проверка подлинности для всех соединений с серверами, кроме соединения подписчика с веб-сервером при веб-синхронизации, когда используется обычная проверка подлинности HTTP. Для веб-синхронизации не рекомендуется использовать встроенную проверку подлинности. В производственной среде сервер IIS, используемый для веб-синхронизации, развертывается на компьютере, отличном от издателя и распространителя. Из-за ограничений, связанных с олицетворением Windows, для этого необходимо, чтобы учетные данные обычной проверки подлинности, передаваемые на веб-сервер, были эквивалентны имени входа на издателе.

ms147881.note(ru-ru,SQL.100).gifПримечание.
Синхронизация только на прием или только на передачу данных не поддерживается при использовании веб-синхронизации. Если веб-синхронизация разрешена, пункт Только передача данных отключен.

Определяемые пользователем типы

В состав объекта AdventureWorks входит ряд определяемых пользователем типов, которые реплицируются как базовые типы на подписчике. Если они являются типами среды CLR, то реплицируются как типы CLR.

Опубликованные объекты AdventureWorks

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

Имя объекта Тип объекта Замечания

Customer

Таблица

Дополнительные сведения см. в разделе Таблица Customer (AdventureWorks).

CustomerAddress

Таблица

Дополнительные сведения см. в разделе Таблица CustomerAddress (AdventureWorks).

Employee

Таблица

Статья, предназначенная только для загрузки. Параметризованный запрос на основе параметра LoginID используется для секционирования данных для подписки каждого менеджера по продажам. Дополнительные сведения см. в разделе Таблица Employee (AdventureWorks).

Product

Таблица

Статья, предназначенная только для загрузки. Дополнительные сведения см. в разделе Таблица Product (AdventureWorks).

ProductCategory

Таблица

Статья, предназначенная только для загрузки. Дополнительные сведения см. в разделе Таблица ProductCategory (AdventureWorks).

ProductDescription

Таблица

Статья, предназначенная только для загрузки. Дополнительные сведения см. в разделе Таблица ProductDescription (AdventureWorks).

ProductInventory

Таблица

Дополнительные сведения см. в разделе Таблица ProductInventory (AdventureWorks).

ProductListPriceHistory

Таблица

Статья, предназначенная только для загрузки. Дополнительные сведения см. в разделе Таблица ProductListPriceHistory (AdventureWorks).

ProductModel

Таблица

Статья, предназначенная только для загрузки. Дополнительные сведения см. в разделе Таблица ProductModel (AdventureWorks).

ProductModelProductDescriptionCulture

Таблица

Статья, предназначенная только для загрузки. Дополнительные сведения см. в разделе Таблица ProductModelProductDescriptionCulture (AdventureWorks).

ProductSubcategory

Таблица

Статья, предназначенная только для загрузки. Дополнительные сведения см. в разделе Таблица ProductSubcategory (AdventureWorks).

SalesOrderDetail

Таблица

Дополнительные сведения см. в разделе Таблица SalesOrderDetail (AdventureWorks).

SalesOrderHeader

Таблица

Дополнительные сведения см. в разделе Таблица SalesOrderHeader (AdventureWorks).

ShipMethod

Таблица

Статья, предназначенная только для загрузки. Дополнительные сведения см. в разделе Таблица ShipMethod (AdventureWorks).

SpecialOffer

Таблица

Статья, предназначенная только для загрузки. Дополнительные сведения см. в разделе Таблица SpecialOffer(AdventureWorks).

Store

Таблица

Дополнительные сведения см. в разделе Таблица Store (AdventureWorks).

StoreContact

Таблица

Дополнительные сведения см. в разделе Таблица StoreContact (AdventureWorks).

ufnGetAccountingStartDate

Скалярная, определяемая пользователем функция

Функция AdventureWorks.

ufnGetAccountingEndDate

Определяемая пользователем функция, возвращающая табличное значение

Функция AdventureWorks.

udfGetStatusTextTable

Определяемая пользователем функция

Возвращающая табличное значение функция, которая возвращает текстовые описания для значений состояния.

uspSalesOrderDetailDeleteCommand

Хранимая процедура

Используется приложением для удаления строк из таблицы SalesOrderDetail.

uspSalesOrderDetailInsertCommand

Хранимая процедура

Используется приложением для вставки строк в таблицу SalesOrderDetail.

uspSalesOrderDetailSelectCommand

Хранимая процедура

Используется приложением при запросе таблицы Таблица SalesOrderDetail (AdventureWorks).

uspSalesOrderDetailUpdateCommand

Хранимая процедура

Используется приложением для обновления строк таблицы SalesOrderDetail.

uspSalesOrderHeaderDeleteCommand

Хранимая процедура

Используется приложением для удаления строк из таблицы Таблица SalesOrderHeader (AdventureWorks).

uspSalesOrderHeaderInsertCommand

Хранимая процедура

Используется приложением для вставки строк в таблицу SalesOrderHeader.

uspSalesOrderHeaderSelectCommand

Хранимая процедура

Используется приложением при запросе таблицы Таблица SalesOrderHeader (AdventureWorks).

uspSalesOrderHeaderUpdateCommand

Хранимая процедура

Используется приложением для обновления строк таблицы SalesOrderHeader.

uspStoreSelectCommand

Хранимая процедура

Используется приложением для запроса по клиентам для данного магазина.

uspCheckProductInventory

Хранимая процедура

Используется пользовательской бизнес-логикой для изменения состояния заказа на «задержанный» и возвращения сообщения, записываемого в журнал.

См. также

Основные понятия

Образец сценария Sales Orders

Справка и информация

Получение помощи по SQL Server 2008