MS SQL Server 6.5

Загрузить архив:
Файл: hai-0052.zip (103kb [zip], Скачиваний: 96) скачать

СОДЕРЖАНИЕ: TOC o "1-3"

Введение                                                                                                                                     GOTOBUTTON _Toc403054661PAGEREF _Toc403054661 2

Архитектура MS SQL Server 6.5                                                                                        GOTOBUTTON _Toc403054662PAGEREF _Toc403054662 3

Производительность                                                                                                          GOTOBUTTON _Toc403054663PAGEREF _Toc403054663 4

Распределенная среда управления                                                                           GOTOBUTTON _Toc403054664PAGEREF _Toc403054664 5

SQL-DMO (Distributed Management Objects)                                                           GOTOBUTTON _Toc403054665PAGEREF _Toc403054665 7

Интеграция с электронной почтой                                                                          GOTOBUTTON _Toc403054666PAGEREF _Toc403054666 8

Характеристики языка Transact-SQL                                                                       GOTOBUTTON _Toc403054667PAGEREF _Toc403054667 9

MS Distributed Transaction Coordinator (DTC) и распределенные транзакции      GOTOBUTTON _Toc403054668PAGEREF _Toc403054668 11

Блокировки                                                                                                                             GOTOBUTTON _Toc403054669PAGEREF _Toc403054669 14

Надежность хранения информации                                                                      GOTOBUTTON _Toc403054670PAGEREF _Toc403054670 16

Тиражирование                                                                                                                    GOTOBUTTON _Toc403054671PAGEREF _Toc403054671 18

Вопросы безопасности доступа                                                                              GOTOBUTTON _Toc403054672PAGEREF _Toc403054672 20

Некоторые вопросы использования MS SQL Server в Internet/intranet-приложениях                                                                                                                        GOTOBUTTON _Toc403054673PAGEREF _Toc403054673 21

Заключение                                                                                                                            GOTOBUTTON _Toc403054674PAGEREF _Toc403054674 24

Список литературы:                                                                                                          GOTOBUTTON _Toc403054675PAGEREF _Toc403054675 25

[1] менеджером транзакций. Пусть

HRESULT hr; ITransactionDispenser *pTxDispenser;

тогда hr = DtcGetTransactionManager(

        NULL,

                        // имя хоста DTC, NULL

                        // означает данный хост

        NULL,

                        // имя менеджера транзакций

        IID_ITransactionDispenser,

                        // требуемый интерфейс

        0,

                        // зарезервировано

        0,

                        // зарезервировано

        (void *)NULL,

                        // зарезервировано

        (void **)&pTxDispenser);

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

ITransaction *pTx;

hr = pTxDispenser->BeginTransaction (

        NULL,

                // управляющий интерфейс

        ISOLATIONLEVEL_BROWSE,

                // уровень изоляции

       0,

                // флаги изоляции

        NULL,

                // зарезервировано

        &pTx);

                // Ptr на объект "транзакция"

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

RETCODE rc; HDBC hSrv1, hSrv2;•

rc = SQLSetConnectOption( hSrv1, SQL_COPT_SS_ENLIST_IN_DTC, pTx);

rc = SQLSetConnectOption( hSrv2,SQL_COPT_SS_ENLIST_IN_DTC, pTx);

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

DbExecSQL(hSrv1,"INSERT INTO...");

DbExecSQL(hSrv2,"INSERT INTO..."); ...

hr=pTx->Commit(0,0,0);•hr=pTx->Release()

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

BEGIN DISTRIBUTED TRANSACTION

        INSERT INTO ACCOUNTS VALUES (100,20)

        EXEC RMTBRANCH.ACCOUNTS.DBO.DEPOSIT

                100,20

COMMIT TRANSACTION

При неявном определении при помощи установок sp_configure "remote proc trans", 1 (уровень сервера) или set remote_ procedure_transactions on (уровень сессии) MS SQL Server по умолчанию рассматривает локальные транзакции, начатые begin transaction, как распределенные с подключением DTC, если в них содержатся вызовы удаленных хранимых процедур.

Корректное завершение транзакции выполняется при помощи протокола двухфазной фиксации. Когда приложение вызывает метод commit, менеджер транзакций оповещает зарегистрировавшиеся менеджеры ресурсов подготовиться к фиксации данной транзакции, и, после того как все они известили о своей готовности, менеджер транзакций рассылает широковещательное сообщение зафиксировать транзакцию. Если хотя бы один менеджер ресурсов не сообщил о готовности фиксировать транзакцию, она повсеместно откатывается. После сообщения о готовности менеджер ресурсов пребывает в состоянии сомнения (in-doubt) относительно общего исхода. Так как менеджеры ресурсов регистрируются в транзакции, то менеджеры транзакций имеют возможность отслеживать все их операции и хранят журналы о решениях фиксировать или откатить транзакцию. В свою очередь менеджер ресурсов также ведет у себя такой журнал. Следовательно, если имел место сбой в сети, то после его ликвидации менеджер транзакций связывается с вышестоящим менеджером транзакций и запрашивает его об исходах. После этого менеджер ресурсов идет на свой менеджер транзакций и получает у него информацию о том, что делать с зависшими транзакциями. Кроме этого, если исход транзакции известен, DTC предоставляет возможность "ручного" разрешения транзакций, чтобы слишком долго не держать данные блокированными.

MS DTC содержит компоненты клиентской и серверной настройки. Установка клиентского компонента требуется только в том случае, если данный клиент будет сам инициировать распределенные транзакции, а не использовать транзакции, начатые на серверной стороне как begin distributed transaction. MS DTC достаточно легок и удобен в настройке и управлении. Он имеет окна:

• в разных источниках он может также называться глобальным (global) или корневым (root);

• конфигурации, позволяющее задать темп обновления информации, транзакции какой давности должны показываться, место и емкость журнала, статус DTC;

• трассировки, отображающие сообщения от DTC;

• транзакций, отображающие статус текущих транзакций:

• статистики по текущим и суммарным транзакциям.

В рассмотренном примере инициации распределенной транзакции на стороне клиента мы проиллюстрировали использование интерфейсов, соответствующих стандарту OLE Transaction. OLE Transaction выгодно отличается от некоторых других распространенных стандартов тем, что построен на основе объектной модели и поддерживает приложения, работающие одновременно со многими потоками. OLE Transaction обладает улучшенными характеристиками по сравнению с ранее разработанными стандартами, лишенными, например, возможности восстановления (recovery), инициированного менеджером ресурсов. Тем не менее при помощи процесса XA Mapper MS DTC, выполняющего роль переводчика между XA и OLE Transaction, обеспечивается определенное взаимодействие с продуктами, совместимыми со стандартом X/Open DTP XA. MS DTC может участвовать в транзакциях, координируемых мониторами транзакций Encina, TopEnd и Tuxedo, для которых он выглядит как некоторый менеджер ресурсов. Стандарт OLE Transaction содержит возможности расширения для работы с широким спектром транзакционно защищенных ресурсов, к которым могут быть отнесены документы, образы, очереди сообщений и другие виды плохо структурированной информации.

[2].

В следующей версии блокировка уровня записи будет возможна для всех типов транзакций. Блокировка уровня записи на операции вставки позволяет в первую очередь решить задачу уменьшения вероятности конкуренции в OLTP-системах с массированным одновременным вводом информации (типичный пример - операционный день банка), где таблицы содержат только некластерные индексы или кластерный индекс построен по монотонно возрастающему ключу. По умолчанию эта опция выключена. В текущей базе данных ее можно задействовать командой sp_tableoption <Имя таблицы или шаблон>, 'insert row lock', 'true'.

Существует диалектическое противоречие, с которым наверняка сталкивался каждый администратор базы данных или разработчик. С одной стороны, хочется уменьшить до минимума вероятность столкновения интересов пользователей при доступе к одним и тем же ресурсам и потому блокировать все на как можно более детальном уровне. С другой - очень не хочется перегружать менеджер блокировок, который фиксирует информацию о том, кто наложил блокировку, какого типа, кто ждет, пока она освободится и т. д. Например, в MS SQL Server 6.5 каждая блокировка обходится в 32 байта. Для разрешения этого противоречия сервер умеет автоматически повышать уровень блокировки в случае, если блокировок предыдущего уровня детализации становится слишком много (lock escalation). "Слишком много" - это LE Threshold Maximum в настройках конфигурации сервера, т. е. максимальная пороговая величина числа страничных блокировок, при достижении которой происходит эскалация до уровня таблицы. По умолчанию она равна 200. Для этих же целей используется настройка LE Threshold Percentage - в относительном выражении к размеру таблицы (но не меньше, чем LE Threshold Minimum, что полезно для небольших таблиц). В перспективе возможна обратная стратегия динамической деэскалации уровня блокировки, когда блокируется заведомо больший фрагмент данных, чем требуется, но, как только появляется транзакция, конкурирующая за данные внутри данного фрагмента, уровень первой транзакции будет автоматически уменьшен.

Управление уровнем изоляции транзакций на протяжении всего соединения (пользовательской сессии) осуществляется при помощи установки set transaction isolation level <уровень изоляции>, где уровень изоляции может принимать значения:

read uncommitted соответствует уровню изоляции 0 стандарта ANSI, т. е. просто запрещает различным транзакциям изменять одни и те же данные в одно и то же время, но допускает грязное и неповторяющееся чтение и фантомы[3];

read committed (устанавливается по умолчанию) соответствует уровню изоляции 1 стандарта ANSI, т. е. предотвращает грязное чтение;

repeatable read или serializable соответствует уровню 3 по стандарту ANSI - предотвращает грязное чтение, а также гарантирует, что два оператора select в разных местах одной транзакции будут возвращать одинаковый результат, т. е. исключает неповторяющееся чтение и фантомы.

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

nolock то же, что read uncommitted, - дает возможность чтения грязных (еще не зафиксированных) данных, которая перекрывает аналогичные параметры конфигурации пользовательской сессии. В операторе select можно также оговорить продолжительность блокировки данных;

holdlock инструктирует сервер держать блокировки до завершения транзакции (по умолчанию блокировки снимаются сразу же по прочтении требуемых данных;

Тип и уровень блокировки:

updlock заставляет применить блокировку update вместо обычной shared, используется, когда следом идет оператор update, основанный на прочитанных значениях, чтобы запретить update из других транзакций;

paglock заставляет сервер при любых условиях использовать блокировки уровня страницы;

tablock принудительно блокирует таблицу (shared);

tablockx принудительно блокирует таблицу (exclusive).

Просмотр текущих блокировок выполняется при помощи хранимой процедуры sp_lock или через включение флага трассировки 1200 на клиента: dbcc traceon (3604,1200). Также полезным являются флаги 1204 и 1205, которые выдают информацию о cитуациях взаимной блокировки (deadlocks). MS SQL Server обладает возможностью автоматического обнаружения deadlocks как циклов в цепочке блокировок. Он находит первый процесс, который мог бы разорвать цикл, убивает его и откатывает все транзакции этого процесса, находившиеся в стадии выполнения. Как правило, им оказывается тот самый процесс, который запросил блокировку, послужившую причиной зацикливания. После этого сервер генерирует сообщение об ошибке 1205. Если клиентское приложение имеет обработчик ошибок, отлавливающий ошибку 1205, то оно может предпринять соответствующие действия по исправлению ситуации, и конечный пользователь, скорее всего, даже не узнает, что имела место взаимная блокировка.

Надежность хранения информации

В критических для бизнеса приложениях, когда сервер СУБД должен быть постоянно доступен для клиентов, большинство профилактических работ по поддержке базы данных приходится выполнять фактически в режиме on-line. MS SQL Server обладает возможностями динамического резервного копирования данных, т. е. даже когда эти данные используются и изменяются клиентами. В случае сбоя оборудования, отключения питания и т. д. механизм автоматического восстановления MS SQL Server восстанавливает все базы данных до их последнего целостного состояния без вмешательства администратора. Все завершенные, но не отраженные в базе транзакции из журнала транзакций применяются к базе данных (это фактически то, что происходит при событии chekpoint), а незавершенные транзакции, т. е. те, которые были активными на момент сбоя , вычищаются из журнала.

Как мы уже отмечали, говоря о симметричной архитектуре, операции резервного копирования и восстановления могут распараллеливаться на несколько потоков и выполняться одновременно, используя преимущества асинхронного ввода/вывода. На каждое резервное устройство отводится свой поток. Параллельное резервное копирование поддерживает до 32 одновременных резервных устройств (backup devices), что позволяет быстро создавать страховочные копии баз данных даже очень большой емкости. Возможность резервного копирования и восстановления отдельных таблиц, о чем мы упоминали, рассматривая Transact-SQL, позволяет экономить место и время, не выполняя копирование всей базы ради только некоторых ее объектов. Однако резервное копирование отдельной таблицы требует наложения на нее блокировки exclusive в отличие от резервного копирования всей базы или журнала транзакций, которые могут выполняться независимо от степени активности пользователей. Резервным копиям может быть назначен предельный срок хранения или дата утраты актуальности, до наступления которой место, занятое на устройстве этими копиями, не может использоваться для размещения других резервных копий при инициализации устройства. В качестве резервных устройств могут также применяться временные устройства, не входящие в состав базы и не имеющие записей в системной таблице sysdevices:

DECLARE @tomorrow char(8)

SELECT @tomorrow = CONVERT(char(8), DATEADD(dd, 1, GETDATE()) , 1)

DUMP DATABASE pubs

TO      DISK = '\ntalexeyshdisk_dsql_experimentspubs.dmp'

        WITH INIT, EXPIREDATE=@tomorrow, STATS

Для небольшой базы данных ее журнал транзакций обычно хранится на том же устройстве, что и сама база, и архивируется вместе с ней. Журналирование транзакций ведется по принципу write-ahead, что означает, что любое изменение сначала отражается в журнале транзакций и лишь потом попадает собственно в базу. В случае нахождения журнала транзакций на отдельном устройстве существует возможность отдельного резервного копирования журнала транзакций. Как правило, резервное копирование базы данных организуется с меньшей частотой, чем журнала транзакций. Например, сохранение журнала транзакций выполняется ежедневно, а страховая копия всей базы может делаться раз в неделю, так как архивирование журнала транзакций происходит значительно быстрее по времени и занимает меньше места, чем дамп целой базы. В отличие от резервирования базы данных дамп журнала транзакций очищает его неактивную часть, т. е. все завершившиеся (зафиксированные или абортированные) с момента последнего дампа транзакции, если только не использована опция NO_TRUNCATE. Команда DUMP TRANSACTION TRUNCATE_ONLY, очищающая журнал транзакций, полезна в случае его переполнения, которое можно контролировать, например, оператором DBCC SQLPERF (LOGSPACE). Если степень переполнения журнала очень высока, можно при его очистке отказаться от журналирования факта самого этого события: DUMP TRANSACTION NO_LOG. Если резервное копирование транзакций не представляет интереса, можно включить опцию очистки последних завершенных транзакций в базе по наступлению события checkpoint. Cмысл механизма checkpoint состоит в периодической записи данных из кэша на диск, чтобы не допускать грязных данных. Такого рода события постоянно генерируются MS SQL Server или возникают по инициативе пользователя. Включенная опция truncate log on checkpoint гарантирует выполнение с определенной частотой обработчиком события действий, приблизительно эквивалентных команде DUMP TRANSACTION TRUNCATE_ONLY.

При восстановлении журнала транзакций соответствующие транзакции применяются к базе данных. Это означает, что если в начале недели была сделана резервная копия всей базы, а потом ежедневно архивировались транзакции за каждый день, то при необходимости восстановления поднимается состояние базы на начало недели и на него последовательно накатываются дампы журнала транзакций за все дни, предшествующие моменту восстановления. MS SQL Server 6.5 имеет возможность восстановления данных из журнала транзакций на произвольный момент времени (разумеется, отраженный в журнале) при помощи команды LOAD TRANSACTION STOPAT или в окне database backup and restore выбором опции until time. Все содержащиеся в этом дампе транзакции, отмеченные завершившимися после этого момента, будут откачены.

Возможность планирования задач резервного копирования во времени и отсылки сообщений по e-mail в случае успешного/неуспешного завершения рассматривалась нами при обсуждении SQL Executive.

MS SQL Server 6.5 предусматривает возможность зеркалирования устройств, переключения на зеркальные устройства в качестве основных, выключения зеркалирования и уничтожения зеркального устройства также "на лету", т. е. без остановки штатной работы сервера по обслуживанию пользовательских запросов. Зеркалирование и дуплексирование устройств для работы с MS SQL Server может быть также выполнено средствами Windows NT, а также на аппаратном уровне (поддержка различных RAID-систем и т. д.). По-видимому, следует предполагать, что реализация первого этапа кластерной технологии WolfPack будет поддерживать MS SQL Server 6.5 в отказоустойчивых кластерах из двух узлов. Появление следующей версии MS SQL Server должно обеспечить работу серверов в кластере как единого виртуального сервера.

Transfer Manager используется для экспорта/импорта объектов и данных БД на MS SQL Server между разными аппаратными платформами, например между процессорами Intel и Alpha, а также между разными версиями MS SQL Server, в частности из более ранних в более поздние или между равноценными (имеются в виду 4.х и 6.х). Очень часто проектирование объектов базы ведется с помощью различных графических средств, но проектная документация может требовать структуру объектов с точностью до операторов DDL. Для получения скриптов, описывающих создание отдельного объекта базы данных, можно использовать команду transfer из контекстного меню объекта или выбрать соответствующий класс и имя объекта в Transfer Manager. Кроме этого, содержимое данных может быть выгружено/загружено при помощи утилиты bcp (см. табл. 1).

Тиражирование

Наличие развитого механизма тиражирования в любой серьезной системе управления базами данных обуславливается необходимостью приближения данных к местам их непосредственного потребления, что является особенно важным фактором при построении витрин данных в системах принятия решений, разгрузки приложений от избыточных функций чтения/поиска при создании отчетов и т. д. Создание распределенных приложений с использованием средств тиражирования положительно сказывается на относительной автономии сайтов, повышении масштабируемости и производительности. Традиционно в построении распределенных систем данных существуют два основных подхода. Один из них основан на плотной целостности данных (loose consistency) и рассматривался нами в пункте, посвященном MS Distributed Transaction Coordinator. Протокол двухфазной фиксации гарантирует идентичность данных в любой момент времени на всех узлах сети, однако необходимо иметь в виду, что этот подход требует наличия высокоскоростных каналов передачи данных и постоянной доступности каждого узла. Другой подход, основанный на слабой целостности (loose consistency), допускает, вообще говоря, некоторый временной интервал между внесением изменений в оригинал и их отражением в образе. Приложения, основанные на принципе слабой целостности, являются значительно менее чувствительными к доступности узлов, а также пропускной способности и надежности каналов передачи данных. Тиражирование в MS SQL Server построено на использовании именно второго подхода.

Основными действующими лицами в процессе тиражирования служат издатель (publisher), дистрибьютор (distributor) и подписчик (subscriber). Поскольку тиражирование является неотъемлемой составной частью MS SQL Server, последний может выступать в роли каждого из них. Конфигурирование и управление каждой ролью осуществляется из SQL Enterprise Manager через уже знакомые нам SQL-DMO или с помощью операторов и хранимых процедур языка Transact-SQL. Репликационной единицей в плане распространения и подписки является публикация (publication). Публикация состоит из одной или нескольких статей (articles). Статьей публикации называется отдельная таблица или ее вертикальный и/или горизонтальный фрагмент. Вертикальное фрагментирование осуществляется выбором соответствующих полей таблицы, горизонтальное - при помощи условия where или специальной процедуры горизонтальной фильтрации (CREATE PROCEDURE - FOR REPLICATION). Таблица обязана иметь первичный ключ. Как только на издателе созданы статьи, все тиражируемые объекты отмечаются специальным признаком в одном из полей системной таблицы sysobjects. Кроме этого, в тиражируемой базе ведется еще три справочные таблицы. Syspublications в отдельной строке хранит информацию о каждой новой публикации. Она связана отношением один-ко-многим с таблицей sysarticles, содержащей информацию о статьях и их принадлежностью публикациям. Наконец, последняя, в свою очередь, связана отношением один-ко-многим с таблицей syssubscriptions, где содержится информация о том, каким подписчикам адресована каждая статья.

Тиражирование в MS SQL Server основано на журнале транзакций (log-based). На каждую тиражируемую базу данных на дистрибьюторе запускается процесс под названием log reader, который читает журнал транзакций на издателе, выбирает оттуда все завершенные транзакции, помеченные к тиражированию и передает их дистрибьютору, на который с того момента возлагается вся дальнейшая ответственность по доведению этих транзакций до подписчика. Издатель, таким образом, высвобождается от всякой заботы по распространению транзакций и не расходует на это свои ресурсы. Каждый подписчик обслуживается отдельным потоком дистрибьютора. Клиент, первым запустивший sp_replcmds на публикуемой базе данных, рассматривается ею как log reader, все остальные попытки это сделать вызовут сообщение об ошибке. Процедура sp_repltrans позволяет получить список завершенных транзакций базы данных, еще не переданных дистрибьютору (идентификатор ряда, страница и отметка времени поступления). sp_replcmds содержит еще информацию о самих командах, связанных с этой транзакцией, и к какой статье публикации она относится. Log reader читает эти операции, определяет соответствующие им sql-команды и пишет их в базу данных распространения (distribution database) на дистрибьюторе. База данных распространения имеет таблицы MSjobs, содержащую информацию о транзакциях для тиражирования, связанную как один-ко-многим с таблицей MSjob_commands, которая разбивает каждую транзакцию на отдельные команды. Каждая команда должна быть передана определенному подписчику, что определяется в таблице MSsubscriber_jobs. На издателе прочитанные транзакции отмечаются как переданные на распространение, и только после этого они могут быть оттуда уничтожены при резервном копировании журнала транзакций (см. выше). Например, процедура sp_repldone, определяя транзакцию в журнале базы издателя по ряду и странице, помечает ее как распространенную. Процесс синхронизации (sync task), один на публикацию, всякий раз при появлении нового подписчика создает мгновенный снимок (snapshot) данных на издателе, подлежащих тиражированию этому подписчику. При этом создаются файлы схем данных и, собственно, содержания (bcp-типа), которые будут переданы подписчику при распространении для обеспечения первоначальной идентичности данных.

На дистрибьюторе существуют еще два вида процесса: распространение и очистка. Задача распространения создается для каждой пары "тиражируемая база/подписавшаяся база", а задача очистки - для пары "издатель/подписчик". Распространение (distribution task) применяет прочитанные из базы данных распространения sql-команды к базе данных подписчика. Процесс очистки (cleanup task) уничтожает все выполненные работы (т. е. транзакции) из базы данных распространения через некоторый настраиваемый интервал (retention period) после того, как они были доведены до подписчика. Задача очистки может быть создана вручную при помощи sp_addsubscriber, a задача распространения - как sp_addsubscription (sp_subscribe). Несмотря на то что организация всего процесса тиражирования может быть записана в кодах при помощи вызовов специальных хранимых процедур, эта черта используется на практике крайне редко и главным образом в целях отладки. В обычных ситуациях настройка и управление тиражированием осуществляются из графической среды SQL Enterprise Manager и планировщика задач SQL Executive.

Все задачи репликации на дистрибьюторе работают под управлением SQL Executive (msdb...systasks) и под его контекстом безопасности. Процесс выполнения любой из них можно контролировать в окне task history. Дополнительным средством контроля служит SQL Performance Monitor, куда передается необходимая статистическая информация о тиражировании (sp_replcounters). Соединение дистрибьютора с издателем происходит на основе DB-Library, а с подписчиком - через ODBC. Таким образом, в качестве подписчиков MS SQL Server может выступать широкий спектр ODBC-достижимых ресурсов, к которым, например, относятся другой Access, Sybase, Oracle, DB2 и т. д. Тиражирование в MS SQL Server основано на интегрированном режиме безопасности (см. Безопасность), следовательно, между дистрибьютором и подписчиком должны быть установлены доверительные соединения (trusted connections) с использованием поименованных каналов (named pipes) или мультипротокола. Если серверы находятся в разных доменах, между доменами должны быть установлены двусторонние доверительные отношения. В случае небольших объемов тиражируемых данных издатель часто совмещает с дистрибьютором на одном MS SQL Server. Отметим также, что серверы, участвующие в тиражировании, должны использовать одни и те же кодовые страницы.

MS SQL Server обладает обширными возможностями настройки процесса тиражирования. Мы уже упоминали о горизонтально-вертикальных фрагментах таблиц в качестве статей публикаций. Отметим, что для каждой статьи имеется возможность назначить к тиражированию только необходимые типы транзакций. Например, можно запретить передачу подписчикам транзакции типа "delete" в рамках данной статьи. Более того, на каждый тип транзакций можно настроить вид пользовательских действий на стороне подписчика. Например, при поступлении подписчику транзакций вставки и удаления они будут отрабатываться, как обычно, а по приходе транзакции типа "update" на подписчике будет вызываться некоторая хранимая процедура. Некоторые ограничения в тиражируемых данных бывает нецелесообразно передавать подписчику. В этом случае они помечаются как not for replication. Процесс синхронизации как самый дорогой в смысле трафика предусматривает возможность ручного выполнения синхронизации или полного отказа от синхронизации данных и передачу исключительно транзакций. Существует и обратная возможность: подписчику с определенной периодичностью будут поступать только мгновенные снимки данных, а не их изменения.

В зависимости от административного акцента MS SQL Server позволяет организовать подписку на стороне издателя либо на стороне подписчика. Первый вид подписки (push subscription) используется при централизованном распространении, когда подписки создаются "выталкиванием" статей на те или иные серверы-подписчики, которые могут не иметь своих администраторов. Второй вид (pull subscription) предполагает известную автономию сервера-подписчика, администратор которого определяет, какие публикации ему принимать. По умолчанию все публикации создаются со статусом безопасности "неограничено", они видны и на них могут подписаться любые зарегистрированные серверы подписки. Ограниченная публикация может быть выписана только теми серверами, которые имеют на это соответствующие права.

Вопросы безопасности доступа

Как мы уже отмечали, говоря о преимуществах интеграции с операционной системой, MS SQL Server использует в своей работе сервисы безопасности Windows NT. Напомним, что Windows NT на сегодня сертифицирована по классам безопасности С2/Е3. MS SQL Server может быть настроен на работу в одном из трех режимах безопасности. Интегрированный режим предусматривает использование механизмов аутентификации Windows NT для обеспечения безопасности всех пользовательских соединений. В этом случае к серверу разрешаются только трастовые, или аутентифицирующие, соединения (named pipes и multiprotocol). Администратор имеет возможность отобразить группы пользователей Windows NT на соответствующие значения login id MS SQL Server при помощи утилиты SQL Security Manager. В этом случае при входе на MS SQL Server login name и пароль, переданные через DB-Library или ODBC, игнорируются. Стандартный режим безопасности предполагает, что на MS SQL Server будут заводиться самостоятельные login id и соответствующие им пароли. Смешанный режим использует интегрированную модель при установлении соединений по поименованным каналам или мультипротоколу и стандартную модель во всех остальных случаях.

MS SQL Server обеспечивает многоуровневую проверку привилегий при загрузке на сервер. Сначала идентифицируются права пользователя на установление соединения с выбранным сервером (login name и пароль) и выполнение административных функций: создание устройств и баз данных, назначение прав другим пользователям, изменение параметров настройки сервера и т.д. Максимальными правами обладает системный администратор. На уровне базы данных каждый пользователь, загрузившийся на сервер, может иметь имя пользователя (username) базы и права на доступ к объектам внутри нее. Имеется возможность отобразить нескольких login id на одного пользователя базы данных, а также объединять пользователей в группы для удобства администрирования и назначения сходных привилегий. По отношению к объектам базы данных пользователю могут быть назначены права на выполнение различных операций над ними: чтение, добавление, удаление, изменение, декларативная ссылочная целостность (DRI), выполнение хранимых процедур, а также права на доступ к отдельным полям. Если этого недостаточно, можно прибегнуть к представлениям (views), для которых сказанное остается справедливым. Наконец, можно вообще запретить пользователю непосредственный доступ к данным, оставив за ним лишь права на выполнение хранимых процедур, в которых будет прописан весь сценарий его доступа к базе. Хранимые процедуры могут создаваться с опцией WITH ENCRYPTION, которая шифрует непосредственный текст процедуры, хранящийся обычно в syscomments. Права на выполнение некоторых команд (создание баз, таблиц, умолчаний, правил, представлений, процедур, резервное копирование баз и журналов транзакций) не являются объектно-специфичными, поэтому они назначаются системным администратором сервера или владельцем (создателем) базы данных при редактировании базы данных. Администрирование пользовательских привилегий обычно ведется в SQL Enterprise Manager, тем не менее в Transact-SQL имеются хранимые процедуры (sp_addlogin, sp_password, sp_revokelogin, sp_addalias, sp_adduser) и операторы (GRANT, REVOKE), которые позволяют осуществлять действия по созданию пользователей, назначению и отмене прав при выполнении скриптов. Дополнительную возможность администрирования привилегий предоставляют рассмотренные нами выше SQL-DMO.

Некоторые вопросы использования MS SQL Server в Internet/intranet-приложениях

Как мы уже отмечали, SQL-DMO являются одним из наиболее мощных инструментов доступа к информации, хранящейся на MS SQL Server, и решения административных задач из клиентских приложений. Традиционные вопросы клиентского доступа к MS SQL Server достаточно подробно освещались в литературе как по отношению к средствам разработки Microsoft Visual Tools (по крайней мере применительно к Visual C++, Visual Basic, Visual FoxPro), так и к программным продуктам фирм Borland, Powersoft и т. д. Программные модели, основанные на Microsoft Jet Database Engine (Data Access Objects), Remote Data Objects, DB-Library, ODBC API хорошо известны и широко используются. Поэтому мы акцентируем наше внимание на способах работы c MS SQL Server 6.5 через Internet.

Времена статических страниц объявлений и рекламы миновали - бурное развитие бизнеса в Internet предполагает непосредственное участие клиента в совершении сделок. Говоря об использовании MS SQL Server при построении активных Internet/intranet-приложений, мы снова должны обратиться к преимуществам его тесной интеграции со всеми продуктами семейства Microsoft BackOffice. На этот раз речь пойдет об Internet Information Server (IIS).

Помимо исполнения CGI-скриптов MS IIS предоставляет разработчикам возможность создания с помощью соответствующего прикладного программного интерфейса (ISAPI) приложений в виде динамических библиотек, запуск которых происходит в ответ на команду или выбор линка на Web-странице. В отличие от CGI, где каждый скрипт исполняется как иной, нежели Web-сервер, процесс, что быстро "съедает" ресурсы даже достаточно мощной машины при большом количестве заходов на сервер, ISAPI-приложение выполняется в адресном пространстве Web-сервера, что, естественно, повышает скорость работы и существенно экономит машинные ресурсы. В зависимости от сложности сайта и приложений, dll могут быть предзагружены одновременно с запуском сервера, либо подгружаться/выгружаться из памяти по мере необходимости. К наиболее известным средствам разработки приложений на основе ISAPI относятся входящий в состав MS IIS Internet Database Connector (IDC), а также свободно распространяемый dbWeb.

Microsoft dbWeb представляет собой шлюз между 32-битными ODBC-ресурсами и MS IIS. dbWeb предусматривает создавание схемы, содержащей описание данных и связанных с ними Web-страниц. Он поддерживает исполнение запросов в реальном режиме времени на основе "pull"-модели публикации, позволяя тем самым создавать активные Web-страницы. Microsoft dbWeb структурно состоит из двух основных компонентов: dbWeb Service и dbWeb Administrator. dbWeb Service является типичным ISAPI-приложением, которое обрабатывает пользовательские запросы, направляемые посетителем страницы через броузер, и управляет соединениями между броузером, ODBC-ресурсом и IIS. К функциям dbWeb Administrator относится создание HTML-страниц, содержащих результаты выполнения запросов на основе уже упоминавшихся схем, с помощью которых осуществляется управление публикуемыми данными. Схемы определяют сам запрос и структуру страниц. При этом не требуется знания HTML или ISAPI, так как в состав dbWeb Administrator входит интерактивный мастер-построитель схем (Schema Wizard), который в традиционной для любой программы-мастера манере позволяет задать поля поиска по методу Query-by-Example (QBE), выбрать поля для отображения в таблице страницы результатов и определить переходы из списка записей в отдельные страницы, содержащие развернутую информацию по текущей записи. Настройкой соответствующих свойств можно разрешать или запрещать операции вставки, удаления и редактирования. Для проверки прав пользователя используется система безопасности той СУБД, к которой происходит доступ.

IDC входит в состав MS IIS. С помощью вызовов функций ODBC API он обеспечивает прямую связь между полями HTML-формы и соответствующим ODBC-достижимым источником данных. Для доступа к данным и публикации на Web IDC использует файлы двух типов - .idc и .htx. Файл с расширением idc (см. пример) содержит всю необходимую информацию о соединении с источником данных, текст запроса, а также ссылку на соответствующий htx-файл. Файл с расширением htx (см. пример) служит шаблоном страницы, на которой будут опубликованы данные из базы, а также элементы оформления в виде статического текста, графики, видео и т. п. MS IIS распознает расширение .idc как вызов httpodbc.dll, которая считывает http-заголовки из управляющего блока ISAPI для определения параметров запроса. Httpodbc.dll читает и разбирает idc-файл, указанный в URL. Имя источника, имя пользователя, пароль и пр. используются для подключения к соответствующему ресурсу ODBC, после чего httpodbc передает на выполнение SQL-запрос и получает результаты. Результаты используются для наполнения заготовки в виде htx-файла, затем полученный HTML-документ MS IIS передает броузеру.

SQL Web Assistant, входящий в состав MS SQL Server 6.5, в отличие от двух только что рассмотренных инструментов, не является ISAPI-приложением и работает только с MS SQL Server. Web Assistant имеет интерфейс мастера (wizard), т. е. состоит из ряда последовательных форм с вопросами, отвечая на которые, администратор может сэкономить время по выполнению рутинного HTML-кодирования и получить готовую (в HTML-кодах) страницу, содержащую результаты опубликования произвольного запроса к базе. Полученная страница не является активной в строгом смысле этого слова, так как публикуется при помощи push-метода, т. е. обновление происходит по инициативе сервера и не допускает обновления со стороны клиента. Однако сервер может производить обновление (перегенерацию) страницы на триггерной основе или на основе расписаний задач под управлением SQL Executive. Мастер работает только с базами данных MS SQL Server и использует три хранимые процедуры sp_makewebtask, sp_runwebtask и sp_dropwebtask. При необходимости они могут использоваться самостоятельно в кодах Transact-SQL. Предположим, мы имеем каталог товаров или справочник курсов валют и хотим, чтобы все изменения в нем автоматически отражались на Web. Для этого мы определяем задачу публикации:

sp_makewebtask @outputfile = 'c:rates.htm', @query = 'select kod, kurs from rates',

@procname=web_rates, @resultstitle = 'Курсы валют',

@URL = "http://www.microsoft.com", @reftext = 'Microsoft Home Page', @whentype=9,

а на соответствующую таблицу "вешаем" триггер

if exists (select * from sysobjects where id = object_id('dbo.tr') and sysstat & 0xf = 8)

        drop trigger dbo.tr

go

create trigger tr on dbo.rates for insert,update,delete

as exec sp_runwebtask @procname=web_rates

go,

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

Active Data Objects (ADO) в достаточно грубом приближении служат VB-интерфейсом к OLE DB. Их роль видится особенно важной в развитии компонентного подхода и технологий универсального доступа к данным. В данном случае мы рассмотрим их использование в Microsoft Active Server Pages (ASP). Активные серверные страницы представляют собой инструмент для эффективной разработки серверных Web-приложений, интегрирующих в своем составе HTML-код, VBScript и компоненты ActiveX. С их помощью в уже существующие наработки легко могут быть встроены фрагменты кода на VBScript или JavaScript, а также вызовы соответствующих объектов ActiveX. Помимо базовых объектов (Application, Request, Response, Server, Session) ASP поддерживают многочисленные компоненты ActiveX, которые упрощают создание и значительно повышают функциональность активных Web-страниц. Среди них нас в первую очередь будут интересовать компоненты, позволяющие организовать доступ к базам данных, т. е. ADO. Например, публикация результата запроса может быть выполнена, как:

<% set c=Server.CreateObject ("ADODB.Connection")

        c.Open "rates","sa",""

        set RS=c.Execute("select * from rates")%>

content="text/html; charset=windows-1251">

Курсы валют

Курсы валют

       

               

       

       

<% do while not RS.EOF %>   

               

               

       

<% RS.MoveNext

        loop %>

Код Курс
<%=RS("kod")%>   <%=RS("kurs")%>