Оптимизация работы серверов баз данных Microsoft SQL Server 2005

Чтение данных SQL Server через интернет

Разбить на страницы
Показывать лекцию целиком

Приложения могут нуждаться в доступе к серверу SQL Server через интернет по многим причинам. Например, клиентское приложение, выполняющееся на удаленном компьютере за пределами локальной сети, может обращаться к серверу SQL Server через интернет. Приложение, написанное для другой платформы и не имеющее поддержки поставщиков ODBC или OLE DB, может использовать HTTP как канал для связи с SQL Server.

В зависимости от сетевого протокола, используемого вызывающим приложением, можно при желании открыть доступ к серверу SQL Server либо через протокол TCP/IP, либо через протокол HTTP. Оба подхода настраиваются в SQL Server особым образом, причем возможности, предоставляемые вызывающему приложению каждым из этих подходов, не одинаковы.

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

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

Прямой доступ к серверу SQL Server

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

  • Создании собственного соединения SQL Server через TCP/IP
  • Вызовах SQL Server через конечную точку HTTP
  • Реализуя любой из этих двух подходов, следует не забывать о требованиях безопасности.

    Подключение через TCP/IP

    При использовании протокола TCP/IP SQL Server реализует собственный протокол передачи данных, который называется Tabular Data Stream, TDS (Протокол передачи табличных данных). Клиентское приложение должно использовать совместимый поставщик (ODBC, OLE DB или SQLNCLI), чтобы трансформировать свои запросы в формат TDS.

    На рис. 5.1 показана минимальная рекомендуемая физическая инфраструктура, необходимая для того, чтобы обеспечить доступность SQL Server по протоколу TCP/IP через интернет.

    (рис 5.1) Физическая инфраструктура, необходимая для обеспечения доступа к серверу SQL Server по протоколу TCP/IP через интернет

    Межсетевой экран ограничивает доступ к внутренней сети, перенаправляя только те запросы, которые предназначены конкретным TCP/IP-адресам локальной сети. Это означает, что:

  • Клиентское приложение должно знать TCP/IP-адрес и сетевой порт, которые прослушивает SQL Server.
  • Межсетевой экран должен быть сконфигурирован таким образом, чтобы разрешать доступ к определенным TCP/IP-адресам, прослушиваемым SQL Server.
  • Устанавливаем соединение с сервером SQL Server по протоколу TCP/IP через интернет

  • Убедитесь, что на сервере SQL Server включен протокол передачи данных TCP/IP.
  • Сконфигурируйте экземпляр SQL Server на прослушивание определенных IP-адресов.
  • Сообщите клиентскому приложению точный IP-адрес и порт, которые прослушивает сервер SQL Server, откройте соединение со стороны клиентского приложения и выполните запросы.
  • Эти действия детализируются в следующих разделах данной лекции.

    Проверяем, включен ли протокол TCP/IP на сервере SQL Server

    SQL Server обеспечивает поддержку нескольких протоколов передачи данных. Чтобы проверить, включен ли протокол TCP/IP, выполните следующие действия:

  • В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, Configuration Tools, SQL Server Configuration Manager. (Все программы, Microsoft SQL Server 2005, Средства настройки, Диспетчер конфигурации SQL Server). Окно Диспетчера конфигурации SQL Server показано на следующем рисунке:
  • В дереве объектов в левой части окна щелкните значок "плюс" (+) рядом с узлом SQL Server Network Configuration (Сетевая конфигурация SQL Server 2005). Выделите узел Protocols For (Протоколы для) <имя_экземпляра> для того экземпляра SQL Server, который нужно сконфигурировать:
  • В правой панели окна отображается список доступных сетевых протоколов. Если протокол TCP/IP помечен как Enabled (Включен), то сервер готов принимать соединения по протоколу TCP/IP. Если TCP/ IP находится в состоянии Disabled (Отключен), то нужно щелкнуть правой кнопкой мыши пиктограмму TCP/IP и выбрать из контекстного меню команду Enable (Включить), как показано на рисунке:
  • Средство Настройка контактной зоны SQL Server

    Инструмент SQL Server Surface Area Configuration (Настройка контактной зоны SQL Server 2005) также можно использовать для проверки состояния протокола TCP/IP. Если вы воспользуетесь инструментом Настройка контактной зоны SQL Server, то сможете выполнить дополнительную настройку доступных протоколов передачи данных. Чтобы использовать этот инструмент, выполните следующие действия:

  • В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, Configuration Tools, SQL Server Surface Area Configuration. (Все программы, Microsoft SQL Server 2005, Средства настройки, Настройка контактной зоны SQL Server). Окно Диспетчера конфигурации SQL Server показано на следующем рисунке.
  • Щелкните ссылку Surface Area Configuration For Services And Connection (Настройка контактной зоны для служб и соединений) в нижней части окна.
  • В окне Surface Area Configuration For Services And Connection (Настройка контактной зоны для служб и соединений) в дереве в левой части окна щелкните значок плюс (+) рядом с экземпляром SQL Server, который нужно сконфигурировать. Аналогичным образом разверните дерево узла Database Engine, а затем выделите узел Remote Connections (Удаленные соединения), как показано ниже:
  • В правой части окна выберите вариант Local And Remote Connections (Локальные и удаленные соединения), а затем вариант Using TCP/IP Only (Использовать только TCP/IP):
  • Нажмите кнопку ОК. SQL Server проинформирует вас о том, что изменения вступят в силу после перезапуска службы SQL Server.
  • Настраиваем прослушивание определенных IP-адресов сервером SQL Server

    Экземпляр SQL Server по умолчанию прослушивает порт TCP номер 1433. Именованные экземпляры SQL Server получают динамически назначаемый адрес порта TCP при загрузке экземпляра. Если нужно обеспечить доступ к экземпляру SQL Server через интернет, необходимо настроить прослушивание экземпляром конкретного порта, который не назначается динамически. Чтобы настроить прослушивание определенного порта TCP именованным экземпляром сервера, выполните следующие действия:

  • Снова запустите SQL Server Configuration Manager (Диспетчер конфигурации SQL Server).
  • В дереве в левой панели разверните узел Server Network Configuration (Сетевая конфигурация сервера), щелкнув на значке "плюс" (+) рядом с этим узлом. Выделите узел Protocols For (Протоколы для) <имя_экземпляра> для того экземпляра SQL Server, который нужно сконфигурировать:
  • Выполните двойной щелчок на элементе TCP/IP, который отображается в правой панели.
  • В окне TCP/IP Properties (Свойства: TCP/IP) перейдите на вкладку IP Addresses (IP-адреса), которая показана на рисунке:
  • Обратите внимание на секцию IPAII в нижней части окна. Если свойство TCP Dynamic Ports (Динамические TCP-порты) содержит значение 0, то удалите 0 и оставьте свойство незаполненным. Затем измените свойство TCP Port (TCP-порт), задав определенный номер порта, который должен прослушивать сервер SQL Server:

    Нажмите кнопку ОК. Диспетчер конфигурации SQL Server проинформирует вас о том, что изменения вступят в силу после перезапуска службы SQL Server.

    Важно. Некоторые порты зарезервированы для определенных приложений. SQL Server не может прослушивать порт, если он используется другим приложением. Просмотрите списки Комитета по цифровым адресам в интернете (IANA), чтобы выяснить, какие номера портов не используются: http://www.iana.org/ assignments/port-numbers.
  • Направляем клиентские приложения по правильным IP-адресам и выполняем запросы

    Заключительный этап в обеспечении соединения клиентских приложений с SQL Server через интернет по протоколу TCP/IP – это направление всех вызовов клиентских приложений на соответствующий сервер при помощи IP-адреса и номера порта, прослушиваемых сервером.

    Строка соединения для указания имени сервера должна соответствовать такому формату:

    Data Source=tcp:<ip_address>/instance,<port_number>;
    Initial Catalog=<database_name>; 
    User ID=<user_id>; 
    Password=<password>;

    Пример корректной строки соединения в этом формате:

    Data Source=tcp:190.190.200.100/Sales,1344;
    Initial Catalog=AdventureWorks; 
    User ID=sa;
    Password=Pa$$w0rd;
    Примечание. Если соединение устанавливается с экземпляром по умолчанию, указывать имя экземпляра не нужно.

    Следующий пример программного кода (который можно найти среди файлов примеров в папке ConnectThroughTCP-port) показывает, как открыть соединение с сервером SQL Server через интернет с использованием протокола TCP/IP и извлечь все записи о сотрудниках из базы данных Adventure Works. Чтобы использовать этот пример, нужно изменить фрагменты строки соединения, выделенные полужирным шрифтом так, чтобы они соответствовали вашей среде. Для обмена данными с сервером через интернет необходим публичный IP-адрес. Если передача данных осуществляется в интрасети, IP-адреса, выделенного серверу в этой сети, вполне достаточно. Используйте <номер_порта>, который был задан в разделе "Настраиваем прослушивание определенных IP-адресов сервером SQL Server".

    Совет. Чтобы установить соединение с сервером SQL Server с помощью имени пользователя и пароля, следует настроить SQL Server на использование комбинированного режима проверки подлинности (SQL Server + Windows). Дополнительную информацию об этом режиме проверки подлинности можно найти в лекции 2-3 "Разработка и защита баз данных в Microsoft SQL Server 2005". На момент написания этой лекции SQL Server не признавал учетные данные Windows, если при подключении по протоколу TCP использовался параметр Integrated Security = true, поскольку TCP/IP не является протоколом аутентификации. Это означает, что соединения не аутентифицируются при использовании учетных данных Windows. Чтобы пройти проверку подлинности, следует использовать идентификатор SQL и указать в строке соединения имя пользователя и пароль. Примечание. Чтобы узнать IP-адрес компьютера, выберите в меню Start (Пуск) команду Run (Выполнить). Введите в диалоговом окне Run (Выполнить) команду cmd и нажмите кнопку ОК. Откроется окно командной строки. В строке приглашения введите команду ipconfig и нажмите клавишу Enter. Вы увидите IP-адрес компьютера. Введите команду exit и нажмите клавишу Enter, чтобы закрыть окно командной строки.
    Public Sub GetEmployeeList() 
      Dim connectionString As String 
      connectionString = "Data Source=tcp:192.168.1.102,49152;" + _
                         "Initial Catalog=AdventureWorks; User ID=Mary; password=34TY$$543"
      Dim query As String
      query = "SELECT Person.Contact.FirstName + " " + " + _
              "Person.Contact.LastName AS "Employees" " + _
              "FROM Person.Contact " + _
              "INNER JOIN HumanResources.Employee " + _
              "ON Person.Contact.ContactID = HumanResources.Employee.ContactID"
      Using cn As New SqlClient.SqlConnection(connectionString) 
      Using cmd As New SqlClient.SqlCommand(query, cn)
      cn.Open()
      Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader()
      While (dr.Read())
        Console.WriteLine(dr(0)) 
      End While
      End Using 
      End Using 
    End Sub
    Важно. Выполнив описанные выше действия, вы настроили сервер SQL Server на выполнение следующих действий:
  • Использование TCP/IP в качестве сетевого протокола.
  • Прослушивание определенного порта IP.
  • Помимо этого необходимо сконфигурировать межсетевой экран или прокси-сервер вашей организации на разрешение доступа к SQL Server из внешних приложений.

    Установление соединения через конечные точки HTTP

    В SQL Server 2005 появилась возможность использовать протокол HTTP в качестве протокола передачи данных через конечные точки HTTP. Вот основные преимущества использования конечных точек HTTP:

  • Внешние клиентские приложения могут устанавливать соединения с SQL Server через интернет при помощи протокола передачи данных HTTP независимо от их физического размещения.
  • Клиентские приложения, написанные на таких языках программирования или для таких платформ выполнения, которые не поддерживают ни одного из поставщиков доступа к данным SQL Server, тем не менее, могут выполнять запросы к SQL Server через доступ по HTTP.
  • Нет необходимости добавлять в конфигурацию межсетевого экрана дополнительные открытые порты. Передача данных ведется через 80 порт, как и все прочие коммуникации HTTP.
  • Устанавливаем соединение с SQL Server по протоколу HTTP

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

    Эти действия детализируются в следующих разделах данной лекции.

    Дополнительная информация Возможности HTTP в SQL Server зависят от API HTTP (HTTP.sys), предоставляемого операционной системой, на которой выполняется сервер. В настоящее время только Windows XP SP2 и Windows Server 2003 предоставляют поддержку для HTTP.sys.
  • Создаем хранимые процедуры или пользовательские функции, чтобы инкапсулировать выполняемые публично операции

    Конечные точки HTTP в SQL Server 2005 обеспечивают способ описания сервис-ориентированного интерфейса для операций баз данных. Выражение "сервис-ориентированный" означает, что клиентское приложение не устанавливает соединение и не выполняет напрямую определенные хранимые процедуры или пользовательские функции; вместо этого конечная точка HTTP представляет эти хранимые процедуры и пользовательские функции как службы (Веб-службы с поддержкой XML) через предварительно заданный формат, который называется форматом WSDL (Web Services Description Language, язык описания веб-служб).

    Для обмена XML-сообщениями и клиент, и сервер должны соблюдать этот формат.

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

    Создаем хранимую процедуру

  • В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, SQL Server Management Studio (Все программы, Microsoft SQL Server 2005, Среда SQL Server Management Studio).
  • В диалоговом окне Connect To Server (Соединение с сервером) укажите действующие учетные данные проверки подлинности и нажмите кнопку Connect (Соединить), чтобы выполнить вход в систему SQL Server.
  • Если окно нового запроса не было открыто раньше, нажмите кнопку New Query (Новый запрос), чтобы открыть окно нового запроса. В этом окне введите следующий текст, который можно найти в файле httpEndpoints.sql.
    USE AdventureWorks
    GO
    CREATE PROCEDURE GET_HEADER_LIST
    AS
      SELECT * FROM Sales.SalesOrderHeader 
    GO
  • Нажмите функциональную клавишу F5 или кнопку Execute (Выполнить), чтобы выполнить этот сценарий T-SQL. Протестируйте сделанную к этому моменту работу, выполнив следующую инструкцию для выполнения хранимой процедуры:
    EXEC GET_HEADER_LIST
  • Создаем и настраиваем конечную точку HTTP

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

    Чтобы настроить конфигурацию конечной точки HTTP,. администратор базы данных использует новую инструкцию языка описания данных (DDL), CREATE ENDPOINT.

    Создаем конечную точку HTTP

  • Откройте окно нового запроса в SQL Server Management Studio.
  • Введите следующий код T-SQL (его можно взять из файла примеров httpEndpoints.sql. URL tempuri.org представляет пространство имен XML. Можно использовать любую строку, если она является уникальной для организации или компьютера).Примечание. Если Internet Information Server (IIS) выполняется на том же компьютере, что и SQL Server, следует остановить службу IIS перед выполнением следующего кода. В противном случае вы получите сообщение об ошибке, информирующее вас о том, что указанный порт может быть занят другим процессом.
    USE MASTER 
    GO
    
    EXEC sp_reserve_http_namespace N'http://localhost:80/sql/myservices' 
    GO
    CREATE ENDPOINT [MyServices] 
      STATE=STARTED
    AS HTTP (
       PATH=N'/sql/myservices',
       PORTS = (CLEAR),
       AUTHENTICATION = (INTEGRATED) 
      ) 
      FOR SOAP (
        WEBMETHOD "http://tempuri.org/".'SalesHeadersList' ( 
          NAME=N'[AdventureWorks].[dbo].[GET_HEADER_LIST]', FORMAT=ROWSETS_ONLY)
  • Нажмите функциональную клавишу F5 или кнопку Execute (Выполнить), чтобы выполнить этот сценарий T-SQL.
  • Данный код создает конечную точку HTTP для представления хранимой процедуры GET_HEADER_LIST в качестве службы, доступной для клиентов через протоколы HTTP и SOAP (Simple Object Access Protocol, простой протокол доступа к объектам).

    Примечание. Чтобы избежать путаницы между несколькими конечными точками HTTP, каждое приложение должно зарезервировать свое пространство имен и зарегистрировать его в HTTP.sys. Это можно сделать неявно, создав новую конечную точку, либо явно, при помощи хранимой процедуры sp_reserve_http_namespace. См. дополнительную информацию в Электронной документации SQL Server 2005, тема "Резервирование пространства имен HTTP".

    Конечной точке HTTP, которая была определена выше, был присвоен идентификатор MyServices ; она готова начать получение запросов сразу после выполнения приведенного выше кода, так как этот код устанавливает свойство STATE в состояние STARTED. Другие возможные значения свойства STATE – это STOPPED и DISABLED.

    Код также задает для свойства AUTHENTICATION значение INTEGRATED. Это означает, что SQL Server будет пытаться проверить подлинность вызывающего приложения по учетным данным Windows с использованием протокола NTLM или Kerberos.

    Примечание. Если при попытке выполнения этого примера вы получите ошибку HTTP 403- Forbidden Access (Нет доступа), то это означает, что SQL Server не может проверить подлинность пользователя, который используется для вызова конечной точки. Это происходит независимо от используемой версии операционной системы и конфигурации механизма обеспечения безопасности пользователя. Дополнительную информацию можно найти в Электронной документации SQL Server 2005, тема "Указание проверки подлинности, отличной от Kerberos, в проектах Visual Studio".

    Другие протоколы проверки подлинности, например, Обычная проверка подлинности, в процессе проверки подлинности пересылают пароль в незашифрованном виде. При использовании Обычной проверки подлинности SQL Server 2005 требует шифрования канала передачи данных и защиты через протокол SSL (Secure Sockets Layer, протокол защищенных сокетов). Для параметра PORTS могут быть заданы значения CLEAR или SSL. CLEAR показывает, что канал передачи данных не использует SSL.

    Параметр PATH показывает относительный путь, который будет использоваться для идентификации конечной точки во внешней сети. Полный путь, который будет указывать клиентское приложение, следующий: http://server_name/sql/myservices. Для нашего примера можно направить Internet Explorer по ссылке http://localhost/sql/myservices?wsdl, чтобы проверить созданное сообщение XML.

    Важно. При создании конечной точки только члены роли sysadmin и владельцы конечной точки могут устанавливать с ней соединение. Другим пользователям необходимо предоставить разрешение на доступ к конечной точке. Это осуществляется посредством выполнения следующей инструкции: GRANT CONNECT ON HTTP ENDPOINT::[Имя_КонечнойТочки] TO [Домен\Учетная запись пользователя].

    После настройки конфигурации самой конечной точки, второй фрагмент инструкции CREATE ENDPOINT DDL настраивает хранимые процедуры и пользовательские функции, которые будут представлены в качестве службы.

    Администраторы базы данных могут объявить столько методов WEBMETHOD, сколько нужно. Каждый веб-метод (WEB-METHOD) настраивает конфигурацию одной службы, которая сопоставлена одной хранимой процедуре или одной пользовательской функции.

    Представленная служба в этом случае идентифицируется по псевдониму "http://tempuri.org/".'SalesHeader-sList'. Этот веб-метод сопоставлен хранимой процедуре, указанной в параметре NAME.

    Параметр FORMAT настраивает тип информации, возвращаемой SQL Server. ROWSETS_ONLY показывает, что следует возвращать только результаты. Потом клиентское приложение может воспользоваться объектом ADO.NET DataSet, чтобы получить эти данные.

    Параметр WSDL определяет, что формат WSDL может быть сгенерирован автоматически сервером SQL Server.

    Примечание. При создании конечной точки HTTP следует задать много важных параметров конфигурации. См. дополнительную информацию в Электронной документации SQL Server 2005 тему "Инструкция CREATE ENDPOINT (Transact-SQL)".

    Создаем ссылку на конечную точку HTTP из клиентского приложения

    Клиентские приложения, осуществляющие обмен данными через конечную точку HTTP, могут пересылать только такие запросы, которые соответствуют формату WSDL. Формат WSDL динамически создается сервером SQL Server путем объединения метаданных всех предоставляемых веб-методов (WEBMETHOD) и форматирования их по действующему формату WSDL.

    Клиентские приложения, разработанные при помощи среды разработки Microsoft Visual Studio 2005, могут легко создавать веб-ссылки на конечные точки HTTP.

    Чтобы создать веб-ссылку на конечную точку HTTP SQL Server, выполните следующие действия (этот проект можно найти в файлах примеров в папке ConsumeHTTPEndpoint ).

    Создаем веб-ссылку на конечную точку HTTP

  • Из меню Start (Пуск) откройте All Programs, Microsoft Visual Studio 2005, Microsoft Visual Studio 2005 (Все программы, Microsoft Visual Studio 2005, Microsoft Visual Studio 2005).
  • В меню File (Файл) выберите команду New (Создать), затем Project (Проект). В панели Project Types (Типы проектов) выберите Visual Basic, а в панели Templates (Шаблоны) выберите Windows Application (Приложение Windows). Укажите имя для проекта и папку для его размещения. Нажмите кнопку ОК, чтобы создать проект.
  • Если панель элементов не отображается, выведите ее на экран, выбрав команду Toolbox (Панель элементов) из меню View (Вид). Перетащите мышью элемент управления DataGridView (Сетка данных) из Панели элементов в область конструктора формы Form1.
  • Нажмите маленькую стрелку в правом верхнем углу элемента управления DataGridView, чтобы отобразить задачи смарт-тэг DataGridView. В этом смарт-тэге снимите флажки Enable Adding (Разрешить добавление), Enable Editing (Разрешить изменение) и Enable Deleting (Разрешить удаление).
  • Щелкните правой кнопкой мыши проект в Solution Explorer (Обозревателе решений) и выберите из контекстного меню команду Add Web Reference (Добавить веб-ссылку).
  • В окне Add Web Reference (Добавление веб-ссылки) введите следующий URL: http://localhost/sql/myservices?wsdl
  • Нажмите кнопку Go, а затем кнопку Add Reference (Добавить ссылку).

    Выполните двойной щелчок на форме в конструкторе и добавьте в обработчик событий Form1_Load следующий код:

    Private Sub Form1 Load(ByVal sender As System.Object, _ 
                           ByVal e As System.EventArgs) 
      Handles MyBase.Load 
      Dim ws As New localhost.MyServices 
      ws.Credentials = System.Net.CredentialCache.DefaultCredentials
      Dim headers As New DataSet 
      headers = ws.SalesHeadersList () 
      DataGridView1.DataSource = headers.Tables(0) 
      DataGridView1.AutoGenerateColumns = True 
    End Sub
  • Перейдите на вкладку Form1.vb [Проект] и нажмите клавишу F4, чтобы открыть окно Properties (Свойства). Выделите в окне свойств элемент управления DataGridView и задайте для свойства Dock значение Fill, щелкнув в средней панели раскрывающегося экрана.
  • Нажмите клавишу F5, чтобы скомпоновать и запустить приложение.
  • Форма загружается, и элемент управления DataGridView показывает список всех заголовков заказов на продажи, полученных от SQL Server.Важно. Microsoft настоятельно рекомендует защищать SQL Server межсетевым экраном, даже если подключение осуществляется через конечные точки HTTP.
  • Конечные точки HTTP позволяют интегрировать SQL Server 2005 в сервис-ориентированную архитектуру. У использования конечных точек HTTP есть некоторые недостатки.

  • Поскольку не используется веб-сервер, масштабируемость решения ограничена.
  • Не многие организации захотят открывать SQL Server для прямого доступа через интернет.
  • Эти недостатки можно нейтрализовать, если предоставлять доступ к SQL Server через дополнительный уровень ПО, который защитит установку SQL Server.

    Функциональная совместимость с другими системами при работе через конечные точки HTTP

    Каждая реляционная система управления базами данных (РСУБД) предоставляет интерфейс прикладного программирования (API), который разработчики могут использовать для взаимодействия с базой данных.

    Перечислим поставщики доступа к данным - это OLE DB, ODBC, DB-LIB, JDBC и SQLNCLI. Поставщик доступа к данным инкапсулирует сложную логику, реализованную посредством API для СУБД. Поставщик доступа к данным также предоставляет интерфейс, который позволяет разработчикам приложений один раз написать логическую схему доступа и потом использовать ее для взаимодействия с несколькими СУБД. Итак, для того, чтобы иметь возможность вести диалог с определенной СУБД, платформе разработки приложения требуется поддержка поставщика доступа к данным.

    SQL Server 2005 предоставляет альтернативу использования поставщиков доступа к данным в виде конечных точек HTTP.

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

    Единственное требование к приложению, которое подключается к конечной точке HTTP, заключается в том, чтобы это приложение могло вести обмен данными через протокол передачи данных HTTP и отправлять запросы в соответствии с определенным форматом XML/SOAP, которого требует SQL Server 2005.

    Платформы и языки программирования с отсутствием поддержки поставщиков доступа к данным OLE DB или ODBC могут осуществлять обмен данных с SQL Server 2005 через конечные точки HTTP.

    Вот некоторые примеры таких платформ, языков программирования и новых ситуаций, которые допускают использование конечных точек HTTP:

  • Мобильные устройства могут подключаться к корпоративному серверу SQL Server через конечные точки HTTP при помощи беспроводной сети.
  • Приложения, выполняемые в среде Linux/Unix или любых других операционных систем, могут обмениваться данными и потреблять данные от SQL Server 2005, не используя JDBC.
  • Сценарии, созданные в различных средах - таких, как PERL, Java или Microsoft Office Web Services - могут извлекать данные напрямую с SQL Server или даже создавать новые данные на сервере.
  • Доступ к SQL Server через дополнительный уровень программного обеспечения

    До сих пор в этой лекции рассказывалось о том, как открыть прямой доступ к SQL Server клиентским приложениям из внешних сетей.

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

    Ниже описаны преимущества реализации среднего уровня между клиентским приложением и SQL Server:

  • Средний уровень предоставляет дополнительный уровень безопасности, который будет фильтровать все входящие запросы.
  • Можно использовать компоненты инфраструктуры операционной системы, такие, как Internet Information Server (IIS), чтобы обеспечить более высокую масштабируемость и производительность, а также дополнительные возможности настройки, администрирования и безопасности.
  • Можно реализовать специализированный уровень доступа к данным, который смогут повторно использовать несколько приложений.
  • На рис. 5.2 показан пример возможной архитектуры для доступа к SQL Server через дополнительный уровень.

    (рис 5.2) Архитектура для доступа к SQL Server через компонент среднего уровня

    Интерфейс службы представляет собой фасад, который демонстрируется клиентским приложениям. В интерфейсе службы внешним пользователям предоставляется только общедоступный интерфейс, который скрывает всю сложность внутренней реализации доступа к SQL Server. Интерфейс службы должен также реализовать все необходимые проверки корректности ввода.

    Интерфейс службы поддерживается компонентом доступа к данным. Компонент доступа к данным реализует вызовы SQL Server через поставщики доступа к данным, например, OLE DB или ODBC.

    Инфраструктура Microsoft .NET Framework предоставляет несколько методов создания интерфейсов службы. В этой лекции рассматриваются только технологии ASP.NET Web-Services (Веб-службы ASP.NET) и Microsoft .NET Remoting (Удаленное взаимодействие Microsoft .NET).

    Совет. Чтобы получить более полную информацию по созданию уровней доступа к данным, обратитесь к руководству, которое можно найти на сайте Microsoft Patterns Practices Developer Center; руководство называется "Designing Data Tier Components and Passing Data Through Tiers" (Проектирование компонентов уровней данных и передача данных через уровни): http://msdn.microsoft.com/practices/ guidetype/Guides/default.aspx?pull=/library/en-us/ dnbda/html/boagag.asp.

    Веб-службы ASP.NET

    Как и конечные точки HTTP, веб-служба ASP.NET также использует формат WSDL, но в качестве службы представляет не хранимую процедуру, а логику приложения, написанную в виде компонентов.

    Веб-службы ASP.NET размещаются и выполняются на сервере Microsoft Internet Information Services (IIS). Чтобы просмотреть код этого раздела полностью, откройте файл Solution1.sln в папке 3tiers в файлах примеров. Отдельные компоненты находятся во вложенных папках.

    Чтобы реализовать доступ к SQL Server через интернет, но с подключением через веб-службу ASP.NET в среднем уровне, выполните следующие действия:

    Создаем компонент доступа к данным и интерфейс службы

  • Начните с написания компонента доступа к данным для подключения к SQL Server. Откройте Visual Studio 2005 и создайте новый проект, выбрав шаблон Class Library (Библиотека классов) в окне New Project (Создание проекта). Дайте проекту имя
  • Замените программный код в файле Class1.vb следующим кодом (не забудьте изменить строку соединения, чтобы данные соответствовали вашей среде). Этот пример находится в папке 3tiers\DepartmentDataAccess.
    Imports System.Data.SqlClient
    Public Class DepartmentDataAccess
      Public Function GetAllDepartments() As DataSet 
        Dim result As New DataSet 
        Dim connectionString As String 
        Dim selectCommand As String
        connectionString = "server=(local);database=AdventureWorks;uid=sa" 
        selectCommand = "SELECT * FROM HumanResources.Department"
      
        Dim connection As New SqlConnection(connectionString)
        Dim adapter As New SqlDataAdapter(selectCommand, connection)
        adapter.Fill(result)
        Return result 
      End Function
    End Class

    Класс DepartmentDataAccess, в качестве примера, реализует единственный метод, который называется GetAllDepartments. Этот метод возвращает объект DataSet, который содержит все отделы компании Adventure Works.

  • В меню Build (Построение) в окне Visual Studio 2005 выберите Build (Построить) DepartmentDataAccess. Visual Studio 2005 скомпилирует проект в сборку. Эта сборка представляет уровень доступа к данным.
  • Давайте продолжим и создадим служебный интерфейс при помощи проекта веб-службы ASP.NET. В Visual Studio 2005 выберите из меню File (Файл) Add, New Website (Добавить, Новая веб-страница). Этот пример находится среди файлов примеров в папке 3tiers\webservice.
  • Выберите шаблон ASP.NET Web Service (Веб-служба ASP.NET) в окне New Project (Создание проекта), как показано ниже. Оставьте для остальных параметров значения по умолчанию. Нажмите кнопку ОК.
  • В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой мыши проект Web Service (Веб-служба) и выберите из контекстного меню команду Add Reference (Добавить ссылку). (Если Обозреватель решений не отображается, можно выбрать соответствующую команду в меню View (Вид).)
  • В окне Add Reference (Добавление ссылки), которое показано ниже, перейдите на вкладку Projects (Проекты), выберите проект
  • Под функцией HelloWorld, созданной шаблоном Visual Studio, введите следующий код:
    <WebMethod()> _
      Public Function GetDepartments() As System.Data.DataSet
        Dim departmentsDL As New DepartmentDataAccess.DepartmentDataAccess()
        Return departmentsDL.GetAllDepartments() 
      End Function
  • Нажмите клавишу F5, чтобы скомпилировать проект веб-службы ASP.NET и запустить его. Если Visual Studio выведет запрос о запуске отладки, выберите параметр Run Without Debugging (Запуск без отладки), как показано на рисунке:
  • Internet Explorer откроет веб-страницу, на которой можно протестировать веб-службу, как показано на следующем рисунке: Выберите службу GetDepartments.
  • Internet Explorer перейдет на страницу GetDepartments, показанную на рисунке. Нажмите кнопку Invoke, чтобы выполнить веб-службу.
  • После вызова веб-службы код ASP.NET вызывает компонент доступа к данным, извлекает результаты в виде набора данных и, наконец, трансформирует весь ответ в формат XML:

    Конечно, клиентское приложение не будет выполнять веб-службу с помощью той же пробной веб-страницы, которую мы с вами только что использовали. Чтобы написать клиентское приложение, которое будет потребителем веб-службы, можно выполнить те же действия, которые были описаны ранее в разделе "Создаем ссылку на конечную точку HTTP из клиентского приложения".

  • Технология удаленного взаимодействия Microsoft .NET Remoting

    Инфраструктура Microsoft .NET предоставляет различные технологии для обеспечения удаленным клиентам возможности установить соединение с компонентами на стороне сервера.

    Если использовать веб-службы ASP.NET, как в предыдущем разделе данной лекции, клиентское приложение будет осуществлять обмен данными с помощью формата SOAP через интерфейс сервиса.

    Microsoft .NET Remoting - это еще одна технология, которая позволяет удаленным приложениям осуществлять обмен данными с компонентами на стороне сервиса. Microsoft .NET Remoting позволяет настраивать используемый формат данных или протокол передачи данных. Например, вместо XML и SOAP можно использовать двоичный или любой другой пользовательский формат, а вместо протоколов HTTP или TCP - другой протокол по своему выбору.

    Главное отличие между веб-службами ASP.NET. и технологией .NET Remoting –заключается в том, что .NET Remoting использует не сервис-ориентированную архитектуру, а удаленный вызов процедур (RPC) объект-объект.

    Создаем объект .NET Remoting

    Построим пример, используя в качестве основы кода пример из предыдущего раздела. Повторите действия с 1 по 4 из предыдущего раздела, а затем выполните следующую последовательность действий:

  • После создания компонента DepartmentDataAccess необходимо предоставить компонент интерфейса сервиса. В этом примере мы создадим интерфейс сервиса .NET Remoting. В Visual Studio 2005 выберите из меню File (Файл) Add, New Project (Добавить, Новый проект). Приложение для этого примера можно найти в файлах примеров в папке 3tiers\Remoting.
  • Выберите в диалоговом окне New Project (Создание нового проекта) шаблон Class Library (Библиотека классов) и дайте проекту имя DepartmentServiceInterface. Нажмите кнопку ОК.
  • В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой мыши проект DepartmentServiceInterface и выберите из контекстного меню команду Add Reference (Добавить ссылку).
  • В окне Add Reference (Добавление ссылки), которое показано ниже, перейдите на вкладку Projects (Проекты), выберите проект DepartmentDataAccess, а затем нажмите кнопку ОК,
  • Замените код в файле Class1.vb следующим кодом:
    Public Class DepartmentServiceInterface 
      Inherits MarshalByRefObject
      Public Function GetDepartments() As System.Data.DataSet
        Dim departmentsDL As New DepartmentDataAccess.DepartmentDataAccess() 
        Return departmentsDL.GetAllDepartments()
      End Function
    End Class
  • Скомпонуйте проект.
  • Последний компонент, который нужно создать – это несущее приложение. Когда мы создавали веб-службу ASP.NET, мы сконфигурировали ее так, чтобы она могла размещаться и выполняться на веб-сервере, например, Microsoft Internet Information Server (IIS). В следующем примере мы сконфигурируем объект .NET Remoting так, чтобы он тоже мог размещаться на сервере IIS.

    Настраиваем объект .NET Remoting под размещение на IIS

  • Создайте и настройте виртуальный каталог для размещения сборок в IIS.
  • Создайте конфигурационный файл web.config для настройки инфраструктуры Remoting.
  • Сгенерируйте класс-заместитель для удаленного объекта.
  • Создайте клиентское приложение, которое будет вызывать удаленный объект.
  • Создаем и настраиваем конфигурацию виртуального каталога в IIS

    С IIS в качестве среды размещения наше удаленное приложение может использовать механизм обеспечения безопасности IIS, протоколы передачи данных и встроенные механизмы обработки запросов. Установите сборки из компонента DepartmentServiceInterface в виртуальный каталог IIS:

  • Создайте новый каталог с именем DepartmentRemote на диске C.
  • В каталоге C:\DepartmentRemote создайте новую папку с именем bin.
  • Из меню Start (Пуск) выберите команду Control Panel (Панель управления). В Control Panel (Панели управления) выполните двойной щелчок на значке Administrative Tools (Администрирование), В окне Administrative Tools (Администрирование) дважды щелкните значок Internet Information Services.
  • В окне приложения для управления Internet Information Services нажмите значок (+), чтобы развернуть узел компьютера, затем разверните дерево узла Web-Sites (Веб-узлы), после этого щелкните узел Default Web Site, как показано ниже: (см. рис. вверху следующей страницы).
  • Из контекстного меню выберите команды New, Virtual Directory (Создать, виртуальный каталог).
  • В окне мастера Virtual Directory Creation Wizard (Мастер создания виртуальных каталогов) нажмите кнопку Next (Далее).
  • В окне Virtual Directory Alias (Псевдоним виртуального каталога) введите в качестве имени псевдонима DepartmentService и нажмите кнопку Next (Далее).
  • В окне Web Site Content Directory (Каталог содержимого веб-узла) введите или найдите через окно Browse (Обзор) путь к каталогу C:\DepartmentRemote в текстовом поле Directory (Каталог), а затем нажмите кнопку Next (Далее).
  • В окне Access Permissions (Права доступа) снимите все флажки, кроме Execute (Выполнение). Нажмите кнопку Next (Далее), чтобы перейти в последнее окно мастера.
  • Нажмите кнопку Finish (Готово).
  • Щелкните правой кнопкой мыши на вновь созданном виртуальном каталоге DepartmentRemote и выберите из контекстного меню команду Properties (Свойства).
  • В окне DepartmentService Properties (DepartmentService: свойства) перейдите на вкладку ASP.NET и измените номер версии ASP.NET на 2.Х.Х.Х, как показано на следующем рисунке: (Числа могут быть разными в зависимости от установки, но убедитесь в том, что это та же версия, что и версия Visual Studio, которую вы используете для компиляции сборок.) Затем нажмите кнопку OK, чтобы закрыть окно.Совет. Чтобы узнать номер версии Visual Studio, в окне Visual Studio выберите из меню Help (Справка) команду About Microsoft Visual Studio (О программе Microsoft Visual Studio).
  • В Проводнике Windows скопируйте все содержимое вложенных каталогов bin/debug, в которых вы сохранили проект DepartmentServiceInterface (автор использовал каталог по умолчанию, который предлагает Visual Studio 2005:
  • Создаем конфигурационный файл web.config для настройки инфраструктуры удаленного взаимодействия

  • При помощи Notepad (Блокнота) создайте новый файл с именем web.config в каталоге C:\DepartmentRemote.
  • Отредактируйте файл web.config, добавив в него следующий код XML (который можно найти в файлах примеров в папке 3tiers под именем web.config ).
    <configuration>
      <system.runtime.remoting> 
        <application> 
          <service>
            <wellknown mode="SingleCall"
                          type="DepartmentServiceInterface.DepartmentServiceInterface, 
                          DepartmentServiceInterface" 
                          objectUri="department.soap" />
          </service> 
        </application> 
      </system.runtime.remoting>
    </configuration>
  • Сохраните файл web.config.
  • Этот XML-файл задает конфигурацию инфраструктуры удаленного взаимодействия. Он объявляет новую службу с именем department.soap, которая соответствует классу DepartmentServiceInterface. DepartmentServiceInterface в сборке DepartmentServiceInterface. Параметр Mode="SingleCall" показывает, что для каждого запроса будет создан новый экземпляр этого класса.

    Генерируем класс-заместитель для удаленного объекта

    Чтобы обратиться к компоненту Service Interface (Интерфейс службы), клиентское приложение должно создать класс-заместитель. Класс-заместитель напоминает копию удаленного объекта; он объявляет те же методы и публичные интерфейсы, но при вызове со стороны клиента он выполняет маршрутизацию вызова к удаленному объекту. Набор инструментальных средств разработки Microsoft .NET Framework SDK предоставляет инструмент SOAPSuds, который можно использовать для того, чтобы сгенерировать класс-заместитель.

  • В меню Start (Пуск) выберите Programs, Microsoft .NET Framework 2.0 SDK, SDK Command Prompt (Все программы, Microsoft .NET Framework 2.0 SDK, SDK Command Prompt). Откроется окно командной строки.
  • В командной строке введите следующие команды:
  • cd \, чтобы перейти в корневой каталог диска
  • md ClientApp, чтобы создать новый каталог для клиентского приложения
  • cd ClientApp, чтобы перейти в папку ClientApp
  • soapsuds -url:http://localhost/departmentservice/department.soap?wsdl -oa:DepartmentProxy.dll
  • Утилита SOAPSuds загружает автоматически сгенерированный инфраструктурой удаленного взаимодействия файл описания службы, который описывает каждый из методов, предлагаемых классом DepartmentServiceInterface. На основе этого файла SOAPSuds генерирует новую сборку с именем DepartmentProxy.dll, которая содержит класс, способный использовать удаленную службу.

    Создаем клиентское приложение, которое будет вызывать удаленный объект

    Для вызова удаленной службы мы можем использовать класс-заместитель DepartmentProxy.dll. Чтобы создать клиентское приложение и использовать класс-заместитель, выполните следующие действия:

  • Запустите Visual Studio 2005 и создайте новый проект. В окне New Project (Создание проекта) выберите шаблон Windows Application (Приложение Windows). Код для этого примера можно найти в файлах примеров в папке 3tiers\ClientApp.
  • Дайте проекту имя ClientApp и нажмите кнопку ОК.
  • В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой мыши проект ClientApp и выберите из контекстного меню команду Add Reference (Добавить ссылку).
  • В окне Add Reference (Добавление ссылки) на вкладке .NET выделите System.Runtime.Remoting и нажмите кнопку ОК.
  • Снова щелкните на проекте ClientApp правой кнопкой мыши, чтобы добавить еще одну ссылку. В окне Add Reference (Добавление ссылки) перейдите на вкладку Browse (Обзор). Перейдите к папке C:\ClientApp и выделите сборку DepartmentProxy.dll, а затем нажмите кнопку ОК.
  • В область конструктора формы Form1 добавьте элемент управления DataGridView из панели Toolbox (Панели элементов).
  • В смарт-тэге DataGridView Tasks снимите флажки Enable Adding (Разрешить добавление), Enable Editing (Разрешить изменение) и Enable Deleting (Разрешить удаление).
  • Нажмите клавишу F4, чтобы открыть окно Properties (Свойства). Выберите в форме элемент управления DataGridView и задайте для свойства Dock значение Fill.
  • Добавьте в обработчик событий Form1_Load следующий код.
    Private Sub Form1_Load(ByVal sender As System.Object, _ 
                           ByVal e As System.EventArgs) 
      Handles MyBase.Load 
      Dim de As New DepartmentServiceInterface.DepartmentServiceInterface 
      Dim departments As New DataSet
      departments = de.GetDepartments() 
      DataGridView1.DataSource = departments.Tables(0) 
      DataGridView1.AutoGenerateColumns = True
    End Sub
  • Нажмите клавишу F5, чтобы скомпоновать и запустить приложение.
  • Форма загрузится, и элемент управления DataGridView покажет полученный от SQL Server список всех отделов.
  • Хотя это может показаться слишком сложным (конечно, так много шагов!), в целом архитектура нашего примера .NET Remoting, показанная на рис. 5.3, достаточно проста.

    (рис 5.3) Архитектура примера .NET Remoting

    И ASP.NET,. и .NET Remoting – это технологии среднего уровня, которые инкапсулируют набор компонентов и представляют компоненты как службы через интерфейс службы. Для развертывания SQL Server в безопасном окружении в серверной части СУБД можно использовать любое из этих двух решений, при этом удаленные клиенты смогут устанавливать соединения с приложением и извлекать нужные им данные.

    Заключение

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

    Краткий справочник по 5 лекции

    Чтобы Выполните следующие действия
    Открыть соединение с SQL Server через TCP/IP
  • Включите протокол передачи данных TCP/IP.
  • Сконфигурируйте экземпляр SQL Server на прослушивание определенных IP-адресов.
  • Сообщите клиентским приложениям точный IP-адрес и порт, которые будет прослушивать SQL Server.
  • Сконфигурируйте межсетевой экран на разрешение доступа через этот порт.
  • Убедиться, что протокол TCP/IP на сервере SQL Server включен В SQL Server Management Studio разверните узел SQL Server Network Configuration (Сетевая конфигурация SQL Server) и выберите Protocols For (Протоколы для) <имя_экземпляра>; или В SQL Server Surface Area Configuration (Настройка конфигурации контактной зоны SQL Server) щелкните ссылку Surface Area Configuration For Services And Connections (Настройка контактной зоны для служб и соединений), разверните конфигурируемый экземпляр, разверните узел Database Engine и выберите узел Remote Connections (Удаленные соединения).
    Направить клиентское приложение по правильному IP-адресу и номеру порта SQL Server Укажите IP-адрес и номер порта в строке соединения с помощью следующей синтаксической конструкции:
    Data Source = tcp:<ip_address>/instance,
    <номер_порта>;
    Обратиться к SQL Server с помощью XML/протоколов SOAP через HTTP Сконфигурируйте конечную точку HTTP с помощью инструкции T-SQL CREATE ENDPOINT DDL.
    Использовать веб-службы ASP.NET в среднем уровне С помощью Visual Studio 2005 создайте новый проект веб-службы. Инкапсулируйте код доступа к данным веб-службе, чтобы не демонстрировать сервер SQL Server пользователям интернета.
    Использовать технологию Microsoft .NET Remoting в среднем уровне Используйте Visual Studio 2005 для создания класса службы, который инкапсулирует код доступа, чтобы не открывать пользователям интернета доступ непосредственно к серверу SQL Server. Откройте класс службы для внешнего доступа с помощью хост- приложения, например, IIS.
    Страницы:

    Приложения могут нуждаться в доступе к серверу SQL Server через интернет по многим причинам. Например, клиентское приложение, выполняющееся на удаленном компьютере за пределами локальной сети, может обращаться к серверу SQL Server через интернет. Приложение, написанное для другой платформы и не имеющее поддержки поставщиков ODBC или OLE DB, может использовать HTTP как канал для связи с SQL Server.

    В зависимости от сетевого протокола, используемого вызывающим приложением, можно при желании открыть доступ к серверу SQL Server либо через протокол TCP/IP, либо через протокол HTTP. Оба подхода настраиваются в SQL Server особым образом, причем возможности, предоставляемые вызывающему приложению каждым из этих подходов, не одинаковы.

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

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

    Прямой доступ к серверу SQL Server

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

  • Создании собственного соединения SQL Server через TCP/IP
  • Вызовах SQL Server через конечную точку HTTP
  • Реализуя любой из этих двух подходов, следует не забывать о требованиях безопасности.

    Подключение через TCP/IP

    При использовании протокола TCP/IP SQL Server реализует собственный протокол передачи данных, который называется Tabular Data Stream, TDS (Протокол передачи табличных данных). Клиентское приложение должно использовать совместимый поставщик (ODBC, OLE DB или SQLNCLI), чтобы трансформировать свои запросы в формат TDS.

    На рис. 5.1 показана минимальная рекомендуемая физическая инфраструктура, необходимая для того, чтобы обеспечить доступность SQL Server по протоколу TCP/IP через интернет.

    (рис 5.1) Физическая инфраструктура, необходимая для обеспечения доступа к серверу SQL Server по протоколу TCP/IP через интернет

    Межсетевой экран ограничивает доступ к внутренней сети, перенаправляя только те запросы, которые предназначены конкретным TCP/IP-адресам локальной сети. Это означает, что:

  • Клиентское приложение должно знать TCP/IP-адрес и сетевой порт, которые прослушивает SQL Server.
  • Межсетевой экран должен быть сконфигурирован таким образом, чтобы разрешать доступ к определенным TCP/IP-адресам, прослушиваемым SQL Server.
  • Устанавливаем соединение с сервером SQL Server по протоколу TCP/IP через интернет

  • Убедитесь, что на сервере SQL Server включен протокол передачи данных TCP/IP.
  • Сконфигурируйте экземпляр SQL Server на прослушивание определенных IP-адресов.
  • Сообщите клиентскому приложению точный IP-адрес и порт, которые прослушивает сервер SQL Server, откройте соединение со стороны клиентского приложения и выполните запросы.
  • Эти действия детализируются в следующих разделах данной лекции.

    Проверяем, включен ли протокол TCP/IP на сервере SQL Server

    SQL Server обеспечивает поддержку нескольких протоколов передачи данных. Чтобы проверить, включен ли протокол TCP/IP, выполните следующие действия:

  • В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, Configuration Tools, SQL Server Configuration Manager. (Все программы, Microsoft SQL Server 2005, Средства настройки, Диспетчер конфигурации SQL Server). Окно Диспетчера конфигурации SQL Server показано на следующем рисунке:
  • В дереве объектов в левой части окна щелкните значок "плюс" (+) рядом с узлом SQL Server Network Configuration (Сетевая конфигурация SQL Server 2005). Выделите узел Protocols For (Протоколы для) <имя_экземпляра> для того экземпляра SQL Server, который нужно сконфигурировать:
  • В правой панели окна отображается список доступных сетевых протоколов. Если протокол TCP/IP помечен как Enabled (Включен), то сервер готов принимать соединения по протоколу TCP/IP. Если TCP/ IP находится в состоянии Disabled (Отключен), то нужно щелкнуть правой кнопкой мыши пиктограмму TCP/IP и выбрать из контекстного меню команду Enable (Включить), как показано на рисунке:
  • Средство Настройка контактной зоны SQL Server

    Инструмент SQL Server Surface Area Configuration (Настройка контактной зоны SQL Server 2005) также можно использовать для проверки состояния протокола TCP/IP. Если вы воспользуетесь инструментом Настройка контактной зоны SQL Server, то сможете выполнить дополнительную настройку доступных протоколов передачи данных. Чтобы использовать этот инструмент, выполните следующие действия:

  • В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, Configuration Tools, SQL Server Surface Area Configuration. (Все программы, Microsoft SQL Server 2005, Средства настройки, Настройка контактной зоны SQL Server). Окно Диспетчера конфигурации SQL Server показано на следующем рисунке.
  • Щелкните ссылку Surface Area Configuration For Services And Connection (Настройка контактной зоны для служб и соединений) в нижней части окна.
  • В окне Surface Area Configuration For Services And Connection (Настройка контактной зоны для служб и соединений) в дереве в левой части окна щелкните значок плюс (+) рядом с экземпляром SQL Server, который нужно сконфигурировать. Аналогичным образом разверните дерево узла Database Engine, а затем выделите узел Remote Connections (Удаленные соединения), как показано ниже:
  • В правой части окна выберите вариант Local And Remote Connections (Локальные и удаленные соединения), а затем вариант Using TCP/IP Only (Использовать только TCP/IP):
  • Нажмите кнопку ОК. SQL Server проинформирует вас о том, что изменения вступят в силу после перезапуска службы SQL Server.
  • Настраиваем прослушивание определенных IP-адресов сервером SQL Server

    Экземпляр SQL Server по умолчанию прослушивает порт TCP номер 1433. Именованные экземпляры SQL Server получают динамически назначаемый адрес порта TCP при загрузке экземпляра. Если нужно обеспечить доступ к экземпляру SQL Server через интернет, необходимо настроить прослушивание экземпляром конкретного порта, который не назначается динамически. Чтобы настроить прослушивание определенного порта TCP именованным экземпляром сервера, выполните следующие действия:

  • Снова запустите SQL Server Configuration Manager (Диспетчер конфигурации SQL Server).
  • В дереве в левой панели разверните узел Server Network Configuration (Сетевая конфигурация сервера), щелкнув на значке "плюс" (+) рядом с этим узлом. Выделите узел Protocols For (Протоколы для) <имя_экземпляра> для того экземпляра SQL Server, который нужно сконфигурировать:
  • Выполните двойной щелчок на элементе TCP/IP, который отображается в правой панели.
  • В окне TCP/IP Properties (Свойства: TCP/IP) перейдите на вкладку IP Addresses (IP-адреса), которая показана на рисунке:
  • Обратите внимание на секцию IPAII в нижней части окна. Если свойство TCP Dynamic Ports (Динамические TCP-порты) содержит значение 0, то удалите 0 и оставьте свойство незаполненным. Затем измените свойство TCP Port (TCP-порт), задав определенный номер порта, который должен прослушивать сервер SQL Server:

    Нажмите кнопку ОК. Диспетчер конфигурации SQL Server проинформирует вас о том, что изменения вступят в силу после перезапуска службы SQL Server.

    Важно. Некоторые порты зарезервированы для определенных приложений. SQL Server не может прослушивать порт, если он используется другим приложением. Просмотрите списки Комитета по цифровым адресам в интернете (IANA), чтобы выяснить, какие номера портов не используются: http://www.iana.org/ assignments/port-numbers.
  • Направляем клиентские приложения по правильным IP-адресам и выполняем запросы

    Заключительный этап в обеспечении соединения клиентских приложений с SQL Server через интернет по протоколу TCP/IP – это направление всех вызовов клиентских приложений на соответствующий сервер при помощи IP-адреса и номера порта, прослушиваемых сервером.

    Строка соединения для указания имени сервера должна соответствовать такому формату:

    Data Source=tcp:<ip_address>/instance,<port_number>;
    Initial Catalog=<database_name>; 
    User ID=<user_id>; 
    Password=<password>;

    Пример корректной строки соединения в этом формате:

    Data Source=tcp:190.190.200.100/Sales,1344;
    Initial Catalog=AdventureWorks; 
    User ID=sa;
    Password=Pa$$w0rd;
    Примечание. Если соединение устанавливается с экземпляром по умолчанию, указывать имя экземпляра не нужно.

    Следующий пример программного кода (который можно найти среди файлов примеров в папке ConnectThroughTCP-port) показывает, как открыть соединение с сервером SQL Server через интернет с использованием протокола TCP/IP и извлечь все записи о сотрудниках из базы данных Adventure Works. Чтобы использовать этот пример, нужно изменить фрагменты строки соединения, выделенные полужирным шрифтом так, чтобы они соответствовали вашей среде. Для обмена данными с сервером через интернет необходим публичный IP-адрес. Если передача данных осуществляется в интрасети, IP-адреса, выделенного серверу в этой сети, вполне достаточно. Используйте <номер_порта>, который был задан в разделе "Настраиваем прослушивание определенных IP-адресов сервером SQL Server".

    Совет. Чтобы установить соединение с сервером SQL Server с помощью имени пользователя и пароля, следует настроить SQL Server на использование комбинированного режима проверки подлинности (SQL Server + Windows). Дополнительную информацию об этом режиме проверки подлинности можно найти в лекции 2-3 "Разработка и защита баз данных в Microsoft SQL Server 2005". На момент написания этой лекции SQL Server не признавал учетные данные Windows, если при подключении по протоколу TCP использовался параметр Integrated Security = true, поскольку TCP/IP не является протоколом аутентификации. Это означает, что соединения не аутентифицируются при использовании учетных данных Windows. Чтобы пройти проверку подлинности, следует использовать идентификатор SQL и указать в строке соединения имя пользователя и пароль. Примечание. Чтобы узнать IP-адрес компьютера, выберите в меню Start (Пуск) команду Run (Выполнить). Введите в диалоговом окне Run (Выполнить) команду cmd и нажмите кнопку ОК. Откроется окно командной строки. В строке приглашения введите команду ipconfig и нажмите клавишу Enter. Вы увидите IP-адрес компьютера. Введите команду exit и нажмите клавишу Enter, чтобы закрыть окно командной строки.
    Public Sub GetEmployeeList() 
      Dim connectionString As String 
      connectionString = "Data Source=tcp:192.168.1.102,49152;" + _
                         "Initial Catalog=AdventureWorks; User ID=Mary; password=34TY$$543"
      Dim query As String
      query = "SELECT Person.Contact.FirstName + " " + " + _
              "Person.Contact.LastName AS "Employees" " + _
              "FROM Person.Contact " + _
              "INNER JOIN HumanResources.Employee " + _
              "ON Person.Contact.ContactID = HumanResources.Employee.ContactID"
      Using cn As New SqlClient.SqlConnection(connectionString) 
      Using cmd As New SqlClient.SqlCommand(query, cn)
      cn.Open()
      Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader()
      While (dr.Read())
        Console.WriteLine(dr(0)) 
      End While
      End Using 
      End Using 
    End Sub
    Важно. Выполнив описанные выше действия, вы настроили сервер SQL Server на выполнение следующих действий:
  • Использование TCP/IP в качестве сетевого протокола.
  • Прослушивание определенного порта IP.
  • Помимо этого необходимо сконфигурировать межсетевой экран или прокси-сервер вашей организации на разрешение доступа к SQL Server из внешних приложений.

    Установление соединения через конечные точки HTTP

    В SQL Server 2005 появилась возможность использовать протокол HTTP в качестве протокола передачи данных через конечные точки HTTP. Вот основные преимущества использования конечных точек HTTP:

  • Внешние клиентские приложения могут устанавливать соединения с SQL Server через интернет при помощи протокола передачи данных HTTP независимо от их физического размещения.
  • Клиентские приложения, написанные на таких языках программирования или для таких платформ выполнения, которые не поддерживают ни одного из поставщиков доступа к данным SQL Server, тем не менее, могут выполнять запросы к SQL Server через доступ по HTTP.
  • Нет необходимости добавлять в конфигурацию межсетевого экрана дополнительные открытые порты. Передача данных ведется через 80 порт, как и все прочие коммуникации HTTP.
  • Устанавливаем соединение с SQL Server по протоколу HTTP

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

    Эти действия детализируются в следующих разделах данной лекции.

    Дополнительная информация Возможности HTTP в SQL Server зависят от API HTTP (HTTP.sys), предоставляемого операционной системой, на которой выполняется сервер. В настоящее время только Windows XP SP2 и Windows Server 2003 предоставляют поддержку для HTTP.sys.
  • Создаем хранимые процедуры или пользовательские функции, чтобы инкапсулировать выполняемые публично операции

    Конечные точки HTTP в SQL Server 2005 обеспечивают способ описания сервис-ориентированного интерфейса для операций баз данных. Выражение "сервис-ориентированный" означает, что клиентское приложение не устанавливает соединение и не выполняет напрямую определенные хранимые процедуры или пользовательские функции; вместо этого конечная точка HTTP представляет эти хранимые процедуры и пользовательские функции как службы (Веб-службы с поддержкой XML) через предварительно заданный формат, который называется форматом WSDL (Web Services Description Language, язык описания веб-служб).

    Для обмена XML-сообщениями и клиент, и сервер должны соблюдать этот формат.

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

    Создаем хранимую процедуру

  • В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, SQL Server Management Studio (Все программы, Microsoft SQL Server 2005, Среда SQL Server Management Studio).
  • В диалоговом окне Connect To Server (Соединение с сервером) укажите действующие учетные данные проверки подлинности и нажмите кнопку Connect (Соединить), чтобы выполнить вход в систему SQL Server.
  • Если окно нового запроса не было открыто раньше, нажмите кнопку New Query (Новый запрос), чтобы открыть окно нового запроса. В этом окне введите следующий текст, который можно найти в файле httpEndpoints.sql.
    USE AdventureWorks
    GO
    CREATE PROCEDURE GET_HEADER_LIST
    AS
      SELECT * FROM Sales.SalesOrderHeader 
    GO
  • Нажмите функциональную клавишу F5 или кнопку Execute (Выполнить), чтобы выполнить этот сценарий T-SQL. Протестируйте сделанную к этому моменту работу, выполнив следующую инструкцию для выполнения хранимой процедуры:
    EXEC GET_HEADER_LIST
  • Создаем и настраиваем конечную точку HTTP

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

    Чтобы настроить конфигурацию конечной точки HTTP,. администратор базы данных использует новую инструкцию языка описания данных (DDL), CREATE ENDPOINT.

    Создаем конечную точку HTTP

  • Откройте окно нового запроса в SQL Server Management Studio.
  • Введите следующий код T-SQL (его можно взять из файла примеров httpEndpoints.sql. URL tempuri.org представляет пространство имен XML. Можно использовать любую строку, если она является уникальной для организации или компьютера).Примечание. Если Internet Information Server (IIS) выполняется на том же компьютере, что и SQL Server, следует остановить службу IIS перед выполнением следующего кода. В противном случае вы получите сообщение об ошибке, информирующее вас о том, что указанный порт может быть занят другим процессом.
    USE MASTER 
    GO
    
    EXEC sp_reserve_http_namespace N'http://localhost:80/sql/myservices' 
    GO
    CREATE ENDPOINT [MyServices] 
      STATE=STARTED
    AS HTTP (
       PATH=N'/sql/myservices',
       PORTS = (CLEAR),
       AUTHENTICATION = (INTEGRATED) 
      ) 
      FOR SOAP (
        WEBMETHOD "http://tempuri.org/".'SalesHeadersList' ( 
          NAME=N'[AdventureWorks].[dbo].[GET_HEADER_LIST]', FORMAT=ROWSETS_ONLY)
  • Нажмите функциональную клавишу F5 или кнопку Execute (Выполнить), чтобы выполнить этот сценарий T-SQL.
  • Данный код создает конечную точку HTTP для представления хранимой процедуры GET_HEADER_LIST в качестве службы, доступной для клиентов через протоколы HTTP и SOAP (Simple Object Access Protocol, простой протокол доступа к объектам).

    Примечание. Чтобы избежать путаницы между несколькими конечными точками HTTP, каждое приложение должно зарезервировать свое пространство имен и зарегистрировать его в HTTP.sys. Это можно сделать неявно, создав новую конечную точку, либо явно, при помощи хранимой процедуры sp_reserve_http_namespace. См. дополнительную информацию в Электронной документации SQL Server 2005, тема "Резервирование пространства имен HTTP".

    Конечной точке HTTP, которая была определена выше, был присвоен идентификатор MyServices ; она готова начать получение запросов сразу после выполнения приведенного выше кода, так как этот код устанавливает свойство STATE в состояние STARTED. Другие возможные значения свойства STATE – это STOPPED и DISABLED.

    Код также задает для свойства AUTHENTICATION значение INTEGRATED. Это означает, что SQL Server будет пытаться проверить подлинность вызывающего приложения по учетным данным Windows с использованием протокола NTLM или Kerberos.

    Примечание. Если при попытке выполнения этого примера вы получите ошибку HTTP 403- Forbidden Access (Нет доступа), то это означает, что SQL Server не может проверить подлинность пользователя, который используется для вызова конечной точки. Это происходит независимо от используемой версии операционной системы и конфигурации механизма обеспечения безопасности пользователя. Дополнительную информацию можно найти в Электронной документации SQL Server 2005, тема "Указание проверки подлинности, отличной от Kerberos, в проектах Visual Studio".

    Другие протоколы проверки подлинности, например, Обычная проверка подлинности, в процессе проверки подлинности пересылают пароль в незашифрованном виде. При использовании Обычной проверки подлинности SQL Server 2005 требует шифрования канала передачи данных и защиты через протокол SSL (Secure Sockets Layer, протокол защищенных сокетов). Для параметра PORTS могут быть заданы значения CLEAR или SSL. CLEAR показывает, что канал передачи данных не использует SSL.

    Параметр PATH показывает относительный путь, который будет использоваться для идентификации конечной точки во внешней сети. Полный путь, который будет указывать клиентское приложение, следующий: http://server_name/sql/myservices. Для нашего примера можно направить Internet Explorer по ссылке http://localhost/sql/myservices?wsdl, чтобы проверить созданное сообщение XML.

    Важно. При создании конечной точки только члены роли sysadmin и владельцы конечной точки могут устанавливать с ней соединение. Другим пользователям необходимо предоставить разрешение на доступ к конечной точке. Это осуществляется посредством выполнения следующей инструкции: GRANT CONNECT ON HTTP ENDPOINT::[Имя_КонечнойТочки] TO [Домен\Учетная запись пользователя].

    После настройки конфигурации самой конечной точки, второй фрагмент инструкции CREATE ENDPOINT DDL настраивает хранимые процедуры и пользовательские функции, которые будут представлены в качестве службы.

    Администраторы базы данных могут объявить столько методов WEBMETHOD, сколько нужно. Каждый веб-метод (WEB-METHOD) настраивает конфигурацию одной службы, которая сопоставлена одной хранимой процедуре или одной пользовательской функции.

    Представленная служба в этом случае идентифицируется по псевдониму "http://tempuri.org/".'SalesHeader-sList'. Этот веб-метод сопоставлен хранимой процедуре, указанной в параметре NAME.

    Параметр FORMAT настраивает тип информации, возвращаемой SQL Server. ROWSETS_ONLY показывает, что следует возвращать только результаты. Потом клиентское приложение может воспользоваться объектом ADO.NET DataSet, чтобы получить эти данные.

    Параметр WSDL определяет, что формат WSDL может быть сгенерирован автоматически сервером SQL Server.

    Примечание. При создании конечной точки HTTP следует задать много важных параметров конфигурации. См. дополнительную информацию в Электронной документации SQL Server 2005 тему "Инструкция CREATE ENDPOINT (Transact-SQL)".

    Создаем ссылку на конечную точку HTTP из клиентского приложения

    Клиентские приложения, осуществляющие обмен данными через конечную точку HTTP, могут пересылать только такие запросы, которые соответствуют формату WSDL. Формат WSDL динамически создается сервером SQL Server путем объединения метаданных всех предоставляемых веб-методов (WEBMETHOD) и форматирования их по действующему формату WSDL.

    Клиентские приложения, разработанные при помощи среды разработки Microsoft Visual Studio 2005, могут легко создавать веб-ссылки на конечные точки HTTP.

    Чтобы создать веб-ссылку на конечную точку HTTP SQL Server, выполните следующие действия (этот проект можно найти в файлах примеров в папке ConsumeHTTPEndpoint ).

    Создаем веб-ссылку на конечную точку HTTP

  • Из меню Start (Пуск) откройте All Programs, Microsoft Visual Studio 2005, Microsoft Visual Studio 2005 (Все программы, Microsoft Visual Studio 2005, Microsoft Visual Studio 2005).
  • В меню File (Файл) выберите команду New (Создать), затем Project (Проект). В панели Project Types (Типы проектов) выберите Visual Basic, а в панели Templates (Шаблоны) выберите Windows Application (Приложение Windows). Укажите имя для проекта и папку для его размещения. Нажмите кнопку ОК, чтобы создать проект.
  • Если панель элементов не отображается, выведите ее на экран, выбрав команду Toolbox (Панель элементов) из меню View (Вид). Перетащите мышью элемент управления DataGridView (Сетка данных) из Панели элементов в область конструктора формы Form1.
  • Нажмите маленькую стрелку в правом верхнем углу элемента управления DataGridView, чтобы отобразить задачи смарт-тэг DataGridView. В этом смарт-тэге снимите флажки Enable Adding (Разрешить добавление), Enable Editing (Разрешить изменение) и Enable Deleting (Разрешить удаление).
  • Щелкните правой кнопкой мыши проект в Solution Explorer (Обозревателе решений) и выберите из контекстного меню команду Add Web Reference (Добавить веб-ссылку).
  • В окне Add Web Reference (Добавление веб-ссылки) введите следующий URL: http://localhost/sql/myservices?wsdl
  • Нажмите кнопку Go, а затем кнопку Add Reference (Добавить ссылку).

    Выполните двойной щелчок на форме в конструкторе и добавьте в обработчик событий Form1_Load следующий код:

    Private Sub Form1 Load(ByVal sender As System.Object, _ 
                           ByVal e As System.EventArgs) 
      Handles MyBase.Load 
      Dim ws As New localhost.MyServices 
      ws.Credentials = System.Net.CredentialCache.DefaultCredentials
      Dim headers As New DataSet 
      headers = ws.SalesHeadersList () 
      DataGridView1.DataSource = headers.Tables(0) 
      DataGridView1.AutoGenerateColumns = True 
    End Sub
  • Перейдите на вкладку Form1.vb [Проект] и нажмите клавишу F4, чтобы открыть окно Properties (Свойства). Выделите в окне свойств элемент управления DataGridView и задайте для свойства Dock значение Fill, щелкнув в средней панели раскрывающегося экрана.
  • Нажмите клавишу F5, чтобы скомпоновать и запустить приложение.
  • Форма загружается, и элемент управления DataGridView показывает список всех заголовков заказов на продажи, полученных от SQL Server.Важно. Microsoft настоятельно рекомендует защищать SQL Server межсетевым экраном, даже если подключение осуществляется через конечные точки HTTP.
  • Конечные точки HTTP позволяют интегрировать SQL Server 2005 в сервис-ориентированную архитектуру. У использования конечных точек HTTP есть некоторые недостатки.

  • Поскольку не используется веб-сервер, масштабируемость решения ограничена.
  • Не многие организации захотят открывать SQL Server для прямого доступа через интернет.
  • Эти недостатки можно нейтрализовать, если предоставлять доступ к SQL Server через дополнительный уровень ПО, который защитит установку SQL Server.

    Функциональная совместимость с другими системами при работе через конечные точки HTTP

    Каждая реляционная система управления базами данных (РСУБД) предоставляет интерфейс прикладного программирования (API), который разработчики могут использовать для взаимодействия с базой данных.

    Перечислим поставщики доступа к данным - это OLE DB, ODBC, DB-LIB, JDBC и SQLNCLI. Поставщик доступа к данным инкапсулирует сложную логику, реализованную посредством API для СУБД. Поставщик доступа к данным также предоставляет интерфейс, который позволяет разработчикам приложений один раз написать логическую схему доступа и потом использовать ее для взаимодействия с несколькими СУБД. Итак, для того, чтобы иметь возможность вести диалог с определенной СУБД, платформе разработки приложения требуется поддержка поставщика доступа к данным.

    SQL Server 2005 предоставляет альтернативу использования поставщиков доступа к данным в виде конечных точек HTTP.

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

    Единственное требование к приложению, которое подключается к конечной точке HTTP, заключается в том, чтобы это приложение могло вести обмен данными через протокол передачи данных HTTP и отправлять запросы в соответствии с определенным форматом XML/SOAP, которого требует SQL Server 2005.

    Платформы и языки программирования с отсутствием поддержки поставщиков доступа к данным OLE DB или ODBC могут осуществлять обмен данных с SQL Server 2005 через конечные точки HTTP.

    Вот некоторые примеры таких платформ, языков программирования и новых ситуаций, которые допускают использование конечных точек HTTP:

  • Мобильные устройства могут подключаться к корпоративному серверу SQL Server через конечные точки HTTP при помощи беспроводной сети.
  • Приложения, выполняемые в среде Linux/Unix или любых других операционных систем, могут обмениваться данными и потреблять данные от SQL Server 2005, не используя JDBC.
  • Сценарии, созданные в различных средах - таких, как PERL, Java или Microsoft Office Web Services - могут извлекать данные напрямую с SQL Server или даже создавать новые данные на сервере.
  • Доступ к SQL Server через дополнительный уровень программного обеспечения

    До сих пор в этой лекции рассказывалось о том, как открыть прямой доступ к SQL Server клиентским приложениям из внешних сетей.

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

    Ниже описаны преимущества реализации среднего уровня между клиентским приложением и SQL Server:

  • Средний уровень предоставляет дополнительный уровень безопасности, который будет фильтровать все входящие запросы.
  • Можно использовать компоненты инфраструктуры операционной системы, такие, как Internet Information Server (IIS), чтобы обеспечить более высокую масштабируемость и производительность, а также дополнительные возможности настройки, администрирования и безопасности.
  • Можно реализовать специализированный уровень доступа к данным, который смогут повторно использовать несколько приложений.
  • На рис. 5.2 показан пример возможной архитектуры для доступа к SQL Server через дополнительный уровень.

    (рис 5.2) Архитектура для доступа к SQL Server через компонент среднего уровня

    Интерфейс службы представляет собой фасад, который демонстрируется клиентским приложениям. В интерфейсе службы внешним пользователям предоставляется только общедоступный интерфейс, который скрывает всю сложность внутренней реализации доступа к SQL Server. Интерфейс службы должен также реализовать все необходимые проверки корректности ввода.

    Интерфейс службы поддерживается компонентом доступа к данным. Компонент доступа к данным реализует вызовы SQL Server через поставщики доступа к данным, например, OLE DB или ODBC.

    Инфраструктура Microsoft .NET Framework предоставляет несколько методов создания интерфейсов службы. В этой лекции рассматриваются только технологии ASP.NET Web-Services (Веб-службы ASP.NET) и Microsoft .NET Remoting (Удаленное взаимодействие Microsoft .NET).

    Совет. Чтобы получить более полную информацию по созданию уровней доступа к данным, обратитесь к руководству, которое можно найти на сайте Microsoft Patterns Practices Developer Center; руководство называется "Designing Data Tier Components and Passing Data Through Tiers" (Проектирование компонентов уровней данных и передача данных через уровни): http://msdn.microsoft.com/practices/ guidetype/Guides/default.aspx?pull=/library/en-us/ dnbda/html/boagag.asp.

    Веб-службы ASP.NET

    Как и конечные точки HTTP, веб-служба ASP.NET также использует формат WSDL, но в качестве службы представляет не хранимую процедуру, а логику приложения, написанную в виде компонентов.

    Веб-службы ASP.NET размещаются и выполняются на сервере Microsoft Internet Information Services (IIS). Чтобы просмотреть код этого раздела полностью, откройте файл Solution1.sln в папке 3tiers в файлах примеров. Отдельные компоненты находятся во вложенных папках.

    Чтобы реализовать доступ к SQL Server через интернет, но с подключением через веб-службу ASP.NET в среднем уровне, выполните следующие действия:

    Создаем компонент доступа к данным и интерфейс службы

  • Начните с написания компонента доступа к данным для подключения к SQL Server. Откройте Visual Studio 2005 и создайте новый проект, выбрав шаблон Class Library (Библиотека классов) в окне New Project (Создание проекта). Дайте проекту имя
  • Замените программный код в файле Class1.vb следующим кодом (не забудьте изменить строку соединения, чтобы данные соответствовали вашей среде). Этот пример находится в папке 3tiers\DepartmentDataAccess.
    Imports System.Data.SqlClient
    Public Class DepartmentDataAccess
      Public Function GetAllDepartments() As DataSet 
        Dim result As New DataSet 
        Dim connectionString As String 
        Dim selectCommand As String
        connectionString = "server=(local);database=AdventureWorks;uid=sa" 
        selectCommand = "SELECT * FROM HumanResources.Department"
      
        Dim connection As New SqlConnection(connectionString)
        Dim adapter As New SqlDataAdapter(selectCommand, connection)
        adapter.Fill(result)
        Return result 
      End Function
    End Class

    Класс DepartmentDataAccess, в качестве примера, реализует единственный метод, который называется GetAllDepartments. Этот метод возвращает объект DataSet, который содержит все отделы компании Adventure Works.

  • В меню Build (Построение) в окне Visual Studio 2005 выберите Build (Построить) DepartmentDataAccess. Visual Studio 2005 скомпилирует проект в сборку. Эта сборка представляет уровень доступа к данным.
  • Давайте продолжим и создадим служебный интерфейс при помощи проекта веб-службы ASP.NET. В Visual Studio 2005 выберите из меню File (Файл) Add, New Website (Добавить, Новая веб-страница). Этот пример находится среди файлов примеров в папке 3tiers\webservice.
  • Выберите шаблон ASP.NET Web Service (Веб-служба ASP.NET) в окне New Project (Создание проекта), как показано ниже. Оставьте для остальных параметров значения по умолчанию. Нажмите кнопку ОК.
  • В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой мыши проект Web Service (Веб-служба) и выберите из контекстного меню команду Add Reference (Добавить ссылку). (Если Обозреватель решений не отображается, можно выбрать соответствующую команду в меню View (Вид).)
  • В окне Add Reference (Добавление ссылки), которое показано ниже, перейдите на вкладку Projects (Проекты), выберите проект
  • Под функцией HelloWorld, созданной шаблоном Visual Studio, введите следующий код:
    <WebMethod()> _
      Public Function GetDepartments() As System.Data.DataSet
        Dim departmentsDL As New DepartmentDataAccess.DepartmentDataAccess()
        Return departmentsDL.GetAllDepartments() 
      End Function
  • Нажмите клавишу F5, чтобы скомпилировать проект веб-службы ASP.NET и запустить его. Если Visual Studio выведет запрос о запуске отладки, выберите параметр Run Without Debugging (Запуск без отладки), как показано на рисунке:
  • Internet Explorer откроет веб-страницу, на которой можно протестировать веб-службу, как показано на следующем рисунке: Выберите службу GetDepartments.
  • Internet Explorer перейдет на страницу GetDepartments, показанную на рисунке. Нажмите кнопку Invoke, чтобы выполнить веб-службу.
  • После вызова веб-службы код ASP.NET вызывает компонент доступа к данным, извлекает результаты в виде набора данных и, наконец, трансформирует весь ответ в формат XML:

    Конечно, клиентское приложение не будет выполнять веб-службу с помощью той же пробной веб-страницы, которую мы с вами только что использовали. Чтобы написать клиентское приложение, которое будет потребителем веб-службы, можно выполнить те же действия, которые были описаны ранее в разделе "Создаем ссылку на конечную точку HTTP из клиентского приложения".

  • Технология удаленного взаимодействия Microsoft .NET Remoting

    Инфраструктура Microsoft .NET предоставляет различные технологии для обеспечения удаленным клиентам возможности установить соединение с компонентами на стороне сервера.

    Если использовать веб-службы ASP.NET, как в предыдущем разделе данной лекции, клиентское приложение будет осуществлять обмен данными с помощью формата SOAP через интерфейс сервиса.

    Microsoft .NET Remoting - это еще одна технология, которая позволяет удаленным приложениям осуществлять обмен данными с компонентами на стороне сервиса. Microsoft .NET Remoting позволяет настраивать используемый формат данных или протокол передачи данных. Например, вместо XML и SOAP можно использовать двоичный или любой другой пользовательский формат, а вместо протоколов HTTP или TCP - другой протокол по своему выбору.

    Главное отличие между веб-службами ASP.NET. и технологией .NET Remoting –заключается в том, что .NET Remoting использует не сервис-ориентированную архитектуру, а удаленный вызов процедур (RPC) объект-объект.

    Создаем объект .NET Remoting

    Построим пример, используя в качестве основы кода пример из предыдущего раздела. Повторите действия с 1 по 4 из предыдущего раздела, а затем выполните следующую последовательность действий:

  • После создания компонента DepartmentDataAccess необходимо предоставить компонент интерфейса сервиса. В этом примере мы создадим интерфейс сервиса .NET Remoting. В Visual Studio 2005 выберите из меню File (Файл) Add, New Project (Добавить, Новый проект). Приложение для этого примера можно найти в файлах примеров в папке 3tiers\Remoting.
  • Выберите в диалоговом окне New Project (Создание нового проекта) шаблон Class Library (Библиотека классов) и дайте проекту имя DepartmentServiceInterface. Нажмите кнопку ОК.
  • В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой мыши проект DepartmentServiceInterface и выберите из контекстного меню команду Add Reference (Добавить ссылку).
  • В окне Add Reference (Добавление ссылки), которое показано ниже, перейдите на вкладку Projects (Проекты), выберите проект DepartmentDataAccess, а затем нажмите кнопку ОК,
  • Замените код в файле Class1.vb следующим кодом:
    Public Class DepartmentServiceInterface 
      Inherits MarshalByRefObject
      Public Function GetDepartments() As System.Data.DataSet
        Dim departmentsDL As New DepartmentDataAccess.DepartmentDataAccess() 
        Return departmentsDL.GetAllDepartments()
      End Function
    End Class
  • Скомпонуйте проект.
  • Последний компонент, который нужно создать – это несущее приложение. Когда мы создавали веб-службу ASP.NET, мы сконфигурировали ее так, чтобы она могла размещаться и выполняться на веб-сервере, например, Microsoft Internet Information Server (IIS). В следующем примере мы сконфигурируем объект .NET Remoting так, чтобы он тоже мог размещаться на сервере IIS.

    Настраиваем объект .NET Remoting под размещение на IIS

  • Создайте и настройте виртуальный каталог для размещения сборок в IIS.
  • Создайте конфигурационный файл web.config для настройки инфраструктуры Remoting.
  • Сгенерируйте класс-заместитель для удаленного объекта.
  • Создайте клиентское приложение, которое будет вызывать удаленный объект.
  • Создаем и настраиваем конфигурацию виртуального каталога в IIS

    С IIS в качестве среды размещения наше удаленное приложение может использовать механизм обеспечения безопасности IIS, протоколы передачи данных и встроенные механизмы обработки запросов. Установите сборки из компонента DepartmentServiceInterface в виртуальный каталог IIS:

  • Создайте новый каталог с именем DepartmentRemote на диске C.
  • В каталоге C:\DepartmentRemote создайте новую папку с именем bin.
  • Из меню Start (Пуск) выберите команду Control Panel (Панель управления). В Control Panel (Панели управления) выполните двойной щелчок на значке Administrative Tools (Администрирование), В окне Administrative Tools (Администрирование) дважды щелкните значок Internet Information Services.
  • В окне приложения для управления Internet Information Services нажмите значок (+), чтобы развернуть узел компьютера, затем разверните дерево узла Web-Sites (Веб-узлы), после этого щелкните узел Default Web Site, как показано ниже: (см. рис. вверху следующей страницы).
  • Из контекстного меню выберите команды New, Virtual Directory (Создать, виртуальный каталог).
  • В окне мастера Virtual Directory Creation Wizard (Мастер создания виртуальных каталогов) нажмите кнопку Next (Далее).
  • В окне Virtual Directory Alias (Псевдоним виртуального каталога) введите в качестве имени псевдонима DepartmentService и нажмите кнопку Next (Далее).
  • В окне Web Site Content Directory (Каталог содержимого веб-узла) введите или найдите через окно Browse (Обзор) путь к каталогу C:\DepartmentRemote в текстовом поле Directory (Каталог), а затем нажмите кнопку Next (Далее).
  • В окне Access Permissions (Права доступа) снимите все флажки, кроме Execute (Выполнение). Нажмите кнопку Next (Далее), чтобы перейти в последнее окно мастера.
  • Нажмите кнопку Finish (Готово).
  • Щелкните правой кнопкой мыши на вновь созданном виртуальном каталоге DepartmentRemote и выберите из контекстного меню команду Properties (Свойства).
  • В окне DepartmentService Properties (DepartmentService: свойства) перейдите на вкладку ASP.NET и измените номер версии ASP.NET на 2.Х.Х.Х, как показано на следующем рисунке: (Числа могут быть разными в зависимости от установки, но убедитесь в том, что это та же версия, что и версия Visual Studio, которую вы используете для компиляции сборок.) Затем нажмите кнопку OK, чтобы закрыть окно.Совет. Чтобы узнать номер версии Visual Studio, в окне Visual Studio выберите из меню Help (Справка) команду About Microsoft Visual Studio (О программе Microsoft Visual Studio).
  • В Проводнике Windows скопируйте все содержимое вложенных каталогов bin/debug, в которых вы сохранили проект DepartmentServiceInterface (автор использовал каталог по умолчанию, который предлагает Visual Studio 2005:
  • Создаем конфигурационный файл web.config для настройки инфраструктуры удаленного взаимодействия

  • При помощи Notepad (Блокнота) создайте новый файл с именем web.config в каталоге C:\DepartmentRemote.
  • Отредактируйте файл web.config, добавив в него следующий код XML (который можно найти в файлах примеров в папке 3tiers под именем web.config ).
    <configuration>
      <system.runtime.remoting> 
        <application> 
          <service>
            <wellknown mode="SingleCall"
                          type="DepartmentServiceInterface.DepartmentServiceInterface, 
                          DepartmentServiceInterface" 
                          objectUri="department.soap" />
          </service> 
        </application> 
      </system.runtime.remoting>
    </configuration>
  • Сохраните файл web.config.
  • Этот XML-файл задает конфигурацию инфраструктуры удаленного взаимодействия. Он объявляет новую службу с именем department.soap, которая соответствует классу DepartmentServiceInterface. DepartmentServiceInterface в сборке DepartmentServiceInterface. Параметр Mode="SingleCall" показывает, что для каждого запроса будет создан новый экземпляр этого класса.

    Генерируем класс-заместитель для удаленного объекта

    Чтобы обратиться к компоненту Service Interface (Интерфейс службы), клиентское приложение должно создать класс-заместитель. Класс-заместитель напоминает копию удаленного объекта; он объявляет те же методы и публичные интерфейсы, но при вызове со стороны клиента он выполняет маршрутизацию вызова к удаленному объекту. Набор инструментальных средств разработки Microsoft .NET Framework SDK предоставляет инструмент SOAPSuds, который можно использовать для того, чтобы сгенерировать класс-заместитель.

  • В меню Start (Пуск) выберите Programs, Microsoft .NET Framework 2.0 SDK, SDK Command Prompt (Все программы, Microsoft .NET Framework 2.0 SDK, SDK Command Prompt). Откроется окно командной строки.
  • В командной строке введите следующие команды:
  • cd \, чтобы перейти в корневой каталог диска
  • md ClientApp, чтобы создать новый каталог для клиентского приложения
  • cd ClientApp, чтобы перейти в папку ClientApp
  • soapsuds -url:http://localhost/departmentservice/department.soap?wsdl -oa:DepartmentProxy.dll
  • Утилита SOAPSuds загружает автоматически сгенерированный инфраструктурой удаленного взаимодействия файл описания службы, который описывает каждый из методов, предлагаемых классом DepartmentServiceInterface. На основе этого файла SOAPSuds генерирует новую сборку с именем DepartmentProxy.dll, которая содержит класс, способный использовать удаленную службу.

    Создаем клиентское приложение, которое будет вызывать удаленный объект

    Для вызова удаленной службы мы можем использовать класс-заместитель DepartmentProxy.dll. Чтобы создать клиентское приложение и использовать класс-заместитель, выполните следующие действия:

  • Запустите Visual Studio 2005 и создайте новый проект. В окне New Project (Создание проекта) выберите шаблон Windows Application (Приложение Windows). Код для этого примера можно найти в файлах примеров в папке 3tiers\ClientApp.
  • Дайте проекту имя ClientApp и нажмите кнопку ОК.
  • В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой мыши проект ClientApp и выберите из контекстного меню команду Add Reference (Добавить ссылку).
  • В окне Add Reference (Добавление ссылки) на вкладке .NET выделите System.Runtime.Remoting и нажмите кнопку ОК.
  • Снова щелкните на проекте ClientApp правой кнопкой мыши, чтобы добавить еще одну ссылку. В окне Add Reference (Добавление ссылки) перейдите на вкладку Browse (Обзор). Перейдите к папке C:\ClientApp и выделите сборку DepartmentProxy.dll, а затем нажмите кнопку ОК.
  • В область конструктора формы Form1 добавьте элемент управления DataGridView из панели Toolbox (Панели элементов).
  • В смарт-тэге DataGridView Tasks снимите флажки Enable Adding (Разрешить добавление), Enable Editing (Разрешить изменение) и Enable Deleting (Разрешить удаление).
  • Нажмите клавишу F4, чтобы открыть окно Properties (Свойства). Выберите в форме элемент управления DataGridView и задайте для свойства Dock значение Fill.
  • Добавьте в обработчик событий Form1_Load следующий код.
    Private Sub Form1_Load(ByVal sender As System.Object, _ 
                           ByVal e As System.EventArgs) 
      Handles MyBase.Load 
      Dim de As New DepartmentServiceInterface.DepartmentServiceInterface 
      Dim departments As New DataSet
      departments = de.GetDepartments() 
      DataGridView1.DataSource = departments.Tables(0) 
      DataGridView1.AutoGenerateColumns = True
    End Sub
  • Нажмите клавишу F5, чтобы скомпоновать и запустить приложение.
  • Форма загрузится, и элемент управления DataGridView покажет полученный от SQL Server список всех отделов.
  • Хотя это может показаться слишком сложным (конечно, так много шагов!), в целом архитектура нашего примера .NET Remoting, показанная на рис. 5.3, достаточно проста.

    (рис 5.3) Архитектура примера .NET Remoting

    И ASP.NET,. и .NET Remoting – это технологии среднего уровня, которые инкапсулируют набор компонентов и представляют компоненты как службы через интерфейс службы. Для развертывания SQL Server в безопасном окружении в серверной части СУБД можно использовать любое из этих двух решений, при этом удаленные клиенты смогут устанавливать соединения с приложением и извлекать нужные им данные.

    Заключение

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

    Краткий справочник по 5 лекции

    Чтобы Выполните следующие действия
    Открыть соединение с SQL Server через TCP/IP
  • Включите протокол передачи данных TCP/IP.
  • Сконфигурируйте экземпляр SQL Server на прослушивание определенных IP-адресов.
  • Сообщите клиентским приложениям точный IP-адрес и порт, которые будет прослушивать SQL Server.
  • Сконфигурируйте межсетевой экран на разрешение доступа через этот порт.
  • Убедиться, что протокол TCP/IP на сервере SQL Server включен В SQL Server Management Studio разверните узел SQL Server Network Configuration (Сетевая конфигурация SQL Server) и выберите Protocols For (Протоколы для) <имя_экземпляра>; или В SQL Server Surface Area Configuration (Настройка конфигурации контактной зоны SQL Server) щелкните ссылку Surface Area Configuration For Services And Connections (Настройка контактной зоны для служб и соединений), разверните конфигурируемый экземпляр, разверните узел Database Engine и выберите узел Remote Connections (Удаленные соединения).
    Направить клиентское приложение по правильному IP-адресу и номеру порта SQL Server Укажите IP-адрес и номер порта в строке соединения с помощью следующей синтаксической конструкции:
    Data Source = tcp:<ip_address>/instance,
    <номер_порта>;
    Обратиться к SQL Server с помощью XML/протоколов SOAP через HTTP Сконфигурируйте конечную точку HTTP с помощью инструкции T-SQL CREATE ENDPOINT DDL.
    Использовать веб-службы ASP.NET в среднем уровне С помощью Visual Studio 2005 создайте новый проект веб-службы. Инкапсулируйте код доступа к данным веб-службе, чтобы не демонстрировать сервер SQL Server пользователям интернета.
    Использовать технологию Microsoft .NET Remoting в среднем уровне Используйте Visual Studio 2005 для создания класса службы, который инкапсулирует код доступа, чтобы не открывать пользователям интернета доступ непосредственно к серверу SQL Server. Откройте класс службы для внешнего доступа с помощью хост- приложения, например, IIS.
    Вернуться к учебному плану