• Установка и запуск Microsoft SQL Server
  • Требования для инсталляции SQL Server 2000
  • Установка SQL Server 2000
  • Запуск и остановка SQL Server
  • Управление способом запуска SQL Server
  • Основы работы с SQL Server 2000
  • Запуск программы SQL Server Enterprise Manager
  • Создание базы данных с помощью программы SQL Server Enterprise Manager
  • Создание таблиц в базе данных SQL Server
  • Использование программы SQLServer Enterprise Manager для создания таблиц базы данных SQL Server
  • Создание идентификационного поля для уникальной идентификации записей
  • Использование других методов для генерации первичных ключей
  • Создание поля с первичным ключом
  • Использование программы SQL Query Analyzer для доступа к базе данных
  • Просмотр всех объектов базы данных с помощью хранимой процедуры sp_help
  • Использование существующей базы данных
  • Создание команд SQL в программе Query Analyzer
  • Использование представлений для управления доступом к данным
  • Создание представлений с помощью программы SQL Server Enterprise Manager
  • Использование представлений в приложениях
  • Создание представления с помощью программы SQL Query Analyzer
  • Создание и запуск хранимых процедур
  • Запуск хранимых процедур в окне программы SQL Query Analyzer
  • Создание хранимой процедуры с помощью программы SQL Query Analyzer
  • Отображение текста существующих представлений или хранимых процедур
  • Создание триггеров
  • Бизнес-ситуация 3.1: создание триггера для поиска созвучных слов
  • Управление пользователями и средства безопасности с помощью программы SQL Server Enterprise Manager
  • Создание и сопровождение учетных записей пользователей
  • Управление ролями с помощью программы SQL Server Enterprise Manager
  • Тестирование системы безопасности с помощью программы SQL Query Analyzer
  • Применение ограничений безопасности в программе SQL Query Analyzer
  • Определение подключенных пользователей
  • Завершение процесса с помощью команды KILL
  • Удаление объектов базы данных
  • Бизнес-ситуация 3.2: SQL-сценарий для создания базы данных
  • Резюме
  • Вопросы и ответы
  • ГЛАВА 3

    Знакомство с SQL Server 2000

    В прошлом многие программисты начинали создание приложений баз данных, используя язык Visual Basic и базу данных Microsoft Access с ядром Jet. Как только база данных разрасталась до нескольких тысяч записей или к ее услугам обращались несколько пользователей, наступал "великий перелом". Конфликты при доступе к данным со стороны пользователей, уменьшение производительности и отсутствие удобных инструментов управления данными и сервером привели к тому, что разработчики стали искать способы решения этих проблем с помощью других архитектур баз данных. Одной из таких архитектур стала модель вычислений типа клиент/сервер (или модель распределенных вычислений).

    Суть архитектуры клиент/сервер заключается не только в предоставлении многопользовательского режима работы с базой данных, к тому же с такой задачей вполне может справляться Jet. В многопользовательской архитектуре несколько пользователей используют одни и те же данные в сети, т.е. один или несколько файлов базы данных находятся на сервере, к которому могут осуществлять доступ клиентские компьютеры. Несмотря на то что Microsoft Access также поддерживает многопользовательский ре жим работы, эту программу нельзя отнести к системам клиент/сервер, поскольку все необходимые операции выполняются на отдельном компьютере клиента. Например, для извлечения с помощью команды SQL одной записи из таблицы, включающей 50 тыс. записей, нужно перенести на компьютер клиента все строки (или по крайней мере их индексы) таблицы. При этом на стороне сервера не предусмотрено никакой "интеллектуальной" части для специализированной обработки данных, например для выполнения запроса и возвращения только запрошенных данных.

    В архитектуре клиент/сервер предусмотрена серверная часть (back end), т.е. специализированное программное обеспечение, которое способно извлекать и кэшировать данные, разрешать конфликты доступа к данным со стороны клиентов, а также обеспечивать безопасность. Например, СУБД SQL Server компании Microsoft получает запросы от клиентских компьютеров, выполняет их на серверном компьютере, а затем возвращает клиентскому компьютеру только запрошенные данные. Таким образом, для извлечения одной записи из таблицы, включающей 50 тыс. записей, серверу будет передана команда SELECT, серверное программное обеспечение выполнит эту команду и возвратит клиенту только искомую запись. Очевидно, что при этом сетевой трафик значительно сокращается, а общая производительность повышается еще и потому, что вычислительная мощность (т.е. быстрота работы процессора и объем оперативной памяти) компьютера-сервера гораздо выше, чем компьютера-клиента. Поэтому в такой архитектуре будут быстрее выполняться команды и извлекаться данные.

    Если вы работаете с Visual Basic .NET, то очевидно, что в качестве серверной части (или сервера баз данных) можно использовать Microsoft SQL Server, поставляемый вместе с Visual Basic .NET и Visual Studio .NET. Перечень разных версий Microsoft SQL Server, которые поставляются вместе с Visual Basic .NET и Visual Studio .NET, приводится далее в главе.

    СОВЕТ

    Базы данных на основе ядра баз данных Jet (MDB) рекомендуется использовать только для простейших и ограниченных приложений. Благодаря появлению нового ядра SQL Server 2000 Desktop предназначенного специально для баз данных небольшого размера, отпадает необходимость использования ядра Jet. Теперь размер базы данных SQL Server может не требуя дополнительного кодирования или изменения ее структуры по мере роста системы.

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

    Допустим, вы входите в команду разработчиков распределенного приложения с архитектурой клиент/сервер. Программисты, разрабатывающие серверную часть приложения, к моменту промежуточной сдачи проекта только на 95% подготовили функциональную версию сервера. Нужно приступать к работе, а серверная часть приложения не готова на все 100%.

    Более того, в вашем распоряжении может быть только 1-2 программиста с опытом создания серверной части. Поскольку программисты серверной части обладают довольно редким набором навыков, такая ситуация возникает довольно часто при создании приложений с архитектурой клиент/сервер. Таких специалистов труднее всего найти и удержать, а потому они работают с гораздо большим напряжением, чем остальные программисты. Кроме того, их гораздо сложнее заменить в случае неудачного выполнения работы. Более того, программисты клиентской части часто не могут завершить свою работу до тех пор, пока не будут исправлены ошибки в серверной части.

    Такую ситуацию называют трагедией одаренного программиста серверной части.

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

    Размещение одного или нескольких уровней абстракции между клиентом и сервером также делает работу программистов клиентской части независимой от деятельности программистов серверной части. Для программистов серверной части это означает, что они должны создать представления или хранимые процедуры, которые поставляют данные клиентам. В среде Visual Basic .NET эта цель достигается за счет создания компонентов. Более подробно способы создания представлений или хранимых процедур описываются в других разделах этой главы.

    Установка и запуск Microsoft SQL Server

    Работа с сервером баз данных значительно отличается от совместного использования файла базы данных Microsoft Jet. Для успешной работы с SQL Server нужно познакомиться с новыми понятиями и дополнительными возможностями. Однако установка и использование SQL Server 2000 организована гораздо проще, чем в предыдущих версиях, особенно в версии 6.5 и более ранних.

    Ниже перечисляются основные условия для установки и работы разных редакций сервера базы данных SQL Server 2000.

    • SQL Server 2000 Standard Edition — это стандартная редакция, которая содержит основной сервер баз данных для рабочей группы или отдела.

    • SQL Server 2000 Enterprise Edition — это корпоративная редакция, которая содержит все элементы стандартной редакции и предлагает повышенную производительность и другие компоненты для крупных организаций, Web-узлов и хранилищ данных.

    • SQL Server 2000 Personal Edition — это персональная редакция, предназначенная для мобильных пользователей, которые часто отсоединены от своей сети, но нуждаются в SQL Server для локального хранения данных и запуска отдельных приложений на клиентском компьютере. В отличие от стандартной и корпоративной редакций, для которых требуется серверная версия операционной системы Windows NT или Windows 2000, персональная редакция может работать с Windows 2000 Professional, Windows NT 4.0 Workstation и Windows ME или Windows 98. Эта редакция ограничивает производительность сервера, если одновременно запущено более пяти пакетных заданий.

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

    • SQL Server 2000 Desktop Engine(MSDE) — это настольное ядро, содержащее большинство элементов стандартной редакции. Оно может свободно распространяться как часть небольшого приложения или демонстрационных версий. Размер базы данных, поддерживаемой этим ядром, не превышает 2 Гбайт и, подобно персональной редакции, ее производительность заметно падает при выполнении одновременно более пяти пакетных заданий. Однако она не содержит графических инструментов разработки и управления.

    НА ЗАМЕТКУ

    С каждой редакцией Visual Basic .NET или Visual Studio .NET поставляется редакция MSDE сервера баз данных SQL Server 2000. Редакции Enterprise Developer Visual Studio .NET и Enterprise Architect Visual Studio .NET также включают редакцию для разработчиков Developer SQL Server 2000. При этом следует учитывать такие особенности:

    • MSDE не включает графических инструментов SQL Server, которые описываются в этой главе; поэтому с ней нельзя выполнять примеры из данной книги (тем не менее для доступа к MSDE в Visual Studio .NET предусмотрено несколько ограниченных графических инструментов);

    редакция для разработчиков SQL Server 2000 Developer Edition может применяться только для разработки и тестирования приложений SQL Server, а для использования ее в качестве рабочего сервера баз данных нужно приобрести лицензии для серверной и клиентской части SQL Server 2000.

     • SQL Server 2000 Windows CE Edition — это редакция, используемая как хранилище данных на портативных устройствах под управлением операционной системы Windows СЕ и способная реплицировать данные из других изданий SQL Server 2000.

    Требования для инсталляции SQL Server 2000

    Для инсталляции SQL Server 2000 требуется компьютер с процессором Pentium (или совместимым с ним) с частотой не менее 166 МГц, пространство на жестком диске от 95 до 270 Мбайт (270 Мбайт для типичного варианта инсталляции и 44 Мбайт для Desktop Engine), дисковод для компакт-дисков, броузер Internet Explorer версии 5.0 или выше, а также совместимая операционная система (см. выше). Для оперативной памяти установлены следующие требования:

    • для стандартной редакции Standard Edition — минимум 64 Мбайт;

    • для корпоративной редакции Enterprise Edition — минимум 64 Мбайт (рекомендуется 128 Мбайт);

    • для персональной редакции Personal Edition — минимум 64 Мбайт для операционной системы Windows 2000 и 32 Мбайт для других операционных систем;

    • для редакции Developer Edition — минимум 64 Мбайт;

    для ядра Desktop Edition — минимум 64 Мбайт для операционной системы Windows 2000 и 32 Мбайт для других операционных систем.

    Если вы уже пытались запускать SQL Server на компьютере с процессором Pentium (или совместимым с ним) с частотой 166 МГц и 64 Мбайт оперативной памяти, то убедились, что сервер баз данных работает очень медленно. Не удивляйтесь, ведь специалисты Microsoft предупредили вас, что это минимальные требования. SQL Server может работать на компьютере с такими скудными вычислительными ресурсами, но в реальной рабочей обстановке такая экономия может привести к печальным последствиям для вашего бизнеса. Если вы ограничены в средствах и можете модернизировать только какой-то один компонент аппаратного обеспечения, то в таком случае лучше инвестировать денежные средства оперативную память, чем в более мощный процессор. Даже небольшое увеличение размера оперативной памяти может существенно повысить производительность системы.

    НА ЗАМЕТКУ

    Данная книга в основном посвящена вопросам создания решений для работы с базами данных на основе Visual Basic .NET. Поэтому здесь не рассматриваются другие многочисленные элементы SQL Server. Для получения более подробной информации на эту тему следует обратиться к официальной документации SQL Books Online, которая входит в состав комплекта программных продуктов SQL Server, или прочитать книгу М. Шпеника и О. Следжа Руководство администратора баз данных Microsoft SQL Server™2000 (Издательский дом "Вильямc", 2001).

    Установка SQL Server 2000

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

    он длится довольно долго;

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

    Время процесса установки сократить никак нельзя, а чтобы упростить поиск ответов на вопросы со стороны программы-инсталлятора SQL Server, далее приводятся небольшие пояснения.

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

    В диалоговом окне Setup Type (Тип установки), которое показано на рис. 3.1, можно выбрать тип установки: Typical (Типичная), Minimum (Минимальная) и Custom (Специализированная), а также путь к каталогам, в которых будут установлены файлы SQL Server и данные. Перед установкой убедитесь в том, что на жестких дисках этих каталогов достаточно места для размещения данных и путь к ним указан среди параметров резервного копирования данных.

    РИС. 3.1. Диалоговое окно Setup Type программы SQL Server Installation Wizard


    В диалоговом окне Services Accounts (Учетные записи служб), которое показано на рис. 3.2, по умолчанию создается учетная запись пользователя домена, т.е. выбран параметр Use a Domain User account (Использовать учетную запись пользователя домена). Однако вместо нее можно использовать учетную запись локальной системы, т.е. выбрать параметр Use the Local System account (Использовать учетную запись локальной системы), если нет домена или используется отдельный выделенный сервер. В этом диалоговом окне с помощью параметра Auto Start Service (Служба автозапуска) можно указать, что SQL Server запускается при запуске Windows как служба этой операционной системы. Учетные записи служб действуют как составные части операционной системы, поэтому они не отображаются во вкладке Applications (Приложения) менеджера задач Windows Task Manager и их нельзя закрыть как обычные приложения. В следующем разделе дается дополнительная информация о способах управления сервисами операционной системы Windows, а в конце главы — информация о методах запуска SQL Server.

    РИС. З.2. Диалоговое окно Services Accounts про граммы SQL Server Installation Wizard

    РИС. 3.3. Диалоговое окно Authentication Mode про граммы SQL Server Installation Wizard


    Для рабочего варианта SQL Server в диалоговом окне Authentication Mode (Режим аутентификации), которое показано на рис. 3.3, по умолчанию предлагается режим Windows Authentication Mode (Режим аутентификации Windows). При этом используются преимущества системы обеспечения безопасности Windows NT/2000. При попытке подключения к SQL Server для аутентификации пользователя используется его учетная запись, если он (или его группа пользователей) имеют право доступа к SQL Server. В некоторых ситуациях можно использовать режим Mixed Mode (Смешанный режим), в котором помимо аутентификации в операционной системе Windows пользователь должен пройти процедуру аутентификации SQL Server. Для этого в SQL Server нужно создать учетную запись, которая будет проверяться при попытке подключения к SQL Server. Основным преимуществом этого режима является то, что при этом не требуется устанавливать доверительное соединение между сервером и рабочей станцией, что особенно удобно при подключении клиентов из операционной системы UNIX или Web-клиентов. Однако для реализации этого режима требуются дополнительные действия по обслуживанию двойного набора учетных записей (операционной системы Windows и сервера баз данных SQL Server).

    НА ЗАМЕТКУ

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

    Запуск и остановка SQL Server

    Для запуска и остановки SQL Server можно использовать программу SQL Server Service Manager. В некоторых случаях необходимо остановить SQL Server, например для выполнения каких-то задач или запуска сервера баз данных SQL Server на другом (рабочем) компьютере.

    В обычных условиях не нужно останавливать сервер баз данных SQL Server, который играет роль корпоративной СУБД. Предполагается, что SQL Server один раз запускается и непрерывно работает в течение длительного времени. Но в некоторых редких ситуациях сервер баз данных все же бывает нужно остановить, например для обновления аппаратного обеспечения или изменения конфигурации сервера. В таких случаях для запуска и остановки SQL Server используется программа SQL Server Service Manager.

    РИС. З.4. Исходный вид диалогового окна программы SQL Server Service Manager после запуска SQL Server


    Программа SQL Server Service Manager не является обязательным элементом SQL Server и предназначена только для более удобного управления процессом активизации и деактивизации SQL Server. После перехода к рабочему варианту SQL Server программа SQL Server Service Manager уже не понадобится.

    После запуска SQL Server программы SQL Server Service Manager (после щелчка на ее пиктограмме в группе программ SQL Server) диалоговое окно SQL Server Service Manager будет выглядеть так, как показано на рис. 3.4.

     Если SQL Server запущен, индикатор состояния сервера баз данных приобретает вид зеленой стрелки, а если остановлен — вид красного квадратика. Для запуска SQL Server нужно щелкнуть на кнопке Start (Запуск) или Continue (Продолжить), а для остановки — на кнопке Stop.

    Управление способом запуска SQL Server

    После установки SQL Server операционная система автоматически запускает его при включении компьютера. С помощью элемента панели управления Services (Службы) можно управлять состоянием SQL Server. Для просмотра текущего состояния SQL Server и управления им выполните следующее.

    1. Откройте окно Control Panel и выберите в нем пиктограмму Administrative Tools (Администрирование).

    2. Выберите пиктограмму Services (Службы).

    3. Найдите в панели управления Services службу MS SQLServer.

    После установки SQL Server для службы MS SQLServer по умолчанию задается автоматический режим запуска Automatic. Для остановки службы MS SQLServer в панели управления Services выполните ряд действий.

    1. Выберите службу MS SQLServer в панели управления Services и дважды щелкните на ней. В открывшемся диалоговом окне свойств этой службы щелкните на кнопке Stop.

    2. Спустя несколько секунд SQL Server будет остановлен.

    3. Для перезапуска SQL Server щелкните на кнопке Start в диалоговом окне свойств службы MS SQLServer.

    НА ЗАМЕТКУ

    Запуск и остановка SQL Server с помощью панели управления Services происходят точно так же, как и при использовании программы SQL Server Service Manager.

    Основы работы с SQL Server 2000

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

    создать одну или несколько баз данных;

    создать таблицы в базе данных;

    создать представления и хранимые процедуры, которые будут управлять данными, возвращаемыми из базы данных;

    установить учетные записи и группы пользователей.

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

    Запуск программы SQL Server Enterprise Manager

    Большинство действий по конфигурированию базы данных выполняются с помощью программы SQL Server Enterprise Manager. Эта программа благодаря своей простоте и мощности является одним из основных инструментов SQL Server 2000. Она предоставляет администратору простой и понятный интерфейс для выполнения необходимых действий, которые прежде требовали использования сложных команд SQL.

    Для запуска программы SQL Server Enterprise Manager щелкните на кнопке Start (Пуск) и выберите команду Programs→Microsoft SQL Server→Enterprise Manager (Прогpaммы→Microsoft SQL Server→EnterpriseManager). После ее запуска можно получить доступ ко всем серверам баз данных SQL Server в доступной области сети. В следующих разделах главы описываются некоторые наиболее распространенные задачи, выполняемые с помощью Enterprise Manager в рабочем приложении.

    НА ЗАМЕТКУ

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

    При первом запуске программы SQL Server Enterprise Manager нужно зарегистрировать установленный SQL Server. Это позволяет программе SQL Server Enterprise Manager определить тот сервер баз данных SQL Server, с которым предстоит работать. Она также позволяет администрировать несколько установленных серверов SQL Server. Для регистрации SQL Server используется диалоговое окно Registered SQL Server Properties (Свойства зарегистрированных серверов SQL Server) программы SQL Server Enterprise Manager (рис. 3.5).

    Рис. З.5. Диалоговое окно Registered SQL Servеr Properties программы SQL Server Enterprise Manager


    Для регистрации SQL Server, который установлен на данном компьютере, в поле Server (Сервер) используется строка (local). Для подключения SQL Server по локальной сети нужно щелкнуть на кнопке с многоточием возле этого поля для просмотра всех имеющихся серверов в локальной сети.

    СОВЕТ

    Диалоговое окно Registered SQL Server Properties содержит важный параметр Show system databases and system objects (Показать системные базы данных и системные объекты). При снятии этого флажка системные базы данных и системные объекты остаются скрытыми в разных окнах программы SQL Server Enterprise Manager. Это позволяет сократить объем ненужной информации при работе с таблицами и файлами приложения. Однако для просмотра системных объектов нужно вернуться в это диалоговое окно и установить указанный флажок.

    После регистрации нужного сервера щелкните на кнопке OK в диалоговом окне Registered SQL Server Properties. (Это нужно сделать только один раз. Программа SQL Server Enterprise Manager запоминает способ соединения с указанным сервером SQL Server.) Имя зарегистрированного сервера появится в окне серверов Microsoft SQL Servers вместе с другими зарегистрированными серверами. На компьютере с подключением к локальному серверу SQL Server окно Microsoft SQL Servers будет иметь такой вид, как на рис. 3.6.

    РИС. 3.6. Окно Microsoft SQL Servers с локальным сервером баз данных SQL Server в программе SQL Server Enterprise Manager

    Создание базы данных с помощью программы SQL Server Enterprise Manager

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

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

    1. Щелкните правой кнопкой мыши на папке Databases в левой области окна SQL Server Enterprise Manager.

    2. Из контекстного меню выберите команду New Database (Создать базу дани на экране появится диалоговое окно Database Properties (Свойства базы данных), показанное на рис. 3.7.

    Рис. З.7. Диалоговое окно Database Properties

    3. В поле Name (Имя) введите имя базы данных (в этой главе используется имя Novelty).

    4. По умолчанию данные хранятся в файле с именем имя_базы_данных_Data.mdf a, журнал регистрации транзакций — в файле имя_базы_данных_Log.ldf. Эти предлагаемые по умолчанию имена (и пути к ним) можно изменить в полях File Name (Имя файла) и Location (Расположение) во вкладках Data Files (Файлы данных) и Transaction Logs (Журналы регистрации транзакций). Вкладка Data Files показана на рис. 3.8. 

    РИС. З.8. Вкладка Data Files диалогового окна Database Properties для указания расположения файлов и их размеров

    НА ЗАМЕТКУ

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

    5. Щелкните на кнопке OK, и на жестком диске появятся два новых файла, Novelty_Data.mdf и Novelty_Data.ldf, с исходным размером 1 Мбайт.

    6. После создания новой базы данных ее окно свойств закроется; новая база данных появится в папке Databases в левой области окна SQL Server Enterprise Manager.

    НА ЗАМЕТКУ

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

    Создание таблиц в базе данных SQL Server

    В Microsoft SQL Server таблицы можно создавать двумя способами:

    • с помощью языка определения данных (Data Definition Language — DDL), который подробно описывается в главе 2, "Запросы и команды на языке SQL";

    • с помощью графических инструментов программы SQL Server Enterprise Manager.

    Оба способа создания таблиц имеют как преимущества, так и недостатки. DDL-команды языка SQL довольно сложные, особенно если вы до этого никогда их не использовали. Применение команд SQL позволяет более гибко создавать и поддерживать код создания базы данных. С другой стороны, DDL-команды могут быть полностью автоматизированы, например с помощью одного щелчка можно запустить сценарий создания базы данных. Они также предлагают более богатый уровень функциональности, который не предусмотрен в графических инструментах программы SQL Server Enterprise Manager. Кроме того, с помощью DDL-команд хотя и очень грубо, но все же можно документировать схему базы данных.

    Тем не менее использование программы SQL Server Enterprise Manager позволяет быстро и легко создавать структуру базы данных с помощью инструментов с графическим пользовательским интерфейсом. Однако в программе SQL Server Enterprise Manager не так просто автоматизировать выполнение многих операций.

    Некоторые разработчики предпочитают использовать для создания баз данных только команды SQL, потому что у них в распоряжении всегда остается запись выполняемых действий (в виде DDL-кода). Выбор способа создания баз данных зависит от персональных предпочтений, стандартов работы в вашей организации, а также вида создаваемых приложений для работы с базами данных. Оба способа создания базы данных рассматриваются далее в главе.

    СОВЕТ

    SQL Server 2000 содержит специальный элемент для генерации DDL-команд SQL для объектов базы данных. Его можно щелкнув правой кнопкой мыши на базе данных в папке Databases окна Microsoft SQL Servers, а затем выбрав в контекстном меню команду All Tasks→Generate SQL Scripts (Все задачи→Генерация сценариев SQL) для открытия диалогового окна Generate SQL Scripts (Генерация сценариев SQL). 

    Использование программы SQLServer Enterprise Manager для создания таблиц базы данных SQL Server

    После создания базы данных необходимо создать в ней таблицы. Для этого с помощью программы SQL Server Enterprise Manager выполните ряд действий.

    1. В окне Microsoft SQL Servers программы SQL Server Enterprise Manager щелкните на знаке "плюс" возле имени созданной базы данных.

    2. Щелкните правой кнопкой мыши на объекте Tables.

    3. Из контекстного меню выберите команду New Table (Новая таблица), и на экране появится диалоговое окно Design Table (Создание таблицы), как показано на рис. 3.9.

    РИС. 3.9. Диалоговое окно конструктора таблиц в программе SQL Server Enterprise Manager


    НА ЗАМЕТКУ

    При первом открытии диалогового окна Design Table в его заголовке будут слова New Table, а не Design Table.

    4. Начнем с создания таблицы, в которой будут храниться данные о клиентах. Щелкните в столбце ColumnName и введите имя FirstName для первого поля в таблице.

    5. Нажмите клавишу <Tab> для перехода к следующему столбцу, Data Type. В этом столбце выберите из списка типов данных поле переменной длины, или varchar. Этот тип данных в SQL Server используется для хранения относительно небольшой части строковых данных.

    6. В следующем столбце введите число 20, т.е. максимальное количество символов в поле FirstName.

    7. В столбце Allow Nulls определяется возможность использования неопределенных значений. Если в этом столбце установлен флажок, то неопределенные значения могут быть введены в это поле. Для поля FirstName этот флажок должен быть установлен.

    8. Введите определения остальных полей и их параметры. После определения полей окно SQL Server Enterprise Manager примет такой вид, как на рис. 3.10.

    9. По окончании определения полей сохраните таблицу, щелкнув на кнопке Save (Сохранить). 

    РИС. 3.10. Диалоговое окно конструктора таблиц с определениями полей в новой таблице

    НА ЗАМЕТКУ

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

    10. После этого на экране появится диалоговое окно Choose Name (Выбор имени), в котором следует ввести имя созданной таблицы. Здесь можно ввести любое имя, но для примеров данной главы следует использовать имя tblCustomer.

    11. Вновь созданная таблица появится в окне Microsoft SQL Servers.

    Создание идентификационного поля для уникальной идентификации записей

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

    Идентификационное поле в SQL Server отличается от поля AutoNumber в Microsoft Jet и обладает следующими возможностями:

    • любой числовой тип данных (в Jet оно может иметь тип только длинного целого числа);

    • увеличение своего значения на любое определенное число (в Jet это может быть либо единица, либо случайное значение);

    • нумерация с любого значения (в Jet нумерация может начинаться только с 1);

    • восстановление значений; это позволяет вставить специфическое число в уникальное поле для восстановления записи, которая, например, была случайно удалена (в Jet уникальное поле всегда доступно только для чтения).

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

    Чтобы создать идентификационное поле с помощью программы SQL Server Enterprise Manager, выполните ряд действий.

    1. В окне конструктора таблицы Design Table создайте новое поле ID. Выберите для него тип данных int. Помните, что этот тип данных имеет размер четыре байта, подобно типу данных Integer в Visual Basic .NET.

    2. Снимите флажок в столбце Allow Nulls. Это значит, что в данном поле не допускаются неопределенные значения и оно наилучшим образом подходит для превращения в идентификационное.

    3. Нижняя часть диалогового окна Design Table содержит страницу свойств для свойств текущего выбранного поля в таблице. Щелкните в странице свойств на текстовом поле Identity.

    4. Выберите в нем параметр Yes. По желанию укажите значения в текстовых полях Identity Seed (Начальное значение) и Identity Increment (Приращение).

    После создания идентификационного поля окно SQL Server Enterprise Manager будет выглядеть, как на рис. 3.11.

    Помните, что значения идентификационного поля в SQL Server не всегда последовательны. Например, если пользователь Антон пытается создать запись с ID, равным 101, а пользователь Степан создает следующую запись (ее ID равен 102) и транзакция Антона не будет выполнена, то запись с номером 101 не будет создана никогда.

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

    РИС. 3.11. Создание идентификационного поля в диалоговом окне конструктора таблиц Design Table программы SQL Server Enterprise Manager

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

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

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

    • Второй вариант — сохранение значения счетчика во временной таблице и использование этого значения для создания каждого нового первичного ключа создаваемой записи. При этом необходимо использовать транзакцию, которая считывает текущее значение из таблицы счетчика, определяет с его помощью первичный ключ новой записи и увеличивает значение в таблице счетчика. Причем все эти действия представляют собой одну атомарную операцию. При использовании этой технологии есть одно преимущество: соблюдается последовательность значений первичного ключа. К недостаткам (по сравнению с простым созданием идентификационного поля) можно отнести необходимость написания хранимой процедуры и добавления нужных таблиц к базе данных. Сохранение значения счетчика в одной таблице также может привести к возникновению конфликтов при одновременном доступе к ней, что может вызвать проблемы с производительностью в интенсивно используемой системе.

    • Третий вариант — создание первичного ключа на основе данных. Например, пер вичный ключ для записи клиента Vito Polito может иметь вид VP001. Для другого клиента с аналогичными инициалами ключ будет иметь вид VP002 и т.д. К преимуществам можно отнести ассоциацию ключа с данными, а к недостаткам – необходимость создания дополнительного кода в виде хранимых процедур.

    Создание поля с первичным ключом

    Созданное идентификационное поле можно использовать в качестве первичного ключа. Для создания первичного ключа таблицы с помощью программы SQL Server Enterprise Manager выполните приведенные ниже действия.

    РИС. 3.12. Выбор поля для создания первичного ключа в программе SQL Server Enterprise Manager


    1. Установите курсор мыши в том поле, которое собираетесь использовать в качестве первичного ключа.

    2. Щелкните на кнопке Set primary key (Установить первичный ключ) с изображением ключа. После этого в определении таблицы появится первичный ключ, а диалоговое окно конструктора таблицы Design Table будет иметь такой вид, как на рис. 3.12. Левый столбец в перечне полей в верхней части окна содержит обозначения (в виде изображения ключа) полей, которые образуют первичный ключ таблицы. Учтите, что любое поле может быть первичным ключом, а не только идентификационным полем.

    НА ЗАМЕТКУ

    Для создания первичного ключа таблицы можно использовать несколько полей, и такой ключ называется конкатенированным ключом (concatenated key). Для него можно использовать, например, имя и фамилию клиента. Это позволяет предотвратить ввод записи-дубликата для клиента Amy Rosenthal. Чтобы выбрать несколько полей для первичного поля, щелкните на них, удерживая нажатой клавишу <Ctrl>.

    Использование программы SQL Query Analyzer для доступа к базе данных

    РИС. 3.13. Основное окно программы SQL Query Analyzer


    Для выполнения команд SQL Server можно использовать программу SQL Query Analyzer (раньше она называлась ISQLW). С помощью этой программы можно не только осуществлять SQL-запросы, но также обновлять записи, удалять их и выполнять другие действия над ними. Эта программа также позволяет проводить очень сложные операции с базами данных и сервером базы данных, например создавать базы данных, представления и хранимые процедуры.

     Если вы знакомы с синтаксисом SQL, то изучение принципов работы программы SQL Query Analyzer не составит для вас никакого труда. (Однако выполнение некоторых специализированных и сложных операций может оказаться более трудным, поэтому далее в примерах вместо SQL Query Analyzer используется программа SQL Server Enterprise Manager.)

    Для создания и выполнения команд с помощью программы SQL Query Analyzer запустите ее, щелкнув на кнопке Start (Пуск) и выбрав команду Programs→ Microsoft SQL Server→Query Analyzer (Программы→Microsoft SQL Server→Query Analyzer) или выбрав команду меню Tools→Query Analyzer (Инструменты→Query Analyzer) в окне программы SQL Server Enterprise Manager. На экране появится диалоговое окно Connect to SQL Server (Подключение к серверу SQL Server), в котором нужно выбрать подключаемый сервер баз данных, учетное имя и пароль, а затем щелкнуть на кнопке Connect (Подключиться). После этого появится основное окно программы SQL Query Analyzer (рис. 3.13). При выполнении команд на экране будут появляться дополнительные вкладки для отображения результатов, сообщений, статистических данных и планов. Более подробно они описываются далее в главе.

    Перед выполнением команд SQL необходимо протестировать соединение с сервером. Для этого выполните приведенные ниже действия с базой данных pubs, которая поставляется вместе с SQL Server.

    1. Выберите используемую базу данных. Это можно сделать с помощью SQL-команды USE. Введите следующую команду в диалоговое окно ввода запросов Query (Запрос): USE pubs

    НА ЗАМЕТКУ

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

    2. Выполните введенную команду, нажав клавишу <F5> или щелкнув на кнопке Execute Query (Выполнить запрос) с изображением зеленого треугольника. После выполнения этой команды SQL появится вкладка Messages (Сообщения) со следующим сообщением:

    The command(s) completed successfully.

    Что в переводе означает:

    Команды успешно выполнены.

    3. Для удаления введенной команды SQL выберите команду меню Edit→Clear Window (Редактировать→Очистить окно) или используйте комбинацию клавиш <Ctrl+Shift+Del>.

    4. Теперь попробуйте выполнить простой запрос к базе данных pubs. Для этого введите следующий код SQL в окно Query:

    SELECT * FROM authors
     

    5. Выполните запрос, нажав клавишу <F5> или щелкнув на кнопке Execute Query (Выполнить запрос) с изображением зеленого треугольника. После выполнения этой команды SQL появится вкладка Grid (Решетка) с результатами выполнения запроса (рис. 3.14) и вкладка Messages (Сообщения) со следующим сообщением о количестве извлеченных строк:

    (23 row(s) affected)

    Что в переводе означает:

    (Извлечено 23 строки)

    РИС. 3.14. Результат выполнения простого запроса к таблице pubs в окне программы SQL Query Analyzer

    СОВЕТ 

    Помимо выполнения сразу всех команд сценария в диалоговом окне Query одну или несколько строк с командами SQL можно выполнять, выделяя нужные строки и нажимая клавишу <F5> или щелкая на кнопке Execute Query. Это позволяет повторно выполнять части команд, возможно, даже после их модификации.

    Просмотр всех объектов базы данных с помощью хранимой процедуры sp_help

    SQL Server позволяет просмотреть все объекты, доступные в любой базе данных. Это можно сделать с помощью хранимой процедуры (stored procedure) – небольшого кода, хранящегося и выполняемого на сервере. 

    Просмотреть все объекты базы данных можно с помощью хранимой процедуры sp_help. Для этого необходимо ввести ее и выполнить как обычный SQL-запрос в окне программы Query Analyzer.

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

    1. Очистите диалоговое окно запроса Query, нажав комбинацию клавиш <Ctrl+Shift+Del>.

    2. Введите в нем следующую команду:

    sp_help

    3. Выполните введенную команду. SQL Server сгенерирует список доступных объектов базы данных, как показано на рис. 3.15.

    РИС. 3.15. Результат выполнения хранимой процедуры sp_help для базы данных pubs

    НА ЗАМЕТКУ

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

    Использование существующей базы данных

    Для работы с определенной базой данных в программе Query Analyzer можно использовать команду USE. После выбора с ее помощью соответствующей базы данных все вводимые SQL-команды будут выполняться для этой выбранной базы данных. Обратите особое внимание на необходимость применения команды USE, поскольку существует ряд команд, которые имеют один и тот же синтаксис при использовании с разными базами данных. Выполнение такой команды "не с той базой данных" может привести к неприятным последствиям.

    НА ЗАМЕТКУ

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

    Например, для активизации базы данных novelty вместо основной базы данных master выполните перечисленные ниже действия.

    1. Введите в окне Query Analyzer команду USE novelty. Если база данных novelty существует, то SQL Server вернет следующее сообщение:

    The command(s) completed successfully.

    Что в переводе означает:

    Команды успешно выполнены.

    2. Если же базы данных novelty на этом сервере нет, то появится сообщение

    Server: 911, Level 16, State 1, Line 1

    Could not locate entry in sysdatabases for database 'novelty'. No entry found with that name. Make sure that the name is entered correctly.

    Что в переводе означает следующее:

    Сервер: Сообщение Уровень 16, Состояние 1, Строка 1

    Не могу обнаружить системную базу данных 'novelty'. Нет никаких регистрационных записей с этим именем. Убедитесь в том, что введено правильное имя базы данных.

    Если вы забыли имя базы данных, то запустите программу SQL Server Enterprise Manager и найдите интересующую вас базу данных. Для просмотра объектов базы данных можно также воспользоваться хранимой процедурой sp_helpdb.

    Создание команд SQL в программе Query Analyzer

    С помощью программы Query Analyzer можно создавать практически любые команды SQL, причем этот способ обладает многими преимуществами по сравнению со всеми другими способами создания команд SQL. Учтите, что синтаксис некоторых команд SQL может оказаться гораздо сложнее, чем простое использование графических элементов управления в программе SQL Server Enterprise Manager, особенно при использовании редко выполняемых команд, например для создания баз данных. В этом смысле программа Query Analyzer обладает несомненным преимуществом интерактивного создания команд SQL и мгновенно реагирует на создаваемые команды. Query Analyzer обладает некоторыми другими функциональными возможностями, которых нет программе SQL Server Enterprise Manager, например способностью запускать запросы и хранимые процедуры.

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

    Использование представлений для управления доступом к данным

    Представление (view) — это, по сути, определение запроса, хранящегося в базе данных. Оно подобно определению запроса в базах данных Microsoft Jet, однако отличается местом хранения: располагается в базе данных и предоставляет приложению-клиенту доступ к данным.

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

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

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

    • ограничивать количество строк и столбцов, возвращаемых представлением;

    • обеспечивать простой доступ к данным, возвращаемым из нескольких таблиц, с помощью объединений в представлении.

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

    Создание представлений с помощью программы SQL Server Enterprise Manager

    Представления, как и большинство других объектов базы данных, можно создавать с помощью программ SQL Server Enterprise Manager или SQL Query Analyzer. Программа SQL Server Enterprise Manager обладает мощными и выразительными графическими инструментами, а программа SQL Query Analyzer- интерактивными инструментами для создания и выполнения команд SQL, а также тестирования созданных представлений.

    Для создания представления с помощью программы SQL Server Enterprise Manager выполните приведенные ниже действия.

    1. В диалоговом окне Server Manager щелкните правой кнопкой мыши на папке Views в той базе данных, в которой необходимо создать представление. В этом примере используется база данных pubs.

    2. Из контекстного меню выберите команду New View (Создать представление), и на экране появится окно конструктора представлений программы, как показано на рис. 3.16.

    РИС. 3.16. Создание нового представления в окне программы SQL Server Enterprise Manager


    НА ЗАМЕТКУ

    При первом открытии диалогового окна Design View в его заголовке будут слова New View, а не Design View.

    СОВЕТ

    Эти графические инструменты создания представлений можно использовать для создания запросов. Для этого щелкните правой кнопкой мыши на таблице базы данных и выберите из контекстного меню команду Open Table→Query (Открыть таблицу→Запрос). Созданный запрос нельзя сохранить, потому что отдельный запрос не является объектом базы данных SQL Server. Однако конструктор базы данных полезен для создания и тестирования хранимых процедур и извлечения отдельного набора данных.

    3. Для открытия диалогового окна Add Table (Добавить таблицу) щелкните на кнопке Add Table с изображением плюса и таблицы или щелкните правой кнопкой мыши на пустом поле со схемой представления и выберите в контекстном меню команду Add Table.

    4. Выберите таблицу jobs и щелкните на кнопке Add (или дважды щелкните на таблице jobs) для включения таблицы jobs в представление.

    5. Выберите таблицу employee и щелкните на кнопке Add (или дважды щелкните на таблице employee) для включения таблицы employee в представление.

    6. Щелкните на кнопке Close, чтобы закрыть диалоговое окно Add Table.

    7. Выберите поля в каждой таблице, т.е. поле job_desc в таблице jobs и поля fname и lname в таблице employee.

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

    РИС. 3.17. Результаты создания и выполнения нового представления в окне конструктора представлений программы SQL Enterprise Manager


    9. Сохраните новое представление, щелкнув на кнопке Save или щелкнув правой кнопкой мыши на пустом поле со схемой представления, а затем выбрав из контекстного меню команду Save.

    НА ЗАМЕТКУ

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

    10. В диалоговом окне Save As (Сохранить как) введите имя представления и щелкните на кнопке OK. Здесь можно указать любое имя, но в данном примере используется EmployeeJobs_view.

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

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

    CREATE VIEW EmployeeNames_view AS

    SELECT lname + ', ' + fname AS Name FROM employee

    Использование представлений в приложениях

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

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

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

    Кроме этого, с помощью компонентов среднего уровня можно отделить изменения структуры базы данных от изменений бизнес-правил. Эти компоненты аналогичны представлениям и хранимым процедурам тем, что скрывают изменения структуры базы данных от клиентского приложения. Помимо этого, существует еще одно преимущество использования таких компонентов по сравнению с представлениями и хранимыми процедурам SQL Server: они упрощают процесс программирования, возвращают данные в виде объектов, а не строк и столбцов, а также не привязаны к конкретной СУБД или языку программирования. Более подробно компоненты среднего уровня рассматриваются в главе 12, "Web-службы и технологии промежуточного уровня".

    Создание представления с помощью программы SQL Query Analyzer

    Для создания представлений можно использовать программу SQL Query Analyzer. Процесс создания представления в ней аналогичен подобному процессу в программе SQL Server Enterprise Manager, но обладает большей гибкостью, несмотря на использование более скромных графических инструментов. Для создания представления tblEmployee без конфиденциального поля Salary в программе SQL Query Analyzer выполните приведенные ниже действия.

    1. Введите в окно программы SQL Query Analyzer следующий код (он организован таким образом, чтобы представление создавалось независимо от того, существует оно уже или нет):

    USE novelty GO

    DROP VIEW Employee_view GO

    CREATE VIEW Employee_view AS

    SELECT ID, FirstName, LastName, DepartmentID

    FROM tblEmployee GO SELECT * FROM Employee_view

    2. Для выполнения этой последовательности команд нажмите клавишу <F5> или щелкните на кнопке Execute Query. Представление будет создано и запущено, а результаты будут показаны во вкладке Grids (или Results).

    3. Проверьте работоспособность представления с помощью программы SQL Server Enterprise Manager, в которой нужно выбрать вкладку Views для базы данных Novelty.

    НА ЗАМЕТКУ

    Ранее в этой главе рассматривалось, как создать представление графическими средствами в программе SQL Server Enterprise Manager, щелкая на нем правой кнопкой мыши и выбирая команду Design View (Создать представление) из контекстного меню. Текст команды SQL для создания представления можно редактировать, дважды щелкнув на представлении и изменяя этот текст в диалоговом окне.

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

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

    Создание и запуск хранимых процедур

    С помощью представления можно контролировать данные, возвращаемые SQL Server, однако существует еще более мощное средство — хранимые процедуры (stored procedures). Хранимые процедуры подобны представлениям, но могут выполнять более сложные операции над данными. Например, с помощью хранимых процедур можно выполнять следующие операции:

    • вычисления;

    • установка или возврат параметров;

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

    • возврат данных в форме, которая наилучшим образом подходит для приложения-клиента.

    Заметьте: не все эти операции можно выполнить с помощью представлений.

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

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

    НА ЗАМЕТКУ

    Компания Microsoft заявила, что будущие версии SQL Server позволят создавать хранимые процедуры на любом языке, который совместим с платформой .NET (например, Visual Basic .NET), а не только на языке Transact SQL. Это позволит разработчикам легко переходить от одного аспекта программирования к другому, не изучая синтаксиса нового языка программирования.

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

    Создание хранимых процедур с помощью программы SQL Server Enterprise Manager

    Для создания хранимой процедуры с помощью SQL Server Enterprise Manager выполните ряд действий.

    1. В окне Microsoft SQL Servers программы SQL Server Enterprise Manager щелкните правой кнопкой мыши на папке Stored Procedures рабочей базы данных. В нашем примере это база данных pubs.

    2. Из контекстного меню выберите команду New Stored Procedure (Создать хранимую процедуру). Появится диалоговое окно Stored Procedure Properties (Свойства хранимой процедуры).

    НА ЗАМЕТКУ

    Хотя диалоговое окно Stored Procedure Properties выглядит как окно с фиксированными размерами, его размер можно изменить, перетаскивая один из краев или уголков окна, как это делается с другими диалоговыми окнами. Таким образом можно изменить размер окна для более удобного отображения всего введенного текста.

    3. Введите текст хранимой процедуры, который показан на рис. 3.18.

    РИС. 3.18. Диалоговое окно создания новой хранимой процедуры Stored Procedure Properties в программе SQL Server Enterprise Manager


    4. После выполнения этих действий щелкните на кнопке OK в нижней части диалогового окна Stored Procedure Properties.

    Запуск хранимых процедур в окне программы SQL Query Analyzer

    Для запуска хранимых процедур (а также представлений и других команд SQL) можно воспользоваться программой SQL Query Analyzer. Таким образом можно протестировать созданную хранимую процедуру или представление. Для запуска хранимой процедуры в окне программы SQL Query Analyzer выполните приведенные ниже действия.

    1. В окне программы SQL Server Enterprise Manager выберите команду Tools→SQL Query Analyzer (Сервис→SQL Query Analyzer); запустится программа SQL Query Analyzer.

    2. В диалоговом окне Query введите имя хранимой процедуры, которую нужно запустить. Например, для запуска хранимой процедуры, описанной в предыдущем разделе, введите procEmployeesSorted.

    3. Выполните запрос, нажав клавишу <F5> или щелкнув на кнопке Execute Query. Хранимая процедура будет выполнена и возвратит (при наличии данных в таблице) результирующий набор во вкладке Grids (или во вкладке Results).

    4. В окне Microsoft SQL Servers программы SQL Server Enterprise Manager выберите папку Stored Procedures для проверки наличия только что созданной хранимой процедуры. Здесь для обновления содержимого консольного окна, возможно, понадобится щелкнуть на кнопке Refresh (Обновить).

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

    Создание хранимой процедуры с помощью программы SQL Query Analyzer

    Процесс создания хранимой процедуры с помощью SQL Query Analyzer практически не отличается от аналогичного процесса в окне программы SQL Server Enterprise Manager.

    НА ЗАМЕТКУ

    Убедитесь в том, что хранимая процедура создается в базе данных Novelty. Довольно часто разработчики забывают переключиться на нужную базу данных (с помощью команды USE или списка баз данных в программе SQL Query Analyzer) до выполнения команд по отношению к ней. Создание хранимых процедур с помощью программы SQL Server Enterprise Manager только усугубляет последствия этой ошибки.

    Для создания хранимой процедуры с помощью программы SQL Query Analyzer используйте команду CREATE PROCEDURE.

    1. В окне программы SQL Query Analyzer введите следующий код:

    CREATE PROCEDURE GetCustomerFromID @custID int

    AS

    SELECT * FROM tblCustomer

    WHERE ID = @custID

    2. В этом коде создается хранимая процедура GetCustomerFromID, которая принимает аргумент @custID и возвращает запись, в поле ID которой находится значение, совпадающее со значением аргумента @custID (поскольку поле ID в таблице tblCustomer является первичным ключом, эта процедура всегда будет возвращать либо нуль, либо одну запись).

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

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

    GetCustomerFromID 22

    5. Сервер вернет запись клиента с идентификационным номером 22 (рис. 3.19). Использование другого идентификационного номера в качестве параметра этой хранимой процедуры позволит вернуть другую запись с данными о другом клиенте.

    Созданная процедура вернет данные только в том случае, если они есть в таблице.

    РИС. 3.19. Запись клиента возвращается с помощью хранимой процедуры GetCustomerFromID


    НА ЗАМЕТКУ

    Теперь можно приступить к загрузке данных в таблицу. В прилагаемых к книге файлах (их вы можете найти на Web-узле Издательского дома "Вильяме" по адресу: http://www.williamspublishing.com) находится текстовый файл CustomerData.sql, который предназначен для загрузки данных о клиенте в базу данных Novelty. Кроме него, этому адресу располагаются и другие сценарии загрузки данных в таблицы базы данных Novelty.

    Отображение текста существующих представлений или хранимых процедур

    Для отображения кода представлений или хранимых процедур можно использовать хранимую процедуру sp_helptext. Для того чтобы отобразить эти данные, необходимо ввести команду sp_helptext, а затем имя интересующего вас объекта базы данных. После этого SQL Server возвратит полный текст представления или хранимой процедуры. Рассмотрим пример отображения текста представления Employee_view, создание которого описано в предыдущих разделах.

    1. В окне Query программы SQL Query Analyzer введите следующую команду:

    sp_helptext Employee_view

    2. Выполните введенную команду, нажав клавишу <F5> или щелкнув на кнопке Execute Query панели инструментов программы SQL Query Analyzer. В результате выполнения этой команды SQL Server вернет текст хранимой процедуры во вкладке Grids (рис. 3.20).

    РИС. 3.20. Отображение текста представления с помощью хранимой процедуры sp_helptext

    Создание триггеров

    Триггер (trigger) — это особый тип хранимой процедуры, который выполняется при доступе к данным в таблице. Понятие триггера в SQL Server аналогично понятию процедуры события в Visual Basic: триггер выполняется при обновлении, удалении или вставке данных в таблицу.

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

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

    Например, можно использовать триггеры, чтобы обеспечить уникальное значение в столбце для сохранения первичного ключа. Этот способ характерен для программы Microsoft Access Upsizing Tools; в ней генерируется случайное значение первичного ключа каждой записи с помощью триггера. (Для этого можно использовать уникальное поле, как уже упоминалось ранее в главе.) Пример такого кода генерации первичного ключа приведен ниже.

    CREATE TRIGGER tblCustomer_ITrig ON dbo.tblCustomer

    FOR INSERT

    AS

    DECLARE @randc int, @newc int

    SELECT @randc = (SELECT convert(int, rand () * power(2, 30)))

    SELECT @newc = (SELECT ID FROM inserted)

    UPDATE tblCustomer SET ID = @randc WHERE ID = @newc

    НА ЗАМЕТКУ

    Для корректной работы каждого из этих триггеров и обновления идентификационного поля нужно переустановить значения этого поля таким образом, чтобы оно не считалось идентификационным. Для этого перейдите в диалоговое окно Design Table и задайте для свойства Identity(Идентификационное поле) значение No.

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

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

    Во-вторых, существует потенциальная проблема, состоящая в том, что сгенерированный уникальный ключ на самом деле не будет уникальным, т.е. при создании ключа не выполняется проверка существования записи с таким же значением первичного ключа. Конечно, вероятность того, что будет сгенерировано два одинаковых значения, очень мала, но она все же существует (тип данных integer в SQL Server имеет длину 4 бита, т.е. диапазон возможных значений: -2,1×109…2,1×109).

    Бизнес-ситуация 3.1: создание триггера для поиска созвучных слов

    Брэд Джонс, президент компании Jones Novelties Incorporated, одобрил предварительную работу своего разработчика базы данных. Теперь он готов приступить к следующей проблеме, связанной с базой данных, и создать запросы для извлечения информации о клиентах по введенному созвучному имени (например, имена произносятся одинаково, но пишутся по-разному) с учетом случайных опечаток в нем. Как организовать поиск клиента, если вы не помните точное написание его имени, а только его произношение: Smith или Smyth, McManus или MacManus? Каждому человеку с необычной фамилией наверняка приходилось сталкиваться с ее неверной записью на слух.

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

    Для реализации этого компонента в базе данных Jones Novelties нужно выполнить следующие действия:

    • изменить таблицу tblCustomer для вставки нового поля LastNameSoundex;

    • запустить запрос обновления данных для создания алфавитно-цифровых значений звучания для имен клиентов в таблице tblCustomer;

    • создать триггер, который сгенерирует в поле LastNameSoundex алфавитно-цифровое значение звучания для введенного или измененного имени;

    • создать хранимую процедуру, которая возвращает всех клиентов с одинаково звучащими именами.

    Разработчик базы данных начинает с создания нового поля LastNameSoundex в таблице tblCustomer для хранения в нем алфавитно-цифровых значений звучания имен всех клиентов. Это можно сделать с помощью следующей команды:

    ALTER TABLE tblCustomer ADD

    LastNameSoundex varchar(4) NULL

    Затем разработчику нужно создать и только один раз выполнить команду UPDATE для вычисления алфавитно-цифровых значений звучания уже имеющихся имен в базе данных.

    UPDATE tblCustomer

    SET LastNameSoundex = soundex(lastName)

    GO

    SELECT LastName, LastNameSoundex

    FROM tblCustomer

    GO

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

    Далее разработчику нужно создать триггер, чтобы вставить алфавитно-цифровое значение звучания для каждого введенного в базу данных имени нового клиента.

    CREATE TRIGGER trCustomerT

    ON tblCustomer

    FOR insert, update

    AS

     UPDATE tblCustomer

     SET tblCustomer.LastNameSoundex = soundex(tblCustomer.LastName)

     FROM inserted

     WHERE tblCustomer.ID = inserted.ID

    НА ЗАМЕТКУ

    Хотя в SQL Server 2000 для одной таблицы допускается определение нескольких триггеров одного типа (для вставки, обновления и удаления), но порядок их выполнения контролируется только частично, т.е. можно указать только первый и последний выполняемый триггер. Для гарантированного выполнения данного триггера после всех триггеров вставки для таблицы tblCustomer (например, триггера присвоения значения столбцу ID) нужно выполнить в программе SQL Query Analyzer следующую команду:

    sp_settriggerorder @triggername=@order='last', @stmtype='INSERT'

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

    Для обработки нужного набора записей триггеру должно быть известно, какие записи участвовали в выполнении процедуры, которая привела к ее запуску. Откуда же у триггера такие сведения? Триггеры обладают доступом к этой информации благодаря виртуальным таблицам вставки и удаления. Виртуальная таблица вставки содержит записи, вставленные (или обновленные) процедурой, которая привела к запуску триггера вставки. Аналогично, виртуальная таблица удаления содержит записи, удаленные процедурой, которая привела к запуску триггера удаления.

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

    После создания надежного триггера, который генерирует алфавитно-цифровое значение звучания для имени для каждой записи в таблице tblCustomer, нужно проверить его работоспособность, вставив запись, которую невозможно извлечь с помощью традиционного запроса. Допустим, что в базе данных есть несколько клиентов с именем Smith, и пробуем вставить в нее запись о клиенте Smythe с помощью следующей команды INSERT:

    INSERT INTO tblCustomer (FirstName, LastName)

    VALUES ('Abigail', 'Smythe')

    Теперь работу созданного триггера можно проверить с помощью следующего запроса:

    SELECT LastNameSoundex, LastName

    FROM tblCustomer

    WHERE LastName = 'Smythe'
     

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

    CREATE PROC LastNameLookup

    @name varchar(40) AS

    SELECT * FROM tblCustomer

    WHERE soundex(@name) = LastNameSoundex

    Наконец, можно приступать к извлечению записей из базы данных на основе значений звучания. Для этого нужно выполнить хранимую процедуру LastNameLookup. LastNameLookup 'smith'

    После выполнения этой процедуры программа Query Analyzer возвращает набор записей, состоящий из клиентов с фамилией, созвучной smith, включая клиента с фамилией Smythes (рис. 3.21).

    РИС. 3.21. Набор записей, возвращенный хранимой процедурой LastNameLookup

    Управление пользователями и средства безопасности с помощью программы SQL Server Enterprise Manager

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

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

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

    Создание и сопровождение учетных записей пользователей

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

    Для регистрации пользователя нужно сначала создать его учетную запись, выполнив приведенные ниже действия.

    1. В программе SQL Server Enterprise Manager откройте папку Security для используемого сервера SQL Server.

    2. Щелкните правой кнопкой мыши на объекте Logins и выберите команду Action→New Login (Действие→Новая учетная запись).

    3. Появится диалоговое окно SQL Server Login Properties — New Login (рис. 3.22).

    4. Для создания новой учетной записи установите переключатель SQL Server Authentication (Аутентификация на сервере SQL Server) и введите имя пользователя в поле Name. По желанию введите пароль в поле Password.

    НА ЗАМЕТКУ

    При использовании аутентификации Windows нужно предусмотреть процедуру в клиентском приложении, с помощью которой пользователь мог бы изменить свой пароль. Эту процедуру можно реализовать с помощью sp_password. Учтите, что при использовании интегрированной системы безопасности это необязательно, потому что в таком случае используются механизмы аутентификации и изменения паролей системы Windows NT/2000. 

    РИС. 3.22. Диалоговое окно SQL Server Login Properties, предназначенное для создания новой учетной записи

    5. При отображении учетной записи Windows NT/2000 на учетную запись SQL Server установите переключатель Windows Authentication (Аутентификация Windows), а затем щелкните на кнопке с многоточием для выбора существующей учетной записи Windows NT/2000.

    6. Укажите используемую по умолчанию базу данных, выбрав Novelty в списке баз данных Database.

    7. Укажите базы данных, к которым осуществляется доступ с помощью этой учетной записи, воспользовавшись вкладкой Database Access (Доступ к базе данных) в диалоговом окне SQL Server Login Properties (рис. 3.23).

    8. Щелкните на кнопке по окончании присвоения учетной записи. После создания такой учетной записи связанный с ней пользователь может осуществлять доступ к указанной базе данных. Новая учетная запись сразу же отображается в консольном окне Microsoft SQL Servers программы SQL Server Enterprise Manager (рис. 3.24). 

    РИС. 3.23. Создание новой учетной записи для доступа к базе данных

    Управление ролями с помощью программы SQL Server Enterprise Manager

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

    В SQL Server 2000 используются два типа ролей: серверные и роли базы данных. Серверные роли управляют доступом к операциям, которые влияют на сервер SQL Server, например запуск и остановка сервера, конфигурирование таких усовершенствованных компонентов, как репликация, управление системой безопасности и создание баз данных. Роли баз данных управляют операциями и доступом к данным указанной базы данных.

    Для добавления пользователя с серверной ролью в программе SQL Server Enterprise Manager выполните перечисленные ниже действия.

    1. В окне Microsoft SQL Servers программы SQL Server Enterprise Manager откройте папку Security используемого сервера и выберите папку Server Roles для отображения фиксированного набора серверных ролей. 

    РИС. 3.24. Новая учетная запись отображается в консольном окне Microsoft SQL Servers программы SQL Server Enterprise Manager


    2. Щелкните правой кнопкой мыши на изменяемой роли и выберите команду Properties из контекстного меню или щелкните дважды на изменяемой роли. При этом на экране появится диалоговое окно Server Role Properties (Свойства серверной роли), показанное на рис. 3.25.

    3. Чтобы указать учетную запись для данной роли, щелкните на кнопке Add и выберите учетную запись из списка доступных учетных записей.

    4. Для удаления учетной записи из роли выберите нужную запись (или несколько записей) из списка учетных записей, которые в данный момент являются членами роли, а затем щелкните на кнопке Remove (Удалить).

    5. Щелкните на кнопке OK, чтобы закрыть диалоговое окно Server Role Properties.

    СОВЕТ

    Для включения или удаления учетной записи из серверной роли можно использовать вкладку Server Roles (Серверные роли) диалогового окна SQL Server Login Properties, которое рассматривалось выше в главе. 

    РИС. 3.25. Диалоговое окно Server Role Properties с примером использования учетной записи для роли Process Administrators (Администраторы процессов)


    Дня создания учетной записи с ролью базы данных в программе SQL Server Enterprise Manager выполните ряд действий.

    1. В окне Microsoft SQL Servers программы SQL Server Enterprise Manager откройте папку Roles (Роли) для той базы данных, в которой необходимо создать новую роль. После этого на экране будут показаны все имеющиеся роли базы данных.

    2. Щелкните правой кнопкой мыши на нужной роли и выберите команду Properties в контекстном меню или щелкните дважды на изменяемой роли. При этом на экране появится диалоговое окно Database Role Properties (Свойства роли базы данных), показанное на рис. 3.26.

    3. Для добавления новой роли к базе данных щелкните на кнопке Add и выберите одного или нескольких пользователей из списка всех пользователей этой базы данных.

    4. Для удаления пользователя из роли выберите одного или нескольких пользователей из списка всех пользователей роли и щелкните на кнопке Remove.

    5. Щелкните на кнопке OK, чтобы закрыть диалоговое окно Database Role Properties. 

    РИС. 3.26. Диалоговое окно Database Role Properties с примером добавления роли db_accessadmin

    СОВЕТ

    В SQL Server 2000, помимо предварительно заданных ролей базы данных, предусмотрено использование определенных пользователем ролей базы данных. Эти роли позволяют настроить способ доступа к данным и выполняемым операциям с базой данных (на этом этапе станет активной кнопка Permissions). Более информацию о ролях базы данных можно найти в справочных руководствах SQL Server Books Online.

    Тестирование системы безопасности с помощью программы SQL Query Analyzer

    Здесь у читателя может возникнуть вопрос: а что произойдет, если "обычный" пользователь попытается получить доступ к объектам базы данных, не имея разрешения. Поскольку программа SQL Query Analyzer разрешает регистрироваться под любым именем, то ответ на этот вопрос можно получить, выполнив приведенные ниже действия с помощью диалогового окна Query.

    1. Убедитесь в том, что для проверяемой учетной записи снят флажок роли db_owner для базы данных Novelty, который показан на рис. 3.23.

    2. Отключитесь от используемого сервера, выбрав команду File→Disconnect (Файл→Отключиться) или команду File→Disconnect All (Файл→Отключиться от всех) в меню программы SQL Query Analyzer.

    3. Теперь выберите команду File→Connect (Файл→Подключиться). В появившемся диалоговом окне Connect to SQL Server введите имя пользователя и пароль, созданные в предыдущем разделе для подключения к базе данных Novelty.

    4. Теперь попробуйте выполнить запрос к таблице, доступ к которой этому пользователю запрещен. Например, выполните запрос

    SELECT *

    FROM tblCustomer

    SQL Server вернет следующую строку:

    Server: Msg 229, Level 14, State 5, Line 1

    SELECT permission denied on object database 'Novelty', owner 'dbo'.

    НА ЗАМЕТКУ

    В этом примере (особенно в п. 5) предполагается, что используется база данных Novelty, а не какая-то другая.

    5. Попытаемся теперь выполнить следующую хранимую процедуру:

    LastNameLookup' smith'

    В ответ SQL Server извлечет из таблицы tblCustomer все имена, созвучные имени Smith.

    Применение ограничений безопасности в программе SQL Query Analyzer

    Параметры системы безопасности можно контролировать с помощью программы SQL Query Analyzer. Обычно для этого используется тот же пакет команд SQL, что и для создания базы данных. Такой порядок позволяет разработчику учесть и применить все необходимые ограничения безопасности для вновь созданных объектов базы данных.

    Для создания новой учетной записи со средствами аутентификации SQL Server с помощью программы SQL Query Analyzer следует использовать хранимую процедуру sp_addlogin. Например, чтобы создать учетную запись Frances, выполните такую команду:

    sp_addlogin 'Frances'

    А чтобы создать пароль stairmaster для учетной записи Frances, выполните команду

    sp_addlogin 'Frances', 'stairmaster'

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

    Чтобы пользователь с учетной записью Frances мог работать с базой данных Novelty, используйте хранимую процедуру sp_adduser.

    USE Novelty

    GO

    sp_adduser 'Frances', 'Frannie'

    GO
     

    Для отображения списка всех учетных записей и баз данных, связанных с ними по умолчанию, в используемой вами версии SQL Server с помощью программы SQL Query Analyzer выполните приведенную ниже команду.

    USE Novelty

    GO

    SELECT name, dbname

    FROM syslogins

    Для включения нового пользователя в состав группы пользователей с ролью базы данных db_datawriter выполните хранимую процедуру sp_addrolemember.

    USE Novelty

    GO

    sp_addrolemember 'db_datawriter', 'Frannie'

    Для отображения списка всех ролей базы данных выполните хранимую процедуру sp_helprole.

    Чтобы выдать и отменить разрешения для любого объекта базы данных, используйте команды SQL GRANT и REVOKE соответственно. Команда GRANT разрешает пользователю выполнять указанную роль, а команда REVOKE отменяет разрешение. Например, для выдачи членам роли public разрешения на полный доступ к таблице Customer воспользуйтесь следующей командой SQL:

    GRANT ALL

    ON tblCustomer

    TO public

    А для выдачи членам роли public разрешения только на выборку данных из таблицы tblCustomer воспользуйтесь командой SQL

    GRANT SELECT

    ON tblCustomer

    TO public

    Для отмены разрешения на полный доступ к таблице tblCustomer со стороны членов роли public используйте команду SQL REVOKE.

    REVOKE ALL

    ON tblCustomer

    TO public

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

    Определение подключенных пользователей

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

    РИС. 3.27. Результат выполнения хранимой процедуры sp_who

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

    Завершение процесса с помощью команды KILL

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

    Перед использованием этой команды необходимо узнать идентификатор процесса, выполнив хранимую процедуру sp_who (если предполагается удалить пользовательский сеанс) или хранимую процедуру sp_lock (если предполагается удалить блокировку базы данных). В обоих случаях в поле spid возвращаются идентификаторы всех процессов. Зная идентификатор нужного процесса, его можно удалить.

    Допустим, что после выполнения хранимой процедуры sp_who вы узнали номер процесса, например 10, который необходимо удалить. Для его удаления введите в окне Query программы SQL Query Analyzer команду

    KILL 10

    После выполнения этой команды указанный процесс будет немедленно удален.

    НА ЗАМЕТКУ

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

    Удаление объектов базы данных

    В SQL Server для удаления объектов используется команда DROP. Удаленный с ее помощью объект исчезает безвозвратно, причем удаляется не только структура объекта, но и его содержимое.

    Для удаления объекта с помощью программы Enterprise Manager, например таблицы, выделите ее, щелкните правой кнопкой мыши и из контекстного меню выберите команду Delete.

    А для удаления объекта из базы данных с помощью программы SQL Query Analyzer используйте команду DROP. Например, для удаления таблицы tblCustomer введите следующую команду:

    DROP TABLE tblCustomer

    Бизнес-ситуация 3.2: SQL-сценарий для создания базы данных

    Для запуска примеров кода требуется запустить сценарий NoveltyDB.sql, который предназначен для создания и запуска базы данных Novelty. (Наверное, вы уже заглядывали в него и интересовались тем, что он делает.)

    Поскольку структура базы данных может изменяться в процессе создания приложения, разработчику нужно периодически создавать сценарий для документирования текущей структуры базы данных, а также для автоматического создания (или воссоздания) базы данных. Хотя разработчик может обладать полным контролем и вручную создавать такие сценарии, но гораздо лучше применять для этого программу SQL Server Enterprise Manager. По крайней мере она прекрасно подходит для создания основы сценария и его последующего редактирования. Этот подход позволяет гораздо быстрее добиться решения поставленной задачи с меньшей вероятностью возникновения ошибок.

    Разработчик базы данных для компании Jones Novelties Incorporated решил применить этот подход для создания корпоративной базы данных. Созданный им сценарий позволяет просто инсталлировать объекты базы данных на компьютере, на котором она даже не определена. Иначе говоря, сценарий выполняет все необходимые действия для создания и инсталляции базы данных и ее объектов на совершенно "пустом" компьютере, что обычно требуется при инсталляции системы на новом рабочем месте. На рис. 3.28 показана схема базы данных Novelty в диалоговом окне программы SQL Server Enterprise Manager.

    РИС. 3.28. Структура базы данных Novelty компании Jones Novelties Incorporated в диалоговом окне программы SQL Server Enterprise Manager

    Сценарий создания базы данных выполняется в программе SQL Query Analyzer. Чтобы сократить до минимума ошибки, этот сценарий удаляет все прежние объекты базы данных. Это значит, что при любом изменении структуры базы данных в режиме конструктора целостность базы данных может быть восстановлена с самого начала просто за счет повторного выполнения сценария. Этот подход гарантирует, что все изменения структуры базы данных учитываются каждый раз при ее повторном создании.

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

    Для генерации сценариев создания базы данных для компании Jones Novelties Incorporated выполните перечисленные ниже действия.

    1. Откройте программу SQL Server Enterprise Manager и щелкните правой кнопкой мыши на базе данных Novelty.

    2. Выберите команду All Tasks→Generate SQL Script (Все задачи→Генерировать сценарий SQL) из контекстного меню для открытия диалогового окна Generate SQL Scripts.

    3. Щелкните на кнопке Show All для отображения всех доступных объектов выбранной базы данных.

    4. Теперь у вас есть возможность выбора одного или нескольких объектов сценария. Установите флажок Script all objects (Включить в сценарий все объекты), чтобы выбрать все объекты базы данных, как показано на рис. 3.29.

    РИС. 3.29. Выбор всех объектов базы данных Novelty для включения в сценарий в диалоговом окне Generate SQL Scripts


    5. Выберите вкладку Formatting (Форматирование). Помимо установленных по умолчанию флажков параметров установите флажок Include descriptive headers in the Script files (Включить описательные заголовки в файлы сценариев).

    СОВЕТ

    Не забудьте установить во вкладке Formatting флажок Include descriptive headers in the script files, потому что он приводит к автоматическому созданию строки заголовка с указанием времени и даты генерации сценария. Это очень полезное усовершенствование позволит вам впоследствии легко определить самую последнюю (или наиболее правильную) версию сценария.

    6. Если вам нужен сценарий только для создания объектов базы данных, то на этом можно остановиться. Однако для генерации сценария создания физической базы данных нужно продолжить работу, выбрав вкладку Options (Параметры).

    7. В группе параметров Security Scripting Options (Параметры сценария безопасности) установите флажок Script (Включить в сценарий базу данных). Кроме него, можно также установить флажки других параметров для пользователей базы данных, ролей и учетных записей, но здесь мы этого делать не будем, считая это отдельной задачей администрирования базы данных.

    8. В группе параметров Table Scripting Options (Параметры сценария таблицы) установите флажки Script indexes (Включить в сценарий индексы), Script triggers (Включить в сценарий триггеры) и Script PRIMARY keys, FOREIGN keys, defaults, and check constraints (Включить в сценарий первичные ключи, внешние ключи, принимаемые по умолчанию значения и ограничения целостности), как показано на рис. 3.30.

    РИС. 3.30. Вкладка Options диалогового окна Generate SQL Scripts

    9. Щелкните на кнопке OK для запуска процесса генерации сценария. При этом на экране появится стандартное диалоговое окно Save As (Сохранить как), в котором следует ввести имя файла (с расширением .sql) и указать путь к нему. Сделайте это и щелкните на кнопке Save. После успешного создания сценария на экране появится диалоговое окно с сообщением об этом. Щелкните на кнопке OK для его удаления.

    НА ЗАМЕТКУ

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

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

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    или

    SET QUOTED IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

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

    Далее созданный сценарий предлагается в виде отдельных фрагментов, но на практике его рекомендуется создавать и применять в виде целого файла. В таком случае после создания рабочего сценария можно вставить его текст в окно Query программы SQL Query Analyzer (либо загружая его из тестового файла, либо копируя и вставляя с помощью буфера обмена) и щелкнуть на кнопке Execute для запуска. Можно также использовать отдельные фрагменты сценария или создать на основе единого сценария несколько отдельных сценариев и выполнять каждый из них. При создании сценариев SQL с помощью программы SQL Query Analyzer отдельные команды SQL можно редактировать в диалоговом окне Query, тестировать и проверять результаты их выполнения, а затем сохранять их в файле после завершения этих операций.

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

    Листинг 3.1. Сценарий создания физической базы данных Novelty

    /****** Object: Database Novelty Script Date: 10-Jul-02 12:41:09 PM ******/

    IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'Novelty')

     DROP DATABASE [Novelty]

    GO


    CREATE DATABASE [Novelty] ON (NAME = N'novelty_Data',

     FILENAME = N'c:\program files\microsoft sql server\
    mssql\data\Novelty_Data.mdf',

     SIZE = 3, FILEGROWTH = 10%) LOG ON (NAME = N'novelty_Log',

     FILENAME = N'c:\program files\microsoft sql server\
    mssql\data\Novelty_Log.LDF', SIZE = 3, FILEGROWTH = 10%)

     COLLATE Latin1_General_CI_AI

    GO

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

    Код в листинге 3.2 задает параметры базы данных, описание которых приводится в официальной справочной документации SQL Server Books Online.

    Листинг 3.2. Сценарий указания параметров базы данных Novelty

    exec sp_dboption N'Novelty', N'autoclose', N'false'

    GO

    exec sp_dboption N'Novelty', N'bulkcopy', N'false'

    GO

    exec sp_dboption N'Novelty', N'trunc.log', N'false'

    GO

    exec sp_dboption N'Novelty', N'torn page detection', N'true'

    GO

    exec sp_dboption N'Novelty', N'read only', N'false'

    GO

    exec sp_dboption N'Novelty', N'dbo use', N'false'

    GO

    exec sp_dboption N'Novelty', N'single', N'false'

    GO

    exec sp_dboption N'Novelty', N'autoshrink', N'false'

    GO

    exec sp_dboption N'Novelty', N'ANSI null default', N'false'

    GO

    exec sp_dboption N'Novelty', N'recursive triggers', N'false'

    GO

    exec sp_dboption N'Novelty', N'ANSI nulls', N'false'

    GO

    exec sp_dboption N'Novelty', N'concat null yields null', N'false'

    GO

    exec sp_dboption N'Novelty', N'cursor close on commit', N'false

    GO

    exec sp_dboption N'Novelty', N'default to local cursor', N'false'

    GO

    exec sp_dboption N'Novelty', N'quoted identifier', N'false'

    GO

    exec sp_dboption N'Novelty', N'ANSI warnings', N'false'

    GO

    exec sp_dboption N'Novelty', N'auto create statistics', N'true'

    GO

    exec sp_dboption N'Novelty', N'auto update statistics', N'true'

    GO

    Теперь после создания базы данных можно приступить к работе с ней, т.е. начать выполнять команды по отношению к ней. Для выполнения команд SQL с другой базой данных NoveltyTest (например, для ее тестирования на том же сервере) нужно просто указать другую базу данных с помощью команды USE.

    USE [NoveltyTest]

    GO

    Далее в сценариях создания объектов базы данных также проверяется их наличие и удаление (если они имеются). Это относится к ограничениям, триггерам, хранимым процедурам, представлениям и таблицам. Этот порядок имеет большое значение, потому что таблицу нельзя удалить, если существует какой-то из связанных с ней объектов. Код выполнения этих операций приведен в листинге 3.3.

    Листинг 3.3. Сценарий удаления существующих объектов в базе данных Novelty

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_tblOrder_tblCustomer]')

    and OBJECTPROPERTY(id, N'IsForeignKey') = 1)

    ALTER TABLE [dbo].[tblOrder] DROP CONSTRAINT FK_tblOrder_tblCustomer

    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_tblEmployee_tblDepartment]')

    and OBJECTPROPERTY(id, N'IsForeignKey') = 1)

    ALTER TABLE [dbo].[tblEmployee] DROP CONSTRAINT FK_tblEmployee_tblDepartment

    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_tblOrderItem_tblInventory]')

    and OBJECTPROPERTY(id,N'IsForeignKey') = 1)

    ALTER TABLE [dbo].[tblOrderltem] DROP CONSTRAINT FK_tblOrderItem_tblInventory

    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_tblOrderItem_tblOrder]')

    and OBJECTPROPERTY(id, N'IsForeignKey') = 1)

    ALTER TABLE [dbo].[tblOrderltem] DROP CONSTRAINT FK_tblOrderItem_tblOrder

    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_tblCustomer_tblRegion] ')

    and OBJECTPROPERTY(id, N'IsForeignKey') = 1

    ALTER TABLE [dbo].[tblCustomer]

    DROP CONSTRAINT FK_tblCustomer_tblRegion

    GO

    /****** object: Trigger dbo.trCustomerI Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[trCustomerI]')

    and OBJECTPROPERTY(id,N'IsTrigger') =1)

    drop trigger [dbo].[trCustomerI]

    GO

    /****** Object: Stored Procedure dbo.DeleteEmployee Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DeleteEmployee]')

    and OBJECTPPOPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[DeleteEmployee]

    GO

    /****** object: Stored Procedure Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects dbo.sysobjects where id = object_id(N'[dbo].[GetCustomerFromID]')

    and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[GetCustomerFromID]

    GO

    /****** Object: Stored Procedure dbo.insertEmployee Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[InsertEmployee]')

    and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[InsertEmployee]

    GO

    /****** Object: Stored Procedure dbo.InsertEmployeeOrg Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id (N'[dbo].[InsertEmployeeOrg]')

    and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[InsertEmployeeOrg]

    GO

    /****** Object: Stored Procedure dbo.LastNameLookup Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LastNameLookup]')

    and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[LastNameLookup]

    GO

    /****** object: Stored Procedure Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SelectEmployees]')

    and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[SelectEmployees]

    GO

    /****** object: Stored Procedure dbo Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UpdateEmployee]')

    and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[UpdateEmployee]

    GO

    /****** object: Stored Procedure dbo.procEmployeesSorted Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[procEmployeesSorted]')

    and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[procEmployeesSorted]

    GO

    /****** object: View dbo.EmployeeDepartment_view Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[EmployeeDepartment_view]')

    and OBJECTPROPERTY(id, N'IsView') = 1)

    drop view [dbo].[EmployeeDepartment_view]

    GO

    /****** Object: View dbo.qryEmployee_view Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[qryEmployee_view]')

    and OBJECTPROPERTY(id,N'IsView') = 1)

    drop view [dbo].[qryEmployee_view]

    GO

    /****** Object: Table [dbo].[tblCustomer] Script Date:10-Jul-0212:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblCustomer]')

    and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[tblCustomer]

    GO

    /****** Object: Table [dbo].[tblDepartment] Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblDepartment]')

    and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[tblDepartment]

    GO

    /****** Object: Table [dbo].[tblEmployee] Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblEmployee]')

    and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[tblEmployee]

    GO

    /****** Object: Table [dbo].[tblInventory] Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N' [dbo].[tblInventory]')

    and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[tblInventory]

    GO

    /****** Object: Table [dbo].[tblOrder] Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblOrder]')

    and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[tblOrder]

    GO

    /****** object: Table [dbo].[tblOrderItem] Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblOrderItem]')

    and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[tblOrderltem]

    GO

    /****** object: Table [dbo].[tblRegion] Script Date: 10-Jul-02 12:41:09 PM ******/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblRegion]')

    and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[tblRegion]

    GO

    Теперь можно приступать к созданию новых объектов базы данных. Начнем с создания таблиц; сценарий этих операций приведен в листинге 3.4.

    Листинг 3.4. Сценарий создания таблиц базы данных Novelty

    /****** Object: Table [dbo].[tblCustomer] Script Date: 10-Jul-02 12:41:10 PM ******/

    CREATE TABLE [dbo].[tblCustomer] (

     [ID] [int] IDENTITY (1, 1) NOT NULL,

     [FirstName] [varchar] (20) COLLATE Latin1_General_CI_AI NULL,

     [LastName] [varchar] (30) COLLATE Latinl_General_CI_AI NULL,

     [Company] [varchar] (50) COLLATE Latin1_General_CI_AI NULL,

     [Address] [varchar] (50) COLLATE Latin1_General_CI_AI NULL,

     [City] [varchar] (30) COLLATE Latin1_General_CI_AI_NULL,

     [State] [char] (2) COLLATE Latin1_General_CI_AI_NULL,

     [PostalCode] [varchar] (9) COLLATE Latin1_General_CI_AI NULL,

     [Phone] [varchar] (15) COLLATE Latinl_General_CI_AI NULL,

     [Fax] [varchar] (15) COLLATE Latinl_General_CI_AI NULL,

     [Email] [varchar] (100) COLLATE Latinl_General_CI_AI NULL,

     [LastNameSoundex] [varchar] (4) COLLATE Latinl_General_CI_AI NULL

    ) ON [PRIMARY]

    GO

    /****** object: Table [dbo].[tblDepartment] Script Date: 10-Jul-02 12:41:11 PM ******/

    CREATE TABLE [dbo].[tblDepartment] (

     [ID] [int] IDENTITY (1, 1) NOT NULL,

     [DepartmentName] [varchar] (75) COLLATE Latin1_General_CI_AI NOT NULL

    ) ON [PRIMARY]

    GO

    /****** Object: Table [dbo].[tblEmployee] Script Date: 10-Jul-02 12:41:11 PM ******/

    CREATE TABLE [dbo].[tblEmployee] (

     [ID] [int] IDENTITY (1, 1) NOT NULL,

     [FirstName] [varchar] (50) COLLATE Latin1_General_CI_AI NOT NULL,

     [LastName] [varchar] (70) COLLATE Latin1_General_CI_AI NOT NULL,

     [DepartmentID] [int] NULL,

     [Salary] [money] NULL

    ) ON [PRIMARY]

    GO

    /****** object: Table [dbo]. [tblInventory] Script Date: 10-Jul-02 12:41:11 PM ******/

    CREATE TABLE [dbo].[tblInventory] (

     [ID] [int] IDENTITY (1, 1) NOT NULL,

     [ProductName] [varchar] (75) COLLATE Latin1_General_CI_AI NOT NULL

     [WholesalePrice] [money] NULL,

     [RetailPrice] [money] NULL,

     [Description] [ntext] COLLATE Latin1_General_CI_AI NULL

    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO

    /****** object: Table [dbo].[tblOrder] Script Date: 10-Jul-02 12:41:12 PM ******/

    CREATE TABLE [dbo].[tblOrder] (

     [ID] [int] IDENTITY (1, 1) NOT NULL,

     [CustomerlD] [int] NULL,

     [OrderDate] [datetime] NULL,

     [Amount] [money] NULL

    ) ON [PRIMARY]

    GO

    /****** object: Table [dbo].[tblOrderItem] Script Date: 10-Jul-02 12:41:12 PM ******/

    CREATE TABLE] (

     [ID] [int] IDENTITY (1, 1) NOT NULL, [OrderID] [int] NOT NULL,

     [int] NOT NULL, [Quantity] [int] NULL,

     [Cost] [money] NULL

    ) ON [PRIMARY]

    GO

    /******* object: Table [dbo].[tblRegion] Script Date: 10-Jul -02 12:41:12 PM *******/

    CREATE TABLE [dbo]. [tblRegion] (

     [ID] [int] IDENTITY (1, 1) NOT NULL,

     [State] [char] (2) COLLATE Latin1_General_CI_AI NOT NULL,

     [RegionName] [varchar] (25) COLLATE Latin1_General_CI_AI NULL

    ) ON [PRIMARY]

    GO

    Далее следует создать ограничения, как показано в листинге 3.5.

    Листинг 3.5. Сценарий создания ограничений для базы данных Novelty

    ALTER TABLE [dbo].[tblCustomer] WITH NOCHECK ADD

     CONSTRAINT [PK_tblCustomer] PRIMARY KEY CLUSTERED (

      [ID]

     ) ON [PRIMARY]

    GO

    ALTER TABLE [dbo].[tblDepartment] WITH NOCHECK ADD

     CONSTRAINT [tblDepartment_IDPK] PRIMARY KEY CLUSTERED (

      [ID]

     ) ON [PRIMARY]

    GO

    ALTER TABLE [dbo]. [tblEmployee] WITH NOCHECK ADD

     CONSTRAINT [PK_tblEmployee] PRIMARY KEY CLUSTERED (

      [ID]

     ) ON [PRIMARY]

    GO

    ALTER TABLE [dbo].[tblInventory] WITH NOCHECK ADD

     CONSTRAINT [PK_tblInventory] PRIMARY KEY CLUSTERED (

      [ID]

     ) ON [PRIMARY]

    GO

    ALTER TABLE [dbo].[tblOrder] WITH NOCHECK ADD

     CONSTRAINT [PK_tblOrder] PRIMARY KEY CLUSTERED (

      [ID]

     ) ON [PRIMARY]

    GO

    ALTER TABLE [dbo].[tblOrderltem] WITH NOCHECK ADD

     CONSTRAINT [PK_tblOrderItem] PRIMARY KEY CLUSTERED (

      [ID]

     ) ON [PRIMARY]

    GO

    ALTER TABLE [dbo]. [tblRegion] WITH NOCHECK ADD

     CONSTRAINT [PK_tblRegion] PRIMARY KEY CLUSTERED (

      [ID]

    ) ON [PRIMARY]

    GO

    CREATE UNIQUE INDEX [IX_tblRegion] ON [dbo]. [tblRegion] ([State]) ON [PRIMARY]

    GO

    ALTER TABLE [dbo].[tblCustomer] ADD

     CONSTRAINT [FK_tblCustomer_tblRegion] FOREIGN KEY ([State])

     references [dbo].[tblRegion] (

      [State]

     ) ON DELETE CASCADE ON UPDATE CASCADE

    GO

    ALTER TABLE [dbo].[tblEmployee] ADD

     CONSTRAINT [FK_tblEmployee_tblDepartment] FOREIGN KEY ([DepartmentID])

     REFERENCES [dbo].[tblDepartment] (

      [ID]

     ) ON DELETE CASCADE ON UPDATE CASCADE

    GO

    ALTER TABLE [dbo]. [tblOrder] ADD

     CONSTRAINT [FK_tblOrder_tblCustomer] FOREIGN KEY ( [CustomerID])

     REFERENCES [dbo].[tblCustomer] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE

    GO

    ALTER TABLE [dbo].[tblOrderItem] ADD

     CONSTRAINT [FK_tblOrderItem_tblInventory] FOREIGN KEY ([ItemID])

     REFERENCES [dbo].[tblInventory] ([ID])

     ON DELETE CASCADE ON UPDATE CASCADE,

     constraint [FK_tblOrderItem_tblOrder] foreign key ([OrderID])

     REFERENCES [dbo].[tblOrder] ([ID])

     ON DELETE CASCADE ON UPDATE CASCADE

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

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

    Листинг 3.6. Сценарий создания представлений, хранимых процедур и триггеров

    /****** object: View dbo.EmployeeDepartment_view Script Date: 10-Jul-02 12:41:13 PM ******/

    CREATE view EmployeeDepartment_view as

     select e.ID, FirstName, LastName, DepartmentName

     from tblEmployee e, tblDepartment t

     where e.DepartmentID = t.ID

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO


    /****** Object: View dbo.qryEmployee_view Script Date: 10-Jul-02 12:41:13 PM ******/

    create view qryEmployee_view as

     SELECT ID, FirstName, LastName, DepartmentID from tblEmployee

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

    /****** Object: Stored Procedure dbo.DeleteEmployee Script Date: 10-Jul-02 12:41:13 PM ******/

    CREATE PROCEDURE dbo.DeleteEmployee (@Original_ID int)

    AS

     SET NOCOUNT OFF;

     DELETE FROM tblEmployee WHERE (ID = @Original_ID)

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

    /****** Object: Stored Procedure dbo.GetCustomerFromID Script Date: 10-Jul-02 12:41:13 PM ******/

    create procedure GetCustomerFromID @custID int

    as

     select * from tblCustomer where ID = @custID

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS OFF

    GO

    /****** Object: Stored Procedure Script Date: 10-Jul-02 12:41:13 PM ******/

    CREATE PROCEDURE dbo.InsertEmployee (

     @FirstName varchar(50),

     @LastName varchar(70),

     @DepartmentID int,

     @Salary money)

    AS

     SET NOCOUNT OFF;

     if (@Salary = 0 or @Salary is null) begin

      -– Do complicated salary calculations

      set @Salary = @DepartmentID * 10000

     end

     INSERT INTO tblEmployee(FirstName, LastName, Salary) VALUES

      (@FirstName, @LastName, @DepartmentID, @Salary)

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

    /****** Object: Stored Procedure dbo.InsertEmployeeOrg Script Date: 10-Jul-02 12:41:13 PM ******/

    CREATE PROCEDURE dbo.InsertEmployeeOrg (

     @FirstName varchar(50),

     @LastName varchar(70),

     @DepartmentID int,

     @Salary money

    )

    AS

     SET NOCOUNT OFF;

     INSERT INTO tblEmployee(FirstName, LastName, DepartmentID, Salary) VALUES

      (@FirstName, @LastName, @DepartmentID, @Salary)

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

    /****** Object: Stored Procedure dbo.LastNameLookup Script Date: 10-Jul-02 12:41:13 PM ******/

    create proc LastNameLookup

     @name varchar(40) as

     select * from tblCustomer where soundex(gname) = LastNameSoundex

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

    /****** Object: Stored Procedure dbo.SelectEmployees Script Date: 10-Jul-02 12:41:13 PM ******/

    create procedure dbo.SelectEmployees

    AS

     SET NOCOUNT ON;

     SELECT FirstName, LastName, Department ID, Salary, ID FROM tblEmployee

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

    /****** Object: Stored Procedure dbo.UpdateEmployee Script Date: 10-Jul-02 12:41:13 PM ******/

    CREATE PROCEDURE dbo.UpdateEmployee (

     @FirstName varchar(50),

     @LastName varchar(70),

     @DepartmentID int,

     @Salary money,

     @Original_ID int)

    AS

     SET NOCOUNT OFF;

     UPDATE tblEmployee SET FirstName = @FirstName, LastName = @LastName, DepartmentID = @DepartmentID, Salary = @Salary WHERE (ID = @Original_ID)

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS OFF

    GO

    /****** Object: Stored Procedure dbo.procEmployeesSorted Script Date: 10-Jul-02 12:41:13 PM ******/

    CREATE PROCEDURE procEmployeesSorted

    AS

     select * from tblEmployee

     order by LastName, FirstName return

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

    /****** Object: Trigger dbo.trCustomerT Script Date: 10-Jul-02 12:41:14 PM ******/

    create trigger trCustomerT

    on dbo.tblCustomer

    for insert, update

    as

     update tblCustomer

     set tblCustomer.LastNameSoundex = soundex(tblCustomer.LastName)

     from inserted

     where tblCustomer.ID = inserted.ID

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO

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

    Полезной модификацией сценария может стать включение команды PRINT в стратегически важных местах сценария, например для отображения некоторых фрагментов текста в диалоговом окне Messages программы SQL Query Analyzer. Это позволит отслеживать прогресс выполнения сценария, а также использовать выводимые сообщения для отладки сценария: поиска и устранения замеченных ошибок. Использование команды PRINT совсем не обязательно и не имеет прямой связи с процессом создания базы данных.

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

    Резюме

    В этой главе представлены основные сведения об использовании СУБД SQL Server компании Microsoft для создания распределенных вычислительных систем. И хотя здесь рассматривается SQL Server 2000 компании Microsoft, все описанные основные действия по управлению базами данных, но уже с особенностями реализации, применимы и к СУБД других компаний – Oracle, Sybase, Informix и пр. Не забывайте, что при наличии драйвера ODBC или провайдера OLE DB, которые позволяют при разработке приложений абстрагироваться от конкретной реализации СУБД, с этими базами данных можно работать с помощью Visual Basic .NET.

    Вопросы и ответы

    Меня всегда пугала сложность работы с SQL Server, потому что эта СУБД казалась мне "черным ящиком". Мне знакомы случаи, когда люди чуть ли не сходили с ума от работы по созданию серверной части приложения. Неужели материала этой главы будет достаточно?

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

    Если большинство моих запросов очень просты и не содержат сложных логических выражений, нужно ли мне использовать хранимые процедуры?

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

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

    2. Управляемость. Реализация запросов в виде хранимых процедур означает, что все запросы приложения хранятся в одном централизованном месте, а не разбросаны среди сотен тысяч строк кода. Более того, такая организация запросов позволяет использовать их повторно и одновременно для одной базы данных во многих проектах и приложениях. Это приводит к меньшему объему работы (кодирование/отладка/тестирование) и меньшей вероятности возникновения ошибок. Это также позволяет использовать систему безопасности SQL Server. Наконец, применение хранимых процедур позволяет использовать стратегию "разделяй и властвуй", т.е. специализацию при создании кода приложения. Разработчики программного обеспечения, которые специализируются на создании бизнес-логики и управлении потоком выполнения приложения, могут сфокусировать внимание на создании кода приложения, а организацией доступа к базе данных и созданием запросов могут заняться разработчики баз данных и серверной части системы.








    Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх