Содержание
Введение
1
ЧАСТЬ I. АРХИТЕКТУРА SQL SERVER 2000
3
Глава 1. Обзор SQL Server 2000
5
Улучшения в ядре Поддержка множества инсталляций Сопоставления Определяемые пользователем функции Расширение возможностей триггеров Улучшения в индексах.... Каскадные изменения Интеграция в Web Надежность Репликация Новые типы данных Индексирование представлений Масштабируемость Глава 2. Компоненты SQL Server 2000
5 5 6 7 8 8 9 9 11 12 13 14 15
,
.'
16
Службы SQL Server 2000 Служба MSSQLServer Служба SQLServerAgent Объекты Jobs Объекты Operators Объекты Alerts Служба Microsoft Search Служба MSDTC Системные базы данных SQL Server 2000 База данных Master База данных Model База данных Tempdb База данных Msdb
16 16 17 18 18 19 20 20 21 22 24 25 26
Глава 3. Использование SQL Server 2000
28
Системы оперативной аналитической обработки Системы оперативной обработки транзакций Инструменты SQL Server 2000 Enterprise Manager
28 31 32 32
IV
Содержание SQL Server Service Manager SQL Server Profiler Query Analyzer Upgrade Wizard Import and Export Data Client Network Utility и Server Network Utility Утилиты командной строки Мастера
33 34 35 37 37 38 38 41
ЧАСТЬ П. УСТАНОВКА SQL SERVER 2000
43
Глава 4. Подготовка к установке SQL Server 2000
45
Выбор редакции Требования к системе Требования к аппаратному обеспечению Требования к программному обеспечению Подготовка учетных записей Создание учетных записей в Windows NT Создание учетных записей в Windows 2000 Выбор конфигурации сервера Порядок сортировки Кодовая страница Данные Unicode Сопоставление SQL Server 2000 Сетевые компоненты Установка сетевых библиотек и протоколов Установка сетевых протоколов в Windows NT 4.0 Установка сетевых протоколов в Windows 2000 Конфигурирование сетевых библиотек Выбор способа установки Локальная установка Автоматическая установка Удаленная установка Глава 5. Переход на SQL Server 2000 с предыдущих версий Обновление серверов SQL Server 6.x Предварительная подготовка Выбор способа передачи данных Одно- и двухкомпьютерное обновление Процесс обновления Обновление серверов SQL Server 7.0 Использование различных версий SQL Server Глава 6. Установка SQL Server 2000 Мастер установки Настройка системы после установки Управление работой служб SQL Server 2000
,
46 50 50 51 52 55 57 63 64 65 66 66 68 69 69 70 73 74 74 75 78 81 82 84 85 87 88 90 90 92 94 113 113
Содержание Изменение параметров конфигурации сервера Конфигурирование сетевых библиотек Установка и конфигурирование клиентов
V_ 120 121 125
ЧАСТЫИ. АДМИНИСТРИРОВАНИЕ
131
Глава 7. Управление работой служб SQL Server 2000
133
Старт, останов и приостанов служб Утилита SQL Server Service Manager Утилита Enterprise Manager Утилита Services Использование командной строки Останов средствами Transact-SQL Запуск SQL Server 2000 как приложения Управление учетной записью службы Утилита Enterprise Manager Утилита Services Режимы запуска SQL Server 2000 Однопользовательский режим Режим с минимальными требованиями Глава 8. Конфигурирование служб SQL Server 2000 Конфигурирование службы MSSQLServer Вкладка General Вкладка Memory Вкладка Processor Вкладка Security Вкладка Connections Вкладка Server Settings Вкладка Database Settings Вкладка Replication Конфигурирование службы SQLServerAgent Вкладка General Вкладка Advanced Вкладка Alert System Вкладка Job System Вкладка Connections Использование процедуры sp_configure Глава 9. Система безопасности SQL Server 2000 Архитектура системы безопасности Проверка подлинности пользователя Аутентификация Windows NT Аутентификация SQL Server Создание учетной записи Средства Transact-SQL
134 135 137 140 146 147 147 149 150 153 155 157 159 161 161 163 167 169 174 175 178 181 185 185 186 187 189 191 192 193 198 199 200 202 205 205 206
VI
Содержание Создание учетных записей SQL Server Создание учетных записей Windows NT Использование Enterprise Manager Специальные учетные записи Роли сервера Система безопасности базы данных Пользователи Создание пользователя Специальные пользователи Управление пользователями средствами Transact-SQL Роли базы данных Фиксированные роли базы данных Управление фиксированными ролями средствами Transact-SQL Пользовательские роли базы данных Управление пользовательскими ролями средствами Transact-SQL Роли приложения Управление ролями приложения средствами Transact-SQL Права доступа Права доступа к данным Права на выполнение хранимых процедур и функций..... Права на выполнение команд Transact-SQL Управление правами доступа Предоставление доступа Запрещение доступа Неявное отклонение доступа Просмотр прав доступа Иерархия прав доступа
Глава 10. Административные задачи Обязанности администратора Управление серверами и группами Регистрация сервера Управление группами Связанные серверы Использование Transact-SQL Регистрация связанного сервера Просмотр информации о связанных серверах Определение отображения Просмотр отображений Удаление отображения Конфигурирование связанного сервера Удаление связанного сервера Использование Enterprise Manager Регистрация связанного сервера Конфигурирование поставщика Управление отображениями Управление параметрами связанного сервера
208 212 213 221 221 224 224 225 227 227 233 233 235 238 239 242 244 247 247 248 250 250 254 257 258 260 262 264 265 268 269 279 280 283 283 288 289 292 293 295 298 298 300 303 304 306
Содержание
Vll_
Удаленные серверы Использование Transact-SQL Регистрация удаленного сервера Определение отображения на локальном сервере Определение отображения на удаленном сервере Просмотр отображений Свойства отображения Удаление отображения Удаление удаленного сервера Использование Enterprise Manager
307 308 308 311 312 315 317 318 319 319
Глава 11. Доступ к гетерогенным источникам данных
323
Экспорт и импорт данных Выбор метода переноса данных Перенос данных в текстовый файл Службы Data Transformation Service Архитектура DTS Мастера DTS Export и Import Wizard Запуск мастера Конфигурирование источника данных Конфигурирование получателя данных Выбор режима копирования данных Копирование данных из таблиц и представлений Вкладка Column Mappings Вкладка Transformations Вкладка Constraints Использование запроса для подготовки данных Выбор столбцов Управление порядком сортировки Определение условий выборки Указание таблицы получателя Перенос объектов базы данных Выбор объектов для копирования Управление копированием данных Конфигурирование дополнительных свойств Сохранение и выполнение пакета Управление временем запуска Конфигурирование хранения пакета Завершение работы мастера Инструмент DTS Designer Источники данных Задачи Задача File Transfer Protocol Task Задача ActiveX Script Task Задача Transform Data Task Задача Execute Process Task
324 325 328 328 330 335 336 338 341 342 344 346 350 352 355 356 ...357 359 361 362 363 365 366 370 372 374 375 376 .378 379 381 384 387 417
VIII
Содержание Задача Execute SQL Task Задача Data Driven Query Task Задача Copy SQL Server Objects Task Задача Send Mail Task.. Задача Bulk Insert Task Задача Execute Package Task Задача Message Queue Task Задача Transfer Error Messages Task Задача Transfer Databases Task Задача Transfer Master Stored Procedures Task Задача Transfer Jobs Task Задача Transfer Logins Task Задача Dynamic Properties Task Отношения предшествования Сохранение пакета
Глава 12. Автоматизация администрирования SQL Server 2000 Архитектура системы автоматизации Задания Оповещения Операторы..... Управление подсистемой автоматизации Управление заданиями Мастер Create Job Wizard , Утилита Enterprise Manager Общие сведения о задании Управление шагами задания Управление запуском задания Извещение операторов о завершении задания Средства Transact-SQL Копирование заданий Управление оповещениями Мастер Create Alert Wizard Утилита Enterprise Manager Средства Transact-SQL Копирование оповещений Управление операторами Утилита Enterprise Manager Средства Transact-SQL Оператор последней надежды Копирование операторов Управление множеством серверов Главный сервер Сервер назначения Многосерверные задания Мастер Database Maintenance Plan Wizard
419 423 427 429 430 436 440 446 448 453 453 454 456 463 465 468 469 470 471 475 476 477 477 481 481 484 488 491 492 494 495 495 498 .....501 502 502 502 505 505 507 507 508 512 513 515
Содержание
IX
Глава 13. Резервное копирование Введение в резервное копирование Полная копия Разностная копия Копия журнала транзакций Резервное копирование файлов и групп файлов Планирование стратегии резервного копирования Выбор носителя Резервное копирование системных баз данных. Восстановление системных баз данных Присоединение баз данных Ограничения при выполнении архивирования Архивирование с использованием Transact-SQL Создание полной и разностной копий.... Создание копий файлов и групп файлов Создание копии журнала транзакций Архивирование средствами Enterprise Manager Архивирование с помощью мастера Восстановление архива с использованием Transact-SQL Восстановление полной и разностной копий Восстановление файлов или групп файлов Восстановление журнала транзакций Восстановление архива средствами Enterprise Manager Глава 14. Репликация данных Введение в репликацию данных Издатель Подписчик Дистрибьютор Механизмы репликации Агент Snapshot Agent Агент Log Reader Agent Агент Queue Reader Agent Агент Distribution Agent Агент Merge Agent Запуск агентов Типы репликации Репликация моментальных снимков Репликация транзакций Репликация хранимых процедур Репликация сведением Обновление подписчиков \ Безотлагательное обновление Требования безотлагательного обновления Отложенное обновление Выбор топологии репликации
525
,
526 527 529 530 532 534 535 538 539 541 542 543 544 549 550 551 558 563 563 565 566 567 572 574 576 ...576 579 580 582 583 584 585 586 588 596 597 601 605 608 614 615 619 . 620 625
X
Управление издателем и дистрибьютором Инициализация издателя и дистрибьютора Конфигурирование издателя и дистрибьютора Деактивизация дистрибьютора и издателя Управление публикацией Создание публикации Создание динамического моментального снимка Конфигурирование публикации Общие сведения Управление статьями Вертикальные фильтры Горизонтальные фильтры Управление подписками Управление свойствами подписок Управление моментальным снимком Размещение моментального снимка Доступ к публикации Выбор партнеров для синхронизации Просмотр статуса Удаление публикации Управление подпиской Создание принудительной подписки Создание подписки по требованию Конфигурирование подписки Удаление подписки
Глава 15. Мониторинг и аудит Выбор инструмента мониторинга Утилита Performance Monitor Утилита Task Manager Утилита Event Viewer Утилита SQL Server Profiler Основы мониторинга Категория Sessions Категория Objects Категория Scans Категория TSQL Категория Cursors Категория Stored Procedures Категория Error and Warning Категория Transactions Категория Locks Категория Databases Категория Performance Категория Server Категория Security Audit Категория User Configurable
Содержание 626 628 638 645 646 647 662 669 669 670 681 682 683 685 686 687 689 690 691 692 693 693 703 710 718 719 720 722 ...732 735 736 737 742 743 744 745 746 747 748 750 751 752 753 754 754 760
Содержание Осуществление мониторинга Анализ полученной информации Использование Transact-SQL Глава 16. Создание отказоустойчивой системы Резервный сервер Технология кластеризации Типы конфигурации кластеров Технология RAID Зеркальное отображение и дублирование дисков Чередование дисков
XI 761 767 770 771 772 775 777 778 780 781
ЧАСТЬ IV. РАЗРАБОТКА И СОПРОВОЖДЕНИЕ БАЗ ДАННЫХ
783
Глава 17. Введение в проектирование баз данных
785
Классификации баз данных Структурные элементы базы данных Модели данных Реляционная модель данных Проектирование реляционных баз данных Основы реляционных баз данных Нормализация данных Связывание таблиц Первичный и внешний ключи Типы связей между таблицами Глава 18. Архитектура баз данных Физическая архитектура базы данных Файлы и группы файлов Страницы и группы страниц Логическая архитектура базы данных Именование объектов Доступ к объектам Умолчания Правила Определяемые пользователем типы данных Глава 19. Транзакции и блокировки Основы транзакций Основы блокировок Использование транзакций Автоматическое определение транзакции Явное определение транзакции Неявное определение транзакции Команды, запрещенные в транзакциях
785 787 788 789 794 795 797 801 801 804 806 807 807 811 820 821 825 827 835 839 845 845 848 851 852 853 855 856
XII
Содержание
Распределенные транзакции Завершение распределенных транзакций , Создание распределенных транзакций Вложенные транзакции . Использование блокировок Уровни блокирования Уровни изолированности транзакций Управление блокировками на уровне команд Типы блокировок Основные типы блокировок , Специальные типы блокировок Конфликты блокировок Мертвые блокировки Глава 20. Работа с базой данных Планирование конфигурации базы данных Планирование размещения файлов Использование групп файлов Возможность автоматического роста файлов.. Использование неформатированных разделов Выбор сопоставления Создание базы данных Использование Transact-SQL Описание файлов Описание группы файлов Пример создания базы данных Использование Enterprise Manager Использование мастера Create Database Wizard Управление свойствами базы данных Transact-SQL Процедура spdboption Изменение имени базы данных Передача прав владения базой данных Получение информации о базе данных Уменьшение размера базы данных Enterprise Manager Внесение изменений в базу данных Отсоединение и присоединение базы данных Удаление базы данных Глава 21. Работа с таблицами Проектирование таблиц Ограничения целостности Ограничение целостности Check Ограничение целостности Null Ограничение целостности Default
858 859 860 861 864 867* 869 870 872 872 874 877 878 881 881 881 883 884 885 885 891 892 894 897 898 900 906 911 912 912 917 918 920 926 931 938 942 945 946 947 947 948 949 950
Содержание Ограничение целостности Unique Ограничение целостности Primary Key Ограничение целостности Foreign Key Ограничение целостности No Action и Cascade Выбор сопоставления Выбор типа данных Использование автонумерации Управление таблицами средствами Transact-SQL Создание таблиц Определение столбцов Ограничения целостности на уровне столбцов Ограничения целостности на уровне таблицы Примеры создания таблиц Изменение таблиц Получение информации о таблице Зависимые объекты Связь через ключи Удаление таблиц Управление таблицами средствами Enterprise Manager Создание таблицы Общие свойства таблицы Определение внешнего ключа Управление индексами Контроль значений Изменение таблицы Удаление таблицы Глава 22. Использование представлений Создание представления Использование Transact-SQL Использование Enterprise Manager Использование мастера Create View Wizard Модификация данных в представлении Права доступа к представлениям Переименование представлений Изменение представлений Просмотр параметров представления Просмотр зависимостей Удаление представления Глава 23. Индексы Использование индексов Некластерный индекс Кластерный индекс Уникальный индекс Фактор заполнения Индексирование представлений
XIII 951 952 953 953 954 955 956 958 958 961 963 966 967 968 973 977 979 980 980 982 985 987 989 991 992 993 995 996 996 999 1005 1009 1009 1010 1011 1012 1014 1015 1017 1019 1020 1022 1024 1025 1027
XIV
Содержание
Управление индексами Создание индексов Использование Transact-SQL Использование Enterprise Manager Использование мастера Create Index Wizard Перестроение индексов Переименование индекса Удаление индекса Просмотр информации о фрагментации Глава 24. Статистика Создание статистики Управление статистикой Просмотр статистики Удаление статистики
1029 1030 1030 1035 1038 1042 1043 1044 1044 1048 ...1048 1049 1052 1053
ЧАСТЬ V. ПРОГРАММИРОВАНИЕ
1055
Глава 25. Основы Transact-SQL
1057
Временные таблицы и переменные Выражения Операнды Функция CASE Функция COALESCE Функция ISNULL Операторы Простейшие операторы Оператор присваивания Арифметические операторы Оператор конкатенации строк Операторы сравнения Битовые операторы Логические операторы Управляющие конструкции и команды BEGIN...END IE..ELSE WHILE...CONTINUE GOTO USE WAIT..FOR GO
1058 1062 1062 1066 1069 1070 1072 1072 1073 1074 1075 1075 1077 1078 1082 1083 1083 1084 1085 1086 1086 1087
Глава 26. Типы данных SQL Server 2000
1088
Целочисленные типы данных Нецелочисленные типы данных Денежные типы данных
1088 1089 1091
Содержание
XV
Типы данных "дата и время" Двоичные типы данных Строковые типы данных Текстовые типы данных Специальные типы данных Преобразование типов данных
1092 1093 1095 1096 1097 1099
Глава 27. Функции SQL Server 2000
1100
Встроенные функции Функции просмотра конфигурации Функции работы с курсорами Функции работы с датой и временем Математические функции Функции метаданных Функции подсистемы безопасности Строковые функции Системные функции Статистические функции Функции, определяемые пользователем Функции Scalar Функции Inline Функции Multi-statement Изменение функций Удаление функций
1100 1101 1103 1104 1105 1107 1108 1109 1110 1112 ..1113 1115 1117 1118 1119 1120
Глава 28. Вставка, удаление и изменение данных
1121
Добавление строк Команда INSERT Команда SELECT...INTO Изменение данных Удаление данных Механизмы массивного копирования Область применения утилиты bcp.exe Импорт и экспорт данных утилитой bcp.exe Формат файлов утилиты bcp.exe Файл форматирования Использование команды BULK INSERT
1121 1122 1127 ИЗО 1134 1135 1136 1137 1145 1146 1153
Глава 29. Выборка данных Раздел Раздел Раздел Раздел Раздел Раздел Раздел
SELECT INTO FROM. WHERE. GROUP BY. HAVING UNION
1158
.
1159 1165 1165 1173 1177 1185 1186
XVI Раздел Раздел Раздел Раздел
Содержание ORDER BY. COMPUTE FOR OPTION.
Глава 30. Хранимые процедуры Системные хранимые процедуры Расширенные хранимые процедуры Создание хранимой процедуры Использование номера процедуры Использование параметров Возвращение значений из процедуры Работа с курсорами Использование кода завершения Изменение хранимых процедур Удаление хранимых процедур Глава 31. Использование курсоров Виды курсоров Курсоры Transact-SQL Статические курсоры Ключевые курсоры Последовательные курсоры Динамические курсоры Работа с курсорами Объявление курсора Открытие курсора Выборка данных Изменение данных Удаление данных Закрытие курсора Освобождение курсора Дополнительные средства Глава 32. Триггеры Использование триггеров Ограничения использования триггеров Создание триггера Модификация триггера Удаление триггера Программирование триггеров Пример создания триггера Предметный указатель
1190 1192 1197 1198 1200 1201 1202 1204 1207 1208 1209 1210 1213 1214 1216 1217 1218 1220 1220 1221 1222 1223 1223 1224 1228 1229 1232 1234 1236 1237 1237 1239 1239 1241 1242 1246 1247 1247 1249 1253
S
o
f
t
L
i
n
e
КАТАЛОГ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ 9 Если вы хотите быть l4 SoftLine Si в курсе всех последних событий на рынке программного обеспечения,
119991 г. Москва, ул.Губкина, 8 (095)232-0023
[email protected] www.softline.ru
-> Если вы хотите получать наиболее полную информацию о программных продуктах из первых рук от самих производителей, Q
Если вы ведете честный бизнес и покупаете лицензионное ПО
ШЫТОЩ! Подпишитесь на новый полноцветный каталог, издаваемый одним из крупнейших поставщиков программного обеспечения в России, и вы будете регулярно получать его по почте. Кроме того, по вашему желанию на ваш электронный адрес будут регулярно приходить еженедельные новости рынка программного обеспечения от компании SoftLine.
Подписка БЕСПЛАТНО для руководителей и специалистов в области информационных технологий, представляющих организации, имеющие более 10 компьютеров!
что объединяет более 80 000 itСП-
'ШСТОг'
И
КОМП |НИЙ?
Информация, которая необходима, Правильно построенная ГТ-инфраструктура компании залог успешного и конкурентоспособного бизнеса. В каталоге представлена детальная информация о последних новинках в мире программного обеспечения, приведены обзорные статьи, примеры успешного внедрения и разнообразные типовые решения. Эта информация поможет Вам сделать правильный выбор. Выберите каталог, который Вам нужен, В настоящее время выпускается несколько версий каталогов SoitLine*-dircct и ряд спецвыпусков (Microsoft, Linux, Novell, Apple). Основной каталог SoftIJne*s-direct представлен и 3 редакциях,SoftLine*-direct Standard Edition предназначен дою компаний с числом компьютеров от 10 до 50. Ориентировал па специалистов ГГ'-отдело», системных администраторов, разработчиков ПО. SoftLine*-dfrect Professional. Edition предназначен для компаний с числом компьютеров более 50. Ориентирован на руководителей бизнеса, руководителей ГГ-подразделенпй. специалистов ГГ-отделов, системных администраторов, разработчиков ПО. Большое внимание уделено описанию правильной методолога и лицензирования ПО в организации. SoftLine*-direct Enterprise Edition -каталогтиповых решений. Среди них, в частности: методология построения сетевой инфраструктуры, безопасность, резервное копирование, удаленный доступ к приложениям, консолидация серверов, ip-телефония, беспроводные сети, мобильные пользователи и др. Каталог' предназначен для руководителей бизнеса, руководителей ['['-подразделений компаний с числом компьютеров более 50. Для бесплатной подписки на каталог SoftLtne -Direct позвоните по тел, (095)232-0023 н.т< посетите сайг wvvw.softiine.ru
Введение Предлагаемая вашему вниманию книга посвящена новой версии системы управления базами данных корпорации Microsoft — SQL Server 2000. Возможности новой версии этой популярной СУБД были существенно расширены по сравнению с предыдущими версиями. Наиболее заметным нововведением является тесная интеграция баз данных SQL Server 2000 в Web. Используя язык XML, пользователи могут легко опубликовать данные в Интернете в виде таблиц или графиков, обеспечив при этом и возможность изменения данных с помощью обычного браузера. Как и прежде, SQL Server 2000 является хорошо масштабируемым сервером баз данных, который могут использовать как индивидуальные пользователи, так и транснациональные корпорации, имеющие тысячи пользователей и терабайтные базы данных. В архитектуру сервера также были внесены изменения, позволившие полностью интегрировать SQL Server 2000 со службами Active Directory операционной системы Windows 2000. Представленная книга хорошо структурирована и разделена на несколько частей, которые могут читаться отдельно друг от друга. Первая часть посвящена рассмотрению общих концепций, на которых базируется SQL Server 2000, а также рассмотрению архитектуры сервера. Вторая часть посвящена подробному рассмотрению установки SQL Server 2000, в т. ч. и обновлению предыдущих версий. Детально обсуждается назначение всех опций, которые необходимо сконфигурировать в процессе инсталляции. После прочтения этой части читатель сможет профессионально установить SQL Server 2000 в соответствии со своими требованиями. Третья же часть книги посвящена администрированию сервера. В ней подробно описано конфигурирование и управление работой служб SQL Server 2000, система безопасности как на уровне базы данных, так и на уровне сервера, управление удаленными и связанными серверами, подсистема репликации и резервного копирования, а также выполнение различных административных задач. Детально рассмотрена интеграция SQL Server 2000 с гетерогенными источниками информации с использованием служб трансформации данных, механизмов массивного копирования, распределенных и удаленных запросов, а также некоторые другие средства. В части также обсуждаются средства автоматизации администрирования SQL Server 2000 и доступ к распределенным гетерогенным источникам данных. В завершение рассматривается построение отказоустойчивой системы и средства мониторинга. В четвертой части основное внимание уделено разработке и сопровождению баз данных. В одной из глав даны теоретические аспекты разработки баз данных, рассмотрены модели данных, нормализация и основные термины теории реляционных баз данных. Другие главы посвящены рассмотрению архитектуры баз данных SQL Server 2000, а также созданию и управлению ими. Немало внима-
2
Введение
ния уделено созданию и работе с таблицами и представлениями. Также подробно описывается повышение эффективности работы с данными — использование индексов и статистики. Отдельная глава полностью посвящена рассмотрению типов транзакций и блокировок, а также объясняется работа подсистемы блокирования сервера. Последняя часть книги посвящена программированию в среде SQL Server 2000. После прочтения глав этой части читатель получит всю информацию о типах данных SQL Server 2000, а также об их использовании, информацию о работе с курсорами, хранимыми процедурами, пользовательскими и встроенными функциями и триггерами. Немалая часть отведена описанию операций вставки, удаления, изменения и выборки данных с помощью средств Transact-SQL. В целом о книге можно сказать, что материал сопровождается множеством примеров, советов и замечаний, которые будут весьма полезны при практической работе. Книга написана простым и понятным языком, что значительно облегчает восприятие материала. Помимо описания использования стандартных средств управления сервером также нередко рассматривается управление соответствующими параметрами путем прямого доступа к системным таблицам. Книга написана специалистом в области разработки и сопровождения баз данных, являющимся автором нескольких книг по SQL Server, сдавшим более десятка сертификационных экзаменов Microsoft и имеющим статусы MCSE+I, MCDBA и MCSD.
ЧАСТЬ I. АРХИТЕКТУРА SQL SERVER 2000 Глава 1. Обзор SQL Server 2000 Глава 2. Компоненты SQL Server 2000 Глава 3. Использование SQL Server 2000
Глава 1
Обзор SQL Server 2000 Данная глава будет посвящена поверхностному знакомству с SQL Server 2000, рассмотрению его возможностей, а также некоторых отличий от предыдущих версий SQL Server. Можно с уверенностью сказать, что SQL Server 2000 является одной из наиболее привлекательных современных систем управления базами данных. SQL Server 2000 предлагает пользователям пожалуй самое оптимальное соотношение цены и качества. Системы, построенные с использованием этой СУБД, традиционно характеризуются невысокой суммарной стоимостью владения (ТСО, total cost of owner), что для специалистов вкупе с возможностями системы является одним из самых важных критериев при выборе программного продукта, который будет использован при построении баз данных предприятия. Отметим, что в стоимость владения входит не только стоимость самой СУБД, но также и стоимость операционной системы, клиентских лицензий, стоимость сопровождения системы, в которую входит оплата труда администраторов и операторов, а также некоторые другие показатели. Таким образом, даже если стоимость собственно СУБД может показаться немалой, с течением времени расходы на ее приобретение окажутся оправданными. Далее будут рассмотрены некоторые возможности SQL Server 2000, которые могут оказаться решающими при принятии решения о внедрении этой СУБД на предприятии.
Улучшения в ядре В большей степени ядро SQL Server 2000 осталось таким же, каким оно было в SQL Server 7.0. Тем не менее, некоторые изменения были все же внесены. В данном разделе, а также в некоторых из следующих разделов, будет рассказано об этих изменениях.
Поддержка множества инсталляций Одним из самых заметных изменений, с которыми сталкивается пользователь уже при установке, — это поддержка множества инсталляций SQL Server 2000 на одном сервере. При работе с SQL Server 7.0 имелась возможность существования на одном сервере SQL Server 7.0 и SQL Server 6.x. Однако в каждый момент времени активной могла являться только какая-то из версий. Одновременная работа двух серверов SQL Server была невозможна. SQL Server 2000 позволяет устанавливать на одном сервере множества копий (инсталляций) серверов баз данных SQL Server 2000, каждый из которых имеет
Часть I. Архитектура SQL Server 2000 свой набор служб операционной системы (MSSQLServer и SQLServerAgent), собственный набор пользовательских и системных баз данных и в целом является независимым от других инсталляций. Каждая из инсталляций может запускаться и останавливаться отдельно от других. В предыдущих версиях серверы SQL Server различались по сетевому имени компьютера, на котором они были установлены. Поддержка же множества инсталляций требует дополнительной идентификации. Для этого инсталляциям при установке присваиваются имена, уникальные в пределах компьютера. Одна из инсталляций может не иметь имени, и обращение к ней будет осуществляться только по имени компьютера. Такая инсталляция называется инсталляцией по умолчанию (default instance). Инсталляции, которым присвоены определенные имена, называются именованными инсталляциями (named instance), и для обращения к ним помимо имени компьютера следует через слэш указать имя нужной инсталляции. Например, для ссылка на инсталляцию TRELON сервера STORAGE следует указать STORAGE\TRELON. Замечание В качестве инсталляции по умолчанию можно использовать SQL Server 7.0 или SQL Server 6.x. При этом ничто не мешает установить именованную инсталляцию SQL Server 2000. Таким образом, на одном компьютере могут успешно работать как SQL Server 2000, так и, например, SQL Server 7.0.
Сопоставления В процессе установки SQL Server 2000 пользователь также столкнется с еще одним изменением. В SQL Server 2000 не существует отдельно понятий кодовой страницы, порядка сортировки и сопоставления Unicode. Теперь вместо этих трех параметров пользователь должен выбрать сопоставление (collation), которое и определит поведение сервера при сравнении и сортировке данных. Существенным изменением SQL Server 2000 по сравнению с SQL Server 7.0 стала возможность работы в пределах одной инсталляции с объектами, использующими различные сопоставления. Например, каждый из столбцов одной и той же таблицы может иметь свое собственное сопоставление. Напомним, что в SQL Server 7.0 аналогичные параметры конфигурировались на уровне сервера и были одинаковы для всех столбцов всех таблиц баз данных, имеющихся на сервере. Изменение порядка сортировки, набора символов или сопоставления Unicode было связано с серьезными проблемами. Теперь сопоставление, конфигурируемое на уровне сервера, рассматривается как сопоставление по умолчанию, которое автоматически применяется в тех случаях, когда при создании базы данных явно не указывается какое-либо сопоставление. Определяемое на уровне сервера сопоставление также используется для всех баз данных, создаваемых в процессе инсталляции SQL Server 2000 — системных баз ДаННЫХ, а Также баз Данных pubs И Northwind. Тем не менее, при создании базы данных можно указать иное сопоставление, чем было выбрано при установке SQL Server 2000 на уровне сервера. Сопоставление, указываемое на уровне базы данных при ее создании, предназначено для
Глава 1. Обзор SQL Server 2000 всех системных таблиц. Это напрямую отражается на правилах именования объектов базы данных и выборе имен пользователей. Например, при выборе сопоставления, нечувствительного к регистру (case insensitive), сервер не будет делать различия между символами, набранными в верхнем и нижнем регистре. То есть имена AUTHORS и Authors будут считаться именем одного и того же объекта. Так же нельзя будет создавать в таблицах столбцы с одинаковыми именами, но набранными в разных регистрах. Если же для базы данных используется сопоставление, чувствительное к регистру (case insensitive), то сервер станет проверять уникальность имен объектов с учетом регистра. Установленное на уровне базы данных сопоставление не является обязательным для таблиц, создаваемых в базе данных, а также столбцов этих таблиц. Пользователь может при организации таблицы явно определить сопоставление, которое должно использоваться для этой таблицы. Более того, SQL Server 2000 позволяет указывать сопоставление и на уровне отдельного столбца таблицы.
Определяемые пользователем функции В SQL Server 7.0 и более ранних версиях в распоряжении пользователя имелся набор встроенных функций, которые писались программистами Microsoft и набор которых был фиксирован. Пользователь не мог создавать свои собственные функции. Конечно, в распоряжении пользователя имелись хранимые процедуры, в качестве которых и можно было реализовывать часто используемые алгоритмы. Однако очевидным недостатком хранимых процедур является невозможность их вызова в выражениях. Таким образом, при выполнении сложных обновлений или выборки данных, требующих сложных алгоритмов, не реализуемых в пределах запроса, нужно было использовать курсоры или другие механизмы, позволяющие обращаться к хранимым процедурам. Конечно, было бы гораздо удобнее обращаться в нужным алгоритмам непосредственно в теле запроса, как это происходит при работе со встроенными функциями. Например, можно непосредственно в теле запроса выполнить преобразование типов данных, выделить подстроку из строки, возвести число в степень, проверить вхождение подстроки в строку и т. д. В SQL Server 2000 появилась возможность создания определяемых пользователем функций. Таким образом, пользователь может создавать свои собственные функции, на которые можно будет ссылаться непосредственно в теле запроса. Как и хранимые процедуры, определяемые пользователем функции могут иметь параметры. Интересным сочетанием является применение в качестве возвращаемого функцией значения величины типа данных t a b l e . Это дает возможность вызова запросов, обращающихся непосредственно к функции. Например, если имеется функция GetPeopie, возвращающая список всех людей с фамилией, указанной с помощью единственного параметра, то просмотр возвращаемого функцией набора данных можно осуществить с помощью следующей команды: SELECT * FROM GetPeopie('Иванов')
Подробно работа как с пользовательскими, так и со встроенными функциями будет рассмотрена в главе 27.
Часть I. Архитектура SQL Server 2000
Расширение возможностей триггеров Интересные изменения были внесены и в триггеры. Теперь разрешается создание триггеров не только для таблиц, но и для представлений, что заметно расширяет функциональность SQL Server 2000. Помимо этого, в SQL Server 2000 появился принципиально новый тип триггеров, называемый INSTEAD OF. В предыдущих версиях SQL Server триггеры работали таким образом, что сначала выполнялись требуемые пользователем изменения, и информация о них отображалась в специальных таблицах, а уже после этого запускался триггер, который анализировал осуществляемые пользователем изменения и выполнял соответствующие действия. При необходимости триггер мог отменить сделанные пользователем изменения, организовав для этого откат транзакции, в контексте которой осуществлялось изменение данных. Этот тип триггеров в SQL Server 2000 используется по умолчанию и называется AFTER. Триггеры же INSTEAD OF работают взамен (instead) команды пользователя, приведшей к запуску триггера. Таким образом, команда пользователя не выполняется, а вместо нее будет обработан набор команд, представляющий тело триггера INSTEAD OF. Одним из важнейших направлений использования этих триггеров является осуществление изменений одной командой данных представления, расположенных в различных таблицах. Вообще SQL Server 2000 разрешает только изменение данных представления, принадлежащих одной таблице. Если же необходимо модифицировать данные, принадлежащие двум и более таблицам, то вся операция изменения должна быть разбита на соответствующее число отдельных команд. Этот же подход должен применяться и в триггерах INSTEAD OF. Однако разбиение изменения на множество отдельных команд будет скрыто от пользователя.
Улучшения в индексах Улучшения были внесены и в работу сервера с индексами. Самыми заметными улучшениями являются индексирование представлений и вычисляемых столбцов (computed columns), что было невозможно в более ранних версиях SQL Server. Подробнее о индексировании представлений будет рассказано в одном из следующих разделов. Сейчас же расскажем о некоторых других улучшениях. В SQL Server 2000 было оптимизировано использование сервером системных ресурсов при построении и перестроении индексов. В частности, при построении индекса теперь учитываются преимущества многопроцессорной архитектуры при сканировании таблиц и сортировке данных. Более того, теперь можно явно указать, каким образом (по убыванию или по возрастанию) следует расположить индексируемые данные. Также разрешается размещение промежуточных данных, используемых при построении и перестроении индексов, в базе данных Tempdb. Это позволяет еще больше повысить производительность создания индекса еслл пользовательская база данных и база данных Tempdb находятся на разных физических дисках. Подробно о индексах будет рассказано в главе 23.
Глава 1. Обзор SQL Server 2000
Каскадные изменения В предыдущих версиях SQL Server при работе с внешними ключами пользователи должны были сами отслеживать изменения в главной таблице. Если нужно было изменить значение первичного ключа или просто удалить одну из строк главной таблицы, требовалось предварительно соответствующим образом изменить данные во всех зависимых таблицах. В противном случае сервер просто-напросто не разрешал выполнение изменений в главной таблице, выдавая сообщение об ошибке. Однако довольно часто требовалось автоматическое выполнение соответствующих изменений в зависимых таблицах при изменении данных в главной таблице. При работе с SQL Server 7.0 и более ранними версиями это реализовывалось путем написания специализированных триггеров, которые и отображали изменения данных в главной таблице на все зависимые таблицы. В SQL Server 2000 больше не требуется написание подобных триггеров, т. к. теперь на уровне ядра SQL Server 2000 реализована возможность выполнения каскадных изменений данных в зависимой таблице при удалении или изменении данных в главной таблице.
Интеграция в Web С масштабным развитием глобальной компьютерной сети Интернет и связанных с ней технологий все больше задач, решаемых с помощью SQL Server 2000, оказываются так или иначе зависимыми от этой сети. При этом одной из важнейших задач является предоставление пользователям Интернета информации, хранящейся в базах данных SQL Server 2000. Конечно, к настоящему времени разработано множество технологий, с помощью которых можно успешно реализовывать интерфейс между пользователем Интернета и различными источниками информации, в том числе и SQL Server 2000. Однако все важнее становится скорость создания конечных систем и при этом требуется, чтобы стоимость создания такой системы была невысока. Таким образом, к современной системе управления базами данных предъявляется требование предоставить простой и эффективный механизм публикации информации в Интернете. Еще в предыдущих версиях SQL Server существовали механизмы публикации хранящейся в базах данных информации в глобальной сети. Однако возможности той технологии были достаточно ограничены. В распоряжении пользователя имелся только мастер Web Assistant Wizard и сопутствующие системные хранимые процедуры, с помощью которых на основе таблицы или результата выборки, возвращаемого запросом или хранимой процедурой, можно было сгенерировать статическую HTML-страницу. Именно к ней и обращались пользователи Интернета. Конечно, запуская подсистему автоматизации, можно было периодически обновлять страницу путем повторного ее генерирования. Однако пользователи при этом должны были удовлетворяться формой представления и набором данных, которые им предлагал администратор. Они не могли осуществлять произвольную выборку данных в соответствии с нужными им критериями и управлять формой представления данных.
10_
Часть I. Архитектура SQL Server 2000
В SQL Server 2000 был сделан существенный рывок в сторону интеграции этой СУБД в Интернете. Помимо мастера Web Assistant Wizard теперь в распоряжении пользователя имеется технология XML, с помощью которой посетители сети могут непосредственно обращаться к информации, хранящейся в базах данных SQL Server 2000. Можно непосредственно в окне браузера Интернета указать запрос, являющийся основой набора данных, которые SQL Server 2000 автоматически преобразует в формат документа. ХМL. Конечно, часто пользователи создают однотипные запросы. Поэтому для удобства пользователей SQL Server 2000 позволяет указывать готовые запросы. Кроме того, можно применять различные шаблоны представления информации. Для работы с технологией XML в SQL Server 2000 были внесены некоторые изменения в запрос SELECT, точнее в раздел FOR. Указывая в запросе значение FOR XML, пользователь тем самым предписывает серверу выполнить преобразование данных в формат документа XML. При этом поддерживается три режима преобразования, позволяющие представлять данные в виде плоского текста (режим RAW), простого дерева (режим AUTO) ИЛИ СЛОЖНОГО многоуровнего дерева с явным указанием зависимостей между элементами (режим EXPLICIT). В качестве примера попытаемся получить три первых фамилии авторов из таблицы authors базы данных pubs: SELECT TOP 3 au_lname FROM authors FOR XML RAW
Будет возвращен следующий результат: XML_F52E2B61-18Al-lldl-Bl05-00805F49916B
|
row au_lname="Carson"/> (3 row(s)
affected)
Предполагается, что указанный запрос будет выполнен в Query Analyzer. Это позволяет увидеть, какие преобразования осуществляет сервер для представления данных в формате XML. Однако, на деле полученные данные должны просматриваться в Интернет-браузере. Попробуем это сделать. Для чего в поле Address окна Internet Explorer введем следующую строку: http://storage/matrix?sql=select+'
';select+top+3+au_lname+from+authors +for+xml+raw;select+''
Замечание Чтобы иметь возможность выполнить приведенный запрос, необходимо предварительно установить Internet Information Server (IIS) и сконфигурировать поддержку XML для SQL Server 2000, что предполагает создание так называемых виртуальных каталогов (virtual directory). Отметим, что для генерации страниц HTML с помощью Web Assistant Wizard установки IIS не требуется. Однако, чтобы сгенерированные страницы могли просматривать пользователи Интернета или intranet, все же придется установить какой-нибудь Web-сервер, частным случаем которого является Internet Information Server, предлагаемый фирмой Microsoft и поставляемый в составе операционных систем семейства Windows 2000.
Глава 1. Обзор SQL Server 2000
11
Результат выполнения этого запроса приведен на рис. 1.1. Помимо представления в Интернет-браузере текстовых данных, технология XML позволяет демонстрировать и графические файлы, сохраненные в таблице базы данных, строить различные векторные изображения на основе данных таблиц, а также выполнять другие различные операции. «http://storage/matriK?sql=seIect+'
File Edit View Favorites Tools Help ч-1 Back - •' ^ _Q ^ • '^Search ие]Favorites ^History I Address [is] T>';select+top+3+auJname+from+authors+for+xml+raw;select+'' J j ^Go ii Links **!
Done
^ Local intranet
Рис. 1.1. Просмотр данных таблицы через браузер Интернета
Надежность В любые времена от системы управления базами данных требовалось обеспечение устойчивости к различным сбоям и возможность дальнейшего функционирования системы в случае выхода из строя некоторых аппаратных частей сервера или даже всего сервера. Уже в предыдущих версиях SQL Server в распоряжении администраторов имелись технологии кластеризации (fail-over support) и резервного сервера (standby server). Последняя технология предполагает установку в сети дополнительных серверов SQL Server 2000, на которых будут периодически дублироваться данные основного сервера. В случае выхода из строя основного сервера резервный сервер конфигурируется как основной, и пользователи продолжают работать с этим сервером. Когда же поврежденный сервер будет восстановлен, то он снова будет основным, тогда как второй сервер — резервным. Недостатком этой технологии является то, что серверы должны иметь различные имена и сетевые адреса. Вследствие чего в случае выхода из строя основного сервера клиенты должны будут переключиться на новый сервер, что требует определенных усилий и затрат времени. Кроме этого, администратор должен вручную обеспечивать согласованность данных на основном и резервном сервере. Гораздо более мощной по сравнению с резервным сервером является технология кластеризации. Для пользователей кластер выглядит как единственный сервер сети. Однако на самом деле такой кластер состоит из двух компьютеров, которые дублируют друг друга в реальном времени. Компьютеры, из которых состоит кластер, называются узлами (node). При выходе из строя одного из узлов все задачи автоматически переносятся на оставшийся узел и решаются на
V2_
Часть I. Архитектура SQL Server 2000
нем. При этом пользователям не нужно изменять никаких своих настроек. Для работы кластера обычно применяется внешний дисковый массив, на котором хранятся общие данные, используемые собственно кластером, а не индивидуально каждым узлом. Базы данных, с которыми работают пользователи, как раз и являются примером таких общих данных. Таким образом, даже полный выход из строя одного из узлов не приведет к невозможности доступа к данным. Замечание Для работы кластеров обычно используются дисковые массивы RAID, обеспечивающие устойчивость к физическому повреждению дисковых носителей. Таким образом, можно обеспечить высокую защищенность собственно данных. Однако стоимость дисковых массивов RAID довольно высока. Вкупе с необходимостью применения дополнительных компьютеров использование кластеров является довольно дорогостоящим удовольствием. Подробно дисковые массивы RAID будут рассмотрены в главе 16. В предыдущих версиях SQL Server кластер мог быть создан только с использованием двух узлов. В SQL Server 2000 администратор может создавать кластеры, состоящие из четырех узлов. Управление кластерами в SQL Server 2000 существенно упростилось по сравнению с предыдущими версиями. Теперь создание кластера выполняется как часть процесса установки SQL Server 2000. Помимо этого, с помощью мастера установки также можно включить (или исключить) в кластер дополнительный узел. Администратор может безболезненно переустанавливать один из узлов кластера, не влияя при этом на другие узлы. В утилиты и административные утилиты SQL Server 2000 были внесены изменения, позволяющие им работать с виртуальным сервером (кластером). Так что теперь администрирование кластера стало гораздо проще, чем в предыдущих версиях. Подробно работа с кластерами будет рассмотрена в главе 16.
Репликация Подсистема репликации SQL Server 2000 также была расширена по сравнению с предыдущими версиями. Конечно, эти изменения менее заметны, чем сделанные в SQL Server 7.0 по сравнению с более ранними версиями, однако все же их стоит рассмотреть. Самым заметным изменением является расширение набора механизмов разрешения конфликтов изменения, используемых репликацией сведением, а также появление дополнительной технологии, позволяющей выполнять изменения данных на подписчиках при работе с репликацией транзакций и моментальных снимков. В SQL Server 7.0 система репликации была существенно расширена по сравнению с SQL Server 6.x. В распоряжении пользователей появилась репликация сведением (merge replication), а также технология подписчиков незамедлительного обновления (immediately update subscriber). Обе технологии позволяли вносить изменения в опубликованные данные со стороны подписчиков, что было невозможно в предыдущих версиях. Репликация сведением, являющаяся самостоятельным типом репликации, к тому же самым сложным, позволяет пользователям изменять данные даже при отсутствии соединения между дистрибьютором
Глава 1. Обзор SQL Server 2000
13_
(издателем) и подписчиком. Технология же подписчиков незамедлительного обновления позволяет подписчикам изменять данные при работе с репликацией транзакций и моментальных снимков. Однако применение этой технологии требовало наличия постоянного соединения между подписчиком и издателем. В противном случае выполнить изменение опубликованных данных на подписчике не удастся. Пользователь должен будет отложить выполнение изменений до установления соединения. В.SQL Server 2000 появилась технология отложенного обновления (Queue updating), которая, как и технология подписчиков незамедлительного обновления, используется при работе с репликацией моментальных снимков и репликацией транзакций, но позволяет выполнять изменения опубликованных данных на подписчике и в случае отсутствия соединения между подписчиком и издателем (дистрибьютором). Выполненные на подписчиках изменения сохраняются в очереди (queue), а не применяются сразу же, как это происходит при работе с подписчиками незамедлительного обновления. Поэтому наличие соединения не требуется. Когда же соединение между подписчиком и дистрибьютором устанавливается, то механизмы репликации SQL Server 2000 считывают информацию об осуществленных изменениях и соответствующим образом обрабатывают их. В результате выполненные подписчиком изменения либо копируются всем другим участникам репликации, либо отменяются. Говоря же об улучшениях в репликации сведением, можно сказать, что теперь в распоряжении администраторов имеется более полутора десятков различных механизмов разрешения конфликтов изменения, выбирающих победителя не на основе шкалы приоритетов, а на основе выполненных изменений. При этом в результате разрешения конфликта может быть выбрано не только одно из конфликтующих изменений (а другие потеряны), но также результатом разрешения конфликта будет являться значение, учитывающее все изменения. При работе с символьными значениями, это может быть конкатенация строк, а при работе с численными — среднее арифметическое или сумма. Также как и в SQL Server 7.0, пользователи могут создавать свои собственные механизмы разрешения конфликтов, добиваясь нужной функциональности. Подробно подсистемы репликации, в том числе технология отложенного обновления и репликация сведением, будут рассмотрена в главе 14.
Новые типы данных Хотя в большей степени набор типов данных SQL Server 2000 соответствует типам данных SQL Server 7.0, тем не менее, в распоряжении пользователей появилось три новых типа данных: О b i g i n t — это "большой" integer, использующий для представления числа 8 байт. Для сравнения, в SQL Server 7.0 и более ранних версиях максимальным являлся тип данных i n t , использующий 4 байта. Казалось бы, что возможностей этого типа данных вполне достаточно. Однако если тип данных i n t используется для столбцов-счетчиков, то при работе с большими базами данных вполне вероятна ситуация, когда значения счетчика приблизятся к
U_
Часть I. Архитектура SQL Server 2000 предельному значению этого типа данных. Применение же типа данных b i g i n t отодвигает эту проблему далеко в будущее.
П s q i v a r i a n t — это принципиально новый тип данных, который может использоваться как при работе с переменными, так и со столбцами таблиц. Тип данных s q i _ v a r i a n t позволяет хранить значения большинства типов данных, предлагаемых SQL Server 2000. Таким образом, в одном столбце таблицы можно хранить числовые данные (как дробные, так и целые), данные о дате и времени, денежную информацию, символьные и т. д. •
table — это также совершенно новый тип данных, предназначенный только для работы с локальными переменными. Переменную типа данных table можно сравнить с локальной временной таблицей, т. к. такая переменная позволяет хранить сложные наборы данных наподобие таблиц. Как и таблица, переменная типа t a b l e имеет столбцы и строки, и в нее можно вставлять новые строки, удалять существующие и т. д. — в общем, работать как с обычной таблицей. То есть при работе с переменной типа данных t a b l e используются те же команды INSERT, DELETE, UPDATE И SELECT, ЧТО И при работе с обычными
таблицами. Вкупе с возможностью применения типа данных t a b l e в качестве возвращаемого значения определяемой пользователем функции (user-defined function) это открывает широкие возможности для разработчиков. Подробно описание и работа с типами данных SQL Server 2000, в том числе и с указанными, будет рассмотрена в главе 26. Работа же с пользовательскими функциями будет описана в главе 27.
Индексирование представлений Представления являются весьма удобным механизмом работы с данными, физически расположенными в нескольких таблицах. Однако при каждом обращении к представлению сервер должен выполнить запрос SELECT, на основе которого было создано представление. Полученные в результате выполнения запроса данные и отображаются пользователю. Этот процесс называется материализацией представления. Даже неопытный пользователь может отметить, что процесс материализации представления может быть весьма ресурсоемким и длительным, особенно если представление работает со множеством таблиц. При этом в предыдущих версиях SQL Server для представления не разрешалось создание индексов, что не позволяло повысить производительность работы с ними. В SQL Server 2000 был сделан заметный шаг вперед в отношении представлений — теперь они могут быть индексированы. Первый индекс, создаваемый для представления, должен быть кластерным. Отметим, что кластерный индекс предполагает физическое перестроение порядка строк в соответствии с условиями индексирования. Однако представление не содержит собственных данных, а лишь демонстрирует данные таблиц базы данных. Поэтому при создании для представления кластерного индекса сервер сохраняет в базе данных все строки, которые были выбраны для представления на момент создания индекса. Таким образом, представление становится материализованным. Отдельно отметим, что сохраняются не данные индексируемых столбцов, а все столбцы,
Глава 1. Обзор SQL Server 2000
15_
имеющиеся в представлении. Тем не менее, порядок строк будет соответствовать условиям создания кластерного индекса. Сохранение данных всех столбцов делает возможным создание для представления некластерных индексов, которые будут связаны с данными кластерного индекса представления. Естественно, при индексировании представлений неизменно встает вопрос об отображении в кластерном и некластерных индексах изменений, выполненных в таблицах, на основе которых построено представление. Однако все эти вопросы SQL Server 2000 решает автоматически без вмешательства пользователя. Таким образом, можно быть уверенным, что индексированное представление всегда содержит корректные данные. Индексирование представления является довольно тонкой операцией, требующей соблюдения множества условий. Подробно все эти условия будут предсталены в главе 23. Тем не менее, индексирование представлений может весьма заметно увеличить скорость работы с представлениями.
Масштабируемость Как и предыдущая версия, SQL Server 2000 обеспечивает высокий уровень масштабируемости. В зависимости от используемой редакции пользователи могут применять SQL Server 2000 как на домашних компьютерах, устанавливая его для операционной системы Windows 98, так и на многопроцессорных корпоративных серверах. Помимо этого, имеется возможность использования только ядра SQL Server 2000, что широко практикуется при создании независимыми разработчиками различных систем, требующих механизмов (engine) хранения и обработки данных. Встроенный таким образом в приложение SQL Server 2000 может инсталлироваться в операционной системе как часть процесса установки приложения. Таким образом, пользователи могут и не подозревать, что на компьютер будет установлен SQL Server 2000. Тем не менее, основным направлением все же является традиционная работа SQL Server 2000 в качестве сетевого сервера баз данных, доступного для любого авторизованного пользователя или приложения. В зависимости от масштаба предприятия, количества пользователей и ожидаемой нагрузки можно применять различные редакции SQL Server 2000 — от персональной редакции (Personal Edition), работающей под управлением операционной системы Windows 98 и оптимизированной для небольшого количества пользователей (до пяти), до Enterprise Edition, позволяющей использовать системы с количеством процессоров до 32 и объемом оперативной памяти до 64 Гбайт, а также поддерживающей создание кластеров. Помимо всего сказанного, можно отметить, что SQL Server 2000 является составной частью многофункциональной интегрированной платформы Windows DNA 2000, ориентированной на разработку и эксплуатацию современных распределенных Web-приложений, и предоставляющей заказчикам эффективный доступ к возможностям, открываемым новой волной Интернет-коммерции — Business Internet. 2 Зак. 83
Глава 2
Компоненты SQL Server 2000 Для профессиональной работы с SQL Server 2000 необходимо понимать принципы его функционирования, знать, какой из компонентов необходимо использовать в том или ином случае. После прочтения этой главы вы будете иметь четкое представление о принципах работы Microsoft SQL Server 2000, его компонентах и их взаимосвязях. В главе рассмотрены службы SQL Server 2000, приведена информация об их назначении и методах использования. В главе также рассматриваются системные базы данных SQL Server 2000, дано их описание и назначение.
Службы SQL Server 2000 Как и многие серверные продукты, работающие под управлением операционной системы Windows NT или под управлением операционной системы Windows 2000, Microsoft SQL Server 2000 реализован в виде набора служб операционной системы, каждая из которых запускается самостоятельно и отвечает за определенный круг задач. Приведем список служб SQL Server: •
MSSQLServer;
П
SQLServerAgent;
•
Microsoft Search (MSSearch);
•
Microsoft Distributed Transaction Coordinator (MSDTC).
Реализация в виде служб позволяет SQL Server 2000 работать как часть операции онной системы, иметь собственные права доступа и не зависеть от пользователя, работающего на компьютере в данный момент. Операционная система Windows 95/98 не поддерживает служб, поэтому для работы SQL Server 2000 под управлением этой операционной системы автоматически выполняется эмуляция служб. Это связано с тем, что для работы в любой из поддерживаемых операционных систем SQL Server 2000 применяет единственный программный код. Microsoft не стала создавать отдельный продукт для работы в операционной системе Windows 95/98, а просто выполнила эмуляцию служб Windows NT. Рассмотрим более подробно каждую из служб SQL Server 2000.
Служба MSSQLServer Служба MSSQLServer является ядром SQL Server 2000 и выполняет все основные операции. В задачи службы MSSQLServer входит регистрация пользовате-
Глава 2. Компоненты SQL Server 2000
17_
лей, контроль их прав доступа, установление соединения, обслуживание обращений пользователей к базам данных, выполнение хранимых процедур, работу с файлами баз данных и журнала транзакций и многое другое. В функции службы MSSQLServer также входит контроль за использованием SQL Server 2000 системных ресурсов. Служба MSSQLServer периодически опрашивает систему о количестве свободных ресурсов и при достаточном их наличии автоматически выделяет SQL Server дополнительную память или процессорное время. Полученные ресурсы наиболее эффективным образом распределяются между всеми подключенными пользователями, и тем самым достигается максимальная производительность обработки запросов. При использование многопроцессорной системы служба MSSQLServer выполняет распараллеливание "тяжелых" запросов пользователей между всеми доступными процессорами для повышения производительности. Все остальные службы можно рассматривать как расширения службы MSSQLServer, добавляющие гибкость и функциональность SQL Server 2000. Служба MSSQLServer всегда запускается первой и уже после ее успешного старта другие службы, например SQLServerAgent, могут быть запущены и начать свою работу.
Служба SQLServerAgent Служба SQLServerAgent, прежде всего, предназначена для автоматизации администрирования и использования SQL Server 2000. В задачи этой службы входит автоматический запуск заданий и извещение операторов о сбоях в работе сервера. С помощью службы SQLServerAgent можно выполнять запуск различных задач в определенное время, что при грамотном использовании может избавить администратора от большей части рутинной работы. Например, администратор может спланировать автоматическое выполнение операций резервного копирования и проверки целостности информации в базе данных во время наименьшей активности пользователей. При этом администратору не нужно будет находиться рядом и контролировать ход выполнения операций. Служба SQLServerAgent является зависимой по отношению к службе MSSQLServer. Последняя может успешно работать и без службы SQLServerAgent, в то время как для запуска службы SQLServerAgent необходимо предварительно запустить службу MSSQLServer. Служба SQLServerAgent устанавливает соединение с ядром SQL Server 2000 наподобие обычного клиента, но имеет при этом широкие права. Большая часть операций, выполняемых службой SQLServerAgent, реализована в виде системных хранимых процедур, которые, как говорилось ранее, выполняются службой MSSQLServer. Для успешного взаимодействия служб SQLServerAgent и MSSQLServer необходимо правильно настроить учетные записи, под которыми они будут запускаться. В работе службы SQLServerAgent применяются объекты трех типов: •
Jobs (задания);
•
Operators (операторы);
П Alerts (события).
18
Часть I. Архитектура SQL Server 2000
Информация обо всех этих объектах, включая расписание автоматического запуска задач, хранится в системной базе данных Msdb. При каждом старте SQLServerAgent анализирует содержание этой базы данных. Если к моменту запуска службы накопились "просроченные" задания или произошло сконфигурированное событие, то служба SQLServerAgent выполняет соответствующие действия. Для управления заданиями, операторами и событиями можно использовать различные методы. Наиболее удобным и наглядным из них является использование графического интерфейса утилиты Enterprise Manager. Другой способ заключается в вызове системных хранимых процедур и команд Transact-SQL. Третий способ предполагает обращение к интерфейсу SQL-DMO. В последнем случае возможно написание своих собственных приложений, обеспечивающих интерфейс работы с заданиями, операторами и событиями. Описание методов SQLDMO достойно отдельной книги и рассмотрено не будет. Квалифицированный подход к работе службы SQLServerAgent может снизить расходы на сопровождение баз данных, в частности за счет уменьшения количества операторов и администраторов. Польза от применения службы SQLServerAgent пропорциональна размеру предприятия. Чем больше предприятие, тем больше пользы оно получит от всех возможностей SQL Sei-ver 2000. Подробно подсистема автоматизации администрирования SQL Sei-ver 2000 будет рассмотрена в главе 12. Ниже обсуждается использование каждого из объектов службы SQLServerAgent.
Объекты Jobs Объекты этого типа описывают задачи, которые должны быть выполнены автоматически. Для каждого задания указывается одно или более расписаний (schedule) его запуска. Кроме того, задание может быть выполнено по требованию (on demand), т. е. вручную. Каждое задание состоит из одного или более шагов (step). В качестве шага может выступать команда или запрос Transact-SQL, команды управления подсистемой репликации, запуск утилиты командной строки или приложения Windows, выполнение скрипта VBScript или JavaScript и другие. Служба SQLServerAgent обладает большими возможностями контроля правильности выполнения заданий, позволяя создавать многошаговые задания. Шаги могут быть связаны между собой по определенным правилам. Например, если проверка целостности базы данных завершилась успешно, то служба SQLServerAgent создаст резервную копию данных, в противном же случае сервер может отправить соответствующее извещение администратору по электронной почте или на пейджер. Служба SQLServerAgent позволяет гибко управлять временем запуска задач, обеспечивая их выполнение как в определенное время, так и в моменты наименьшей загруженности сервера.
Объекты Operators Объекты этого типа описывают операторов. Оператор — это служащий, отвечающий за поддержание сервера в рабочем состоянии. В небольших организациях роли оператора и администратора обычно совмещает один человек. На
Глава 2. Компоненты SQL Server 2000 больших предприятиях и в корпорациях роли администратора и оператора чаще всего разделены между несколькими людьми. Администратор выполняет только ответственную работу, например планирование, создание и изменение баз данных. Оператор же чаще занимается рутинной работой, такой как выполнение резервного копирования базы данных, добавление пользователей, контроль за целостностью данных и т. д. Если организация большая, то можно использовать специализированных операторов. Например, один из операторов будет ответственен за выполнение операций резервного копирования, другой станет следить за целостностью данных и т. д. Соответственно, каждый из операторов должен получать сообщения, относящиеся к его виду деятельности. Нежелательно, чтобы оператор резервного копирования начал разрешать проблемы мертвых блокировок. SQL Server 2000 отслеживает параметры своей работы и при обнаружении неполадок, например, при недостатке свободного пространства на диске, может известить оператора о неприятностях. Для этого используется служба SQLServerAgent. Необходимо предварительно сконфигурировать операторов и указать события, при наступлении которых будет отправляться извещение операторам. Служба SQLServerAgent для извещения операторов может рассылать определенные сообщения по электронной почте или отправлять сообщение непосредственно на пейджер оператора. Кроме того, для извещения оператора допускается вызов команды NET SEND, с помощью которой можно отправить сообщение в локальной сети. Можно настроить запуск NET SEND команды таким образом, что сообщение получат все пользователи сети, в надежде, что кто-нибудь их них сообщит оператору о проблемах в работе сервера. Но чаще всего команда NET SEND служит для посылки сообщения конкретному пользователю.
Объекты Alerts Объекты типа Alerts описывают события, на которые должен реагировать SQL Server 2000. При наступлении описанного события сервер с помощью службы SQLServerAgent отправляет одному или нескольким операторам извещение об обнаружении неполадок в работе сервера. События SQL Server 2000 охватывают почти все аспекты работы сервера, что позволяет эффективно контролировать работу SQL Server 2000. Операторам не обязательно постоянно находиться рядом с сервером, чтобы знать о параметрах его работы. Оператор может даже не присутствовать в здании при обнаружении сбоя, но он может получить извещение на пейджер и предпринять необходимые действия, в том числе и удаленно. Описанный подход позволяет снизить затраты на сопровождение баз данных в больших организациях. Отпадает необходимость в персональном операторе для каждого из серверов предприятия. Так как больше не требуется находиться непосредственно рядом с сервером, то можно нанять двух или трех квалифицированных специалистов, которые будут следить за всеми серверами в сети. Помимо извещения операторов о наступлении того или иного события SQL Server 2000 позволяет выполнять в ответ на события определенные задачи.
20
Часть I. Архитектура SQL Server 2000
Служба Microsoft Search Служба Microsoft Search (MSSearch), также называемая Full-Text Search, используется для поиска символьной информации в таблицах баз данных SQL Server 2000. Архитектура и принципы работы системы поиска в SQL Server 2000 были существенно переработаны по сравнению с предыдущими версиями. Служба Microsoft Search позволяет выполнять полнотекстовый поиск (full-text search). Технология полнотекстового поиска позволяет находить не только слова и фразы, идентичные указанным, но и близкие к ним по смыслу и написанию. После выполнения поиска пользователь получит результирующий набор, содержащий склоняемые формы глаголов и существительных. Технология полнотекстового поиска активно внедряется корпорацией Microsoft во все свои продукты. Например, в Microsoft Internet Information Server имеется компонент Index Server, выполняющий полнотекстовый поиск на публикуемых HTML-страницах. Для реализации полнотекстового поиска в SQL Server 2000 существуют полнотекстовые каталоги (full-text catalog) и полнотекстовые индексы (full-text index). Данные полнотекстовых каталогов и индексов хранятся отдельно от основных данных в специальных файлах. Все действия по работе с этими файлами осуществляет служба MSSearch. Связь между службами MSSQLServer и MSSearch производится через специального поставщика (full-text provider). Служба MSSearch периодически анализирует содержание таблиц баз данных и обновляет (repopulation) полнотекстовые каталоги и индексы. Если необходимо создать полнотекстовый индекс заново, следует выполнить перестроение (rebuild) индекса. Результатом такого подхода является то, что данными полнотекстового поиска нужно управлять отдельно от основных данных. Администратор должен настроить интервалы обновления данных полнотекстового поиска. Кроме того, операции резервного копирования и восстановления файлов полнотекстового поиска необходимо выполнять отдельно от основных данных. Замечание Служба MSSearch может функционировать только в качестве службы Windows NT и работать только под управлением операционной системы Windows NT Server. Следствием этого ограничения является невозможность установки службы полнотекстового поиска в редакции SQL Server Desktop Engine. Служба MSSearch устанавливается только для редакций SQL Server Standard Edition и SQL Server Enterprise Edition. Тем не менее, любые клиенты, включая клиентов Windows 95/98 и Windows NT Workstation, имеют возможность обращаться с запросами на полнотекстовый поиск к серверам с установленной службой MSSearch.
Служба MSDTC SQL Server 2000 дает возможность пользователям работать одновременно с несколькими источниками данных. Пользователи в одном запросе могут обращаться к различным базам данных, хранящимся на одном и том же или на раз-
Глава 2. Компоненты SQL Server 2000
21_
ных серверах. Кроме того, пользователи могут обращаться не только к серверам Microsoft SQL Server 2000, но также к любым источникам данных, работающим с технологией OLE DB. Эта технология позволяет обращаться не только к реляционным источникам данных, таким как Oracle, FoxPro, MS Access и т. д., но и к нереляционным источникам данных, таким как текстовые файлы, книги MS Excel и настольные приложения. Для обращения из тела одной транзакции к множеству источников данных SQL Server 2000 использует распределенные транзакции (distributed transaction). Для управления распределенными транзакциями существует координатор распределенных транзакций (Distributed Transaction Coordinator). В SQL Server 2000 координатор распределенных транзакций реализован в виде службы MSDTC. Эта служба автоматически отслеживает ситуации, в которых необходимо начать выполнение распределенных транзакций. В некоторых ситуациях пользователь может и не подозревать, что его транзакция выполняется как распределенная. Служба MSDTC скрывает от пользователя все действия по обработке распределенных транзакций. Распределенные транзакции реализуются как множество локальных транзакций, открываемых на каждом источнике данных координатором распределенных транзакций. Служба MSDTC синхронизирует все транзакции таким образом, что пользователь может быть уверен в целостности данных на всех участниках распределенной транзакции. Это достигается использованием специального двухфазного протокола изменений (2РС, two-phase commit protocol). Подробно работа этого протокола будет рассмотрена в разд. "Отложенное обновление" главы 14. Замечание Обратите внимание, что даже если вы работаете с данными, расположенными на одном сервере, но хранящимися в разных базах данных, SQL Server 2000 будет использовать распределенную транзакцию.
Системные базы данных SQL Server 2000 SQL Server 2000 в своей работе использует несколько системных баз данных. Эти базы данных создаются автоматически при установке SQL Server 2000 и не должны удаляться. Вся информация о настройке сервера хранится в этих базах данных. Их можно сравнить с реестром операционной системы Windows, в котором хранится вся системная и пользовательская информация. Удаление или повреждение реестра приведет к краху системы и невозможности ее работы. Аналогичная ситуация наблюдается и с системными базами данных SQL Server 2000. Приведем список системных баз данных: П Master;
П Model;
П Tempdb;
П Msdb.
При работе с реестром операционной системы пользователи чаще всего выбирают специальные инструменты, например утилиты панели управления. Не рекомендуется напрямую работать с реестром, т. к. даже небольшие изменения могут существенно повредить работоспособности системы. Таким же образом следует поступать и при работе с системными базами данных SQL Server 2000. Не рекомен-
22_
Часть I. Архитектура SQL Server 2000
дуется напрямую работать с этими таблицами с помощью команд SELECT, INSERT, UPDATE и DELETE. Кроме того, при установке SQL Server 2000 непосредственное изменение информации в системных базах данных запрещено. Тем не менее, пользователи могут считывать данные с помощью команды SELECT. Для изменения данных в системных таблицах в SQL Server 2000 имеется набор системных хранимых процедур, с помощью которых можно выполнить практически любые действия по администрированию сервера. Microsoft настоятельно рекомендует использовать эти хранимые процедуры, а не изменять данные непосредственно. Это связано не только с опасностью повреждения системных данных, но еще и с обеспечением совместимости. Microsoft может изменить структуру системных таблиц и назначение колонок в следующих версиях SQL Server. Если приложение напрямую изменяет системные таблицы SQL Server 2000 и при этом корректно работает, то нет никакой гарантии, что оно станет правильно работать в следующих версиях. При использовании системных хранимых процедур Microsoft обещает, что приложение будет корректно работать даже при существенных изменениях в системных базах данных. Так, например, приложения SQL Server 6.x, использующие для взаимодействия с сервером системные хранимые процедуры, успешно работают и в SQL Server 2000, хотя структура системных таблиц и архитектура самого SQL Server претерпели существенные изменения. Помимо применения системных хранимых процедур для управления сервером и базами данных можно использовать графический интерфейс Enterprise Manager или возможности программного интерфейса SQL-DMO. Подробно работа с базами данных SQL Server 2000 будет рассмотрена в главе 20. Сейчас же рассмотрим назначение каждой из системных баз данных.
База данных Master Эта системная база данных является главной базой данных SQL Server 2000. Собственно, она и выполняет функции реестра операционной системы Windows. Остальные системные базы данных имеют второстепенное значение и их можно считать вспомогательными. В базе данных Master хранится вся системная информация о параметрах конфигурации сервера, имеющихся на сервере пользовательских баз данных, пользователях, имеющих доступ к серверу и другая системная информация. В табл. 2.1 приведены таблицы системной базы данных Master, используемые для хранения параметров конфигурации сервера. Таблица 2.1. Таблицы базы данных
Master
Название таблицы
Описание
Sysaltfiles
Эта таблица содержит информацию обо всех файлах базы данных M a s t e r , включая файл журнала транзакций — их имена, размещение, текущий и максимальный размер, статус и т. д.
Syscacheobj e c t s
Содержит информацию об использовании сервером кэш-памяти
Глава 2. Компоненты SQL Server 2000
23
Таблица 2.1 (продолжение) Название таблицы
Описание
Syscharsets
В этой таблице описываются все установленные на сервере наборы символов и порядки сортировки
Sysconfigures
В таблице хранится информация обо всех параметрах конфигурации сервера, а также отражается информация о параметрах конфигурации, изменяемых динамически после запуска сервера
Syscurconfigs
В этой таблице хранятся текущие значения настроек сервера, т. е. настроек, используемых в настоящий момент. Таблица строится динамически на основе данных таблицы S y s c o n f i g u r e s
Sysdatabases
Содержит сведения обо всех базах данных сервера — именах и размещении первичных файлов, ID, статусе, дате создания и т. д.
Sysdevices
В этой таблице приведена информация о настройках системы резервного копирования. В SQL Server 2000 данная таблица не используется и оставлена для обеспечения обратной совместимости с SQL Server 6.x
Syslanguages
Содержит описание всех локальных языков, поддерживаемых сервером, в т. ч. информация о формате дат. Каждая строка таблицы соответствует одному языку. Английский язык в таблице не указывается, т. к. используется всегда
Syslockinfo
Эта таблица используется менеджером блокировок и содержит информацию о блокировках — их тип, время "жизни", режим регистрации, статус, ID владельца и другую информацию
Syslogins
В этой таблице хранится информация об учетных записях пользователей, имеющих доступ к серверу — имя и пароль пользователя, тип аутентификации, ID и т. д. Каждая строка таблицы соответствует одному пользователю
Sysmessages
Таблица содержит все сообщения о системных ошибках или предупреждениях. Каждая строка соответствует одному сообщению и включает информацию о номере ошибки, ее важности, группе сообщения, а также текст сообщения
Sysoledbusers
Содержит информацию об отображении учетных записей при работе со связанными серверами. Каждая строка соответствует одному связанному серверу и хранит данные об имени пользователя и его пароле, под которым будет регистрироваться соединение на связанном сервере
Sysperfinfо
Данная таблица используется для хранения информации о внутренних счетчиках SQL Server 2000. Информация из этой таблицы используется утилитой Performance Monitor
Sysprocesses
В таблице динамически отображается информация о клиентских и системных процессах, выполняемых SQL Server
24
Часть 1. Архитектура SQL Server 2000
Таблица 2.1 (окончание) Название таблицы
Описание
Sysremotelogins
В этой таблице хранится информация об удаленных пользователях, которым разрешено удаленно выполнять хранимые процедуры. Каждая строка таблицы содержит имя пользователя, его SUID, SID, ID удаленного сервера и т. д.
Sysservers
Эта таблица применяется для хранения информации о всех серверах SQL Server, сконфигурированных в качестве источника данных OLE DB для локального SQL Server 2000
По умолчанию база данных Master создается в каталоге Data установочного каталога SQL Server 2000. База данных состоит из двух файлов: •
Master.mdf — основной файл базы данных, содержащий собственно данные. Размер этого файла после установки составляет 8 Мбайт;
•
Master.ldf — файл базы данных, предназначенный для хранения журнала транзакций. Размер этого файла после установки составляет 1 Мбайт.
База данных Model Эта системная база данных является шаблоном для создания новых баз данных. Технология создания новой базы данных в SQL Server 2000 построена следующим образом: сервер копирует базу данных Model в указанное место и изменяет ее имя соответствующим образом. Если при создании базы данных не указаны никакие параметры, кроме ее имени, то новая база данных будет являться полной копией базы данных Model. Если же размер и состав файлов создаваемой базы данных указан явно, то скопированная база данных изменяется соответствующим образом. Но в любом случае в качестве основы используется база данных Model. Независимо от того, создаете ли вы базу данных с помощью интерфейса Enterprise Manager, команд Transact-SQL или интерфейса SQL-DMO, последовательность действий во всех случаях будет одинакова. Изменяя параметры базы данных Model, можно управлять параметрами по умолчанию создаваемых баз данных. Кроме того, базу данных Model можно использовать в качестве корпоративного стандарта на содержимое и свойства базы данных. Администратор может создать в базе данных Model набор таблиц и хранимых процедур, которые должны быть в каждой базе данных, а не утруждать себя изменением очередной вновь созданной базы данных вручную. Можно ускорить создание множества однотипных таблиц со специализированной конфигурацией, если соответствующим образом изменить базу данных Model. Если на предприятии имеются операторы, выполняющие специализированные задачи, или пользователи, которые всегда должны иметь возможность читать данные из базы данных, то, настроив соответствующим образом права доступа этих пользователей к базе данных Model, можно не бояться забыть это сделать после создания базы данных.
Глава 2. Компоненты SQL Server 2000
25_
После установки SQL Server 2000 размер базы данных Model установлен в 1,5 Мбайт. База данных Model располагается в каталоге Data и состоит из двух файлов размером по 0,75 Мбайт каждый: •
Model.mdf — основной файл базы данных, содержащий собственно данные;
П Model.ldf — файл базы данных, используемый для хранения журнала транзакций.
База данных Tempdb Пользователям иногда необходимо создавать временные таблицы, представления, курсоры и другие объекты для сохранения промежуточных результатов. SQL Server 2000 позволяет создавать такие временные объекты. Для создания временной таблицы достаточно добавить перед ее именем символ # или ##. Сервер автоматически создаст временную таблицу. Временные объекты могут быть локальными или глобальными. Локальные объекты доступны только из того соединения, в котором они созданы. При этом можно создавать одноименные объекты в различных соединениях. Для организации локальной временной таблицы или представления в имя объекта добавляется символ #, а при создании локальной переменной предназначен символ @. Глобальные объекты, созданные в одном соединении, доступны из всех остальных активных соединений. При этом допускается создание единственного глобального временного объекта с уникальным именем. Для создания глобальной временной таблицы или представления в имя объекта добавляется символы ##, а при создании локальной переменной используются символы @@. База данных Tempdb, ПОЛНОе Название КОТОРОЙ Temporary DataBase, СЛУЖИТ В
SQL Server 2000 для хранения всех временных объектов, создаваемых пользователями во время сеанса работы. Если постоянные объекты, такие как таблицы или представления, создаются в пользовательской базе данных, то временные объекты возникают в базе данных Tempdb. Доступ к базе данных Tempdb автоматически имеется у всех пользователей, и администратор не должен предпринимать никаких действий для предоставления им доступа к этой базе данных. Отличительной особенностью базы данных Tempdb является то, что она уничтожается каждый раз, когда происходит останов сервера. Естественно, все временные объекты, созданные пользователями, также уничтожаются. При следующем запуске SQL Server 2000 база данных Tempdb создается заново. Понятно, что создание резервной копии базы данных Tempdb совершенно бесполезно. В остальном поведение этой базы данных мало чем отличается от поведения обычных баз данных. При создании базы данных Tempdb, также как и для пользовательских баз данных, в качестве основы применяется база данных Model. При этом наследуются все свойства последней. Администратор должен учитывать это, изменяя параметры базы данных Model. Неверное конфигурирование параметров этой базы данных может неблагоприятным образом повлиять на работу всех пользователей. Кроме того, при планировании параметров базы данных Tempdb следует
26_
Часть I. Архитектура SQL Server 2000
учитывать требования к свободному пространству на диске. Как и для всех баз данных, для Tempdb поддерживается возможность автоматического роста файлов базы данных. При интенсивном обращении пользователей к ресурсам базы данных Tempdb неизбежен ее рост. Необходимо правильно выбрать первоначальный размер и шаг прироста этой базы данных. Неверное конфигурирование этих параметров может заметно снизить производительность системы.
{
Замечание
)
Если сразу же после старта сервера наблюдается рост базы данных Tempdb, то следует увеличить первоначальный размер базы данных и, возможно, повысить шаг ее прироста. Хотя для создания базы данных Tempdb используется база данных Model, все же первоначальный размер и шаг прироста для базы данных Tempdb устанавливается отдельно.
База данных Tempdb состоит из двух файлов, располагающихся в каталоге Data установочного каталога SQL Server 2000. • Tempdb.mdf — основной файл базы данных, содержащий временные объекты. Размер этого файла после установки составляет 8 Мбайт; • Tempdb.ldf — в этом файле хранится журнал транзакций. Размер этого файла после установки составляет 0,5 Мбайт.
База данных Msdb Системная база данных Msdb предназначены для хранения всей информации, относящейся к автоматизации администрирования и управлений SQL Server 2000, а также информации об операторах и событиях. Кроме того, в этой базе данных хранится информация о расписании автоматического запуска заданий. То есть в базе данных Msdb размещается вся системная информация, используемая службой SQLServerAgent. В табл. 2.2 приведены сведения о составе и назначении таблиц базы данных Msdb. Таблица 2.2. Таблицы базы данных Msdb Название таблицы
Описание
Sysalerts
Эта таблица хранит информацию о событиях (alerts), определенных на локальном сервере
Syscategories
Эта таблица содержит категории, используемые Enterprise Manager для управления заданиями, событиями и операторами
Sysdownloadslist
Таблица используется при конфигурировании многосерверных заданий и содержит инструкции, загружаемые всеми серверами назначения
Sysjobhistory
Таблица содержит историю выполнения заданий. Хранится информация о выполнении каждого из шагов задания. Эта информация отображается в Enterprise Manager и может быть использована для поиска сбоев и ошибок
Глава 2. Компоненты SQL Server 2000
27 Таблица 2.2
(окончание)
Название таблицы
Описание
Sysjobs
В этой таблице находится информация обо всех заданиях (jobs), сконфигурированных на сервере
sysjobschedules
В данной таблице хранятся расписания выполнения заданий
sysjobservers
В этой таблице хранится вся информация, касающаяся параметров многосерверных заданий
sysjobsteps
Таблица содержит описание шагов заданий. Каждая строка соответствует единственному шагу какого-либо задания
sysnotifications
Таблица используется для хранения информации об извещениях, посылаемых операторам в случае наступления того или иного сконфигурированного события
sysoperators
Данная таблица предназначена для хранения информации о настройках операторов, сконфигурированных в SQLServerAgent
systargetservergroupmembers
Таблица содержит информацию о том, к какой серверной группе (multiserver group) принадлежит тот или иной сервер назначения
Systargetservergroups
В этой таблице перечислены все группы серверов, сконфигурированные на сервере
Systargetservers
Содержит список серверов назначения, которые включены в функционирующий многосерверный домен
Systaskids
Эта таблица предназначена для хранения информации об отображении задач (tasks) SQL Server 6.x в задания (jobs) SQL Server 2000
автоматического
Глава 3
Использование SQL Server 2000 Все с большей компьютеризацией коммерции и бизнеса выполняется значительная часть анализа и обработки данных. Следует разделить операции анализа и обработки информации. К первым следует отнести формирование разнообразных отчетов о накопленных данных, тогда как вторые предназначены для хранения этих данных. Каждая из операций должна выполняться как можно более эффективно. Хотя конкретные задачи, решаемые с помощью SQL Server 2000, могут быть весьма разнообразны, тем не менее, с учетом разделения операций обработки и анализа среди всего разнообразия этих задач выделяются два основных направления: •
системы оперативной аналитической обработки (OLAP, Online Analytical Processing);
П системы оперативной обработки транзакций (OLTP, Online Transaction Processing). Каждое из этих направлений обладает некоторыми особенностями, которые будут рассмотрены далее в этом разделе. Сейчас же стоит сказать, что сервер, а точнее конкретная база данных или даже таблица, может использоваться только в одном из этих режимов. В SQL Server 2000 нет встроенных средств переключения сервера в тот или иной конкретный режим работы. Для работы в режиме OLAP или OLTP администратор баз данных должен "вручную" соответствующим образом перестроить заполнение страниц данных и индексных страниц, а также изменить некоторые другие аспекты работы сервера.
Системы оперативной аналитической обработки Системы оперативной аналитической обработки, также известные как системы поддержки принятия решения (DSS, Decision Support System) ориентированы на предоставление пользователям мощных механизмов для быстрого и многостороннего анализа данных. Резкий рост спроса на системы аналитической обработки вызван расширением применения компьютерных систем для ведения бизнеса. В современных условиях бизнесмену или главе корпорации нужно быстро получить информацию о наиболее перспективных направлениях торговли или производства, которая сможет дать максимальную отдачу на вложенные
Глава 3. Использование SQL Server 2000
29
средства. Чем более оперативно получается информация, тем эффективнее управление организацией. Спрос на те или иные товары может значительно меняться с течением времени, особенно при смене сезонов. Резкое увеличение спроса на другие товары может быть вызвано временными явлениями. Если вовремя не получить информацию об изменении спроса, то можно лишиться потенциальной прибыли. Более того, если будет принято неправильное решение, то можно понести и убытки. В современной организации информация о продажах накапливается в центральной базе данных. Обычно в ней хранится информация об операциях закупок и продаж товара. Довольно легко получить данные о наличии того или иного товара на складе. Гораздо труднее отследить информацию о спросе на тот или иной товар, а еще сложнее оценить отдачу от вложения денег в той или иной товар. Можно продать тысячу зубных щеток, но получить от этого меньше прибыли, чем от продажи одного телевизора. Если компания не может купить все товары сразу и продавать их все, а должна выбрать лишь некоторые из них, то нужно решить, приобретение и последующая продажа каких товаров может принести наибольшую прибыль. Конечно, если компания небольшая, а ассортимент товаров насчитывает всего несколько десятков, то такой анализ можно выполнить и вручную. Однако если количество торговых точек составляет несколько десятков, а ассортимент товаров насчитывает тысячи наименований, то ручной анализ такого объема информации займет много времени. За то время, пока данные будут анализироваться, они успеют устареть, и могут уже не отражать реальной ситуации на рынке. Рассмотренная ситуация является лишь одной из возможных ситуаций. Однако на ее примере можно понять, как важен оперативный анализ информации. Для решения описанных проблем, а также многих других, предназначены системы оперативной аналитической обработки. Перед системой стоит задача сгруппировать данные, выполнить их агрегирование, часто многоуровневое. При этом могут анализироваться миллионы строк, а в ответ выдаваться небольшой отчет, содержащий сводные показатели. Рассмотрим особенности систем оперативной аналитической обработки (OLAP). П Системы OLAP отличаются небольшим количеством, а часто и полным отсутствием изменений данных. Действительно, если мы проводим анализ данных о продажах, то вряд ли нужно вносить в них изменения. Поэтому можно говорить, что системы OLAP используют данные в режиме "только для чтения". Работа сервера баз данных в таком режиме позволяет более эффективно выполнять запросы, т. к. не нужно устанавливать блокировки и использовать транзакции. Кроме того, страницы данных могут быть заполнены на 100%, что повышает компактность расположения данных. • Одним из важных требований к системам OLAP является скорость выполнения запросов. Время обработки большинства запросов пользователей не должно превышать нескольких секунд. Для этого в базах данных OLAP создается большое количество индексов, значительно ускоряющих поиск нужных данных.
30
Часть I. Архитектура SQL Server 2000
П Пользователи должны легко выполнять наиболее часто используемые операции. Поэтому системы OLAP должны иметь встроенные механизмы выполнения базовых операций численного и статистического анализа данных. D Часто одни и те же данные должны анализироваться с разных сторон. Для этого используется технология многомерного представления информации. Данные из множества таблиц различных баз данных объединяются в одну логическую структуру, позволяющую быстро и легко проанализировать информацию по самым разнообразным критериям. П Для повышения скорости выполнения запросов желательна поддержка технологии материализованных представлений. Материализованное представление создается для конкретного запроса и предназначено для предварительного вычисления результата выполнения этого запроса. Когда пользователь запускает запрос, то анализ всех данных не выполняется. Система использует данные, хранящиеся в материализованном представлении. При внесении новых данных представление автоматически отслеживает изменения и соответствующим образом корректирует информацию, используемую для выполнения запроса. •
Системы OLAP обычно используются для анализа большого объема информации, нередко расположенной на множестве гетерогенных удаленных источников данных. В качестве таких источников может выступать SQL Server 2000, SQL Server 6.x, Oracle, MS Access и другие СУБД. Система OLAP должна иметь возможность обращаться к данным, расположенным на этих источниках, напрямую. В противном случае необходимо будет выполнять промежуточный перенос данных, что требует времени и не всегда может осуществляться достаточно оперативно.
•
Одним из важных требований является обеспечение высокой безопасности. Система должна отвергать все попытки несанкционированного доступа к данным. В то же время авторизированные пользователи должны иметь возможность легко получать нужную информацию.
Приведенный список требований хорошо характеризует системы OLAP и дает представление об особенностях их работы. На рынке существуют различные программные реализации систем OLAP, работающие с различными системами управления базами данных. Microsoft предлагает пользователям полноценную реализацию OLAP — Microsoft Decision Support System (MS DSS). Архитектура DSS представлена двумя компонентами: П Серверная часть, выполняющая "перемалывание" больших объемов данных и выполняющая всю работу по анализу. Представлена компонентом OLAP Services, реализованного в виде самостоятельной службы операционной Системы. Эта служба поставляется в составе SQL Server 2000 и устанавливается отдельно. OLAP Service представляет своего рода надстройку над SQL Server 2000, позволяющую также работать и с информацией, расположенной на других источниках данных. П Клиентская часть, выполняющая окончательный результат анализа данных, также предоставляет пользователям средства просмотра результатов анализа в
Глава 3. Использование SQL Server 2000
31
различной форме. Эта часть реализована в виде инструмента PivotTable Service. К достоинствам PivotTable Service можно отнести невысокий объем сетевого трафика. Кроме того, используемые алгоритмы кэширования позволяют работать с данными после отключения от сервера. Применение DSS открывает широкие возможности для решения бизнес-задач различного рода. Традиционно системы оперативной аналитической обработки стоили немалых денег и поэтому были не доступны для массового применения. Предлагаемая Microsoft система имеет невысокую стоимость и доступна даже мелким компаниям. Наряду с высокой производительностью, наличием мощной системы безопасности, возможностью доступа к распределенным гетерогенным источникам информации делают предлагаемое Microsoft решение весьма привлекательным для многих компаний.
Системы оперативной обработки транзакций В предыдущем разделе были рассмотрены особенности систем оперативной аналитической обработки, предназначенных для быстрого многостороннего анализа больших объемов информации. В этом же разделе будет рассмотрен другой вариант использования систем управления базами данных — построение систем оперативной обработки транзакций (OLTP, Online Transaction Processing). В отличие от систем OLAP, системы OLTP характеризуются большим количеством изменений, одновременным обращением множества пользователей к одним и тем же данным для выполнения разнообразных операций — чтение, запись, удаление или модификация данных. Для нормальной работы множества пользователей система управления базами данных должна использовать транзакции и блокировки. Применение транзакций обеспечивает выполнение набора команд в виде единого блока, который либо будет выполнен весь полностью, либо не будет выполнен вовсе. Типичным примером работы с транзакциями является перевод денег с одного банковского счета на другой. Такой процесс подразумевает две операции — снятие денег с одного счета и запись их на другой. Если после снятия денег в системе произойдет сбой, то вторая операция выполнена не будет, и деньги на счет не поступят. Вряд ли кого-то устроит, что его деньги бесследно пропадут вследствие сбоя программы или компьютера. Если же перевод осуществляется с применением транзакций, то можно быть уверенным — либо деньги будут переведены, либо нет. Никаких промежуточных вариантов быть не может. Блокировки позволяют избежать конфликтов одновременного доступа к данным нескольких пользователей. Необходимо обеспечить изолированность изменений, выполняемых одной транзакцией, от других транзакций. Продолжим предыдущий пример. Предположим, что клиент пришел в банк с просьбой перевести $100 000 с его счета в другой банк. Служащий банка начал перевод денег, но из-за медленной связи с банком-получателем выполнение транзакции затяну-
32
Часть I. Архитектура SQL Server 2000
лось. В это время с этого же счета другой человек, например, жена клиента, делает платеж по электронной карте в магазине, покупая шикарную машину за $90 000. То есть две транзакции пытаются обратиться к одним и тем же данным. Если не пресекать таких действий, то возможно, что на счете клиента в другом банке будет лежать $100 000, а жена купит новую машину. С точки зрения клиента такая ситуация очень даже неплоха, но вряд ли найдется банкир, который захочет работать с такой системой. Использование блокировок позволяет избежать описанных ситуаций, а также многих других конфликтов одновременного доступа к данным.
Замечание Подробно транзакции и блокировки будут рассмотрены в главе 19. Требование поддержки к эффективной обработке транзакций и блокировок является одним из важнейших требований к системам оперативной обработки транзакций. Кроме того, наличие большого количества операций изменения и вставки данных приводит к частому изменению количества строк на отдельной странице файлов базы данных. Чтобы обеспечить высокую скорость вставки новых данных, а также изменения данных, используемых в кластерном индексе, поддерживается низкая степень заполнения страниц. Поэтому системы OLTP более требовательны к объему дисковой памяти, чем системы OLAP.
Инструменты SQL Server 2000 В данном разделе и его подразделах будет дан обзор инструментов, поставляемых в составе SQL Server 2000 и используемых для администрирования сервера, анализа производительности, выполнения запросов и многих других задач. Обычно инструменты администрирования устанавливаются при инсталляции самого SQL Server 2000. Тем не менее, они могут быть добавлены и отдельно. Таким образом, на одном компьютере могут иметься только инструменты администрирования, тогда как на другом — только собственно SQL Server 2000 (т. н. engine). Инструменты SQL Server 2000 спроектированы таким образом, что они могут применяться для работы с любым сервером SQL Server 2000 локальной сети. Более того, инструменты администрирования SQL Server 2000 могут быть использованы для управления и серверами SQL Server 7.0. Администрирование же серверов SQL Server 6.x должно выполняться инструментами администрирования, поставляемыми в составе этих версии. Enterprise M a n a g e r Данный инструмент является базовым при выполнении самых разнообразных задач: •
управления системой безопасности;
П создания баз данных и ее объектов;
Глава 3. Использование SQL Server 2000
33
П создания и восстановление резервных копий; П конфигурирования подсистемы репликации; •
управления параметрами работы служб SQL Server 2000;
• управления подсистемой автоматизации; П запуска, останова и приостанова служб; •
конфигурирование связанных и удаленных серверов;
•
создания, управления и выполнения пакетов DTS.
Приведенный список, конечно же, не исчерпывает всех областей применения Enterprise Manager и легко может быть расширен. Однако и указанных пунктов достаточно, чтобы понять всю важность этого инструмента. Большая часть административных задач SQL Server 2000 может быть выполнена следующими методами: П использованием средств Transact-SQL; •
с помощью графического интерфейса Enterprise Manager;
•
с помощью мастеров (wizards).
Порядок перечисления методов соответствует уменьшению сложности работы с ними. То есть самым сложным является выполнение задачи средствами Transact-SQL, т. к. это требует знания синтаксиса команд и хранимых процедур, а также умения обращаться с инструментом Query Analyzer (или любым другим ему подобным). Однако использование средств Transact-SQL открывает пользователю прямой доступ к системным данным. Инструмент Enterprise Manager разрабатывался с целью облегчить пользователям выполнение наиболее актуальных административных задач, сочетая при этом простоту работы с высокой функциональностью. Можно с уверенностью сказать, что разработчикам Microsoft удалось добиться хорошего результата. Enterprise Manager является действительно достаточно простым в использовании инструментом, в то же время он охватывает практически все административные задачи, с которыми столкнется администратор. Конечно, различные нестандартные ситуации с помощью этого инструмента не решить и придется обратиться к средствам Transact-SQL. He стоит воспринимать Enterprise Manager как инструмент для неопытных пользователей, не умеющих работать со средствами Transact-SQL, и всеми силами стремиться осилить синтаксис команд и хранимых процедур. Решение некоторых задач средствами Transact-SQL настолько сложно, что это просто становится неразумным. Использование же Enterprise Manager поможет сэкономить достаточно много времени и использовать его более эффективно. SQL Server Service Manager Единственной задачей утилиты SQL Server Service Manager является предоставление пользователю удобного механизма запуска, останова и приостанова служб
34
Часть I. Архитектура SQL Server 2000
SQL Server 2000. Кроме этого, она позволяет лишь запретить или разрешить автоматический запуск той или иной службы при загрузке операционной системы. Утилита Service Manager устанавливается при инсталляции SQL Server 2000 и по умолчанию автоматически запускается при загрузке операционной системы. В нормальном состоянии утилита Service Manager представлена значком в правой части панели задач (taskbar). Двойной щелчок на пиктограмме приведет к открытию окна программы, с помощью которого можно запускать, останавливать и приостанавливать службы SQL Server 2000, а также разрешать или запрещать их автоматический запуск при загрузке операционной системы. Подробно работа с утилитой Service Manager будет рассмотрена в разд. "Утилита SQL Server Service Manager" главы 7. S Q L Server Profiler Утилита SQL Server Profiler — это графический инструмент, с помощью которого администратор может наблюдать за теми или иными аспектами работы SQL Server 2000. В основе работы этой утилиты лежит тот же принцип, что и в основе работы утилиты Performance. При выполнении пользовательских запросов, хранимых процедур, команд Transact-SQL, подключении к серверу и отключении от него, а также множества других действий, ядро SQL Server 2000 сохраняет в системных таблицах массу различной информации о ходе выполнения операций. Эта информация может быть получена с помощью специальных хранимых процедур. Утилита SQL Server Profiler использует эти хранимые процедуры для получения необходимой информации. Полученные данные затем представляются в удобном виде с помощью графического интерфейса. Однако пользователи могут получать информацию о процессах SQL Server 2000, обращаясь напрямую к хранимым процедурам. В принципе, на основе этих хранимых процедур можно даже написать свое собственное приложение, которое будет отображать информацию о работе SQL Server 2000 в нужной форме. Мониторинг работы SQL Server 2000 основывается на наблюдении за событиями (events). Событие генерируется ядром SQL Server 2000 и является минимальным объемом работы, который можно контролировать. Каждое событие принадлежит к какому-то классу событий (event classes), который описывает его параметры и смысл той или иной информации. Для лучшего понимания разницы между событием и классами событий SQL Server Profiler проведем аналогию с объектами и экземплярами объектов Performance Monitor. Класс событий SQL Server Profiler, как и объект Performance Monitor, представляет собой абстрактное описание. Тогда как само событие (экземпляр объекта) представляет собой информацию о работе того или иного объекта. Количество классов событий SQL Server довольно велико. Для облегчения работы с ними они были разбиты на двенадцать категорий (category). Подробное их описание приведено в главе 15.
Глава 3. Использование SQL Server 2000
35
Query Analyzer Этот инструмент предназначен для выполнения запросов и анализа их исполнения. По частоте использования и важности Query Analyzer сравним с Enterprise Manager. При рассмотрении различных тем в книге мы часто будем приводить команды, которые демонстрируют практическую сторону рассмотренных вопросов. Например, если в тексте книги будет предложено выполнить приведенный код, то его нужно воспроизвести в окне Query Analyzer и нажать кнопку Execute Query, на которой изображен зеленый треугольник. Результат выполнения запроса будет отображен в нижней части окна SQL Query Analyzer. Попытаемся выполнить код: USE pubs SELECT TOP 10 au_id, au_lname, au_fname FROM authors
Будет возвращен следующий результат: au_id
au_lname
au_fname
409-56-7008 648-92-1872 238-95-7766 722-51-5454 712-45-1867 427-17-2319 213-46-8915 527-72-3246 472-27-2349 846-92-7186
Bennet Blotchet-Halls Carson DeFrance del Castillo Dull Green Greene Gringlesby Hunter
Abraham Reginald Cheryl Michel Innes Ann Marjorie Morningstar Burt Sheryl
(10 row(s) affected)
В окне утилиты Query Analyzer это будет выглядеть примерно так, как это показано на рис. 3.1. Как видно, окно SQL Query Analyzer разделено на три части. В левой части выводится так называемый браузер объектов (Object Browser), с помощью которого можно просмотреть список всех объектов, расположенных в любой базе данных сервера, а также перечень встроенных функций и системных типов данных. В принципе, браузер объектов можно легко отключить. Для этого достаточно просто нажать клавишу
либо выбрать пункт в меню Tools команду Object Browser, а затем команду Show/hide. Аналогичным способом можно и отобразить браузер объектов. Отметим, что он является одним из самых заметных нововведений в Query Analyzer, однако не самым важным. Принципиальным же является возможность трассировки выполнения хранимых процедур. Для начала трассировки достаточно в контекстном меню интересующей хранимой процедуры выбрать пункт Debug. В ответ откроется окно Debug Procedure, предназначенное для указания значений параметров хранимой процедуры, с которыми она будет запущена. При выполнении трассировки пользователи могут использовать точки останова (break points), а также осуществлять пошаговое выполнение команд процедуры. Помимо выполнения запросов и хранимых процедур, с помощью Query Analyzer можно оценить производительность исполнения запроса. Для этого следует раз-
Часть I. Архитектура SQL Server 2000
36
решить отображение оценочного (estimated) или результирующего плана исполнения (execution plan) запроса, что можно выполнить с помощью меню Query, выбрав в нем соответственно пункты Display Estimated Execution Plan и Display Execution Plan. Отметим, что оценочный план исполнения запроса формируется на основе предположений сервера о затратах на выполнение отдельных шагов запроса. Результирующий же план исполнения запроса генерируется после выполнения запроса и отражает реальное положение дел. Конечно, в идеальной ситуации значения оценочного и результирующего планов исполнения будут совпадать. Однако при работе с многопользовательскими системами вполне может оказаться, что реально исполнение запроса займет больше времени, чем ожидалось. Чаще всего это происходит из-за занятости процессора выполнением запросов других пользователей или блокированием необходимых для выполнения запроса ресурсов другими транзакциями. Щ SQL Query Analyzer - [Query - STORAGE\TREO l N.pubs,STORAG£\ Щ File Edit Query Tools Bindow
[ J
flbject Brawsei
*}
pub:
~z\\
USE риЬз SELECT TOP 10 au id. au lname. au fnaine FROM authors
f j STORAGEVTRELONfSTORAi T ] STORAGEURELON {J Chair (J Conferenc Q Dekanat i j DocExch 0 Piaster
р MATRIX 0 model SJ msdb JJ pubs U tempdb ." ')Common Objects •I'" I Configuotion Functions C_J Cuisot Functions 1 "I Date and Time Functions Q) Mathematical Functions Q] Aggregate Functions j''"] Metadata Functions £_} Security Functions [ String Functions I I System Functions ' '1 System Statistical Functic \ 1 Text and Image FunctionГ") Rowset
\ ± r
au i d
au lnaine
au fname
409-56-7008 648-92-1872 238-95-7766 722-51-5454 712-45-1867 427-17-2319 213-46-8915 527-72-3246 472-27-2349 346-92-7186
Bennet Blotchet-HalIs Carson DeFrance del Castillo Dull Green Greene Gringlesby Hunter
Abraham Reginald Cheryl Michel Innes Ann Marjorie Horning3ts Burt Sheryl
(10 row(s) affected)
ll П Results j
ffi Objects \Щ Templates}
Query ba STORAGE\TRELON (8,0) |5TORAGE\Admini5trator (53) pubs ; 0:00:00
Ln 3, Col 1
Connections:
Рис. З . 1 . Окно утилиты Query Analyzer
На рис. 3.2 приведен оценочный план исполнения рассмотренного выше запроса. Каждый из его шагов отображается отдельным значком. Подведя курсор к значку, можно получить подробную информацию об операции, выполняемой на конкретном шаге.
Глава 3. Использование SQL Server 2000
37
Ж SQL Query Analyzer - [Query - ST0RAGE\TREL0N.pubs.ST0RA6P, Eile £dit Query lools ffiindow J pubs __
Qbject Browser
STORAGE\TRELON(STORAijJ
if
3 i
USE pubs SELECT TOP 10 au id, au lname, au fname FROM
IS
authors
:-: :_J Stored Procedures _^ Ш ;^9 dbo.byroyalty '*:'Щ? dbo.dt_addtosou Й \Щ dbo.dt_addtosou Ш ЗЦр dbo.dt_adduseto :+, ?y dbo.dt_adduse(o ffl -Jjl dbo.dt_checkino ; ; S f J dbo.dLcheckino : IS ^Щ dbo.dt_checkout : ffl-Э dbo.dt_checkout Ф 3 ^ ^bo.dLdisplayoa Si - ^ dbo.dt_displayoa— I dbo.dt_dtoppropt I dbo.dt_dropuserc [^4I dbo.dt_generate< I dbo.dt_getobjwM I dbo.dt_gelob|witl ' dbo.dt_getproper ' dbo.dt_getproper ' dbo.dt_getproper i dbo.dt_getproper I dbo.dt_isunderso ' dbo.dtjsunderso I dbo.dt_removefrc ^.
Query 1: Query cost (relative to the batch): 0,00^ Query text: USE pubs
DBOPEN Cost: 0% Query 2: Query cost (relative to the batch): 100,00% Query text: SELECT TOP 10 au id, au lnarne, au fnaine FROM
SELECT Cost: 0%
H
Top Cost:
authors. aumtiind Cost: 100%
;g Estimated Execution Plan jfflJ Messages j Objects | И Templates
Query bat<STORAGE\TREL0N (8.0) STORAGE\Administrator"(53)
pubs ! 0:00:00
;0 r
I n 3, Col 1
iConnections: 2
Рис. З.2. Оценочный план исполнения запроса
U p g r a d e
W i z a r d
Мастер Upgrade Wizard предназначен для выполнения обновления баз данных SQL Server 6.5 до SQL Server 2000. В процессе обновления на SQL Server 2000 будут перенесены собственно данные, а также весь набор объектов обновляемой базы данных, включая хранимые процедуры, триггеры, правила, умолчания, ограничения целостности, представления. Кроме того, также окажутся перенесенными пользователи базы данных со всеми установленными правами доступа к объектам базы данных и т. д. Помимо этого, в процессе обновления также будут скопированы все настройки подсистемы репликации. Подробно мастер обновления Upgrade Wizard будет рассмотрен в главе 5. Import and Export Data Этот инструмент является ничем иным, как мастером импорта/экспорта данных, предназначенным для создания пакета DTS, который будет выполнять копирование информации между двумя источниками данных. Отличительной особенностью мастера является простота конфигурирования процесса копирования данных.
38
Часть I. Архитектура SQL Server 2000
К недостаткам использования мастера относится невозможность обработки более двух источников данных, а также определения сложных преобразований и отношений предшествования. Кроме того, большая часть возможностей DTS, например отправка сообщений по электронной почте, будет недоступна. Тем не менее, несомненным достоинством использования мастера является легкость решения простых задач. Если необходимо закачать в таблицу базы данных информацию из файла MS Excel, то возможностей мастера будет вполне достаточно. Таким образом, даже неопытные пользователи смогут выполнять основные операции обмена данными. Подробно работа с мастером, а также другие методы создания пакетов DTS, будут рассмотрены в главе П.
Client Network Utility и Server Network Utility Наличие протокола не достаточно для сетевой работы SQL Server 2000. Для того чтобы клиенты смогли установить соединение с сервером, как на клиенте, так и на сервере, необходимо добавить специальные сетевые библиотеки (Network Library). Эти библиотеки реализованы в виде динамически подключаемых библиотек (DLL, dynamic link library) и подключаются к операционной системе. Библиотека расширяет базовые возможности протокола и является как бы надстройкой над ним, выполняющей различные сетевые операции по обмену данными между клиентом и сервером, для чего используются механизмы IPC. Библиотеки можно инсталлировать как в процессе установки SQL Server 2000, так и позже. Если требуется добавить или удалить библиотеку уже после установки, то для этого нужно использовать утилиту Server Network Utility, устанавливающуюся вместе с SQL Server 2000. С помощью этой библиотеки конфигурируются сетевые параметры собственно сервера. То есть указываются сетевые библиотеки, с помощью которых пользователи смогут обращаться к серверу. Однако со стороны клиента также требуется присутствие сетевых библиотек и конфигурирование их для работы с сервером. Конфигурирование клиента выполняется с помощью утилиты Client Network Utility, добавляемой при установке инструментов администрирования SQL Server. Сконфигурированные параметры будут использоваться для работы Enterprise Manager, Query Analyzer и других инструментов администрирования. Чтобы гарантировать, что взаимодействие клиента с сервером окажется успешным, следует обеспечить использование клиентом хотя бы одной библиотеки, поддержка которой разрешена на сервере, а также при необходимости соответствующим образом указать ее свойства. Подробно конфигурирование сетевых библиотек будет рассмотрено в главе 6.
Утилиты командной строки Помимо уже рассмотренных утилит, имеющих графический интерфейс, в SQL Server 2000 существует набор утилит командной строки, с помощью которых также можно выполнять различные задачи. Некоторые из этих утилит исполь-
Глава 3. Использование SQL Server 2000
39
зуются сервером автоматически и являются скорее частью ядра SQL Server 2000, чем собственно утилитами. В табл. 3.1 приведен обзор утилит командной строки. Указанные утилиты автоматически копируются мастером установки в каталог Binn установочного каталога SQL Server 2000, но могут быть запущены из любого другого каталога, т. к. мастер соответствующим образом конфигурирует переменную окружения PATH. Мы не будем рассматривать полный синтаксис утилит, ограничившись лишь приведением краткого их описания. Замечание Параметры утилит командной строки чувствительны к регистру, в котором вы их набираете. В некоторых ситуациях параметры, набранные в разных регистрах, могут привести к выполнению различных действий. Таблица 3.1. Утилиты командной
строки
Имя утилиты
Краткое описание
bcp.exe
Программа массивной закачки (Bulk Copy Program). Используется для обмена данными между текстовыми файлами и таблицами базы данных. Подробно работа с этой утилитой будет рассмотрена в главе 28
console.exe
С помощью этой утилиты можно просматривать сообщения, выдаваемые сервером при создании и восстановлении резервных копий
dtsrun.exe
Эта утилита предназначена для управления пакетами DTS и позволяет запускать, удалять, просматривать и перезаписывать их. Работает с пакетами, сохраненными в структурированных файлах СОМ, в SQL Server 2000 или в структурах службы метаданных
dtswiz.exe
Является ничем иным, как мастером создания пакета DTS (DTS Import/Export Wizard)
isql.exe
Это устаревшая утилита, использующая технологию DB-Library. Представляет собой интерфейс для выполнения команд TransactSQL, системных хранимых процедур или файлов с командами. В SQL Server 2000 в распоряжении пользователей имеется гораздо более мощный интерфейс — Query Analyzer
isqlw.exe
Эта программа является ничем иным, как Query Analyzer
itwiz.exe
Утилита для доступа к возможностям мастера Index Tuning Wizard в режиме командной строки. Отметим, что мастер может быть запущен и в виде графического инструмента, что, безусловно, гораздо удобнее
makepipe.exe
Используется совместно с утилитой readpipe и предназначена для тестирования работы именованных каналов
odbccmpt.exe
С помощью этой утилиты можно разрешить или запретить обеспечение совместимости конкретного приложения (исполняемого файла) с SQL Server 6.5 при работе с ODBC
40
Часть 1. Архитектура SQL Server 2000 Таблица 3.1
(продолжение)
Имя утилиты
Краткое описание
odbcping.exe
Предназначена для проверки возможности установления соединения с сервером SQL Server 2000 с использованием ODBC
osql.exe
Это устаревшая утилита, использующая технологию ODBC. Представляет собой интерфейс для выполнения команд Transact-SQL, системных хранимых процедур или файлов с командами
rebuildm.exe
Используется для перестроения системной базы данных M a s t e r
readpipe.exe
Эта утилита позволяет протестировать работу именованных каналов. Используется совместно с утилитой makepipe.exe
distrib.exe
Является ничем иным, как агентом подсистемы репликации Distributor Agent. Обычно запускается службой SQLServerAgent. Однако может быть запущена и вручную. После запуска постоянно находится в системе в качестве процесса
logread.exe
Агент Log Reader Agent, используемый при работе с репликацией транзакций. Также обычно запускается службой SQLServerAgent. Однако может быть запущена и вручную. После запуска постоянно находится в системе в качестве процесса
replmerg.exe
Агент Merge Agent, используемый при работе с репликацией сведением. Также обычно запускается службой SQLServerAgent. Однако может быть запущена и вручную. После запуска постоянно находится в системе в качестве процесса
snapshot.exe
Агент Snapshot Agent, активно используемый при работе с репликацией моментальных снимков и для подготовки первоначального набора данных для других типов репликации. Также обычно запускается службой SQLServerAgent. Однако может быть запущена и вручную. После завершения работы обычно выгружается из памяти
scm.exe
Эта утилита предназначена для управления работой служб (запуск, приостанов и останов) SQL Server 2000 в режиме командной строки
sqlagent.exe
Является ничем иным, как службой SQLServerAgent. Обычно запускается операционной системой в качестве службы, но также может быть запущена из командной строки в качестве обычного приложения
sqldiag.exe
С помощью этой утилиты можно получить информацию из журналов SQL Server 2000 для последующего анализа. Обычно применяется, когда графические инструменты недоступны. Информация сохраняется в текстовом файле (по умолчанию это файл SQLdiag.txt в каталоге Log)
sqlmaint.exe
Предназначена для осуществления сопровождения базы данных в режиме командной строки. Позволяет создавать резервные копии, усечение журнала транзакций и т. д. По завершении работы генерирует отчет, который может быть сохранен в обычном текстовом файле, как HTML-страница или отправлен по электронной почте
sqlservr.exe
Реализует ядро SQL Server 2000, точнее службу MSSQLServer. Обычно запускается операционной системой в качестве службы, но может быть запущена вручную в качестве приложения
Глава 3. Использование SQL Server 2000
41 Таблица 3.1 (окончание)
Имя утилиты
Краткое описание
sqlftwiz.exe
Позволяет использовать возможности мастера Full-Text Indexing Wizard, работая с ним в режиме командной строки
vswitch.exe
Предназначена для переключения различных версий (точнее с 6.x на 8.0) SQL Server, установленных на одном компьютере
Мастера Как уже было сказано ранее в этой главе, многие задачи могут быть выполнены с помощью средств Transact-SQL, с использованием графического интерфейса Enterprise Manager и посредством специальных мастеров (wizards). Мастера являются наиболее простым способом выполнения административных задач. Недостатком мастеров являются достаточно ограниченные возможности. Однако к некоторым из мастеров сказанное не относится. К ним можно отнести мастеров конфигурирования подсистемы репликации, что является довольно сложным процессом. Например, создать публикацию средствами Enterprise Manager нельзя. Нужно будет воспользоваться соответствующим мастером. Конечно, всегда можно воспользоваться средствами Transact-SQL. Но иногда это настолько сложно и трудоемко, что лучшим решением будет использование мастера. В табл. 3.2 приведен список основных мастеров SQL Server 2000. Помимо перечисленных существует еще несколько дополнительных, использующихся лишь в определенных условиях. Мы не будем приводить их, ограничившись рассмотрением мастеров общего назначения. Для запуска мастера следует в панели инструментов Enterprise Manager нажать кнопку Run a wizard. В ответ откроется окно Select Wizard, с помощью которого можно будет выбрать необходимый мастер. Таблица 3.2. Мастера SQL Server Название
Описание
Backup Wizard
Применяется для создания резервных копий базы данных
Failover Setup Wizard
Предназначен для создания кластера
Configuring Publishing and Distribution Wizard
Используется при работе с подсистемой репликации и предназначен для конфигурирования сервера в качестве издателя и дистрибьютора
Create Alert Wizard
Позволяет создать оповещение
Create Database Wizard
Выполняет создание базы данных
Create Diagram Wizard
Служит для создания диаграммы базы данных
Create Index Wizard
Предназначен для создания индекса
Create Job Wizard
Используется для создания задания
Часть 1. Архитектура SQL Server 2000
42
Таблица 3.2 (окончание) Название
Описание
Create New Data Source Wizard
Инсталлирует ODBC-драйвер и ODBC-источник данных
Create Login Wizard
Создает учетную запись SQL Server для пользователя
Create Publication Wizard
Создает публикацию для последующей репликации
Create Stored Procedure Wizard
Создает хранимую процедуру
Create Trace Wizard
Создает профиль трассировки для утилиты Profiler
Create View Wizard
Создает представления
Create Maintenance Plan Wizard
Создает файл поддержки
Disable Publishing and Distribution Wizard
Удаляет издателя и дистрибьютора для репликации
DTS Export Wizard
Создает DTS-пакет для экспорта данных из SQL Server
DTS Import Wizard
Создает DTS-пакет для импорта данных в SQL Server
Full-text Indexing Wizard
Определяет полнотекстовые индексы
Index Tuning Wizard
Оптимизирует индексы
Make Master Server Wizard
Устанавливает мастер-сервер
Make Target Server Wizard
Устанавливает сервер-приемник
Register Server Wizard
Облегчает процесс регистрации серверов в Enterprise Manager
Pull Subscription Wizard
Конфигурирует подписчика для вытягивания данных
Push Subscription Wizard
Конфигурирует подписчика с выталкивающим издателем
SQL Server Upgrade Wizard
Позволяет обновить базы данных SQL Server 6.x
Web Assistant Wizard
Создает Web-задачи
Работа с тем или иным мастером будет рассмотрена в предлагаемых главах книги при описании соответствующих операций администрирования.
ЧАСТЬ II. УСТАНОВКА SQL SERVER 2000 Глава 4. Подготовка к установке SQL Server 2000 Глава 5. Переход на SQL Server 2000 с предыдущих версий Глава 6. Установка SQL Server 2000
Глава 4
Подготовка к установке SQL Server 2000 Прежде чем приступить к установке SQL Server 2000, необходимо получить хотя бы поверхностное представление о том, как проходит установка и к каким последствиям приведет задание того или иного параметра. В последнее время корпорация Microsoft при разработке программ придерживается стратегии снижения общей стоимости владения (Total Cost of Owner) системой. SQL Server 2000 не является исключением и это видно уже при установке сервера. Процесс установки построен таким образом, что инсталляцию сервера может выполнить даже пользователь, никогда ранее не работавший с SQL Server 2000. Выбрав типичную (typical) установку, пользователь избавит себя от указания большей части параметров конфигурации сервера, значения которых будут назначены автоматически мастером установки. Необходимо будет лишь выбрать каталог для размещения и указать небольшое количество других интуитивно понятных параметров. Если параметры по умолчанию не удовлетворяют вашим требованиям, то для конфигурирования сервера произвольным образом можно воспользоваться заказной (custom) установкой. В этом случае необходимо четко представлять, для чего предназначена та или иная опция, и каким образом изменится поведение сервера при установке того или иного значения параметра конфигурации. Замечание Неверная настройка некоторых опций может привести к некорректной работе сервера. Изменение значений части опций возможно только при переустановке сервера или после перестроения системных баз данных. Особенно важно выбрать правильную конфигурацию сервера, если предполагается взаимодействие сервера с другими SQL Server 2000. При эксплуатации SQL Server 2000 на больших предприятиях с множеством установок SQL Server 2000 обычно разрабатывается определенный стандарт на конфигурацию сервера. В дальнейшем это позволяет избежать множества проблем при взаимодействии серверов. Дело в том, что различие некоторых параметров конфигурации приводит к тому, что сервера не могут даже соединиться друг с другом, не говоря уже о выполнении запросов и выборке данных. В следующей главе будет подробно рассмотрено обновление предыдущих версий SQL Server до SQL Server 2000. В главе 6 рассмотрим использование мастера Setup Wizard, с помощью которого собственно и выполняется установка SQL Server 2000.
46
Часть II. Установка SQL Server 2000
Данная же глава содержит скорее теоретическую информацию о процессе установки, которая должны помочь грамотно подготовиться к инсталляции SQL Server 2000 и понять назначение того или иного параметра. Это, а также знание принципов работы модулей SQL Server 2000, поможет избежать затруднений и неприятностей при установке и последующей эксплуатации сервера.
Выбор редакции Прежде чем приступить собственно к процессу установки, необходимо приобрести SQL Server 2000, который поставляется в нескольких вариантах — редакциях (edition). Каждая редакция предназначена для решения определенного круга задач, обычно различающихся масштабами. Соответственно, одна редакция может быть предназначена для однопроцессорных настольных компьютеров с небольшим количеством ресурсов и используемых в качестве однопользовательской системы, тогда как другая редакция будет устанавливаться на кластерных системах, включающих до четырех 32-процессорных серверов с громадными объемами ресурсов. Каждая из редакций имеет свои ограничения на количество пользователей, которые могут одновременно работать с SQL Server 2000. Кроме того, некоторые редакции работают только под определенными операционными системами. Наконец, редакции могут значительно отличаться по цене. Прежде чем покупать SQL Server 2000, следует взвесить требования вашей организации, в том числе и в будущем, и выбрать редакцию, лучшим образом удовлетворяющую ваши нужды. SQL Server 2000 поставляется в следующих редакциях: СП Standard Edition. Используется для небольших организаций или отделов. SQL Server 2000 Standard Edition является базовой редакцией, возможности которой устроят большую часть пользователей. Она может использовать до четырех процессоров при максимальном объеме оперативной памяти 2 Гбайта. • Enterprise Edition. Используется для построения промышленных систем, поддерживающих технологию кластеризации и обеспечивающих высокий уровень масштабируемости. SQL Server 2000 Enterprise Edition идеально подходит для построения больших Web-сайтов, систем оперативной обработки транзакций (OLTP, Online Transaction Processing), хранилищ данных (Data Warehousing System) и систем поддержки принятия решений (DSS, Decision Support System). Редакция Enterprise Edition может использоваться на высокопроизводительных промышленных серверах с количеством процессоров до тридцати двух и объемом оперативной памяти до 64 Гбайт. Кроме того, эта редакция обеспечивает построение кластеров. В SQL Server 2000 Enterprise Edition возможно построение четырехузловых отказоустойчивых кластеров. •
Desktop Engine. Эта редакция может быть использована независимыми разработчиками для встраивания ее в разрабатываемые системы, включает в себя только механизмы (engine) обработки пользовательских запросов и не включает графические инструменты администрирования, электронной документации Books Online, примеров кода (code samples) и библиотек разработки, а
Глава 4. Подготовка к установке SQL Server 2000 также поддержки репликации сведением. Однако при необходимости для администрирования этой редакции можно использовать графические инструменты любой другой редакции. В обычной же ситуации все операции администрирования должны выполняться разработанным клиентским приложением. Редакция Desktop Engine поставляется в виде модулей Windows Installer, которые могут быть включены в инсталляционный пакет. SQL Server 2000 Desktop Engine поддерживает все API, доступные из других редакций. Эти API также могут быть использованы для администрирования сервера. Хотя большей частью Desktop Engine обеспечивает ту же функциональность, что и другие редакции, все же она имеет некоторые ограничения. В частности, не реализовано применение распараллеливания запросов, индексированных представлений и некоторых других функций, часто используемых на больших промышленных серверах. Кроме того, если на сервере одновременно выполняется более пяти пакетов команд, то производительность их выполнения снижается. Отличительной чертой редакции Desktop Engine является также и то, что она не требует клиентских лицензий доступа (CAL, Client Access Licenses). Все описанные характеристики делают SQL Server 2000 Desktop Engine идеальным выбором при создании систем со встроенными хранилищами данных и при работе с данными в режиме off-line. П Windows СЕ Edition. Данная версия SQL Server 2000 используется при работе с устройствами и приложениями Microsoft Windows СЕ. Работа с этой редакцией ничем не отличается от работы с другими редакциями. Поддержка репликации позволяет копировать данные с мощных корпоративных серверов баз данных, использующих SQL Server 2000 Enterprise Edition или SQL Server 2000 Standard Edition. • Personal Edition. Этой редакции свойственны те же ограничения функциональности, что и для редакции Desktop Engine, однако в распоряжении пользователя имеются графические инструменты администрирования, такие как Enterprise Manager, Query Analyzer и другие. Редакция Personal Edition обычно используется при построении однопользовательских систем или систем с небольшим количеством пользователей. Как и в Desktop Engine, при превышении пяти одновременно выполняемых пакетов команд происходит резкое снижение производительности сервера. SQL Server 2000 Personal Edition также часто используется на переносных компьютерах и поддерживает до двух процессоров. Кроме того, если необходимо установить SQL Server 2000 на компьютер с "не серверной" операционной системой, такой как Windows 98, Windows NT Workstation 4.0 или Windows 2000 Professional, то Personal Edition будет лучшим выбором. Размер баз данных не ограничивается. • Developer Edition. Редакция включает все возможности Enterprise Edition, но предназначена исключительно для разработки и тестирования приложений. То есть ее нельзя использовать в качестве промышленного сервера. П Evaluation Edition. Эта редакция распространяется свободно и доступна для скачивания с Web-сайта Microsoft. Она является оценочной (или пробной) версией Enterprise Edition. To есть ее можно использовать для близкого знакомства с SQL Server 2000 и обучения работе с ним, но нельзя применять для 3 Sat 83
47
48
Часть II. Установка SQL Server 2000
построения промышленных баз данных. Срок эксплуатации SQL Server 2000 Evaluation Edition составляет 120 дней с момента установки. Как видно из приведенного списка, SQL Server 2000 поставляется в нескольких вариантах, возможности которых могут значительно отличаться. Кроме того, на рынке имеется довольно большое количество операционных систем семейства Windows и на каждую из них возможна установка только определенных редакций SQL Server 2000. В табл. 4.1 приведена информация о возможности установки каждой из редакций на ту или иную операционную систему. Таблица 4.1. Соотношение редакций и операционных систем Операционная система
Enterprise Edition
Standard Edition
Personal Edition
Developer Edition
Desktop Engine
Windows Enterprise CE Edition Evaluation Edition
Windows 2000 Datacenter
+
+
+
+
+
_
+
Windows 2000 Advanced Server
+
+
+
+
+
_
+
Windows 2000 Server
+
+
+
+
+
_
+
Windows 2000 Professional
-
-
+
+
+
-
-
Windows NT Server 4.0 Enterprise Edition
+
+
+
+
+
_
+
Windows NT Server 4.0
+
+
+
+
+
_
+
Windows NT Workstation 4.0
—
-
+
+
+
_
_
Windows 98
-
—
+
Desktop Engine
+
Windows CE
В табл. 4.2 приведена информация о поддержке той или иной редакцией различных механизмов SQL Server 2000, связанных с использованием баз данных (БД). Таблица 4.2. Возможности редакций при работе с БД Возможность
Поддержка множества инсталляций
Enter- Standard prise Edition Edition
Personal Edition
Developer Desktop Windows Enterprise Edition Engine CE Edition Evaluation Edition
Глава 4. Подготовка к установке SQL Server 2000
49
Таблица 4.2 (окончание) Возможность
Enterprise Edition
Standard Edition
Personal Edition
Developer Desktop Windows Edition Engine CE Edition
Enterprise Evaluation Edition
4-узловой кластер
+
—
—
+
—
—
Управление кластером в Enterprise Manager
+
—
—
+
—
—
Пересылка журнала
+
—
—
+
—
—
+
Распараллеливание DBCC
+
—
—
+
—
—
+
Распараллеливание CREATE INDEX
+
—
—
+
—
—
+
Расширенное опережающее чтение и сканирование
+
—
—
+
—
—
+
Индексированные представления
+
—
—
+
—
—
+
Утилиты администрирования
+
+
+
+
—
—
+
Полнотекстовый поиск
+
+
+
+
—
—
+
+ •
+
В табл. 4.3 приведена сводная информация о поддержке репликации каждой из редакций SQL Server 2000. Таблица 4.3. Поддержка Тип репликации
репликации
Developer Desktop Windows Edition Engine CE Edition
редакциями
Enterpri seEdition
Standard Edition
Personal Edition
Enterprise Evaluation Edition
Репликация моментальных снимков
+
+
+
+
+
—
+
Репликация транзакций
+
+
Только подписчик
+
Только подписчик
—
+
50
Часть II. Установка SQL Server 2000 Таблица 4.3 (окончание)
Тип репликации
Enterpri Standard se Edi- Edition tion
Personal Edition
Developer Edition
Desktop Windows Engine CE Edition
Репликация сведением
Enterprise Evaluation Edition
Только анонимный подписчик
Поддержка подписчиков незамедлительного обновления
Только подписчик
Очередь обновляемых подписчиков
Только подписчик
Требования к системе Как и при установке любых других продуктов, прежде чем начать установку SQL Server 2000, необходимо выполнить некоторые подготовительные операции. Подготовку к установке можно условно разбить на три фазы: •
проверка аппаратного обеспечения;
•
подготовка программного обеспечения;
•
конфигурирование учетных записей служб SQL Server 2000.
В следующих разделах подробно рассмотрен каждый из этапов подготовки. Знакомство с этими разделами избавит вас от выполнения множества инсталляций, потерпевших неудачу из-за невыполнения тех или иных требований.
Требования к аппаратному обеспечению SQL Server 2000 является довольно требовательной СУБД по отношению к аппаратной части компьютера. Однако эти требования высоки лишь с точки зрения обыкновенного пользователя. Если же SQL Server 2000 предполагается использовать на промышленных многопроцессорных серверах, то эти требования кажутся незначительными. В табл. 4.4 приведен список минимальных требований к аппаратной части компьютера, выдвигаемых SQL Server 2000. Цифры, приведенные в таблице, практически не отличаются от аналогичных показателей SQL Server 7.0. Это связано с тем, что ядро SQL Server 2000 осталось в основном тем же, что и в SQL Server 7.0.
Глава 4. Подготовка к установке SQL Server 2000
51 Таблица 4.4. Требования к компьютеру
Характеристика
Минимальные требования
Рекомендуемые требования
Процессор
Pentium 166, Pentium Pro
Pentium II или Pentium III
Оперативная память
32 Мбайт (64 Мбайт для Enterprise Edition)
64-128 Мбайт (128-256 Мбайт для Enterprise Edition)
Дисковая память
180 Мбайт: полная установка; 170 Мбайт: типичная установка; 65 Мбайт: минимальная установка; 90 Мбайт: установка только утилит администрирования; +50 Мбайт: установка OLAP; +12 Мбайт: установка English Query
Рекомендуемые требования аналогичны минимальным, но необходимо добавить размеры пользовательских баз данных, а также учесть возможность роста системных баз данных
Хотя требования и называются минимальными, все же допускается установка SQL Server 2000 и на системах более низкого уровня. Но вряд ли стоит планировать серьезную работу на такой системе. Для нормальной работы рекомендуется система класса Pentium II. Рекомендуемые требования приведены в расчете на небольшие системы. При работе с большими объемами данных эти показатели могут возрасти на несколько порядков. Например, редакция SQL Server 2000 Enterprise Edition допускает использование серверов с тридцатью двумя процессорами и объемом памяти до 64 Гбайт. Замечание Приведенные в таблице цифры в большей степени касаются требований самого SQL Server 2000. Помимо этих цифр следует учесть требования операционной системы, которые могут существенно отличаться. Например, операционная система Windows 98 выдвигает сравнительно низкие требования к ресурсам компьютера, в частности объему оперативной памяти (порядка 8—16 Мбайт) и производительности процессора, тогда как операционная система Windows 2000 Advanced Server для нормальной работы требует 128 Мбайт оперативной памяти. Этот момент необходимо обязательно учесть при выборе компьютера, на котором будет устанавливаться SQL Server 2000.
Требования к программному обеспечению После того, как вы убедились в том, SQL Server 2000 будет эффективно работать на вашем компьютере, необходимо установить соответствующее программное обеспечение. Первым этапом подготовки программного обеспечения является установка операционной системы. В табл. 4.1 приведена информация о возможности установки той или иной редакции SQL Server 2000 на различные операционные системы семейства Windows. SQL Server 2000 может работать под управлением следующих операционных систем:
52
Часть II. Установка SQL Server 2000
• Windows 98; О Windows NT Workstation 4.0; • Windows NT Server 4.0; О Windows 2000 во всех ее редакциях.
Замечание Как видно, SQL Server 2000 не будет работать под управлением операционной системы Windows 95. Однако под управлением этой операционной системы могут работать клиентские приложения, устанавливающие соединение с SQL Server 2000. При установке SQL Server 2000 на компьютер под управлением операционной системы Windows NT Server или Windows NT Workstation требуется установка Service Pack версии 5.0 или более поздней. Кроме того, для просмотра справочной системы SQL Server Books Online и использования консоли управления Microsoft Management Console (MMC) также требуется установка Internet Explorer версии 5.0 (или более поздней). При размещении SQL Server 2000 на компьютере с операционной системой Windows 2000 не требуется устанавливать никакого дополнительного программного обеспечения, т. к. в эту операционную систему уже встроен Internet Explorer 5.0. Если планируется применение SQL Server в качестве многопользовательского сервера баз данных, то в операционной системе нужно также установить соответствующие сетевые протоколы. Программа установки SQL Server 2000 не выполняет установки сетевых протоколов, поэтому эта часть работы должна быть выполнена вручную. До тех пор, пока не будут установлены нужные сетевые протоколы, пользователи не смогут использовать их для работы с SQL Server 2000. SQL Server 2000 поддерживает все основные протоколы Windows 2000: NetBEUI, IPX/SPX и TCP/IP. Кроме того, возможна работа по протоколам AppleTalk ADSP, Banyan VINES и некоторым другим редко используемым протоколам. Более подробно использование сетевых протоколов будет рассмотрено в разд. "Сетевые компоненты"далее в этой главе. Как уже говорилось, в SQL Server 2000 была добавлена поддержка технологии XML. Однако доступ к данным с применением этой технологии осуществляется средствами Microsoft Internet Information Server (IIS). Если предполагается, что пользователи будут использовать технологию XML, то необходимо дополнительно установить и Internet Information Server. Этот продукт выдвигает дополнительные требования к ресурсам компьютера, т. е. для поддержки XML скорее всего потребуется установка дополнительной оперативной памяти.
Подготовка учетных записей Последний этап подготовки к установке заключается в создании учетных записей пользователей, под которыми будут запускаться службы SQL Server 2000. В принципе можно не создавать новые учетные записи, а использовать уже су-
Глава 4. Подготовка к установке SQL Server 2000
53
шествующие, например, администратора домена. Более того, учетная запись локальной системы задается при установке операционной системы и создавать ее не нужно. Каждая служба Windows NT и Windows 2000 может запускаться под своей собственной учетной записью. Служба будет иметь права доступа, предоставленные администратором учетной записи. Необходимо следить за тем, имеет ли учетная запись, под которой стартует служба, соответствующие права и разрешения на доступ к ресурсам операционной системы. Например, если на диске, куда установлен SQL Server 2000, существует файловая система NTFS и учетная запись, под которой стартует служба MSSQLServer, не имеет разрешений на доступ к файлам SQL Server 2000, то запуск и работа сервера будут невозможны. Замечание Данный раздел имеет отношение только к операционным системам семейства NT, в т. ч. и ко всем редакциям Windows 2000. В операционной системе Windows 98 не реализована возможность выполнения приложений в виде служб операционной системы. При запуске SQL Server 2000 под управлением операционной системы используется учетная запись текущего пользователя. Как следствие, SQL Server 2000 будет иметь те же права доступа, что и пользователь, запустивший его.
Для запуска служб операционные системы семейства NT позволяют указывать три типа учетных записей: • Local System (локальная система). Учетная запись локальной системы предполагает запуск службы с правами операционной системы. Учетная запись локальной системы создается автоматически при установке операционной системы. Все действия по управлению этой учетной записью, в том числе и изменение пароля, выполняет сама операционная система. Даже администратор не может управлять ею. Учетная запись имеет права администратора и обычно по умолчанию имеет доступ .ко всем файлам. Однако в некоторых случаях все же требуется явно предоставить учетной записи доступ к тем или иным ресурсам. Если вы решили использовать для запуска SQL Server 2000 локальную учетную запись системы, то убедитесь, что она имеет полный доступ ко всем файлам и каталогам SQL Server 2000. • Local User (локальный пользователь). Учетные записи данного типа создаются отдельно на каждом компьютере, и область их действия ограничивается этим компьютером. При запуске SQL Server 2000 под учетной записью локального пользователя, не входящего в группу локальных администраторов, следует предоставить учетной записи полный доступ ко всем файлам и каталогам SQL Server 2000, а также разрешить ей регистрироваться локально и стартовать в качестве службы операционной системы. • User for Domain (пользователь домена). Учетные записи этого типа хранятся централизованно на контроллере домена (domain controller) Windows NT или Windows 2000 и доступны с любого компьютера, являющегося членом домена. Принципиальным отличием учетных записей пользователя домена является возможность работы в сети.
54
Часть II. Установка SQL Server 2000
Независимо от того, какой тип учетной записи используется для запуска служб SQL Server 2000, следует убедиться, что учетная запись, под которой стартует служба MSSQLServer, имеет следующие права доступа: П доступ и изменение файлов в папке \Program Files\Microsoft SQL Server\Mssql; П доступ и изменение файлов баз данных — mdf, ndf и ldf; • чтение и запись следующих ключей реестра: •
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer;
•
HKEY_LOCAL_N4ACHINE\System\CurrentControlset\Services\MSSQLServer.
Как уже говорилось ранее, каждая служба SQL Server 2000 может стартовать под собственной учетной записью. Но если нет особых на то причин, рекомендуется всегда конфигурировать запуск всех служб под одной и той же учетной записью. Хотя все службы и являются частью единого приложения, все же перед тем, как начать работу, они обязаны пройти проверку прав доступа подобно обычным пользователям. Если учетные записи разные, то необходимо следить, чтобы все они имели соответствующие права доступа. Основным компонентом является служба MSSQLServer. Все остальные компоненты (SQLServerAgent, Microsoft Search и MSDTC) устанавливают соединение с MSSQLServer. При этом учетные записи, под которыми стартуют службы SQLServerAgent и MSDTC, должны иметь соответствующие права и желательно быть включенными во встроенную роль сервера (fixed server role) sysadmin. Чтобы избежать проблем с правами доступа, советуют запускать все службы под одной учетной записью. Также рекомендуется предоставить учетным записям служб права администратора операционной системы, включив их в группу Domain Admins. Это даст возможность перезапуска сервера SQL Server 2000 и поможет избежать некоторых проблем с автоматическим выполнением заданий (jobs). Однако такой подход открывает потенциальную возможность взлома системы с использованием SQL Server 2000. Если вы хотите максимально обезопасить систему, то лучше потратить некоторое время на конфигурирование прав доступа. Замечание Служба Microsoft Search может стартовать только под локальной учетной записью системы. Для установления соединения со службой MSSQLServer она использует имя и пароль учетной записи, под которой стартует служба MSSQLServer.
Выбор типа учетной записи прежде всего обусловлен задачами, стоящими перед SQL Server 2000. Следует учитывать, что локальные учетные записи (как пользователя, так и системы) не имеют возможности выполнять большинство сетевых операций. Например, нельзя использовать локальные учетные записи, если необходимо выполнять следующие операции: • соединение со связанными или удаленными серверами; О репликацию данных между серверами; • обработку распределенных транзакций, обращающихся к сетевым источникам данных;
Глава 4. Подготовка к установке SQL Server 2000
55
П резервное копирование данных на сетевой диск; • отправление сообщений по электронной почте из SQL Server 2000; и другие операции. Во всех случаях, требующих наличия сети, необходимо использовать учетную запись пользователя в домене. Кроме того, если предполагается организовывать репликацию, то рекомендуется использовать на всех серверах одну и ту же учетную запись пользователя в домене для запуска служб SQL Server 2000. Это гарантирует, что не возникнет никаких конфликтов разрешений на доступ к ресурсам. Замечание Если учетные записи служб SQL Server 2000 сконфигурированы некорректно, то впоследствии можно изменить их параметры с помощью утилиты Services из набора утилит Control Panel (Панель управления) или с помощью интерфейса Enterprise Manager. Изменение параметров служб SQL Server 2000 будет рассмотрено в главе 8.
Создание учетных записей в Windows NT Для создания учетных записей в операционной системе Windows NT используется утилита User Manager for Domains (рис. 4.1), которую можно найти среди других административных утилит. Она может быть использована для управления как учетными записями пользователей домена, так и для управления учетными записями локальных пользователей. Чтобы иметь возможность создания пользователей, необходимо зарегистрироваться в домене (или на локальном компьютере) с правами администратора (Administrator) или оператора учетных записей (Account Operator). Для создания нового пользователя в меню User нужно выбрать команду NewUser. В ответ откроется диалоговое окно (рис. 4.2), в котором необходимо ввести имя учетной записи (Username), полное имя пользователя (Full Name) и его описание (Description). Кроме того, в полях Password и Confirm Password нужно ввести пароль учетной записи. После того, как все данные введены, не забудьте сбросить флажок User Must Change Password at Next Logon, иначе система потребует смены пароля при первой же регистрации. Кроме того, рекомендуется установить флажок Password Never Expires, что избавит от необходимости периодически менять пароль учетной записи. Осталось нажать кнопку Add и закончить создание нового пользователя. Но на этом конфигурирование учетной записи для службы SQL Server 2000 не заканчивается. Выполненных шагов достаточно для создания обычного пользователя, а для того, чтобы учетная запись могла быть использована для работы службы операционной системы, необходимо предоставить ей дополнительно соответствующие права. Права (rights) Windows NT — это набор специальных разрешений на выполнение особых действий. Права отличаются от разрешений Windows NT, с помощью которых лишь предоставляется или отклоняется доступ пользователей к ресурсам операционной системы. Права позволяют пользователям выполнять изменение системного времени, останов операционной системы, резервное копирование, работать с файлами и т. д.
Часть II. Установка SQL Server 2000
56 ч User Manager * \ \ Ш User View Policies Options Help Username Full Name Administrator Guest SQLAgentCmdExec SQLAgentCmdExec
Groups \@$ Administrators Backup Operators Guests Power Users Replicator SDLOCAL i&tSDfiEMOTE
Description Built-in account for administering the c< Built-in account for guest access to the SQLServer Agent CmdExec Job Step
{Description Members can fullv administer the comDuter/domain Members can bypass file security to back up files Users granted guest access to the computer/domain Members can share directories and printers Supports file replication in a domain SecurlD challenge for local logins SecurlD challenge for remote access logins
Рис. 4 . 1 . Утилита User Manager For Domains
Username: JAndrey Full Name:
[Фединандрей
description:
[Программист Центра информационных технологий
Password: Confirm Password: Г* User Must Change Password at Next Logon Iw' User Cannot Change Password Iv* Password Never Expires Г* Account Disabled
firoups
п ь Proe fli : Da jn il
Рис. 4.2. Диалоговое окно New User утилиты User Manager for Domains
Для учетных записей служб SQL Server 2000 необходимо предоставить следующие права: • действовать как часть операционной системы (Act as a part of the operating system);
Глава 4. Подготовка к установке SQL Server 2000
57
• регистрироваться в качестве службы операционной системы (Log on as a service); • изменять квоты процессов (Increase quotas); • заменять уровень маркера процесса (Replace a process level token). Для предоставления учетной записи определенных прав в меню Policies утилиты User Manager for Domains выберите команду User Rights. В ответ откроется диалоговое окно, показанное на рис. 4.3. В раскрывающемся списке Right нужно выбрать право, которое необходимо предоставить пользователю. В поле Grant To будет выведен список учетных записей, которым предоставлено выбранное право. Для добавления в список нового пользователя достаточно нажать кнопку Add.
User Rights Policy Computer: LIT Right: Grant To: Administrators Backup Operators Guests Power Users Users Г* Show Advanced U ser Rights
Рис. 4.З. Диалоговое окно User Rights Policy
После того, как всем учетным записям служб SQL Server 2000 будут предоставлены необходимые права, подготовку учетных записей можно считать законченной. Закройте утилиту User Manager for Domains и смело приступайте к установке SQL Server 2000.
Замечание Как уже говорилось, Windows 98 не поддерживает служб. При работе под управление этой операционной системы SQL Server 2000 производит эмуляцию служб Windows NT, поэтому конфигурирование учетных записей не требуется.
Создание учетных записей в Windows 2000 Управление учетными записями пользователей домена в Windows 2000 было заметно изменено по сравнению с Windows NT 4.0. Поэтому здесь отдельно приведена информация о создании учетных записей в Windows NT 4.0 и в Windows 2000. Для управления учетными записями пользователей домена Windows 2000 предназначена утилита (или, в терминологии Windows 2000, оснастка) Active Directory Users and Computers (рис. 4.4).
Часть II. Установка SQL Server 2000
58
$ Active Directory Users and Computers 1 <У Console
Window
j fiction View Tree |
•• .
.
j
•
..•.J.gj.xl -1<9J
J
g ] • Щ ; [g» Q [Щ,
j Users 65 objects
iQ Active Directory Users i-': Ujp matrix.khsu.khakas Щ C j Builtin ffi Q j Computers ЕЁ ls£j Domain Control ffi - P i ForeignSecurit> ; *lij Users
^J
ШИМвЯШМШвяШ
Help
j j
T,,.
User User User User SQL Server Agent CmdExec Job Step Account User User User This user account is used by Terminal Services, User User User User User User Account for the Visual Studio Analyzer server components User User User User Secur Enterprise certification and renewal agents Secur DNS clients who are permitted to perform dynamic updates on behalf of some oth Secur ... Designated administrators of the domain Secur All workstations and servers joined to the domain Secur ... All domain controllers in the domain Secur All domain guests Secur All domain users r i f t ^ i n n f l t p H г ^ Н т ю к г г л г л г ' ч nF t h f t ftnternri^R «tarir
•
Г
из
Name £3 Sergey Lifenko С Sergey Marnaev С Sergey Shilov С SQLAgentCmdExec С Terminal User С Timur Salikhov С TsInternetUser С Valentin Starkin 6 Vasiliy Cherkashin С Vlad Karpyuk С Vladimir Goltsov f ' VUE User С VUSR_STORAGE С Yuriy Miagkiy £2 Алексей С Пользователь конфе... б Пользователь отдел... f^Cert Publishers fJ^DnsUpdateProxy (JiDomain Admins JJJ Domain Computers (JfDomain Controllers {^Domain Guests £ $ Domain Users
Description
;
1
JLfd
Рис. 4.4. Оснастка Active Directory Users and Computers
Если же предполагается использовать локальную учетную запись, то можно воспользоваться папкой Local Users and Groups\Users оснастки Computer Management (рис. 4.5).
Замечание Если компьютер, на который предполагается установить SQL Server 2000, является контроллером домена Windows 2000, то использование локальных учетных записей пользователей на этом компьютере будет невозможно и соответствующие пункты оснастки Computer Management будут недоступны.
По сравнению с Windows NT 4.0 в операционной системе Windows 2000 для каждого из пользователей допускается хранение самой разнообразной информации, а не только имени, фамилии и краткого описания человека. Однако при работе с локальными пользователями (т. е. без использования Active Directory) объем хранимой информации о пользователе не так велик, как при работе с пользователями домена. Хотя количество информации и существенно различается, основные этапы создания и конфигурирования учетных записей пользователей для служб SQL
59
Глава 4. Подготовка к установке SQL Server 2000
Server 2000 в большей степени одинаковы. Рассмотрим создание учетной записи локального пользователя. Для этого в контекстном меню папки Local Users and Groups\Users необходимо выбрать команду New User. В ответ откроется диалоговое окно New User (рис. 4.6), содержащее набор элементов управления, с помощью которых задаются основные свойства учетной записи: • User name. Имя учетной записи, которое будет использоваться при регистрации пользователя в домене. Это имя может быть произвольным и не всегда отображать имя самого пользователя. • Full name. В этом поле указывается полное имя владельца учетной записи — обычно фамилия, имя и отчество, хотя никаких строгих ограничений нет. • Description. Данное поле предназначено для указания небольшого комментария, который помогает идентифицировать учетную запись или ее владельца. Часто в этом поле указывается название подразделения, которому принадлежит пользователь. Однако также можно ввести и любые другие сведения, например, домашний телефон и адрес электронной почты. О Password. В поле указывается пароль, который пользователь должен будет вводить при регистрации в домене. £Л Computer Management | fection View |; <)=• «• ' d3iilil ! Ц*| 1Щ> • d? Tree 1 Name j ^Administrator •§| Computer Management (LIT) Jp Guest - 'jjjj. System Tools $ SQLAgentCm,.. В £jj Event Viewer jhsl Application : ; • I ! ! \
;
>
. : Щ System В-Qi^ System Information Q2 System Summary • Ш C j Hardware Resources ; . L*V LJ Components ; Ш ill) Software Environment ! ffl u J Internet Explorer 5 i ^ Performance Logs and Alerts В ~ j ^ Shared Folders ; g^j Shares ' ^ Sessions : : ijy Open Files jjp Device Manager В *C Local Users and Groups
ШШШШШШ' Full Name
SQL AgentCmdExec
:
Q j Groups - *y Storage i • 1 Disk Management |^? Disk Defragmenter 5Э Logical Drives |{jj Removable Storage 3 :_^S Services and Applications S& WMI Control ^ g Services
Рис. 4.5. Оснастка Computer Management
J P.I.X.I
Descrp i to in Built-in account for admn is i tern i g the computer/doman i Built-in account for guest access to the computer/doman i SQL Server Agent CrndExec Job Step Account
Часть II. Установка SQL Server 2000
60
D Confirm password. В этом поле необходимо повторить тот же пароль, что и в предыдущем поле. Дублирование выполняется для гарантии того, что был указан верный пароль и не было ошибок при его вводе. В противном случае пользователь не смог бы зарегистрироваться в домене. • User must change password at next logon. Установка данного флажка требует от пользователя смены пароля при следующей регистрации в домене. П User cannot change password. Если администратор установит для пользователя этот флажок, то пользователь не сможет самостоятельно сменить пароль. Взамен он должен будет обратиться к администратору. Такой подход используется, если под одной и той же учетной записью работают несколько пользователей. В этом случае смена пароля одним из пользователей приведет к тому, что другие пользователи не смогут зарегистрироваться в домене. • Password never expires. Установка флажка позволяет избежать "устаревания" пароля. То есть пользователь не должен будет менять пароль через определенное время. Время жизни пароля устанавливается администратором домена и действует на всех пользователей. • Account is disabled. При пометке флажка учетная запись становится заблокированной и не может быть использована для регистрации в домене. Эта возможность часто применяется, если пользователь ушел в отпуск или находится в командировке. Блокирование учетной записи гарантирует, что она не сможет быть использована для несанкционированного доступа во время отсутствия ее владельца.
User name:
Alex
Full name:
(Нестеренко Алексей
.Description:
(Программист отдела разработки
Password: .Confirm password:
I
%? User must change password at next logon
Г :. - • Г :... 5; Г~ Account is disabled
Create
Close
Рис. 4.6. Окно New User
В принципе, для создания учетной записи достаточно ввести ее имя. После этого становится возможным нажатие кнопки Create, что приведет к созданию
61
Глава 4. Подготовка к установке SQL Server 2000
учетной записи. Однако если вы не уверены, что через пару месяцев вспомните, что это за учетная запись, то лучше добавить дополнительные комментарии в полях Full name и Description. Как и при конфигурировании учетных записей Windows NT 4.0, учетным записям Windows 2000 необходимо предоставить дополнительные права, чтобы использовать их для запуска служб SQL Server 2000. В Windows 2000 управление правами осуществляется отдельно от управления учетными записями. Для управления правами в пределах локального компьютера служит оснастка Local Security Policy (рис. 4.7), в которой необходимо выбрать папку Local Policies\User Right Assignment. № Local Security Settings
Щ G?
Tree |
IS IE Policy '
• i) Security Settings
Ли]Access this computer from the net..,
И :_Э Account Policies :-! CD Local Policies
-"SI Act as part of the operating system
MATRIX\Administrator
S!i]Add workstations to domain
Authenticated Users
;
Action
View
M ф>
"»
„RSflBack up files and directories Si Ш Audit Policy Й СЭ User Rights Assigt |Щ]В .pass traverse checking ffi CM Security Options jHJ] Change the system time ffl C_J Public Key Policies .RjyCreate a pagefile S -J|, IP Security Policies on $ 3 Create a token object I
j Local Setting MATRIX\IWAM_ST...
j Effective Setting
_^_
MATRIX\IU5R_STO...
Backup Operators,...
AdministratorSjBack...
Everyone, Users, Po...
Everyone, Administr,.,
Power Users,Admini...
Administrators,Serv...
Administrators
Administrators
Administrators
Administrators
Ш\ Create permanent shared objects !jo]Oebug programs „Яд] Deny access to this computer from.. у logon as a batch job щЩОепу logon as a service .So] Deny logon locally эд]Enable computer and user account.. iaS]Force shutdown from a remote sy...
Administrators Administrators
?!g\ Generate security audits Ш\ Increase quotas
Administrators
!.S^] Increase scheduling priority
Administrators
Administrators
Li»»] Load and unload device drivers
Administrators
Administrators
Ills] Lock pages in memory чу.) Log o n a 5 a batch job
MATRIX\Administrator MATRIXUWAM_ST...
„
i
±J
MATRIX\IUSR_STO... MATRIX^Administrator
15$ Log o n as a service
<
MATRIX\Administrat...
feliLog on locally
Print Operators,MA...
MATRMIU5R STO,,,
ЙЙ Manage auditing and security log
Administrators
Administrators
iSJi] Modify firmware environment values
Administrators
Administrators
Вд]Profile single process
Power Users,Admini...
Administrators
injjjjProfile system performance
Administrators
Administrators
ия] Remove computer from docking st.,
Users, Power Users,..,
Administrators
I
jj.
Рис. 4.7. Оснастка Local Security Policy
В правой части окна будет выведен список прав, которые могут быть выданы пользователям. Для присвоения пользователю того или иного права достаточно дважды щелкнуть на нем и в открывшемся диалоговом окне Local Security Policy Settings (рис. 4.8) нажать кнопу Add, а затем в появившемся окне (рис. 4.9) выбрать имя нужного пользователя.
62
Часть II. Установка SQL Server 2000
Local Security Policy Setting Log on locally
Local Policy Setting
Assigned To MATRIX\TslnternetUsef Server Operators Account Operators Backup Operators IUSR_STORAGE MATRIXWaso MATRIX\AdlN MATRIXWiton
о •
E ieetn Po c ilfyВectvS ig~ El El В
• • • El El PI
• • • П
Z.
Add.. If domain-level policy settings are defined, they override local policy settings.
OK
Cancel
Рис. 4 . 8 . Окно Local Security Policy Settings
•" Select Users or Groups Look in:
JJ2LJ
matrix, khsu. khakasnet. ru
Name } krbtgt iEygeniy Mamaev (emamaevC^matiix khsu.kha... Sergey Mamaev ([email protected]... Anton Bardin ([email protected]) Vladimir Goltsov [[email protected]... Dmitriy Udodov ([email protected]... Пользователь конференции (ConferencJJS...
In Folder matrix, khsu. khakasnet. ru^LJ sers matrix.khsu.khakasnet.ru/Users matrix, khsu. khakasnet. ruAJ sers matrix, khsu. khakasnet. ru/U sers matrix.khsu. khakasnet. ru/U sers matrix, khsu. khakasnet. ru/U sers matrix, khsu. khakasnet. ru/U sers
zl
ChecJs Names
Sergey Mamaev fDe i se@ l matrxi.khsu.khakasnet.ru!; Va ldm i ri Gotslov W l [email protected]]; Dmtirs Udodov [email protected]!; Evgenyi Mamaev femarnaev^matrxi.khsu.khakasnet.ru]
OK
Рис. 4 . 9 . Окно выбора пользователя
Cancel
Глава 4. Подготовка к установке SQL Server 2000
Замечание Если компьютер является членом домена Windows 2000, то локальные установки для прав доступа могут быть перекрыты установками, определенными администратором домена. Как и для Windows NT, чтобы учетная запись домена Windows 2000 могла использоваться для запуска служб SQL Server 2000, ей необходимо присвоить следующие права: • действовать как часть операционной системы (Act as a part of the operating system); •
регистрироваться в качестве службы операционной системы (Log on as a service);
•
изменять квоты процессов (Increase quotas);
• заменять уровень маркера процесса (Replace a process level token). После этого учетная запись может быть с успехом использована для старта учетных записей SQL Server 2000.
Выбор конфигурации сервера При установке SQL Server 2000 необходимо указать, какое сопоставление будет использоваться. Сопоставление (collation) определяет, каким образом будет выполняться хранение строковых значений, их сравнение и сортировка. В SQL Server 7.0 для управления этими параметрами при установке необходимо было указать набор символов (Character Set), порядок сортировки (Sort Order) и сопоставление Unicode (Unicode Collation). Конфигурирование перечисленных параметров могло озадачить любого пользователя. Кроме того, при выборе неверных значений для их изменения приходилось переставлять SQL Server 7.0 или выполнять перестроение системных баз данных. В обоих случаях становилось невозможным непосредственное использование пользовательских баз данных. Взамен приходилось перекачивать данные в файлы, создавать заново пользовательские базы данных со всеми их объектами и закачивать в них данные из файлов. Уход от подобного громоздкого конфигурирования сервера и замена его единственным параметром является позитивным шагом, позволившим упростить установку SQL Server 2000. При работе с текстовыми данными SQL Server 2000 может использовать однобайтовое (не Unicode) или двухбайтовое (Unicode) представление символа. При обработке каждого типа строковых данных сервер применяет различные алгоритмы. Сопоставление является своего рода набором правил, определяющих алгоритмы обработки строковых данных: •
порядок сортировки для данных не Unicode (char, varchar и t e x t ) ;
•
порядок сортировки для данных Unicode (nchar, nvarchar и n t e x t ) ;
О кодовая страница, используемая для хранения данных не Unicode.
63
64
Часть II. Установка SQL Server 2000
В следующих разделах будут рассмотрены темы, необходимые для более полного понимания принципов работы SQL Server 2000 и принципов хранения и обработки строковых данных.
Порядок сортировки Порядок сортировки определяет, каким образом SQL Server 2000 будет сортировать данные. Грубо говоря, порядок сортировки — это то, в какой последовательности должны располагаться символы. Самый простейший способ сортировки основывается на порядковом номере символа. Например, английская буква А имеет код 65, буква В — код 66, С — 67 и т. д. Если мы начнем упорядочивать набор символов С, В, G, В, F, А по возрастанию, то получим последовательность А, В, В, С, F, G. Более сложные типы упорядочивания работают с учетом символов национальных алфавитов, регистра символов и символов с диакритическими знаками. В некоторых кодировках национальные символы не всегда располагаются в алфавитном порядке. Если выполнять сортировку только на основе порядкового номера символа, то может быть получен неверный результат. Ситуация усугубляется, если в национальном наборе символов имеются символы с диакритическими знаками. Решением этой проблемы в SQL Server 2000 и является использование порядка сортировки (sort order).
Замечание В SQL Server 7.0 порядок сортировки применялся только к данным не Unicode, т. е. привязывался к кодовой странице, выбранной в процессе установки сервера. Правила упорядочивания данных Unicode определялись сопоставлением Unicode (Unicode Collation). В SQL Server 2000 понятие термина "сопоставление" было расширено. Теперь сопоставление определяет правила сортировки не только данных Unicode, но и данных не Unicode. По сравнению с SQL Server 7.0 количество видов сортировок в SQL Server 2000 несколько сократилось. Это произошло за счет изменения принципа управления порядком сортировки. Если в SQL Server 7.0 пользователь должен был выбрать конкретный метод сортировки, который определял чувствительность к регистру символьных данных и диакритическим маркерам, то в SQL Server 2000 пользователь должен явно разрешить применение того или иного механизма упорядочивания данных: П Binary — простейший тип сортировки, в основе которого лежит сравнение символов по их порядковым номерам в таблице символов. Этот тип сортировки обладает максимальной скоростью работы по сравнению с другими типами сортировки. •
Case sensitive — сортировка, чувствительная к регистру. При использовании данного режима SQL Server 2000 будет делать различие между символами нижнего и верхнего регистра. При выполнении сортировки сначала будут перечислены все символы верхнего регистра, а только затем нижнего.
D Accent sensitive — при использовании этого режима сервер будет делать различие между символами с различными диакритическими знаками.
Глава 4. Подготовка к установке SQL Server 2000
65
Каждый из приведенных методов упорядочивания является независимым от других. Для выбора того или иного метода предназначены флажки (check box). Если пользователь желает использовать какой-либо метод, то он должен установить соответствующий флажок. В противном случае этот флажок должен быть сброшен.
Кодовая страница Кодовая страница (code page) определяет, какие символы будут доступны пользователям при использовании символьных типов данных char, varchar и t e x t . Каждая кодовая страница содержит 256 символов. Такое ограничение на количество символов связано с тем, что для кодирования номера символа используется 1 байт, допускающий 256 состояний. Замечание Помимо термина кодовая страница также иногда употребляется термин набор символов (character set).
Обычно первая половина кодовой страницы (символы с кодом 0—127) постоянна во всех наборах символов. В ней содержатся английские буквы верхнего и нижнего регистра, цифры, восклицательный и вопросительный знаки, точка, запятая, скобки и другие символы, используемые во всех наборах. Вторая часть кодовой страницы (символы с кодом 128—255) содержит символы национальных алфавитов. Стандартная поставка SQL Server 2000 поддерживает 16 наборов символов (табл. 4.5), в том числе и кодовую страницу 1251, содержащую символы русского языка. Помимо стандартных наборов символов при необходимости можно установить дополнительные наборы. Для этого можно использовать утилиту Regional Settings из набора утилит Control Panel. Таблица 4.5. Стандартные наборы символов SQL Server 2000 Кодовая страница
Описание
437
Набор символов, используемый в США
850
Многоязычный набор символов
874
Тайский
932
Японский
936
Китайский (упрощенный)
949
Корейский
950
Китайский (традиционный)
1250
Набор символов Центральной Европы
1251
Русский набор символов
66
Часть II. Установка SQL Server 2000 Таблица 4.5 (окончание) Кодовая страница
Описание
1252
Стандартный набор символов Latini (ANSI)
1253
Греческий
1254
Турецкий
1255
Еврейский
1256
Арабский
1257
Балтийский
1258
Вьетнамский
Данные Unicode Применение для описания символа лишь одного байта ограничивает количество доступных символом значением 256. Это вызывает серьезные проблемы при работе с данными на множестве национальных языков. При использовании кодовых страниц вряд ли удастся в одном документе объединить данные на русском, вьетнамском и китайском языках. Если организация работает с документами только на одном языке, то особых проблем нет. Однако некоторые компании имеют множество филиалов в различных странах и нуждаются в возможности легко работать с текстовыми данными, представленными на различных национальных языках. Базы данных не являются исключением. Вполне возможно, что в одной и той же таблице пользователи должны будут хранить тексты на различных языках. Для удовлетворения этих требований в SQL Server 2000 имеется поддержка стандарта Unicode. Данный стандарт позволяет преодолеть ограничение в 256 символов, обычное при работе с кодовыми страницами. В стандарте Unicode для кодирования номера символа используется не 1 байт, как в кодовой странице, а 2 байта. Такой подход обеспечивает нормальную работу системы с 65 536 символами (2 1 6 ). Подобное значительное увеличение количества доступных символов позволяет одновременно корректно работать с символами различных национальных алфавитов. SQL Server 2000 имеет специальные типы данных для хранения символов Unicode: nchar, nvarchar и ntext. Замечание Поддержка этого стандарта появилась в Microsoft SQL Server версии 7.0. В более ранних версиях данного продукта стандарт не поддерживался.
Сопоставление SQL Server 2000 В трех предыдущих разделах были кратко рассмотрены кодовая страница, порядок сортировки и стандарт Unicode. Эти параметры определяют работу SQL
Глава 4. Подготовка к установке SQL Server 2000
67
Server 2000 с текстовыми данными. Однако, в отличие от SQL Server 7.0 в процессе установки SQL Server 2000 пользователь не указывает отдельно значение каждого из этих параметров. Взамен он должен выбрать то или иное сопоставление, в составе которого, как уже говорилось ранее, и определяются значения всех упомянутых параметров. Существенным изменением SQL Server 2000 по сравнению с SQL Server 7.0 стала возможность работы в пределах одной установки с объектами, использующими различные сопоставления. Например, каждый из столбцов одной и той же таблицы может иметь свое собственное сопоставление. Замечание В SQL Server 7.0 аналогичные параметры конфигурировались на уровне сервера и были одинаковы для всех столбцов всех таблиц баз данных, имеющихся на сервере. Изменение порядка сортировки, набора символов или сопоставления Unicode было связано с серьезными проблемами.
Возможность работы со множеством различных сопоставлений рождает определенные проблемы. Например, пользователь может в одном запросе обратиться к данным, использующим различные сопоставления и, как следствие, упорядоченным по различным правилам. В SQL Server 7.0 подобная ситуация вообще не могла возникнуть, т. к. запрещалось взаимодействие серверов с различными параметрами конфигурации (порядком сортировки, кодовой страницей и сопоставлением Unicode). Простейшим примером проблемы использования различных сопоставлений является взаимодействие двух серверов, один из которых является чувствительным к регистру, а другой нет. При выполнении запросов на сервере, чувствительном к регистру, необходимо в точности соблюдать регистр символов имен объектов. В противном случае будет выдано сообщение об ошибке обращения к несуществующему объекту. Например, если пользователь сервера, нечувствительного к регистру, обращается к таблице Authors этого же сервера по имени authors, то никаких проблем не возникнет. Но когда же он попытается обратиться к серверу, чувствительному к регистру, то подобное обращение будет ошибочным. Замечание При выполнении обновления баз данных SQL Server 7.0 до SQL Server 2000 для всех столбцов будет установлено одно и то же сопоставление.
В SQL Server 2000 существует два варианта управления сопоставлением, каждый из которых имеет свои особенности: • Сопоставление Windows — правила сравнения и хранения данных формируются на основе локальных установок, выбранных в Windows. Порядок сортировки задается отдельно. Управление сопоставлением подобным образом позволяет максимально сблизить механизмы обработки символьных данных операционной системы и SQL Server 2000. Для конфигурирования сопоставления будут использоваться параметры конфигурации операционной системы, установленные с помощью утилиты Regional Options из набора утилит Control Panel. Од-
68
Часть II. Установка SQL Server 2000
нако следует учитывать, что не все региональные установки отображаются в SQL Server 2000. Например, в SQL Server 2000 никаким образом не отображается установленный в операционной системе формат даты и времени, символ разделения целой и дробной части числа и некоторые другие. П Сопоставление SQL — в основном применяется для обеспечения совместимости с предыдущими версиями SQL Server. При использовании этого варианта пользователь в процессе установки должен будет выбрать один из доступных вариантов сопоставления. Например, сопоставление SQL с именем SQL_Latinl_General_CPl_CI_AS соответствует комбинации с порядком сортировки с учетом языка и без учета регистра (Dictionary Order, Case-insensitive), кодовой страницей 1252 (ISO Code Page 1252) и основным сопоставлением Unicode (General Unicode Collation). Однако в SQL Server 2000 не реализована поддержка всех комбинаций кодовой страницы, порядка сортировки и сопоставления Unicode, которые могли быть установлены в SQL Server 7.0. Повторим, что использование сопоставления SQL рекомендуется лишь для обеспечения совместимости с предыдущими версиями SQL Server. В остальных ситуациях советуют использовать сопоставление Windows. Предполагается, что операционная система была соответствующим образом настроена и к моменту установки SQL Server 2000 имеет необходимые параметры. В процессе инсталляции SQL Server 2000 программа установки не предпринимает никаких действий по управлению локальными установками операционной системы. Поэтому, если вы хотите использовать сопоставление Windows, то перед установкой SQL Server 2000 необходимо убедиться, что были выполнены все необходимые действия по конфигурированию операционной системы. В этой главе даны лишь основные сведения о сопоставлении. В других главах книги будет подробно рассмотрен выбор конкретного сопоставления, а также обмен данными, использующими различные сопоставления.
Сетевые компоненты Все возможности SQL Server 2000 раскрываются только при работе по сети. В принципе, SQL Server 2000 может прекрасно работать и без сети, но его возможности в этом случае довольно ограничены. Кроме того, в этом случае SQL Server 2000 сможет обрабатывать запросы только локальных клиентов. Тем самым область действия будет составлять всего один компьютер. Помимо того, что использование сети открывает возможность обращения пользователей к сетевым источникам данных, в том числе и к другим серверам SQL Server 2000, также становится доступной репликация данных, являющаяся мощным механизмом обмена данными между серверами SQL Server 2000, а при использовании специальных компонентов и СУБД сторонних производителей. Подробно подсистема репликации будет рассмотрена в главе 14. Кроме того, работа в сети расширяет и чисто технические возможности SQL Server 2000. Например, пользователи могут отправлять и принимать сообщения по электронной почте, а служба SQLServerAgent посылать уведомления операторам о нарушениях в работе сервера. Также становится возможным обращение к
Глава 4. Подготовка к установке SQL Server 2000
69
сетевым ресурсам при выполнении заданий SQLServerAgent или при выполнении операций резервного копирования и восстановления данных. Конечно, на этом список преимуществ от использования сети не ограничивается и его можно легко продолжить. В следующих разделах будет рассмотрено конфигурирование клиентов SQL Server, а также установка сетевых библиотек и протоколов.
Установка сетевых библиотек и протоколов Перед тем, как SQL Server 2000 сможет работать с использованием того или иного протокола, его необходимо установить. Сетевой протокол устанавливается на уровне операционной системы и доступен любому приложению, работающему на этом компьютере. Операционные системы класса Windows, под которыми может работать SQL Server 2000, имеют встроенную поддержку сети. В составе этих операционных систем имеется набор стандартных протоколов и служб, с помощью которых можно выполнять базовые сетевые операции работы с файлами и принтерами. Управление сетевыми протоколами может различаться при работе с различными операционными системами. Конфигурирование же сетевых библиотек практически не зависит от используемой операционной системы, т. к. эта операция осуществляется на уровне самого SQL Server 2000.
Установка сетевых протоколов в Windows NT 4.0 Для управления сетевыми протоколами операционной системы Windows NT 4.0 предназначена утилита Network (Сеть) (рис. 4.10), которую можно найти в Control Panel (Панель управления). Другой способ запуска этой утилиты заключается в использовании контекстного меню значка Network Neighborhood (Сетевое окружение), в котором нужно выбрать пункт Properties (Свойства). Для управления сетевыми протоколами необходимо перейти на вкладку Protocols. В области Network Protocols перечислены протоколы, уже установленные в операционной системе. Для добавления нового протокола необходимо нажать кнопку Add. В ответ откроется диалоговое окно Select Network Protocol (рис. 4.11) со списком доступных протоколов. Если нужного протокола в списке нет, то можно установить его с диска. Для этого служит кнопка Have Disk. В зависимости от того, какой именно устанавливается протокол, может потребоваться конфигурирование некоторых параметров. Наибольшим количеством параметров конфигурирования обладает протокол TCP/IP, предоставляющий максимальные возможности. При указании протокола NetBEUI не требуется конфигурировать никаких параметров, но возможности его ограничены. Замечание Вопросы достоинств, недостатков и возможностей тех или иных протоколов — это весьма обширная тема для обсуждения, достойная отдельной книги. Для получения дополнительной информации о протоколах следует обратиться к специализированной литературе.
Часть II. Установка SQL Server 2000
70
Identification | Services Protocols | Adapters | Bindings Network Protocols: TNWLink NetBIOS У TCP/IP Protocol
Click the Network Protocol that you want to install then click OK. It you have an installation disk for this component, click Have Disk. Remove
Properties
. Network Protocol:
Description:'"- --;••• • •-•• ~ : • An m i pe lmentato in of the IPX and SPX protocos l, whc ih are usedT" NetBEUI Protocol by the NetWare networks. 'if NWLn ik P I X/SPX Compab tie l Transport "if Pon i t To Pon i t Tunnen il g Protocol "if Streams Envrionment
Рис. 4.10. Утилита Network
Рис. 4 . 1 1 . Окно Select Network Protocol
Установка сетевых протоколов в Windows 2000 В операционной системе Windows 2000 установка и конфигурирование сетевых протоколов были несколько изменены по сравнению с Windows NT 4.0. Для управления настройками локальной сети используется окно Local Area Connection Properties (рис. 4.12). Для вызова этого окна необходимо в главном меню, вызываемом при нажатии кнопки Start (Пуск), выбрать пункт Settings (Настройки), а затем команду Network and Dial-up Connections. В ответ откроется окно Network and Dial-up Connections (рис. 4.13), в котором необходимо дважды щелкнуть на значке Local Area Connection, после чего откроется окно Local Area Connection Status (рис. 4.14). Теперь остается только нажать кнопку Properties и перейти к окну Local Area Connection Properties (см. рис. 4.12). В верхней части окна Local Area Connection Properties приведено название сетевой карты. Ниже указан список сетевых протоколов и служб, установленных для данной сетевой карты. Для работы SQL Server 2000 имеют значение только сетевые протоколы. На рис. 4.12 видно, что установлен только протокол TCP/IP. Если необходимо удалить протокол или службу, то нужно выделить их в списке и нажать кнопку Uninstall. Для добавления нового протокола или службы предназначена кнопка Install. После нажатия этой кнопки открывается диалоговое окно Select Network Component Type (рис. 4.15), которое предназначено для выбора типа устанавливаемого сетевого компонента.
Глава 4. Подготовка к установке SQL Server 2000
71
JLiiiJ
I mi f ii т т General j Connect using: Ш Intel(R) 82559 Fast Ethernet LAN on Motherboard
Configure
1
Components checked are used by this connection: ICIient for Microsoft Networks 0 ^JjiNetwork Load Balancing VJ ,4| File and Printer Sharing for Microsoft Networks У; T Internet Protocol (TCP/IP) Install..
Properties
Uninstall
Description — Allows your computer to access resources on a Microsoft network. Show icon in taskbar when connected OK
Cancel
g*l Network and Dial-up Connections File Edit View Favorites Tools Advanced Help w JJ : ^Search C^Folders ^History I Address |jii| Network and Dial-up Connections * Network and Dialup Connections This folder contains network connections for this computer, and a wizard to help you create a new connection, To create a new connection, click Make New Connection. To open a connection, click its icon. To access settings and components of a connection, right-click its icon and then click Properties. To identify your computer on the network, click Network Identification. To add additional networking components, click Add Network Components, Select an item to view its description, ji object(s);' •:
Make New Local Area Connection Connection
Рис. 4.12. Окно Local Area Connection Properties .jgjx).!
;.
:;
E 9
"З..^0...
Часть II. Установка SQL Server 2000
72 Рис. 4.13. Окно Network and Dial-up Connections Local Area Connection Status General ; • Connection • j Status: i Duration: | Speed:
Connected 03:32:05 10.0Mbps
r Activity
Sent ™~»-: '•'. i Packets:
Properht
321 241
Received 239 593
-' Click the type of network component you want to install:
^Service T" Protocol г Description
-;
-
j A client provides access to computers and files on i the netwofk you are connecting to.
disable
Add..
Close
Cancel
Рис. 4.15. Окно Select Network Component Type
Рис. 4.14. Окно Local Area Connection Status
Нас интересует добавление протокола, поэтому необходимо выбрать значение Protocol, а затем нажать кнопку Add. После этого откроется диалоговое окно Select Network Protocol (рис. 4.16), в котором собственно и выбирается новый протокол. Select Network Protocol .-•.-.••• Click the Network Protocol that you want to install, then click OK. If you have «J> an installation disk for this component, click Have Disk, Network Protocol: AppleTalk Protocol • DLC Protocol NetBEUI Protocol Network Monitor Driver NWLn i k IPX/SPX/NetBIOS Compatb i le Transport Protocol
Have Disk..
"OK"
Cancel
Рис. 4.16. Окно Select Network Protocol
Как и при работе в Windows NT, при установке сетевых протоколов в Windows 2000 также может потребоваться конфигурирование некоторых пара-
Глава 4. Подготовка к установке SQL Server 2000
73
метров. Принципы настройки сетевых протоколов не претерпели значительного изменения. Также наибольшим количеством параметров конфигурирования обладает протокол TCP/IP, а при использовании протокола NetBEUI не требуется конфигурировать никаких параметров.
Конфигурирование сетевых библиотек Установка протокола недостаточна для сетевой работы SQL Server 2000. Для того чтобы клиенты смогли установить соединение с сервером, как на клиенте, так и на сервере, необходимо наличие специальных сетевых библиотек (network library). Эти библиотеки реализованы в виде динамически подключаемых библиотек (dll, dynamic link library,) и подключаются к операционной системе. Библиотека расширяет базовые возможности протокола и является как бы надстройкой над ним, выполняющей различные сетевые операции по обмену данными между клиентом и сервером, для чего используются механизмы IPC. Одновременно SQL Server 2000 может работать с использованием множества различных сетевых библиотек. В табл. 4.6 приведены сетевые библиотеки, поддерживаемые SQL Server 2000. Таблица 4.6. Сетевые библиотеки
Сетевая библиотека
Описание
AppleTalk ADSP
Позволяет клиентам Apple Macintosh подключаться к серверам SQL Server 2000, используя AppleTalk, подобно TCP/IP Sockets. Учтите, что эта библиотека использует текущую зону Apple Talk. Возможно, в следующих версиях указанная библиотека поддерживаться не будет. Библиотека не поддерживается на операционных системах Windows 95/98
Multiprotocol
Библиотека работает с использованием вызова удаленных процедур RPC и не требует конфигурирования. Работа ведется с использованием большинства механизмов IPC Windows NT: TCP/IP Sockets, Named Pipes, NWLink IPX/SPX и т. д. При работе под управлением операционной системы Windows NT позволяет шифровать данные при передаче по сети, а также выполнять аутентификацию Windows NT поверх любого протокола. Не поддерживается при установке SQL Server 2000 под Windows 98
Named Pipes (именованные каналы)
Библиотека позволяет SQL Server 2000 использовать именованные каналы и применяется в Windows NT и Windows 2000 по умолчанию. Эта библиотека может работать поверх основных протоколов Windows. Следует учитывать, что при работе на Windows 98 доступна только клиентская часть именованных каналов. По умолчанию для SQL Server устанавливается канал \\.\pipe\sql\query. Если на одном сервере установлено множество SQL Server, то для обращения к конкретной копии используется \\.\pipe\MSSQL$instancename\sq!\query
NWLink IPX/SPX
Библиотека позволяет подключаться к SQL Server 2000 клиентам Novell NetWare
74
Часть II. Установка SQL Server 2000 Таблица 4.6 (окончание)
Сетевая библиотека
Описание
Shared Memory (разделяемая память)
Библиотека не является в полном смысле сетевой, хотя и имеет те же интерфейсы, что и другие библиотеки. С ее помощью можно имитировать систему клиент-сервер на локальном компьютере. Активно используется на компьютерах с установленным SQL Server 2000, не имеющих поддержки сети
TCP/IP (сокеты TCP/IP)
Библиотека работает поверх протокола TCP/IP и использует сокеты. Функционирование осуществляется поверх механизма IPC. Реализована работа через прокси-сервер. Сокеты TCP/IP применяются по умолчанию на всех операционных системах. Для SQL Server 2000 по умолчанию используется порт 1433. Windows 98 использует сокеты TCP/IP по умолчанию
Banyan VINES
С помощью этой библиотеки возможна работа клиентов, использующих протокол Banyan VINES IP. Для этих клиентов по протоколу Banyan VINES Sequenced Packet Protocol, работающему поверх протокола Banyan VINES IP, организуется соединение через механизмы IPC
В этом разделе приводится лишь обзор сетевых библиотек. В главе 6 будет рассмотрено управление сетевыми библиотеками после того, как установка SQL Server 2000 окажется завершенной. Будет рассмотрено конфигурирование как сервера, так и клиента.
Выбор способа установки SQL Server 2000 поддерживает различные способы установки, предоставляя администраторам большие возможности автоматизации и упрощения процесса инсталляции. От выбора того или иного метода установки зависит набор шагов, который будет предложен мастером установки. В SQL Server 2000 доступны следующие виды установки: П локальная установка (Local Installation); О удаленная установка (Remote Installation); •
автоматическая установка (Unattended Installation).
Рассмотрим более подробно использование каждого типа установки.
Локальная установка Это самый простой и наиболее распространенный тип установки. При использовании локальной установки программа инсталляции разместит SQL Server 2000 на том компьютере, на котором была запущена программа установки. Сам процесс практически не отличается от установки большинства современных продуктов. Мастер установки последовательно выдает пользователю набор окон, в которых тот должен указать параметры конфигурации. К таким
Глава 4. Подготовка к установке SQL Server 2000
75_
параметрам относится информация о названии компании, данные о пользователе, а также серийный номер продукта, получаемый при покупке. Этот набор параметров применяется практически во всех коммерческих продуктах. (
Замечание
^
Для старта мастера установки SQL Server 2000 необходимо запустить программу Setupsql.exe. Применительно к SQL Server 2000 в процессе установки необходимо задать информацию о размещении файлов сервера и баз данных, указать сопоставление, выбрать сетевые библиотеки и при необходимости сконфигурировать их, а также ввести имя и пароль учетных записей, под которыми будут запускаться службы SQL Server 2000. По умолчанию для установки сервера выбирается каталог \Program Files\Microsoft SQL Server, а базы данных размещаются в каталоге \Data установочного каталога SQL Server 2000 (\MssqJ). В процессе установки программа инсталляции собирает все данные о параметрах конфигурации, вводимые пользователем. Эти значения после установки сохраняются в файле Setup.iss, который располагается в каталоге \Install установочного каталога SQL Server 2000. Данный файл может быть впоследствии использован для повторной локальной установки, выполнения удаленной или автоматической установки. Кроме того, в процессе установки ведется журнал, в котором отображается информация о каждой фазе инсталляции. Журнал сохраняется в файле Sqlstp.log, который помещается в корневой каталог операционной системы, например в каталог \WinNT. Более подробная информация о процессе установки, а точнее о встретившихся ошибках, хранится в файлах Errorlog, располагающихся в каталоге \Log установочного каталога SQL Server 2000. После того, как все файлы сервера скопированы и выполнены все подготовительные операции, программа инсталляции приступает к настройке параметров работы сервера.
Автоматическая установка Данный тип инсталляции SQL Server 2000 обычно используется в том случае, когда необходимо установить множество серверов SQL Server 2000 с однотипной конфигурацией. Кроме того, автоматическая установка может быть использована для повторного размещения сервера с теми же параметрами конфигурации, что и при первой установке. В больших корпорациях с помощью автоматической установки можно стандартизировать конфигурацию всех серверов SQL Server 2000 в сети. Автоматическую установку SQL Server 2000 можно реализовать с помощью одного из двух методов: П с помощью файлов автоматической установки; П с помощью Systems Management Server (SMS).
76_
Часть II. Установка SQL Server 2000
Последний метод является стандартным решением проблемы сопровождения программного обеспечения в сетях масштаба предприятия, предлагаемым корпорацией Microsoft. С помощью Microsoft Systems Management Server можно выполнять установку, сопровождение, обновление и управление программным обеспечением, размещенным на компьютерах с любой операционной системой семейства Windows. В основе работы автоматической установки SMS лежит использование файлов формата определения пакетов (PDF, Package Definition Format), на основе которых SMS создает собственно инсталляционные пакеты (Package), которые и используются для установки программного обеспечения. Автоматическая установка SQL Server 2000 с помощью Microsoft SMS доступна при использовании версии этого продукта 1.2 или выше. В комплекте поставки SQL Server 2000 содержится файл smssql.pdf, с помощью которого можно быстро создать пакет SMS. Запуская полученный пакет, можно выполнять автоматическую установку SQL Server 2000. Замечание Файлы pdf представляют собой обычные текстовые файлы, содержащие информацию о действиях, которые должны быть выполнены Microsoft SMS. При необходимости пользователь может скопировать файл smssql.pdf и внести в него необходимые изменения.
Пакет smssql.pdf содержит инструкции для запуска командных файлов, которые используются для различных типов установки SQL Server 2000. Эти командные файлы поставляются на компакт-диске в комплекте с дистрибутивом SQL Server 2000: • smscli.bat — предназначен для выполнения автоматической установки утилит администрирования SQL Server 2000 с использованием пакета SMS; • smssqins.bat — предназначен для выполнения обычной установки утилит администрирования SQL Server 2000 с использованием пакета SMS. Замечание Описание принципов функционирования и методов использования Microsoft SMS заняло бы не одну сотню страниц. Так как это самостоятельный продукт, то для знакомства с ним следует обратиться к соответствующей литературе. Мы ограничимся рассмотрением автоматической установки с применением файлов автоматической установки. Этот метод достоин пристального внимания, т. к. является "родным" для SQL Server 2000.
В основе "родной" автоматической установки лежит использование специальных файлов автоматической установки, которые содержат описание всех параметров конфигурации сервера. При выполнении установки обычным способом все эти значения вводит пользователь в окнах мастера установки. Данный процесс требует присутствия пользователя практически все время, в течение которого выполняется установка сервера, т. к. параметры вводятся постепенно по мере выполнения инсталляции.
Глава 4. Подготовка к установке SQL Server 2000
77
Файл автоматической установки может быть получен различными способами: О Созданием его с помощью обычного текстового редактора вроде Notepad (Блокнот). Недостатком этого метода является необходимость помнить правила построения и структуру файла автоматической установки. •
Можно воспользоваться файлом Setup.iss, получаемым после выполнения локальной или удаленной установки. Данный файл размещается в каталоге операционной системы, например в каталоге \WinNT.
П Если первый способ не вполне вас устраивает, то за основу можно взять готовый файл автоматической установки, например Setup.iss, и внести в него необходимые изменения. •
Файл Setup.iss может быть получен и без выполнения инсталляции сервера. Мастер установки SQL Server 2000 позволяет выполнять создание файла автоматической установки в интерактивном режиме. Для этого в диалоговом окне Installation Selected следует выбрать пункт Advanced Options. В следующем диалоговом окне мастера (Advanced Options) следует установить переключатель в положение Record Unattended.ISS file. В следующих окнах, как и при выполнении локальной или удаленной установки, пользователь должен будет ввести всю необходимую информацию, включающую имена и пароли учетных записей для старта служб SQL Server 2000, каталог установки, сопоставление, состав графических утилит и т. д. На основе указанных данных формируется файл автоматической установки. Собственно инсталляция SQL Server 2000 при этом не выполняется. Единственным результатом работы мастера установки будет создание файла Setup.iss. Полученный файл можно без внесения дополнительных изменений использовать для выполнения автоматической инсталляции.
При подготовке файла автоматической установки следует внимательно относиться к тому, какая учетная запись будет использоваться для запуска служб SQL Server 2000 на удаленном компьютере. Если для работы служб предназначена локальная учетная запись, то следует убедиться, что она имеется на всех компьютерах, на которых будет выполнена автоматическая установка. Если такой учетной записи нет, то администратору придется ее предварительно создать на всех компьютерах, причем установить всем им одинаковые пароли. Если вы хотите избежать проблем конфигурирования учетных записей, то для запуска служб SQL Server 2000 можно использовать локальную учетную запись системы на каждом из компьютеров. Однако минусом такого подхода является использование всех возможностей SQL Server 2000, связанных с ограничением на выполнение сетевых операций для локальных учетных записей. Лучшим решением будет применение для запуска служб SQL Server 2000 учетных записей пользователя домена. Помимо преимущества централизованного управления учетными записями, в дальнейшем это поможет избежать проблем с правами доступа. Выполнение автоматической установки выполняется с помощью программы Setupsql.exe. Необходимо дополнительно указать следующие ключи: •
-fl < i n i t i a i i z a t i o n f i l e path>. С помощью этого ключа определяется полный путь к файлу автоматической установки.
78 •
• •
Часть II. Установка SQL Server 2000 s t a r t /wait. Использование этого параметра предписывает программе установки возвратить управление только после завершения удаленной инсталляции SQL Server 2000. Ключ относится к операционной системе и должен указываться перед Setupsql.exe. -SMS. Этот ключ применяется вместе с предыдущим ключом. -S. Употребление этого ключа позволяет запустить программу установки в тихом режиме (silent mode). В этом режиме отсутствует графический интерфейс.
Приведем пример запуска автоматической установки SQL Server 2000: start /wait x86\setup\setupsql.exe -s -m -SMS -fl
"sqlins.iss"
Помимо всего вышесказанного о выполнении заказной автоматической установке, параметры которой задает пользователь, на компакт-диске с дистрибутивом SQL Server 2000 имеется несколько пакетных bat-файлов, с помощью которых можно выполнить автоматическую установку сервера на локальный компьютер. Приведем список этих файлов: •
sqlcli.bat устанавливает только административные утилиты управления SQL Server 2000;
•
sqlins.bat используется для выполнения обычной (typical) установки SQL Server 2000;
О sqlcst.bat выполняет заказную (custom) установку SQL Server 2000; •
sqlrem.bat используется для автоматической деинсталляции SQL Server 2000;
•
sqlupg.bat осуществляет автоматическое обновление до SQL Server 2000 на компьютере с операционной системой Windows NT.
Каждый из указанных пакетных файлов работает со своим собственным файлом автоматической установки, имеющем имя, совпадающее с именем соответствующего пакетного файла, и расширение iss. При выполнении автоматической установки с помощью указанных пакетных файлов службы SQL Server 2000 конфигурируются для запуска под учетной записью локальной системы.
Замечание Файлы bat и iss могут быть с успехом использованы в качестве шаблонов для создания своих собственных сценариев автоматической установки.
Удаленная установка Программа установки SQL Server 2000 позволяет устанавливать сервер не только на локальный компьютер, на котором запускается программа инсталляции, но и на удаленный компьютер, который, возможно, располагается в другой комнате или даже в другом городе. Для выполнения удаленной установки, как и для локальной, предназначена программа Setupsql.exe. Первый этап удаленной установки напоминает выполнение локальной установки. После запуска мастера установки пользователь должен указать значения всех
Глава 4. Подготовка к установке SQL Server 2000 необходимых параметров конфигурации. Большая часть опций удаленной установки аналогична опциям локальной. Но имеется одно существенное отличие. Так как при выполнении удаленной установки используется сеть, то необходимо дополнительно сконфигурировать следующие параметры: О Username — имя пользователя, учетная запись которого будет использована на удаленном компьютере для выполнения установки SQL Server 2000; •
Password — пароль пользователя;
• Domain — имя домена, к которому принадлежит учетная запись пользователя; • Target Computer — имя удаленного компьютера, на который будет производиться установка SQL Server 2000; П Target Path (UNC) — полное описание пути в формате UNC к каталогу, в который планируется установить SQL Server 2000; П Setup Source Files — полный путь в формате UNC к инсталляционным файлам SQL Server 2000 в сети. После того, как будут введены все сведения, требуемые мастером установки, программа Setupsql.exe переходит к сетевой фазе инсталляции. Введенная пользователем информация о параметрах конфигурации сохраняется мастером установки в файле Setup.iss. После этого на удаленном компьютере запускается программа Remsetup.exe. На этом работа программы Setupsql.exe заканчивается. Для запуска программы Remsetup.exe применяется учетная запись пользователя, указанная в процессе подготовки к установке.
Замечание Обратите внимание, что программа Setupsql.exe сама по себе не выполняет установку. Ее роль при выполнении удаленной установки заключается лишь в формировании файла Setup.iss, который в принципе может быть подготовлен отдельно. На удаленном компьютере программа Remsetup.exe копирует в сетевой административный каталог Admin$, автоматически создаваемый при установке операционной системы, все файлы, необходимые для размещения SQL Server 2000, а также файл Setup.iss, содержащий всю необходимую для установки информацию. После того, как все файлы будут скопированы, программа Remsetup.exe запускает автоматическую инсталляцию SQL Server 2000 с использованием файла Setup.iss, сформированного при выполнении интерактивной части процесса удаленной установки.
(
Замечание
)
Мы закончили описание процесса удаленной установки на моменте начала автоматической установки на удаленном компьютере. Описание собственно автоматической установки было рассмотрено в предыдущем разделе. Чтобы иметь возможность выполнения всех указанных операций, программе установки необходимо иметь соответствующие права доступа как на локальном компьютере, с которого запускается программа Setupsql.exe, так и на удаленном 4 Зак. 83
79
80
Часть II. Установка SQL Server 2000
компьютере, где собственно и будет выполняться установка SQL Server 2000. На локальном компьютере достаточно иметь права на запуск мастера установки и возможность сохранения файла Setup.iss. На удаленном же компьютере необходимо иметь права доступа с административными полномочиями. Не обязательно, чтобы пользователь, запускающий программу инсталляции, имел права администратора на удаленном компьютере. Мастер установки позволяет явно указать учетную запись, которая будет использована на удаленном компьютере для запуска программы Remsetup.exe. Для этого необходимо указать имя домена, имя учетной записи, а также пароль этой учетной записи. Указанная учетная запись должна иметь права на чтение установочных файлов с сетевого ресурса, указанного в программе Setupsql.exe. Замечание Учетная запись, используемая для запуска программы Remsetup.exe на удаленном компьютере, применяется только в процессе установки сервера. Кроме этого, она не выполняет больше никаких функций. Может быть использована любая учетная запись, в том числе учетная запись пользователя, запускающего программу Setupsql.exe на локальном компьютере. Кроме того, также может быть использована одна из учетных записей, сконфигурированных для запуска служб SQL Server 2000. Единственным требованием является наличие необходимых прав доступа.
Программа Remsetup.exe может быть запущена пользователем отдельно, без предварительного выполнения программы Setupsql.exe. Однажды подготовленный файл Setup.iss служит многократно для установки SQL Server 2000 на множество компьютеров. Кроме того, пользователь может вручную отредактировать файл Setup.iss. с помощью обычного текстового редактора.
Глава 5
Переход на SQL Server 2000 с предыдущих версий Количество установленных во всем мире серверов SQL Server 7.0 и SQL Server 6.5 исчисляется сотнями, а то и тысячами. Количество хранимой на некоторых серверах информации уже давно превысило терабайт. Даже в кошмарном сне никому не приснится переносить все накопленные данные из SQL Server 6.5 или SQL Server 7.0. вручную на SQL Server 2000. Перенос данных с SQL Server 7.0 на SQL Server 2000 значительно проще, чем с SQL Server 6.5. Это связано с тем, что ядро SQL Server 2000 в значительной степени осталось тем же, что и в предыдущей версии. Однако непосредственное копирование баз данных как SQL Server 7.0, так и SQL Server 6.5 невозможно из-за изменений, сделанных в SQL Server 2000 по сравнению с предыдущими версиями продукта. Уже в SQL Server 7.0 были внесены настолько значительные изменения в архитектуру баз данных, что перенос последних из SQL Server 6.x в SQL Server 7.0 простым копированием или путем восстановления резервных копий был невозможен. Архитектура баз данных- SQL Server 2000 также была модифицирована, что не позволяет непосредственно подключать к SQL Server 2000 базы данных SQL Server 7.0. Замечание SQL Server 2000 разрешает выполнять обновление только баз данных SQL Server 6.5 и SQL Server 7.0. Если необходимо осуществить обновление баз данных SQL Server 6.0, то следует сначала обновить их до SQL Server 6.5 или SQL Server 7.0, а уже после этого до SQL Server 2000.
Разработчики корпорации Microsoft позаботились о создании эффективных механизмов переноса данных непосредственно из SQL Server 7.0 и SQL Server 6.5 в SQL Server 2000. Система переноса данных была проверена на многих десятках баз данных, собранных с разных концов планеты. Пользователь может быть уверен, что после обновления данные останутся правильными, и их целостность не будет нарушена. Замечание В принципе, перенос данных из SQL Server версий 6.5 и 7.0 в систему SQL Server 2000 возможен с помощью промежуточного хранилища. Например, можно скопировать данные из SQL Server 6.5 в текстовый файл или базу данных MS Access, а затем перенести их в SQL Server 2000. Недостатком предложенного метода является необходимость ручного создания всех объектов базы данных. Од-
82_
Часть II. Установка SQL Server 2000 нако этот процесс можно автоматизировать, сгенерировав сценарии для образования всех необходимых объектов базы данных. При большом объеме информации производительность и надежность переноса данных значительно уменьшаются.
В SQL Server 2000 понятие обновления было расширено по сравнению с SQL Server 7.0. Теперь обновление подразумевает не только перенос данных из предыдущих версий, но и обновление самого SQL Server 2000 до более нового релиза, установка дополнительных компонентов, обновление редакции и установка поддержки кластера для существующей инсталляции SQL Server 2000. Такое обилие вариантов обновления отразилось и на его инструментах. В SQL Server 2000 обновление является одним из базовых вариантов установки. Для выполнения установки в режиме обновления в окне Installation Selection мастера установки необходимо выбрать пункт Upgrade, remove, or add components to an existing instance of SQL Server. Выполнение обновления как части процесса установки SQL Server 2000 используется в следующих случаях: • Установка поверх (install over SQL Server 7.0) — полное обновление SQL Server 7.0 до SQL Server 2000; • Добавление компонентов (adding components) — установка дополнительных компонентов для имеющейся установки SQL Server 2000; П Обновление версии релиза (build-to-build upgrades) — обновление установки до более новой версии релиза, т. е. установка SQL Server 2000, откомпилированного позже имеющейся установки; •
Обновление редакции и компонентов (edition and component upgrades) — расширение базового набора компонентов и возможностей SQL Server 2000;
П Обновление до кластера (upgrading to a cluster) — разрешение поддержки кластеризации для существующей установки SQL Server 2000. Однако на этом варианты обновления не ограничиваются. Как видно, с помощью мастера установки невозможно осуществить обновление баз данных SQL Server 6.5 до SQL Server 2000. Для выполнения подобного обновления используется мастер SQL Server Upgrade Wizard, найти который можно в главном меню Programs (Программы), выбрав в категории Microsoft SQL Server команду Switch. Кажется, что рассмотренные варианты обновления могут решить практически все задачи, однако следует заметить, что не указан способ обновления баз данных SQL Server 7.0 до SQL Server 2000 таким образом, чтобы сохранить SQL Server 7.0. Для выполнения подобного обновления предназначен мастер копирования баз данных (Copy Database Wizard).
Обновление серверов SQL Server 6.x Как уже было сказано, мастер SQL Server Upgrade Wizard предназначен для выполнения обновления только баз данных SQL Server 6.5 до SQL Server 2000. В процессе обновления на SQL Server 2000 будут перенесены не только собствен-
Глава 5. Переход на SQL Server 2000 с предыдущих версий
83
но данные, но и весь набор объектов, включая хранимые процедуры, триггеры, правила, умолчания, ограничения целостности, представления, пользователи баз данных со всеми установленными правами доступа в объектам баз данных и т. д. Кроме того, в процессе обновления также будут перенесены все настройки подсистемы репликации. Если требуется осуществить обновление баз данных SQL Server 6.0, то необходимо дополнительно выполнить одну из двух следующих операций: • воспользоваться мастером обновления SQL Server 7.0 для выполнения обновления баз данных SQL Server 6.0 до SQL Server 7.0. После этого можно будет воспользоваться мастером установки или мастером копирования баз данных для выполнения обновления SQL Server 2000 баз данных SQL Server 7.0 до SQL Server 2000; •
конвертировать базы данных SQL Server 6.0 до SQL Server 6.5, после чего воспользоваться мастером обновления SQL Server 2000 для выполнения обновления баз данных SQL Server 6.0 до SQL Server 2000. Для полноты картины скажем, что можно также сделать обновление баз данных SQL Server 6.5 до SQL Server 7.0, а уже после этого обновить их до SQL Server 2000. Однако вряд ли кто-нибудь будет поступать так на практике.
Мастер SQL Server Upgrade Wizard позволяет обновить одну или более баз данных, расположенных на одном сервере, но не разрешает в процессе обновления объединить данные с нескольких серверов. Если все-таки необходимо перенести в SQL Server 2000 консолидированные данные с нескольких серверов SQL Server 6.5 или SQL Server 7.0, то это следует сделать до начала обновления. То есть все предварительные операции выполняются на серверах SQL Server 6.5 или SQL Server 7.0, а уже затем подготовленные данные переносятся в SQL Server 2000. Объединение данных возможно как при помощи стандартных средств, например, репликации или распределенных запросов Transact-SQL, так и несколько необычных, например, с использованием текстовых файлов. Кроме того, объединение данных с множества серверов SQL Server 6.5 или SQL Server 7.0 можно выполнить следующим способом. Сначала необходимо создать базу данных SQL Server 2000 с нужными объектами, выполнив обновление базы данных. Затем можно' воспользоваться средствами служб Data Transformation Services для выкачивания данных из систем SQL Server 6.5 или SQL Server 7.0. В процессе копирования данных с помощью DTS можно дополнительно выполнить их трансформацию. Использование механизмов Data Transformation Services б у д е т р а с с м о т р е н о в разд. "Службы Data Transformation Services" главы / / . В этой же главе мы подробно рассмотрим использование мастера обновления Upgrade Wizard. Замечание Основное внимание в этом разделе уделено обновлению серверов SQL Server 6.5. Мастер обновления Upgrade Wizard работает только с этими серверами. При обновлении SQL Server 4.1 следует сначала выполнить обновление до SQL Server 6.5, а уже затем до SQL Server 2000. Обновление баз данных SQL Server 4.1 до SQL
84
Часть II. Установка SQL Server 2000 Server 7.0 не поддерживается. Хотя допускается обновление SQL Server 4.1 до SQL Server 6.0, подобный вариант потребует последующего обновления до SQL Server 7.0, т. к. инструменты обновления SQL Server 2000 не позволяют выполнять обновление серверов SQL Server 6.0.
Предварительная подготовка В операцию предварительной подготовки к обновлению входит проверка объема доступного дискового пространства. Мастер обновления Upgrade Wizard сообщает пользователю примерный объем дискового пространства, который будет необходим в SQL Server 2000 для хранения обновленных баз данных SQL Server 6.x: • объем дискового пространства, необходимый для хранения самих данных (файлов mdf и ndf); •
место на диске, необходимое для хранения файлов журнала транзакций (файлов ldf);
•
примерное количество пространства в базе данных Tempdb. Рекомендуется увеличить базу данных Tempdb до указанной величины. В принципе, мастер может сделать это автоматически.
Учтите, что в SQL Server 2000 база данных будет занимать места примерно в 1,5 раза больше, чем в SQL Server 6.5. Это связано не только с увеличением размера страниц до 8 Кбайт (в SQL Server 6.x размер страниц был 2 Кбайта), но и с более эффективным расположением данных. Мастер обновления устанавливает фактор заполнения (fill factor) страниц на уровне примерно 30—50%. В дальнейшем это позволит быстрее выполнять добавление новых данных. Одним из требований мастера Upgrade Wizard является установка Service Pack 5.0 или выше для SQL Server 6.5. Для операционной системы выдвигаются следующие требования: П серверы SQL Server 6.5 должны работать под управлением операционной системы Windows NT Server 4.0 или Windows NT Workstation 4.0; П должен быть установлен Service Pack версии 4.0 или выше. Одной из особенностей работы мастера обновления является то, что он не создает в обновленной базе данных пользователя (user), если для его учетной записи (login) в SQL Server 6.5 была установлена база данных по умолчанию, отличная от обновляемой. Проблема непереноса пользователей серьезнее, чем кажется на первый взгляд. Помимо того, что не будет перенесена информация о самом пользователе, в обновленной базе данных также не будут созданы объекты, которыми он владеет. Это является следствием непереноса информации о пользователе. Мастер обновления не может найти нужного владельца, и попытка создания объекта заканчивается ошибкой. Если учесть, что другие пользователи могли создать объекты, ссылающиеся на неперенесенный объект, то проблема еще больше усугубляется.
Глава 5. Переход на SQL Server 2000 с предыдущих версий
85
Обойти этот вопрос можно, если включить в процесс обновления все базы данных, которые могут быть установлены в качестве баз данных по умолчанию для нужных пользователей. Другим решением является изменение базы данных по умолчанию для всех пользователей, которых необходимо гарантированно перенести в SQL Server 2000. Еще одним требованием к предварительной подготовке серверов SQL Server является отключение всех хранимых процедур, запускаемых автоматически при старте сервера. В ходе обновления мастер Upgrade Wizard несколько раз останавливает и перезапускает службы серверов SQL Server 6.5 и SQL Server 2000. Выполнение хранимых процедур может помешать правильной работе мастера и даже привести к зависанию системы. Помимо всего сказанного выше, для обеспечения сохранности данных и исключения ошибок в процессе обновления рекомендуется выполнить перечисленные ниже действия: •
убедиться, что на диске, на котором предполагается хранить обновленные базы данных, имеется достаточно свободного пространства;
О создать резервную копию всех баз данных SQL Server 6.5. Это гарантирует, что данные не будут потеряны ни при каких ошибках в процессе обновления; П убедиться, что все пользователи имеют учетные записи в базе данных Master; •
остановить репликацию;
П выполнить проверку целостности баз данных SQL Server 6.5, которые предполагается обновить, используя соответствующие команды DBCC; •
установить объем базы данных Tempdb в SQL Server 6.5 10 Мбайт (рекомендуется 25 Мбайт);
как минимум
П гарантировать, что база данных Master имеет как минимум 3 Мбайта свободного пространства; П закрыть все приложения, обращающиеся к SQL Server как версии 6.5, так и к версии 2000. Выполнение указанных требований обеспечивает стабильную работу мастера обновления. Невыполнение некоторых требований может, как минимум, снизить производительность обновления, а в худшем случае привести к зависанию системы и потере данных.
Выбор способа передачи данных Мастер обновления Upgrade Wizard может выполнять перенос данных между серверами SQL Server 6.5 и SQL Server 2000 одним из следующих методов: •
с применением устройства резервного копирования, например магнитной ленты (tape);
•
с помощью именованных каналов (named pipes).
86
Часть II. Установка SQL Server 2000
При использовании первого метода мастер обновления предварительно копирует данные из баз данных SQL Server 6.5 на устройство резервного копирования, с которого затем и выполняется обновление. Такой способ, на первый взгляд, кажется непродуктивным. Действительно, зачем выполнять копирование на промежуточный носитель, если можно копировать данные непосредственно в SQL Server 2000. Однако у этого метода есть свои преимущества. При обновлении на локальном компьютере вполне может сложиться ситуация нехватки дискового пространства для двух копий данных. При использовании устройства резервного копирования мастер Upgrade Wizard в процессе обновления может удалить базы данных SQL Server 6.5, освободив тем самым место на диске. Замечание Удаление устройств SQL Server 6.5 не является обязательным требованием при выполнении обновления с помощью устройства резервного копирования. В этом случае на диске должно быть достаточно свободного пространства для хранения баз данных SQL Server 6.5 и SQL Server 2000. Однако если при выполнении обновления с применением устройства резервного копирования не используется удаление устройств SQL Server 6.5, то лучшим решением будет выполнение обновления с помощью именованных каналов. Это обеспечит более быстрое осуществление обновления.
Если удаления устройств SQL Server 6.5 не удается избежать, то можно предварительно сделать их резервную копию. Мастер обновления на одном из этапов задает вопрос, следует ли выполнять резервное копирование баз данных SQL Server 6.5. Но учтите^ что мастер обновления сам не осуществляет резервное копирование. Он просто дает вам время на эту операцию и ждет нажатия кнопки ОК, подтверждающего, что вы ее закончили. Пользователь сам должен скопировать нужные данные, например, при помощи утилиты Windows NT Backup. Замечание Используя возможность мастера Upgrade Wizard удалять устройства (devices) SQL Server 6.5, будьте предельно внимательны. Независимо от того, выбраны ли для обновления все базы данных, имеющиеся на SQL Server 6.5, или только одна из них, мастер обновления удалит все устройства. То есть будут уничтожены все данные, имеющиеся на сервере SQL Server 6.5.
Если вы не хотите выполнять создание резервной копии вручную, то мастер обновления может сам скопировать файлы устройств SQL Server 6.5 на указанный сетевой ресурс. Имя ресурса необходимо указать в формате UNC. Замечание Не путайте резервное копирование данных SQL Server 6.5 с переносом данных SQL Server 6.5 на магнитную ленту, который выполняет мастер обновления. Это две разные операции. В принципе, создание резервной копии не обязательно, но если процесс обновления закончится неудачей из-за проблем в SQL Server 6.5, то вы не будете иметь возможности исправить ошибки.
Выбирая ленту для переноса данных, следует убедиться, что она не содержит ценной информации. Формат данных, используемый мастером обновления, от-
Глава 5. Переход на SQL Server 2000 с предыдущих версий
87
личается от формата данных резервных копий, создаваемых, например, Windows NT Backup. Поэтому мастер обновления не может добавлять данные на свободное пространство лент Windows NT Backup. Мастер Upgrade Wizard выполняет полное форматирование магнитной ленты, поэтому все находящиеся на ней данные будут потеряны. Замечание Обновление должно выполняться с помощью устройства резервного копирования только в том случае, когда SQL Server 2000 установлен на том же компьютере, что и SQL Server 6.5, и на диске не имеется достаточного объема свободного пространства для хранения данных как SQL Server 2000, так и SQL Server 6.5. В остальных ситуациях рекомендуется использовать именованные каналы.
Второй метод обновления предлагает использование для переноса данных именованных каналов. Именованные каналы являются стандартным средством обмена данными в SQL Server 2000. В принципе, они применяются даже в том случае, когда обновление осуществляется с применением магнитной ленты. Это означает, что поддержка именованных каналов является обязательным условием для выполнения обновления. Кроме того, мастер обновления Upgrade Wizard работает только со стандартными каналами. Поэтому как на сервере SQL Server 6.5, так и на сервере SQL Server 2000 должен использоваться канал \\.\pipe\sql\query. Неоспоримым преимуществом выполнения обновления с использованием только именованных каналов является высокая скорость операций копирования данных по сравнению с магнитной лентой. Этот вариант удобен при выполнении обновления по сети. В этом случае на каждом сервере имеется только одна копия данных и нет нужды организовывать удаление устройств SQL Server 6.5, как это может быть при использовании магнитной ленты. Если обновление завершилось неудачно, то вы всегда сможете начать его заново. Вам не нужно будет восстанавливать данные из резервной копии, т. к. базы данных SQL Server 6.5 останутся в состоянии, в котором они были до начала процесса обновления. Замечание При выполнении обновления с помощью именованных каналов можно получить два набора данных: на SQL Server 6.5 и SQL Server 2000. Пользователи могут работать с любой из версий SQL Server. Такой подход может быть полезен при постепенном переходе с SQL Server 6.5 на SQL Server 2000. Однако вполне возможно, что в этом случае администратор должен будет обеспечивать синхронизацию данных. Кроме того, можно будет многократно выполнять обновление сервера SQL Server 6.5 и таким образом получить множество серверов SQL Server 2000 с одинаковыми данными.
Одно- и двухкомпьютерное обновление В процессе работы с мастером обновления необходимо указать имя исходного сервера (Export Server) SQL Server 6.5 и имя сервера назначения (Import Server) SQL Server 2000. Мастер обновления позволяет переносить данные только на
88
Часть II. Установка SQL Server 2000
локальный сервер. Поэтому в качестве сервера назначения всегда указывается имя сервера SQL Server 2000, на котором запускается мастер Upgrade Wizard. Мастер обновления может выполнять обновление как удаленного, так и локального сервера SQL Server 6.5. При обновлении локального SQL Server 6.5 используется однокомпъютерное обновление. В этом случае имена исходного сервера и сервера назначения должны совпадать. В процессе обновления мастер периодически запускает то SQL Server 6.5, то SQL Server 2000. Если же имена исходного сервера и сервера назначения различаются, то мастер обновления выполняет двухкомпъютерное обновление.
(
Замечание
J
При выполнении обновления как для исходного сервера, так и для сервера назначения необходимо указать пароль учетной записи sa (system administrator), которую будет использовать мастер обновления для доступа к данным и управления серверами. Отдельно указывается пароль для SQL Server 6.5 и для SQL Server 2000.
Независимо от типа обновления допускается применять магнитную ленту или именованные каналы. В процессе обновления мастер подключается к каждому из серверов. После того как обновление завершено, серверы продолжают работать автономно каждый со своей копией данных. В случае двухкомпьютерного обновления старый и новый наборы данных могут быть доступны одновременно. Если же выполнялось однокомпьютерное обновление, то может быть доступен только один из наборов данных. SQL Server 2000 позволяет на одном компьютере работать с множеством серверов SQL Server. Помимо того, что одновременно может работать множество SQL Server 2000, также можно работать и с сервером SQL Server 6.5. Однако невозможно запускать одновременно SQL Server 6.5 и инсталляцию по умолчанию (default instance) SQL Server 2000. Однако можно легко переключаться между ними.
Процесс обновления Выполняя обновление, мастер Upgrade Wizard анализирует структуру обновляемых баз данных SQL Server 6.5 и генерирует код Transact-SQL, с помощью которого можно осуществить создание идентичной базы данных в SQL Server 2000. Кроме того, создаются также все объекты базы данных, включая пользователей, правила, ограничения целостности и т. д. Автоматическое генерирование скрипта не является единственным способом создания базы данных и ее объектов. Мастер допускает применение заранее подготовленного скрипта в процессе обновления. Другой способ заключается в предварительном создании базы данных и всех ее объектов непосредственно инструментами SQL Server 2000. Однако каким бы методом ни были созданы объекты базы данных, необходимо тщательно следить за соответствием всех имен объектов и их структуры в SQL Server 2000 соответствующим характеристикам объектов SQL Server 6.5. Это особенно касается столбцов таблиц и представлений.
Глава 5. Переход на SQL Server 2000 с предыдущих версий
89
Перед началом обновления следует проверить целостность данных. В противном случае все несогласованности "всплывут" во время обновления и могут вызвать серьезные неприятности, вплоть до повторения всей процедуры. Желательно также проверить имена объектов базы данных на совпадение с ключевыми словами SQL Server 2000. Имена объектов, нормально воспринимаемые SQL Server 6.5, могут неправильно интерпретироваться серверами SQL Server 2000. Дело в том, что список служебных слов в SQL Server 2000 был существенно расширен по сравнению с предыдущими версиями. В принципе, подобную коррекцию можно произвести и после обновления. Мастер обновления отслеживает все ошибки, произошедшие во время переноса данных, и записывает их в специальные файлы. По завершении обновления выдается список ошибок, и администратор может приступить к их устранению. Необходимо также убедиться в корректном отображении учетных записей SQL Server 6.5 в пользователей баз данных. Если имеются какие-то несоответствия, то пользователи с нарушенными связями не будут созданы. Если несозданный пользователь являлся владельцем объекта, то этот объект также не будет создан. В свою очередь это может привести к цепочке ошибок создания объектов, ссылающихся на объекты неперенесенного пользователя. Создаваемая база данных автоматически поддерживает все нововведения, сделанные в SQL Server 2000. Например, файлы базы данных и журнала транзакций обновленной базы данных будут сконфигурированы с учетом автоматического роста. Новая база данных создается с размером, достаточным для хранения данных, хранящихся в SQL Server 6.5. Мастер обновления не переносит параметры баз данных SQL Server 6.5, не поддерживаемые в SQL Server 2000, или параметры, не рекомендованные к изменению. Файлы базы данных SQL Server 2000 создаются в том же каталоге, где размещается файл устройства базы данных SQL Server 6.5. Если база данных SQL Server 6.5 располагается на нескольких устройствах, то в SQL Server 2000 будет создано соответствующее количество файлов. Все они окажутся размещенными в том же каталоге, что и файл первого устройства SQL Server 6.5. Причем основной объем данных станет храниться в файле, соответствующем первому устройству, а остальные файлы будут иметь минимальный размер. В процессе обновления можно изменять физические характеристики базы данных. К таким характеристикам относятся: П количество файлов данных и журнала транзакций; П имя и положение на диске файлов базы данных; П первоначальный размер и шаг прироста файлов. Перед началом обновления следует закрыть все приложения и остановить службы, которые могут обратиться к SQL Server. Например, Internet Information Server, который может периодически считывать информацию из баз данных для формирования динамических Web-страниц.
90
Часть II. Установка SQL Server 2000
Обновление серверов SQL Server 7.0 Как уже было сказано ранее в этой главе, обновление серверов SQL Server 7.0 до SQL Server 2000 можно выполнить двумя методами: П как часть процесса установки SQL Server 2000. В этом случае после завершения обновления будет выполнено удаление как самого SQL Server 7.0, так и всех хранившихся в нем данных. Пользователи будут иметь возможность работать только с данными, перенесенными на SQL Server 2000; • как отдельную операцию, выполняемую на уже установленном SQL Server 2000. В этом случае пользователи могут работать с данными, хранящимися как на SQL Server 2000, так и на SQL Server 7.0. Для осуществления подобного обновления служит мастер Copy Database Wizard. Мы не будем сейчас обсуждать обновление баз данных SQL Server 7.0, т. к. выполнение этой операции будет рассмотрено в следующих главах книги.
Использование различных версий SQL Server Невозможно запускать одновременно SQL Server 6.x и инсталляцию по умолчанию (default instance) SQL Server 2000. Однако можно легко переключаться между ними. То есть в каждый момент времени будет работать либо SQL Server 6.x, либо инсталляция по умолчанию SQL Server 2000. Переключение между версиями можно организовать с помощью утилиты vswitch.exe, имеющей следующий синтаксис: vswitch -SwitchTo {60 I 65 I 80}
[-Silent {0 I 1}]
Аргумент -SwitchTo определяет номер версии, на которую необходимо переключиться. При указании значения 65 (или 60) активным станет SQL Server 6.5 (или SQL Server 6.0), а при использовании 80 — SQL Server 2000. Соответственно, если активным является SQL Server 6.5, то инсталляция по умолчанию SQL Server 2000 будет недоступной. Однако пользователи смогут легко обращаться к именованным инсталляциям (named instance) SQL Server 2000. Другой способ переключиться между версиями SQL Server подразумевает использование в меню Programs (Программы) категории Microsoft SQL ServerSwitch. Если активным является SQL Server 6.5, то в этом меню имеется пункт Microsoft SQL Server 2000. Если же активным является SQL Server 2000, то в этом меню будет доступен пункт Microsoft SQL Server 6.5. Использование меню для переключения версий SQL Server является лишь удобным интерфейсом вызова утилиты vswitch.exe. Для реализации возможности переключения между версиями SQL Server 2000 создает в реестре три копии ключей реестра. Одна копия (подключ MSSQLServerSO) используется SQL Server 2000. В этом ключе хранится вся информация о параметрах работы версии 8.0. Второй ключ (MSSQLServer_65 или
Глава 5. Переход на SQL Server 2000 с предыдущих версий
91
MSSQLServer_60) предназначен для хранения информации о параметрах работы SQL Server 6.x. Третья копия (MSSQLServer) является рабочей версией. Этот подключ применяется как в работе SQL Server 2000, так и в работе SQL Server 6.x. Независимо от того, какая именно версия загружена, для считывания информации о параметрах работы она обращается именно к этому ключу. При переключении версий утилита vswitch.exe копирует ключ MSSQLServer в ключ текущей версии. Затем данные из ключа версии, на которую делается переключение, копируются в ключ MSSQLServer. Такой подход практически исключает конфликт версий и обеспечивает сохранность данных в реестре.
Замечание Не выполняйте переключение версии во время работы мастера обновления. Это может привести к серьезным неприятностям.
Глава 6
Установка SQL Server 2000 В двух предыдущих главах были рассмотрены теоретические аспекты установки SQL Server 2000 и обновления предыдущих версий. В этой главе будет рассмотрена собственно установка SQL Server 2000. Инсталляционный комплект SQL Server 2000 поставляется на отдельном компакт-диске. При установке этого компакт-диска в дисковод CD-ROM операционная система автоматически запускает программу SQL Server Automenu (рис. 6.1). Если автоматический запуск не был выполнен, то SQL Server Automenu можно запустить с помощью программы autorun.exe, расположенной в корневом каталоге компакт-диска.
Рис. 6 . 1 . Начальное окно программы SQL Server Automenu
Данная утилита является своего рода графическим интерфейсом для выполнения некоторых операций. В распоряжении пользователя имеются следующие пункты: • Install SQL Server 2000 Prerequisites. Пункт используется для установки на Windows 95 обновлений, позволяющих этой операционной системе взаимо-
Глава 6. Установка SQL Server 2000
93
действовать с SQL Server 2000. После выбора этого значения откроется диалоговое окно, в котором будут доступны следующие пункты: •
Install Winsock2 Update for Windows 95 для обновления Windows 95, чтобы они могли работать с SQL Server 2000;
•
Install Common Control Library Update для выполнения обновления библиотеки элементов управления Windows 95.
сокетов
• Install SQL Server 2000 Components. С помощью этого пункта выполняется установка дополнительных компонентов, а также инсталляция собственно SQL Server 2000. При выборе данного значения пользователь должен указать редакцию SQL Server, с которой будет производиться дальнейшая работа. Список доступных редакций зависит от приобретенного компакт-диска. После определения редакции будет предложено несколько опций установки: •
Database Server — Choice Edition для установки собственно SQL Server 2000. Точнее, при выборе этого пункта программа SQL Server Automenu передаст управление мастеру установки Installation Wizard. Однако сама она не завершит свою работу. После установки SQL Server 2000 пользователь также должен будет закрыть и SQL Server Automenu;
• Analysis Services для установки службы анализа, реализующей аналитическую обработку информации (Online Analytical Processing, OLTP); •
English Query для установить механизмов English Query, позволяющих выполнять запросы к базам данный в произвольной словесной форме, а не только с помощью запросов Transact-SQL.
П Browse Setup/Upgrade Help. При выборе данного пункта пользователю будет выведена справка по установке и обновлению SQL Server 2000. Эта справка является частью Books Online и использует тот же интерфейс. • Read the Release Notes. Выбор этого пункта приводит к открытию в редакторе Notepad (Блокнот) текстового файла readme, расположенного на компактдиске. Файл содержит некоторую информацию об SQL Server 2000, дополняющую Books Online. • Visit Our Web Site. Приводит к запуску Internet Explorer, который будет открывать страницу http://www.microsoft.com/sql/, содержащую информацию о последней версии SQL Server. В этой главе основное внимание будет уделено установке SQL Server 2000 и его компонентов. Поэтому в программе SQL Server Automenu нас интересует только пункт Database Server в способе установки Install SQL Server 2000 Components, приводящий к запуску мастера Installation Wizard, который можно также запустить и непосредственно из командной строки. Мастер установки запускается с помощью файла setupsql.exe из папки x86\Setup, расположенной в папке соответствующей редакции. Например, полный путь к мастеру установки для стандартной редакции будет Z:\eQLSTD\x86\Setup\setup.sql.exe, где Z: является дисководом компакт-дисков.
Часть II. Установка SQL Server 2000
94
Мастер установки После того, как мастер Installation Wizard будет запущен, можно приступать собственно к установке. Реализация процесса установки в виде мастера требует от пользователя указания опций в нескольких окнах. Первое окно мастера (рис. 6.2) не содержит никаких опций управления процессом установки и является всего-навсего приветствием и приглашением начать установку.
Wec l ome to the Microsoft SQL Server Installation Wi2ard. The Installation Wizard alows you to install a new instance of SQL Server or modfiy an existing instance.
Next> ]l
Cancel
Рис. 6.2. Первое окно мастера Installation Wizard
Во втором окне (рис. 6.3) пользователь должен выбрать сервер, с которым будет работать мастер установки. Предлагаются следующие варианты: • Local Computer. При выборе этого пункта мастер установки начнет работать с локальным сервером, т. е. сервером, на котором был запущен мастер. Соответственно, будет использоваться локальный тип установки. В этом случае текстовое поле в центральной части окна будет неактивно. • Remote Computer. Данный вариант используется при выполнении удаленной установки. При выборе пункта становится доступным поле в центральной части окна мастера, в котором указывается имя удаленного компьютера, где следует установить SQL Server 2000 или добавить компоненты. При попытке указать в поле имя локального компьютера мастер сообщит, что нельзя выполнять удаленную установку на локальном компьютере и попросит ввести имя другого сервера. Имя удаленного компьютера может быть введено как вручную, так и выбрано в браузере серверов, вызвать который можно с помощью кнопки Browse.
Глава 6. Установка SQL Server 2000
95
Замечание В качестве удаленного сервера не может выступать компьютер с операционной системой Windows 98, даже если на нем уже имеется установленный SQL Server 2000. • Virtual Server. Переключатель доступен только в том случае, если мастер был запущен на компьютере с установленной поддержкой кластера. Также потребуется указать имя существующего или нового виртуального сервера, с которым будет работать мастер установки. Computer Name Enter the name of the computer on which you want to create a,new instance of SQL Server or modify an existing instance of SQL Server.
i (• [Local Computer ! С .Remote Computer \Г WhMlServei
Help
< Back
Next>
Cancel
Рис. 6.З. Окно Computer Name мастера Installation Wizard
Мы не будем рассматривать установку на удаленный и виртуальный сервер, т. к. они применяются изредка, а работа с ними лишь немного отличается от локальной установки. Таким образом, мы будем рассматривать локальную установку. Следовательно, переключатель должен быть установлен в положение Local Computer, после чего можно переходить к следующему окну мастера, нажав кнопку Next. Третье окно мастера имеет название Installation Selection (рис. 6.4) и предназначено для выбора режима работы мастера установки. Как и в предыдущем окне, в распоряжении пользователя имеется переключатель, с помощью которого и необходимо выбрать нужный режим. Доступны следующие режимы: П Create a new instance of SQL Server. При установке переключателя в это положение мастер выполнит создание на локальном компьютере новой инсталляции SQL Server 2000.
Часть II. Установка SQL Server 2000
96 Installation Selection
Select one of the following installation options. f* £reati- -i i f ' i ' 1 e
erver
f~ Upgrade, remove, or add components to an existing instance of SQL Server С Advanced options
Create a New Installation This option allows you to create a new instance of SQL Server 2000.
< Back
Next >
Cancel
Рис. 6.4. Окно Installation Selection мастера Installation Wizard
Existing Installation Select one of the following to change your installation. Г
Ш
eornpcrwi-fe: .1
с ; existing im : ;.-•:•.-
f* IJninstall your existing installation *•" Uggrade your existing installation
This option allows you to upgrade your existing installation to a newer version, or to add components if you purchased a SQL Server version with more features.
Help
< Back ~
11 I--
Next> I "~ -••••-•Ч
Cancel
Рис. 6.5. Окно Existing Installation мастера Installation Wizard
• Upgrade, remove, or add components to an existing instance of SQL Server. Данное положение используется, когда необходимо выполнить обновление версии билда (Build version) SQL Server 2000. Опция также может быть исполь-
97
Глава 6. Установка SQL Server 2000
зована при обновлении бета- (beta) или оценочной (evaluation) версии до полноценной версии (release). Помимо этого, в данном режиме можно управлять набором компонентов, установленным в той или иной инсталляции SQL Server 2000. При выборе рассматриваемого пункта пользователь должен будет в окне мастера Existing Installation (рис. 6.5) конкретизировать действие, которое он хочет выполнить. Advanced options. При выборе этого переключателя мастер предложит пользователю создать файл автоматической установки (setup.iss), перестроить реестр или управлять виртуальным сервером. Список указанных действий предлагается в окне Advanced Options (рис. 6.6), которое откроется непосредственно после окна Installation Selection. Напомним, что файл setup.iss может быть использован для автоматической или удаленной установки. Перестройка же реестра чаще всего применяется для заполнения его ключами и значениями, необходимыми для работы SQL Server 2000. Подобная операция может понадобиться в случае восстановления резервной копии реестра или переустановке операционной системы. Advanced Options Select one of the following advanced options. fSjijel Г" Registry Rebuild
j Record Unattended.ISS File j This option only allows you to create an installation file I that can be used for unattended installations of SQL Server 2000.
Help
< Back
Next>
Cancel
Рис. 6.6. Окно Advanced Options мастера Installation Wizard
ЗамечаШие Отметим, что при работе с предыдущими версиями SQL Server, в том числе и в SQL Server 7.0, пользователи должны были прибегать к не совсем стандартным методам для выполнения перестройки реестра и создания файла автоматической установки. В SQL Server 2000 эти действия могут быть выполнены с использованием графического интерфейса мастера Installation Wizard.
Часть II. Установка SQL Server 2000
98
Хотя мы и дали описание всех режимов работы мастера, все же будем рассматривать только создание новой инсталляции. Для этого нам необходимо установить переключатель в положение Create a new instance of SQL Server (см. рис. 6.4). В этом случае следующее окно мастера будет называться User Information (рис. 6.7). Как видно из рисунка, окно предназначено для ввода сведений о владельце продукта. В частности, указывается имя пользователя, осуществляющего установку, и название организации, в которой инсталлируется SQL Server 2000. Вводимая в этом окне информация никаким образом не влияет на работу SQL Server 2000. Указанные данные могут быть использованы при обращении в службу технической поддержки. User Information Enter your name below. It is not necessary to enter a company name.
Name:
lEvgeniy Mamaev
Company: I State University of Khakassiaj
< Back
Next>
Cancel
Рис. 6.7. Окно User Information мастера Installation Wizard
После того, как будет указана информация об имени пользователя и названии организации, мастер установки представит в окне Software License Agreement (рис. 6.8) лицензионное соглашение, в котором описаны все варианты эксплуатации продукта и ответственность пользователя в случае нарушения условий использования SQL Server 2000. Если вы принимаете предложенное лицензионное соглашение, то следует нажать кнопку Yes, после чего мастер перейдет к сбору информации о параметрах новой инсталляции. Если предлагаемые условия использования SQL Server 2000 вас чем-то не устраивают, то следует твердо нажать кнопку No, тем самым категорически прервав работу мастера и процесс установки в целом. Однако редко кто не принимает лицензионного соглашения, особенно в свете практически безнаказанного применения незаконных копий в нашей стране. Конечно, мы не рассматриваем работу с пиратскими копиями SQL Server 2000 и в дальнейшем в книге предполагаем, что вы работаете с лицензионной версией.
Глава 6. Установка SQL Server 2000
99
Sort ware License Agreement Please read the following License Agreement. Press the PAGE DOWN key to see the rest of the agreement. DEMEURERONT APPLICABLES DANS TOUTE LA MESURE PERMISE PAR LE DROIT APPLICABLE QUAND BIEN MKME UN QUELCONQUE REMMDE A UN QUELCONQUE MANQUEMENT NE PRODUIRAIT PAS D'EFFET. La prusente Convention est rugie par les lois de la province d'Ontario, Canada. Chacune des parties a la prusente reconnaot irrfivocablernent la computence des trb i unauw de la province d'Ontario et consent a instituer tout litige qui pourrait ducouler de la prftsente aupms des tribunaux situfis dans le district judiciaire de York, province d'Ontario.
Au cas ощ vous auriez des questions concernant cette licence ou que vous diteirie2 vous mettre en rapport avec Microsoft pour quelque raison que ce soit, veuillez contacter la succursale Microsoft desservant votre pays, ou ficrire a: Microsoft Corporation, SQL Server Product Marketing Test Group, One Microsoft Way, Redmond, Washington 98052-6399 U.S.A.
Do you accept all the terms of the preceding License Agreement? If you choose No, Setup will close. To install Microsoft SQL Server 2000, you must accept this agreement. < Back
Yes
No
Рис. 6.8. Окно Software License Agreement мастера Installation Wizard
Как уже было сказано, нас полностью устраивает предложенное лицензионное соглашение и мы можем смело нажать кнопку Yes, пообещав тем самым себе соблюдать все условия использования SQL Server 2000. После этого мастер в окне Installation Definition (рис. 6.9) предложит выбрать компоненты, которые следует установить: • Client Tools Only. При выборе данного переключателя мастер будет устанавливать только инструменты администрирования SQL Server 2000, такие как Enterprise Manager, Performance Monitor, Query Analyzer, а также электронную документацию Books Online. Собственно сервер установлен не будет. То есть не будет установлено служб MSSQLServer и SQLServerAgent. Таким образом, с локального компьютера можно будет работать с любым сервером сети, выполняя любые административные задачи в пределах предоставленных вам прав, а также обращаться к этим серверам с различными запросами. Однако, на локальном компьютере не будет установлено механизмов работы с данными. • Server and Client Tools. В этом случае помимо инструментов администрирования будут установлены и механизмы, обеспечивающие хранение данных и выполнение пользовательских запросов работы с данными — служба MSSQLServer, а также дополнительные механизмы — службы SQLServerAgent, MSDTC и MSSearch. To есть будет произведена полноценная инсталляция SQL Server 2000. • Connectivity Only. Этот вариант предполагает установку на локальном компьютере только сетевых библиотек. Никакие дополнительные компоненты добавлены не будут. Указанный вариант установки используется на клиентских компьютерах, на которых предполагается запускать различные приложения, обращающиеся в своей работе к SQL Server 2000. В состав операционных
100
Часть II. Установка SQL Server 2000
систем семейства Windows входят только сетевые протоколы. Однако, как было сказано в одной из предыдущих глав, этого недостаточно для обеспечения возможности работы с SQL Server 2000. Необходимо установить дополнительные компоненты, что и выполняется в рассматриваемом режиме установки. Отметим, что оба описанных выше режима включают и установку сетевых библиотек.
Installation Definition You can select one of the following types of installations. Client Tools Ony l Дегуи ir и I diet t fools
<""" Connectivity Only This option allows you to install a server and the client tools. Use this option of you want to set up a server with administration capabilities.
< Back
Next >
Cancel
Рис. 6.9. Окно Installation Definition мастера Installation Wizard
Как-то уже было сказано, что мы рассматриваем установку новой инсталляции SQL Server 2000. Следовательно, переключатель должен находиться в положении Server and Client Tools, что и предлагается мастером по умолчанию. В следующем окне мастера, имеющем название Instance Name (рис. 6.10), вы должны указать имя устанавливаемой инсталляции SQL Sewer 2000. Напомним, что имеется два типа инсталляций — инсталляция по умолчанию (default instance) и именованная инсталляция (named instance). Для обращения к первой пользователям достаточно указать лишь сетевое имя NetBIOS компьютера, на котором находится нужный SQL Server 2000. Когда же необходимо установить соединение с именованной инсталляцией, то помимо имени компьютера необходимо через слэш указать еще и ИМЯ Инсталляции В формате имя_компьютера\имя_инсталляции. Следствием подобного подхода является возможность установки на одном компьютере единственной инсталляции по умолчанию, в качестве которой также может выступать и SQL Server предыдущей версии (они поддерживали только инсталляции по умолчанию), и множества именованных инсталляций. Вернемся же к рассмотрению окна мастера Instance Name. Как видно, в окне имеется всего два элемента управления — флажок Default и текстовое поле In-
Глава 6. Установка SQL Server 2000
101
stance name. Сразу заметим, что флажок Default будет доступен только в том случае, если на компьютере ранее не было инсталляции по умолчанию. Например, флажок будет недоступен, если на компьютере установлен SQL Server 7.0. Уже стало ясно, что пометка флажка Default предписывает мастеру установить инсталляцию по умолчанию. Если же флажок сброшен или вообще недоступен, то становится доступным поле Instance name, где необходимо указать имя, которое будет присвоено инсталляции. Таким образом, мастер выполнит установку именованной инсталляции SQL Server 2000. Замечание Как видно, на рис. 6.10 флажок Default вообще недоступен и в нашем распоряжении имеется только поле Instance name. Это связано с тем, что на компьютере уже установлена инсталляция по умолчанию. Помимо этого имеется еще и одна именованная инсталляция. Однако ее наличие никаким образом не сказывается на ходе установки SQL Server 2000.
Замечание Отметим, что на компьютер можно установить только именованную инсталляцию, не прибегая к установке инсталляции по умолчанию. Instance Name
2<J Г Defaul! For a default installation, leave Default checked and click Next. To install ot maintain a named instance of SQL Server on this computer clear the Default checkbox and type or select an instance name. A new name must be 16 characters or less and should start with a letter or other acceptable character. For more information, click Help.
Instance name:
[FASHIONABLE!
Help
Cancel
Рис. 6.10. Окно Instance Name мастера Installation Wizard
После того как будет решено, какой тип инсталляции необходимо установить, можно переходить к окну Setup Type (рис. 6. II), в котором выбирается способ установки SQL Server 2000. Подробно достоинства и недостатки, а также собственно идея каждого из предлагаемых способов были рассмотрены в разд. "Выбор
102
Часть II. Установка SQL Server 2000
способа установки" главы 4. Здесь же отметим лишь основные особенности каждого из предлагаемых способов: • Typical — обычная установка. Включает значения по умолчанию, подобранные программистами Microsoft и теоретически подходящие для большинства случаев. Этим способом следует воспользоваться, если вы не совсем четко представляете назначение каждой из опций конфигурирования сервера, предлагаемых мастером. • Minimum — минимальная установка. В данном случае будет установлен ограниченный набор компонентов с целью сведения к минимуму объема необходимого дискового пространства. Как и в предыдущем случае, пользователь будет избавлен от необходимости конфигурирования свойств сервера, принимая тем самым значения, предлагаемые мастером. • Custom — установка пользователем. Этот вариант предполагает участие пользователя в настройке параметров конфигурации устанавливаемой инсталляции SQL Server 2000. Хотя и можно с уверенностью сказать, что это наиболее сложный способ установки из всех трех приведенных, тем не менее задача значительно упрощается за счет того, что по умолчанию мастер предлагает те же значения, что и при обычной установке. Таким образом, можно смело выбирать установку Custom. В любом случае вы сможете просто нажать кнопку Next и принять значения по умолчанию. При необходимости вы всегда сможете соответствующим образом скорректировать тот или иной параметр. Setup Type Click the type of Setup you prefer, then click Next. С lypical
Installed with the most common options. Recommended for most users.
f Minimum
Installed with minimum required options.
(* l&Jstornj
You may choose the options you want to install. Recommended for advanced users.
Destination Folder ] Program Files
Browse...
GAProgram Files\Microsoft SQL Server
'•• Data Files
Browse..
G:\Program FilesSMicrosoft SQL Server Required: 34106 К 125204 К 33920 К
Space on program files drive: Space on system drive: Space on data files drive: Help
< Back
Next >
Available: 167424 К 167424 К 167424 К Cancel
Рис. 6.11. Окно Setup Type мастера Installation Wizard
Помимо выбора способа установки, окно Setup Type также используется для указания каталогов, в которых будут располагаться файлы собственно SQL Server 2000, а также файлы баз данных. Конфигурирование этих параметров
Глава 6. Установка SQL Server 2000
103
осуществляется в группе Destination Folder, которая содержит две строки — Рпь gram Files и Data Files. В конце первой из них указывается каталог, в котором будут размещаться служебные файлы SQL Server 2000, такие как электронная документация, утилиты командной строки, различные файлы, а также файлы служб MSSQLServer и SQLServerAgent. По умолчанию предлагается каталог \Program Files\Microsoft SQL Server диска, где установлена операционная система. Для выбора любого другого каталога необходимо воспользоваться окном Choose Folder, открываемым с помощью соответствующей кнопки Browse. Аналогично, в строке Data Files указывается каталог для размещения файлов баз данных, устанавливающихся вместе с SQL Server 2000. К этим базам данных относятся четыре системные базы данных (master, msdb, model и tempdb), a также двух баз данных (pubs и Northwind), специально предназначенных для всяческих экспериментов. Выбранный каталог также будет автоматически использован в качестве каталога по умолчанию для размещения пользовательских баз данных. Однако, при необходимости во время создания пользовательских баз данных можно будет указать любое другое местоположение файлов. В нижней части окна Setup Type отображается объем необходимого и свободного пространства на выбранных для установки SQL Server 2000 дисках. Как видно, эта информация указывается в трех строках и двух столбцах. Во второй строке приводится количество пространства, необходимого на системном диске, т. е. на том диске, на котором установлена операционная система. Дело в том, что мастер установки размещает часть компонентов SQL Server 2000 в каталогах операционной системы. В первой и третьей строке, соответственно, указывается объем пространства, необходимого для установки служебных файлов и файлов баз данных SQL Server 2000. Непосредственно объем нужного пространства выводится в столбце Required. Значения в нем могут меняться при выборе того или иного метода установки. В столбце Available указывается объем пространства, имеющегося на соответствующих дисках.
С
Замечание
)
Следует быть внимательным при оценке необходимого пространства, особенно когда различные данные размещаются на одном диске. Не первый взгляд, согласно рис. 6.11, может показаться, что имеющегося пространства вполне достаточно для установки, т. к. в каждой строке объем необходимого пространства меньше имеющегося количества свободного пространства. Однако, приглядевшись, не трудно заметить, что в столбце Available во всех строках указаны одинаковые значения. Это верный признак того, что все файлы SQL Server 2000 будут установлены на один диск. В таком случае необходимо сложить все значения в столбце Required и сравнить результат со значением в столбце Available. Как видно, в рассматриваемом варианте количества свободного пространства явно недостаточно. Первые два варианта установки не представляют особого интереса, тогда как вариант Custom предвещает пару-тройку дополнительных окон для конфигури рования параметров сервера. Именно этот способ мы и будем рассматривать. При установке переключателя в положение Custom следующим окном мастера будет окно Select Components (рис. 6.12).
104
Часть II. Установка SQL Server 2000
Select Components Select ot clear the components to install / remove. Components:
Sub-Components:
И Server Component у») Management Tools •| Client Connectivity у] Books Online •] Development Tools Description
74688 К H SQL Server 3545G К i/| Replication Support 320 К v*] Full-Text Search 38Б56 К | /j Debug Symbols 384 K.; -r 1 v Performance Counters • :~~ -
10816K. 7744 К 25G К 12288 К 64 К -
Installs the core functional components of the SQL Server relational database.
Space on program files drive: Space on system drive: Space on data files drive:
Required:
Available: 167872 К 167872 К 167872 К
Hext>
Cancel
34106 К 125204 К 33920 К
Help
< Back
Рис. 6.12. Окно Select Components мастера Installation Wizard
Нетрудно догадаться, что окно Select Components предназначено для выбора компонентов, устанавливаемых мастером. Как видно, окно разделено на три части. Две из них представляют списки, в которых перечислены категории компонентов (список Components) и собственно компоненты (список Sub-Components), входящие в ту или иную категорию. В области Description выводится краткое описание выбранного компонента. В нижней части окна отображается объем дискового пространства, необходимого для установки выбранных в окне компонентов.
С
Замечание
Отметим, что установка флажка напротив имени категории приводит к установке всех компонентов, входящих в эту категорию. Рассмотрим, какие же категории компонентов и собственно компоненты можно установить. П Server Components. В этой категории отображаются компоненты, обеспечивающие серверную часть SQL Server 2000: •
SQL Server — собственно серверная часть, т. е. службы MSSQLServer и SQLServerAgent. Без установки этого компонента пользователи не смогут обращаться с запросами к данным. Более того, не будет собственно механизма хранения и обработки данных.
•
Replication Support — поддержка репликации. Если компонент не устанавливается, соответственно вы не сможете воспользоваться репликацией.
•
Full-Text Search — служба полнотекстового поиска. В отличие от предыдущих версий, в SQL Server 2000 поддержка полнотекстового поиска устанавливается по умолчанию.
Глава 6. Установка SQL Server 2000
105
• Debug Symbols — компонент, отвечающий за возможность трассировки расширенных хранимых процедур. Дело в том, что хранимые процедуры этого типа реализованы в виде динамически подключаемых библиотек (файлов dll). Для трассировки таких файлов необходимо наличие в них дополнительной информации. Как следствие, библиотеки с наличием подобной информации занимают значительно больше места и работают несколько медленнее. По умолчанию устанавливаются стандартные библиотеки без поддержки трассировки. •
Performance Counters — счетчики. Для оценки различных аспектов работы SQL Server 2000 можно использовать стандартную утилиту Windows NT (Windows 2000) Performance Monitor. Однако, в эту утилиту не встроена возможность анализа работы SQL Server 2000. Чтобы воспользоваться утилитой для анализа работы SQL Server 2000, необходимо установить для Performance Monitor так называемые счетчики (counters), с помощью которых Performance Monitor будет получать от сервера информацию об аспектах его работы. Установка счетчиков как раз и осуществляется инсталляцией рассматриваемого компонента.
• Management Tools. Категория инструментов управления SQL Server 2000. С их помощью можно обращаться к любому серверу сети. В принципе, можно не устанавливать ни один из компонентов данной категории. •
Enterprise Manager — основной инструмент Server 2000.
•
Profiler — инструмент мониторинга работы SQL Server 2000. В отличие от Performance Monitor позволяет осуществлять не количественный, а качественный анализ работы SQL Server 2000. В частности, можно оценивать производительность выполнения хранимых процедур, длительность устанавливаемых ими блокировок и т. д.
•
Query Analyzer — компонент для выполнения пользовательских запросов (команды Transact-SQL).
•
DTC Client Support — средство поддержки клиентской части DTC.
•
Conflict Viewer — механизм просмотра конфликтов, возникающих при использовании репликации сведением. Конфликтом является изменение более, чем одним сервером опубликованных данных. При необходимости, можно определить свои собственные правила разрешения этих конфликтов.
администрирования SQL
• Client Connectivity. Категория (сетевые библиотеки), позволяющая обращаться к SQL Server 2000 с использованием технологий DB-Library, ODBC и OLE DB. Не имеет никаких компонентов. Когда в окне Installation Definition (см. рис. 6.9) выбирается пункт Connectivity Only, то мастер Installation Wizard устанавливает только рассматриваемый компонент. П Books Online. Довольно полезная электронная документация по SQL Server 2000, а в некоторых ситуациях просто незаменимая. Настоятельно рекомендую всегда устанавливать ее. В принципе, можно инсталлировать на
106
Часть II. Установка SQL Server 2000
компьютер только документацию и изучать ее в свое удовольствие. Имеются два варианта установки Books Online: • Books Online on Disk. Документация копируется на локальный жесткий диск и впоследствии может быть использована в любое время. Как видно, этот вариант требует около 37 Мбайт свободного пространства на жестком диске. Для сравнения скажем, что аналогичная документация по SQL Server 7.0 занимала около 11 Мбайт. • Books Online on CD. Этот тип установки требует минимума места на жестком диске. Однако, всякий раз, когда вы захотите поработать с документацией, вам потребуется вставлять в дисковод CD-ROM компакт-диск с SQL Server 2000, т. к. вся информация будет подкачиваться непосредственно с него. На винчестер же скопируется только оглавление, которое вы видите в левой части окна Books Online. • Development Tools. Категория включает инструменты, используемые для разработки приложений, а также компонент, обеспечивающий поддержку трассировки хранимых процедур: • Headers and Libraries включает файлы заголовков (*.h) и файлы библиотек (*.lib), предназначенные для работы из языках программирования C++ с технологиями ODBC, DB-Library, Open Data Services, SQL-DMO, Embedded SQL for С и MSDTC. • Backup/Restore API устанавливает инструменты, файлы заголовков, документацию и примеры, связанные с разработкой приложений, обеспечивающих работу с резервными копиями. •
Debugger Interface отвечает за возможность трассировки работы хранимых процедур. Без его установки трассировка процедур не удастся. Напомним, что трассировка процедур осуществляется с помощью Query Analyzer.
• Code Samples. В эту категорию входят файлы с примерами на языке C++, демонстрирующие работу с различными технологиями обработки данных. Примеры могут быть использованы при разработке собственных приложений. Замечание Сброс флажка напротив компонента SQL Server во время выполнения установки новой инсталляции не допускается. При попытке перейти к следующему окну мастер обязательно сообщит вам об этом.
Таким образом, с помощью окна Select Components можно выбрать произвольный набор компонентов, которые будут установлены мастером Installation Wizard. Когда все нужные компоненты будут отмечены, можно переходить к следующему окну мастера — Services Accounts (рис. 6.13). Сразу же скажем, что это окно служит для конфигурирования учетных записей, под которыми будут запускаться службы MSSQLServer и SQLServer Agent. По умолчанию мастер Installation Wizard предлагает стартовать обе службы под одной и той же учетной записью, что достигается установкой переключателя в положение Use the same
Глава 6. Установка SQL Server 2000
107
account for each service. Auto start SQL Server Service. При этом также конфигурируется автоматический запуск обеих служб SQL Server 2000 при загрузке операционной системы. 2LJ
Services Accounts С Use the same account for each service. Auto start SQL Server Service <•" Customize the settings for each service.
Services : .<*" SQLServer f" SQL Server Agent
Service Settings t~ Use the Local System account {• Use a Doman i User account LJsername: Password:
Administrator
Doman i:
Help
< Back
Next >
Cancel
Рис. 6.13. Окно Services Accounts мастера Installation Wizard
Подобный вариант требует минимума затрат на конфигурирование и в большинстве случаев является вполне удовлетворительным. Однако, если все же вам необходимо обеспечить запуск служб под разными учетными записями, то переключатель должен быть установлен в положение Customize the settings for each service. При этом становятся доступными переключатели группы Services, предназначенные для выбора службы, параметры запуска которой предполагается конфигурировать. В зависимости от того, в какое положение установлен переключатель, будет меняться состояние элементов управления в группе Service Settings.
Замечание Отметим, что при старте служб под одной учетной записью значения, установленные в группе Service Settings, будут влиять на обе службы. В группе Service Settings имеется следующий набор элементов управления: • Use the Local System account. При установке переключателя в это положение для Запуска соответствующей службы (или служб) будет использоваться учетная запись локальной системы. • Use a Domain User account. В данном случае служба станет запускаться под учетной записью пользователя домена (или локального пользователя). При установке переключателя также становятся доступными дополнительные элементы управления, с помощью которых собственно и указывается учетная запись:
108
Часть II. Установка SQL Server 2000
• Username — имя учетной записи, под которой должна запускаться служба; •
Password — пароль учетной записи, указанной в предыдущем поле;
•
Domain — имя домена, к которому принадлежит учетная запись. В принципе, в этом поле может быть введено имя локального компьютера, на который устанавливается SQL Server 2000. Следовательно, будет использоваться учетная запись локального пользователя. Замечание Подробно достоинства и недостатки запуска служб SQL Server 2000 под учетными записями каждого типа, а также создание и конфигурирование этих учетных записей было рассмотрено в разд. "Подготовка учетных записей" главы 4.
О Auto Start Service. Пометка этого флажка предписывает выполнять автоматический запуск соответствующей службы при загрузке операционной системы. Флажок доступен только в том случае, когда свойства запуска служб SQL Server 2000 конфигурируются отдельно. При установке переключателя в положение Use the same account for each service. Auto start SQL Server Service флажок отмечен по умолчанию и не может быть сброшен. Замечание Напомним, что службы MSSearch и MSDTC по умолчанию стартуют под учетными записями локальной системы. Мастер установки не позволяет управлять свойствами запуска указанных служб. После конфигурирования параметров запуска служб SQL Server 2000 мастер предложит выбрать режим аутентификации, который будет использован сервером для проверки прав пользователей. Для выбора нужного режима предназначено окно мастера Authentication Mode (рис. 6.14). Как видно из рисунка, главную роль играет переключатель, с помощью которого и выбирается режим работы подсистемы аутентификации SQL Server 2000: О Windows Authentication Mode. В распоряжении пользователей будет только аутентификация средствами Windows NT. To есть прежде чем пользователь сможет получить доступ к SQL Server 2000, он должен будет зарегистрироваться в домене (или на локальном компьютере). После этого он автоматические получает права доступа к базам данных, которые были предоставлены ему администратором SQL Server 2000. Если доступ пользователю был предоставлен, он может сразу же начинать работу с данными, не прибегая ни к каким дополнительным средствам аутентификации. Если же доступ предоставлен не был, то пользователь не сможет никаким другим образом обратиться к данным. • Mixed Mode (Windows Authentication and SQL Server Authentication). В этом случае сервер работает в так называемом смешанном режиме аутентификации. То есть помимо аутентификации средствами Windows NT пользователи могут прибегнуть и к аутентификации SQL Server для установления соедине-
Глава 6. Установка SQL Server 2000
109
ния с сервером. При выборе данного переключателя в окне становятся доступными несколько дополнительных элементов, предназначенных для управления свойствами учетной записи sa: •
Enter password — поле ввода пароля, который будет присвоен учетной записи sa. Возможность указания пароля для учетной записи sa появилась только в SQL Server 2000. При установке предыдущих версий этой учетной записи назначался пустой пароль. Сразу же после установки администратор должен был поменять его. Однако, некоторые пользователи даже не подозревали, что для учетной записи sa устанавливается пустой пароль и даже не думали изменять его. Это чаще всего было связано с тем, что для доступа к SQL Server 2000 использовались учетные записи Windows NT. Таким образом, злоумышленник, знающий об указанной дыре, мог легко получить доступ к любым данным, хранящимся на соответствующем сервере. Более того, используя расширенные хранимые процедуры, он мог получить доступ и к любым ресурсам компьютера, на котором был установлен SQL Server. Строго говоря, злоумышленник получал права, которые имела учетная запись, под которой стартовала служба MSSQLServer. Довольно часто эта учетная запись имеет права администратора домена. Таким образом, дырка в системе безопасности SQL Server расширялась до масштаба домена.
JSl
Authentication Mode Choose the authentication mode. (* windows Authentication Mode? С Цулий Mode (Windows Authentication and SQL Server Authentication)
Г
Help
< Back
Next>
Cancel
Рис. 6.14. Окно Authentication Mode мастера Installation Wizard
• Confirm password — в этом поле необходимо повторить пароль, введенный в предыдущем поле. Дублирование выполняется для того, чтобы избежать ошибок при вводе пароля.
Часть II. Установка SQL Server 2000
110
Blank Password (not recommended) — хотя мастер и предлагает явно ввести пароль для учетной записи sa, все же существует возможность оставить его пустым. Для этого необходимо установить рассматриваемый флажок. Попытка оставить поля Enter password и Confirm password пустыми приведет к выдаче мастером сообщения о недопустимости подобного действия. Настоятельно не рекомендуется оставлять пустым пароль учетной записи sa.
Замечание Более подробно типы аутентификации будут рассмотрены в разд. "Аутентификация" главы 9. В следующем окне, имеющем название Collation Settings (рис. 6.15), мастер дает возможность сконфигурировать параметры сопоставления, которое будут использоваться для всех системных баз данных, баз данных pubs и Northwind, a также предлагаться в качестве значения по умолчанию для всех создаваемых пользовательских баз данных. Отметим, что параметры сопоставления, задаваемые в процессе установки SQL Server 2000, не рассматриваются как единый и неизбежный стандарт для всех данных, хранимых на этом сервере. Хотя именно так и было при работе с предыдущими версиями SQL Server, включая и SQL Server 7.0, в SQL Server 2000 был сделан существенный шаг вперед. Теперь каждая из баз данных может иметь свое собственное сопоставление, которое будет определять правила сравнения, хранения и упорядочивания информации в этой базе данных. Более того, сопоставление можно контролировать на уровне таблицы или даже ее отдельного столбца. Collation Settings Wn i dows Locale Change the default settings only if you must match the collation of another instance of SQL Server or the Windows locale of another computer. Sort order Г™ Bjnary
]Cyrilic_General
Г" Case sensitive I** Accent sensitive
C~ SQL Collations (Used for compatibility with previous versions of SQL Server). Dictionary order, case-sensitive, for use with the 1251 (Cyrillic) Character Set. ~ Dictionary order, case-insensitive, for use with the 1251 (Cyrillic) Character Set. Ukrainian dictionary order, case-sensitive, for use with the 1251 (Cyrillic) Character Set
Help
Next>
Cancel
Рис. 6.15. Окно Collation Settings мастера Installation Wizard
Глава 6. Установка SQL Server 2000
111
Замечание Более подробно суть сопоставлений, их виды и выбор были рассмотрены в разд. "Выбор конфигурации сервера" главы 4. Однако вернемся к окну Collation Settings. Как видно из рисунка, окно разбито на две части, которые являются взаимоисключающими. Напомним, что SQL Server 2000 поддерживает два вида сопоставления — сопоставление Windows и сопоставление SQL Server. Первое из них основывается на значениях, установленных на уровне операционной системы, тогда как второе требует явного указания названия сопоставления. Выбор типа сопоставления осуществляется с помощью переключателя, который может быть установлен в следующие положения: • Collation designator. В этом случае будет использоваться сопоставление Windows. В раскрывающемся списке необходимо выбрать основной язык. Для России предлагается использовать CyrilIic_General. Дополнительно требуется определить правила сравнения символьных данных, что осуществляется с помощью следующих флажков группы Sort order: • Binary — при установке этого флажка символы будут сравниваться на основе их кодов. Никаких дополнительных операций выполняться не будет. Данный метод сортировки является самым быстрым. Как следствие, два оставшихся флажка будут недоступны. •
Case sensitive — управляет чувствительностью к регистру символов. При сброшенном флажке строчные и прописные буквы будут считаться эквивалентными.
• Accent sensitive — управляет чувствительностью к диакритическим маркерам. Для России эта возможность не представляет особого интереса, т. к. в нашем алфавите диакритические маркеры не используются. Однако, если предполагается хранить данные на разных языках (например, на французском или немецком), то необходимо соответствующим образом сконфигурировать эту опцию. • SQL Collation (Used for compatibility with previous versions of SQL Server). При установке переключателя в это положение пользователю будет предложен список сопоставлений, поддерживаемых SQL Server 2000. Из всех доступных сопоставлений пользователь должен будет выбрать один единственный. Для России предлагаются сопоставления, оканчивающиеся на ...for use with 1251 (Cyrillic) Character Set.
Замечание Строго говоря, SQL Server 2000 всегда работает только с сопоставлениями SQL Server. На уровне сервера сопоставление Windows отображается в соответствующее сопоставление SQL Server. Это сделано для обеспечения удобства конфигурирования и с целью избавить пользователя от необходимости вникать в подробности работы сервера. Пользователям, для которых выбор нужного сопоставления представляет некоторые трудности, можно посоветовать просто нажать в окне кнопку Next, тем 5 Зак. 83
Часть II. Установка SQL Server 2000
112
самым приняв значение по умолчанию. Мастер предлагает наиболее подходящее значение, вполне удовлетворительное в большинстве случаев. Network Libraries Select the network libraries to use when connecting to the server. P JNamedPipe^ Named Pipe name; |\V\pipe\MSSQL$FSFS\$ql\que
Г NWLinklFWSPX
P" JCP/IP Sockets Port number:
Г
г
Г
Proxy address;
Г
Mufti-Prolotd Г
Ei4bteMulli-pfOto«
Help
< Back
Next>
Cancel
Рис. 6.16. Окно Network Libraries мастера Installation Wizard Start Copying Files Setup has enough information to start copying the program files. If you want to review or change any settings, click Back. If you are satisfied with the settings, click Next to begin copying files.
< Back
|[ Next"> ll
Cancel
Рис. 6.17. Окно Start Copying Files мастера Installation Wizard
Следующее же окно мастера, имеющее имя Network Libraries (рис. 6.16) используется для управления свойствами сетевых библиотек. Как видно, в окне маете-
Глава 6. Установка SQL Server 2000
1J3_
pa представлены все стандартные библиотеки. Часть из них может быть неактивна, если в операционной системе не установлен сетевой протокол, необходимый для работы соответствующей библиотеки. Выставляя флажок около имени той или иной библиотеки, вы тем самым разрешаете использовать ее для работы устанавливаемой инсталляции SQL Server 2000. На этом конфигурирование процесса установки заканчивается. Следующее окно мастера называется Start Copying Files (рис. 6.17) и не содержит никаких элементов управления кроме стандартных кнопок мастера. Как следует из названия окна и приведенного в нем текста, после нажатия кнопки Next мастер приступит к копированию файлов и собственно установке выбранных компонентов. Если вы сомневаетесь в правильности указанных значений, то сейчас самое время вернуться к предыдущим окнам мастера и внести соответствующие изменения. После нажатия кнопки Next этого сделать уже не удастся.
Настройка системы после установки После того, как установка будет успешно завершена, необходимо перезагрузить компьютер. Затем SQL Server 2000 может начать свою работу и принимать запросы пользователей. Никаких дополнительных действий по настройке сервера можно не предпринимать. Программа установки SQL Server 2000 автоматически выполняет конфигурирование сервера наиболее оптимальным образом. К тому же в SQL Server 2000 реализованы механизмы автоматического конфигурирования, что позволяет ему динамически подстраиваться под текущие параметры операционной системы и нужды пользователей. Однако, в некоторых случаях администратор должен предпринять определенные действия по настройке или изменению параметров работы сервера. Часть вопросов обслуживания сервера будет рассмотрена в следующих разделах, другие же — в следующих главах книги.
Управление работой служб SQL Server 2000 Как уже не раз говорилось, службы SQL Server 2000 могут работать как под одной, так и под разными учетными записями. Они управляются операционной системой также, как и для обычных пользователей. Это означает, что для учетных записей служб SQL Server 2000 действуют все правила политики безопасности, установленные в домене. Данный факт следует учитывать при выполнении операций с учетными записями служб. Чаще всего однажды созданная учетная запись, используемая службами сервера, эксплуатируется продолжительное время без внесения изменений. Но иногда все же бывает необходимо сменить ее пароль. Изменение пароля учетной записи при работе с Windows NT 4.0 выполняется с помощью утилиты User Manager for Domains, а при работе с операционной системой Windows 2000 — с помощью утилит Computer Management (для локальных учетных записей пользователей) и Active Directory User and Computers (для учетных записей пользователей
Часть II. Установка SQL Server 2000
114
домена). Работа с данными утилитами была рассмотрена в разд. "Подготовка учетных записей"главы 4.
Service Messenger Microsoft Search MSDTC M i SSQLServer Net Logon Network DDE Network DDE DSDM NT LM Security Support Provider Plug and Play Protected Storage
Status
Started
Started Started
Startup Manual z Manual Manual Manual Automatic Manual Manual Manual Automatic ' Automatic
Close
Start
Startup... HW Profiles..
Startup Parameters: Help
Рис. 6.18. Утилита Services для Windows NT 4.0 ••иншншппиа 1*%» Services •• 1 1 Action : Ve i w --• •# Щ7] Qfj Щ [ЩI] i f ; • и Tree 1 Description | Status Name •
**цй Services (Local)
,|D|xf
Startup Type
Log On As
Manual
.\Administ..,
%MSSQL$TRELON
Manual
.\Adrninist.,,
%MSSQLSERVER
Automatic
.\Administ.,,
Manual
LocalSystem
Manual
LocalSystem
Manual
LocalSystem
^ M i c r o s o f t Search
^ $ N e t Logon
Creates ful,,,
Supports p . . .
%}NetMeeting Remote... Allows a u t . . . Щ$ Network Connections
Manages o . . .
% Net work DDE
Provides n , , .
Manual
LocalSystem
% Network DDE DSDM
Manages s,.,
Manual
LocalSystem
% N T L M Security Sup,..
Provides s...
Manual
LocalSystem
^Performance Logs a,,. Configures...
Manual
LocalSystem
Started
^gPlug and Play
Manages d . . .
5tarted
Automatic
LocalSystem
Щ$ Print Spooler
Loads files ...
Started
Automatic
LocalSystem
*% Protected Storage
Provides p r , , ,
Started
Automatic
LocalSystem
^QoSRSVP
Provides n . , ,
Manual
LocalSystem
^ R e m o t e Access Aut...
Creates a ...
Manual
LocalSystem
^ R e m o t e Access Con,,. Creates a ...
Started
Manual
LocalSystem
*%Remote Procedure ...
Provides t h . . .
Started
Automatic
LocalSystem
^%jRemote Procedure ...
Manages t . . ,
Manual
LocalSystem
^ R e m o t e Registry Se... Allows rern...
Started
Automatic
LocalSystem
™gg Removable Storage
Manages г...
Started
Automatic
LocalSystem
Щ&Routing and Remot,.,
Offers rout,..
Disabled
LocalSystem
zl
I
Рис. 6.19. Утилита Services для Windows 2000
После смены пароля нужно сообщить его службе SQL Server 2000, использующей измененную учетную запись. Это можно сделать двумя способами. Первый способ заключается в использовании утилиты Service, которую можно найти в Control
115
Глава 6. Установка SQL Server 2000
Service:
MSSQLServer
Startup Type | С Automatic ! <• f^anual Г Disabled
Log On As: С Sjistem Account T~ Ajlow ServicetoInteract with Desktop (* This Account: MIS^Adnninistrator :
Password
xxxxxxxxxxxxxx
Confirm Password:
Рис. 6.20. Диалоговое окно Service
Panel (Панель управления) — как для Windows NT 4.0, так и для Windows 2000. В окне утилиты представлен список всех служб, установленных на компьютере. Ее конкретный вид отличается для разных классов операционных систем. На рис. 6.18 приведена утилита Services для операционной системы Windows NT 4.0, тогда как на рис. 6.19 приведена версия этой утилиты для Windows 2000. Минимальный набор служб SQL Server 2000, устанавливаемый на компьютер, содержит службы MSSQLServer, SQLServerAgent и MSDTC. Сначала рассмотрим работу с утилитой Services для операционной системы Windows NT 4.0. Найдите нужную службу в списке и нажмите кнопку Startup (см. рис. 6.18). В ответ откроется диалоговое окно Service (рис. 6.20), в котором можно управлять параметрами запуска службы.
В группе Startup Type можно выбрать один из типов запуска службы: П Automatic. При выборе этого типа запуск службы будет автоматически выполняться сразу же после загрузки операционной системы. Администратор может быть уверен, что пользователи смогут обращаться к SQL Server 2000 сразу же после перезагрузки компьютера. • Manual. Данный тип запуска службы предполагает старт службы по необходимости. Автоматически запуск службы сразу при загрузке операционной системы не выполняется, однако администратор может вручную запустить службу. Методы запуска, остановки и приостановки будут рассмотрены позже в этой главе. • Disabled. При выборе этого пункта запуск службы запрещается. Попытка стартовать службу вызовет ошибку. Для того, чтобы иметь возможность снова запускать службу, необходимо установить переключатель в положение Manual или Automatic. В группе Log On As указывается имя и пароль учетной записи, под которой будет стартовать служба. Установив переключатель в положение System Account, вы тем самым заставите службу стартовать под локальной учетной записью системы. Указание имени пользователя и пароля в этом случае не требуется. Для запуска службы под определенной учетной записью нужно установить переключатель в положение This Account. При этом необходимо выбрать.одну из созданных учетных записей. Для выбора учетной записи следует нажать кнопку ... 1. В ответ откроется диалоговое окно со списком доменов и компьютеров, а также созданных на них учетных записей. В полях Password и Confirm Password нужно ввести корректный пароль учетной записи.
Часть II. Установка SQL Server 2000
116
Замечание Если пароль учетной записи указан неверно, то пользователь не получит никакого предупреждающего сообщения. Ошибка будет выдана только в том случае, если в полях Password и Confirm Password указаны различные значения. При вводе имени несуществующей учетной записи также будет отображено сообщение об ошибке.
Замечание Если учетная запись пользователя, выбираемого для работы службы, не имеет права Log on as service, то ему автоматически предоставится это право, о чем будет выдано соответствующее предупреждение. Теперь же рассмотрим конфигурирование параметров запуска служб SQL Server 2000 при работе с операционной системой Windows 2000. Первое, что нужно сделать, это выбрать в окне утилиты (см. рис. 6.19) имя нужной службы. После этого необходимо открыть окно свойств службы (рис. 6.21), щелкнув дважды на имени службы. Как видно, окно свойств службы состоит их четырех вкладок. На вкладке General особый интерес представляет раскрывающийся список, с помощью которого можно управлять методом запуска службы. Перечень пунктов в этом списке, а также их назначение полностью соответствует набору положений переключателя Startup Type, рассмотренного ранее в этом разделе (см. рис. 6.20). 21*1
MSSQLSERVER Properties (Lac1 General j Log On j Recovery j Dependencies | Service name:
MSSQLSERVER
Display name: description: Path to executable: G: \PROG RA~1 \MI CR OS ~3\MS SQLSbinnVsqlservr. exe
Startup type:
Automatic
Service status: Start
Stopped i
S'r
You can specify the start parameters that apply when you start the service from here. Start parameters: OK
Cancel
Рис. 6 . 2 1 . Окно свойств службы, вкладка General
Глава 6. Установка SQL Server 2000
117
MSSQLSERVER Properties (Local General Log On Recovery ] Dependencies | Log on as: С ^ocal System account
Г (• jjihjs: account:! Password: Confirm password:
.\Adrninistrator
Browse...
I1""""""1*"*"'"""' | »**»***>"""""<•"<
You can enable or disable this service for the hardware profiles listed below: Hardware Profile Profile!
Service Enabled
.Disable OK
Cancel
Рис. 6,22. Окно свойств службы, вкладка Log On
Однако нас прежде всего интересует изменение пароля учетной записи, под которой стартует служба. Эта операция выполняется с помощью вкладки Log On (рис. 6.22). JLJ2SJ Look in:
j | |; • 0RA6E
Name С Admin I «Administrator С Diesel f j l Guest С IUSR_STORAGE f\ IU/6M ^THRURF
J *
1 In Folder STORAGE STORAGE STORAGE STORAGE STORAGE 4THRURF
Name:
OK
Cancel
Рис. 6 . 2 3 . О к н о S e l e c t User
Как видно, в распоряжении пользователя имеется переключатель, с помощью которого можно сконфигурировать запуск службы под учетной записью локальной системы (положение Local System account), либо под учетной записью пользователя (положение This account). При установке переключателя во второе положение необходимо будет ввести имя учетной записи, а также ее пароль. При
Часть II. Установка SQL Server 2000
118
этом может быть указана как локальная учетная запись пользователя, так и учетная запись пользователя домена. Нажав кнопку Browse, можно просмотреть список всех доступных учетных записей с помощью окна Select User (рис. 6.23) и выбрать одну из них. На этом конфигурирование параметров запуска службы заканчивается. Новые параметры вступят в силу при следующем старте службы. Другой способ управления параметрами запуска служб SQL Server 2000 предполагает использование утилиты Enterprise Manager. Для управления параметрами запуска службы MSSQLServer выберите в панели утилиты Enterprise Manager нужный сервер и откройте окно его свойств (например, выбрав в контекстном меню сервера команду Properties). Окно свойств сервера (SQL Server Properties (Configure)) содержит ряд закладок, используемых для управления параметрами работы службы MSSQLServer.*В данном случае нас интересует вкладка Security (рис. 6.24). SQL Server Properties (Configure) Database Settings Server Settings Processor Security General j Memory r Security
Replication Connections
SQL Server provides authentication based on Windows NT accounts and a named SQL Server login ID and password. Authentication: Г SQL Server and Windows NT/2000 fvWjndows NT/2000 only Audit level: ("" None
. f" Failure
(* Success
С Ajl
Startup service account -® ^ \—Jr
Start and run SQL Server in the following account: с S^iSten-| account
Administrator
**" Ihis account Password:
OK
Cancel
Help
Рис. 6.24. Вкладка Security окна свойств сервера
На этой закладке в разделе Startup service account можно изменить тип, имя и пароль учетной записи, предназначенной для запуска службы MSSQLServer. Если установить переключатель в положение System account, то для старта службы будет использоваться учетная запись локальной системы. Выбрав переключатель This account, можно указать имя и пароль любой учетной записи пользователя.
Глава 6. Установка SQL Server 2000
119
Замечание В отличие от утилиты Services, ввод неправильного имени пользователя или пароля недопустим. При нажатии кнопки ОК будет выдано соответствующее сообщение об ошибке. Изменение параметров учетной записи службы SQLServerAgent также производится с помощью окна свойств службы. Саму службу можно найти в папке Management, предварительно выбрав нужный сервер в панели Enterprise Manager. Окно свойств службы SQLServerAgent содержит пять вкладок. Для" управления параметрами учетной записи, используемой для работы службы, используется вкладка General (рис. 6.25). SQL Server Agent Properties - ST General Advanced | Alert System j Job System | Connection | -Service startup account— i This account:
Mail session Mail profile:
Evgeniy Mamaev
Г" .Save copies of the sent messages in the "Sent Items" folder
Error log ГЩ
File name:
JF: \S Q L2000\M S S QL$SQL_S E F Г Jnclude execution trace messages Г Write OEM File
£let send recipient:
OK
Cancel
Apply
Help
Рис. 6.25. Вкладка General окна свойств службы SQLServerAgent
В разделе Service startup account можно выбрать либо учетную запись локальной системы (System account), либо учетную запись пользователя (This account), указав при этом его имя и пароль. Ввод неверных данных об имени или пароле пользователя приведет к ошибке. Управление параметрами учетной записи службы MSDTC из утилиты Enterprise Manager не реализовано. Для изменения учетной записи следует использовать утилиту Services из набора утилит Control Panel. Напомним, что служба Microsoft Search может стартовать только под учетной записью локальной системы.
120
Часть II. Установка SQL Server 2000
Замечание Если SQL Server 2000 применяется совместно с компонентом Microsoft Search, то изменение имени учетной записи или пароля для службы MSSQLServer должно выполняться только средствами Enterprise Manager. Для подключения службы Microsoft Search к службе MSSQLServer первая использует имя и пароль учетной записи, под которой стартует служба MSSQLServer. Если изменение имени или пароля производить из Enterprise Manager, то внесенные изменения автоматически отразятся на работе службы Microsoft Search. Если же для изменения учетной записи выбрана утилита Services, то информация об имени и пароле не будет синхронизирована. После перезагрузки операционной системы служба Microsoft Search не сможет стартовать. Для синхронизации данных необходимо будет воспользоваться Enterprise Manager.
Изменение параметров конфигурации сервера При выборе параметров конфигурации SQL Server 2000 следует быть предельно внимательным. Неправильная установка значений для сопоставления может привести к серьезным неприятностям. Этот параметр определяет, какие будут использоваться кодовая страница, порядок сортировки данных Unicode и не Unicode, и поэтому является основополагающим в работе SQL Server 2000. Структура баз данных, генерируемая при установке сервера, зависит от выбранного значения сопоставления. Невозможно "горячее" сопоставления, т. к. это вызвало бы неправильное функционирование сервера. Для изменения значений данных параметров потребуется перестройка базы данных Master. Этого можно добиться либо переустановкой SQL Server 2000, либо воспользоваться утилитой rebuildm.exe, которую можно найти в каталоге \Binn установочного каталога SQL Server 2000. Утилита rebuildm.exe специально предназначена для перестроения базы данных Master, а вместе с ней и всех системных баз данных. При этом вся информация, находящаяся на момент перестройки в системных базах данных, будет потеряна. Утилита rebuildm.exe копирует шаблон базы данных Master с установочного набора SQL Server 2000, определяет соответствующие значения порядка сортировки, набора символов и сопоставления Unicode, после чего заполняет базу данных системной информацией о параметрах работы SQL Server 2000. Данная утилита не производит никаких действий с пользовательскими базами данных. Так как вся информация базы данных Master после перестройки будет утеряна, то и пользовательские базы данных станут недоступны. Тем не менее, хотя сами файлы баз данных и вся хранящаяся в них информация останутся, все же их подключение к SQL Server 2000 будет невозможным, т. к. эти базы данных будут иметь старое значение сопоставления. Все действия по переносу данных в новую конфигурацию должен выполнять администратор. Лучшим выходом из этой ситуации будет создание сценария или скрипта (script), содержащего код Transact-SQL, с помощью которого можно будет выполнить создание всех пользовательских баз данных и их объектов. SQL Server 2000 может генерировать код Transact-SQL, результатом выполнения которого будет создание одного или более объектов. Процесс создания скрипта для объекта
Глава 6. Установка SQL Server 2000
121_
называется скриптованием объекта. Если перед изменением порядка сортировки выполнить скриптование всех пользовательских баз данных со всеми их объектами, то после перестройки можно выполнить сгенерированный сценарий. В итоге в перестроенном сервере будет получен тот же набор объектов, что существовал до перестройки. Но самих данных в базах данных, конечно же, не будет. Для переноса данных на перестроенный сервер необходимо до выполнения перестройки их куда-то скопировать. Для временного хранения данных можно использовать серверы SQL Server 2000. Однако подобный подход не всегда эффективен вследствие возможных проблем с несовместимостью параметров сопоставления на этих серверах. Лучшим вариантом оказывается использование текстовых файлов для временного хранения данных. Скопировать данные в текстовый файл можно либо с помощью служб трансформации данных (DTS, Data Transformation Services), либо с помощью утилиты массивного копирования данных bcp.exe (Bulk Copy Program). В обоих случаях используется примерно один и тот же механизм. Преимуществом DTS является интуитивно понятный графический интерфейс, но утилита bcp.exe обладает более высокой производительностью. Службы трансформации данных можно использовать либо с помощью инструмента DTS Designer, либо с помощью мастера DTS Wizard. После того, как системные базы данных SQL Server 2000 были перестроены и выполнен сценарий, создающий пользовательские базы данных, можно приступать к копированию данных из текстового файла в базы данных. Для этого также можно использовать либо Data Transformation Services, либо утилиту bcp.exe. Кроме того, для вставки данных из текстового файла можно также применить команду Transact-SQL BULK INSERT.
Конфигурирование сетевых библиотек Установка протокола недостаточна для сетевой работы SQL Server 2000. Необходимы еще и специальные сетевые библиотеки (network library). Краткое описание и перечень библиотек приведены в главе 4. Как уже было сказано, библиотеки необходимо устанавливать как на сервере, так и на компьютере клиента. Конфигурирование клиентов будет рассмотрено в следующем разделе. Сейчас же разберем настройку библиотек на сервере. Библиотеки можно инсталлировать как в процессе установки SQL Server 2000, так и позже. Если нужно добавить или удалить библиотеку уже после установки, то для этого необходимо использовать утилиту SQL Server Network Utility (рис. 6.26), устанавливающуюся вместе с SQL Server 2000.
Замечание Утилита SQL Server Network Utility может быть запущена из главного меню операционной системы (Programs\Microsoft SQL Server\Server Network Utility). Другой вариант запуска утилиты предполагает выполнение программы svrnetcn.exe, которую можно найти в каталоге \Program Files\Microsoft SQL Server\80\Tools\Binn\.
Часть II. Установка SQL Server 2000
У22 i SQL Server Network Utility General j Network Libraries ] Instance(s) on this server: Disabled protocols: Multiprotocol NWLink IPX/SPX AppleTalk Banyan Vines
Enabled protocols: Enable »
Named Pipes TCP/IP
<< JDisable
Properties...
Г" Enable protocol encryption Г™ Enable WinSock proxy
Cancel
Help
Рис. 6.26. Утилита SQL Server Network Utility, вкладка General
Окно утилиты содержит две вкладки. Первая из них, General, предназначена собственно для конфигурирования сервера. В раскрывающемся списке Instance^) on this server содержится список имен установок SQL Server 2000, выполненных на локальном сервере. При конфигурировании сетевых библиотек следует учитывать, что некоторые из них не работают с именованными установками (named instance). Список доступных библиотек для именованных установок довольно невелик: •
Named Pipes;
• TCP/IP (сокеты TCP/IP); •
NWLink IPX/SPX.
Соответственно, клиенты могут обращаться к именованным установкам только с использованием перечисленных сетевых библиотек. Хотя на компьютере клиента могут быть установлены и другие библиотеки, с помощью них будет возможно подключение лишь к установке по умолчанию (default instance), обращение к которой производится только по имени компьютера, на котором установлен SQL Server 2000. В списке Disabled protocols перечислены имена сетевых библиотек, не используемых для выбранной установки. Для активизации любой из приведенных в списке библиотек достаточно нажать кнопку Enable. После этого имя библиотеки удаляется из списка Disabled protocols, но добавляется в список Enabled protocols, в котором перечислены все библиотеки, используемые установкой, выбранной в списке Instance(s) on this server. Если некоторая активная библиотека
Глава 6. Установка SQL Server 2000
123
более не нужна, то ее необходимо удалить из списка Enabled protocols с помощью кнопки Disable. Большая часть библиотек имеет параметры, которые определяют метод подключения клиентов к серверу. Хотя для всех библиотек установлены параметры по умолчанию, тем не менее, можно задать произвольные параметры. Для вызова окна свойств сетевой библиотеки, в котором и производится управление ее работой, служит кнопка Properties. После ее нажатия открывается диалоговое окно, где и выполняется настройка библиотеки. Список доступных опций индивидуален для каждой библиотеки. На рис. 6.27 приведено окно свойств библиотеки TCP/IP (сокеты TCP/IP). § STORAGE - TCP/IP Network Protocol Default Value Setup Default port: Г" Hide server
OK
Cancel
Help
Рис. 6.27. Диалоговое окно свойств сетевой библиотеки TCP/IP
Библиотека TCP/IP позволяет изменять номер порта, который будет использовать сервер для установки соединений. Не зная этого номера, клиенты не смогут установить соединение с SQL Server 2000. Помимо номера порта, установка флажка Hide server позволяет "спрятать" сервер. Это приведет к тому, что при поиске серверов сети с использованием библиотеки TCP/IP ни клиенты, ни другие серверы не будут находить конфигурируемой установки. Для обращения к серверу клиенты должны знать его имя или адрес.
Замечание Хотя сетевые библиотеки и позволяют изменять параметры конфигурации, это может вызвать определенные проблемы. В частности, клиенты должны будут знать, какие параметры заданы на сервере. В противном случае они не смогут установить соединение. Значения по умолчанию являются стандартными и известны всем клиентам.
На вкладке General утилиты SQL Server Network Utility (см. рис. 6.26) также имеется несколько элементов управления, используемых при работе с проксисервером: • Enable protocol encryption. Установка флажка обеспечивает шифрование данных, передаваемых по сети, с использованием протокола SSL (Secure Socket Layer). В отличие от SQL Server 7.0, поддерживающим шифрование только для библиотеки Multiprotocol, в SQL Server 2000 шифрование выполняется для всех сетевых библиотек. Данный процесс гарантирует, что передаваемая
124
Часть II. Установка SQL Server 2000
по сети информация не может быть просмотрена даже при перехвате всех сетевых пакетов.
Замечание SQL Server 2000 был подан на сертификацию по уровню безопасности С2, который выдвигает довольно высокие требования к безопасности хранимой, обрабатываемой и передаваемой по сети информации. О Enable WinSock proxy. Установка флажка разрешает использование проксисервера для передачи данных. Это позволяет обращаться к SQL Server 2000 не только локальным клиентам, но и клиентам Internet. Использование прокси-сервера требует конфигурирования дополнительных параметров, которые указываются в следующих полях: • WinSock proxy address — адрес прокси-сервера; • WinSock proxy port — номер порта прокси-сервера, который сконфигурирован для передачи сетевых пакетов SQL Server 2000. На этом работа с вкладкой General заканчивается. Вкладка Network Libraries (рис. 6.28) содержит список доступных сетевых библиотек, а также некоторую информацию о них. 2Si
I SQL Server Network Utility General Network Libraries Server name: Server network library Named Pp i es TCP/IP Multiprotocol NWLn i k IPX/5PX AppleTalk Banyan Vines Shared Memory
STORAGE j Library file name SSNMPN70.DLL SSNETLB I .DLL SSMSRP70.DLL SSNETLB I .DLL 55M5AD70.DLL 55MSVI70.DLL SSMSSH70.DLL
| Path G:\PROGR.. G:\PROGR.. G:\PROGR.. G:\PROGR.. G:\PROGR.. G:\PROGR,., G:\PROGR..
j Version 8.0.100 8.0.100 8.0.100 8.0.100 8.0.100 8,0,100 8,0.100
OK
Cancel
File date I Size | 18.04.... 24 638 Bytes 18.04,.,. 106 558 Bytes 18,04,... 32 823 Bytes 18,04,... 106 558 Bytes 18.04,... 32 823 Bytes 18,04,... 41015 Bytes 18,04..,. 32 830 Bytes
Help
Рис. 6.28. Утилита SQL Server Network Utility, вкладка Network Libraries
Для каждой библиотеки отображается информация о ее версии, имени и размещении соответствующего dll-файла, его размер и дата создания.
Глава 6. Установка SQL Server 2000
125
Установка и конфигурирование клиентов После установки и настройки на сервере необходимых сетевых протоколов и библиотек можно приступить к конфигурированию клиентов. Конфигурирование клиентов предполагает выполнение тех же операций, что и при конфигурировании сервера. На уровне операционной системы необходимо установить сетевые протоколы, после чего настроить нужные библиотеки SQL Server 2000. При выборе протоколов и библиотек на клиенте следует, конечно же, учитывать то, какие протоколы и сетевые библиотеки существуют на сервере. Если на сервере и клиенте будут использованы различные протоколы и библиотеки, то установление соединения будет невозможно. Например, если на сервере используется протокол TCP/IP и одноименная библиотека TCP/IP, а на клиенте установлен протокол IPX/SPX с библиотекой NWLink IPX/SPX, то установление соединения между сервером и клиентом SQL Server окажется невозможным. Замечание По умолчанию SQL Server 2000 как на клиенте, так и на сервере использует именованные каналы, но серверная часть именованных каналов работает только под управлением операционных систем Windows NT и Windows 2000.
Для конфигурирования клиентских компонентов SQL Server 2000 предназначена утилита SQL Client Network Utility, имеющей четыре вкладки. Вкладка General (рис. 6.29) служит собственно для инсталляции сетевых библиотек. a SQL Server Client Network Utility General j A|jas j DB-Library Options | Network Libraries \ Disabled protocols: NWLink IPX/SPX AppleTalk Banyan VINES
2<J
Enabled protocols by order: TCP/IP N amed Pipes
Enable >> « fJisable
t i l
Properties..
Г" Enable protocol encryption W Enable shared memory protocol Cancel
Help
Рис. 6.29. Утилита SQL Client Network Utility, вкладка General
Замечание Утилита SQL Client Network Utility может быть запущена из главного меню операционной системы (Programs\Microsoft SQL Server\Client Network Utility). Другой вариант
126
Часть II. Установка SQL Server 2000 ее запуска предполагает выполнение программы cliconfg.exe, которую можно найти в подкаталоге System (для Windows 98) или System32 (для Windows NT и Windows 2000) операционной системы.
В списке Disabled protocols перечислены имена не используемых сетевых библиотек. Для активизации любой из приведенных в списке библиотек достаточно нажать кнопку Enable. После этого имя библиотеки удаляется из списка Disabled protocols, но добавляется в список Enabled protocols by order, в котором перечислены все библиотеки, используемые установкой. Если некоторая активная библиотека более не нужна, ее необходимо удалить из списка Enabled protocols by order с помощью кнопки Disable. Если на клиенте используется множество библиотек, то соединение с сервером может быть установлено с использованием любой из них. Однако после того, как соединение установлено, работа с сервером ведется с применением конкретной библиотеки, выбор которой происходит следующим образом. Клиент по очереди перебирает библиотеки, перечисленные в списке Enabled protocols by order, начиная с самой верхней. Если на сервере имеется аналогичная библиотека, и параметры конфигурации сервера и клиента совпадают, то соединение будет использовать эту библиотеку и перебор на этом останавливается. Таким образом, библиотека, находящаяся вверху списка, имеет больше шансов быть использованной для установки соединения. Если желательно, чтобы клиент применял конкретную библиотеку, то ее следует поместить в верхнюю часть списка. Для этого предназначены кнопки со стрелками. Конфигурирование параметров библиотеки выполняется с помощью окна свойств библиотеки, которое вызывается с помощью кнопки Properties. В нижней части вкладки имеется два флажка. Рассмотрим их назначение. П Enable protocol encryption. Установка флажка обеспечивает шифрование данных, передаваемых по сети. Однако, шифрование будет применяться только в том случае, если оно разрешено как на клиенте, так и на сервере. Установка флажка Enable protocol encryption только на клиенте без разрешения шифрования со стороны сервера не обеспечивает шифрования данных. П Enable shared memory protocol. Установка флажка разрешает коллективное использование памяти. Подобный подход используется, когда сервер и клиент находятся на одном компьютере. Задействование для обмена данными оперативной памяти, а не сетевых протоколов, позволяет повысить скорость обмена данными. Как не трудно заметить, для каждой библиотеки можно указать только один вариант параметров. Если же клиент будет работать с несколькими серверами, использующими одну и ту же сетевую библиотеку, но с разными параметрами, то на клиенте нужно будет каждый раз изменять параметры конфигурации в соответствии с настройками сервера. Конечно, такой способ работы вряд ли кого-нибудь устроит, особенно если нужно часто работать то с одним, то с другим сервером. Выходом из ситуации является применение так называемого псевдонима сервера (server alias). Каждый псевдоним имеет определенное имя и является своего рода
Глава 6. Установка SQL Server 2000
127
набором параметров, описывающих способ подключения клиента к серверу, а также собственно сервер, к которому будет осуществляться подключение. Имя псевдонима сервера и собственно имя сервера не обязательно должны совпадать. Более того, сервер может иметь множество псевдонимов, каждый из которых может содержать различные варианты конфигурации сетевых библиотек. Конфигурирование псевдонимов сервера осуществляется с помощью вкладки Alias (рис. 6.30).
X] General Alias DB-Library Options] Network Libraries | S ervef alias configurations Server alias Network library FOEREX Named Pipes
| Connection parameters
\\S T 0RAG Е \.pipe\iql\query
STORAGE.8723
Add..
JRenno
£dit...
jj
OK
Cancel
Apply
Help
Рис. 6.30. Утилита SQL Client Network Utility, вкладка Alias
Эта вкладка содержит список псевдонимов, для каждого из которых указывается имя сетевой библиотеки и установленные параметры конфигурации. Для удаления ненужного псевдонима используется кнопка Remove, тогда как для изменения свойств существующего псевдонима достаточно нажать кнопку Edit. Если же требуется добавить новый псевдоним, то нужно воспользоваться кнопкой Add, нажатие которой приведет к выводу диалогового окна Add Network Library Configuration (рис. 6.31). В этом окне в первую очередь в поле Server alias необходимо указать имя псевдонима, которое будет использоваться для установления соединения с сервером. Клиент должен будет вводить не имя самого сервера, а соответствующий псевдоним. При этом установление соединения будет осуществляться с применением сконфигурированной сетевой библиотеки с указанными параметрами. Для каждого псевдонима допускается использование лишь одной сетевой библиотеки, выбор которой осуществляется с помощью переключателя группы Network libraries. В группе Connection parameters указываются параметры настройки выбранной библиотеки. Их конкретный набор зависит от того, какая библиотека была выбрана. После указания всех необходимых параметров остается только нажать кнопку ОК, после чего псевдоним будет добавлен на вкладку Alias.
Часть II. Установка SQL Server 2000
128 Щ Add Network Library Configuration Server alias:
—Д,
I PRIVATE
Network libraries-\
xJ
C o n n e c t i o n parameters
Named Pipes
Server name:
G ICP/IP
|ST0RAGE|'
Г* Dynamically determine port
С Multiprotocol С NWLink IPX/SPX
Port number:
8723
<~ AppleTalk. С Banyan VINES Г Other
OK
Help
Cancel
Рис. 6 . 3 1 . Окно Add Network Library Configuration
Третья вкладка DB-Library Option утилиты SQL Client Network Utility (рис. 6.32) содержит информацию об установленной на клиенте библиотеке DB-Library, которая является одним из механизмов работы с данными. О SQL Server Client Network Utility General) Alias
D В-Library Options | Network Libraries |
DB-Library information--
- —
-
File name:
G:\WINNT\Systern32\NTWDBLIB.DLL
Version:
8.00.100
Date:
18.04.2000
Size:
274 483 Bytes
'Automatic ANSI to OEM conversion Use international settings
OK
Cancel
Apply
Help
Рис. 6.32. Утилита SQL Client Network Utility, вкладка DB-Library Option
В группе DB-Library information указываются основные сведения об используемой библиотеке. В частности, выводится имя соответствующего dll-файла, номер версии, дата создания и размер файла.
Глава 6. Установка SQL Server 2000
129
В нижней части окна имеются два флажка, предназначенных для управления параметрами устанавливаемого с помощью DB-Library соединения: • Automatic ANSI to OEM conversion. Установка флажка обеспечивает автоматическое преобразование текстовых данных из формата OEM в формат ANSI при передаче данных от клиента к серверу, и преобразование из ANSI в OEM при передаче от сервера к клиенту. G Use international settings. При пометке флажка библиотека DB-Library будет использовать национальные установки (формат даты, времени, валюты и т. д.), взятые из локальной системы. В противном случае будут применяться значения по умолчанию, сконфигурированные в самой библиотеке.
Замечание Флажок Automatic ANSI to OEM conversion установлен по умолчанию на всех клиентах, тогда как флажок Use international settings отмечен только на клиентах, работающих под управлением 32-разрядных операционных систем.
На этом рассмотрение третьей вкладки заканчивается. Остается рассмотреть самую последнюю вкладку — Network Libraries (рис. 6.33). 2<J
a SQL Server Client Network Utility General] Alias | DB-Library Options Network Libraries Network Library Named Pipes TCP/IP Multiprotocol NWLink IPX/SPX AppleTalk Banyan VINES
Library File Name GAWINNT\System32\DBNMPNTW.DLL GAWINNT\System32\DBNETLIB.DLL G:\WINNT\Ss i tem32\DBMSRPCN.DLL GAWINNT\System32\DBNETLIB.DLL GAWINNT\System32\DBMSADSN.DLL G:\WINNT\System32\DBMSVINN.DLL
Version j File Date See 8.0.100 18.04.... 32 830 By 8.0.100 18.04... 8G 078 By 8.0.100 18.04... 28 727 By 8.0.100 18.04... 86 078 By 8.0.100 18.04.... 32 823 By 8.0.100 18.04.... ЗБЭ19ВУ
1
OK
Cancel
Apply
\
Help
Рис. 6.33. Утилита SQL Client Network Utility, вкладка Network Libraries
Данная вкладка содержит список доступных сетевых библиотек, а также информацию о версии, имени и размещении соответствующего dll-файла, его размере и дате создания.
ЧАСТЬ III. АДМИНИСТРИРОВАНИЕ Глава 7. Управление работой служб SQL Server 2000 Глава 8. Конфигурирование служб SQL Server 2000 Глава 9. Система безопасности SQL Server 2000 Глава 10. Административные задачи Глава 11. Доступ к гетерогенным источникам данных Глава 12. Автоматизация администрирования SQL Server 2000 Глава 13. Резервное копирование Глава 14. Репликация данных Глава 15. Мониторинг и аудит Глава 16. Создание отказоустойчивой системы
Глава 7
Управление работой служб SQL Server 2000 Как уже не раз говорилось, SQL Server 2000 реализован в виде набора служб. Поэтому, прежде чем пользователи смогут выполнять любые действия с SQL Server 2000, необходимо запустить соответствующие службы. Только после этого пользователи смогут устанавливать соединение с серверов, выполнять запросы, хранимые процедуры или администрировать сервер. В этой главе будут подробно рассмотрены различные варианты запуска служб SQL Server 2000, а также их останов и приостанов. Каждая служба операционной системы запускается с правами определенной учетной записи. В качестве такой учетной записи может выступать пользователь домена, локальный пользователь или учетная запись локальной системы. Службы SQL Server 2000 могут работать как под одной, так и под разными учетными записями. Учетные записи служб рассматриваются операционной системой так же, как и учетные записи обычных пользователей. Это означает, что для учетных записей служб SQL Server 2000 действуют все правила политики безопасности, установленные в домене. Данную особенность следует учитывать при выполнении операций с учетными записями служб. Замечание В этой главе не станут обсуждаться достоинства и недостатки использования служб SQL Server 2000 того или иного типа учетных записей. Эти вопросы были подробно рассмотрены в разд. "Подготовка учетных записей" главы 3.
В одной из предыдущих глав было сказано, что основная часть функций SQL Server 2000 реализуется службой MSSQLServer. Поэтому достаточно запустить только эту службу, чтобы предоставить пользователям возможность выполнять транзакции, запросы и хранимые процедуры, работать с различными объектами баз данных. Другие службы SQL Server 2000 являются второстепенными и их работа строится на фундаменте, обеспечиваемом службой MSSQLServer. Например, служба SQLServerAgent позволяет автоматизировать выполнение рутинных действий, обеспечить извещение операторов о сбоях в работе сервера. Однако сама по себе эта служба функционировать не может. Для ее работы необходимы механизмы, обеспечиваемые службой MSSQLServer. Поэтому служба SQLServerAgent должна запускаться после того, как будет запущена служба MSSQLServer. Аналогичная ситуация складывается и с другими дополнительными службами SQL
134
Часть III. Администрирование
Server 2000. Каждая из них самостоятельно подключается к MSSQLServer подобно обычному пользователю и использует для своей работы стандартные механизмы SQL Server 2000.
Старт, останов и приостанов служб Как уже стало ясно, прежде чем начать работу с SQL Server 2000, его необходимо запустить. Запуск служб может выполняться как вручную пользователем, так и автоматически операционной системой. Автоматический запуск служб SQL Server 2000 можно разрешить при инсталляции сервера. Однако если вы не сделали этого в процессе установки, то это можно легко выполнить и позже с помощью утилиты Service Manager, консоли администрирования Enterprise Manager или с помощью утилиты Services из Control Panel (Панели управления) операционной системы. Вы можете управлять не только локальным SQL Server 2000, но и любым другим сервером сети, на котором вам предоставлены соответствующие права доступа. Удаленное управление возможно как средствами операционной системы, так и средствами утилит SQL Server 2000. В следующих разделах будут рассмотрены различные методы управления работой служб SQL Server 2000. Замечание Напомним, что в Windows 98 не реализована технология служб, поэтому запуск и останов работы SQL Server 2000 в этой операционной системе выполняется аналогично запуску и завершению обычных приложений.
Запуск (start) службы подразумевает загрузку в оперативную память соответствующего кода, который выполняет функции, специфичные для запущенной службы. Код выполняется как часть операционной системы в виде одного или более потоков, а не как обычное приложение. Поэтому на панели задач список загруженных служб не отображается. Непосредственно после того, как служба была запущена, она может приступить к выполнению своих задач. Применительно к службе MSSQLServer это означает, что пользователи могут подключаться к серверу и работать со всеми механизмами. Замечание Стоит сказать, что для управления функционированием служб SQL Server 2000 необходимо иметь соответствующие права. Причем если пользователь имеет право управлять работой служб одного сервера, это еще не значит, что он сможет управлять работой служб других серверов. На каждом из серверов сети, с которыми предполагается работать, пользователь должен иметь соответствующие права доступа.
Останов (stop) службы подразумевает освобождение памяти, занимаемой кодом службы. При этом также закрываются все потоки, используемые службой. Как следствие, другие службы, приложения и пользователи лишаются возможности использовать функции, предоставляемые службой. Например, при останове
Глава 7. Управление работой служб SQL Server 2000
135
MSSQLServer обрывается выполнение пользовательских запросов, выполняется откат незавершенных транзакций, уничтожаются все временные объекты и т. д. Выполнение останова службы может лишить пользователя возможности нормально завершить работу и привести к потере данных. Выходом из ситуации является предварительный приостанов (pause) сервера. В этом случае все пользователи, уже использующие службу, имеют возможность завершить свою работу, однако новые пользователи не смогут обратиться к службе. После того, как служба выполнит текущую задачу подключенного пользователя, она не примет от него никакого нового задания. То есть с момента приостанова служба только завершает имеющиеся задания, но не начинает новые. После того, как все задания будут завершены, можно безболезненно выполнить останов службы.
Замечание Не все службы поддерживают останов. Эта операция имеет смысл только для служб, обрабатывающих задания пользователей. Например, пользовательский запрос, печать документа или скачивание файла. Применительно к SQL Server 2000 это означает, что служба MSSQLServer поддерживает приостанов, а службы SQLServerAgent, Full-Text Search и MSDTC — нет.
Утилита SQL Server Service Manager Единственной задачей утилиты SQL Server Service Manager (рис. 7.1) является предоставление пользователю удобного механизма запуска, останова и приостанова служб SQL Server 2000. Кроме этого, она позволяет лишь запретить или разрешить m SQL Server Service I автоматический запуск той или иной служServer: бы при загрузке операционной системы. |SQL Server Services: 3 Утилита Service Manager устанавливается Refresh services.. при инсталляции SQL Server 2000 и по умолчанию автоматически запускается при загрузке операционной системы. Автомаau us se e ,/"•) .-"...1 -Pa тический запуск обеспечивается путем .„ i ~ включения соответствующего ярлыка • 1 Stfip программы в пункт Startup (Автозагрузка), P Aulo-start service when OS starts находящийся в меню Programs (Программы) главного меню. При регистрации punning -WSTORAGE-MSSQLServer пользователя в системе операционная сисРис. 7 . 1 . Утилита Service Manager тема автоматически выполняет все программы и открывает файлы, расположенные в этой папке или имеющие ссылки на них в виде ярлыков. Помимо исполняемых файлов и ссылок на них, в этой папке могут располагаться графические, текстовые, музыкальные, видео- и другие файлы. В нашем случае мастер установки помещает в пункт Startup ярлык утилиты Service Manager. В нормальном состоянии утилита Service Manager представлена значком в правой части панели задач (taskbar). Двойной щелчок на значке приведет к откры-
136
Часть III. Администрирование
тию окна программы (см. рис. 7.1). С помощью этого окна можно запускать, останавливать и приостанавливать службы SQL Server 2000, а также разрешать или запрещать их автоматический запуск при загрузке операционной системы. В верхней части окна находятся два раскрывающихся списка. Первый из них, Server, содержит список имен серверов сети, на которых был обнаружен SQL Server 2000. Если на сервере имеется более одной инсталляции SQL Server 2000, то каждая из них представлена отдельным пунктом списка. Имя именованной инсталляции и сервера отделяются слэшем. После того, как в списке Server будет выбран нужный сервер, в списке Services будут перечислены службы, установленные на выбранном SQL Server 2000. Хотя чаще всего список служб одинаков на всех серверах, тем не менее, иногда некоторые службы могут быть не установлены. Для управления работой конкретной службы необходимо сначала выбрать ее в списке Services. После этого в правой нижней части окна отобразится состояние службы — запущена, приостановлена или остановлена. В зависимости от текущего состояния службы зависит и список доступных кнопок. Например, для запущенной службы доступна кнопка приостанова (Pause) и останова (Stop), тогда как для остановленной службы доступна только кнопка запуска службы (Start/Continue).
Г
Замечание
j
Управление работой служб возможно не только из окна утилиты, но и с помощью контекстного меню значка Service Manager. Контекстное меню также позволяет переключать службы. Единственно, с его помощью нельзя переключаться между серверами и управлять возможностью автоматического запуска служб SQL Server 2000. После того, как была нажата та или иная кнопка, серверу понадобится некоторое время на выполнение команды. В течение этого времени состояние сервера в Service Manager может не измениться или оставаться неопределенным. Более того, в зависимости от настроек Service Manager может пройти довольно много времени, прежде чем утилита отобразит изменение состояния службы. Чтобы получить актуальную информацию о состоянии службы, рекомендуется нажать кнопку Refresh services. Это приведет к тому, что Service Manager обратится к серверу для опроса состояния службы. В нормальном же состоянии Service Manager опрашивает состояние службы через определенные интервалы времени, которые по умолчанию равны 5 секундам. Изменить интервал можно, если в контекстном меню значка Service Manager выбрать команду Options. В ответ откроется диалоговое окно SQL Server Service Manager Options (рис. 7.2). В раскрывающемся списке Default service выбирается имя службы, которая будет назначена по умолчанию в Service Manager. Интервал опроса состояния служб указывается в поле Polling interval в секундах. Установка флажка Verify service control action приведет к тому, что при попытке остановить службу MSSQLServer пользователю станет выдаваться сообщение о том, что будут остановлены и все зависящие службы (например, SQLServerAgent). Если флажок
Глава 7. Управление работой служб SQL Server 2000
137
сброшен, то подобное сообщение не появится, хотя останов зависящих служб все равно будет выполнен. SQL Server Service Manager Default service:
JSQL Server
Polling interval (seconds): Jv* Ve.ify service control action
ок
Cancel
Рис. 7.2. Окно SQL Server Service Manager Options
На этом рассмотрение работы с утилитой Service Manager заканчивается. Хотя список функций утилиты и невелик, ее достоинством является небольшой размер занимаемой оперативной памяти и доступность. Вам не нужно открывать такого монстра, как Enterprise Manager, или искать утилиту Services в Control Panel только для того, чтобы приостановить одну из служб. Гораздо быстрее и удобнее воспользоваться утилитой Service Manager.
Утилита Enterprise Manager Использование Service Manager для управления работой служб SQL Server 2000 представляется удобным, если не запущены никакие другие средства администрирования. Однако у многих профессиональных пользователей и администраторов баз данных постоянно запущен Enterprise Manager и Query Analyzer, причем часто в нескольких копиях. Если Enterprise Manager уже запущен, то для управления работой служб часто удобнее воспользоваться именно им, а не открывать Service Manager. Замечание Запуск нескольких копий Enterprise Manager часто вызван тем, что он не позволяет переключаться между окнами, когда выполняется редактирование хранимых процедур, кода представлений и некоторых других объектов.
Если утилита Service Manager представляет унифицированный интерфейс для управления работой служб, то управление службами средствами Enterprise Manager требует обращения к различным элементам дерева. Для управления параметрами запуска службы MSSQLServer сначала необходимо выбрать в панели Enterprise Manager нужный сервер (рис. 7.3). Собственно запуск, останов и приостанов службы выполняется с помощью меню Action или контекстного меню значка сервера. Как и при работе с Service Manager, список доступных операций зависит от текущего состояния службы. Помимо старта, останова и приостанова службы, при работе с Enterprise Manager имеются такие операции, как присоединение (connect) и отсоединение (disconnect). В присоединенном состоянии Enterprise Manager может получать от соответствующего сервера список объектов, выполнять административные операции. Однако при этом с сервером устанавливается соединение. Если максимальное количество подключений к серверу ограничено, то не следует без особой надобности держать открытым соединение с сервером. После того, как
138
Часть III. Администрирование
работа с сервером будет завершена, рекомендуется отсоединиться от него, выбрав в контекстном меню сервера или в меню Action команду Disconnect. При необходимости позже можно будет легко вновь подключиться к серверу, выбрав в меню команду Connect. Хй SQL Server Enterprise Manager - [Console Root\Microsoft SQI Server*\SQI i
33 Console
Window
Help
Li Action View lools !i Ф3 •>•• ' dD1 ИЗ У'- |f¥ LD Tree |
С?
-г
f-N
I*' 0 Ж Си
| STORAGE\SQL_SERVER_2000 (Wind )WS NT/2000)
.
6 Items
!
""| Console Root :- Iff Microsoft SQL Servers '- | J SQL Server Group El f£) CIT (Windows NT/2000)
General
1Щ S T ( 3RAGE\SQL_SERVER_2OOO
Щ
Ш-wS MILLENNIUM (Windows NT/2000) + _7, STORAGE (Windows NT/2000)
+ Л:, 6iiM:TJ!!rfJtJSMBJ^a;irJililiJi«iWi New SQL Server Registration... £dit SQL Server Registration properties. Delete SQL Server Registration
er Name: on: ion:
Disconnect Stop Pause
essor»: Space Used: у -alinq System:
N.ew All Tasks
n figuration
Refresh
« r Server:
Properties
c t Server: isher:
Help
Pull Subscriber:
!
47 MB Microsoft Window* N1
*
New Window from Here
Enterprise Edition Miwosoft SQL Server 8.0 511 ME
M
No Mo No No
•;
Push Subscriber:
Рис. 7.З. Управление службой MSSQLServer средствами Enterprise Manager
Если Enterprise Manager подключен к серверу, то на соответствующем серверу значке будет иметься красная зигзагообразная линия. Одновременно Enterprise Manager может быть подключен к множеству серверов. Для неподключенных серверов отображается только их состояние (запущен, остановлен или приостановлен). При выборе сервера в панели Enterprise Manager происходит автоматическое подключение к этому серверу. В зависимости от свойств регистрации сервера, при попытке подключения к остановленному SQL Server 2000 может быть автоматически выполнен запуск службы MSSQLServer. Замечание Помимо того, что автоматический запуск службы MSSQLServer может выполняться при выборе сервера в панели Enterprise Manager, можно также запустить эту службу с помощью Query Analyzer, установив флажок Start SQL Server if it is stopped (запустить SQL Server если он остановлен) в окне Connect to SQL Server (рис. 7.4).
Глава 7. Управление работой служб SQL Server 2000
139
Это окно автоматически открывается при запуске Query Analyzer или в случае выбора команды Connect в меню File. В списке SQL Server необходимо указать имя сервера, который следует запустить. Имя можно выбрать в списке, либо ввести вручную.
<-' A
SQLServer:
STORAGE
4 ... M
17 St^rt SQL Server if it is stopped Connect using: f" Windows NT authentication ***" SQ.L Server authentication Login name: sa Password:
jxxxx***»»»^ OK
Help
Cancel
Рис. 7.4. Окно Connect to SQL Server
Мы рассмотрели управление службой MSSQLServer. Управление службой SQLServerAgent мало чем отличается от работы со службой MSSQLServer. Сначала необходимо выбрать значок службы SQLServerAgent (рис. 7.5). Найти ее можно в папке Management нужного сервера. Запуск и останов службы выполняется либо с помощью контекстного меню, либо с помощью кнопки Action. Заметим, что . для службы SQLServerAgent в меню нет команды Pause, т. к. эта служба не поддерживает приостанова.
ш SQL Server Enterprise Manager - [Console Root\MJtros(tft SI •'^El Console I: Action
Window
View
Tools
Help
•:-N Ь О В
: [ <>
SQL Server Agent 3 Item:
Tree J
'%
_j Consoe l Root - Cjj Mc i rosoft SQL Servers E! <|j SQL Server Group + +i + -
О
Щ) CIT (Windows NT/2000) -_5 MILLENNIUM (Windows NT/2000 _V, STORAGE (Windows NT/2000) Д ) STORAGE\SQL_SERVER_2000 (\ ffl C j Databases 'Si C i Data Transformation Service EJ i_3 Management
IS Operao trs
Jobs
• У . 5ЭЕЗЯЕНЯ
;
;
•
•
•
#
Start
.
Ш Display Error Log,..
.
M.ulti Server Administration • New •
В L J Sec
im
View • New Window from Here Refresh Export List... Properties Help
Рис. 7.5. Управление службой SQLServerAgent средствами Enterprise Manager
; -J.ffj.ji
Часть III. Администрирование
140
Управление службами Full-Text Search и Microsoft Distributed Transaction Coordinator (MSDTC) осуществляется аналогично описанным MSSQLServer и SQLServerAgent. Как Full-Text Search, так и MSDTC располагаются в папке Support Services (рис. 7.6). Эти службы, как и служба SQLServerAgent, не поддерживают приостанов. Tn SQl Server Enterprise Manager [Console Rool\M)crosofl SQl S«rycrs\SQL Server bro. ijijfb £pnsole Window Help |j Action View Tools Tree j
О «# © i HI >>: Ш Щ Щ> \ \Й ' j i- vS 0^ Q QO Cd j Support Services 3 Items
В ^ J SQL Server Group
j j
+ Щ ) CIT (Windows NT/2000) .+' -_5 MILLENNIUM (Windows NT/2000 + _'•) STORAGE (Windows NT/2000) - Щ
|1
J Distributed Transacti...
1
-
ЩИ! Ш } P f f l S
1 — idPl > li \
J
SQL Mail
STORAGE\SQL_SERVER_2000 (\ Start
ftl-t-'-l Databases Щ C J Data Transformation Service Fl-P'l Management \
&-Щ
!
; - - { p Backup + Щ Current Activity
SQL Server Agent
New Window from Here Refresh
i Щ Database Maintenance F
|
: ffl Q
Properties
SQL Server Logs :
\-\-i 1 Replication
Help
! ffl C J Publications j
:
' - Q j Subscriptions
S9 Qi Security : F j ^ Logins i
; ' f c Server Roles
:
+ ffii Linked Servers
! "'"Ш Remote Servers Id ' £ j Support Services : : g y Distributed Transaction <
; J
:
! Щ Full-Text Search В 5QL Mail
Й CD Meta Data Services *\
i
~ • Г
Рис. 7.6. Службы Full-Text Search, MSDTC и SQL Mail
Утилита Services В двух предыдущих разделах было рассмотрено управление работой служб SQL Server 2000 с использованием средств самого SQL Server 2000. В этом же разделе обсудим применение утилиты Services. Утилита Services специально предназначена для управления службами на уровне операционной системы. Если Service Manager и Enterprise Manager позволяют управлять только службами SQL Server 2000, то с помощью утилиты Services можно управлять любыми службами, установленными в операционной системе.
С
Замечание
Мы уже не раз говорили, что операционная система Windows 98 не поддерживает служб. Поэтому материал этого раздела относится только к операционным системам класса Windows NT, в т. ч. и к Windows 2000.
Глава 7. Управление работой служб SQL Server 2000
141
Утилита Services устанавливается при инсталляции операционной системы и размещается в Control Panel (Панели управления) операционной системы. Вид и принципы работы с утилитой Services различаются в Windows NT 4.0 и в Windows 2000. Поэтому рассмотрим отдельно работу с ней в каждой из операционных систем. При работе с операционной Windows NT 4.0 утилита Services располагается непосредственно в Control Panel, которую можно вызвать из главного меню операционной системы, нажав кнопку Start (Пуск), затем выбрав команду Settings (Настройки), а потом пункт Control Panel (Панель управления). В открывшемся окне (рис. 7.7) необходимо дважды щелкнуть на значке Services. Ш Control Panel Tile Edit V.iew . Help
Add/Remove BDE Programs Administrator
Console
Data Sources (ODBC)
Date/Time
Devices
Dsi play
Fonts
Keyboard
Licensing
LvieUpdate Modems
Mouse
MSDTC
Mutlm i eda i
Network
PC Card (PCMCA I)
Printers
Regional Setings
S3 Coo l r SCSI Adapters Server Control
Sounds
System
Почта
Свойства обозревателя
Tape Devices
Telephony
UPS
{Starts, stops, and configures services.
Ports
Поиск Файлов
Рис. 7.7. Окно Control Panel
В ответ откроется окно утилиты Services (рис. 7.8). Основную часть окна занимает список установленных в операционной системе служб, отсортированных в алфавитном порядке. Список состоит из трех столбцов: П Service — указывается имя службы. • Status — показывается текущее состояние службы. Если служба запущена, то в столбце появится значение Started. В противном случае ничего не выводится. • Startup — в этом столбце отображается способ запуска соответствующей службы. Возможны состояния Automatic, Manual и Disabled. Более подробно назначение каждого типа запуска будет рассмотрено далее в этой главе.
Часть III. Администрирование
142
В нижней части окна имеется поле ввода Startup Parameters, в котором указываются дополнительные ключи запуска службы. Обычно это поле пусто.
Servc ie Messenger MSDTC M i SSQLServer Net Logon Network DDE Network DDE DSDM NT LM Securtiy Support Provd i er Pu l g and Pa ly Protected Storage . Remote Procedure Cal (RPC) Locator
Status Started Started Started Started Started
Startup Automatc i Manual Manual Automatc i Manual Manual Manual Automatc i Automatc i Manual
olse и C II
Sa tru tp Paramee trs;
Statu jp. H W Proe lfis. Help
Рис. 7.8. Утилита Services Windows NT 4.0
В правой части окна находятся кнопки, с помощью которых и выполняется управление работой служб. В зависимости от текущего состояния службы набор доступных кнопок может изменяться. Для управления работой службы используются следующие кнопки: • Start — запуск остановленной службы. • Pause — применяется к запущенной службе и приводит к ее приостанову. В этом состоянии служба завершает выполнение запущенных заданий, но не начинает выполнение новых заданий. • Continue — применяется к приостановленной службе и переводит ее в нормальное рабочее состояние, т. е. служба может выполнять новые задания. П Stop — применяется к запушенной или приостановленной службе и приводит к ее останову. Для управления конкретной службой ее необходимо сначала выбрать в списке. При попытке останова службы, от работы которой зависят другие службы, утилита выдаст сообщение с соответствующим предупреждением и списком зависимых служб. Если же осуществляется запуск зависимой службы, когда основная служба остановлена, то будет выполнен сначала запуск основной службы, а уже затем зависимой. То есть когда пользователь пытается запустить службу SQLServerAgent при остановленной службе MSSQLServer, то система сначала запустит службу MSSQLServer, а уже только после этого SQLServerAgent. Утилита (или консоль) Services операционной системы Windows 2000 несколько усложнилась по сравнению с версией для Windows NT 4.0. Для запуска утилиты Services в Windows 2000 необходимо в Control Panel дважды щелкнуть по значку Administrative Tools или выбрать одноименный пункт в главном меню Programs (Программы). Следующий шаг — значок Services, после щелчка по которому откроется окно утилиты Services (рис. 7.9).
Глава 7. Управление работой служб SQL Server 2000
143
Замечание В операционной системе Windows 2000 имеется несколько способов доступа к функциям утилиты Services. Например, с помощью консоли Computer Management. % Services j Action
View I i +»- «4;
Tree I Щ$ Services (Local)
| • Name / ^Kerberos Key Distribution C... ^License Logging Service *% Logical Disk Manager *% Logical Disk Manager Admin.., ^Messenger % Microsoft Search %M55QL$5QL_SERVER_200u gigMSSQLServer Щ& MSSQLSer verOL APSer vice %Net Logon %>NetMeeting Remote Deskto... *%Network Connections % Network DDE % Net work DDE DSDM *%NT LM Security Support Pro... ^§gOffice Server Extensions N... ^Performance Logs and Alerts *%Plug and Play *% Print Spooler ^Protected Storage
•
1
| Description
j Status Started Starting Logical Disk,,. Started Administrate. Sends and ... Started Creates ful... Started Started Generates ...
Supports p... Allows aut... Manages o... Provides n... Manages s... Provides s...
Started Started
Started
Configures... Manages d... Started Loads files ... Started Provides pr... Started
Startup Type Automatic Automatic Automatic Manual Automatic Manual Manual Automatic Manual Automatic Manual Manual Manual Manual Manual Automatic Manual Automatic Automatic Automatic
j Log On As j^J LocalSystem LocalSystern LocalSystem LocalSystem LocalSystem LocalSystem j LocalSystem j .\Administ...B LocalSystem j LocalSystem j LocalSystem LocalSystem LocalSystem LocalSystem LocalSystern LocalSystem LocalSystem LocalSystern LocalSystem LocalSystemJlJ IjJ
Рис. 7.9. Утилита Services Windows 2000
Окно утилиты разделено на две части, что характерно для консоли управления Microsoft (MMC, Microsoft Management Console). Большинство современных продуктов Microsoft для выполнения администрирования используют интерфейс ММС, специально разработанный для этих целей. Windows 2000 не является исключением. Аналогичный интерфейс администрирования применяется и в Enterprise Manager. В левой части окна указывается объект, а в правой части — список вложенных объектов и свойств. Нас интересует только правая часть окна, в которой перечислены все имеющиеся в системе службы. Информация о службе выводится в нескольких столбцах: •
Name — имя службы, предназначенное для пользователя. В операционной системе используется другое имя, которое также применяется при управлении службами в режиме командной строки.
П Description — краткое описание службы. б Зак. 83
144
Часть III. Администрирование
П Status —текущее состояние службы. Если служба запущена, то в столбце будет выведено Started. В противном случае ничего не отображается. П Startup Type —режим запуска соответствующей службы. Возможны состояния Automatic, Manual и Disabled. Более подробно назначение каждого типа запуска будет рассмотрено далее в этой главе. •
Log On As —имя учетной записи, которая используется для запуска службы. Замечание Приведенный список содержит перечень всех столбцов, допустимых для служб. Однако при необходимости можно исключить те или иные сведения, а также изменить их порядок.
Управление работой службы можно выполнять двумя способами: •
с помощью контекстного меню;
П из окна свойств службы. В этой главе мы уже не раз рассматривали использование контекстного меню для управления работой службы, но не будет лишним еще раз остановиться на этом. Единственно, в контекстном меню службы в утилите Services Windows 2000 имеется пункт Restart. Он используется для перезапуска работающей службы. Перезапуск подразумевает останов службы, после которого выполняется повторный ее запуск. В принципе, перезапуск службы может быть выполнен и вручную за две операции. Перезапуск часто организуется при смене имени или пароля учетной записи, под которой стартует служба. Для открытия окна свойств службы достаточно дважды щелкнуть на имени нужной службы или выбрать в ее контекстном меню или меню Action команду Properties. Окно имеет четыре вкладки. Для управления работой службы предназначена вкладка General (рис. 7.10), которая имеет ряд элементов управления: П Service name — имя службы в операционной системе. Именно оно используется при управлении службой в режиме командной строки. П Display name — имя, которое отображается в консоли Services. При необходимости пользователь может указать любое произвольное имя, которое не обязательно будет соответствовать действительному имени службы. П Description — краткое описание службы. Этот текст отображается в одноименном столбце основного окна консоли Services. Хотя чаще всего значение в данном поле устанавливается при инсталляции службы, пользователь может ввести любой другой текст. •
Path to executable — полный путь до исполняемого файла, в котором хранится код службы.
П Startup type — режим запуска службы.
Глава 7. Управление работой служб SQL Server 2000
145
П Service status — текущее состояние службы (запущена, остановлена или приостановлена). • Start — кнопка запуска остановленной службы. • Stop — кнопка, применяемая к запущенной или приостановленной службе и приводящая к ее останову. • Pause — кнопка, применяемая к запущенной службе и приводящая к ее приостанову. В этом состоянии служба завершает выполнение начатых заданий, но не запускает на выполнение новые задания. • Resume — кнопка, применяемая к приостановленной службе и переводящая ее в нормальное рабочее состояние, т. е. служба может выполнять новые задания. П Start parameters — поле, позволяющее перечислять дополнительные ключи запуска службы. MSSQL$SQL_SERVER 2000I General 1 Log ORecovery] n Dependencies)
XiiiJ
Service name: MSSQL$SQL_SERVER_2000 Inscription:
|
Pathtoexecutable: QL$~1 \binn\sqlservr.exe-sSQL.SER ^ER_2000 Startup type:
(Manual
JJ
Service status: Started Stop
Pause
8» 1 You can specifyie start parameters that apply when you start the service from here.
OK
Рис. 7.10. Вкладка General окна свойств службы
На этом рассмотрение управления работой служб SQL Server 2000 с помощью утилиты Services можно считать законченным. Достаточно выбрать в списке нужную службу и воспользоваться контекстным меню или соответствующими кнопками. Однако следует обратить внимание, что при управлении службами SQL Server 2000 с помощью утилиты Services состояние сервера в Service Manager и Enterprise Manager может некоторое время не изменяться. При необходимости следует принудительно обновить его.
146
Часть III. Администрирование
Использование командной строки Все рассмотренные ранее способы управления работой служб SQL Server 2000 предполагали использование графических инструментов. Однако иногда бывает необходимо выполнить запуск или останов службы с помощью командного файлы, задания SQL Server 2000 или просто из командной строки. Во всех этих случаях можно использовать возможности утилиты командной строки net.exe. Эта утилита имеет множество функций, к которым относится регистрация пользователя в системе, отправка всплывающих сообщений по сети, получение времени с удаленного компьютера, просмотр и подключение ресурсов сети, получение статистики и некоторые другие, в том числе и управление работой служб.
Замечание Полный список функций утилиты net.exe можно получить, выполнив команду net / ?. Управление работой служб осуществляется с указанием следующих ключей: •
net start [service] — запуск службы;
П net stop [service] — останов службы; •
net pause [service] — приостанов службы;
П net continue [service] — возобновление работы службы после приостанова. Вместо [service] следует подставлять имя службы, которой предполагается управлять. Например, для запуска службы MSSQLServer следует выполнить следующую команду: net
s t a r t MSSQLServer
В ответ будут выведены сообщения: The MSSQLServer service is starting... The MSSQLServer service was started successfully.
Первое сообщение свидетельствует о попытке запуска службы, тогда как второе сообщает о том, что служба была запущена успешно. Запуск службы именованной инсталляции выполняется аналогично. Например, для запуска службы MSSQLServer инсталляции Trelon используется следующая команда: net
s t a r t MSSQL$Trelon
Замечание Выполнение команды net s t a r t без имени службы приведет к выводу списка запущенных в операционной системе служб.
Глава 7. Управление работой служб SQL Server 2000
147
Останов средствами Transact-SQL Описанные ранее способы останова сервера являлись в той или иной степени внешними по отношению к серверу. Однако останов сервера можно также выполнить и средствами языка Transact-SQL. Для этого предназначена команда SHUTDOWN, имеющая следующий синтаксис: SHUTDOWN [WITH NOWAIT]
Если команда выполняется с WITH NOWAIT, TO сервер не выполняет процесс контрольной точки для всех баз данных. Это обеспечивает быстрый останов сервера. При этом также происходит откат всех активных транзакций и завершение всех пользовательских процессов. Если WITH NOWAIT не указывается, то происходит более мягкое завершение работы сервера. Сначала выполняется приостанов сервера с ожиданием завершения всех начатых транзакций, и только после завершения всех процессов происходит останов сервера. При этом также выполняется процесс контрольной точки для каждой базы данных.
Запуск SQL Server 2000 как приложения До сих пор SQL Server 2000 рассматривался как набор служб, а запуск SQL Server 2000 подразумевал работу службы MSSQLServer. Однако существует возможность запускать SQL Server 2000 как отдельное приложение. Для этого необходимо выполнить программу sqlservr.exe, которую можно найти в папке \Program Files\Microsoft SQL Server\MSSQL\Binn. (
Замечание
^
Для запуска SQL Server 2000 из командной строки используется учетная запись пользователя, выполняющего запуск. Как следствие, SQL Server 2000 будет иметь те же права доступа, что и текущий пользователь. Если пользователю не предоставлен доступ к файлам баз данных, то попытка запуска сервера закончится неудачно. Все сообщения, которые при работе SQL Server 2000 как службы выводятся в журнал приложений (application log) операционной системы и журнал собственно SQL Server 2000, будут выводиться в режиме командной строки. Ниже приведен типичный набор сообщений, выводимый SQL Server 2000 при запуске в качестве приложения. 2001-08-05 22:53:40.64 server Microsoft SQL Server 2000 - 8.00.100 (Intel X86) Apr 18 2000 01:19:00 Copyright (c) 1988-2000 Microsoft Corporation Standard Edition on Windows NT 5.0 (Build 2195: ) 2001-08-05 22:53:40.69 server tion.
Copyright (C) 1988-2000 Microsoft Corpora-
2001-08-05 22:53:40.72 server
All r i g h t s reserved.
148
Часть III. Администрирование
2001-08-05 22:53:40.73 server Server Process ID is 652. 2001-08-05 22:53:40.74 server Logging SQL Server messages in file •G:\Program Files\Microsoft SQL Server\MSSQL\log\ERRORLOG'. 2001-08-05 22:53:40.81 server SQL Server is starting at priority class 'normal'(1 CPU detected). 2001-08-05 22:53:40.93 server User Mode Scheduler configured for thread processing 2001-08-05 22:53:40.97 server Using dynamic lock allocation. [2500] Lock Blocks, [5000] Lock Owner Blocks 2001-08-05 22:53:41.02 server Attempting to initialize Distributed Transaction Coordinator. 2001-08-05 22:53:42.14 spid3 Starting up database 'master'. 2001-08-05 22:53:42.62 spid3 0 transactions rolled back in database 'master' (1). 2001-08-05 22:53:42.65 spid3 Recovery is checkpointing database 'master' (1) 2001-08-05 22:53:42.85 server Using 'SSNETLIB.DLL' version '8.0.100'. 2001-08-05 22:53:42.92 server SuperSocket Info: Bind failed on TCP port 1433. 2001-08-05 22:53:42.96 spid5 Starting up database 'model'. 2001-08-05 22:53:42.98 spid3 Server name is 'STORAGE'. 2001-08-05 22:53:42.99 server SQL server listening on TCP, Shared Memory, Named Pipes. 2001-08-05 22:53:43.03 server Ready For Connections 2001-08-05 22:53:43.05 spid7 Starting up database 'msdb'. 2001-08-05 22:53:43.06 spid8 Starting up database 'pubs'. 2001-08-05 22:53:43.08 spid9 Starting up database 'Northwind'. 2001-08-05 22:53:43.61 spid5 Clearing tempdb database. 2001-08-05 22:53:44.81 spid5 Starting up database 'tempdb'. 2001-08-05 22:53:45.05 spid3 Recovery complete.
Когда SQL Server 2000 выполняется как обычное приложение, при просмотре состояния служб можно будет увидеть, что служба остановлена. Тем не менее, пользователи могут устанавливать соединения, получать доступ к объектам в соответствии с их правами, выполнять запросы, хранимые процедуры и т. д. Более того, можно будет выполнять администрирование инсталляции с помощью Enterprise Manager. Замечание Попытка остановить SQL Server 2000, запущенный как приложение, с помощью команды n e t s t o p MSSQL$lnstName, вызовет ошибку с выдачей сообщения о том, что служба не запущена. Останов SQL Server 2000, запущенного как приложение, выполняется либо с помощью команды Transact-SQL SHUTDOWN, либо нажатием комбинации клавиш + или +.
При запуске SQL Server 2000 как приложения необходимо перейти в каталог Binn нужной инсталляции. При запуске инсталляции по умолчанию нет необходимости указывать дополнительные ключи. Когда же запускается именованная инсталляция, необходимо использовать ключ -а с указанием имени инсталляции. Например, для запуска инсталляции Trelon следует перейти в каталог
Глава 7. Управление работой служб SQL Server 2000
149
\Program Files\Microsoft SQL Server\MSSQL$Trelon\Binn и выполнить следующую команду: sqlservr.exe -strelon
Соответственно, при соединении с запушенным SQL Server 2000 требуется помимо имени сервера указывать и имя инсталляции. Например, если SQL Server 2000 установлен на сервере Storage, то клиенты должны будут обращаться к серверу по имени Storage\Trelon.
Замечание При поиске серверов в сети ни Enterprise Manager, ни Query Analyzer не обнаружат имени SQL Server 2000, запущенного в роли приложения. Поэтому для доступа к такому SQL Server 2000 необходимо знать имя сервера и инсталляции. Легко создать новую инсталляцию SQL Server 2000, не выполняя собственно установку. Такую инсталляцию можно будет запускать как приложение, но нельзя выполнять как службу. Для создания инсталляции необходимо скопировать некоторые ключи реестра, создать в каталоге \Program Files\Microsoft SQL Server\ папку для новой инсталляции в формате MSSQLSlnstName и перенести в нее все файлы и каталоги из каталога инсталляции по умолчанию или именованной инсталляции. Данные именованной инсталляции располагаются в следующем ключе реестра: НКЕY_LOCAL_MACHINE \SOFTWARE \Microsoft \ Microsoft SQL Server \[Instance name]
Данные в этот ключ можно скопировать от другой именованной инсталляции, изменив соответствующим образом имя инсталляции. В разд. "Режимы запуска SQL Server 2000" далее в этой главе будет рассказано о параметрах запуска сервера. При необходимости можно внести некоторые изменения в опции запуска новой инсталляции. Однако на этом создание новой инсталляции не заканчивается. Требуется также внести изменения в таблицу sysdatabases базы данных Master, соответствующим образом изменив ссылки на системные и пользовательские базы данных.
Управление учетной записью службы Как уже не раз было сказано, каждая служба операционной системы, в том числе и службы SQL Server 2000, запускаются под определенной учетной записью. Выбор этой учетной записи имеет немалое значение, особенно когда предполагается взаимодействие нескольких серверов SQL Server 2000 между собой. В главе 4 рассматривалась подготовка учетных записей, которые будут использоваться для запуска служб SQL Server 2000. Там же объяснялись достоинства и недостатки применения того или иного типа учетных записей, а также методы
150
Часть III. Администрирование
создания учетных записей и предоставление им необходимых привилегий в операционных системах Windows NT 4.0 и Windows 2000. До сих пор предполагалось, что при инсталляции SQL Server 2000 учетные записи были выбраны удачно и нет необходимости изменять их. Чаще всего однажды созданная учетная запись используется службами сервера продолжительное время без внесения изменений. Тем не менее, иногда бывает необходимо внести некоторые изменения в свойства запуска службы. Чаще всего подобные изменения вносятся из-за смены пароля учетной записи, под которой запускается служба. Но иногда требуется изменить и имя учетной записи. Это бывает, например, когда на предприятии устанавливаются дополнительные серверы, и вместо локальной учетной записи решается использовать учетную запись пользователя домена. Прежде чем внести любые изменения в свойства запуска службы, необходимо исправить саму учетную запись. Например, если нужно сменить пароль, то сначала следует изменить его в диспетчере пользователей (в User Manager для Windows NT 4.0, или в Active Directory Users and Computers для Windows 2000). После этого следует изменить пароль в свойствах запуска учетной записи. Если же предполагается использовать новую учетную запись, то сначала нужно создать ее, и только после этого изменять свойства запуска службы. В следующих разделах будут рассмотрены различные способы изменения свойств запуска служб SQL Server 2000. Однако изменение свойств учетной записи на уровне операционной системы рассматриваться не будет. В разд. "Подготовка учетных записей" главы 4 были даны некоторые сведения по управлению учетными записями на уровне операционной системы.
Утилита Enterprise Manager Для управления параметрами запуска службы MS SQLServer выберите в панели Enterprise Manager нужный сервер и откройте окно его свойств (например, выбрав в контекстном меню сервера команду Properties). Окно свойств сервера (SQL Server Properties) содержит ряд вкладок, используемых для управления параметрами работы службы MSSQLServer. В данном случае нас интересует вкладка Security (рис. 7.11). На этой вкладке в разделе Startup service account можно изменить тип, имя и пароль учетной записи, используемой для запуска службы MSSQLServer. Если установить переключатель System account, то для старта службы будет назначена учетная запись локальной системы. Установив переключатель This account, можно указать имя и пароль любой учетной записи пользователя.
В отличие от утилиты Services, в утилите Enterprise Manager ввод неправильного имени пользователя или пароля недопустим. При нажатии кнопки ОК будет выдано соответствующее сообщение об ошибке.
Глава 7. Управление работой служб SQL Server 2000
151
SQL Server Properties (Configure) - ST Server Settings General j Memory
|
Database Settings Processor Security
Replication Connections
г SecuritySQL Server provides authentication based on Windows NT accounts and a named SQL Server login ID and password. Authentication: C : SQL Server and Windows NT/2000 ^Windows NT/2000 only Audit level: (* Цопе
*"* Failure
Г Success
f
Ajl
Startup service account 1фЪ
Start and run SQL Server in the following account: С' Sustem account (* Xhis account
SQLAccount
password:
OK
Cancel
Help
Рис. 7 . 1 1 . Вкладка Security окна свойств сервера
Изменение параметров учетной записи службы SQLServerAgent также производится с помощью окна свойств службы. Значок службы можно найти в папке Management, предварительно выбрав нужный сервер в панели Enterprise Manager. Окно свойств службы SQLServerAgent содержит пять вкладок. Управлять параметрами учетной записи, используемой для работы службы, позволяет вкладка General (рис. 7.12). В разделе Service startup account можно выбрать либо учетную запись локальной системы (переключатель System account), либо учетную запись пользователя (переключатель This account), указав при этом его имя и пароль. Ввод неверных данных об имени или пароле пользователя также приведет к ошибке. Управление параметрами учетной записи службы MSDTC из утилиты Enterprise Manager не реализовано. Для изменения учетной записи следует использовать утилиту Services из состава Control Panel. Замечание Если SQL Server 2000 используется совместно с компонентом Microsoft Search, то изменение имени учетной записи или пароля для службы MSSQLServer должно выполняться только средствами Enterprise Manager. Для подключения службы Microsoft Search к службе MSSQLServer первая использует имя и пароль учетной записи, под
Часть III. Администрирование
152
которой стартует служба MSSQLServer. Если смену имени или пароля производить из Enterprise Manager, то внесенные изменения автоматически отразятся на работе службы Microsoft Search. Если же для изменения учетной записи используется утилита Services, то информация об имени и пароле не будет синхронизирована. После перезагрузки операционной системы служба Microsoft Search не сможет стартовать. Для синхронизации данных необходимо будет запустить Enterprise Manager.
SQL Server Agent Properties ~ S
General Advanced) Alert System] Job System] Connection] ;• Service startup account •C System account SQLAccount (* T his account: Password: Mail session
Mail profile: jEvgeniy Marnaev !** S_ave copies of the sent messages in the "Sent Items" folder i rror log— ~~ Щ
File name:
—'
—" ~*~"~ " " ----- - - - -
JFASQL2000\MSSQL$SQL_SEF ^ 1
View... |
Г" Include execution trace messages Г
Write OEM File
.Net send recipient:
Administrator
Cancel
Apply
Help
Рис. 7.12. Вкладка General окна свойств службы SQLServerAgent
Enterprise Manager является довольно мощным инструментом администрирования, охватывающим большую часть задач управления SQL Server 2000, в том числе и управление свойствами запуска служб. Однако возможности Enterprise Manager ограничены. Например, его можно использовать для управления только запущенным SQL Server 2000. Если же администратор поменял пароль учетной записи, под которой запускается служба MSSQLServer, и это изменение не было своевременно отображено в свойствах запуска службы, то после останова службы повторно запустить ее не удастся до тех пор, пока не будет указан новый пароль. Чаще всего с подобной проблемой сталкиваются после перезагрузки компьютера. Использовать в этом случае Enterprise Manager не удастся. Кроме того, с помощью средств Enterprise Manager можно управлять только свойствами запуска служб MSSQLServer и SQLServerAgent. Для управления службами MSDTC и Full-Text Search необходимо применять другие средства.
Глава 7. Управление работой служб SQL Server 2000
153
Утилита Services Servc ie:. MSSQLSevtef - Startup Type— I (* Automac ti • * Dsiabe ld Log On As: f* Syse tm Account Г* AJlow Service to Interact with Desktop С Jhis Account
Рис. 7.13. Диалоговое окно Service
Как было сказано ранее в этой главе, утилита Services используется для управления службами на уровне операционной системы. В принципе, независимо от способа управления службами, в конце концов все они сводятся к одному — изменению реестра. Окно утилиты Services Windows NT 4.0 (см. рис. 7.8) содержит список всех служб, находящихся на компьютере. Минимальный набор служб SQL Server 2000, устанавливаемый на компьютер, содержит службы MSSQLServer, SQLServerAgent и MSDTC. Найдите нужную службу в списке и нажмите кнопку Startup. Откроется диалоговое окно Service (рис. 7.13), позволяющее управлять параметрами запуска службы.
В группе Startup Type можно выбрать один из типов запуска службы: О Automatic. При выборе этого типа запуск службы будет автоматически выполняться сразу же после загрузки операционной системы. Администратор может быть уверен, что пользователи смогут обращаться к SQL Server 2000 сразу же после перезагрузки компьютера. • Manual. Данный тип запуска службы предполагает старт службы по необходимости. Автоматически запуск службы сразу при загрузке операционной системы не выполняется, однако администратор может вручную запустить службу. Методы запуска, остановки и приостановки будут рассмотрены позже в этой главе. • Disabled. При выборе этого пункта запуск службы запрещается. Попытка стартовать службу вызовет ошибку. Для того чтобы иметь возможность снова запускать службу, необходимо установить или переключатель Manual, или Automatic. В группе Log On As указывается имя и пароль учетной записи, под которой будет стартовать служба. Установив переключатель System Account, вы заставите службу стартовать под локальной учетной записью системы. Указание имени пользователя и пароля в этом случае не требуется. Для запуска службы под определенной учетной записью необходимо установить переключатель This Account. При этом нужно выбрать одну из созданных учетных записей. Для выбора учетной записи следует нажать кнопку ... |. Откроется диалоговое окно со списком доменов и компьютеров, а также созданных на них учетных записей. В поля Password и Confirm Password необходимо ввести корректный пароль учетной записи.
Часть III. Администрирование
154
Замечание Если пароль учетной записи указан неверно, то пользователь не получит никакого предупреждающего сообщения. Ошибка будет выдана только в том случае, если в полях Password и Confirm Password введены различные значения. При указании имени несуществующей учетной записи также будет выдано сообщение об ошибке.
Замечание Если учетная запись пользователя, выбираемого для запуска службы, не имеет права использоваться для запуска службы (Log on as a service), то это право будет предоставлено автоматически, о чем будет выдано соответствующее предупреждение. Более подробно о правах, которые должна иметь учетная запись, используемая для запуска
служб, было рассказано в разд. "Подготовка учетных записей" главы 4.
Для управления свойствами запуска службы в операционной системе Windows 2000 с помощью утилиты Services используется окно свойств службы. Открытие этого окна, как и собственно утилиты Services, было рассмотрено ранее в данной главе. Окно свойств содержит четыре вкладки. Первая из них, General (см. рис. 7.10), может быть использована для управления режимом запуска службы. Для этого предназначен открывающийся список Startup Type. Список доступных вариантов аналогичен утилите Services для Windows NT 4.0. Для управления учетной записью, под которой стартует служба, используется вкладка Log On (рис. 7.14). MSSQLSSQL SERVER 2000 Property (Local С Genera! Log On j Recovery Dependencies) Log on as: <"" Local System account
г <•" This account.
|SQLAccounl|
Browse.
Password: Confirm password:
Г***
You can enabe l or dsiabe l this servc i e for the hardware profe li s listed beo l w: Service Enabled Enabled
Hardware Profile
Profile:! Admin
fiisable OK
Gance
Apply
Рис. 7.14. Вкладка Log On окна свойств службы
Глава 7. Управление работой служб SQL Server 2000
155
Управление учетной записью с помощью этой вкладки напоминает использование диалогового окна Service утилиты Services для Windows NT 4.0. После внесения необходимых изменений достаточно нажать кнопку ОК или Apply. На этом конфигурирование параметров запуска службы заканчивается. Новые параметры вступят в силу при следующем запуске службы.
Режимы запуска SQL Server 2000 На первый взгляд может показаться, что управление запуском SQL Server 2000 ограничивается нажатием кнопки Start и конфигурированием учетных записей, используемых для старта служб. МННВНШ
Й;' Registry Editor Registry \ ; \ \ 1 ;
, \ ; \ ; ! ;
:•
;
!
1
Edit
;
ffi Q TRELON ffi-Q MMC : £ j MMCtlsForlE ffl CJ Mobile ffl i_U MosTrace IS £ j MS Design Tools ffl"CJ MS Setup (ACME) 1 £ ] MSCnC ш
C
J
ffl••£}
i
My
View Favorites fcjelp
;
M
S
D
A
I
P
ЯЙ
„in] xj
"';•'• _*j
Name
! Type ! Data t) REG_SZ (value not set) 30 REG_SZ -dG:\Program Flies\Mc i rosoft SQL Server\MSSQL\data\master.mdf jl REG_SZ -eG:\Program Fle i s\Mc i rosoft SQL Server\MSSQL\o lg\ERRORLOG 32 REG_SZ -G l :\Program Flies\Mc i rosoft SQL Server\MSSQL\data\masto l g.d lf
|
:.
P
M S D T C
U Z I
M S L e x
: ; : ! '
: Щ-Ш В О : ; Й 1 • ; ;
• • 5 | : i M '
; • ; I ; : M :
: \ ; i ; • ;
:
;
: Q j MSTTS
• ] :
! [ s Q Multimedia ; ffl Li] NetDDE
M5MQ MSSQLServer Ш Client _ J MSSQLServer : CJ CurrehtVersion
: CJ RPCNetLib '• m-Qj SuperSocketNetLib l+! £3 Providers :• P j Replication ; (ID Setup ffl-d SQLServerAgent £ ] SQLServerSCP +' . | Tracking
—
J
Computer\HKEY_LOCAL_MACHIhE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\Parameters
Рис. 7.15. Ключи запуска SQL Server 2000
Однако помимо этого имеются еще некоторые свойства, которыми можно управлять. Прежде всего это касается пути к главному файлу базы данных Master и ее журналу транзакций, а также к журнальному файлу ошибок. Эти три параметра очень важны для старта SQL Server 2000. При обычном запуске SQL Server 2000 значения пути к файлам берутся из реестра. Каждая инсталляция, как именованная, так и по умолчанию, имеет свой ключ для хранения параметров запуска SQL Server 2000. Параметры запуска инсталляции по умолчанию хранятся в следующем ключе реестра:
156
Часть III. Администрирование
НКЕ Y_LOCAL_MACHINE \SOFTWARE \Microsoft \MSSQLServer \MSSQLServer \Parameters
Мастер установки создает в этом ключе три строковых значения (рис. 7.15). Каждое из них представляет собой ключ, который подставляется в командную строку при запуске sqlservr.exe. Имена строк особого значения не имеют. Однако они представляют собой имена ключей, по которым выполняется их идентификация при редактировании параметров запуска как средствами Enterprise Manager, так и непосредственно в реестре. Параметры запуска именованной инсталляции хранятся в следующем ключе реестра: HKEY_LOCAL_MACHINE \SOFTWARE \Microsoft \Microsoft SQL Server \[Instance name] \MSSQLServer \Parameters
Назначение параметров базовых ключей запуска рассмотрено в табл. 7.1. Таблица 7.1. Базовые ключи запуска SQL Server 2000
Параметр
Описание
-d<master_f i l e _ p a t c h >
Ключ предназначен для указания местонахождения главного файла базы данных M a s t e r (master.mdf). Необходимо указать полный путь
-Kmaster_log_path>
С помощью этого ключа указывается полный путь до журнала транзакций базы данных M a s t e r (mastlog.ldf)
-e<error_log_patch>
Предназначен для указания полного пути к журнальному файлу ошибок SQL Server 2000. Этот файл представляет собой обычный текстовый файл, который может быть прочитан с помощью любого текстового редактора. В этот файл записываются все сообщения, выдающиеся при запуске SQL Server 2000. Эти же сообщения выводятся в консольном окне при запуске SQL Server 2000 как приложения
Ключи, рассмотренные в табл. 7.1, являются необходимыми для запуска SQL Server 2000. Указывать же их при каждом старте сервера было бы обременительно. Поскольку они чаще всего не изменяются на протяжении всей эксплуатации SQL Server 2000, то разработчики Microsoft поместили эти ключи в реестр. При запуске службы MSSQLServer она обращается к соответствующему ключу реестра Parameters и обрабатывает все имеющиеся в этом ключе реестра значения.
Глава 7. Управление работой служб SQL Server 2000
157
Каждая инсталляция имеет свой набор параметров запуска. При необходимости пользователи могут добавлять в реестр дополнительные параметры запуска. Хранящиеся в реестре ключи запуска являются значениями по умолчанию. Если же при старте SQL Server 2000 как приложения путем выполнения sqlservr.exe в командной строке явно указать те или иные ключи, то они перекроют значения из реестра. Таким способом можно запускать SQL Server 2000 с различными базами данных Master. Можно изменять путь к базе данных Master непосредственно в реестре. В этом случае SQL Server 2000 будет всегда стартовать с указанной базой данных Mast e r . Это бывает полезно при переустановке операционной системы и последующей установке SQL Server 2000. Если вы уже имеете набор системных и пользовательских баз данных, оставшихся от прежней инсталляции SQL Server 2000, то можно работать с ними, а не восстанавливать все их резервные копии или вообще создавать заново. Для этого достаточно указать в реестре путь к базе данных Master, оставшейся от прежней инсталляции. Все остальные базы данных подключатся автоматически, если их файлы на диске не были перемещены. Замечание Если на вашем компьютере имеется две или более операционных системы с установленным SQL Server 2000 и вы поочередно работаете с каждой из них, то наверняка захотите иметь доступ к данным SQL Server 2000 независимо от того, какая операционная система запущена. Это можно легко сделать, указав в параметрах запуска SQL Server 2000 в каждой операционной системе путь к одной и той же базе данных M a s t e r . Автоматически будут использоваться одни и те же системные и пользовательские базы данных. Таким образом, вам не нужно постоянно синхронизировать базы данных в различных операционных системах.
Однопользовательский режим До сих пор запуск SQL Server 2000 рассматривался в нормальном режиме, когда множество пользователей могут подключаться к серверу, обращаться к таблицам, выполнять хранимые процедуры, создавать и удалять объекты и т. д. Однако в некоторых случаях необходимо запускать SQL Server 2000 с ограниченными возможностями. В этом и двух следующих разделах будет рассмотрен запуск SQL Server 2000 в специальных режимах, использующихся для восстановления работоспособности сервера, вышедшего из строя вследствие установки неверных параметров конфигурации. Специальные режимы запуска могут также применяться для выполнения некоторых административных задач, например, при восстановлении резервной копии базы данных Master. В нормальном состоянии множество пользователей обращаются ко множеству объектов различных баз данных, имеющихся на сервере. Каждый из пользователей способен блокировать множество объектов. Подобная блокировка может препятствовать выполнению некоторых административных задач, требующих
158
Часть III. Администрирование
эксклюзивного доступа к любым объектам, имеющимся на сервере. Для обеспечения подобного доступа администратор имеет возможность запустить SQL Server 2000 в так называемом однопользовательском режиме (single-user mode). Замечание Однопользовательский режим часто применяется для восстановления резервных копий системных баз данных. Кроме того, однопользовательский режим используется при запуске SQL Server 2000 в режиме минимальных требований, который рассматривается в следующем разделе.
При запуске SQL Server 2000 в однопользовательском режиме служба MSSQLServer разрешает устанавливать только одно соединение, причем подключиться к серверу может только администратор. Тем самым обеспечивается эксклюзивный доступ ко всем объектам сервера. При запуске сервера в однопользовательском режиме следует предварительно позаботиться об остановке всех служб и закрытии всех приложений, обращающихся к SQL Server 2000. В противном случае единственное соединение оказывается занятым какой-нибудь службой или приложением и администратор не сможет подключиться к серверу. Например, если разрешен автоматический старт службы SQLServerAgent, то она способна занять единственное соединение. Работа SQL Server 2000 в однопользовательском режиме, помимо ограничения на количество пользовательских соединений, имеет и другие особенности. В частности, в этом режиме, обеспечивающем усечение журнала транзакций, не выполняется операция контрольной точки (checkpoint process). Кроме того, разрешается прямой доступ к системным таблицам, независимо от настроек конфигурации. То есть администратор может управлять практически всеми аспектами работы сервера, в том числе настройками системы репликации, системы безопасности, конфигурацией сервера и т. д., с помощью команд SELECT, DELETE, INSERT И UPDATE. Замечание По умолчанию в процессе инсталляции SQL Server 2000 прямой доступ к системным таблицам запрещен. Текущее значение этой опции можно получить, выполнив команду E X E C s p _ c o n f i g u r e ' a l l o w u p d a t e s ' . Microsoft настоятельно не рекомендует использовать для управления системными данными команды S E L E C T , UPDATE,
INSERT
и л иD E L E T E .
Взамен рекомендуется пользоваться
специальными
системными хранимыми процедурами. Это обеспечит целостность системных данных и позволит избежать их повреждения. Непосредственная работа с системными таблицами требует высокой квалификации, тогда как работа с хранимыми процедурами доступна любому пользователю.
Помимо всего перечисленного, при работе SQL Server 2000 в однопользовательском режиме сервер немедленно сохраняет "грязные" страницы на диск. То есть страницы таблиц, измененные после считывания их с диска, сразу же сохраня-
Глава 7. Управление работой служб SQL Server 2000
159
ются. В нормальном же режиме эти страницы находятся в кэш-памяти, что повышает производительность работы сервера. Запуск SQL Server 2000 в однопользовательском режиме выполняется с помощью ключа -т: sqlservr.exe -т
Как уже говорилось ранее, в этом случае SQL Server 2000 будет запущен как обычное приложение. При необходимости, можно добавить в ключ реестра Parameters нужной инсталляции SQL Server 2000 дополнительную строку с ключом -т. В этом случае SQL Server 2000 будет стартовать в однопользовательском режиме как служба. Однако обычно запуск SQL Server 2000 в однопользовательском режиме выполняется достаточно редко, поэтому оказывается удобнее запускать сервер в этом режиме как приложение. В противном случае придется дважды изменять реестр.
Режим с минимальными требованиями При запуске SQL Server 2000 как в нормальном, так и в однопользовательском режиме применяются опции конфигурации, установленные ранее администратором. Однако иногда возникает ситуация, что вследствие установки неверных параметров конфигурации сервера (например, объема используемой памяти) нет возможности повторно запустить сервер после остановки. Как следствие, администратор не может установить корректные значения конфигурации. Образуется замкнутый круг. Сервер не может стартовать из-за некорректных параметров конфигурации, но чтобы изменить их, необходимо сначала запустить сервер. Решением проблемы является запуск сервера в режиме минимальных требований (minimal configuration), являющемся своего рода аварийным запуском сервера. Этот режим имеет следующие особенности: О объем оперативной памяти, который будет использоваться для SQL Server 2000, минимален, при этом значения настроек сервера игнорируются; •
устанавливаются минимальные значения для количества открытых баз данных (open databases), количества блокировок (locks), открытых объектов (open objects), кэшированных языков (language in cache), значений параметров max async И asynchronous I/O;
О размер процедурного кэша устанавливается в два раза меньшим, чем в нормальном режиме; •
запрещается удаленный доступ к серверу, т. е. администратор может работать с SQL Server 2000 только локально;
• хранимые процедуры, выполняемые сервером автоматически при каждом запуске, не запускаются;
160
Часть III. Администрирование
П сервер автоматически запускается в однопользовательском режиме со всеми его ограничениями (разрешается единственное соединение и прямой доступ к системным таблицам). Запуск SQL Server 2000 в режиме минимальных требований выполняется с помощью ключа -f: sqlservr.exe -f
Как и при запуске SQL Server 2000 в однопользовательском режиме, сервер будет запущен в качестве обычного приложения. Рекомендации по запуску сервера с минимальными требованиями те же, что были приведены для однопользовательского режима.
Глава 8
Конфигурирование служб SQL Server 2000 В предыдущей главе было рассмотрено управление запуском, остановом и приостановом служб SQL Server 2000. В этой главе будет обсуждаться управление различными параметрами работы перечисленных служб. Как и многие другие продукты, SQL Server 2000 имеет довольно много различных опций, от настройки которых зависит его работа. Конфигурирование этих опций требует определенных знаний и понимания того, к каким результатам приведет установка того или иного значения. Мастер установки выполняет конфигурирование большей части опций конфигурации. Кроме того, в SQL Server 2000 реализованы эффективные механизмы динамической настройки, избавляющие администратора от рутинной работы. В принципе, работа с SQL Server 2000 может быть начата сразу же после его инсталляции без внесения каких-либо изменений в конфигурацию. Таким образом, администратором сервера может являться даже средний пользователь, умеющий предоставлять другим пользователям доступ к серверу и объектам баз данных. Однако, чтобы быть настоящим специалистом, необходимо уметь настраивать сервер вручную. Именно этому и посвящена данная глава.
Конфигурирование службы MSSQLServer Управлять работой службы MSSQLServer, являющейся ядром SQL Server 2000, можно при помощи либо графического интерфейса Enterprise Manager, либо системной процедуры s p c o n f i g u r e . В этом разделе рассмотрено управление параметрами работы сервера обоими методами. Для управления работой службы MSSQLServer средствами Enterprise Manager служит диалоговое окно SQL Server Properties. Для открытия этого окна необходимо в левой панели Enterprise Manager выделить нужный сервер и в его контекстном меню выбрать команду Properties. В ответ откроется окно, подобное приведенному на рис. 8.1. Окно SQL Server Properties содержит восемь вкладок, с помощью которых и осуществляется управление работой сервера. В нижней части большинства вкладок имеется переключатель, который можно установить в два положения: • Configured values. При установке переключателя в это положение на вкладке будут отображаться значения, указанные администратором. Значения некоторых параметров конфигурации становятся активными только после выпол-
Часть III. Администрирование
162
нения команды reconfigure или перезапуска сервера. Тем не менее, все же необходимо видеть, какие значения установлены. Для этого достаточно установить переключатель в положение Configured values. Running values. Когда переключатель находится в этом положении, на вкладках будут отображаться текущие значения параметров конфигурации серверов, т. е. те значения, с которыми работает сервер. При работе в данном режиме элементы управления на вкладках доступны только для чтения. То есть вы можете просмотреть значения, но не можете исправить их. Для изменения значений следует установить переключатель в положение Configured values. SQL Server Properties (Configure) -SIServer Settings Database Settings General j Memory Processor Security
J*J Replication Connections
Щ N. STORAGE\SQL_SERVER_2000 SQL Server Enterprsie Edto in Product: Operan tig system: Wnidows NT -5.0 (2195) Product verso i n: • 80 .01 .00 (B2) Language: E n g s ilh (Unte i d States) Paltform: N T N I T E L X8G OS memory: 5 1 1 ( M B ) Processors: 2 Root driectory: \ : fSQL2000\MSSQL$SQL_SERVER_20l Server coa l to i n: Cyrc il_G enera_lC_IAS Autostart pocile i s when the operan tig syse tm starts y
,щ\ ~gp
R Autnj^KQL Server! Г~ Autostart SQL Server Agent I? Autostart MS СП" С
Startup Parameters... Hetwork Configuration.. OK
Cancel
Help
Рис. 8 . 1 . Окно SQL Server Properties
Часть параметров конфигурации применяется после нажатия кнопки ОК, тогда как другая требует перезапуска SQL Server 2000. По мере рассмотрения вкладок будет даваться информация о свойствах того или иного параметра. При управлении параметрами конфигурации сервера средствами хранимой процедуры s p c o n f igure следует придерживаться следующего синтаксиса: sp_configure
[ [Sconfigname =] 'name']
[,
[@configvalue =]
'value']
С помощью аргумента [@configname =] 'name' указывается имя параметра конфигурации, предполагаемое для управления. Значение, которое необходимо присвоить параметру, указывается с помощью аргумента [@configvalue =] ' v a l u e ' .
Глава 8. Конфигурирование
служб SQL Server 2000
163
Замечание Если вызов хранимой процедуры осуществляется из пакета, содержащего более одной команды, то следует использовать команду exec. Например, для просмотра всех параметров необходимо будет выполнить команду exec s p _ c o n f i g u r e . Если же вызов хранимой процедуры является единственной командой в пакете, то использование команды exec не обязательно. Поэтому далее в тексте команда exec будет опускаться.
Как видно из синтаксиса хранимой процедуры, оба аргумента могут быть опущены. В этом случае будет выведен список имен всех параметров с указанием их максимального и минимального, а также сконфигурированных и используемых значений. Если же процедура вызывается только с указанием имени параметра, то будет выведена аналогичная информация по конкретному параметру. После установки SQL Server 2000 конфигурируется таким образом, что при просмотре списка параметров не выводятся так называемые расширенные (advanced) настройки. Для разрешения просмотра этих параметров необходимо выполнить следующую команду: sp_configure
'show advanced options', 1 Замечание
Однако, даже если просмотр расширенных опций не разрешен, это не мешает изменять и просматривать их значения.
Сейчас же приступим к рассмотрению вкладок окна свойств службы MSSQLServer.
Вкладка General На вкладке General (см. рис. 8.1) окна SQL Server Properties приведены общие сведения о системе, такие как имя продукта с указанием редакции, имя и версия операционной системы, версия SQL Server, язык, тип аппаратной платформы, объем оперативной памяти, количество установленных процессоров, корневой каталог SQL Server 2000 и выбранное при установке сопоставление. В группе элементов Autostart policies when the operating system starts можно управлять автоматическим запуском служб SQL Server 2000. Каждый из флажков отвечает за отдельную службу. Установка флажка приведет к автоматическому запуску соответствующей службы при очередной загрузке операционной системы. Нажав кнопку Startup Parameters, можно открыть одноименное диалоговое окно (рис. 8.2), где перечислены параметры запуска SQL Server 2000, которые хранятся в реестре и вступают в силу при запуске SQL Server 2000, в том числе когда SQL Server 2000 запускается из командной строки. Ключи запуска SQL Server 2000 перечислены в табл. 8.1. Они могут быть указаны в окне Startup Parameters. Кроме того, эти же ключи можно указать при запуске SQL Server 2000 ИЗ КОМаНДНОЙ СТРОКИ С ПОМОЩЬЮ КОМанДЫ s q l s e r v r ИЛИ s q l s e r v r . e x e .
В ЭТОМ
случае значения, введенные в командной строке, перекрывают значения аналогичных ключей реестра.
Часть III. Администрирование
164
Замечание
Startup Parameters - STORAGE
При запуске SQL Server 2000 с помощью команды s q l s e r v r или s q l s e r v r . e x e сервер будет запущен как приложение. Об особенностях запуска SQL Server 2000 в качестве приложения было рассказано в разд. "Запуск SQL Server 2000 как приложения" главы 7.
Parameter Existing parameters •dK: \SQ L_D ataB ase\data\nnaster. mdf -eK:\SQL_DataBase4og\ERRORLOG -IK: \SQL_DataB ase\data\mastlog. Idf
JLl Cancel
Help Рис. 8.2. Окно Startup Parameters Таблица 8.1. Ключи запуска SQL Server 2000
Описание
Ключ
Запуск SQL Server 2000 в однопользовательском режиме (singleuser mode). При этом допускается установка только одного соединения с SQL Server 2000, разрешается прямой доступ к системным таблицам и не устанавливаются блокировки -f
Запуск SQL Server 2000 с минимальными требованиями. В данном режиме разрешено открытие минимального количества баз данных, таблиц и т. д. Автоматически устанавливается однопользовательский режим. Запуск с минимальными требованиями является своего рода "режимом защиты от сбоев"
~d<master_file_path>
Запуск SQL Server с другой системной базой данных M a s t e r . Введите полный путь к базе данных, обычно это \Program Files\Microsoft SQL Server\Mssql\Data\Master.mdf. Если эта опция не указана, используются значения из реестра
-e<error log path>
Подключает дополнительный журнал ошибок. Укажите полный путь к журналу ошибок, обычно это \Program Files\Microsoft SQL Server\Mssql\Log\Errorlog
-Kmaster
Подключает указанный журнал транзакций для системной базы данных M a s t e r . Укажите полный путь к журналу транзакций, обычно это \Program Files\Microsoft SQL Server\Mssql\Data\Mastlog.ldf
log path>
Данный ключ используется для запуска именованной инсталляции SQL Server 2000 как приложения. Применение этого ключа было рассмотрено в разд. "Запуск SQL Server 2000 как приложения" главы 7 Ключ используется совместно с ключом - s и свидетельствует о том, что SQL Server 2000 стартует независимо от диспетчера служб операционной системы (Windows NT Service Control Manager). Это обеспечивает более быстрый запуск сервера как приложения
Глава 8. Конфигурирование
служб SQL Server 2000
165 Таблица 8.1
Ключ
(окончание)
Описание Указание этого ключа предписывает SQL Server 2000 не регистрировать в журнале приложений (application log) операционной системы сообщения сервера. В этом случае рекомендуется использовать ключ -е для указания журнального файла, в который будут записываться сообщения сервера. Иначе сообщения могут быть потеряны
-p<precision_level>
При помощи этого ключа можно управлять максимальной точностью, доступной для типов данных d e c i m a l и n u m e r i c . Значение < p r e c i s i o n _ l e v e l > может изменяться от 1 до 38. По умолчанию SQL Server 2000 стартует с максимальным значением 38
-T
Ключ используется для запуска SQL Server 2000 с определенными флагами трассировки. Эти флаги предназначены для запуска сервера с нестандартным поведением. Для получения более подробных сведений о применении флагов трассировки следует обратиться к дополнительным источникам, например, к Books Online
-v
При указании данного ключа будет выведена информация о версии SQL Server 2000. Собственно запуск сервера выполнен не будет
-х
Указав этот ключ, можно отключить сбор статистики об использовании процессора SQL Server 2000, что обеспечит некоторое увеличение производительности
-g<memory_to_reserve>
С помощью данного ключа можно зарезервировать объем памяти для работы приложений, запускаемых SQL Server 2000. Указывается целое значение Мбайт
-о
Если пользователи не будут применять технологию DCOM (Distributed COM), то с помощью этого ключа можно предписать серверу не загружать соответствующие компоненты, тем самым запрещая выполнение гетерогенных запросов
-y<error number>
Данный ключ предписывает серверу сохранять в журнале ошибок (error log) подробную информацию о встреченных ошибках с номером < e r r o r _ n u m b e r > . Допускается указание множества ключей - у
Информация о параметрах запуска инсталляции по умолчанию SQL Server 2000 хранится в следующем ключе реестра: HKEY_LOCAL_MACHINE \SOFTWARE \Microsoft \MSSQLServer \MSSQLServer \Parameters
Часть III. Администрирование
166
Данные, приводимые в окне Startup Parameters (см. рис. 8.2), берутся из указанного ключа реестра. При внесении изменений в параметры запуска SQL Server 2000 с помощью окна Startup Parameters эти изменения будут отображены в реестре, а применятся только при следующем запуске SQL Server 2000. На рис. 8.3 приведено окно программы Registry Editor (regedit.exe) с отображением ключа, используемого для хранения информации о параметрах запуска SQL Server 2000. Вы можете создать в реестре новый ключ для именованной инсталляции. Эта процедура была описана в разд. "Запуск SQL Server 2000 как приложения" главы 7. Полученный ключ в реестре может использоваться для запуска SQL Server 2000 с ключом запуска -s. «•' Registry Editor Regsi try Edti Ve iw Favorites Hep l - _ J Microsoft SQL Server 1 CJ 8.00.000 :- £Э во : : Ш CJ Replication '. : i+J C j Tools a C]
_У
.
Name ^(Default)] «i^SQLArgO .!±]5QLArgl a*]SQLArg2
.. : Type REG_SZ REG_SZ REG_SZ REG_SZ
j Data \ ; _ (value not set) -dF:\SQL2000\MSSQL$SQL_SERVER_2000\data\master.mdf -eF:\SQL2000\M5SQL$SQL_SERVER_2000\log\ERRORLOG -IF: \SQL2000\MSSQL$SQL_SERVER_2000\data\mastlog. Idf
SQL_SERVER_2OOO
Я CJ MSSQLServer i""j CurrentVersion : ', fCS Parameters : CJ RPCNetLib ' ffl £1] SuperSocketNetLib ffl CJ Providers : C3 Replication ; - C j Setup i ffl CJ SQLServerAgent ffl CJ Tracking 9 CJ Microsoft SQL Server 7.0 • (Cj 7.00.000 Si CJ MMC (Cl MMCtlsForlE И CJ Mobile s CJ MOS ffi C J MosTrace I t ] MS Design Tools Ш О MS Setup (ACME) i CJ MSCnC SS 02 MSDAIPP i+i C_l MSDTC -ri i\
•
Ш
jlj
J
M i yComputer\HKEY_LOCAL_MACHN I E\SOFTWARE\Mc irosoft\Mc irosoftSQLServer\SQL_SERVER_2000\MSSQLServer\Parameters Рис. 8.З. Ключи реестра, используемые при запуске SQL Server 2000
Замечание Если в параметры запуска SQL Server 2000 были внесены изменения, которые привели к сбою запуска, то можно вручную отредактировать соответствующие ключи реестра для восстановления работоспособности сервера.
На вкладке General имеется еще одна кнопка — Network Configuration. Она позволяет запустить утилиту SQL Server Network Utility, с помощью которой выполняется настройка сетевых библиотек. Подробно использование этой утилиты было рассмотрено в разд. "Конфигурирование сетевых библиотек"главы 6.
Глаза 8. Конфигурирование служб SQL Server 2000
167
Вкладка Memory Как следует из названия, с помощью вкладки Memory (рис. 8.4) осуществляется управление памятью, используемой для работы SQL Server 2000. SQL Server Properties (Configure) - STOR Server Settings i Database Settings Replication General Memory Processor | Security | Connections Memory SQL Server can be configured to use a fixed amount of emory or to dynamicaly adjust the amount of memory used г>ияга m '—"—' based upon demand. **"" Dynamicaly configure SQL Server memory
(* IJse a fixed memory size (MB): \-
16MB''
255 ; 511MB
W Beserve physical memory for SQL Server Minimum query memory (KB):
|41Ж)
-
Running values
Configured values OK
Cancel
Help
Рис. 8.4. Окно SQL Server Properties, вкладка Memory
Уже в SQL Server 7.0 были существенно переработаны принципы работы с памятью. В отличие от предыдущих версий в SQL Server 7.0 и SQL Server 2000 помимо статического управления памятью возможно также динамическое управление. Если планируется статическое управление памятью, то необходимо явно указать объем оперативной памяти, который будет выделен SQL Server 2000. Независимо от действительно необходимого серверу объема операционная система выделит для работы SQL Server 2000 объем памяти, строго соответствующий указанному значению. С течением времени количество памяти, отведенной серверу, не меняется. При динамическом управлении администратор должен указать минимальное и максимальное количество памяти, доступное SQL Server 2000. Объем памяти, действительно используемой сервером, может сильно изменяться в зависимости от нагрузки на сервер. Однако он всегда остается в указанных рамках. Если пользователи не выполняют никаких действий на сервере, то объем памяти может быть автоматически уменьшен. Освободившаяся память возвращается операционной системе и может быть отдана другим приложениям. Но если SQL
168
Часть III. Администрирование
Server 2000 испытывает недостаток памяти, он может потребовать у операционной системы выделения дополнительных ресурсов. Это требование может быть удовлетворено за счет уменьшения памяти, выделенной для работы других приложений. При установке переключателя Dynamically configure SQL Server memory на вкладке Memory окна SQL Server Properties будет использоваться динамическое управление объемом памяти, выделенное для работы SQL Server 2000. В этом случае с помощью регуляторов Minimum (MB) и Maximum (MB) необходимо соответственно указать минимальное и максимальное количество Мбайт, выделяемых для работы сервера. По умолчанию минимальный объем памяти составляет 0 Мбайт, а максимальный объем соответствует максимально доступному объему оперативной памяти системы. Нижняя граница максимального объема памяти равна 4 Мбайт. Для управления максимальным объемом памяти, доступным SQL Server 2000, используется хранимая процедура sp_configure 'max server memory', <объем_памяти>.
Тогда как другая хранимая процедура предназначена для управления минимальным объемом памяти: sp_configure 'min server memory', <объем_памяти>.
В динамическом режиме SQL Server 2000 старается использовать память таким образом, чтобы операционная система имела в запасе около 5 Мбайт свободной памяти плюс/минус 200 Кбайт. Эта память может понадобиться для запуска других приложений. Если объем свободной памяти в операционной системе уменьшается, то SQL Server 2000 освобождает часть внутренних буферов и кэшпамяти и возвращает память операционной системе. Однако при этом снижается производительность выполнения запросов. Если же в операционной системе имеется более 5 Мбайт свободной памяти, то SQL Server 2000 забирает ее и применяет для кэширования запросов пользователей и буферизации данных. Замечание Если предполагается использовать статическое выделение памяти, и конфигурируемый сервер является выделенным дистрибьютором или издателем-дистрибьютором, то следует добавить 16 Мбайт памяти для поддержки репликации. Если же на сервере установлена поддержка полнотекстового поиска (служба Full-Text Search), то величина максимального объема необходимой SQL Server 2000 памяти должна быть увеличена примерно на 50%. При использовании динамического управления памятью также следует учитывать указанные требования при конфигурировании максимального объема доступной SQL Server 2000 памяти.
Если нужно работать в статическом режиме управления объемом памяти, то необходимо установить переключатель Use a fixed memory size (MB). В этом случае следует указать конкретное количество Мбайт, которое будет отведено SQL Server 2000. Приближение регулятора к левому краю приведет к плохой работе SQL Server 2000, тогда как смещение регулятора к правому краю — к плохой работе операционной системы и других приложений, запускаемых на компьютере.
Глава 8. Конфигурирование служб SQL Server 2000
169
Замечание Установив регуляторы Minimum (MB) и Maximum (MB) (в динамическом режиме управления) в одинаковые положения, можно добиться такого же эффекта, что и заданием статического режима управления памятью. Операционная система Windows NT (а также Windows 2000) всегда старается переместить долго неиспользуемую информацию из оперативной памяти в виртуальную память. В этом случае данные записываются на жесткий диск в файл подкачки (pagefile или swapfile). Это происходит даже в том случае, если в операционной системе имеется достаточный объем свободной оперативной памяти. Когда пользователи долгое время не работали с SQL Server 2000, а затем начали интенсивно к нему обращаться, то потребуется значительное время для восстановления данных SQL Server 2000 из файла подкачки. Чтобы избежать подобной ситуации, необходимо установить флажок Reserve physical memory for SQL Server. Это заставит операционную систему не сохранять данные SQL Server 2000 в виртуальной памяти. Указанным параметром также можно управлять с помощью хранимой процедуры: sp_configure 'set working set size 1 , 0 I 1
Замечание Блокировка оперативной памяти, используемой SQL Server 2000, от сохранения в файл подкачки способна привести к резкому снижению производительности других приложений и операционной системы, т. к. им может остаться слишком мало оперативной памяти, а использовать дополнительную память за счет выгрузки части страниц SQL Server 2000 не удастся. Однако на выделенных серверах баз данных рекомендуется блокировать память, участвующую в работе SQL Server 2000. Последний элемент управления вкладки Memory — это поле Minimum query memory (KB). С помощью данного параметра можно управлять объемом оперативной памяти, выделяемой для выполнения запроса. Значение колеблется от 512 Кбайт до 2 Гбайт. Увеличение объема памяти, выделяемой для выполнения запроса, может привести к более высокой скорости его выполнения. Однако, будьте осторожны — установка слишком большого значения может привести к быстрому исчерпанию свободных ресурсов при одновременной попытке множества пользователей выполнить запрос. Минимальным объемом памяти, выделяемой для выполнения запроса, можно управлять с помощью следующей хранимой процедуры: sp_configure 'min memory per query', <объем_памяти>.
Вкладка Processor Элементы вкладки Processor (рис. 8.5) позволяют управлять тем, как SQL Server 2000 будет использовать ресурсы центрального процессора и операционной системы.
170
Часть III. Администрирование
SQL Server Properties (Configure) Server Settings ] . Database Settings | Replication General I Memory Processor I Security | Connections
172
Часть ill. Администрирование
собствовать тому, что запросы станут ожидать освобождения потоков. Это снизит производительность системы в целом. Диспетчер управления потоками Windows NT работает в защищенном режиме (protected mode). Однако потоки приложений, в том числе и SQL Server 2000, работают в пользовательском режиме (user mode). Чтобы переключить процессор на выполнение другого потока, операционная система переходит из пользовательского режима в защищенный. Это сравнительно длительная операция, и слишком частое переключение потоков может привести к снижению производительности. Для решения данной проблемы SQL Server 2000 может использовать волокна (fibers). Волокна Windows NT являются подкомпонентами потоков. Управление ими выполняется самим потоком, т. е. для переключения волокон, в отличие от переключения потоков, не требуется переход в защищенный режим. Указанный подход позволяет снизить непроизводительные затраты на выполнение запросов. Каждый поток может иметь множество волокон. Преимущества работы с волокнами станут доступными SQL Server 2000, если установить флажок Use Windows NT fibers. Замечание Опция Use Windows NT fibers недоступна, если SQL Server 2000 работает под управлением операционной системы Windows 98. Это связано с тем, что потоки Windows 98 не используют волокна. С помощью флажка Boost SQL Server priority on Windows NT/2000 можно установить для SQL Server 2000 более высокий приоритет в операционной системе, чем для других процессов. Это приведет к тому, что задачи SQL Server 2000 будут выполняться в первую очередь. Данную опцию рекомендуется устанавливать в том случае, когда SQL Server 2000 установлен на компьютере, выделенном в качестве сервера баз данных. Дело в том, что выполнение дополнительных задач на этом компьютере будет возможно только в периоды простоя SQL Server 2000. Однако необходимо обратить внимание, что также и пользователь не сможет работать с операционной системой, если на SQL Server 2000 выполняются запросы. Установив по неосторожности флажок Boost SQL Server priority on Windows NT/2000 на загруженном сервере, можно лишиться доступа к административным утилитам, в том числе и Enterprise Manager. По умолчанию флажок Boost SQL Server priority on Windows NT/2000 не установлен, и SQL Server 2000 имеет нормальный приоритет. Для управления приоритетом SQL Server 2000 средствами Transact-SQL используется следующая команда: sp_configure 'priority boost1, 0 | 1 Г~
о
\
Глава 8. Конфигурирование служб SQL Server 2000
173_
В группе элементов Parallelism можно управлять количеством процессоров, используемых для выполнения запроса. По умолчанию установлен переключатель Use all available processors. Однако администратор может ограничить количество процессоров, на которых будет выполняться отдельный запрос. Для этого необходимо установить переключатель Use и указать количество процессоров. На нескольких процессорах запрос может выполняться значительно быстрее. Однако не следует полагать, что таким путем всегда можно добиться значительного увеличения производительности. Следует учитывать дополнительные затраты на распараллеливание запроса. Прежде всего, оптимизатор запросов должен построить план выполнения запроса, который сможет эффективно использовать преимущества выполнения на нескольких процессорах. Затем необходимо учесть затраты системы на синхронизацию выполнения запроса. И наконец, некоторые запросы просто не могут обрабатываться на множестве процессоров. Кроме того, нет смысла распараллеливать выполнение небольших запросов, которые весьма успешно выполняются и на одном процессоре. Чтобы более эффективно управлять выполнением запроса на множестве процессоров, администратор может указать цену распараллеливания запроса (parallel execution cost). Цена запроса — это количество секунд, которые по оценкам оптимизатора запросов понадобятся на выполнение запроса. Для получения примерной цены оптимизатор запроса использует статистику (statistics). Замечание Статистика получается при анализе данных таблиц и отражает общие сведения об имеющихся в таблице данных. Статистика ведется и используется сервером автоматически на уровне таблицы. При изменении значительной части таблицы статистика должна обновляться (update). При необходимости статистика может быть обновлена вручную с помощью команды UPDATE
STATISTICS,
ДЛЯ кон-
кретной таблицы или во всей базе данных с помощью хранимой процедуры sp_update_stats. Цена запроса формируется еще до его обработки, что позволяет выстроить более эффективный план выполнения. Указывая цену распараллеливания запроса, администратор тем самым определяет длительность, которую как минимум должен иметь запрос, чтобы быть выполненным на множестве процессоров. Если выполнение запроса длится меньше указанного значения, то эта операция пройдет на одном процессоре. Цена распараллеливания определяется с помощью параметра Minimum query plan threshold for considering queries for parallel execution (cost estimate). По умолчанию установлена цена, равная 5 секундам. Для управления ценой распараллеливания запроса средствами Transact-SQL используется следующая команда: sp_configure ' cost threshold for parallelism',
<количество_секунд>
174
Часть III. Администрирование
Вкладка Security С помощью вкладки Security (рис. 8.6) можно управлять работой системы безопасности SQL Server 2000. 5QL Server Properties (Configure) Server Settings Database Settings Replication General j Memory | Processor Security j Connections г Security
i SQL Server provides authentication based on Windows NT accounts and a named SQL Server login ID and password. Authentication: Г SQL Server and Windows NT/2000 <* Windows NT/2000 only Audit level: Г" None
C" Failure
{•" Success
С Ajl
Startup service account ® f> Start and run SQL Server in the following account: >Sur
С System account t* I his account
iAdministrator
Password:
OK
Cancel
Help
Рис. 8.6. Окно SQL Server Properties, вкладка Security
SQL Server 2000 поддерживает два режима аутентификации пользователей: смешанную (mixed) и аутентификацию Windows NT. В первом режиме пользователи могут получить доступ к базам данных, пройдя либо аутентификацию SQL Server, либо аутентификацию Windows NT. Аутентификация только средствами SQL Server не поддерживается. Вы можете выбрать режим аутентификации, в котором будет работать SQL Server 2000, с помощью переключателей группы Authentication. По умолчанию переключатель установлен в положение SQL Server and Windows NT/2000, и пользователям доступны оба типа аутентификации. Установив переключатель в положение Windows NT/2000 only, можно запретить аутентификацию SQL Server, оставив пользователям возможность применять только аутентификацию Windows NT.
Замечание Подробно особенности каждого типа аутентификации будут рассмотрены в главе 9.
Глава 8. Конфигурирование служб SQL Server 2000
175
Переключатели группы Audit level позволяют выбрать режим аудита (проверки), которому будут подвергаться попытки пользователей получить доступ к SQL Server 2000. По умолчанию установлен переключатель None, и аудит не ведется. При установке переключателя Success в журнал событий SQL Server 2000 начнет записываться информация об успешных попытках получения доступа к серверу. Если необходимо сохранять информацию только о неудавшихся попытках установления доступа, то следует отметить переключатель Failure. Установка переключателя All позволяет контролировать как успешные, так и неудавшиеся попытки установления соединения.
(Замечание
)
Доступ к журналу событий SQL Server 2000 можно получить с помощью Enterprise Manager, выбрав нужный сервер и указав в папке Management\SQL Server Logs нужный журнал. Текущий журнал имеет имя Current. Помимо него в папке также хранятся предыдущие журналы. По умолчанию помимо текущего хранится шесть архивных журналов. В группе параметров Startup service account можно изменить учетную запись, под которой запускается служба MSSQLServer. При установке переключателя в положение System account для запуска системы будет использоваться учетная запись локальной системы. Для запуска сервера под учетной записью пользователя необходимо выбрать переключатель This account, указав при этом имя учетной записи и ее пароль.
С~
Замечание
)
Подробно выбор и создание учетных записей, под которыми будут работать службы SQL Server 2000, был рассмотрен в разд. "Подготовка учетных записей" главы 4.
Замечание Средства Transact-SQL не позволяют управлять свойствами запуска служб SQL Server 2000. Подробно управление работой служб рассматривалось в главе 7.
Вкладка Connections На вкладке Connections (рис. 8.7) имеется набор элементов, с помощью которых можно управлять свойствами по умолчанию, устанавливаемыми для пользовательских соединений. Первый элемент этой вкладки — поле Maximum concurrent user connections (0 = unlimited), определяет максимальное количество пользовательских соединений, которое может быть одновременно установлено с сервером. По умолчанию указано значение 0, что соответствует максимально возможному количеству подключений, допускаемых SQL Server 2000, — 32 767. При вводе другого значения SQL Server 2000 будет жестко резервировать указанное значение соединений, 7 Зое. 83 i
Часть III. Администрирование
176
независимо от того, сколько пользователей реально работают с сервером. При этом для каждого соединения будет резервироваться около 40 Кбайт памяти, которая больше никак не используется. SQL Server Properties (Configure) -ST Database Settings | Server Settings General j Memory Processor I Security [• Connections Maxm i um concurrent user connections (0 i Si unlimited):
i Й
Replication Connecto i ns
Default connection options: i Attribute Interim/deferred constraint checking 3 Implicit transactions J Co l se cursor on COMMT I j ANSI warnn ig j ANSI paddn ig
Remote server connections Allow o.ther SQL Servers to connect remotely to this SQL Server using RPC
Query tm i e-out (sec, 0 • unlimited):
m
-4
Г* Enforce distributed transactions (MTS) Configured values
С Running values OK
Cancel
Help
Рис. 8.7. Окно SQL Server Properties, вкладка Connections
Если же установлено значение 0, то SQL Server 2000 динамически выделяет память для создания новых соединений и освобождает ее по мере того, как пользователи отключаются от сервера. Это позволяет более эффективно управлять расходованием ресурсов системы. Контролировать максимальное количество пользовательских соединений можно также и с помощью следующей хранимой процедуры: sp_configure 'user connections', <0 - 32767>
Текущее значение количества максимальных соединений может быть получено с помощью переменной @@MAX_CONNECTIONS: SELECT @@MAX_CONNECTIONS
При использовании параметров по умолчанию будет возвращен следующий результат: 32767 (1 row(s)
affected)
Глава 8. Конфигурирование служб SQL Server 2000
177
Для сравнения можно просмотреть текущее сконфигурированное значение с ПОМОЩЬЮ хранимой Процедуры sp_conf igure: sp_configure 'user connections' Будет выведен следующий результат: name
minimum
maximum
config_value run__value
user connections
0
32767
0
0
Как видно, хотя значение параметра равно 0, максимальное количество соединений составляет 32 767. Флажок Allow other SQL Servers to connect remotely to this SQL Server using RPC управляет возможностью подключения удаленных SQL Server 2000 к локальному серверу посредством удаленного вызова процедур (RPC, Remote Procedure Call). Благодаря этому пользователи, работающие на удаленном компьютере, могут регистрироваться на локальном сервере и выполнять хранимые процедуры. По умолчанию этот флажок установлен, и удаленное выполнение хранимых процедур разрешено. Аналогом описанной опции является запуск следующей хранимой процедуры: sp_configure 'remote access'., 0|l
С помощью параметра Query time-out (sec, 0 = unlimited) можно определить максимальное время выполнения запроса, запущенного с удаленного сервера. Если запрос длится более указанного времени, то его обработка прерывается системой и в соединение посылается соответствующее сообщение об ошибке. По умолчанию значение параметра Query time-out (sec, 0 = unlimited) установлено в 0, что соответствует бесконечному периоду ожидания. Система не будет прерывать запрос, сколь долго бы он не выполнялся. Это может привести к образованию тупиков или, как их еще называют, мертвых блокировок (deadlocks). Другой способ установить продолжительность тайм-аута — использование хранимой процедуры: sp_configure 'remote query timeout', <0 - 2147483647>
Установив флажок Enforce distributed transactions (MTS), можно применить отслеживание выполнения распределенных транзакций координатором распределенных транзакций (MSDTC, Microsoft Distributed Transaction Coordinator). Это гарантирует выполнение транзакций в соответствии с требованиями уровней блокирования — требования ACID. Управлять данным параметром можно также с помощью следующей хранимой процедуры: sp_configure 'remote proc trans', 0 11
Центральную часть вкладки Connections занимает список Default connection options, с помощью которого задаются параметры соединения по умолчанию. Управлять параметрами соединения можно разными способами. Одним из них является выполнение команды SET. Установки по умолчанию, определенные на уровне сервера, могут быть изменены на уровне базы данных, соединения или даже конкретной транзакции или хранимой процедуры.
Часть III. Администрирование
178
Замечание В этой главе мы не станем останавливаться на конфигурировании параметров соединения.
Вкладка Server Settings С помощью вкладки Server Settings (рис. 8.8) можно управлять некоторыми общими параметрами работы сервера. К ним относятся язык по умолчанию, почтовый профиль, работа с двухзначным годом и некоторые другие параметры. SQL Server Properties (Configure) - ST General ] Memory Processor ] Security S erver S ettings D atabase S ettings
Connections R eplication
-Default language —[)efault language for user: Server behavior j—• Allow modifications to be made directly to the system catalogs rr Alow triggers to be fired which fire other triggers (nested triggers) j— U$e query governor to prevent queries rr—'—^7 exceeding specified cost: _j_ -SQL MailStart mail session using profile: Change. Year 2000 support - •A When a two-digit near is entered, interpret it as a year VJVISI between: 11950
and |2049 Running vajues
(* Configured values OK
Cancel
Help
Рис. 8.8. Окно SQL Server Properties, вкладка Server Settings
Первый элемент управления вкладки Server Settings — это раскрывающийся список Default language for user, в котором можно выбрать язык, используемый по умолчанию при выводе сообщений сервером. SQL Server 2000 может поставляться в локализованной версии. Локализация SQL Server 2000 предполагает не только перевод диалоговых окон, но и всех сообщений, выводимых сервером. Текст этих сообщений хранится в таблице sysmessages системной базы данных Master. Для локализованных версий в указанной таблице хранятся как англоязычный вариант сообщения, так и переведенный.
Глава 8. Конфигурирование служб SQL Server 2000
(
Замечание
179
)
Значение опции Default language for user влияет лишь на язык, который будет устанавливаться автоматически для вновь создаваемых пользователей в раскрывающемся списке Language. Однако на этом действие опции заканчивается. В дальнейшем влияние на язык, устанавливаемый для конкретного пользователя при открытии соединения, оказывает лишь переключатель Language, найти который можно в окне свойств учетной записи SQL Server Login Properties. На одном сервере допускается использование сообщений на множестве языков. SQL Server 2000 позволяет создавать свои собственные сообщения, в том числе и на национальных языках. Однако для каждого сообщения должен быть указан аналог на английском языке, являющийся обязательным. Если в ваших приложениях активно генерируются пользовательские сообщения, то рекомендуется выбрать соответствующее значение в списке Default language for user. Язык по умолчанию можно также установить с помощью следующей хранимой процедуры: sp_configure
'default
language', <0 - 9999>
Язык задается с помощью идентификационного номера. Их сопоставление можно просмотреть в таблице syslanguages системной базы данных Master.
Замечание При необходимости пользователь может применять не установленный администратором язык по умолчанию, а выбрать любой другой на уровне соединения, пакета, хранимой процедуры или транзакции с помощью команды S E T L A N G U A G E .
В группе элементов управления Server behavior можно управлять некоторыми важными сторонами поведения сервера. Доступны следующие флажки: П Allow modifications to be made directly to the system catalogs управляет прямым доступом к системным таблицам. При установке данного флажка разрешается изменение данных в системных таблицах непосредственно с помощью команд INSERT, UPDATE и DELETE. По умолчанию флажок сброшен, и разрешается только чтение данных из системных таблиц с помощью команды SELECT. Обычно все изменения в системных таблицах выполняются с помощью специальных системных хранимых процедур. Microsoft настоятельно рекомендует использовать именно этот метод изменения системных таблиц и избегать прямого доступа. Это обеспечит работу приложений в следующих версиях SQL Server. Microsoft не гарантирует, что структура системных таблиц, а также назначение колонок не будут изменены в новых версиях. Поэтому приложения, работающие напрямую с системными таблицами, могут работать некорректно и привести к повреждению системных данных SQL Server. Контролировать прямой доступ к системным таблицам можно также и с помощью следующей хранимой процедуры: sp_configure 'allow updates', 0|1
С
Замечание
При изменении возможности прямого доступа к системным таблицам следует учесть, что если вы создадите хранимую процедуру при разрешенном прямом дос-
180
Часть III. Администрирование тупе к системным таблицам, то эта процедура сможет изменять данные в системных таблицах даже после запрещения прямого доступа. Это происходит потому, что хранимые процедуры имеют свой собственный набор свойств, который при создании заимствуется из текущей настройки соединения.
• Allow triggers to be fired which fire other triggers (nested triggers) управляет возможностью вызова триггеров друг из друга и образованием вложенных триггеров (nested triggers). Предположим, вы модифицируете таблицу, для которой определен триггер. С целью сохранения целостности данных триггер изменяет содержимое зависимой таблицы. В свою очередь, для зависимой таблицы также может быть определен триггер, который может изменять данные в третьей таблице и т. д. При установке флажка разрешается выполнение триггера таблицы, которая изменяется триггером более высокого уровня. Глубина вложения триггеров может достигать 16. По умолчанию вызов вложенных триггеров разрешен, однако вы можете запретить это, сбросив флажок.
Замечание Работая с вложенными триггерами, следует учитывать, что SQL Server 2000 не выполняет триггеры, которые были вызваны ранее в ходе выполнения текущей транзакции. Это позволяет избежать рекурсии и зацикливания. •
Управлять возможностью вызова вложенных триггеров можно также с помощью следующей хранимой процедуры: sp_configure
'nested triggers',
0|l
П Use query governor to prevent queries exceeding specified cost запрещает выполнение запросов, имеющих цену исполнения выше указанной. При установке флажка необходимо указать максимальное время в секундах, в течение которого может выполняться запрос. Если оптимизатор запросов оценит время обработки запроса, и оно будет выше указанного значения, то запрос выполняться не станет, а в соединение будет выдано соответствующее сообщение об ошибке. По умолчанию флажок сброшен и разрешено выполнение всех запросов. Управлять ценой исполнения запроса можно также с помощью хранимой процедуры: sp_configure 'query governor cost limit', <0 - 2147483647>
Замечание Следует четко понимать разницу между прерыванием запроса по тайм-ауту и отменой его обработки из-за высокой цены выполнения. В первом случае запрос запускается, однако в случае слишком долгого выполнения он прерывается системой. При этом система может быть сильно загружена запросом. Во втором случае запрос вообще не запускается и практически никакой нагрузки на сервер не оказывает. В группе SQL Mail имеется единственное поле Start mail session using profile, где указывается имя почтового профиля, который будет использоваться службой MSSQLServer для работы с электронной почтой. С помощью кнопки Change
Глава 8. Конфигурирование служб SQL Server 2000
181
можно открыть диалоговое окно, содержащее все сконфигурированные на локальном компьютере почтовые профили, и выбрать один из них. Не каждый почтовый профиль может быть применен для работы MSSQLServer. Чтобы создать почтовый профиль, необходимо зарегистрироваться локально на компьютере под учетной записью, используемой для запуска службы MSSQLServer и настроить почтовый профиль. После этого нужно на вкладке Server Settings выбрать имя созданного профиля. Замечание Службы MSSQLServer и SQLServerAgent могут использовать как один и тот же, так и разные почтовые профили. Применение одного и того же профиля потребует либо запуска обеих служб под одной учетной записью, либо конфигурирования соответствующим образом прав доступа на почтовом сервере. Конфигурирование почтового профиля службы SQLServerAgent будет рассмотрено далее в этой главе. В нижней части вкладки Server Settings находится группа элементов Year 2000 support, с помощью которой можно управлять тем, как SQL Server 2000 станет воспринимать год, указанный с помощью двух цифр. Типы даты и времени (datetime и smalldatetime) не работают с двухзначными годами. Но допускается ввод года только с помощью двух последних цифр. Однако сервер автоматически преобразует год из двухзначной формы в четырехзначную. С помощью полей данной группы указываются правила перевода двухзначного года в четырехзначный. По умолчанию используется диапазон 1950 and 2049. Это означает, что при вводе двухзначного года в диапазоне от 50 до 99 он будет принадлежать XX веку, а при вводе значения от 0 до 49 — XXI веку. Например, пользователь вводит год как "39". При сохранении указанного значения в поле datetime или smalldatetime автоматически преобразует его в 2039. Когда же вводится значение 78, оно будет преобразовано в 1978. Управлять преобразованием двухзначного года можно также с помощью хранимой процедуры: sp_configure 'two digit year cutoff, <1753 - 9999> Последний параметр процедуры определяет верхнее значение, которое по умолчанию установлено в 2049.
Вкладка Database Settings На вкладке Database Settings (рис. 8.9) задаются параметры по умолчанию, которые будут устанавливаться в создаваемой базе данных. Первая группа элементов — Settings, предназначена для управления фактором заполнения (fill factor) индексных страниц. Фактор заполнения — это величина, определяющая объем доступного пространства на странице в процентах, которое должны занимать данные. Остальное место будет свободным. Рассмотрим более подробно назначение фактора заполнения.
Часть III. Администрирование
182 SQL Server Properties (Configure) General | Memory | Processor | Security | Connections Server Settings Database Settings Replication : ^Settings - -• Default index fill factor to use when rebuilding indexes {%): "~ Fixed Backup/restore •— [',«• | Specify the time SQL Server should wait when reading a tape Time-out period:
С Wait indefinitely f* J_ry once then quit {• Try for:
j5
minute(s)
Default backup media retention (days):
7
—
Recovery jfoO) Recovery interval (min) New database default location — — |gj
Default data directory:
•huMMr Default log directory. (* Configured values
JK:\SQL_DataBase\Data\
... j
K:\SQL_DataBase\Log\ С Running values Cancel
Help
Рис. 8.9. Окно SQL Server Properties, вкладка Database Settings
Замечание На вкладке Database Settings устанавливается фактор заполнения индексных страниц. При работе со страницами данных фактор заполнения не важен, т. к. новые строки вставляются на первое попавшееся свободное место, т. е. неупорядоченно. Данные в таблице хранятся неупорядоченно до тех пор, пока в ней не будет определен кластерный индекс. После этого фактор заполнения страниц данных можно рассматривать как фактор заполнения индексных страниц.
Допустим, вы вставляете большой объем упорядоченных строк, и они заполняют страницы целиком. Затем вам необходимо вставить новые строки. Поскольку необходимо соблюсти упорядоченность данных, то можно с большой вероятностью ожидать, что часть строк будет вставлена не в конец. Однако все страницы заполнены. Чтобы освободить место на страницах, система выполняет расщепление страниц (split page). В ходе этого процесса создается новая страница и на нее переносится примерно половина строк с той страницы, на "которую предполагается вставить строку. В итоге имеем две страницы, заполненные наполовину, и можем без труда вставить очередную строку. Операция расщепления является довольно "тяжелой", занимающей много времени и ресурсов. Если выполняется вставка большого количества строк в таблицу, страницы которой заполнены, то производительность операции вставки будет низкой.
Глава 8. Конфигурирование служб SQL Server 2000
183_
Чтобы добиться максимальной производительности операций вставки и избежать расщепления страниц, рекомендуется устанавливать небольшой фактор заполнения страниц. Однако в этом случае объем пространства в базе данных, необходимый для хранения данных, может значительно превышать реальный объем данных. При выборе конкретного значения фактора заполнения необходимо оценить, как часто будут изменяться данные. В системах, не подверженных изменениям, можно установить фактор заполнения на уровне 100%. Примером таких систем могут служить системы поддержки принятия решений (DSS, Decision Support System) и базы данных, хранящие архивную информацию.
(
Замечание
^
При подсчете объема дискового пространства, требуемого для хранения данных, необходимо всегда делать поправку на то, что фактор заполнения страниц значительно меньше 100%. Если данные занимают 500 Мбайт, то для их хранения на диске обычно нужно около 800 Мбайт. В состоянии, когда флажок Fixed не установлен, используется фактор заполнения по умолчанию. Это значение считается оптимальным. Индексные страницы SQL Server 2000 построены в виде B-depeea (B-tree). При сброшенном флажке Fixed страницы, расположенные на самом нижнем уровне дерева, окажутся заполненными на 100%, но на страницах более высокого уровня будет резервироваться место для добавления новых данных. Такой подход позволяет добиться высокой скорости вставки данных наряду с низкими требованиями к дисковому пространству. Когда же флажок Fixed установлен, то с помощью ползунка в правой части окна необходимо явно задать, какой фактор заполнения должны иметь индексные страницы. Если при создании индекса явно не указывается, какой фактор заполнения должен использоваться, то сервер будет заполнять страницы в соответствии со значением, установленным с помощью рассматриваемых элементов управления. Значение фактора заполнения может быть изменено программно с помощью следующей хранимой процедуры: sp_configure
'fill
factor',
оначение в %>
В группе Backup/restore можно определить некоторые параметры поведения подсистемы резервного копирования. В частности, с помощью переключателей Time-out period можно задать время, в течение которого система находится в режиме ожидания готовности устройства резервного копирования: П Wait indefinitely обозначает бесконечное ожидание. Пользователь должен будет вручную прервать процесс, если устройство не инициализируется. • Try once then quit определяет, что выполняется одна попытка чтения, которая в случае неудачи прерывается с выдачей соответствующего сообщения об ошибке. • Try for позволяет установить количество минут, в течение которых система будет ожидать готовности устройства резервного копирования. Если по исте-
184
Часть III.
Администрирование
чении указанного периода устройство не будет инициализировано, то операция прервется. В поле Default backup media retention (days) указывается количество дней, которое должно пройти со времени создания резервной копии, прежде чем SQL Server 2000 разрешит затереть ее новыми данными. Это позволяет избежать случайного удаления резервных копий. Однако данную проверку при необходимости можно обойти. Подробно подсистема резервного копирования рассмотрена в главе 10. Следующий параметр вкладки Database Settings — это поле Recovery interval (min). В нем определяется максимальное количество минут, которое SQL Server 2000 будет тратить на восстановление базы данных (recovery database). Процесс восстановления баз данных выполняется при каждом старте SQL Server 2000. В ходе такого процесса система анализирует журнал транзакций базы данных, после чего выполняет откат (rollback) незавершенных транзакций и фиксирование (commit) завершенных, но не сохраненных в базе данных транзакций. По умолчанию период восстановления базы данных установлен равным 0 минут, и SQL Server 2000 выбирает наиболее оптимальное время восстановления. Обычно процесс восстановления занимает не более минуты. От того, какое время выделено на восстановления базы данных, зависит частота выполнения SQL Server 2000 операции контрольной точки (check point). Контрольная точка — это сохранение на диск всех изменений данных, выполненных со времени последней контрольной точки и накапливающихся во внутренних буферах SQL Server 2000. Поскольку все изменения данных выполняются в виде транзакций, то в журнале транзакций присутствует информация, с помощью которой можно восстановить изменения данных, сделанные пользователями. Если крах системы произошел перед выполнением контрольной точки, то при следующем старте SQL Server 2000 восстановит изменения из журнала транзакций. В нормальном режиме работы SQL Server 2000 оценивает, сколько времени понадобится на восстановление изменений из журнала транзакций. Если это время приближается к значению, указанному в поле Recovery interval (min), то система выполняет контрольную точку. Управлять установкой времени восстановления можно с помощью следующей хранимой процедуры: sp_configure
'recovery i n t e r v a l ' , <0 - 32767>
Последний параметр определяет количество минут, которое отводится на восстановление базы данных. В нижней части вкладки размещена группа элементов New database default location. Как следует из названия, с помощью элементов этой группы указывается каталог, который будет предлагаться по умолчанию для размещения файлов базы данных. В группе содержится всего два элемента: • Default data directory. В этом поле указывается каталог, который будет предлагаться для хранения файлов данных (mdf и ndf). При нажатии кнопки справа от поля, открывается окно браузера, с помощью которого можно выбрать каталог в интерактивной форме. П Default log directory. В этом поле указывается каталог для файлов журнала транзакций.
Глава 8. Конфигурирование служб SQL Server 2000
185
Вкладка Replication Если вы работали с SQL Server 7.0, то наверняка заметили, что до сих пор вкладки окна SQL Server Properties для SQL Server 2000 были весьма схожи с аналогичными вкладками предыдущей версии. Однако в упомянутом окне для SQL Server 2000 было сделано заметное изменение — добавлена вкладка Replications (рис. 8.10). ill SQL Server Properties (Configure) - §T General j Memory j Processor | Security J Connections Server Settings Database Settings Replication г Publishing and distribution— S Щ.Ж 'STORAGE\SQL_SERVER_200Cr is not configured as a • кяЩ Publisher or Distributor.
Configure.. J
OK
Cancel
Help
Рис. 8.10. Окно SQL Server Properties, вкладка Replication
Вкладка Replications служит для управления подсистемой репликации. В данной главе мы не будем рассматривать использование этой вкладка, отложив это до главы 14.
Конфигурирование службы SQLServerAgent В предыдущем разделе рассмотрено управление работой службы MSSQLServer, являющейся ядром SQL Server 2000. В этом же разделе мы обсудим управление параметрами работы службы SQLServerAgent, отвечающей за автоматизацию администрирования SQL Server 2000. Управление работой службы SQLServerAgent производится с помощью диалогового окна SQL Server Agent Properties (рис. 8.11). Для вызова окна необходимо в
Часть III. Администрирование
186
левой панели Enterprise Manager выбрать нужный сервер, открыть дерево его свойств, в папке \Management выбрать объект SQLServerAgent и в его контекстом меню выбрать пункт Properties. SQL Server Agent Properties - ST General Advanced j Alert System j Job System j Connection r- Service startup account (* ;Sy_stern account I С This account:
Mail session |>Л] Mail profile: I
jEvgeniy Mamaev
S_ave copies of the sent messages in the "Sent Items" folder
"Error log ГЩ
"
File name:
-~*~—
~~
|F:\SQL2OOO\MSSQL$SQL_SEF I
I View... [
include execution trace messages
Г Write OEM File Net send recipient:
OK
Cancel
Apply
Help
Рис. 8 . 1 1 . Окно SQL Server Agent Properties
Вкладка General Вкладка General (см. рис. 8.11) позволяет управлять общими параметрами работы службы SQLServerAgent. В группе Service startup account можно изменить учетную запись, под которой запускается служба SQLServerAgent. При установке переключателя System account для запуска системы будет использоваться учетная запись локальной системы. Можно запустить сервер под учетной записью пользователя, установив переключатель This account и указав при этом имя учетной записи и ее пароль. Можно запускать службы SQLServerAgent и MSSQLServer как под одной учетной записью, так и под разными.
С
Замечание
Подробно выбор и создание учетных записей, под которыми будут работать службы
SQL Server 2000, рассмотрены в разд. "Подготовка учетных записей" главы 4.
В группе Mail session можно настроить почтовый профиль, используемый для отправки сообщений операторам сервера. В раскрывающемся списке Mail profile необходимо задать один из почтовых профилей, созданных на сервере. Для созда-
Глава 8. Конфигурирование служб SQL Server 2000
187
ния профиля надо зарегистрироваться на локальном сервере под запускающей службу SQLServerAgent учетной записью и настроить параметры электронной почты. Полученный профиль затем необходимо выбрать в списке Mail profile. Для проверки работы почтовых функций следует нажать кнопку Test, которая появляется справа от поля Mail profile при корректных настройках. Если установить флажок Save copies of the sent messages in the "Sent Items" folder, то в папке \Отправленные почтового ящика будут оставаться копии отправленных операторам сообщений. С помощью этих сообщений можно будет восстановить ход событий и порядок извещения операторов о проблемах в работе сервера. В группе элементов Error log производится управление журналом ошибок службы SQLServerAgent. В этот журнал записываются сообщения трех типов: информационные, предупреждающие и сообщения об ошибках. В поле File name указывается имя текстового файла, который будет выступать в качестве журнала ошибок. Для просмотра содержимого файла достаточно нажать кнопку View. По умолчанию в журнале сохраняется лишь общая информация. Если же необходимо иметь детальную информацию, то нужно установить флажок Include execution trace messages. He рекомендуется помечать этот флажок при обычной работе. Запись подробной информации требуется лишь при поиске неисправностей. В обычных условиях установка флажка может привести к заметному снижению производительности при интенсивной работе службы SQLServerAgent. По умолчанию журнал ошибок ведется в стандарте Unicode и на каждый символ отводится два байта. Просматривать такой файл может быть не совсем удобно. Если вы хотите, чтобы для журнала ошибок использовался стандартный формат, необходимо установить флажок Write OEM File. Кроме того, в данном случае файл будет занимать в два раза меньше дискового пространства.
С
Замечание
^
Если работа службы SQLServerAgent не вызывает нареканий, то ведение журнала ошибок можно отключить. Это позволит сэкономить системные ресурсы, которые могут быть использованы для решения более важных задач. Последний параметр вкладки General — поле Net send recipient. Здесь указывается сетевое имя NetBIOS пользователя или машины, которые будут получать всплывающие сообщения (pop-up messages) службы SQLServerAgent. Для отправки этих сообщений предназначен стандартный механизм Windows NT — команда NET SEND.
Вкладка Advanced Вкладка Advanced (рис. 8.12) служит для управления автоматическим запуском службы, определением режима простоя сервера и управления перенаправлением сообщений.
Часть III. Администрирование
188 SQL Server Agent Properties General Advanced | Alert System ] Job System) Connection) -Restart services * Auto restart SQL Server if it stops unexpectedly Auto restart SQL Server Agent if it stops unexpectedly SQL Server event forwarding JUJ P Eorward events to a different server y Server: JCIT Events: <•" JJnhandled events If event has severity of or above:
All events
Idle CPU condition The computer is idle when:
Average CPU usage falls below: 600
And remains below this level for:
OK
Cancel
Apply
seconds
Help
Рис. 8.12. Окно SQL Server Agent Properties, вкладка Advanced
В группе параметров Restart services имеются два флажка, управляющие автоматическим запуском служб SQL Server 2000 в случае их неожиданного останова: П Auto restart SQL MSSQLServer.
Server if
it
stops unexpectedly — автозапуск
службы
• Auto restart SQL Server Agent if it stops unexpectedly — автозапуск службы SQLServerAgent. Замечание Если существует выделенный сервер для баз данных, который работает длительное время без перезагрузки, то рекомендуется использовать возможность автозапуска служб SQL Server 2000 в случае неожиданного останова. Это позволит свести к минимуму простои сервера из-за возникновения системных ошибок. Раздел SQL Server event forwarding предназначен для управления переадресацией событий SQL Server 2000, возникших на локальном сервере, в журнал приложений (application log) Windows NT удаленного сервера. Такая переадресация используется для централизованного контроля работы серверов предприятия. Данные о работе множества серверов могут стекаться на один центральный компьютер, за которым работает администратор. Ему достаточно просмотреть журнал приложений на своем компьютере, чтобы обнаружить неполадки в работе любого из серверов сети предприятия. Установив флажок Forward events to a different server, вы тем самым разрешите перенаправление событий. При этом в раскрывающемся списке Server необхо-
Глава 8. Конфигурирование служб SQL Server 2000
189
димо выбрать имя одного из зарегистрированных серверов SQL Server 2000, на который будут перенаправляться сообщения. С помощью переключателей группы Events можно управлять тем, какие сообщения будут отправляться: • Unhandled events. Будут переправляться только сообщения, которые не были обработаны локальными оповещениями (alerts). П All events. Будут переправляться все сообщения, возникающие на сервере. Кроме того, можно посылать только те сообщения, уровень серьезности (severity level) которых выше минимально установленного. Уровень серьезности, начиная с которого сообщения будут пересылаться на удаленный компьютер, можно выбрать в раскрывающемся списке If event has severity of or above.
(
Замечание
^
Более подробно управление пересылкой сообщений, в том числе и использование уровней серьезности, будет рассмотрено в главе 12. Последний раздел вкладки Advanced — группа Idle CPU condition. Данный раздел используется для определения условия мертвого или спящего режима центрального процессора. При конфигурировании момента автоматического запуска заданий Gobs) службой SQLServerAgent можно указывать условие наименьшей активности сервера. Это гарантирует, что задание будет запущено в период наименьшей активности пользователей и не причинит больших неудобств. Для определения параметров спящего режима необходимо установить флажок The computer is idle when и в поле Average CPU usage falls below указать процент загрузки центрального процессора. В поле And remains below this level for вводится количество секунд, в течение которого нагрузка на центральный процессор не должна превышать указанного в поле Average CPU usage falls below значения. По истечении заданного времени считается, что сервер перешел в спящий режим. Если в момент наименьшей активности сервера предполагается запуск тяжелых заданий, например, таких как резервное копирование баз данных или перестроение индексов, то следует быть осторожным при конфигурировании условия перехода сервера в спящий режим. Нужно соотносить длительность выполнения задания с промежутком, в течение которого загруженность сервера была низкой. При работе с очень тяжелыми заданиями рекомендуется определять время запуска не как момент наименьшей активности сервера, а как конкретное время, когда активность пользователей гарантированно низкая (например, ночью или в обеденный перерыв).
Вкладка Alert System Вкладка Alert System (рис. 8.13) позволяет управлять адресами рассылки сообщений операторам, а также форматом самих сообщений. В разделе Address formatting for pager e-mails указывается адрес электронной почты, по которому можно отправлять сообщения на пейджеры операторов. Если эти люди пользуются одной службой рассылки сообщений на пейджеры, то достаточ-
Часть III. Администрирование
190
но один раз ввести шаблон адреса на вкладке Alert System, а затем указывать только номер абонента для каждого из операторов. При необходимости можно сконфигурировать отправку сообщения через разные службы. Адрес ящика электронной почты, отведенного пейджинговой компании для приема сообщений, можно указать в полях Prefix и Suffix, а в поле Subject — заголовок сообщения, которое будет получать оператор. SQL Server Agent Properties - STORAGES
2<J
General j Advanced 'Alert System j Job System] Connection] г Address formatting for pager e-mails Prefix
Pager address
Suffix
г Г г f
Jo line:
CC line; Sube jct: JAe Irt • CC n il e exampel
Body: ff/ n I cu l de body of e-mali in notficato i n page Fa-lisafe operator.Operator: [De i sel Notfiy usn i g: P" £-mali P7 Pager Г" N OK
Cancel
Appyl
Hep l
Рис. 8.13. Окно SQL Server Agent Properties, вкладка Alert System
Установка флажка Include body of e-mail in notification page позволит включить в посылаемое оператору сообщение текст ошибки для оценки серьезности проблемы. По умолчанию данный флажок установлен. Если вы хотите посылать только короткое сообщение о факте возникновения ошибки и ее номере, сбросьте его. В разделе Fail-safe operator можно выбрать оператора последней надежды (failsafe operator). С помощью флажков Notify using укажите способы информирования оператора последней надежды: • E-mail — электронная почта; • Pager — пейджер; О Net send — команда NET SEND.
С
Замечание
Система посылает сообщение оператору последней надежды в случае, когда все другие операторы недоступны. Оператор, которому отведена именно эта роль, не
Глава 8. Конфигурирование служб SQL Server 2000
191
может быть удален. Для этого его статус должен быть сначала понижен до обычного оператора. Подробно использование операторов, в том числе и оператора последней надежды, рассмотрено в главе 12.
Вкладка Job System Параметры вкладки Job System (рис. 8.14) позволяют управлять подсистемой выполнения заданий: конфигурировать журнал истории выполнения заданий, устанавливать интервал останова и управлять выполнением шагов командной строки. SQL Server Agent Properties - STORAGES, General J. Advanced j Alert System Job System | Connection r-Job history log * Maxm i um job history log size (rows): Maxm i um job history rows per job: Current job history log size (rows): 0 -Job execution Shutdown time-out interval (seconds): Master SQLServerAgent (MSX) server: (None) - N on-SysAdrmn i job step proxy account ••- • — r fjnly users with SysAdmn i privileges can execute CmdExec and ActiveScripting job steps Beset Proxy Account OK
Cancel
Reset Proxy Password Apply
Рис. 8.14. Окно SQL Server Agent Properties, вкладка Job System
Служба SQLServerAgent ведет журнал, в котором отображается информация о ходе выполнения заданий в целом, а также о каждом шаге в отдельности. Журнал представляет собой таблицу, размещенную в системной базе данных Msdb. При интенсивном использовании заданий журнал может быстро увеличиться и заполнить все свободное пространство на диске. Чтобы этого не происходило, можно установить ограничения на размер журнала. В разделе Job history log можно управлять количеством строк, отводимым для хранения информации о выполнении заданий. Когда количество строк превышает указанный предел, служба SQLServerAgent автоматически удаляет самые старые строки, освобождая место для записи свежих данных. Чтобы разрешить удаление устаревших строк, необходимо установить флажок Limit size of job history log. При этом в поле Maximum job history log size (rows) необходимо ввести
192
Часть III. Администрирование
максимальное количество строк, отводимое для хранения данных всех заданий. В поле Maximum job history rows per job указывается максимальное количество строк для хранения данных конкретного задания. Текущее количество строк, имеющееся в журнале, показано в поле Current job history log size (rows). С помощью кнопки Clear Log можно полностью очистить журнал, удалив из него все строки. В поле Shutdown time-out interval (seconds) раздела Job execution задается (в секундах) время, в течение которого система будет ожидать завершения запущенных заданий, перед тем как остановить службу SQLServerAgent. Запуск новых заданий не разрешается. В этом же разделе в поле Master SQLServerAgent (MSX) server выводится имя сервера, сконфигурированного в качестве главного для многосерверных заданий. Группа Non-SysAdmin job step proxy account позволяет управлять шагами заданий, работающими с ActiveX и командной строкой. Установив флажок в этой группе, можно разрешить выполнение шагов ActiveScripting и CmdShell только членам фиксированной роли сервера sysadmin. Выполнение шагов CmdShell производится под специальной учетной записью пользователя SQLAgentCmdExec, создаваемой автоматически при установке SQL Server 2000. Если шаг CmdExec обращается к каким-то ресурсам, то следует убедиться, что учетной записи SQLAgentCmdExec предоставлены необходимые права доступа. Например, если на каком-то шаге имеет место попытка удалить ненужные файлы, то учетная запись должна иметь соответствующие права доступа. Не рекомендуется изменять пароль и имя учетной записи SQLAgentCmdExec средствами утилиты User Manager for Domains. В противном случае выполнение шагов CmdShell будет невозможно. Для восстановления измененной или удаленной учетной записи SQLAgentCmdExec необходимо нажать кнопку Reset Proxy Account на вкладке Job System. Кнопка Reset Proxy Password служит для синхронизации пароля.
Вкладка Connection С точки зрения службы MSSQLServer служба SQLServerAgent является обычным клиентом, подобно другим устанавливающим соединение с сервером. Вкладка Connection (рис. 8.15) позволяет управлять соединением между службами SQLServerAgent и MSSQLServer. В разделе SQL Server connection определяется способ подключения, который будет использовать служба SQLServerAgent. По умолчанию предлагается аутентификация Windows NT. При этом необходимо разрешить учетной записи, под которой запускается служба SQLServerAgent, доступ к серверу и включить ее в фиксированную роль сервера sysadmin. В противном случае работа подсистемы автоматизации будет невозможна. Чтобы избежать проблем с предоставлением доступа, рекомендуется запускать службы MSSQLServer и SQLServerAgent под одной и той же учетной записью.
Глава 8. Конфигурирование служб SQL Server 2000 SQL Server Agent Properties - STOR General | Advanced ] Alert System | Job System Connection г SQL Server connection— (jjSfefi
- -
193
2<J
-
*~ Use Windows NT Authentication (* 1}:,!
hcation:|
SysAdmin Jogin ID: 1 sa Password:
]*** *
Login time-out:
|30
• SQLServer alias asJSl Local host server::
OK
-4 seconds
(default)
Cancel
Apply
Help
Рис. 8.15. Окно SQL Server Agent Properties, вкладка Connection
Установив переключатель Use SQL Server Authentication, можно указать имя и пароль учетной записи SQL Server 2000, под которой будет осуществляться соединение с сервером. Указанная учетная запись также должна состоять в роли sysadmin.
В поле Login time-out указывается время (в секундах), в течение которого служба SQLServerAgent будет ожидать установления соединения со службой MSSQLServer. По истечении указанного времени сгенерируется сообщение об ошибке. В раскрывающемся списке Local host server можно выбрать один из сконфигурированных псевдонимов (aliases) локального сервера, под которым следует устанавливать соединение. Это может понадобиться для реализации нестандартного подключения. Определить псевдонимы можно с помощью утилиты SQL Server Client Network Utility.
Использование процедуры sp_configure Как уже говорилось, конфигурирование служб SQL Server 2000 можно выполнять различными способами. Эта глава в основном была посвящена конфигурированию служб с помощью графического интерфейса Enterprise Manager. Однако по возможности также была дана информация по выполнению аналогичных
194
Часть III. Администрирование
действий с помощью средств Transact-SQL, в частности, системной хранимой Процедуры sp_configure. В главе были приведены параметры процедуры, которые пересекаются с возможностями Enterprise Manager. Однако эти параметры не исчерпывают возможности хранимой процедуры sp_configure. В табл. 8.2 перечислены все опции процедуры, позволяющие управлять практически всеми параметрами работы службы MSSQLServer. Замечание Для удобства опции процедуры, которые были рассмотрены в этой главе, помечены звездочкой (*). Знаком плюс (+) отмечены опции, добавленные в SQL Server 2000 и отсутствующие в SQL Server 7.0.
Замечание Значительная часть опций в качестве значения по умолчанию использует 0. При указании этого значения используется динамическое управление объемом ресурсов, выделяемых для соответствующего параметра конфигурации. Значение 0 также может означать бесконечность, что характерно для периодов ожидания. Таблица 8.2. Параметры хранимой процедуры sp_con
Имя опции
Значение
figure
Описание
минимальное
максимальное
по умолчанию
a f f i n i t y mask *
0
2 147 483 647
0
Маска использования SQL Server 2000 процессоров, имеющихся на компьютере
allow updates *
0
1
0
Разрешение прямого доступа к системным таблицам с помощью КОМаНД I N S E R T , UPDATE, DELETE И SELECT
awe enabled +
0
1
0
Управляет поддержкой большого обьема оперативной памяти до 64 Гбайт (AWE, технология Address Windowing Extensions)
c2 a u d i t mode +
0
1
0
Управляет использованием аудита уровня С2, позволяющего контролировать как успешные, так и неудачные попытки обращения к командам Transact-SQL и объектам баз данных
cost t h r e s h o l d for parallelism *
0
32767
5
Определяет стоимость распараллеливания запроса
Глава 8. Конфигурирование служб SQL Server 2000
195 Таблица 8.2 (продолжение)
Имя опции
Значение
Описание
минимальное
максимальное
по умолчанию
cursor threshold
-1
2147483647
-1
Определяет минимальное коли1 чество строк в курсоре , при котором набор ключей генерируется асинхронно
default f u l l t e x t language +
0
2147483647
1033
Указывает язык по умолчанию, который будет использоваться для столбцов, индексированных для полнотекстрвого поиска
default language *
0
9999
0
Язык по умолчанию, который будет устанавливаться для вновь создаваемых пользователей
fill
0
100
0
Определяет фактор заполнения, который будет устанавливаться для вновь создаваемых структур
704
2147483647
0
Объем памяти, выделяющейся при сортировке с помощью индекса
0
1
0
Используется в многопроцессорных системах для уменьшения потерь от переключения контекста
5000
2147483647
0
Максимальное количество блокировок, допустимое на сервере
max degree of parallelism *
0
32
0
Ограничивает количество процессоров, используемых при распараллеливании запросов
max server memory *
4
2147483647
max t e x t size
0
2147483647
65536
Максимальное количество байт (для столбцов t e x t , n t e x t и image), которое может быть обработано при репликации за одну команду
10
32767
255
Максимальное количество потоков, доступное для процессов SQL Server 2000
factor*
index c r e a t e memory lightweight pooling
locks
repl
max worker threads *
1
2147483647 Максимальный объем памяти операционной системы, который доступен SQL Server 2000
Курсор — объект для хранения строк данных, который является промежуточным звеном между переменной и таблицей.
196
Часть III. Администрирование
Таблица 8.2 (продолжение) Имя опции
Описание
Значение минимальное
максимальное
по умолчанию
0
365
0
Минимальное количество дней, через которое допускается повторное использование носителя
512
2147483647
1024
Минимальное количество памяти, выделяемое для выполнения каждого пользовательского запроса
min s e r v e r memory *
0
2147483647
0
Минимальный объем памяти, который предоставляется для работы SQL Server 2000
nested triggers *
0
1
1
Разрешает использование вложенных триггеров
512
65536
4096
Определяет размер пакета данных, передаваемого по сети
open o b j e c t s
0
2147483647
0
Задает максимальное количество объектов баз данных, которое может быть открыто в пределах инсталляции одновременно
priority boost *
0
1
0
Определяет, будет ли SQL Server 2000 запускаться с высоким (13) или обычным (7) приоритетом
query governor cost l i m i t *
0
2147483647
0
Задает максимальную цену запроса в секундах. Если стоимость запроса превышает указанное значение, он не будет даже запущен на выполнение
query
-1
2147483647
-1
Определяет максимальное время в секундах, в течение которого система ждет исполнения запроса. При превышении указанного значения запрос прерывается по тайм-ауту. При указании значения - 1 время ожидания равно 25хцена исполнения запроса. При указании 0 ожидание бесконечно
recovery interval *
0
32767
0
Определяет максимальное количество минут, разрешенное для восстановления базы данных
remote access *
0
1
1
Управляет возможностью удаленных пользователей работать с сервером
media retention * m i n memory p e r query *
network size
packet
wait
Глава 8. Конфигурирование
служб SQL Server 2000
197
Таблица 8.2 (окончание) Значение
Имя опции
Описание
минимальное
максимальное
по умолчанию
remote l o g i n timeout
0
2147483647
20
remote proc trans *
0
1
0
Управляет выполнением требований ACID при выполнении транзакций с использованием MSDTC
remote query timeout *
0
2147483647
0
Определяет количество секунд, в течение которого ожидается выполнение удаленного запроса, прежде чем прервать его по тайм-ауту
scan f o r s t a r t u p procs
0
1
0
При установке параметра в 1 сервер будет выполнять хранимые процедуры, сконфигурированные для автоматического запуска
set working set s i z e *
0
1
0
Управляет резервированием памяти для SQL Server 2000
show advanced options
0
1
0
С помощью параметра можно разрешить или запретить показ продвинутых параметров
two d i g i t year cutoff *
1753
9999
2049
Предназначен для управления поведением сервера при работе с двухзначным форматом года
user connections *
0
32767
0
Определяет максимальное количество пользовательских соединений с сервером
user o p t i o n s
0
16383
0
Используется для управления параметрами по умолчанию клиентских соединений
Задает количество секунд, в течение которого будет ожидаться регистрация пользователей на удаленном сервере
Глава 9
Система безопасности SQL Server 2000 В предыдущих главах преимущественно рассматривались установка и настройка SQL Server 2000. Когда все необходимые действия по подготовке сервера закончены, можно приступать к его эксплуатации. В первую очередь необходимо обеспечить пользователям доступ к базам данных. На этом этапе следует грамотно спланировать права доступа к данным. Плохо продуманная система безопасности не сможет предотвратить кражу или повреждение данных предприятия. Планируя права доступа, необходимо исходить из принципа, что пользователь должен иметь доступ только к той информации, которая ему необходима в соответствии с его обязанностями. Не стоит предоставлять главному бухгалтеру доступ к информации технического отдела. Также как не нужно главному инженеру предоставлять доступ к информации о заработной плате его сотрудников. Несоблюдение этого простого правила может привести к плачевным последствиям. Для любого предприятия кража информации является нежелательной. Если в базе данных хранится информация о научных исследованиях, на которые затрачено несколько лет и колоссальные финансовые средства, то кража информации конкурентами может очень сильно пошатнуть финансовое положение компании. Конкуренты, не вложившие никаких средств в разработку технологии, могут позволить себе держать низкие цены. Если же пострадавшая компания будет устанавливать такие же цены, то она будет работать себе в убыток и не сможет окупить технологию. В результате, если компания не стоит крепко на ногах, это может привести к ее банкротству. Замечание Помимо кражи, возможны также незлонамеренное повреждение и уничтожение информации. Тем не менее, несмотря на то, что это произошло случайно, финансовые потери могут быть значительными. Выходом из подобных ситуаций является использование систем резервного копирования. Все вышесказанное доказывает, как важно грамотно спроектировать права доступа пользователей к базам данных. Если к базе данных обращается более одного пользователя, то это уже повод для разграничения их прав. Можно обойтись простым разделением возможностей пользователей, дав одному право изменять любые объекты базы данных, второму — право читать любую информацию, а третьему — только выполнять хранимые процедуры. Но в больших базах данных масштаба предприятия или корпорации необходимо более деталь-
Глава 9. Система безопасности SQL Server 2000 ное разграничение доступа. Для этого часто создаются два списка. Первый представляет собой список всех пользователей, которым необходимо предоставить доступ к тем или иным объектам базы данных. Второй список содержит перечень всех пользовательских объектов базы данных. Затем в первом списке выбирается пользователь, а во втором отмечаются права доступа, которые необходимо ему предоставить. Описанный метод не является единственным, это лишь пример планирования прав доступа. Мы рассмотрели правила разграничения доступа пользователей к данным, но не затронули проблемы предоставления доступа к базам данных через приложения. Большинство приложений работает в контексте идентификатора безопасности пользователя, запустившего приложение. Это означает, что приложение будет иметь те же права доступа, что установлены для пользователя. Но для работы некоторых приложений необходимо иметь фиксированный набор прав доступа, не зависящих от прав доступа пользователя, работающего с программой. SQL Server 2000 позволяет сделать это с применением специальных ролей приложения, речь о которых пойдет позже. В этой главе рассмотрены методы предоставления пользователям доступа к данным и объектам SQL Server 2000. Подробно рассмотрена архитектура системы безопасности, виды аутентификации пользователей, приемы предоставления или отклонения доступа к объектам базы данных. После прочтения главы читатель будет понимать, как проверяется право пользователя на выполнение тех или иных действий в базе данных.
Архитектура системы безопасности SQL Server 2000 является системой, удовлетворяющей самым жестким требованиям к безопасности информации. Условно система безопасности может быть разделена на два уровня: •
уровень сервера;
•
уровень базы данных.
На уровне сервера разрешается или отклоняется доступ пользователей к самому серверу. На уровне базы данных пользователи, имеющие доступ на уровне сервера, получают доступ к объектам базы данных. Такой подход позволяет более гибко управлять доступом пользователей к базам данных. На уровне сервера система безопасности оперирует следующими понятиями: •
аутентификация (authentication);
•
учетная запись (login);
•
встроенные роли сервера (fixed server roles).
На уровне базы данных используются понятия: П пользователь базы данных (database user); •
фиксированная роль базы данных (fixed database role);
199
Часть III. Администрирование
200
П пользовательская роль базы данных (users database role); • роль приложения (application role). В представленных ниже разделах будет подробно рассматриваться система безопасности на уровне сервера, после чего перейдем к рассмотрению системы безопасности на уровне базы данных.
Проверка подлинности пользователя Каждый пользователь, прежде чем получить право совершать какие-либо действия в системе, должен идентифицировать себя. Обычный способ идентификации — ввод имени пользователя при входе в систему. В свою очередь система должна убедиться, что пользователь, пытающийся получить доступ, действительно является тем, за кого себя выдает. Для этого предназначена аутентификация. Аутентификация — это проверка подлинности пользователя. Стандартное средство аутентификации — ввод пароля. Такой метод регистрации применяется повсеместно, в т. ч. в Windows NT и в SQL Server 2000. В последнее время получают распространение различные электронные карты, с помощью которых пользователь может идентифицировать себя в системе. Существует также возможность проверки подлинности при помощи сканирования сетчатки глаза, анализа голоса и т. д.
(
Замечание
}
Применение различных методов аутентификации пользователей обычно реализуется на уровне операционной системы. SQL Server 2000 поддерживает два метода аутентификации (Authentication Modes): •
средствами Windows NT (Windows NT Authentication);
•
средствами SQL Server 2000 (SQL Server Authentication).
Оба метода обладают своими недостатками и преимуществами. Администратор должен сам решить, какой из них более подходит в том или ином случае. В следующих разделах будет подробно рассмотрен каждый из методов аутентификации. Перечисленные методы аутентификации лишь определяют способ проверки подлинности пользователей. Однако SQL Server 2000 способен по разному использовать эти способы. Система безопасности SQL Server 2000 может работать в одном из двух режимов: • Mixed Mode (режим смешанной аутентификации). При работе в этом режиме SQL Server 2000 поддерживает проверку подлинности пользователей как с применением аутентификации Windows NT, так и аутентификации SQL Server. Данный режим предлагает некоторые удобства по сравнению со следующим режимом. В частности, когда пользователь не имеет учетной записи в домене Windows NT, он не может получить доступа к серверу баз данных, если разрешена аутентификация только средствами домена Windows NT. Смешанный режим аутентификации позволяет избежать этой проблемы;
Глава 9. Система безопасности SQL Server 2000
201
П Windows Authentication Mode (режим аутентификации Windows). При работе системы безопасности в этом режиме пользователи смогут получить доступ к серверу только с помощью аутентификации Windows NT. Режим является более защищенным по сравнению с предыдущим. Это, в первую очередь, связано с тем, что аутентификация Windows NT является гораздо более защищенной, чем аутентификация SQL Server. Для установки сервера в тот или иной режим аутентификации необходимо воспользоваться интерфейсом Enterprise Manager. В левой панели выберите нужный сервер и откройте окно его свойств. Для этого можно, например, в контекстном меню сервера выбрать команду Properties. В появившемся диалоговом окне выберите вкладку Security (рис. 9.1).
ягатонятагServer Setn igs Database Settings | General 1 Memoyr Processor Security :
Security
ijfek ~%t:\
Replication Connections
•
SQL Server provides authentication based on Windows NT accounts and a named SQL Server login ID and password. Authentication: 1-5
SQL 'Serve; and Windows Ы Ш Щ
С Windows NT/2000 only Audit level: С None
С Failure
(* Success
С AJ|
Startup service account 'Ш& Start and run SQL Server in the following account:
f Syse tm account (* Xhsi account [Admn isitrator Password: OK
Cancel
Hep l
Рис. Э.1. Вкладка Security окна свойств сервера
В разделе Security имеется группа переключателей Authentication, с помощью которых можно выбрать тот или иной режим аутентификации. При установке переключателя в положение SQL Server and Windows NT/2000 система безопасности будет работать в смешанном режиме. Когда же необходимо использовать только аутентификацию SQL Server, то переключатель следует установить в положение Windows NT/2000 only. Замечание Нельзя сконфигурировать систему безопасности SQL Server 2000 для применения только аутентификации SQL Server.
202
Часть III. Администрирование
Переключатели группы Audit level позволяют определить, какие попытки регистрации пользователей следует отслеживать: • None. Попытки доступа пользователей к SQL Server 2000 не протоколируются. • Success. Сервер записывает в журнал только те попытки регистрации, которые завершились успешно. В итоге журнал будет иметь список всех пользователей, работавших с данными сервера. • Failure. Отслеживаются только неудачные попытки получить доступ. Это позволяет следить за попытками подбора паролей и взлома системы. • All. В данном режиме сервер сохраняет информацию как о попытках, закончившихся предоставлением доступа, так и о попытках, завершившихся неудачно. Информация системы аудита в зависимости от конфигурации сервера сохраняется либо в журнале приложений Windows NT (Windows NT application log), либо в журнале ошибок SQL Server 2000 (error log), либо в обоих сразу. Журнал приложений Windows NT можно просмотреть с помощью утилиты, поставляемой с этой операционной системой. Запустить данную программу можно из меню Programs, а затем Administrative Tools. Для просмотра журнала ошибок SQL Server 2000 можно воспользоваться утилитой Enterprise Manager. Выберите нужный сервер и откройте папку \Management\SQL Server Logs\Current, в которой хранится журнал SQL Server 2000 за текущие сутки. Журналы за предыдущие сутки хранятся в папках \Archive#. Рассмотрим механизмы аутентификации Windows NT и SQL Server в отдельности.
Аутентификация Windows NT При аутентификации Windows NT подлинность пользователя проверяется операционной системой. Регистрируясь в домене Windows NT, пользователь должен ввести свое доменное имя и пароль. SQL Server 2000 предполагает, что процесс регистрации пользователей в сети достаточно защищен, и поэтому не выполняет никаких дополнительных проверок. Пользователь автоматически получает соответствующие права доступа к данным SQL Server 2000 сразу же после регистрации в домене. Такой метод предоставления доступа называется установлением доверительного соединения. Данная технология повышает защищенность системы. Пользователь должен только единожды ввести пароль, что снижает вероятность получения несанкционированного доступа к системе. Замечание Технология установления доверительного соединения в SQL Server 2000 поддерживается только при наличии сетевых библиотек Multiprotocol и Named Pipes. Выбирая аутентификацию Windows NT, убедитесь, что на сервере установлены эти библиотеки, иначе пользователи не получат доступ к SQL Server 2000.
Рассмотрим взаимодействие системы безопасности SQL Server 2000 с системой безопасности Windows NT. Операционная система работает с учетными записями
Глава 9. Система безопасности SQL Server 2000
203
(logins), которые содержат все данные о пользователе, включая его имя, пароль, членство в группах, каталог по умолчанию и т. д. Каждая учетная запись имеет уникальный идентификатор (login ID) или, как его называют по-другому, идентификатор безопасности (SID, Security Identification), с помощью которого пользователь регистрируется в сети. Доступ ко всем ресурсам сети производится на основе идентификатора учетной записи. Рассмотрим это на примере файловой системы NTFS. Каждый объект NTFS имеет список прав доступа (ACL, Access Control List). Указанный список представляет собой набор строк (АСЕ, Access Control Entries), каждая из которых содержит идентификатор учетной записи и описатель типа доступа. Когда пользователь пытается получить доступ к ресурсу, операционная система ищет его login ID в ACL и сравнивает тип разрешенного доступа с типом запрашиваемого доступа. Если конфликтов нет, то доступ предоставляется. Идентификатор представляет собой длинное шестнадцатеричное число, которое генерируется случайным образом операционной системой во время создания учетной записи. Такой подход позволяет избежать подделки учетных записей пользователей. Если пользователь был удален из домена, то даже повторное создание пользователя с аналогичными характеристиками (имя учетной записи, пароль, членство в группе и т. д.) не даст возможности получить доступ к объектам, к которым имел доступ оригинальный пользователь. Применительно к SQL Server 2000 можно сказать, что если пользователь домена имел определенные права доступа, но был удален, то никто не сможет присвоить его права доступа. Замечание Windows 98 не поддерживает идентификаторы безопасности в полной мере, поэтому SQL Server 2000, работающий под управлением этой операционной системы, не поддерживает аутентификацию Windows NT. Аутентификация пользователей доступна лишь средствами SQL Server 2000. Аутентификация Windows NT предусматривает сохранение в системной базе данных Master в SQL Server 2000 только идентификационного номера учетной записи пользователя в домене (login ID). Информация об имени пользователя, его пароле и т. д. хранится в базе данных домена. Изменение имени пользователя или его пароля никак не отразится на правах доступа к SQL Server 2000. Информация об учетной записи пользователя и его членстве в группах Windows NT считывается SQL Server 2000 из базы данных системы безопасности домена во время подключения пользователя. Если администратор внес какие-то изменения в учетную запись пользователя, например исключил его из некоторой группы, то изменения отразятся только во время очередной регистрации пользователя в домене или в SQL Server 2000 в зависимости от категории сделанных изменений. Аутентификация Windows NT дает определенные преимущества. На пользователях автоматически отражаются все правила политики безопасности, установленные в домене. Это повышает защищенность данных в SQL Server 2000. Например, авто-
204
Часть III. Администрирование
матически контролируется минимальная длина пароля и срок его действия. Операционная система требует от пользователя периодической смены пароля для повышения безопасности системы. Дополнительно можно запретить пользователям установку паролей, уже указывавшихся ранее. Кроме того, Windows NT имеет встроенные средства защиты от подбора паролей. Если пользователь несколько раз неправильно вводит пароль, то система на некоторое время блокирует его учетную запись. Подбор паролей в этом случае становится практически невозможным, т. к. на это потребуется огромное количество времени. Помимо сказанного выше, аутентификация Windows NT позволяет упростить управление правами доступа при наличии нескольких серверов SQL Server 2000. Если пользователи в запросе обращаются к нескольким различным источникам данных, то, скорее всего, эти системы попросят пользователя идентифицировать себя. При обращении к серверам SQL Server 2000 можно использовать отображение учетной записи (login) одного SQL Server 2000 в пользователя базы данных (user) другого SQL Server 2000. Аутентификация Windows NT этого не требует. Достаточно предоставить учетной записи пользователя домена необходимые права доступа на каждом из серверов. Такой способ управления правами доступа называется интегрированной безопасностью. В сетях Windows NT интегрированная безопасность применяется повсеместно, благодаря чему пользователи не должны запоминать массу паролей для каждого из сетевых ресурсов. При аутентификации средствами Windows NT необходимо следить за доверительными отношениями (trusted relationships) между доменами. Если серверы SQL Server 2000 находятся в разных доменах, то для предоставления доступа к серверу пользователям "чужого" домена необходимо настроить доверительные отношения. Это позволит предоставлять доступ пользователям, принадлежащим доменам, отличных от домена, в котором работает локальный SQL Server 2000. Если пользователь пытается подключиться к SQL Server 2000, установленному в домене, с которым не сконфигурированы доверительные отношения, то ему будет предложено идентифицировать себя с помощью аутентификации SQL Server. Если в сети имеется небольшое количество пользователей, то будет не обременительным предоставление доступа каждому из них персонально. Однако, в больших сетях с сотнями пользователей подобный подход не оправдывает себя. Гораздо более удобным и эффективным является подход, когда доступ к SQL Server 2000 предоставляется целым группам пользователей. На уровне домена создается несколько групп, каждая из которых будет предназначена для решения специфических задач. На уровне SQL Server 2000 такой группе разрешается доступ к серверу и предоставляются необходимые права доступа к базам данных и из объектам. Достаточно будет включить учетную запись Windows NT в одну из групп — и он получит все права доступа, предоставленные этой группе. Более того, одна и та же учетная запись может быть включена во множество групп Windows NT, что даст ему возможность пользоваться правами доступа, предоставленными всем группам.
Глава 9. Система безопасности SQL Server 2000
205
Аутентификация SQL Server Этот тип аутентификации реализуется на самом SQL Server 2000. Вся информация о пользователях хранится в системной базе Master. Для каждого пользователя указывается имя учетной записи, уникальный идентификатор SQL Server, пароль и другая информация. При попытке пользователя подключиться к серверу система безопасности потребует ввести имя учетной записи и ее пароль. Затем сравнит введенные данные с информацией, хранящейся в системных таблицах. Если данные совпадают, то доступ предоставляется. В противном случае пользователь получает сообщение об ошибке, и соединение не устанавливается. Аутентификация SQL Server в основном применяется клиентами, для которых недоступна регистрация в домене Windows NT. Например, пользователями Novell NetWare, Unix и т. д. При подключении к SQL Server 2000 через Internet регистрация в домене не выполняется, поэтому в данном случае также необходимо использовать аутентификацию SQL Server. Кроме того, аутентификация SQL Server необходима при работе сервера под управлением Windows 98, т. к. эта операционная система не поддерживает серверную часть программного интерфейса доверительных отношений (trusted connection API) и, следовательно, не может использовать аутентификацию Windows NT. При аутентификации SQL Server возможна ситуация, когда разные пользователи Windows NT будут работать под одной учетной записью SQL Server 2000. Администратор SQL Server 2000 должен самостоятельно реализовать политику безопасности. Он обязан периодически предупреждать пользователей о необходимости сменить пароль, чтобы обезопасить систему от несанкционированного доступа.
Создание учетной записи Как мы уже говорили, доступ к серверу SQL Server 2000 предоставляется пользователю на основе информации, называемой учетной записью (account или login) пользователя. Аутентификация Windows NT предусматривает хранение учетной записи пользователя в базе данных системы безопасности домена, работу с которой осуществляет диспетчер безопасности Windows NT (SAM, Security Account Manager). Диспетчер безопасности контролирует все попытки входа в сеть и проверяет права доступа пользователей к объектам на основе их списков доступа. Если пользователь успешно прошел регистрацию в сети Windows NT, он получает набор идентификаторов, включающий идентификатор самой учетной записи и идентификаторы всех групп, в которые включена учетная запись. На основе этих идентификаторов учетной записи Windows NT может быть предоставлен доступ к SQL Server 2000. То есть доступ к серверу может быть предоставлен как персональному пользователю, так и группе пользователей сразу. Администратор SQL Server 2000 должен сам решить, как удобнее предоставлять доступ к серверу: персонально каждой учетной записи или группе в целом. В первом случае администратор сервера баз данных имеет возможность контролировать каждого пользователя в отдельности. Хотя при большом их количестве в
206
Часть III. Администрирование
сети эта задача становится обременительной. Гораздо проще предоставить доступ к серверу группе пользователей, в которую затем можно добавлять новых членов или удалять старых. Выбирая конкретный метод контроля доступа, следует учитывать, что управление группами Windows NT выполняется средствами утилиты User Manager for Domains. Это означает, что администратор SQL Server 2000 должен иметь административные привилегии в сети Windows NT. В противном случае ему придется всякий раз, когда необходимо предоставить или запретить доступ учетной записи к SQL Server 2000, обращаться к администратору сети. При работе с аутентификацией SQL Server доступ также предоставляется на основе учетных записей. Но в этом случае используются учетные записи SQL Server, а не Windows NT. В двух следующих разделах будет рассмотрено создание учетных записей с помощью Enterprise Manager и средств Transact-SQL. При рассмотрении средств Transact-SQL также будет дана некоторая информация о том, как SQL Server 2000 хранит данные об учетных записях.
Средства Transact-SQL Информация об учетных записях как SQL Server 2000, так и Windows NT хранится в таблице sysxlogins системной базы данных Master. Каждая строка этой таблицы соответствует одной учетной записи. Таблица sysxlogins предназначена для хранения информации не только об учетных записях, имеющих доступ к локальному серверу, но также и об учетных записях, используемых для подключения к связанным и удаленным серверам.
(
Замечание
"""}
Более подробно о связанных и учетных серверах, а также о специфике работы их системы безопасности будет рассказано в главе 10.
Таким образом, в таблице sysxlogins может содержаться довольно много строк с информацией об учетных записях. Для более удобной работы с локальными учетными записями можно использовать представление sysiogins, включающее только те строки таблицы sysxlogins, которые имеют в столбце srvid (идентификационный номер сервера) значение NULL. ДЛЯ подтверждения этого можно просмотреть код Transact-SQL, на основе которого было создано представление sysiogins. Для этого можно использовать хранимую процедуру sp_helptext: USE master EXEC sp_helptext 'sysiogins'
Замечание
/
J
Хранимая процедура s p _ h e l p t e x t позволяет получить код команды, с помощью которой создан тот или иной объект базы данных, в т. ч. и представление.
Глава 9. Система безопасности SQL Server 2000
207
Будет получен следующий результат: Text CREATE VIEW syslogins AS SELECT sid = convert(varbinary(85), sid), status = convert(smallint, 8+CASE WHEN (xstatus & 2)=0 THEN 1 ELSE 2 END), createdate = convert(datetime, xdatel), updatedate = convert(datetime, xdate2), accdate = convert(datetime, xdatel), totcpu = convert(int, 0 ) , totio = convert(int, 0 ) , spacelimit = convert(int, 0 ) , timelimit = convert(int, 0) , resultlimit = convert(int, 0 ) , name = convert(sysname, name), dbname = convert(sysname, db_name(dbid)), password = convert(sysname, password), language = convert(sysname, language), denylogin = convert(int, CASE WHEN (xstatus&l)=1 THEN 1 ELSE 0 END), hasaccess = convert(int, CASE WHEN (xstatus&2)=2 THEN 1 ELSE 0 END), isntname = convert(int, CASE WHEN (xstatus&4)=4 THEN 1 ELSE 0 END), isntgroup = convert(int, CASE WHEN (xstatus&12)=4 THEN 1 ELSE 0 END), isntuser ~ convert(int, CASE WHEN (xstatus&12)=12 THEN 1 ELSE 0 END), sysadmin - convert(int, CASE WHEN (xstatus&16)=16 THEN 1 ELSE 0 END), securityadmin=convert(int, CASE WHEN (xstatus&32)=32 THEN 1 ELSE 0 END), serveradmin=convert(int, CASE WHEN(xstatus&64)=64 THEN 1 ELSE 0 END), setupadmin=convert(int, CASE WHEN(xstatus&128)=128 THEN 1 ELSE 0 END), processadmin=convert(int, CASE WHEN(xstatus&256)=256 THEN 1 ELSE 0 END), diskadmin=convert(int, CASE WHEN(xstatus&512)=512 THEN 1 ELSE 0 END), dbcreator=convert(int, CASE WHEN(xstatus&1024)=1024 THEN 1 ELSE 0 END), bulkadmin=convert(int, CASE WHEN(xstatus&4096)=4096 THEN 1 ELSE 0 END), loginname = convert(sysname, name) FROM sysxlogins WHERE srvid IS NULL
Замечание Как видно из синтаксиса кода, с помощью которого было создано представление s y s l o g i n s , пользователи могут только просматривать это представление ( S E L E C T ) , но не могут вносить в него изменения ( U P D A T E , D E L E T E И I N S E R T ) . Д Л Я
управления учетными записями путем непосредственного доступа необходимо обращаться к таблице s y s x l o g i n s .
Изменения в таблицу sysxlogins можно вносить как непосредственно с помощью команд INSERT, UPDATE и DELETE, так и с помощью специальных системных
хранимых процедур. В первом случае администратор должен знать структуру и назначение всех столбцов указанной таблицы. Внесение ошибочных данных может привести к серьезным неприятностям. Гораздо более удобным является использование хранимых процедур. 8 Зак. 83
208
Часть III. Администрирование
Так как различия между аутентификацией SQL Server и Windows NT весьма значительны, то для создания учетных записей SQL Server и Windows NT предназначены разные хранимые процедуры. В двух следующих разделах будет отдельно рассмотрено создание учетных записей SQL Server и Windows NT.
Создание учетных записей SQL Server Для создания новой учетной записи SQL Server служит хранимая процедура sp_addiogin, имеющая следующий синтаксис: sp_addlogin [@loginame =] 'login' [, [@passwd =] 'password'] [, [@defdb =] 'database'] [, [@deflanguage =] 'language'] [, [@sid =] sid] [, [Qencryptopt =] 'encryption_option']
Замечание Правом выполнения указанной хранимой процедуры обладают члены фиксированных ролей сервера sysadmin и securityadmin. Рассмотрим назначение и использование параметров хранимой процедуры. О
[Sloginame =]
'login'
С помощью этого параметра указывается имя, которое будет присвоено создаваемой учетной записи SQL Server. Параметр имеет тип данных sysname, что ограничивает длину имени 128 символами. На текущем сервере к моменту регистрации не должно существовать учетной записи с аналогичным именем. То есть в столбце name представления sysiogins не должно быть имени, указываемого с помощью рассматриваемого параметра. В противном случае будет выдано следующее сообщение об ошибке: Server: Msg 15025, Level 16, State 1, Procedure sp_addlogin, Line 56 The login 'ИмяУчетнойЗаписи' already exists. О
[@passwd =] 'password'
Этот параметр определяет пароль, который должен будет вводить пользователь при регистрации под создаваемой учетной записью. Параметр имес i тип данных sysname, что ограничивает длину пароля 128 символами стандарта Unicode, по умолчанию определено значение NULL. Указание пароля необязательно. В этом случае пользователь при прохождении аутентификации должен будет оставлять пустым поле для ввода пароля. Аналогичного результата можно добиться при указании пустого пароля или значения NULL. ВО время выполнения хранимой процедуры s p a d d i o g i n пароль может шифроваться. Для кодирования используется недокументированная функция pwdencrypt (). Пароль хранится в столбце password системной таблицы sysxiogins, который имеет тип данных varbinary (256), т. е. хранит двоичные значения.
Глава 9. Система безопасности SQL Server 2000
209
Замечание Для получения более подробной информации о ходе процесса создания новой учетной записи, в том числе и о шифровании пароля, можно получить, просмотрев код системной хранимой процедуры s p _ a d d l o g i n . С этой целью можно использовать другую системную хранимую процедуру s p _ h e l p t e x t . Для вывода кода достаточно выполнить команду EXEC s p _ h e l p t e x t ' s p _ a d d l o g i n '.
[@defdb =] 'database' С помощью этого параметра указывается база данных по умолчанию, которая будет автоматически назначаться в качестве текущей при установлении соединения. Параметр имеет тип данных sysname и значение по умолчанию Master. Указываемое значение должно соответствовать имени существующей базы данных. То есть в столбце name системной таблицы sysdatabases базы данных Master должно иметься значение, указанное для параметра @defdb. Список имеющихся на сервере баз данных может быть просмотрен с помощью системной хранимой процедуры s p h e i p d b . Если указанная база данных не существует, при попытке создания учетной записи будет выдано следующее сообщение об ошибке: Server: Msg 15010, Level 16, State 1, Procedure sp_addlogin, Line 63 The database 'ИмяБазьДанных' does not e x i s t . Use sp_helpdb to show available databases.
Замечание После установления соединения пользователь сможет указать в качестве текущей любую из баз данных, имеющихся на сервере, с помощью команды U S E имявд. О
[ @deflanguage
=]
'language'
Этот параметр определяет язык, который будет использоваться по умолчанию для создаваемой учетной записи. Текущий выбранный язык определяет, на каком языке будут выводиться сообщения сервера. Параметр имеет тип данных sysname и значение по умолчанию NULL. Однако, если параметр опущен или явно указано значение NULL, TO ДЛЯ учетной записи будет установлен язык, сконфигурированный в качестве языка по умолчанию на уровне сервера с помощью параметра ' d e f a u l t language' системной хранимой процедуры sp_configure или с помощью раскрывающегося списка Default language for user вкладки Server Settings окна свойств сервера SQL Server Properties. Подробно конфигурирование языка по умолчанию на уровне сервера было рассмотрено в разд. "Вкладка Server Settings" главы 8. Значение, задаваемое с помощью параметра @defianguage, должно соответствовать имени языка, зарегистрированного на сервере. То есть указываемое значение должно существовать в столбце a l i a s системной таблицы sysianguages базы данных Master. Эта таблица содержит информацию о всех языках, которые поддерживает текущий SQL Server 2000. Список установленных
210
Часть III. Администрирование
языков можно просмотреть также с помощью системной хранимой процедуры sp_helplanguage. Если значение параметра @defianguage не соответствует имени зарегистрированного языка, то будет выдано следующее сообщение об ошибке: Server: Msg 15033, Level 16, State 1, Procedure sp_validlang, Line 10 'ИмяЯзыка' is not a valid official language name.
Замечание После установления соединения пользователь может изменить текущий язык на любой другой зарегистрированный язык с помощью команды S E T LANGUAGE ' И М Я я з ы к а ' . Например, для установки русского языка необходимо будет выполнить ко1 манду S E T LANGUAGE ' r u s s i a n . [@sid =]
sid
С помощью этого параметра можно явно указать, какой идентификатор безопасности (SID, Security Identification number) будет присвоен создаваемой учетной записи. Параметр имеет тип данных varbinary (16). Идентификационный номер учетной записи можно получить с помощью функции S U S E R S I D O . Явное указание идентификационного номера учетной записи часто используется при переносе списка учетных записей между различными серверами. Без этого нельзя обойтись, если используются дополнительные средства обеспечения безопасности, основывающиеся на идентификаторе безопасности пользователей. Замечание Пользователю sa в процессе установки всегда присваивается идентификатор безопасности 0x01.
Идентификатор безопасности хранится в столбце s i d таблицы sysxiogins. Для учетных записей SQL Server его максимальный размер составляет 16 байт, а для учетных записей Windows NT — 28 байт. В принципе, после создания учетной записи можно изменить идентификатор безопасности с помощью команды UPDATE, напрямую обратившись к системной таблице. При выборе значения для параметра @sid следует соблюдать требование уникальности идентификаторов безопасности. То есть на текущем сервере к моменту регистрации не должно быть учетных записей с идентификатором безопасности, равным выбранному значению. Список используемых идентификаторов безопасности локального сервера можно просмотреть с помощью следующего запроса: SELECT sid FROM syslogins
Если параметр @sid опущен или для него указано значение NULL (также являющееся значением по умолчанию для параметра @sid), то хранимая процедура s p a d d i o g i n самостоятельно сгенерирует идентификатор безопасности.
Глава 9. Система безопасности SQL Server 2000 •
[@encryptopt
211
=] 'encryption_option'
Этот параметр используется для управления шифрованием пароля учетной Записи, КОГДа ОН Сохраняется В СТОЛбце password Таблицы sysxlogins. ДЛЯ параметра допустимы следующие значения: •
• •
NULL — пароль будет шифроваться. Аналогичного результата можно добиться, опуская параметр @encryptopt при вызове процедуры sp_addiogin. Для шифрования используется недокументированная функция pwdencrypt() ; 'skip_encryption' — шифрование не будет применено; 'skip_encryption_old' — в этом случае не используется шифрование SQL Server 2000 (с помощью функции pwdencrypt ()). Тем не менее, пароль не будет храниться в открытом виде. Он пройдет тройное преобразование типа С ПОМОЩЬЮ к о м а н д ы @ p a s s w d = c o n v e r t ( s y s n a m e ,
convert
( v a r b i n a r y (30) ,
convert (varchar (30), @passwd))). Подобное кодирование пароля существовало до SQL Server 7.0. Это значение в основном предназначено при выполнении обновления предыдущих версий SQL Server. Приведем несколько примеров для иллюстрации создания учетных записей SQL Server с использованием хранимой процедуры s p s d d i o g i n . В представленном ниже примере дан простейший вариант создания учетной записи: USE pubs EXEC sp_addlogin 'Diesel'
Созданная учетная запись будет иметь пустой пароль, базу данных по умолчанию Master и язык, установленный в качестве языка по умолчанию на уровне сервера. Идентификатор безопасности будет сгенерирован случайным образом. Теперь же создадим учетную запись с конкретным идентификатором безопасности и паролем: USE pubs EXEC sp_addlogin 'Andrey' , 'analitik', @sid = OXO00000000OO0O0000OO00OO00O0O0OFF
Ну и, наконец, приведем пример использования хранимой процедуры sp_addlogin с указанием значений для всех параметров. В следующем примере будет создана учетная запись с именем wizards, пароль которой не будет зашифрован. В качестве базы данных по умолчанию назначим базу данных pubs. При установлении соединения автоматически будет устанавливаться русский язык. USE pubs EXEC sp_addlogin 'Wizards' , 'gfhfgcb[j kj ubz', 1 pubs', 'russian', OX010000000000000000000000000000FF, 'skip encryption'
Часть III. Администрирование
272
Замечание На первый взгляд кажется весьма сложным запомнить указанный пароль — ' g f h f g c b [ j k j u b z ' . Однако это всего-навсего слово п а р а п с и х о л о г и я , набранное на английской раскладке клавиатуры. Подобный подход затрудняет запоминание пароля, если вы случайно ввели его в поле для имени, а не в поле для пароля учетной записи. Кроме того, это усложняет взлом паролей с использованием специальных программ. Дело в том, что определенные русские буквы соответствуют специальным символам, которые обычно не перебираются. Более того, подобная абракадабра делает невозможным взлом пароля с использованием так называемой словарной атаки (dictionary attack), когда для взлома паролей используются специальные словари, содержащие наиболее часто используемые пароли. Это связано с тем, что основная часть таких словарей, как и программ взлома паролей, создавались на английском языке.
С помощью приведенного ниже запроса можно просмотреть, каким образом параметры хранимой процедуры отображаются на таблице sysxiogins, и как следствие, на представлении sysiogins: USE master SELECT name, SID, dbname, password, language FROM sysiogins WHERE createdate BETWEEN '23 aug 2001' AND '24 aug 2001'
Будет получен следующий результат: name
SID
Andrey 0X000000000000000000000000000000FF Diesel 0x20D455C65B42D14A8C93CC7F61FAFBB9 Wizards OX010000000000000000000000000000FF (3 row(s) affected)
dbname
password
language
master master pubs
???????? NULL gfhfgcb[jkjubz
us_english us_english russian
Создание учетных записей Windows NT В предыдущем разделе было подробно рассмотрено создание учетных записей SQL Server. В этом же разделе мы обсудим создание учетных записей Windows NT с использованием системной хранимой процедуры s p g r a n t l o g i n , имеющей следующий синтаксис: sp_grantlogin
[Qloginame =] 'login'
Замечание Корректнее говорить не о создании учетной записи Windows NT, а о предоставлении доступа к SQL Server 2000 учетной записи Windows NT. Необходимо ясно понимать разницу между учетными записями SQL Server и Windows NT. Первые организуются на уровне SQL Server 2000, и сам факт создания учетной записи дает возможность установления соединения с сервером. Учетные записи Windows NT образуются на уровне локального компьютера или домена. Однако, чтобы соответствующий пользователь имел возможность работать с SQL Server 2000, необходимо разрешить его учетной записи доступ к серверу.
Глава 9. Система безопасности SQL Server 2000
213
Замечание Правом выполнения хранимой процедуры s p _ g r a n t l o g i n обладают члены фиксированных ролей сервера s y s a d m i n и s e c u r i t y a d m i n .
Хранимая процедура s p g r a n t login имеет всего один параметр, определяющий имя учетной записи Windows NT, которой необходимо предоставить доступ к SQL Server 2000. Помимо предоставления доступа конкретным учетным записям, можно предоставить доступ группе Windows NT. Для этого достаточно указать с помощью параметра @ioginame имя интересующей группы Windows NT. При вводе имени учетной записи или группы Windows NT необходимо указывать и имя системы, к которой они принадлежат. Если предполагается предоставить доступ учетной записи или группе отдельного компьютера, то именем системы будет сетевое имя соответствующего компьютера. Если же учетная запись или группа принадлежат домену, то в качестве имени системы необходимо указать имя этого домена. Имя системы и учетной записи (группы) разделяются символом обратный слэш (\). Например, для предоставления доступа к SQL Server 2000 группе SQL_Users домена matrix необходимо будет выполнить команду: EXEC sp_grantlogin 'matrix\SQL_Users'
Также допускается использовать следующий синтаксис: EXEC sp_grantlogin [matrix\SQL_Users]
Как видно, синтаксис хранимой процедуры s p g r a n t login не позволяет управлять языком и базой данных, которые будут участвовать в автоматическом установлении соединения. При разрешении доступа учетной записи Windows NT окажутся установленными значения по умолчанию. То есть в качестве базы данных по умолчанию будет назначена база данных Master, и выбран язык, указанный в качестве языка по умолчанию на уровне сервера. Для изменения свойств учетной записи после разрешения ей доступа можно воспользоваться Enterprise Manager или напрямую обратиться к системной таблице sysxlogins.
Использование Enterprise Manager Для управления учетными записями рекомендуется применять специальный интерфейс Enterprise Manager или системные хранимые процедуры. В Enterprise Manager список учетных записей, сконфигурированных на сервере, содержится в папке \Security\Logins. Если выбрать эту папку в левой панели Enterprise Manager, то в правой части окна будет выведен список всех пользовательских учетных записей, которые содержатся в представлении syslogins (рис.
9.2).
Информация об учетных записях представлена в следующих столбцах: • Name. Имя учетной записи. Максимальная длина 128 символов.
Часть III. Администрирование
214
_jDjx[
7й SQL Server Enterprise Manager - [Console Roat\MJtrosaft sq i "Ш Console j fiction View
Window Tools
Help M <*=• ~^
Lt] I S
Tree]
Logins
Г'1 Console Root * -; *3J Microsoft SQL Servers В 4Щ SQL Server Group + *$ CIT (Windows NT/2000) V if\ MILLENNIUM (Windows NT/2000 - Щ STORAGE (Windows NT/2000) \ El-Qi Databases ; Ш CZ3 Data Transformation Service ! ш Q Management • Ei GU Replication , В C_j Security
I S 66 Items
I
)
-'-
Name t C _tmp_conf _user §£| Admin tJjConfUSER fj^diman _£J dstributor_adm1n ECDocExch tfiGray
Ш guest •fjInetChair E^ivanch
Щ Master С MATRIX\Adin С MATRIX\Administrator С MATRIX\Atex С MATRIX\andrw С MATRIX\Anton С MATRIX\AntonI Б MATRIX^AxI 0 MATRIX\Blaze С MATRIX\Cadet С MATRIX\Chik С MATRIX\Conferenc_USER С MATRIX\Diesel '^MATRIX\Domain Guests щ |^MATRIX\Domain Users 4 11
^ Server Roles * J J Linked Servers ' •• g9 Remote Servers | ft! CJ Support Services • ?ffl L_l Meta Data Services - _Vi STORAGE\5QL_SERVER_2000 (\ Ш G3 Databases It!-Qj Data Transformation Service 1 Management ! Ш Щ SQL Server Agent ! : [ф Backup i IS tul Current Activity _ . {<$ Database Maintenance f 5 L i ffl Ш Q Server Logs •
ffi (_J Replication l i _
_ J
>
0,;> 0
hype Standard Standard Standard Standard Standard Standard Standard Standard Standard Standard Standard NT User NT User NT User NT User NT User NT User NT User NT User NT User NT User NT User NT User NT Group NT Group
J 5erver Access
Default Database •*• Conferenc UNO Conferenc study master DocExch Millennium matrix Chair study Decanat Conferenc master matrix master matrix Architecture matrix Decanat Library matrix Conferenc DocExch DocExch DocExch
Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit Permit 1
•] ± r
Рис. 9.2. Папка Logins
L~J Type. Тип учетной записи: •
NT User (пользователь Windows NT);
•
NT Group (группа Windows NT);
•
Standard (пользователь SQL Server).
• Server Access. Тип доступа к SQL Server 2000: •
Permit (разрешен);
•
Deny (запрещен).
• Default Database. База данных по умолчанию. • User. Имя пользователя базы данных, в которого отображается данная учетная запись. • Default Language. Язык по умолчанию, установленный для учетной записи. Для просмотра свойств учетной записи достаточно дважды щелкнуть левой кнопкой мыши на значке нужного пользователя. В ответ откроется диалоговое окно, содержащее информацию об учетной записи. Для удаления учетной запи-
Глава 9. Система безопасности SQL Server 2000
215
си необходимо выбрать ее и на панели инструментов Enterprise Manager нажать кнопку Delete. Можно также, вызвав контекстное меню учетной записи, выбрать команду Delete. Для создания новой учетной записи на панели инструментов имеется кнопка New Login. После нажатия этой кнопки откроется диалоговое окно SQL Server Login Properties - New Login, в котором необходимо указать информацию об учетной записи. В окне находятся три вкладки. Первая из них, General (рис. 9.3), содержит основные сведения об учетной записи. SQL Server Login Properties New Logi» General j Server Roles | Database Access I ' fi% j ..;.... ШЬ
Name:
2iJ
iMATRIXSBIaze
Authentication (* Windows NT Authentication Domain:
[MATRIX
Security access: (* Grant access f* Denn access Г SQL Server Authentication Defaults
Specify the default language and database for this login.
database: Language:
matrix
OK
Cancel
Help
Рис. 9.З. Вкладка General окна создания нового пользователя
В группе Authentication можно выбрать, какой тип аутентификации будет использоваться для учетной записи. Если установлен переключатель Windows NT Authentication, то в раскрывающемся списке Domain необходимо указать имя домена, к которому принадлежит учетная запись. (Данный список содержит имена доменов, с которыми установлены доверительные отношения.) Имя домена будет автоматически добавлено в поле Name. Кроме того, для аутентификации Windows NT необходимо определить, будет ли пользователю предоставляться доступ к SQL Server 2000 или наоборот, доступ ему будет запрещен. Для этого следует установить один из двух переключателей группы Security access: О Grant access. Доступ разрешен. Устанавливается по умолчанию. П Deny access. Доступ запрещен.
216
Часть III. Администрирование
Замечание На первый взгляд непонятно, зачем нужно запрещать доступ к серверу, ведь достаточно просто не предоставить пользователю доступ к SQL Server 2000. Явное запрещение применяется в тех случаях, когда необходимо гарантировать, что пользователь не будет иметь доступа к серверу никаким образом. Если даже учетной записи явно не предоставлен доступ, она может получить его через членство в одной из групп Windows NT, которой доступ разрешен. Чтобы не тратить время на просмотр, в каких группах числится учетная запись, и удалять ее из них, можно просто запретить доступ. Позже можно будет в свойствах учетной записи установить переключатель в положение Grant access и разрешить ей доступ. Кроме того, если группа Windows NT, через членство в которой пользователь получает доступ к SQL Server 2000, выполняет еще и некоторые другие функции в сети (помимо предоставления доступа к SQL Server 2000), то исключение учетной записи из группы вообще нежелательно.
Если для учетной записи выбрана аутентификация SQL Server (установлен переключатель SQL Server Authentication), в поле Password необходимо указать пароль, который будет вводить пользователь при каждом подключении к SQL Server 2000. Теперь вернемся к полю Name. В нем указывается имя учетной записи. При выборе аутентификации Windows NT здесь необходимо указать имя учетной записи Windows NT, для которой предоставляется доступ к SQL Server 2000. Предварительно эта учетная запись должна быть создана. В поле Name автоматически добавляется имя домена Windows NT, выбранное в раскрывающемся списке Domain. Имя учетной записи может быть указано либо вручную, либо выбрано с помощью специального окна выбора пользователя (рис. 9.4), открыть которое можно с помощью кнопки :... |. SQL Server Login Properties - New Login List Names From: ^MATRIX" Names: J£ amznata (Nataiya Arnzarakova) f^ andrey (Andrey Fedin) J§ AndrW (Andrey Lebedik) |Q; Andyk (Andrey Zaichenko) f£ Anton (Anton В ardin) f | Antonl (Anton Shevtsov) M.I.!3ze.!y|ad Karpyukj
i d
Add Name: JMATRIX\Blaze OK
Cancel
Рис. 9.4. Окно выбора пользователя
Глава 9. Система безопасности SQL Server 2000
217
Если же задана аутентификация SQL Server, то в поле Name указывается имя учетной записи SQL Server 2000. Это имя может быть произвольным. Единственным условием является отсутствие уже созданной учетной записи SQL Server с аналогичным именем. Таким образом, имя учетной записи является уникальным в пределах сервера. На этом конфигурирование основных параметров учетной записи заканчивается. Можно нажать кнопку ОК, и в таблице sysxiogins будет создана соответствующая запись. Но для более удобной работы необходимо сконфигурировать еще несколько параметров учетной записи. В разделе Defaults определяются некоторые настройки, устанавливаемые для учетной записи по умолчанию. В раскрывающемся списке Database необходимо выбрать одну из баз данных, созданных на локальном сервере. Если при подключении к SQL Server 2000 пользователь явно не указывает, с какой базой данных он хочет работать, то сервер подключит его к базе данных, выбранной в списке Database. В качестве базы данных по умолчанию автоматически предлагается база данных Master. В раскрывающемся списке Language можно выбрать любой из поддерживаемых языков, устанавливаемый для пользователя по умолчанию, в том числе и русский (Russian), определив тем самым, на каком языке будут появляться системные сообщения и сообщения об ошибках. На этом работа с вкладкой General завершается. 5QL Server Login Properties General Server Roles Database Access Server Roles .Server roies are used to grant server-wide security privileges to a login. Server Role System Administrators Security Administrators Server Administrators Setup Administrators Process Administrators Disk Administrators Ж Database Creates D escription Can create and alter databases.
Properties
Cancel
Help
Рис. 9.5. Вкладка Server Roles окна создания нового пользователя
Часть III. Администрирование
218
На вкладке Server Roles (рис. 9.5) можно включить создаваемую учетную запись в ту или иную встроенную роль сервера (fixed server role). Подробно описание ролей и методы их использования будут рассмотрены далее в этой главе. В списке Server Roles содержится перечень всех встроенных ролей сервера, доступных в SQL Server 2000. Для того чтобы включить учетную запись в конкретную роль, достаточно установить флажок слева от имени роли. В поле Description содержится краткое описание роли. Для получения дополнительной информации о роли сервера можно нажать кнопку Properties. В открывшемся диалоговом окне Server Role Properties - sysadmin имеются две вкладки. На первой из них, называющейся General (рис. 9.6), приводится список всех учетных записей, которые включены в выбранную роль сервера. Для добавления новой учетной записи следует нажать кнопку Add. Для удаления учетной записи из роли достаточно выбрать ее в списке и нажать кнопку Remove. Server Role Properties - eysadmin General j Permissions j Щщ§
Ыэте:
System Administrators
Specify which logins are members of this security role:
disA trib dm itrator M Tutor RIXWa im inisn sa
Add..
Bemove
OK
Cancel
Help
Рис. 9.6. Вкладка General окна Server Role Properties - sysadmin
На вкладке Permissions (рис. 9.7) приводится подробный список прав доступа, присвоенных выбранной роли сервера, а также список служебных команд, которые могут выполнять члены выбранной роли. На этом работа с вкладкой Server Roles окна создания нового пользователя заканчивается. Рассмотрим работу с последней вкладкой (Database Access) окна создания нового пользователя. Эта вкладка (рис. 9.8) разделена на две части. В верхней части приводится список всех баз данных, созданных на локальном SQL Server 2000. Если установить флажок в столбце Permit, то создаваемой учетной записи будет разрешен доступ к соответствующей базе данных. Имя базы данных указывается в столбце Database. Отображение учетных записей в пользователей базы данных рассмотрено далее в этой главе. Сейчас же скажем, что, пре-
Глава 9. Система безопасности SQL Server 2000
219
доставляя учетной записи доступ к базе данных, необходимо указать имя пользователя, в которого будет отображаться учетная запись. Имя этого пользователя указывается в столбце User. Если в столбце Permit для базы данных установлен флажок, то нужно обязательно определить имя пользователя базы данных. По умолчанию это имя устанавливается идентичным имени учетной записи. В принципе, для каждой базы данных можно выбрать произвольное имя пользователя базы данных. Server Role Properties - sysadmin General Permissions This server role can execute the following commands: Ad dd xteen dbeedr .procedures.. A d.em m to dbaeator Add member to diskadmin Add member to processadmin Add member to securityadmin Add member to serveradmin Add member to setupadmin Add member to sysadmn i Add/drop to/lrorn db_accessadmin Add/drop to/from db_backupoperator Add^drop to/from db_datareader Add/drop to/from db_datawriter Add/drop to/from db_ddladmin Add/drop to/from db_denydatareader Add/dtop to/from db_denydatawriter LJ r i r l / r l r r i r t ^Orгfл^т^ H n
niAiri^r
OK
Cancel
zl
Hep l
Рис. 9.7. Вкладка Permissions окна Server Role Properties - sysadmin
В нижней части окна отображается список ролей базы данных. Он будет пустым, если учетной записи не предоставлен доступ к базе данных, выбранной в верхней части окна. Используя список ролей базы данных, отображаемый в нижней части окна, можно включить пользователя в ту или иную роль.
Замечание Обратите внимание, что в роль базы данных включается не учетная запись, а пользователь базы данных, в которого отображается учетная запись. Для включения пользователя в ту или иную роль базы данных достаточно установить флажок слева от имени нужной роли. Нажав кнопку Properties, можно открыть окно свойств роли Database Role Properties (рис. 9.9), в котором приводится список всех пользователей, уже включенных в выбранную роль базы данных. В данном окне также можно добавить новых или удалить уже включенных в роль пользователей. Кроме того, в окне имеется кнопка Permissions, нажав которую, можно открыть окно управления правами доступа роли к объектам базы данных.
220
Часть III. Администрирование
SQL Server Login Properties
.
General] Server Roles Database Access J :
•~ ^i
Specify which databases can be.accessed by this login. P
e
C
r
m
I
i
t
S
!
D
a
a
B
t
a
a
b
a
s
e
i
U
s
e
3
r
i
G Ш asd LJ ID rnaster jj] matrix Blaze D | matrix_RBT L I B matrix_new
•
J zl
database roles for 'matrix': Permit in Database Role 0 !0: public • Q db_owner 0 f | db_accessadmin I db.secutityadmin U f^ db ddladmin
H J
zl Properties
OK
Help
Cancel
Рис. 9.8. Вкладка Database Access окна создания нового пользователя
Database Role Properties - db General Name: db owner SQL Server supports two types of database roles: standard roles, which contain members, and application roles, which require a password. Database role type: (f Sranc User ; Anton ( Chik
d
Add.
DK
Cance
Help
Рис. 9.9. Окно Database Role Properties для роли db owner
Глава 9. Система безопасности SQL Server 2000
221
Специальные учетные записи Мы закончили рассмотрение процесса создания учетной записи для предоставления или отклонения доступа к SQL Server 2000. Обратим внимание, что в процессе инсталляции SQL Server 2000 мастер установки создает две специальные учетные записи: •
sa (system administrator). Эта учетная запись оставлена для сохранения обратной совместимости с предыдущими версиями SQL Server. Ранее учетная запись была обязательной, имела абсолютные права по управлению сервером и не могла быть удалена. В SQL Server 2000 можно более гибко управлять правами учетных записей, используя роли сервера. В принципе, учетная запись sa может быть удалена. Программа установки включает ее в роль сервера sysadmin, предоставляя ей тем самым абсолютные права управления SQL Server 2000, и устанавливает для нее пустой пароль. Поэтому первое, что необходимо сделать по завершении инсталляции — это сменить пароль sa. Для повышения безопасности системы следует ограничить использование учетной записи sa, оставив ее на крайний случай. Для управления сервером лучше создать новые учетные записи и предоставить им ограниченный набор прав.
П BUILTIN\Administrators. С помощью данной учетной записи члены группы Windows NT Administrators домена, в котором установлен локальный SQL Server 2000, получают права доступа к серверу. Учетная запись BUILTIN\Administrators по умолчанию включена в фиксированную роль сервера, т. е. администраторы сети по умолчанию имеют права на управление сервером. Если обязанности администратора сети и администратора SQL Server 2000 выполняет один и тот же человек, то ничего страшного в этом нет. В противном случае лучше исключить учетную запись BUILTIN\ Administrators из роли sysadmin.
Роли сервера В SQL Server 7.0 был добавлен новый механизм — роли (roles), которые пришли на смену группам SQL Server 6.x. В SQL Server 2000 доступны как роли, так и группы. Роли — это не просто средство объединения учетных записей в группы с целью упрощения администрирования. Включив учетную запись в ту или иную роль сервера, можно предоставить ей определенный набор прав по администрированию сервера. Никаким другим способом выдать права на выполнение этих операций невозможно. В SQL Server 2000 имеются две группы ролей: П роли сервера (server role); П роли базы данных (database role).
С~
Замечание^
^
В этом разделе будут рассмотрены только роли сервера. Роли базы данных будут обсуждаться далее в этой главе.
Часть III. Администрирование
222
Набор ролей сервера строго ограничен. Никто, включая администратора сервера, не может создать новую или удалить существующую роль сервера. Поэтому они называются фиксированными ролями (fixed server roles). В табл. 9.1 приведен список фиксированных ролей сервера с кратким описанием каждой из них. Таблица 9.1. Фиксированные роли сервера Встроенная роль сервера
Описание
sysadmin (System Administrators)
Члены этой роли имеют абсолютные права в SQL Server 2000. Никто не имеет больших прав доступа, чем члены данной роли
setupadmin (Setup Administrators)
Этой роли предоставлены права управления связанными серверами, конфигурирования хранимых процедур, запускаемых автоматически при старте SQL Server 2000, а также право добавлять учетные записи в роль s e t u p a d m i n
serveradmin (Server Administrators)
Обычно в эту роль включаются пользователи, которые должны выполнять администрирование сервера. Имеют право на останов сервера (SHUTDOWN), изменять параметры работы служб ( s p c o n f i g u r e ) , применять изменения (RECONFIGURE),
управлять
полнотекстовым
поиском
(sp_fulltext_service)
securityadmin (Security Administrators)
Члены данной роли имеют возможность создавать новые учетные записи, которым они могут предоставлять права на создание баз данных и ее объектов, а также управлять связанными серверами, включать учетные записи в роль s e c u r i t y a d m i n и читать журнал ошибок SQL Server
processadmin (Process Administrators)
Могут управлять процессами, которые реализует SQL Server 2000, т. е. выполнять команду K I L L . Также имеют право включать учетные записи в роль p r o c e s s a d m i n
diskadmin (Disk Administrators)
Данная роль в основном используется для обеспечения совместимости с SQL Server до версии 7.0. В этих версиях базы данных располагались на устройствах (device). Члены роли d i s k a d m i n имеют права управления устройствами, которые, однако, в SQL Server 2000 не используются, а вызовы устаревших процедур транслируются в вызовы современных процедур
dbcreator (Database Creators)
Члены этой роли могут создавать новые базы данных, удалять и переименовывать имеющиеся, восстанавливать резервные копии базы данных и журнала транзакций
bulkadmin (Bulk Insert administrators)
Эта роль не существовала в SQL Server 7.0. Члены роли b u l k a d m i n могут вставлять данными с помощью средств массивной закачки, не имея непосредственного доступа к таблицам
В SQL Server 6.x управление сервером было возможно только с правами администратора. Отсутствовала возможность, например, предоставить пользователю только права на создание баз данных и ее объектов. Можно было предоставить
Глава 9. Система безопасности SQL Server 2000
223
пользователю либо полный доступ по управлению сервером, либо не предоставлять его вовсе. В SQL Server 2000 администратор может более гибко контролировать сервер. Права управления сервером можно распределить между разными пользователями, выполняющими функции операторов. Каждый такой пользователь способен иметь возможность выполнять только определенный круг задач. Достаточно включить учетную запись в ту или иную фиксированную роль сервера. Для добавления учетной записи пользователя в ту или иную фиксированную роль сервера можно воспользоваться вкладкой Server Roles окна создания нового пользователя (см. рис. 9.5) или хранимой процедурой spaddsrvroiemember, имеющей следующий синтаксис: sp addsrvrolemember
[Sloginame =] ' l o g i n '
, [@rolename =] ' r o l e '
Замечание Члены роли s y s a d m i n могут добавлять учетные записи в любую фиксированную роль сервера. Кроме того, учетная запись может быть добавлена в фиксированную роль сервера любым пользователем, являющимся членом этой роли.
Параметр @ioginame определяет имя учетной записи, которую предполагается добавить в одну из фиксированных ролей сервера. Имя роли, в которую необходимо добавить учетную запись, указывается с помощью параметра Oroiename. Как видно из синтаксиса, для работы процедуры требуется указание обоих параметров. В качестве примера рассмотрим добавление учетной записи Windows NT с именем Admin компьютера STORAGE в фиксированную роль сервера sysadmin: EXEC sp_addsrvrolemember 'STORAGE\Admin',
'sysadmin'
Замечание Хотя в общем случае требуется, чтобы на сервере существовала учетная запись, которую предполагается включить в одну из фиксированных ролей, для учетных записей Windows NT существует исключение. Дело в том, что пользователь Windows NT может получить доступ к SQL Server 2000 как член группы Windows NT, которой предоставлен доступ к серверу. Такие учетные записи данной ОС можно включать в роли сервера без предварительного предоставления доступа непосредственно учетной записи.
Для получения информации о том, какая учетная запись в какую фиксированную роль сервера включена, используется следующая системная хранимая процедура: sp_helpsrvrolemember [[Ssrvrolename =] 'role']
Если процедура вызывается без параметров, то выводится полный список учетных записей, включенных в любую из ролей сервера. Когда же необходимо получить список учетных записей, включенных в конкретную роль сервера, требуется указать имя роли с помощью параметра @srvrolename. В приведенном ниже примере выводится информация о членах роли sysadmin: EXEC sp_helpsrvrolemember
'sysadmin'
224
Часть III. Администрирование
Список фиксированных ролей сервера был приведен в табл. 9.1. Его также можно получить с помощью команды: EXEC spjnelpsrvrole
Будет возвращен результат: ServerRole
Description
sysadmin securityadmin serveradmin setupadmin processadmin diskadmin dbcreator bulkadmin (8 row(s) affected)
System Administrators Security Administrators Server Administrators Setup Administrators Process Administrators Disk Administrators Database Creators Bulk Insert administrators
Замечание Список фиксированных ролей сервера хранится в недокументированной системной таблице s p t _ v a l u e s , которая также служит для хранения множества другой системной информации.
Для удаления учетной записи из фиксированной роли сервера предназначена системная хранимая процедура sp_dropsrvroiemember, имеющая синтаксис: sp_dropsrvrolemember
[Sloginame =] 'login' , [@rolename =] 'role'
Назначение параметров этой хранимой процедуры аналогично назначению параметров процедуры sp_addsrvroiemember, рассмотренной ранее в этом разделе.
Система безопасности базы данных В этом разделе будет подробно рассмотрено управление системой безопасности базы данных. В ранее обсуждалось предоставление прав доступа к самому SQL Server 2000. Но этого недостаточно, чтобы работать с информацией в базах данных. Исключением являются пользователи, учетные записи которых включены в фиксированную роль сервера sysadmin. Члены данной роли имеют неограниченные права в пределах сервера, и, как следствие, полный доступ к любой базе данных, имеющейся на сервере.
Пользователи Пользователь базы данных (user) — это административная единица системы безопасности, через которую предоставляется доступ учетной записи к объектам базы данных. Через права, выданные пользователю базы данных, администратор может контролировать действия, которые станет выполнять владелец учетной
Глава 9. Система безопасности SQL Server 2000
225
записи в той или иной базе данных. Отметим, что единственная учетная запись способна отображаться во множество пользователей различных баз данных. Система безопасности SQL Server 2000 построена таким образом, что пользователь должен только однажды идентифицировать себя при подключении к серверу. После этого учетной записи присваивается специальный идентификатор, через который она получает доступ ко всем объектам SQL Server 2000. Как мы уже сказали, доступ к объектам базы данных управляется на основе разрешений, выданных пользователям базы данных. То есть для того, чтобы владелец учетной записи получил доступ к объекту базы данных, необходимо предварительно выполнить связывание учетной записи с конкретным пользователем базы данных.
Создание пользователя Связывание учетной записи с пользователем базы данных можно выполнить несколькими способами. Первый из них мы уже рассмотрели (см. разд. "Использование Enterprise Manager" ранее в этой главе). Это можно сделать из окна свойств учетной записи, перейдя на вкладку Database Access. Второй способ связывания учетной записи с пользователем базы данных также предполагает применение интерфейса Enterprise Manager. Откройте в левой части окна Enterprise Manager базу данных, к которой необходимо предоставить доступ учетной записи, и выберите папку Users. В правой части окна (рис. 9.10) будет выведен список всех пользователей, созданных ранее в базе данных, а информация о них представлена в столбцах: • Name. Имя пользователя базы данных. Максимальная длина — 128 символов. Допускается указание символов национальных алфавитов. • Login Name. Имя учетной записи, которая отображается в соответствующего пользователя базы данных. П Database Access. В этом столбце указано, предоставляется пользователю доступ к базе данных (Permit), или, наоборот, запрещается (Deny). Для создания нового пользователя и связывания его с учетной записью средствами Enterprise Manager необходимо в контекстном меню папки User (или непосредственно в контекстном меню любого пользователя) выбрать команду New Database User. В ответ откроется диалоговое окно Database User Properties - New User (рис. 9.11), в котором можно выполнить все необходимые действия. В раскрывающемся списке Login name необходимо выбрать учетную запись, которой требуется предоставить доступ к базе данных. Список содержит все учетные записи, созданные на сервере, за исключением тех, которым уже предоставлен доступ к текущей базе данных. В поле User name указывается имя пользователя базы данных, под которым будет работать учетная запись. По умолчанию предлагается имя, аналогичное имени учетной записи, но разрешается использование любого имени. Единственным условием является его уникальность в пределах текущей базы данных. Будьте внимательны при выборе имени, т. к. изменить его средствами Enterprise Manager невозможно.
Часть III. Администрирование
226 То SQL Server Enterprise Manager - [Console Root i Л
Console
| Action
Viindow
Vjew
Tools
Це1р I ; Ф 3 «•
HIT EH
Tree I
•.•"•' :•'** Q 1Щ j Users
У Architecture fasd У Aspirant У Chair У Collab У Conferenc I j Decanat У Diplom Й DistEDU У DocExch У InterchangeBTM У Kafedra У KHSU @ Library У Library2 У master У matrix : ztjj Diagrams :--]Э Tables : <9
9 Items Login Name
iCfedin
MATRIX\Alex MATRIX\Anton MATRIX\Axl MATRIX\Chik HATRIX\fedin MATRIX\gray
guest MATRIX\Liss MATRIX\mutant
Permit Permit Permit Permit Permit Permit Permit Permit Permit
fj? R o l e s [_] Rules Г~1 Defaults User Defined Data T Full-Text Catalogs
§
Рис. 9.10. Папка Users
В нижней части окна приведен список ролей базы данных, в которые можно включить создаваемого пользователя. Для этого достаточно установить флажок слева от имени нужной роли. Нажав кнопку Properties, можно открыть диалоговое окно, в котором приведен список пользователей, включенных в ту или иную роль. При необходимости в этом же окне можно добавить новых или исключить имеющихся пользователей из роли базы данных. В окне Database User Properties - New User имеется кнопка Permissions, недоступная во время создания нового пользователя. В дальнейшем, если открыть окно свойств пользователя, с помощью данной кнопки можно вызвать диалоговое окно, в котором возможно управлять разрешениями на доступ пользователя к любым объектам базы данных. На этом процедура создания нового пользователя базы данных заканчивается. Если в дальнейшем понадобится изменить свойства пользователя, то для этого в его контекстном меню можно выбрать команду Properties или просто дважды щелкнуть на его имени левой кнопкой мыши. В ответ откроется диалоговое окно, позволяющее управлять членством пользователя в той или иной роли базы данных. Изменение имени учетной записи, отображаемой в пользователя, или имени самого пользователя не допускается.
Глава 9. Система безопасности SQL Server 2000
227
Database User Properties - New i General
Login name: JJser name:
ConfUSER ConfUSER
Database role membershp i: Permit in Database Role public db_owner db_accessadmin db_securityadmin db_ddladmin db_backupoperator S i db datareadef db_datawriter db_denydatareadet db_denydatawriter SQLusers Pioperties.. OK
Cancel
Help
Рис. 9 . 1 1 . Диалоговое окно Database User Properties New User
Специальные пользователи В любой базе данных автоматически создаются два пользователя: • dbo (database owner). Это специальный пользователь базы данных, являющийся ее владельцем. Владелец базы данных имеет абсолютные права по управлению ею. Пользователя dbo нельзя удалить. По умолчанию в пользователя dbo отображается учетная запись sa, которой тем самым предоставляются максимальные права в базе данных. Кроме того, все члены роли базы данных db_owner также считаются владельцами базы данных. Пользователь dbo включен в роль dbowner и не может быть удален из нее; • guest. Если учетной записи явно не предоставлен доступ к базе данных, то она автоматически отображается сервером в пользователя guest. С помощью этого пользователя можно предоставлять разрешения на доступ к объектам базы данных, необходимые любому пользователю. Разрешив доступ пользователю guest, вы, тем самым, даете аналогичные права доступа всем учетным записям, сконфигурированным на SQL Server 2000. Для повышения безопасности хранящейся информации рекомендуется удалять пользователя guest из базы данных.
Управление пользователями средствами Transact-SQL В предыдущих разделах текущей главы была дана некоторая информация о создании и управлении пользователями базы данных с помощью средств Enterprise Manager. Этой информации вполне достаточно для выполнения административ-
228
Часть III. Администрирование
ных задач. Однако, как и большую часть всех административных задач, управление пользователями можно осуществлять и средствами Transact-SQL. Хотя подобные действия требуют высокой квалификации, они открывают перед администратором широкие возможности по управлению пользователями и устранению некоторых проблем, бороться с которыми средствами Enterprise Manager просто невозможно. Следующие несколько разделов будут посвящены рассмотрению средств Transact-SQL, с помощью которых можно конфигурировать свойства о пользователях, а также рассмотрению принципов хранения информации о них.
Хранение информации о пользователях Информация о пользователях, созданных в базе данных, хранится в системной таблице sysusers, которая содержит множество столбцов, определяющих различные свойства пользователя. В табл. 9.2 приведен список столбцов таблицы sysusers с указанием типа данных и назначения.
Замечание В таблице s y s u s e r s помимо информации о пользователях базы данных также хранятся сведения о фиксированных и пользовательских ролях базы данных и ролях приложения. Более подробно роли базы данных будут рассмотрены далее в этой главе.
Таблица 9.2. Список столбцов таблицы
sysusers
Имя столбца
Тип данных
Краткое описание
uid
smallint
Указывается идентификатор пользователя (роли), уникальный в пределах базы данных. Пользователю dbo при создании БД присваивается идентификатор 1, а пользователю g u e s t — идентификатор 2. Идентификаторы фиксированных ролей начинаются с номера 16 384, а пользовательских — с 16 400
status
smallint
Битовое поле, определяющее статус пользователя (роли). Не документировано. Предназначено для внутреннего применения
sysname
Имя, присвоенное пользователю (роли) при создании. Можно легко изменять имена пользователей, исправляя значение в этом столбце
varbinary(85)
Идентификатор безопасности учетной записи, связанной с рассматриваемым пользователем. Для учетных записей SQL Server идентификатор обязательно должен иметься в столбце s i d системной таблицы s y s l o g i n s системной БД M a s t e r . Для учетных записей Windows NT идентификатор соответствует доменному идентификатору безопасности и не обязательно присутствует в таблице s y s l o g i n s (для пользователей, получающих доступ к серверу через членство в группе Windows NT)
sid
Глава 9. Система безопасности SQL Server 2000
229 Таблица 9.2
(продолжение)
Имя столбца
Тип данных
Краткое описание
roles
varbinary(2048)
Двоичное поле, определяющее членство пользователя в ролях сервера. Если пользователь является членом той или иной роли, то соответствующий бит устанавливается в 1. Таким образом, максимальное количество ролей SQL Server 2000 ограничено количеством 16 384
createdate
datetime
Дата создания пользователя (роли)
updatedate
datetime
Дата последнего изменения свойств пользователя (роли)
altuid
smallint
password
varbinary(256)
gid
smallint
Идентификатор группы, членом которой является пользователь. Если значение в этом столбце равно значению в столбце s i d , то текущая строка описывает пользовательскую роль БД
environ
varchar(255)
В настоящее время данный столбец не используется и содержит значение NULL
Альтернативный идентификатор пользователя. Не документировано. Предназначено для внутреннего использования В этом столбце хранится пароль для ролей приложения. Для пользователей, фиксированных и пользовательских ролей базы данных в этом столбце содержится значение N U L L
hasdbaccess int
Если содержит 1, то пользователь имеет доступ к базе данных
islogin
int
Если содержит 1, то текущая строка соответствует учетной записи (SQL Server, пользователя или группы Windows NT)
isntname
int
Если содержит 1, то пользователь является отображением учетной записи пользователя или группы Windows NT
isntgroup
int
Если содержит 1, то пользователь является отображением учетной записи группы Windows NT
isntuser
int
Если содержит 1, то пользователь является отображением учетной записи пользователя Windows NT
issqluser
int
Если содержит 1, то пользователь является отображением учетной записи пользователя SQL Server
isaliased
int
Если содержит 1, то пользователь является псевдонимом другого пользователя. Актуально для учетных записей SQL Server 6.x
230
Часть III. Администрирование Таблица 9.2 (окончание)
Имя столбца
Тип данных
Краткое описание
\ issqlrole
int
Если содержит 1, то текущая строка соответствует пользовательской или фиксированной роли базы данных
isapprole
int
Если содержит 1, то текущая строка соответствует роли приложения
Как видно, структура таблицы sysusers довольно сложна. Тем не менее, выполнение некоторых задач требует прямого доступа к этой таблице и невозможно иными способами. Например, если вы присоединяете (attach) базу данных с другого сервера, то соответствия между учетными записями и пользователями базы данных будут наверняка нарушены. То есть, хотя в базе данных и будут существовать пользователи, они не могут быть связаны с реальными учетными записями. Это произойдет даже в том случае, когда на сервере имеются учетные записи с теми же именами, что и на исходном сервере. Замечание Описанная проблема не касается учетных записей Windows NT, т. к. их идентификаторы безопасности постоянны в пределах домена. Однако, если вы переставляете домен (или отдельный компьютер), то создаваемые пользователи (даже с теми же именами, что и ранее) будут иметь новые идентификаторы безопасности и не смогут получить доступ к старым базам данных.
Описанную проблему можно легко решить, всего-навсего изменив значение в столбце s i d для соответствующего пользователя. В SQL Server 2000 имеется функция SUSER_SID(), с помощью которой можно получить идентификатор безопасности как учетной записи SQL Server, так и учетной записи пользователя или группы Windows'NT. Значение, возвращаемое функцией SUSER_SID(), может быть непосредственно сохранено в столбце s i d таблицы sysusers. Например, если мы присоединили базу данных с помощью хранимой процедуры sp_attach_db, но для пользователя базы данных L i l i y a нарушена связь с учетной записью Windows NT с именем L i l i y a домена matrix, то можно легко восстановить эту связь с помощью следующей команды: USE pubs UPDATE sysusers SET sid = SUSER_SID('matrix\Liliya') WHERE name = 'Liliya1
Замечание Напомним, что для изменения системных таблиц на уровне сервера должен быть разрешен прямой доступ к системным таблицам и базам данных. Для разрешения подобного доступа можно использовать команду EXEC s p _ c o n f i g u r e 'allow u p d a t e ' , 1.
Глава 9. Система безопасности SQL Server 2000
231
Просмотр информации о пользователях Одним из способов получения информации о пользователях базы данных является применение команды SELECT ДЛЯ выборки необходимых данных непосредственно из системных таблиц. Однако получение информации о пользователях путем просмотра таблицы sysusers представляется довольно затруднительным. Дело в том, что часто необходимо получить информацию о связях пользователей базы данных с учетными записями, для чего потребуется написание сложных запросов, обращающихся, помимо таблицы sysusers рассматриваемой базы данных, также и к системным таблицам базы данных Master. Более удобным механизмом получения информации о пользователях текущей базы данных является системная хранимая процедура spheipuser: USE pubs EXEC sp_helpuser
Будет получен примерно следующий результат: UserName
GroupName
LoginName
DefDBName
UserlD SID
Admin Casper dbo guest
public public db owner db datareader
NULL Casper sa NULL
NULL pubs master NULL
6 5 1 2
0x0542A973F5 0x04456EC274 0x01 0x00
Для первых двух пользователей указана только часть идентификатора безопасности пользователей Windows NT, т. к. размер страницы не позволил вместить его весь.
Как видно, для пользователя Admin не указано, ни имя учетной записи, ни база данных по умолчанию. Дело в том, что этот пользователь получает доступ к серверу на основе учетной записи Windows NT, как член группы Windows NT. Создание пользователя Создание нового пользователя и связывание его с учетной записью выполняется с помощью одной из двух хранимых процедур: • sp_adduser. Данная процедура оставлена для обеспечения совместимости с предыдущими версиями SQL Server и оперирует устаревшими понятиями. G sp_grantdbaccess. Эта хранимая процедура полностью соответствует понятиям системы безопасности SQL Server 2000 и пришла на смену предыдущей процедуре, начиная с версии SQL Server 7.0. Мы не будем рассматривать spadduser, ограничившись рассмотрением системной хранимой процедуры spgrantdbaccess, имеющей следующий синтаксис: sp_grantdbaccess [@loginame =] 'login' [,[@name in db =] 'name_in_db' [OUTPUT]]
232
Часть III. Администрирование
Замечание Правом вызова указанной хранимой процедуры обладают члены фиксированной роли сервера s y s a d m i n и члены фиксированных ролей базы данных db_owner и db_accessadmin.
Параметр @ioginame определяет имя учетной записи, которой предполагается предоставить доступ к текущей базе данных. Указанная учетная запись должна существовать на сервере. С помощью параметра @name_in_db указывается имя, которое будет присвоено создаваемому пользователю. Это имя должно быть уникальным в пределах базы данных. Приведенный далее пример иллюстрирует использование хранимой процедуры sp_grantdbaccess. В базе данных pubs создается новый пользователь с именем Admin, который связывается с учетной записью STORAGE\Admin: USE pubs EXEC sp_grantdbaccess 'STORAGE\Admin', 'Admin'
Замечание Хотя и было сказано, что с помощью параметра @loginame должно указываться только имя учетной записи, созданной на сервере, можно нарушать это правило при предоставлении доступа учетным записям Windows NT, получающим доступ к SQL Server 2000 через членство в группе Windows NT.
Удаление пользователя Удаление пользователя выполняется с помощью системной хранимой процедуры sp_revokedbaccess, имеющей синтаксис: sp_revokedbaccess [@name_in_db =] 'name'
Замечание Правом вызова указанной хранимой процедуры обладают члены фиксированной роли сервера s y s a d m i n и члены фиксированных ролей базы данных db_owner и db_accessadmin.
Единственный параметр процедуры определяет имя пользователя, которого необходимо удалить. Однако, прежде чем решиться на подобный шаг, следует убедиться, что пользователю не принадлежит никакой объект базы данных. Если же пользователь является владельцем одного из объектов базы данных, то следует либо удалить этот объект с помощью команды DROP, либо изменить владельца Объекта С ПОМОЩЬЮ СИСТеМНОЙ хранимой Процедуры s p _ c h a n g e o b j e c t o w n e r .
Например, для удаления пользователя Admin достаточно будет выполнить команду: EXEC sp_revokedbaccess 'Admin'
Глава 9. Система безопасности SQL Server 2000
233
Кроме хранимой процедуры sp_revokedbaccess для удаления пользователя можно применять процедуру sp_dropuser, которая используется подобно процедуре sp_revokedbaccess и имеет схожий синтаксис: sp_dropuser [@name_in_db =] 'user'
Указанная хранимая процедура, как и процедура sp__adduser, является устаревшей и оставлена в SQL Server 2000 для обеспечения совместимости с предыдущими версиями.
Роли базы данных В разд. "Роли сервера" ранее в этой главе было дано объяснение понятию "роли" и их назначению. В SQL Server 2000, как мы уже говорили, существуют роли двух уровней: уровня сервера и уровня базы данных. В разд. "Роли сервера"были рассмотрены фиксированные роли сервера, и дано краткое их описание. Текущий раздел посвящен ролям базы данных, их типам и назначению. В базе данных SQL Server 2000 имеются три следующих типа ролей: •
фиксированные роли базы данных (fixed database role);
• пользовательские роли базы данных (user database role); •
роли приложений (application role).
Собственно роли базы данных (фиксированные и пользовательские), предназначены для группировки пользователей и предоставления им необходимых прав доступа. Это помогает упростить администрирование системы безопасности базы данных. Отдельно стоят роли приложения. Они нужны не для группировки пользователей, а для предоставления прав доступа приложениям. Рассмотрим более подробно роли каждого типа.
Фиксированные роли базы данных Фиксированные роли делают возможным предоставление пользователям набора прав, которые нельзя организовать никаким другим способом. Количество и назначение фиксированных ролей стандартно и не может быть изменено. Кроме того, нельзя управлять правами доступа фиксированных ролей к объектам базы данных. SQL Server 2000 позволяет включать пользователей базы данных, учетные записи SQL Server и Windows NT, а также фиксированные роли сервера и группы Windows NT в фиксированные роли базы данных.
С
^Замечание
)
Отметим, что средствами Enterprise Manager можно включить в роль только пользователя базы данных. Тем не менее, в SQL Server 2000 существует набор системных хранимых процедур, позволяющих более гибко управлять членством пользователей в ролях базы данных.
234
Часть III. Администрирование
В табл. 9.3 приведен список фиксированных ролей базы данных с кратким описанием каждой из них. Таблица 9.3. Фиксированные роли базы данных Название роли
Краткое описание
db_securityadmin
Члены роли могут управлять правами доступа к объектам базы данных других пользователей и членством их в ролях
db_owner
Члены роли имеют права владельца, т. е. могут выполнять любые действия
db_denydatawriter
Членам этой роли запрещено изменение данных независимо от выданных им разрешений
db_denydatareader
Членам данной роли запрещен просмотр данных независимо от выданных им разрешений
db_ddladmin
Члены роли могут создавать, изменять и удалять объекты базы данных
db_datawriter
Пользователи, включенные в эту роль, могут изменять данные в любой таблице или представлении базы данных
db_datareader
Пользователи, включенные в эту роль, могут читать данные из любых таблиц и представлений базы данных
db_backupoperator
Члены роли выполняют резервное копирование базы данных
db accessadmin
Члены роли имеют право управлять пользователями базы данных: создавать, удалять и изменять
Как видно, фиксированные роли базы данных являются весьма полезным средством, с помощью которого можно заметно упростить администрирование безопасности БД. В табл. 9.3 не была рассмотрена еще одна фиксированная роль, имеющая специальные функции — public. В эту роль нельзя включать пользователей. Любой пользователь, созданный в базе данных, автоматически включается в роль public, и нет никакой возможности исключить его из этой роли. Единственная допустимая операция сводится к управлению членством пользовательских ролей в роли public. Но особого смысла в этом нет, т. к. Любой член пользовательской роли уже является членом роли public. Роль public предназначена для предоставления прав доступа по умолчанию (default right). Предоставив права доступа роли public, вы, тем самым, разрешаете доступ всем пользователям, работающим в базе данных. Не путайте назначение роли p u b l i c с назначением пользователя guest. Последний применяется для предоставления всем учетным записям определенного доступа, не предоставленного им явно. Права доступа, выданные пользователю guest, никак не влияют на права доступа других пользователей. В принципе, возможна ситуация, когда guest будет иметь большие права, чем другие пользователи базы данных. Назначение же роли p u b l i c в предоставлении стандартных прав доступ }сем пользователям базы данных, в том числе и пользователю guest.
Глава 9. Система безопасности SQL Server 2000
235
Управление фиксированными ролями средствами Transact-SQL В одном из предыдущих разделов было сказано, что набор фиксированных ролей базы данных, как и фиксированных ролей сервера, постоянен и не может изменяться. Однако это утверждение касается лишь встроенных средств управления фиксированными ролями базы данных. Владелец базы данных может использовать команды UPDATE, INSERT и DELETE для внесения изменений в сис-
темную таблицу sysusers, в которой и хранится информация о фиксированных ролях базы данных. Другими средствами (например, с помощью системных хранимых процедур или средствами Enterprise Manager) внесение изменений в свойства фиксированных ролей базы данных невозможно. В частности, при попытке удаления фиксированной роли с помощью хранимой процедуры s p d r o p r o l e , успешно используемой для удаления пользовательских ролей, будет выдано сообщение о невозможности удаления соответствующей роли. Например, попытаемся удалить фиксированную РОЛЬ db_ddladmin: USE pubs EXEC sp_droprole 'db_ddladmin'
Будет выдано следующее сообщение об ошибке: Server: Msg 15142, Level 16, State 1, Procedure sp_droprole, Line 46 Cannot drop the role 'db_ddladmin'.
Однако ничто не мешает удалить роль с помощью команды DELETE: USE pubs DELETE FROM s y s u s e r s WHERE name = ' db__ddladmin'
Подобным способом можно вносить и другие изменения в свойства фиксированных ролей базы данных. Однако не следует злоупотреблять подобными возможностями. Тем не менее, приведем запрос, с помощью которого можно создать НОВУЮ фиксированную РОЛЬ базы даННЫХ С Именем NewFixedRoie: USE pubs INSERT INTO sysusers (uid, status, [name], sid, createdate, updatedate, altuid, [password], roles) SELECT 16395, 0, 'NewFixedRoie' , NULL, GETDATEO, GET/DATE (), 1, NULL, 0x00
Изюминкой, позволившей создать новую фиксированную роль базы данных, является то, что сервер воспринимает все строки таблицы sysusers, имеющие в столбце uid значения от 16 384 до 16 399 включительно, в качестве фиксированных ролей. Приведенный запрос можно применять для создания более одной роли, подставляя вместо значения 16 395 соответствующее значение с соблюдением его уникальности. Замечание Если создать новую фиксированную роль в базе данных M o d e l , то каждая новая организуемая база данных будет содержать дополнительную фиксированную роль.
236
Часть III. Администрирование Дополнительно можно предоставить этой роли определенные права, внеся соответствующие изменения в системную таблицу syspermissions.
Конечно, созданная подобным образом фиксированная роль базы данных не будет обладать какими-то особенными правами доступа, как это существует для настоящих фиксированных ролей базы данных. Более того, невозможно будет управлять правами доступа созданной фиксированной роли к объектам базы данных. Конечно, приложив определенные усилия, можно предоставить новой роли любые права доступа, изменив соответствующим образом системные таблицы. Тем не менее, отличительным свойством новой фиксированной роли является невозможность ее удаления стандартными средствами.
Замечание Редко кто на практике станет создавать новые фиксированные роли базы данных. Приведенный пример лишь иллюстрирует возможности по управлению системой безопасности базы данных при помощи средств прямого доступа к системным таблицам. Для получения информации о ролях базы данных можно применять системную хранимую процедуру sp_helprole: USE pubs EXEC sp_helprole Будет возвращен примерно следующий результат: RoleName
RoleId IsAppRole
public db_owner db_accessadmin db_securityadmin db_ddladmin db_backupoperator db_datareader db_datawriter db_denydatareader db_denydatawriter NewFixedRole (11 row(s) affected)
0 0 16384 0 16385 0 16386 0 16387 0 16389 0 16390 0 16391 0 16392 0 16393 0 16395 0
Как видно, процедура выводит сведения об имени роли, ее идентификаторе и флаг, говорящий о том, является ли соответствующая роль ролью приложения.
Добавление членов в фиксированную роль Чтобы включить нового члена в фиксированную роль базы данных, необходимо вызвать системную хранимую процедуру spaddroiemember, имеющую синтаксис: sp_addrolemember [Qrolename =] ' r o l e ' ,
[Omembername =] 'security__account'
С помощью параметра @roiename указывается имя роли, в которую требуется добавить нового члена. Указанная роль должна существовать в текущей базе
Глава 9. Система безопасности SQL Server 2000
237
данных. При работе с фиксированными ролями их список постоянен. Однако хранимая процедура sp_addroiemember может использоваться и для включения членов в пользовательскую роль базы данных. В роль (как фиксированную, так и пользовательскую) может включаться не только пользователь базы данных, но и роль приложения или пользовательская роль. Имя бюджета, который требуется добавить в роль, указывается с помощью параметра @membername. В качестве примера рассмотрим включение пользовательской AccessedUser В фиксированную роль базы данных db_accessadmin: EXEC sp_addrolemember 'db_accessadmin',
роли
'AccessedUser'
Просмотр списка членов фиксированной роли При работе с большими базами данных, имеющими множество пользователей, администратор вряд ли будет точно помнить порядок размещения пользователей по фиксированным ролям. Для получения подобной информации можно применить следующую хранимую процедуру: sp_helprolemember
[[@rolename =]
'role']
Если процедура вызывается без указания параметра, то будет выведена информация о членах всех ролей базы данных. Если необходимо получить список членов конкретной роли, то можно воспользоваться параметром grolename, указав с его помощью имя интересующей роли. В качестве примера попробуем получить информацию о членстве во всех ролях текущей базы данных: USE pubs EXEC sp_helprolemember
Будет получен примерно такой результат: DbRole
MemberName
MemberSID
AccessedUser db accessadmin db_datareader db owner db owner db_owner NewFixedRole NewFixedRole (8 row(s) affected)
Access AccessedUser guest Access AccessedUser
NULL NULL 0x00 NULL NULL 0x01 0x4 3940DBCA5C63C4D9F407BFCCCB34CD9 NULL
dbo Casper Mayor
Исключение члена из фиксированной роли Когда необходимо исключить из фиксированной роли одного из членов, то для этого можно обратиться к хранимой процедуре spdroproiemember, имеющей следующий синтаксис: sp_droprolemember [@rolename =] 'role', [@membername =] 'security_account'
Часть III. Администрирование
238
С помощью первого параметра указывается имя роли, из которой предполагается исключить члена. Имя самого члена указывается с помощью второго параметра. Например, для исключения из фиксированной роли dbaccessadmin пользовательской роли Accesseduser необходимо выполнить следующую команду: USE pubs EXEC sp_droprolemember
'db_accessadmin',
1
'Accesseduser
Пользовательские роли базы данных Если фиксированные роли предназначены для наделения пользователей специальными правами в базе данных, то пользовательские роли служат лишь для группировки пользователей с целью облегчения управления их правами доступа к объектам. Если в базе данных существуют пользователи, которым необходимы одинаковые права доступа, то лучше объединить их в единую административную единицу, чем управлять каждым из них по отдельности. Если сотрудник переходит в другой отдел, то достаточно исключить его из одной роли и добавить в другую, а не просматривать все объекты базы данных и корректировать права доступа пользователя к ним. Пользовательские роли в SQL Server 2000 можно сравнить с группами SQL Server 6.x и группами Windows NT. & SQL Server Enterprise Manager - (Console Console Window Help
on View Tools • Ф>
! ЁИ
У Architecture Q Q У Q Q У У Q У Ы б
§
3 Jdb_accessadmin Jdb_backupoperator Jdb datareader
Aspirant Chair Collab Conferenc Decanat Diplom DistEDU DocExch InterchangeBTM Kafedra K
H
S
_ db_denydatareader f j i db_denydatawriter jJ3db_securityadmin ^public {^SQLusers f^UserLevel
U
L i b r a r y
У Library2 У master S у matrix : -=£§ Diagrams : Щ]| Tables [-Л* Views ; i-^ Stored Procedures Users _. Q ~] Rj Щ
Ro es
' Rules Defaults User Defined Data T Full-Text Catalogs
Рис. 9.12. Папка Roles
0," Q t f i Q i
i
Role Type Standard Standard Standard Standard Standard Standard Standard Standard Standard Standard Standard Standard Standard
Глава 9. Система безопасности SQL Server 2000
239
Список ролей базы данных можно просмотреть в папке Roles (рис. 9.12) базы данных средствами Enterprise Manager. Информация о ролях базы данных отображается в двух столбцах: • Name — имя роли; П Role Type — тип роли. Допускаются типы Standard (стандартная роль) и Application (роль приложения). Для создания новой пользовательской роли средствами Enterprise Manager нужно в контекстном меню папки Roles выбрать команду New Database Role. В открывшемся диалоговом окне Database Role Properties - New Role (рис. 9.13) в поле Name необходимо указать имя роли, уникальное в пределах базы данных. С помощью переключателей группы Database role type необходимо выбрать тип создаваемой роли. Если установлен переключатель Standard role, с помощью кнопки Add можно сразу же добавить нужных пользователей в создаваемую роль. Выбрав переключатель Application role, необходимо указать пароль, с помощью которого будет инициализироваться роль. Более подробно работа с ролями приложения рассмотрена в следующем разделе. Database Role Properties - New Role General Name: iListViewers SQL Servei supports two types of database roles: standard roles, which contain members, and application roles, which require a password. Database role type: <•" Standard role User ; Anton ; GodLevel i SQLusers
Add.. Application role
OK
Cancel
Help
Рис. 9.13. Окно создания новой роли
Управление пользовательскими ролями средствами Transact-SQL Как было сказано при рассмотрении управления пользователями средствами Transact-SQL, сведения о ролях базы данных, в т. ч. и о пользовательских, хра9 Зак. S3
240
Часть III. Администрирование
нятся в системной таблице sysusers, которая имеется в каждой базе данных. Таким образом, таблица sysusers содержит множество информации о пользователях, фиксированных и пользовательских ролях базы данных, а также о ролях приложения. Выделить среди прочей информации только строки, описывающие пользовательские и фиксированные роли базы данных, можно с помощью столбца i s s q i r o i e . Если данный столбец содержит значение 1, то соответствующая строка содержит описание роли приложения. Однако это не все. Необходимо отделить пользовательские роли от фиксированных. Это можно сделать с помощью столбца gid. Если в указанном столбце содержится значение, равное значению в столбце sid, то соответствующая строка описывает пользовательскую роль. Помимо этого, идентификаторы пользовательских ролей (значение в столбце sid) начинаются с 16 400.
Замечание Напомним, что идентификатор фиксированной роли p u b l i c равен 0.
Таким образом, для получения информации о пользовательских ролях текущей базы данных можно запустить один из следующих запросов: USE pubs SELECT * FROM sysusers WHERE issqiroie = 1 AND sid = gid SELECT * FROM sysusers WHERE gid != 0 SELECT * FROM sysusers WHERE sid >= 16400
Для получения информации о пользовательских ролях приложения также можно применять хранимую процедуру sp_heiproie, которая была рассмотрена в предыдущем разделе. Для выделения среди прочей информации только пользовательских ролей можно использовать столбец Role id — идентификаторы пользовательских ролей начинаются с 16 400.
Создание пользовательской роли Создание пользовательской роли выполняется с помощью системной хранимой процедуры sp_addrole, которая имеет синтаксис: sp_addrole
[Srolename =] 'role1
Замечание
[, [Sownername =] 'owner']
^
Правом выполнения указанной хранимой процедуры обладают члены фиксированной роли сервера s y s a d m i n и фиксированных ролей базы данных db_owner и db_securityadmin.
Имя роли, которое необходимо ей присвоить, указывается с помощью параметра @roiename. При выборе имени необходимо придерживаться общих правил именования объектов. Кроме того, требуется соблюдать уникальность имен, используемых системой безопасности базы данных. То есть нельзя создать пользовательскую роль с именем, присвоенным ранее пользователю или другой роли любого типа (пользовательской, фиксированной или приложения). Если указы-
Глава 9. Система безопасности SQL Server 2000
241
вается имя роли, нарушающее требование уникальности, то будет выдано следующее сообщение об ошибке: Server: Msg 15023, Level 16, State 1, Procedure sp_addrole, Line 58 User or role 'ИмяРоли' already exists in the current database.
По умолчанию владельцем роли становится владелец базы данных (пользователь dbo). Таким образом, пользователь dbo приобретает полный контроль над ролью. Если необходимо присвоить права владения ролью другому пользователю, то имя этого пользователя должно быть указано с помощью параметра @ownername. Указываемый пользователь должен иметься в базе данных. Владельцем пользовательской роли может также являться и роль приложения. В качестве примера рассмотрим создание пользовательской роли AccessedUser, владельцем которой будет являться пользователь guest: USE pubs EXEC sp__addrole 'AccessedUser',
'guest'
Напомним, что до SQL Server 7.0 понятия роли не существовало. Взамен предлагалось работать с группами. Для обеспечения совместимости с SQL Server 6.x в SQL Server 2000 оставлены хранимые процедуры, которые оперируют понятием группа. Однако работа этих процедур сводится к вызову процедур, работающих на современном уровне системы безопасности. Например, для добавления новой группы можно применить системную хранимую процедуру sp_addgroup, имеющую синтаксис: sp_addgroup [@grpname =]
'group'
Единственный параметр данной процедуры определяет имя группы, которую необходимо создать. Однако выясним, как работает на самом деле эта процедура. Для просмотра кода процедуры следует выполнить следующий пакет команд: USE master EXEC s p _ h e l p t e x t
'sp_addgroup'
В ответ будет выведен результат: Text create procedure sp_addgroup Sgrpname sysname -- name of new role as declare @ret int execute @ret = sp_addrole Sgrpname return @ret
Как видно, процедура sp_addgroup всего-навсего вызывает хранимую процедуру sp_addrole, что приводит к созданию новой роли, а не группы. Таким образом, видно, что группы в SQL Server 2000 полностью заменены ролями. Замечание Добавление и удаление пользователей из имеющихся пользовательских ролей, а также получение информации о членстве пользователей в той или иной роли базы
242
Часть III. Администрирование данных, осуществляется точно также, как и при работе с фиксированными ролями базы данных. Напомним, что для добавления нового пользователя в роль предназначена хранимая процедура s p _ a d d r o l e m e m b e r , а для удаления —
sp_droprolemember.
Удаление пользовательской роли Удаление пользовательской роли осуществляется с помощью хранимой процедуры sp_droproie, имеющей следующий синтаксис: sp_droprole [Srolename =] ' r o l e '
С помощью единственного параметра процедуры указывается имя пользовательской роли, которую необходимо удалить из текущей базы данных. Однако перед подобной операцией нужно удалить из нее всех членов, для чего можно использовать хранимую процедуру spdroproiemember. Если роль владеет одним или более объектами базы данных, то уничтожить такую роль будет невозможно. Прежде чем приступить к удалению, необходимо либо передать права владения соответствующими объектами с помощью хранимой процедуры sp_changeobjectowner, либо удалить ЭТИ объекты. С помощью приведенного ниже примера можно удалить пользовательскую роль AccessesUser: USE pubs EXEC sp_droprole 'AccessesUser'
Роли приложения Если с базой данных работают сотни и тысячи пользователей, то управление их правами доступа к объектам БД становится большой проблемой. Стандартные роли базы не всегда могут снять проблему. В этом случае SQL Server 2000 предлагает обратиться к роли приложения (application role). Даже для работы с большими базами данных, содержащими миллионы записей, к которым обращаются сотни пользователей, бывает достаточно ограниченного набора программных продуктов из двух-трех приложений. Роли приложения в SQL Server 2000 позволяют выдавать права доступа не конкретному пользователю или их группе, а приложению в целом. При этом не важно, какой именно пользователь работает с приложением, и какие права доступа к базе данных он имеет. Получив доступ к приложению, пользователь может выполнять все действия, разрешенные роли приложения. Упрощая управление правами доступа пользователей к базам данных, администратор перекладывает контроль за работой пользователей не на систему безопасности SQL Server 2000, а на возможности самого приложения. (
Замечание
^)
С точки зрения сервера роль приложения рассматривается как обычный пользователь. Таким образом, роль приложения может являться владельцем объектов базы данных.
Глава 9. Система безопасности SQL Server 2000 Создание роли приложения с помощью Enterprise Manager было описано в предыдущем разделе. Роль приложения не содержит членов. Пользователь, работающий с приложением, не является членом роли приложения. Он лишь использует возможности приложения. При конфигурировании роли приложения следует указать только ее имя и пароль, необходимые приложению при установлении соединения. Данный пароль приложение может вводить само, но может и требовать его ввода у пользователя. Конкретная реализация зависит от разработчика приложения. Безопасность при отправке пароля роли приложения по сети можно обеспечить шифрованием. Сначала пользователь должен установить соединение с сервером. Для этого необходимо предварительно создать для него учетную запись SQL Server или предоставить учетной записи пользователя в домене Windows NT доступ к SQL Server 2000. Учетная запись пользователя может отображаться в пользователя базы данных, имеющего определенные права доступа (или запрещение доступа). После того как пользователь получил доступ к серверу, он может начинать работу с программой. Программа активизирует роль приложения выполнением специальной хранимой процедуры, в которой указывается имя роли и ее пароль. Если введены верные данные, то SQL Server 2000 предоставляет приложению соответствующие права. Права доступа, полученные через роль приложения, могут конфликтовать с правами доступа пользователя, работающего с приложением. Чтобы этого не происходило, система безопасности SQL Server 2000 аннулирует все права в текущем сеансе соединения, выданные учетной записи, пользователю базы данных или любой из ролей. Происходит как бы потеря информации о личности пользователя. Такой подход позволяет со стопроцентной гарантией избежать конфликтов доступа и обеспечить приложение правами доступа, независимыми от пользователя, работающего с приложением. После завершения работы приложения права доступа пользователя восстанавливаются. Если пользователь одновременно открыл несколько сеансов, то права доступа будут потеряны только в соединении, из которого была инициализирована роль. В других сеансах он будет иметь обычные права доступа. Поскольку в соединении, в котором была инициирована роль приложения, теряется вся информация о личности пользователя, то пропадает и возможность установления соединения с серверами и базами данных с правами, выданными работающему с приложением пользователю. Если во внешней базе данных удален пользователь guest, то получение доступа к данным невозможно. Чтобы предоставить приложению возможность работы с данными во внешних базах данных, необходимо создать в этих базах пользователя guest. Приложение будет иметь права доступа, выданные пользователю guest непосредственно или как члену роли public. Чтобы приложение имело различные права доступа к базе данных, требуется создать отдельную роль для каждой задачи и наделить ее необходимыми правами. Кроме того, если приложению нужен доступ к различным базам данных, и администратор не желает прибегать к созданию пользователя guest, то также следует создать отдельную роль приложения для каждой базы данных. Приложение само должно заботиться о переключении ролей.
243
Часть III. Администрирование
244
Управление ролями приложения средствами Transact-SQL Как было сказано при рассмотрении управления пользователями средствами Transact-SQL, данные о роли приложения хранятся в системной таблице sysusers, которая имеется в каждой базе данных. Эта таблица содержит также сведения о пользователях и фиксированных и пользовательских ролях базы данных. Выделить среди прочей информации только строки, описывающие роли приложения, можно с помощью столбца isapproie. Если данный столбец содержит значение 1, то соответствующая строка хранит описание роли приложения. Кроме этого, для роли приложения столбец password содержит пароль, который необходимо указать для активации роли. Для пользователей и других ролей (пользовательских и фиксированных) столбец password имеет значение NULL. Например, для получения информации о ролях приложения можно выполнить запрос: USE pubs SELECT * FROM sysusers WHERE isapproie = 1
Для получения информации о ролях приложения также можно вызывать хранимую процедуру sp_heiproie, которая была рассмотрена в одном из предыдущих разделов этой главы. Для ролей приложения в столбце i s a p p r o i e будет выведено значение 1, тогда как для фиксированных и пользовательских ролей будет выведено значение 0.
Создание роли приложения Создание новой роли приложения в текущей базе данных выполняется с помощью системной хранимой процедуры sp_addapproie, имеющей синтаксис: sp_addapprole [@rolename =] 'role', [@password =] 'password'
(
Замечание
^)
Правом выполнения указанной хранимой процедуры обладают члены фиксированной роли сервера s y s a d m i n и фиксированных ролей базы данных db_owner и db_securityadmin.
Первый параметр процедуры определяет имя, которое должна иметь роль приложения. При выборе имени роли следует следовать стандартным правилам именования. Кроме того, необходимо соблюдать уникальность имени. То есть ранее в текущей базе данных не должно быть создано роли любого типа с аналогичным именем. С помощью параметра gpassword указывается пароль, который будет использован для активизации роли приложения. Пароль хранится в шифрованном ВИДе В столбце password таблицы sysusers. В качестве примера рассмотрим создание роли приложения Mayor с паролем marshal: USE pubs EXEC sp_addapprole 'Mayor',
'marshal'
Глава 9. Система безопасности SQL Server 2000
245
Активизация роли приложения Активизация роли приложения выполняется с помощью следующей системной хранимой процедуры: s p _ s e t a p p r o l e [@rolename =] ' r o l e 1 , [gpassword =] {Encrypt N 'password'} I 'password' [,[@encrypt =] ' e n c r y p t _ s t y l e ' ]
Замечание Правом выполнения указанной хранимой процедуры обладает любой пользователь. Для активизации роли приложения достаточно знать ее имя и пароль. Необходимо отметить, что возможна активизация только роли приложения текущей базы данных. Если необходимо то же самое сделать не для текущей базы данных, то следует установить нужную базу данных в качестве текущей с помощью КОМаНДЫ USE ИмяБД. Рассмотрим назначение и использование параметров хранимой процедуры. CD
[@rolename
=]
'role'
С помощью этого параметра указывается имя роли приложения, которую необходимо активизировать. Указанная роль должна существовать в текущей базе данных. Если же вводится имя несуществующей роли приложения, то будет выдано следующее сообщение об ошибке: Server: Msg 2763, Level 16, State 1, Procedure sp_setapprole, Line 41 Could not find application role 'ИмяРоли'. Аналогичное сообщение об ошибке будет отображено и при указании имени фиксированной или пользовательской роли. О
[@password =] {Encrypt N 'password'} I 'password' Данный параметр определяет пароль, который будет использован для активизации роли приложения. Пароль должен быть тем же, что и при создании роли приложения. Если указывается неверный пароль, то будет выдано следующее сообщение об ошибке: Server: Msg 2764, Level 16, State 1, Procedure sp_setapprole, Line 41 Incorrect password supplied for application role 'ИмяРоли'. Для обеспечения безопасности пароля при передаче его по сети можно применить функцию ODBC Encrypt, используя формат параметра [@password =] Encrypt N 'password'. Функция Encrypt работает со строками в формате Unicode, поэтому перед паролем необходимо указать символ N, ЧТО приведет к преобразованию указанной строки в формат Unicode.
О
[@encrypt =] 'encrypt_style' С помощью этого параметра можно управлять шифрованием пароля при отправке его по сети. Параметр может принимать следующие значения: •
' попе' — шифрование использоваться не будет;
246
Часть III. Администрирование
•
' odbc' — для обеспечения безопасности пароля при передаче его по сети будет ИСПОЛЬЗОВатЬСЯ фуНКЦИЯ O D B C E n c r y p t .
Замечание Активизация роли приложения выполняется с помощью системной функции SETUSER с использованием недокументированных возможностей. Функция SETUSER позволяет членам фиксированных ролей s y s a d m i n и db_owner работать с правами любого другого пользователя базы данных или роли.
В качестве примера рассмотрим активизацию созданной в предыдущем разделе РОЛИ приложения Mayor: USE pubs EXEC sp_setapprole 'Mayor1,
'marshal'
В указанном примере пароль по сети передавался в открытом виде. Для иллюстрации применения возможности шифрования пароля продемонстрируем два примера, приводящих к аналогичным результатам: USE pubs EXEC sp_setapprole EXEC sp_setapprole
'Mayor', Encrypt N 'marshal' 'Mayor', 'marshal', 'odbc'
Замечание Роль приложения автоматически деактивизируется при переключении текущей базы данных с помощью команды USE. Однако допускается выполнение распределенных и удаленных запросов, обращающихся как к различным базам данных текущего сервера, так и к распределенным гетерогенным источникам данных.
Удаление роли приложения Для удаления роли приложения sp_dropapprole, имеющая синтаксис:
используется
хранимая
процедура
sp_dropapprole [Qrolename =] ' r o l e '
Замечание Правом выполнения указанной хранимой процедуры обладают члены фиксированной роли сервера s y s a d m i n и фиксированных ролей базы данных db_owner и db_securityadmin.
Единственный параметр хранимой процедуры определяет имя роли приложения, которая должна быть удалена. Если приводится имя пользовательской или фиксированной роли базы данных, то будет выдано сообщение о попытке удаления несуществующей роли приложения. Аналогичное сообщение будет выдано и при указании имени несуществующей роли: Server: Msg 15014, Level 16, State 1, Procedure sp_dropapprole, Line 29 The role 'ИмяРоли' does not exist in the current database.
Глава 9. Система безопасности SQL Server 2000
247
В качестве примера рассмотрим удаление роли приложения Mayor, созданной в одном из предыдущих разделов: USE pubs EXEC sp_dropapprole 'Mayor'
Замечание Перед удалением роли приложения следует убедиться, что она не является владельцем каких-либо объектов базы данных. Иначе избавиться от роли не удастся. Выходом может явиться либо удаление принадлежащих роли объектов, либо передача прав владельца другому пользователю базы данных с помощью хранимой процедуры sp_changeobjectowner.
Права доступа Для того чтобы пользователь имел возможность выполнять те или иные действия с объектами базы данных, он должен предварительно получить необходимые права доступа. Владелец базы данных или конкретного объекта должны предоставить пользователям базы данных возможность обращения к объектам базы данных. Все существующие в базе данных права доступа можно разбить на три класса: •
права доступа к данным;
П права на выполнение хранимых процедур; •
права на выполнение команд Transact-SQL.
Помимо перечисленных прав доступа, выдаваемых пользователю явно, существует класс неявных прав доступа. Неявные права доступа предоставляются пользователю через членство в фиксированной роли сервера или базы данных. Например, нет никакой другой возможности предоставить пользователю право на создание баз данных, кроме как включить его в роль сервера Dbcreator. Другим примером работы неявных прав доступа является получение владельцем объекта абсолютных прав на управление объектом владения. Если пользователь создал объект в базе данных, то ему автоматически предоставляются максимальные права по управлению этим объектом. Никто, включая администратора, не должен предоставлять пользователю специально эти права. Только факт владения объектом обеспечивает пользователю полный контроль. Владелец объекта может передать права владения другому пользователю, предоставляя ему тем самым полный контроль над объектом. Владелец объекта может устанавливать права доступа к объекту для других пользователей базы данных.
Права доступа к данным Доступ к данным можно разделить на несколько категорий: •
INSERT. Это право позволяет вставлять в таблицу или представление новые строки. Как следствие, право INSERT может быть выдано только на уровне таблицы или представления и не может быть выдано на уровне столбца.
248
Часть III. Администрирование
П UPDATE. Данное право выдается либо на уровне таблицы, что позволяет изменять все данные в таблице, либо на уровне отдельного столбца, что разрешает изменять данные только в пределах конкретного столбца. •
DELETE. Право позволяет удалять строки из таблицы или представления. Как и право INSERT, право DELETE может быть выдано только на уровне таблицы или представления и не может быть выдано на уровне столбца.
•
SELECT. Разрешает выборку данных. Может выдаваться как на уровне таблицы, так и на уровне отдельного столбца.
•
REFERENCES. Возможность ссылаться на указанный объект. Применительно к таблицам разрешает пользователю создавать внешние ключи, ссылающиеся на первичный ключ или уникальный столбец этой таблицы. Применительно к представлениям право REFERENCES позволяет связывать их со схемами таблиц, на основе которых они строятся. Это дает возможность отслеживать изменения структуры исходных таблиц, которые могут повлиять на работу представления.
(
Замечание
)
Право R E F E R E N C E S не с у щ е с т в о в а л о в п р е д ы д у щ и х версиях S Q L Server.
Перечисленные выше права могут быть предоставлены пользователю для таблиц и представлений базы данных. Доступ можно предоставлять как на уровне всей таблицы или представления, так и на уровне отдельного столбца. Обычно не практикуется управление правами доступа на уровне конкретного столбца. Если в таблице имеется один или более столбцов, доступ пользователей к которым необходимо ограничить, то в базе данных часто создается представление (view), включающее только те столбцы исходной таблицы, доступ к которым разрешен. Предоставить или отклонить доступ пользователю базы данных ко всем объектам базы данных можно при помощи особенностей встроенных ролей базы данных. Например, для разрешения чтения данных из всех таблиц и представлений базы данных достаточно включить пользователя в фиксированную роль db_datareader, а не изменять права доступа пользователя к каждой таблице и представлению в отдельности.
Права на выполнение хранимых процедур и функций Единственное право доступа, которое может быть предоставлено для хранимой процедуры — это право на ее выполнение (EXECUTE). ПОМИМО ЭТОГО владелец
хранимой процедуры может просматривать и изменять ее код. Для, функции кроме права на выполнение также можно выдать право REFERENCES, ЧТО ПОЗВОЛИТ выполнять связывание функции с объектами, на которые она ссылается. Такое связывание позволяет запретить внесение изменений в структуру объектов, которые бы привели к нарушению работы функции. Право на выполнение хранимой процедуры может быть предоставлено пользователям несколькими способами. Например, при помощи Enterprise Manager.
Глава 9. Система безопасности SQL Server 2000
249
Для этого выберите в левой панели Enterprise Manager нужную базу данных и откройте в ней папку Stored Procedures. В правой части Enterprise Manager будет отображен список хранимых процедур, уже созданных в базе данных. Управление правами доступа можно осуществлять в окне Object Properties (рис. 9.14), вызвать которое можно либо с помощью кнопки Permissions в окне свойств хранимой процедуры, либо выбрав в контекстном меню хранимой процедуры команду All Tasks, а затем команду Manage Permissions. Object Properties - matrix Permissions fibject:
account (dbo)
' <• List all users/user-defined database roles/public С List only users/user-defined database roles/public with permissions on this object. Users/Database Roles/Public SELECT ilNSERT jUPDATE 'DELETE IEXEC IDRI S Alex | Anton
±f
OK
Cancel
Apply
Help
Рис, 9.14. Окно Object Properties для домена matrix
Чтобы разрешить пользователю выполнять хранимую процедуру, нужно установить напротив его имени флажок в столбце EXEC. Чтобы запретить доступ, нужно зачеркнуть флажок. Пустой флажок подразумевает неявное отклонение доступа. Более подробно о правах доступа будет рассказано далее в этой главе. Управление правами доступа к функциям осуществляется аналогично. При использовании Enterprise Manager необходимо сначала выбрать в левой панели Enterprise Manager нужную базу данных и открыть в ней папку User Defined Functions. В правой части Enterprise Manager будет отображен список пользовательских функций, имеющихся в базе данных. Управление правами доступа можно осуществлять в окне Object Properties (подобное приведенному на рис. 9.14), вызвать которое можно либо с помощью кнопки Permissions в окне свойств пользовательской функции, либо выбрав в контекстном меню функции команду All Tasks, а затем команду Manage Permissions.
250
Часть III. Администрирование
Замечание Другой способ управления правами доступа заключается в предоставлении прав конкретному пользователю с помощью специального окна, вызвать которое можно с помощью кнопки Permissions окна свойств пользователя.
Права на выполнение команд Transact-SQL Мы рассмотрели классы прав доступа, регламентирующих действия пользователей в отношении работы с существующими объектами базы данных. Третий класс доступа — права на выполнение команд Transact-SQL — предназначены для управления возможностями пользователя по созданию новых объектов базы данных. Приведем список прав доступа на выполнение команд Transact-SQL: П CREATE DATABASE. Право создания базы данных. Выдается учетной записи. •
CREATE TABLE. Право на создание таблицы.
•
CREATE VIEW. Право на создание представления.
•
CREATE PROCEDURE. Право на создание хранимой процедуры.
П CREATE FUNCTION. Право на создание пользовательской функции. •
CREATE RULE. Право на создание правила.
•
CREATE DEFAULT. Право на создание умолчания.
•
BACKUP DATABASE. Право на создание резервной копии базы данных.
П BACKUP LOG. Право на создание резервной копии журнала транзакций. П ALL. С помощью этого права предоставляются все вышеперечисленные права. Члены фиксированной роли сервера sysadmin и фиксированной роли базы данных db_owner автоматически имеют право ALL. Члены других фиксированных ролей имеют набор прав, соответствующих функциям роли.
Управление правами доступа В предыдущих разделах мы рассмотрели, какие классы прав доступа существуют в базах данных SQL Server 2000. В этом разделе описывается предоставление и запрещение пользователям доступа к объектам базы данных. Когда в базе данных создается новый пользователь, то для него не установлены явно никакие права доступа. Но поскольку новый пользователь автоматически является членом фиксированной роли базы данных public, то он автоматически получает набор прав, выданный для этой роли. Если же такого набора прав не достаточно, то необходимо явно предоставить доступ (allow access) к тому или иному объекту базы данных. До тех пор пока администратор не предоставит пользователю необходимые права доступа, тот не сможет выполнять никаких действий с объектами базы данных.
Глава 9. Система безопасности SQL Server 2000
251
Права доступа могут быть выданы пользователю непосредственно или как члену роли базы данных. Необходимо быть внимательным, планируя права доступа пользователей к объектам базы данных и выдавая им разрешения на выполнение команд Transact-SQL. Включив по неосторожности пользователя в ту или иную группу Windows NT или роль базы данных, можно предоставить ему лишние права. При управлении правами доступа нужно помнить, что аутентификация Windows NT имеет приоритет над аутентификацией SQL Server. Рассмотрим следующую ситуацию. Администратор планирует доступ пользователю Reader базы данных, в которого отображается учетная запись (login) SQL Server с именем L i l i y a . Но пользователь домена, регистрирующийся на сервере под учетной записью L i l i y a , состоит в группе Windows NT, для которой сконфигурирована учетная запись NTGroup3. Эта учетная запись отображается в пользователя Editor, которому предоставлены права доступа, существенно отличающиеся от прав доступа пользователя Reader. В итоге пользователь домена получит набор прав, который ему не положен. Замечание Чтобы разрешить пользователю изменять данные во всех таблицах и представлениях, можно включить его в фиксированную роль базы данных d b _ d a t a w r i t e r . Для разрешения чтения данных из любой таблицы или представления можно включить пользователя в роль d b _ d a t a r e a d e r .
Для более гибкого управления правами доступа пользователей к данным, хранящимся в таблицах базы данных, можно устанавливать эти права на уровне отдельного столбца. Также необходимо грамотно предоставлять пользователям права на выполнение команд Transact-SQL. Тщательное планирование прав доступа позволит в будущем избежать многих проблем. (
Замечание
^
В SQL Server 7.0 управление разрешениями на уровне столбцов поддерживалось только средствами Transact-SQL. SQL Server 2000 позволяет управлять правами доступа на уровне столбцов и с помощью Enterprise Manager.
Управление правами доступа пользователей с помощью Enterprise Manager возможно двумя способами: П Со стороны объекта. В панели Enterprise Manager необходимо выбрать объект, разрешениями к которому предполагается управлять, и открыть окно его свойств, для чего можно дважды щелкнуть левой кнопкой мыши на объекте или в его контекстном меню выбрать команду Properties. Для управления собственно разрешениями в появившемся диалоговом окне необходимо нажать кнопку Permissions, что приведет к открытию окна Object Properties (рис. 9.15). Центральную часть окна занимает список, в котором перечисляются все имеющиеся в базе данных пользователи (за исключением пользователя dbo), роли приложения, пользовательские роли базы данных, а также фиксированная роль базы данных public. Имена пользователей приводятся в
252
Часть III. Администрирование
самом левом столбце. Следующие столбцы содержат флажки, в которых указывается выданное разрешение для каждой из возможных категорий доступа. Пустой флажок соответствует неявному отклонению доступа, с галочкой — предоставлению доступа, а перечеркнутый крест-накрест — запрещению доступа. Раскрывающийся список Object содержит набор всех объектов, имеющихся в базе данных. Для просмотра и управления правами другого объекта достаточно выбрать его в списке Object. Замечание Хотя в окне имеются столбцы для всех типов разрешений, они используются не всегда. Список доступных разрешений зависит от типа объекта. Например, разрешение S E L E C T не применимо к пользовательской функции или хранимой процедуре. С другой стороны, разрешение EXECUTE не применимо к таблице или представлению.
2<J
Object Properties - matrix Permissions Object:
1Ш Education (dbo)
и List all users/user-defined database roles/public С List only users/user-defined database roles/public with permissions on this object. u'sers^abaseRoies/Public"!SELECT |INSERT [UPDATE
Alex Anton
в Axl Б
Chk i
Яг GodLevel S Liss Гг SQLusers
BT
6Г
.,/
;DELETE ;EXEC IDRI
vr
8Г
I
«!
OK
Cancel
Appyl
Hep l
Рис. 9.15. Окно Object Properties для домена matrix
• Co стороны пользователя. В панели Enterprise Manager нужно выбрать пользователя, правами которого предполагается управлять. Список пользователей можно найти в папке Users, имеющейся в каждой базе данных. Управление разрешениями пользователя осуществляется с помощью окна Database User Properties (рис. 9.16), открыть которое можно с помощью кнопки Permissions в окне свойств пользователя. Окно содержит список всех объектов, имеющихся в базе данных, включая и системные. Управление типом разрешения для каждой из категорий доступа осуществляется с помощью флажков. Раскрывающийся
Глава 9. Система безопасности SQL Server 2000
253
список Database user содержит перечень всех пользователей, созданных в базе данных. Для конфигурирования прав доступа другого пользователя достаточно выбрать его имя в списке Database user. Данный список содержит также и пользователя dbo. Если выбрать его в списке, можно увидеть, что ему предоставлены возможные категории доступа ко всем объектам базы данных. Однако изменять права доступа пользователя dbo нельзя. Управление разрешениями со стороны пользователя также включает предоставление прав на уровне пользовательских ролей базы данных. Конфигурирование прав доступа ролей выполняется аналогично управлению правами доступа пользователей. Единственно, необходимо нажать кнопку Permissions не в окне свойств пользователя, а в окне свойств роли. Список ролей с указанием их типа (фиксированная или пользовательская) можно найти в папке Roles, имеющейся в каждой базе данных. Допускается управление разрешениями для любой из пользовательских баз данных и фиксированной роли public. Управление правами доступа других фиксированных ролей не разрешено. Отметим, что при работе с Enterprise Manager, поставляемым в составе SQL Server 2000, существует возможность управлять правами доступа не только к таблице целиком, но и к конкретному столбцу в отдельности. Для этого достаточно выбрать в окне Database User Properties нужную таблицу или представление и нажать кнопку Columns. В ответ откроется окно Column Permissions (рис. 9.17), с помощью которого и выполняется управление правами доступа к столбцу. Database User Properties -pubs Permissions Database user: {* List all objects С List only objects with permissions for this user
! Owner
Object EH ;j2p £ji &Q :^Щ ^
byroyalty dbo discounts dbo dt_addtosour... dbo dt_addtosour... dbo dt_adduserobject dbo dt_adduserob... dbo dt_checkinobject dbo
. Щ
Ji
- I . - . I
L
;
SELECT INSERT iUPDATE DELETE EXEC DRI
J L .
Columns., OK
1
Cancel
Рис. 9.16. Окно Database User Properties базы данных pubs
Help
Часть III. Администрирование
254 Column Permissions General I '4№>7 User name: Object name:
dbo dbo. authors
List all columns List only columns with permissions for this user Cou l mn : !SELECT address ш au_fname aujd au_lname city g contract phone state s^ H of l w
(UPDATE
• •
gr m ia
Ъб
Cancel
Help
Рис. 9.17. Окно Column Permissions
Предоставление доступа Для предоставления пользователю доступа к объектам базы данных используется команда GRANT, имеющая синтаксис: GRANT { ALL [PRIVILEGES] I permission [ , . . . n ] } ( column [ , . . . n ] )] ON {table I view} ON {table I view} [( column [ , . . . n ] )] ON {stored_procedure | extended_procedure} ON {user_defined_function} TO security_account [ , . . . n ] [WITH GRANT OPTION] [AS {group | r o l e } ] Рассмотрим назначение и использование аргументов команды: П ALL Указание этого параметра позволяет предоставить пользователю или группе все допустимые права. Однако этот параметр может использоваться только при предоставлении прав членам фиксированных ролей sysadmin или db owner.
Глава 9. Система безопасности SQL Server 2000
255
П PRIVILEGES Ключевое слово PRIVILEGES особой роли не играет и может быть с успехом опущено. Оно предназначено только для обеспечения совместимости со стандартом ANSI SQL-92. П permission [,...п] Этот параметр используется для указания категорий доступа, которые будут выданы пользователю для указанного объекта. Допускается указание следующих категорий: •
SELECT — выборка из таблиц, представлений или отдельных столбцов;
•
INSERT — вставка строк в таблицу или представление;
•
DELETE — удаление строк из таблицы или представления;
•
UPDATE — изменение данных в таблице, представлении или отдельном столбце;
•
REFERENCES — разрешение ссылаться на таблицу, представление или пользовательскую функцию;
•
EXECUTE — выполнение хранимой процедуры или пользовательской функции.
Замечание При управлении правами доступа с помощью Enterprise Manager категория доступа REFERENCES
у к а з ы в а е т с я как DRI (declarative referential integrity, д е к л а р а т и в н а я
ссылочная целостность). [,...п]
Параметр указывает на то, что за один раз с помощью команды GRANT пользователю может быть выдано множество прав. (column [, . . .п] ) Параметр предназначен для указания прав доступа пользователя к одному или более столбцов таблицы или представления. В одной команде GRANT могут быть выданы разрешения более чем для одного столбца. Имя таблицы или представления указывается с помощью следующего параметра. Для столбцов допускается выдача разрешений категорий доступа SELECT И UPDATE. ON {table I view} Назначает имя таблицы или представления, для которых предоставляется доступ. Если задается параметр (column [,.-.,л])., то указанные права будут определены для конкретных столбцов таблицы. В противном случае разрешения будут выданы для всей таблицы или представления. Для таблиц и представлений допускается выдача разрешений категорий доступа SELECT, UPDATE, DELETE,INSERT И REFERENCES.
Замечание Выдача разрешений на уровне таблицы или представления отменяет все ранее выданные разрешения на уровне столбцов.
256 П
Часть III. Администрирование ON { t a b l e
I view}
[( column
[,...n]
)]
Конструкция является вторым способом указания объекта, разрешениями которого предполагается управлять. Параметр {table | view} определяет имя таблицы или представления, тогда как дополнительный параметр (column [, . . .п] ) задает список столбцов, доступом к которым будет осуществляться управление. П ON {stored_procedure
| extended_procedure}
Конструкция используется для управления правами доступа к стандартной или расширенной хранимой процедуре. Стандартная хранимая процедура должна принадлежать текущей базе данных. Хотя указание имени базы данных дополнительно к имени процедуры и допускается, тем не менее, управление правами доступа к процедуре внешней базы данных не поддерживается. Исключением является управление правами доступа к расширенным хранимым процедурам, которые располагаются в системной базе данных Master. Указание имени базы данных для процедур этого типа не требуется. Для хранимых процедур разрешается выдавать только разрешение EXECUTE. О ON
{user_defined_function}
Параметр позволяет управлять правами доступа к пользовательской функции. Для пользовательских функций разрешается выдавать разрешения категорий EXECUTE И REFERENCES. СЗ security_account [,...п] Данный параметр определяет список пользователей и ролей базы данных, которым будут выданы указанные разрешения. Выполнив одну команду GRANT, можно изменить права доступа множества пользователей и ролей базы данных. •
WITH GRANT OPTION
При вводе этого параметра пользователям, указанным с помошью предыдущего параметра, будет предоставлено право выдавать другим пользователям разрешения доступа, аналогичные выданным им самим. Однако параметр WITH GRANT OPTION может использоваться только при управлении разрешениями на уровне объектов. То есть нельзя предоставить пользователям возможность управлять разрешениями доступа только к конкретному столбцу. П AS {group I r o l e }
Указание этого параметра требуется, когда право на выдачу разрешения выдано роли или группе базы данных. Хотя группа или роль может обладать правом предоставления разрешений, тем не менее, выдавать их может только конкретный пользователь, которому непосредственно может быть и не предоставлено такого права. Использование параметра AS предоставляет возможность пользователю выдавать разрешения от имени группы или роли, имеющей необходимые права и членом которой является пользователь. Разрешить пользователю выполнять те или иные команды Transact-SQL также можно при помощи команды GRANT СО следующим синтаксисом: GRANT {ALL I statement[,...n]} ТО security account[,...n]
Глава 9. Система безопасности SQL Server 2000
257
При указании аргумента ALL пользователю или группе будут даны права выполнять все допустимые команды Transact-SQL. Однако этот параметр может использоваться только при предоставлении прав членам фиксированных ролей sysadmin или db_owner. Для предоставления пользователю права выполнять конкретные команды Transact-SQL предназначен параметр statement [, . . . п]. Список допустимых значений этого параметра был приведен в разд. "Права на выполнение команд Transact-SQL" ранее в этой главе. Назначение параметра security_account [, . . .п] идентично рассмотренному ранее одноименному параметру. Замечание Если пользователь имеет возможность выполнять те или иные действия, то говорят, что е м у выдано право доступа G R A N T .
В качестве примера рассмотрим предоставление роли Accesseduser права выборки ИЗ Столбцов au_id, au_lname, au_lname И s t a t e таблицы authors базы данных pubs: GRANT SELECT (au_id, au_lname, au_lname, state) ON authors TO AccessedUser
Получив набор прав, пользователь сможет выполнять разрешенные действия. Но в некоторых случаях бывает необходимо запретить ему выполнять некоторые операции в базе данных.
Запрещение доступа Система безопасности SQL Server 2000 позволяет создать довольно сложную иерархическую систему управления правами доступа пользователей к объектам базы данных. Если к базе данных обращаются тысячи пользователей, для управления которыми применяются как группы Windows NT, так и роли базы данных SQL Server, то отслеживание прав доступа конкретного пользователя становится проблематичным. Пользователь может получить права явно или как член роли базы данных или группы Windows NT. SQL Server 2000 не имеет встроенных средств для отслеживания прав доступа пользователя через членство в той или иной роли или группе. Поэтому администратор должен держать в голове список ролей и групп, в которые входит пользователь, и просматривать права, выданные каждой из них. Эта задача не так сложна, если права групп и ролей не пересекаются. Но часто бывает, что некоторым пользователям необходимо временно запретить доступ (deny access) к определенным таблицам или даже к конкретным столбцам таблицы, а исключение из роли или группы лишит пользователей прав доступа, которые должны быть оставлены. Лучший выход — создание новой роли, в которую будут включены все пользователи, которым необходимо ограничить доступ: Затем для роли запрещается доступ к тем или иным объектам базы данных. Манипулировать несколькими пользователями, включенными в самостоятельную роль, проще, чем отслеживать права доступа конкретного человека, а потом возвращать их обратно. При большом количестве пользователей в базе данных такой способ управления правами может значительно облегчить работу администратора.
258
Часть III. Администрирование
Основой описанного подхода ограничения доступа является то, что запрещение доступа (DENY) имеет более высокий приоритет, чем его предоставление (GRANT). Если пользователю был явно запрещен доступ к тому или иному объекту, то система безопасности SQL Server 2000 гарантирует, что пользователь не будет иметь его, даже если он был предоставлен ему явно или через членство в любой роли базы данных или группе Windows NT. Это правило касается и роли dbowner. Администратор может запретить доступ пользователю непосредственно или через его членство в роли или группе. Замечание При запрещении доступа можно воспользоваться фиксированными ролями базы данных d b _ d e n y d a t a w r i t e r и d b _ d e n y d a t a r e a d e r , которые соответственно запрещают изменение и чтение данных во всех таблицах и представлениях базы данных.
Для запрещения пользователю или роли доступа к объектам базы данных применяется команда DENY, имеющая синтаксис: DENY { ALL [PRIVILEGES] | permission [,...n] } { [( column [,...n] )] ON {table I view} I ON {table I view } [( column [,...n] )] I ON {stored_procedure | extended_procedure} I ON {user_defined_function} } TO security_account [,...n] [CASCADE]
В целом назначение и использование параметров команды DENY аналогично рассмотренным в предыдущем разделе параметрам команды GRANT. Тем не менее, есть некоторые отличия. Обратите внимание на ключевое слово CASCADE. ЕСЛИ команда DENY выполняется с ключевым словом CASCADE, TO запрещение прав доступа будет каскадироваться. Если пользователь, которому запрещается доступ к объекту, предоставлял другим пользователям базы данных доступ к объекту, то при указании ключевого доступа CASCADE ДЛЯ ЭТИХ пользователей также будет запрещен доступ. Если эти пользователи в свою очередь предоставляли доступ еще кому-то, то и для них тоже будет запрещен доступ. Для наложения запрета на выполнение команд Transact-SQL также предназначена команда DENY: DENY{ALL
I statement[,...n]}
ТО
security_account[,...n]
Неявное отклонение доступа Мы рассмотрели два граничных состояния прав доступа: предоставление (GRANT) и запрещение (DENY). НО существует еще и третье состояние — неявное отклонение доступа (revoke access). Его можно также рассматривать, как отмену ранее
Глава 9. Система безопасности SQL Server 2000
259
выданных разрешений (как предоставления, так и отклонения доступа). Если ранее пользователю не было выдано никаких разрешений к объекту, то выполнять неявное отклонение доступа бессмысленно. Сразу же после создания в базе данных нового пользователя для него по умолчанию установлено неявное отклонение доступа ко всем объектам. Конечно, при создании пользователя ему можно сразу же предоставить комплект прав доступа, включив его в ту или иную роль базы данных, но мы рассмотрим ситуацию, когда этого не происходит. Неявное отклонение доступа (REVOKE) происходит, если для пользователя четко не указано разрешение или запрещение на доступ к объекту. Можно сказать, что неявное отклонение доступа — это отсутствие прав доступа или "среднее состояние" между запрещением и предоставлением доступа. Система безопасности SQL Server 2000 спроектирована таким образом, что пользователь сможет обратиться к данным только в том случае, если доступ был ему явно предоставлен и нет никаких запрещений на обращение к объекту. Неявное отклонение доступа можно представить как запрещение доступа на том уровне, на котором оно устанавливается. Ничто не мешает получить пользователю доступ на другом уровне системы безопасности. Например, если пользователю явно не было выдано разрешение на изменение данных в таблице и ему также не запрещено изменение данных, то для него установлено неявное отклонение доступа. Пользователь может получить доступ к объекту через членство в роли, имеющей необходимые права доступа. При этом предоставление пользователю разрешения неявного отклонения доступа может не лишить его доступа, а наоборот, предоставить его. Это происходит в случае, если пользователь имеет доступ к объекту как член роли базы данных, но как пользователю ему явно запрещен доступ к этому же объекту. В подобной ситуации применение неявного отклонения доступа для пользователя применительно к рассматриваемому объекту снимет запрет на доступ. Хотя собственно неявное отклонение доступа и не предоставило пользователю доступа к объекту, однако это позволило получить доступ через членство в роли базы данных. Чтобы установить неявное отклонение доступа для пользователя к тому или иному объекту базы данных, применяется команда REVOKE СО следующим синтаксисом: REVOKE [GRANT OPTION FOR] { ALL [ P R I V I L E G E S ] | p e r m i s s i o n
[,...n]
}
{
[( column [,...n] )] ON {table I view} I ON {table | view} [( column [,...n] )] I {stored_procedure I extended_procedure} } { TO | FROM } security_account [,...n] [CASCADE] [AS { group | role }]
260
Часть III. Администрирование
Как и для команды DENY, синтаксис команды REVOKE В большей части повторяет синтаксис команды GRANT, рассмотренной ранее в этой главе. Как и при запрещении доступа, при установлении неявного отклонения доступа также допускается каскадирование изменений на других пользователей. Единственным параметром команды
REVOKE, не использующимся для команд GRAND И DENY И
поэтому не рассмотренным ранее, является параметр GRANT OPTION FOR. Указание этого параметра позволяет лишить пользователя возможности выдавать другим пользователям разрешения на доступ к объекту. То есть ввод параметра GRANT OPTION FOR необходим, когда пользователю были предоставлены разрешения доступа с помощью параметра WITH GRANT OPTION.
Замечание Назначение параметра FROM аналогично назначению параметра т о . То есть после ключевого слова FROM должен указываться список пользователей и ролей базы данных, для которых должно быть установлено неявное отклонение доступа.
Неявно отклонить возможность выполнения команд Transact-SQL можно при помощи команды REVOKE СО следующим синтаксисом: REVOKE {ALL | statement[,...n]} FROM security_account[,...n]
Просмотр прав доступа При работе с Enterprise Manager довольно просто получить информацию о правах доступа пользователей и ролей к тем или иным объектам базы данных. Достаточно открыть окно свойств пользователя (роли) или объекта базы данных и нажать кнопку Permissions. Однако, иногда подобную информацию необходимо получить и средствами Transact-SQL. Для этого возможен запуск системной хранимой процедуры sp_heiprotect, имеющей синтаксис: sp_helprotect [[@name =] 'object_statement'] [, [@username =] 'security_account'] [, [@grantorname =] 'grantor'] [, [Spermissionarea =] 'type']
Замечание Право вызова, данной хранимой процедуры выдано фиксированной роли базы данных P u b l i c . Таким образом, каждый пользователь базы данных может получить информацию о правах доступа любого из пользователей текущей базы данных к произвольному объекту этой базы данных.
Рассмотрим назначение и использование параметров хранимой процедуры. П
[@name =]
'object_statement'
С помощью этого параметра указывается имя объекта базы данных, о правах доступа к которому предполагается получить информацию. Также с помощью данного параметра может быть указано право доступа на выполнение команд Transact-SQL:
Глава 9. Система безопасности SQL Server 2000 •
CREATE DATABASE;
•
CREATE DEFAULT;
•
CREATE FUNCTION;
•
CREATE PROCEDURE;
•
CREATE RULE;
•
CREATE TABLE;
•
CREATE VIEW;
•
BACKUP DATABASE;
•
BACKUP LOG.
261
Если параметр @name опускается или равен NULL, TO будет выведена информация о правах доступа ко всем объектам текущей базы данных. О
[Susername =]
'security_account'
Этот параметр предназначен для указания имени пользователя или роли, о правах которого требуется получить информацию. Если параметр опускается или равен NULL, TO будет выведена информация о правах доступа всех пользователей и ролей текущей базы данных. П
[ @grantorname =] ' g r a n t o r '
Помимо имен объектов и пользователей, можно также ввести имя пользователя, который выдал соответствующее разрешение доступа к объекту. Это должно быть имя пользователя или роли текущей базы данных. П
[@permissionarea =] ' t y p e '
С помощью данного параметра можно ограничить область охвата прав доступа, информация о которых будет выведена. Параметр может принимать следующие значения: •
' s ' — будет выведена информация только о правах на выполнение команд;
•
' о' — будет выведена информация только о правах доступа к объектам;
•
' o s ' — будет выведена информация как о правах доступа к объектам, так и о правах доступа на выполнение команд. Это значение используется по умолчанию.
В качестве иллюстрации использования хранимой процедуры sp_heiprotect получим сведения о правах доступа пользователей к таблице authors: USE pubs EXEC sp_helprotect
'authors'
Будет получен следующий результат: Owner
Object
Grantee
Grantor ProtectType Action
dbo dbo dbo
authors authors authors
guest guest guest
dbo dbo dbo
Grant Grant Grant
Delete Insert References
Column
(All+New)
262
Часть III. Администрирование
authors dbo authors dbo (5 row(s) affected)
guest guest
dbo dbo
Grant Grant
Select Update
(All+New) (All+New)
Как видно, информация выводится в нескольких столбцах. Рассмотрим их назначение: • Owner. В этом столбце указывается имя текущего владельца объекта. П objects. Имя объекта, о котором выводится информация. • Grantee. В этом столбце отображается имя пользователя или роли, которым выдано разрешение на доступ к соответствующему объекту. О Grantor. Имя пользователя или роли базы данных, который предоставил другому пользователю соответствующее право доступа. •
ProtectType. В данном столбце указывается тип разрешения, выданного пользователю.
• Action. Указывается тип действия, которое разрешено выполнять пользователю. П Column. Если разрешение выдано для определенного столбца таблицы, то будет выведено имя этого столбца. Если разрешение выдано для всех столбцов, то будет указано (All+New). Теперь же получим информацию о правах на выполнение команд, выданных пользователю guest: USE pubs sp_helprotect NULL, 'guest1, NULL, 's'
Будет получен следующий результат: Owner Object Grantee
Grantor ProtectType Action
guest guest guest guest guest (5 row(s) affected)
dbo dbo dbo dbo dbo
Grant Grant Grant Grant Grant
Create Create Create Create Create
Column Default Procedure . Rule Table View
Иерархия прав доступа В предыдущих разделах были рассмотрены все типы прав доступа в базах данных, их поведение и управление ими. В этом же разделе обсудим использование прав доступа при работе со множеством объектов. Ситуация, когда доступ предоставляется к самостоятельной таблице, достаточно проста. Если же необходимо предоставить доступ к представлению, обращающемуся к данным из разных таблиц, принадлежащих к тому же разным владельцам, то управление правами доступа существенно усложняется. При обращении пользователя к объектам базы данных, ссылающихся на другие объекты, выполняется проверка прав доступа не только для самого объекта, к которому непосредственно обращается пользователь, но также и к объектам, на
Глава 9. Система безопасности SQL Server 2000
263
которые тот ссылается. При этом система безопасности не выполняет проверку, если владельцем зависимых объектов является тот же пользователь, владеющий основным объектом, к которому обращается пользователь. Поясним сказанное на примере. Предположим, что пользователь L i l i y a создал в базе данных таблицу Tabiei. Потом он создает представление viewi, которое строится на основе таблицы Tabiei. Затем L i l i y a предоставляет пользователю John право на просмотр представления viewi. Пользователь John сможет успешно просматривать данные таблицы Tabiei через представление viewi, не имея прав на просмотр таблицы Tabiei.
Если же представление viewi было бы построено на основе таблицы таЫе2, принадлежащей пользователю Liss, то чтобы иметь возможность просматривать данные viewi, пользователь Liss должен выдать пользователю John соответствующие права доступа к таблице таЫе2. Аналогичная ситуация складывается при работе с хранимыми процедурами, обращающимися ко многим объектам базы данных, возможно принадлежащих разным пользователям. Если владелец хранимой процедуры предоставляет какому-то пользователю доступ к ней, то хранимая процедура будет автоматически иметь доступ ко всем объектам, владельцем которых является тот же пользователь, что и владелец хранимой процедуры. Если же на каком-то уровне выполняется обращение к объекту, которым владеет третий пользователь, то следует явно предоставить пользователю, выполняющему хранимую процедуру, необходимые права доступа. На рис. 9.18 приведен пример хранимой процедуры, обращающейся к различным объектам базы данных.
Рис. 9.18. Иерархия прав доступа
Пользователь Joe дает пользователю sue право на вызов хранимой процедуры Procedurei, владельцем которой он является. Система безопасности SQL Server 2000 выполнит проверку прав доступа пользователя Sue к объектам Procedurei, Procedure3, View2, Table2 И ТаЫеЗ. Проверка доступа К объектам Procedure2 и Tabiei не выполняется, т. к. владельцем соответствующих вышележащих объектов и объектов Procedure2 и Tabiei является один и тот же пользователь.
Глава 10
Административные задачи Большинство глав этой части имеют конкретную специализацию — система безопасности, резервное копирование, подсистема автоматизации, репликация и т. д. В данной главе рассмотрены темы, относящиеся непосредственно к администрированию SQL Server 2000, а также некоторые рекомендации по распределению обязанностей между персоналом. Задачи администрирования можно условно разделить на две части: • Администрирование собственно SQL Server 2000 подразумевает выполнение задач, имеющих отношение к работе всего сервера. Например, управление объемом оперативной памяти, используемой сервером, управление работой и настройками служб SQL Server 2000, предоставление пользователям доступа к серверу, резервное копирование системных баз данных, создание пользовательских баз данных и т. д. • Администрирование баз данных, существующих на сервере, включает отображение учетных записей в пользователей баз данных, создание ролей, пользовательских объектов базы данных, управление правами доступа пользователей к этим объектам, выполнение резервного копирования, управление размером базы и журнала транзакций и т. д. Администрирование сервера и баз данных имеет мало общих задач. Тем не менее, некоторые из них могут решаться как на уровне сервера, так и на уровне базы данных. Например, изменение размера и создание резервных копий базы данных способен выполнять как администратор сервера, так и администратор базы данных. (
Замечание
)
Далее, чтобы не было путаницы, в соответствии с ролями SO.L Server 2000 администратора сервера будем называть системным администратором.
В небольших организациях часто обязанности системного администратора и администратора баз данных совмещает один человек. Более того, нередко этот же человек выполняет и администрирование сети организации. С условием достаточно высокой квалификации администратора подобный подход является довольно эффективным, т. к. позволяет одному человеку быть в курсе всех проблем пользователей. К тому же, организации не требуется платить зарплату трем
Глава 10. Административные задачи
265
отдельным сотрудникам — администратору сети, системному администратору и администратору баз данных. Это также является немаловажным фактором. В крупных компаниях, имеющих сотни компьютеров и пользователей, административные задачи распределяются между персоналом. В упрощенном варианте это предполагает, что управление сетью осуществляется одним человеком, управление SQL Server 2000 — другим, а базами данных управляет третий. Однако на практике часто осуществляется более мелкое разделение обязанностей. Кроме того, у каждой базы данных может быть свой собственный администратор, а то и несколько.
Обязанности администратора Ранее уже было сказано, что администрирование SQL Server 2000 делится на администрирование собственно сервера и администрирование баз данных. В данной книге не рассматриваются вопросы администрирования операционной системы и управление настройками сети, т. к. это тема для отдельного издания. Тем не менее, в предыдущих главах были рассмотрены вопросы установки сетевых протоколов и управление пользователями Windows NT. В задачи администрирования сервера входит следующее: •
Инсталляция и обновление версий SQL Server. Администратор должен следить за выходом новых версий продукта, сервисных пакетов (Service Pack) и исправлений (Patches). Как и в любом другом продукте, в SQL Server могут иметься некоторые недоработки и ошибки в программном коде. По мере использования эти недочеты обнаруживаются и устраняются. Если недочеты несерьезны, то выпускается сервисный пакет, который обычно исправляет множество недочетов. Если же обнаруживается серьезная ошибка, то производитель выпускает исправление, или, как его еще называют, заплатку. Заплатка обычно предназначена для решения одной, но серьезной проблемы и выпускается гораздо оперативнее, чем сервисные пакеты. Например, когда в SQL Server 7.0 была обнаружена серьезная дыра в системе безопасности, то заплатка была выпущена в течении 2—3 дней и выложена на сайт Microsoft, откуда ее могли скачать все желающие. Все это сказано к тому, что администратор должен не только выполнять рутинную работу, но и быть в курсе вопросов безопасности. Будет печально, если злоумышленник узнает о дырах в защите раньше администратора и успеет воспользоваться ими.
П Запуск и останов служб SQL Server 2000. Со стороны SQL Server 2000 только члены фиксированных ролей sysadmin И serveradmin МОГут ВЫПОЛНЯТЬ запуск и останов служб сервера. В обычной ситуации останов служб не требуется. Службы SQL Server 2000 могут непрерывно работать на протяжении многих недель и месяцев. Тем не менее, останов служб может понадобиться для выполнение некоторых административных задач, например, перестроения системных баз данных, восстановления их резервных копий и некоторых других задач.
266
Часть III. Администрирование
П Конфигурирование связанных и удаленных серверов. Когда в сети имеется более одного сервера баз данных (не обязательно все они являются SQL Server 2000), то часто необходимо предоставить пользователям возможность обращаться к данным, хранящимся на этих серверах. Работа со связанными и удаленными серверами позволяет пользователям безболезненно обращаться к любому серверу сети. • Управление хранимыми процедурами, стартующими при запуске SQL Server 2000. Если при каждом старте службы MSSQLServer должны выполняться определенные задачи, то администратор может воспользоваться возможностью автоматического запуска хранимых процедур при запуске сервера. П Управление настройками служб SQL Server 2000. Одной из основных задач является контроль за параметрами работы служб. Это включает управление объемом оперативной памяти, используемой сервером, потоками, приоритетом, настройками по умолчанию для пользовательских соединений, конфигурирование почтовых профилей и многое другое. Подробно управление работой служб SQL Server 2000 с помощью Enterprise Manager было рассмотрено в главе 8. П Управление учетными записями. В задачи администрирования входит также создание учетных записей Windows NT и SQL Server, предоставление им доступа к SQL Server 2000. Часть этих вопросов рассматривалась в разд. "Подготовка учетных записей" главы 4. • Резервное копирование. Необходимо своевременно создавать резервные копии пользовательских и системных баз данных с помощью полных, дифференциальных копий, а также копий журнала транзакций. Резервное копирование позволит восстановить информацию даже в случае полного уничтожения сервера. Также нужно выполнять конфигурирование устройств резервного копирования, следить за носителями и т. д. Подробно резервное копирование будет рассматриваться в главе 13. П Создание и поддержание баз данных. Создание баз данных выполняется на уровне сервера. После этого администратор должен следить за размером баз данных и при необходимости увеличивать их размер или добавлять дополнительные файлы. В принципе, SQL Server 2000 может самостоятельно увеличивать размер базы данных. Помимо этого, данная категория задач также предполагает выполнение отсоединения и присоединения баз данных. П Осуществление мониторинга и оптимизации. Необходимо периодически анализировать работу SQL Server 2000 для поиска узких мест. Подобный анализ может помочь увеличить производительность сервера. Подробно мониторинг и оптимизация работы SQL Server 2000 будут рассмотрены в главе 17. Теперь же приведем список задач по управлению базами данных. П Создание объектов базы данных. Чаще всего выполняется предварительная разработка структуры базы данных, которая затем реализуется в виде набора объектов. Администратор базы данных должен выполнить создание таблиц,
Глава 10. Административные задачи
267
представлений, хранимых процедур, правил, умолчаний, ограничений целостности и т. д. • Управление пользователями и ролями. Прежде чем пользователи смогут работать с объектами базы данных, необходимо отобразить их учетные записи в пользователей баз данных. Для удобства управления могут создаваться пользовательские роли. • Предоставление доступа к объектам базы данных. После того, как в базе данных созданы объекты и пользователи, можно приступить к управлению разрешениями доступа пользователей к объектам базы данных. • Выполнение резервного копирования. Как уже говорилось, резервное копирование может выполняться как на уровне сервера, так и на уровне базы данных. Если системный администратор считает целесообразным, то выполнением резервного копирования пользовательских баз данных может заниматься администратор соответствующей базы данных. • Обеспечение целостности и достоверности данных. Периодически необходимо выполнять проверку целостности данных. В противном случае пользователи могут столкнуться с различными проблемами при работе с данными. П Перестроение индексов и обновление статистики. Часто с течением времени данные в таблицах претерпевают изменения и степень заполнения как индексных, так и страниц данных способна увеличиться. Это может стать причиной низкой производительности операций добавления и изменения данных. Тогда необходимо выполнить перестроение индексов. Кроме того, если отключено автоматическое обновление статистики, то также рекомендуется периодически выполнять обновление статистики вручную. • Создание ролей приложения. Если предполагается, что для доступа к базе данных будет использоваться специальное приложение, то для удобства и обеспечения дополнительной безопасности можно использовать роли приложения. Это позволит предоставить права доступа только этой роли, не предоставляя доступа непосредственно пользователям, которые будут работать с приложением. • Выполнение мониторинга запросов. Если некоторые запросы или хранимые процедуры выполняются слишком долго, то следует провести анализ хода выполнения запроса. Может оказаться, что последовательность обращения запроса или процедуры к объектам базы данных приводит к появлению конфликтов доступа и длительному ожиданию освобождения нужных ресурсов. Выходом из ситуации может явиться изменение запроса. Приведенные списки задач администраторов сервера и баз данных, конечно же, не исчерпывают всех задач. Однако данный перечень позволяет судить о нагрузке на администраторов. До сих пор, когда мы говорили об администрировании, предполагалось, что все задачи выполняет один человек. То есть и администрирование сервера, и администрирование базы данных осуществляет один человек. Однако такой подход практикуется только на небольших и малых предприятиях. В больших компани-
268
Часть III. Администрирование
ях обычно задачи администрирования распределяются между несколькими людьми — операторами. Каждый из операторов выполняет свою часть задач. Например, может быть оператор резервного копирования, оператор управления базами данных и т. д.
В SQL Server 2000 существует набор ролей, которые могут быть использованы для предоставления пользователям того или иного права. Другим способом предоставить права на выполнение административных задач нельзя. Для предоставления прав на выполнение административных задач используются фиксированные роли, которые имеются как на уровне сервера, так и на уровне базы данных. Их список и назначение были приведены в главе 9.
Управление серверами и группами Для обеспечения работы SQL Server 2000 необходимо сконфигурировать множество различных параметров. Настройка всех этих параметров требует специальных знаний и высокой квалификации. К счастью, в SQL Server 2000 имеются довольно мощные механизмы динамической настройки параметров конфигурации сервера, что позволяет избавить администратора от необходимости постоянно следить за работой сервера и вносить те или иные изменения в параметры конфигурации. Специальная подсистема SQL Server 2000 собирает информацию о работе как SQL Server 2000, так и о работе операционной системы. На основе полученной информации принимается решение об использовании или освобождении тех или иных ресурсов. Администратору достаточно лишь разрешить автоматическое конфигурирование сервера. Мастер установки самостоятельно разрешает автоматическое конфигурирование сервера. Однако при необходимости системный администратор может использовать ручное управление теми или иными параметрами. Кроме того, может понадобиться изменить значения некоторых опций, не поддерживающих автоматическое конфигурирование. Например, администратор может установить для процессов SQL Server 2000 высокий приоритет (13), т. к. во время установки назначается нормальный приоритет (7). Однако параметры настройки сервера конфигурируются в процессе установки оптимальным образом, и изменение их значений практически не требуется. Тем не менее, для профессиональной работы необходимо понимать назначение тех или иных параметров и знать, какое действие на работу сервера окажет установка параметра в то или иное состояние. Подробно конфигурирование служб SQL Server 2000 было рассмотрено в главе 8. Если в вашей организации имеется всего один SQL Server 2000, то сразу же после его установки можно использовать Enterprise Manager для управления им. Однако если предполагается управление с одного рабочего места множеством серверов, то потребуется выполнить некоторые дополнительные действия по регистрации серверов. Дело в том, что прежде чем Enterprise Manager сможет быть использован
Глава 10. Административные задачи
269
для управления SQL Server 2000, необходимо зарегистрировать этот сервер. Только после этого сервер появится в панели Enterprise Manager, и администратор сможет управлять им. К тому же, если предполагается выполнение распределенных запросов, обращающихся к данным на различных серверах, то потребуется конфигурирование связанных (linked) или удаленных (remote) серверов. Следующие разделы будут посвящены регистрации сервера в Enterprise Manager, а также конфигурированию связанных и удаленных серверов.
Регистрация сервера Как уже было сказано, прежде чем можно будет использовать Enterprise Manager для управления параметрами работы SQL Server 2000, а также имеющимися на сервере базами данных, необходимо зарегистрировать соответствующий сервер. Мастер установки автоматически выполняет регистрацию устанавливаемого сервера, поэтому сразу же после инсталляции администратор может приступить к управлению сервером. Однако, чтобы иметь возможность контролировать удаленные сервера, необходимо их зарегистрировать. При регистрации сервера требуется указать следующую информацию: •
полное имя инсталляции, т. е. с указанием имени компьютера в сети;
•
имя группы серверов, в которую будет включен регистрируемый Server 2000;
SQL
• тип аутентификации, который будет применяться для подключения Enterprise Manager к указанному серверу; •
при назначении аутентификации SQL Server также необходимо ввести имя и пароль учетной записи SQL Server, которая будет использоваться для установки соединения.
Регистрацию сервера можно выполнять различными способами. •
С помощью окна Registed SQL Server Properties. Метод предполагает использование интерфейса Enterprise Manager и является самым быстрым способом регистрации сервера с нужными параметрами.
•
С помощью мастера Register SQL Server Wizard. Метод является наиболее простым, однако некоторым может показаться слишком длинным. Замечание С помощью Enterprise Manager, устанавливаемого при инсталляции SQL Server 2000, можно управлять и серверами SQL Server 7.0. Регистрация SQL Server 7.0 выполняется аналогично регистрации серверов SQL Server 2000.
Сначала рассмотрим регистрацию сервера с помощью окна Registered SQL Server Properties. Для вызова этого окна необходимо выделить в панели Enterprise Manager одну из имеющихся групп серверов и в ее контекстном меню выбрать команду New SQL Server Registration. В ответ откроется диалоговое окно Registered SQL Server Properties (рис. 10.1), с помощью которого и выполня-
Часть III. Администрирование
270
ется регистрация сервера. Другой способ открытия этого окна предполагает использование контекстного меню одного из серверов, в котором также необходимо указать команду New SQL Server Registration. ill
Registered SQL Server Properties Genet al
4 V -erver |5TORAGE\SQL_5ERVER_2000 -| |Q| Connection •(* Use Windows NT authentication f" Use SQL Server authentication Login Name: | Password f™ Г Options SetverGroup:
jitjjSQL Server Gioup
•[ ••-|
C© f? display SQL Server state in console W Show system databases and system objects 17 Automatically start SQL Server when connecting OK
Cancel
Help
Рис. 10.1. Окно Registered SQL Server Properties
В раскрывающемся списке Server выбирается имя сервера SQL Server 2000 или SQL Server 7.0, который предполагается зарегистрировать. Если необходимо зарегистрировать инсталляцию по умолчанию, то достаточно указать только сетевое имя NetBIOS компьютера, на котором установлен регистрируемый SQL Server 2000. Когда же выполняется регистрация именованной инсталляция, то помимо имени компьютера необходимо указать имя инсталляции в формате имя_сервера\имя_инсталляции. Если вы не помните имя SQL Server 2000, который предполагается зарегистрировать, то можно воспользоваться средствами поиска серверов в каталоге Active Directory. Для этого предназначено окно SQL Active Directory Search (рис. 10.2), вызвать которое можно с помощью кнопки • I, расположенной справа от списка Server. Раскрывающийся список In недоступен и интереса не представляет. В поле Name можно указать известную часть имени SQL Server 2000, который предполагается зарегистрировать. Однако допускается вводить только первую часть. Использование символов шаблона1 не поддерживается. Если поле Name остается пустым, то в поиске будут участвовать все сервера, независимо от имени. До1
К символам шаблона, которые используются при поиске файлов, папок и ресурсов, относится знак вопроса (?) и звездочка (*). — Ред.
Глава 10. Административные задачи
271
полнительно можно ограничиться конкретной версией. Для этого в раскрывающемся списке Version необходимо выбрать номер нужной версии — 7.0 или 8.0 (SQL Server 2000). Если поле Version останется пустым, то в результат поиска будут включены все серверы независимо от версии. После того как критерии поиска будут заданы, остается только нажать кнопку Find Now. Список найденных серверов выводится в нижней части окна. Дважды щелкнув на любом из серверов, можно перенести его имя в раскрывающийся список Server. SQL Active Directory Search File Ve i w Help :
Q
j matrix.khsu.khakasnet.ru
Seivet J Advanced |
Find Now
Name: Version:
Stop
j
Clear All
Database: Г? Include non-active directory servers into search OK Version Name gJSTORAGE 7.00 У STORAGE\SQL_SERV... 8.00
J Bui[d 623 100
1 Is Clustered No No
J .Last I
1
.11
Рис. 10.2. Окно SQL Active Directory Search
Замечание Серверы SQL Server, работающие под управлением операционной системы Windows 95/98, не находятся при поиске. Это вызвано ограничениями операционной системы. Поэтому при выполнении регистрации серверов, работающих под управлением Windows 95/98, необходимо знать имя компьютера и инсталляции (для именованной инсталляции). Кроме того, не будут найдены SQL Server, запущенные как приложения. Для регистрации таких серверов также необходимо знать имя компьютера и инсталляции. В разделе Connections (см. рис. 10.1) указывается тип аутентификации, который будет использовать Enterprise Manager для подключения к регистрируемому SQL Server 2000. Тип аутентификации выбирается с помощью переключателя, который может быть установлен в одно из двух следующих положений: • Use Windows NT authentication. Будет использоваться аутентификация Windows NT. В этом случае пользователь не должен будет указывать никаких 10 Зак. 83
272
Часть III. Администрирование
дополнительных сведений для подключения к серверу — ему достаточно зарегистрироваться в домене. • Use SQL Server authentication. В этом случае будет использоваться аутентификация SQL Server и пользователь для установления соединения с сервером обязан указывать имя учетной записи и ее пароль. При установке переключателя в это положение становятся активными дополнительные элементы управления: • поле Login Name — имя учетной записи, которая участвует в установлении соединения. Должна указываться учетная запись, созданная на регистрируемом сервере; • поле Password — пароль учетной записи; • флажок Always prompt for login name and password. Когда он сброшен, необходимо ввести как имя, так и пароль учетной записи. Введенная информация сохраняется в реестре и при запуске Enterprise Manager пользователь сразу же получает возможность работать с сервером. Когда же флажок установлен, то при первой попытке обращения к серверу Enterprise Manager появится окно с предложением ввести имя и пароль учетной записи, которые будут использоваться для установления соединения. При помеченном флажке поле Password становится недоступным, хотя в поле Login Name можно ввести имя учетной записи, которое будет выводится в качестве значения по умолчанию при установлении соединения. Замечание Если вы обладаете правом доступа к конфиденциальной информации, при использовании аутентификации SQL Server рекомендуется всегда устанавливать флажок Always prompt for login name and password. Это позволит обеспечить более высокий уровень безопасности. Защита пароля при хранении его в реестре оставляет желать лучшего. В SQL Server 7.0 пароль при хранении в реестре шифровался с помощью операции исключающего ИЛИ (XOR). Данный метод шифрования легко взламывается. Хотя и можно было обеспечить более высокую степень защиты, установив специальную заплатку (patch), все же сохранение пароля само по себе является небезопасным.
После того, как будет выбран тип аутентификации, можно изменить некоторые параметры работы Enterprise Manager с регистрируемым сервером. Для этого используется группа параметров Options. • Server Group. С помощью этого раскрывающегося списка выбирается группа, в которую будет помещен регистрируемый сервер. Размещение сервера в той или иной группе не имеет особого значения. Единственное назначение группы — объединение серверов для удобства работы с ними. Если ее структура достаточно сложна, то для выбора нужной группы можно воспользоваться окном Server Groups (рис. 10.3), которое можно открыть с помощью кнопки .... J, расположенной справа от списка Server Group. Это же окно может быть использовано для создания новой группы. Допускается организация вложенных групп.
Глава 10. Административные задачи
273
Замечание Обычно все серверы располагаются в одной группе. Редко в какой компании потребуется создание более двух-трех групп. И уж совсем редко кто организует вложенные группы. Даже такая огромная компания как Microsoft использует порядка 50—60 серверов SQL Server, а для размещения такого количества серверов достаточно групп первого уровня. П Display SQL Server state in console. Установка этого флажка позволяет отображать состояние регистрируемого сервера в консоли Enterprise Manager. Для этого Enterprise Manager будет периодически опрашивать состояние сервера и при его изменении соответствующим образом модифицировать значок сервера. •
Show system databases and system objects. В каждой базе данных имеется набор системных таблиц, используемых для хранения информации о пользовательских объектах, самих пользователях, дополнительных файлах базы данных, файлах журнала транзакций и другой системной информации. Кроме того, существует ряд других объектов, используемых для системных целей (например, хранимые процедуры, триггеры). Если вы хотите, чтобы эти объекты отображались в панели Enterprise Manager, то необходимо установить рассматриваемый флажок. Если же работа с системными объектами не предполагается и они только мешают, то лучше будет сбросить флажок. При этом из панели Enterprise Manager будут также исключены и системные базы данных.
• Automatically start SQL Server when connecting. Установка этого флажка позволяет автоматически выполнять запуск остановленного SQL Server 2000 при попытке установления соединения с ним.
Server Groups General Name:
Level:
t Top level group (* Sub-group of: E 1_J SQL Server Group
Cancel
Help
Рис. 10.3. Окно Server Groups
Замечание Рекомендуется разрешать отображение состояния сервера в консоли Enterprise Manager, а также разрешать автоматический запуск сервера при обращении к нему. Однако не советуют разрешать отображение системных объектов и баз данных в
274
Часть III. Администрирование консоли Enterprise Manager, т. к. обычно прямая работа с системными объектами не ведется и они только мешают.
На этом конфигурирование параметров регистрации сервера заканчивается. Остается только нажать кнопку ОК, после чего Enterprise Manager попытается подключиться к регистрируемому серверу. Однако, если сервер не удалось найти, то Enterprise Manager выдаст соответствующее сообщение и спросит, выполнять ли регистрацию сервера не смотря на то, что он не найден. Сервер может быть не найден из-за своей остановки. В этом случае можно разрешить выполнить регистрацию. Однако, если сервер запущен и все равно не найден, то следует проверить, не содержит ли значение в раскрывающемся списке Server ошибки. Кроме того, сервер может быть не найден, если на компьютере, с которого выполняется регистрация, используются иные сетевые библиотеки и протоколы, чем на регистрируемом сервере. (
Замечание
. ^
Если сервер зарегистрирован с использованием аутентификации Windows NT, а для пользователя не создано учетной записи на SQL Server, то будет выдано сообщение об ошибке "Login failed" (ошибка учетной записи). Аналогичное сообщение будет выдано, когда используется аутентификация SQL Server и указано некорректное имя пользователя или пароль.
Мы рассмотрели выполнение регистрации сервера с использованием окна Registered SQL Server Properties. Теперь же разберемся в выполнении регистрации с помощью мастера Register SQL Server Wizard. Для его вызова необходимо в панели инструментов Enterprise Manager нажать кнопку Run a Wizard, а затем в открывшемся диалоговом окне выбрать пункт Register Server Wizard и нажать кнопку ОК. После этого будет запущен мастер. Первое окно мастера (рис. 10.4) содержит общую информацию о шагах регистрации сервера. Интерес представляет только флажок From now on, I want to perform this task without using a wizard. Его установка позволяет выполнять такую простую операцию, как регистрация сервера, не с помощью мастера, а с помощью окна Registed SQL Server Properties, и нажатие кнопки Next приведет не к появлению второго окна мастера, а к завершению его работы и открытию окна Registered SQL Server Properties, с помощью которого и будет предложено выполнить регистрацию. Однако этот способ уже был рассмотрен, поэтому мы сбросим флажок From now on, I want to perform this task without using a wizard и выполним регистрацию с помощью мастера. Во втором окне мастера (рис. 10.5) необходимо ввести имя регистрируемого сервера. Как видно из рисунка, окно разделено на две части. В левой приведен список серверов (Available servers), найденных в сети и не зарегистрированных ранее. Если имени нужного сервера нет в списке, то его можно ввести вручную с помощью поля над списком. Правая часть окна содержит список Added servers, в который с помощью кнопки Add необходимо добавить имена предполагаемых регистрируемых серверов. В список можно добавить несколько серверов. То есть мастер позволяет выполнять одновременную регистрацию множест-
Глава 10. Административные задачи
275
ва серверов. Если какой-то сервер был добавлен ошибочно, то его имя можно удалить с помощью кнопки Remove.
Register SQL Server Wizard Welcome to the Register SQL Server Wizard This wizard hep l s you register one or more SQL Servers. With this wizard you wil: • Select a SQL Server. • Select an authentication mode. Specfiy a SQL Server group. From now on, I want to perform this task without iusing a wizard.
Next>
Cancel
Рис. 10.4. Первое окно мастера Register SQL Server Wizard
2<J
Register SQL Server Wizard Select a SQL Server Select or type the name of one or more servers in the Available servers box. Available servers:
Added servers:
DM
Next>
Рис. 10.5. Второе окно мастера Register SQL Server Wizard
Cancel
276
Часть III. Администрирование
Замечание Мастер не найдет те SQL Server, которые работают под управлением операционной системы Windows 95/98, а также серверы, запущенные как приложение. Для регистрации таких серверов необходимо вручную указать их имя.
Когда все серверы будут добавлены, можно перейти к следующему окну. Третье окно мастера (рис. 10.6) предназначено для выбора типа аутентификации, который будет использоваться для подключения Enterprise Manager к указанному серверу. Выбор типа аутентификации осуществляется с помощью одного из переключателей Connect using. При выборе аутентификации SQL Server необходимо указать имя и пароль учетной записи, которая будет участвовать в установлении соединения. Register SQL Server Wizard Select an Authentication Mode Select the authentication mode that you use to connect to SQL Server.
i
Connect using: j~ |the Windows NT account information 1 use to log on to mji computer; ^Windows NT Authentication] /-.The SQL Server login information that was assigned to me by the system administrator [SQL Server Authentication]
< Back
Next >
Cancel
Рис. 10.6. Третье окно мастера Register SQL Server Wizard
В четвертом окне мастера (рис. 10.7) указываются имя (Login name) и пароль (Password) учетной записи SQL Server, которые будут использованы для установления соединения с регистрируемым сервером. Указанные значения будут подставляться автоматически. Данные об имени и пароле учетной записи запишутся в реестр. Если вы предпочитаете обезопасить себя, установите переключатель в положение Prompt for the SQL Server account information when connecting. В этом случае поля Login name и Password становятся неактивными, а пользователь должен будет вводить имя и пароль в Enterprise Manager каждый раз, когда происходит установление соединения с сервером.
Глава 10. Административные задачи
277
Register SQL Server Wizard Select Connection Option When you connect using SQL Server account information you can store your login name and password or provide it each time you connect. С Login automatically using my SQL Server account information.
(* [Prompt for the SQL Server account information when connecting.!
< Back
Next >
Cancel
Рис. 10.7. Четвертое окно мастера Register SQL Server Wizard
Замечание При использовании аутентификации Windows NT четвертое окно не выводится и пользователь сразу же попадает в пятое окно.
В пятом окне (рис. 10.8) необходимо выбрать группу включения регистрируемого сервера. Если требуется добавить сервер в одну из имеющихся ранее групп, то необходимо установить переключатель в положение Add the SQL Server(s) to an existing SQL Server group и выбрать в раскрывающемся списке Group name имя нужной группы. Если же необходимо создать новую группу и включить в нее сервер, то следует установить переключатель в положение Create a new top-level SQL Server group и в поле Group name указать имя новой группы. После завершения работы мастера окажется созданной новая группа самого верхнего уровня, и все регистрируемые серверы будут включены в нее.
С
Замечание
Средствами мастера Register SQL Server Wizard нельзя создать вложенную группу.
На этом регистрация сервера заканчивается. Последнее окно мастера (рис. 10.9) содержит сводную информацию о параметрах, указанных на предыдущих шагах. После нажатия кнопки Finish работа мастера заканчивается, и все введенные параметры будут применены.
Часть III. Администрирование
278
Замечание Как видно, мастер позволяет конфигурировать не все параметры регистрации сервера. В частности, нельзя управлять разрешением отображения системных объектов и баз данных, автоматического запуска остановленного сервера при попытке соединения и просмотром состояния сервера в консоли Enterprise Manager. J*J
Register SQL Server Wizard Select SQL Seiver Group Specify whether you want to add the SQL Server(s) you are registering to the default SQL Server group, another existing group, or a new SQL Server group. (• J^dd the SQL Seiver(s) to name:
Server group;
fjMATRIX Group
<"• Create a new top-level SQL Server group
< Back
Next>
Cancel
Рис. 10.8. Пятое окно мастера Register SQL Server Wizard 2<J
Register SQL Server Wizard Completing the Register SQL Server Wizard
The SQL Server(s) you are registering is shown below. It may take several minutes for the wizard to connect and verify that the server exists and the connection information is valid.
LIT
Finish
]
Cancel
Рис. 10.9. Последнее окно мастера Register SQL Server Wizard
Глава 10. Административные задачи
279
Управление группами Если ваша организация имеет множество SQL Server 2000, то поиск нужного сервера в панели Enterprise Manager будет затруднителен. Для упрощения управления серверами сети и создания иерархических структур Enterprise Manager позволяет объединять серверы в группы. Каждая группа может включать не только серверы, но и другие группы. Подобный подход можно сравнить с организацией размещения файлов на диске — каждый файл хранится в каталоге, однако любой каталог может содержать не только файлы, но и другие каталоги. Таким образом можно создавать довольно сложные иерархические группы, способные отобразить структуру любого предприятия.
Замечание Группы серверов Enterprise Manager не являются объектами базы данных или SQL Server 2000. Понятие групп, используемых для объединения серверов, существует только на уровне Enterprise Manager. Даже два пользователя, работающих на одном и том же компьютере, могут иметь разную структуру групп и количество зарегистрированных серверов. Управление группами включает в себя создание новых, переименование и удаление имеющихся групп. Создание новой группы выполняется с помощью окна Server Groups (рис. 10.10), которое позволяет просмотреть имеющююся структуру групп.
2<J
Server Groups General j У
щ hlame:
[Format
Level: *"" Jop level group (* Sub-group of: : Щ MATRIX Group В i j SQLServer Group t j Quins
OK
Cancel
Help
Рис. 10.10. Окно Server Groups
Имя создаваемой группы указывается в поле Name. Помимо имени необходимо указать, в какое место имеющейся структуры будет добавлена новая группа. Если один из переключателей Level установлен в положение Top level group, то новая группа будет создана на самом верхнем уровне иерархии, т. е. непосредственно в корневом элементе Console Root. Если требуется создать вложенную группу, то следует установить переключатель в положение Sub-group of. После этого в нижней части окна станет доступным дерево групп, в котором и нужно
280
Часть III. Администрирование
выбрать элемент, в котором будет создана группа с указанным именем. После того, как все будет готово, остается только нажать кнопку ОК. Для удаления ненужной группы достаточно в ее контекстном меню выбрать команду Delete. Однако следует учесть, что Enterprise Manager не удаляет автоматически содержимое группы, поэтому, прежде чем избавиться от группы, требуется предварительно изъять из нее все подгруппы и серверы. Иначе при попытке удаления будет выдано сообщение об ошибке. Замечание Enterprise Manager не поддерживает перетаскивания серверов и групп. Поэтому, чтобы изменить местоположение одного из серверов в иерархии групп, потребуется удалить сервер из старой группы и зарегистрировать его в новой.
Для изменения имени группы предназначено окно Rename Server Group (рис. 10.11), вызвать которое можно, выбрав команду Rename SQL Server Group в контекстном меню этой группы. Для изменения имени достаточно ввести в поле Rename the server group to новое значение и нажать кнопку ОК.
Rename the server group to: jMATRIX Group
С2ЖГ™31
Cancel 1
Рис. 10.11. Окно Rename Server Group для группы MATRIX
Связанные серверы Если в вашей сети имеется лишь один источник данных (data source) — SQL Server 2000, то обращение к данным выполняется достаточно просто. В одном запросе пользователи могут обращаться к данным, расположенным в различных базах. Требуется лишь указать в запросе имя нужной базы данных. Когда же сеть содержит множество источников данных, то проблема несколько усложняется. Если же эти источники еще и не являются SQL Server 2000, то задача становится еще более сложной. Обращение к распределенным гетерогенным источникам данных в SQL Server 2000 выполняется с помощью технологии OLE DB, позволяющей обращаться как к реляционным, так и к нереляционным источникам данных. Однако, чтобы иметь возможность обратиться к конкретному источнику данных, необходимо иметь специального поставщика OLE DB (OLE DB Provider). Поставщик служит своего рода шлюзом между SQL Server 2000 и внешним источником данных, выполняя преобразование команд и данных из формата SQL Server 2000 в формат источника данных и наоборот. Для доступа к разным типам источников данных следует иметь различных поставщиков OLE DB.
Глава 10. Административные задачи
281
Поставщик OLE DB является своего рода драйвером, позволяющим обращаться к источнику данных определенного типа с использованием единых интерфейсов и функций OLE DB. Это обеспечивает пользователям единый интерфейс для работы с самыми различными источниками данных. Такой механизм несколько напоминает работу с ODBC, однако технология OLE DB предлагает гораздо большие возможности по доступу к данных. В составе SQL Server 2000 существует набор поставщиков, предоставляющих возможность обращаться к большинству современных источников данных, таким как Oracle. DB2, ADSI, ODBC, Exchange и другим. Однако, чтобы иметь возможность работать с данными на удаленном источнике, необходимо указать, какой поставщик будет использоваться, размещение источника, каталог и некоторые другие параметры. Эти параметры позволяют идентифицировать данные, к которым следует обратиться, и которые должны указываться при каждом подключении к внешнему источнику данных. Но необходимость указания этих данных при каждом подключении может быть весьма обременительной. Чтобы избежать этого, SQL Server 2000 предлагает использовать так называемые связанные серверы (linked servers). Связанный сервер представляет собой запись в системной таблице s y s s e r v e r s базы данных Master. Для каждого связанного сервера указывается используемый поставщик OLE DB, имя источника данных, его размещение, строка для установления соединения, каталог (например, имя базы данных), имя компьютера сети, сопоставление и некоторая другая информация. Замечание В таблице sysservers помимо информации о связанных серверах хранится информация о всех других серверах, используемых локальным SQL Server 2000: информация об издателях, подписчиках, дистрибьюторах, с которыми работает локальный сервер, сведения об удаленных серверах, а также информация и о самом локальном SQL Server 2000. Когда пользователь в распределенном запросе указывает имя не текущего сервера, SQL Server 2000 обращается к таблице sysservers для поиска указанного сервера. В случае обнаружения нужной строки из таблицы считывается информация о конфигурации связанного сервера. После этого устанавливается соединение с помощью поставщика OLE DB, указанного при настройке связанного сервера, и начинается выполнение распределенного запроса. После того, как будет определен связанный сервер, станет возможным выполнение удаленных (remote query) и распределенных запросов (distributed query), обращающихся к различным источникам данных. Также пользователи смогут выполнять хранимые процедуры, расположенные на удаленных серверах, и принимать результат, возвращаемый по выполнении этих хранимых процедур. Например, станет возможным выполнение такого запроса: SELECT title FROM storage.pubs..titleauthor as ta, [storage\trelon].pubs.dbo.authors as a, pubs..titles as t WHERE ta.au_id = a.au_id AND t.title_id=ta.title_id AND a.state = 'CA'
282
Часть III. Администрирование
Для одного источника данных может быть создано несколько связанных серверов с различными параметрами. Это часто применяется при работе с несколькими базами данных одного сервера. При конфигурировании связанного сервера необходимо указать каталог, в котором будет осуществляться работа. Для серверов баз данных имя каталога является ничем иным, как именем базы данных. Таким образом, связанный сервер ограничивает область работы единственной базой данных. Чтобы получить доступ к другой базе данных, необходимо определить дополнительный связанный сервер. Для обращения к любому внешнему источнику данных помимо локального SQL Server 2000 требуется конфигурирование связанного сервера. Это касается и именованных инсталляций, установленных на том же компьютере, что и используемый SQL Server 2000. Строго говоря, локальный SQL Server 2000 также сконфигурирован как связанный сервер и для него имеется соответствующая запись в таблице sysservers. Однако все SQL Server 2000, установленные на локальном компьютере, регистрируются автоматически. До тех пор, пока не будет сконфигурирован связанный сервер, пользователи не смогут обратиться к соответствующему источнику данных. Конфигурирование связанных серверов могут выполнять только члены фиксированных ролей сервера sysadmin и setupadmin. Таким образом, доступ всех пользователей к внешним источникам данных контролируется администратором сервера централизованно. (
Замечание
j
В SQL Server 2000 существует еще один механизм взаимодействия с внешними источниками данных — удаленные серверы (remote servers). Однако эта технология позволяет работать только с серверами SQL Server 2000 и SQL Server 7.0. Можно сказать, что удаленные серверы являются частным случаем связанных серверов. Удаленные серверы будут рассмотрены далее в этой главе. Тем не менее, для обращения к другим источникам данных все же требуется использование связанных серверов. Помимо этого, можно непосредственно обращаться к источникам данных с использованием команд OPENDATASOURCE И OPENROWSET.
Помимо указания параметров соединения, следует также учесть требования системы безопасности внешнего источника данных. Практически все современные средства хранения и обработки данных имеют довольно мощную систему безопасности для разграничения доступа пользователей к существующей информации. Поэтому при установлении доступа со связанным сервером необходимо каким-то образом зарегистрироваться в удаленной системе. Обычно для этого указывается имя учетной записи и ее пароль на связанном сервере. SQL Server 2000 позволяет для каждой локальной учетной записи использовать отдельную учетную записи на удаленном источнике данных. Хотя допускается и отображение всех учетных записей локального SQL Server 2000 в одну и ту же учетную запись удаленного компьютера. (
Замечание
J
Если пользователи активно работают с распределенными запросами, то следует убедиться, что им предоставлены достаточные права на связанных серверах.
Глава 10. Административные задачи
283
Регистрацию, а также последующее управление связанными серверами можно выполнять двумя способами: G средствами Transact-SQL с помощью системных хранимых процедур; •
средствами Enterprise Manager.
В следующих разделах будет подробно рассмотрено управление связанными серверами обоими методами.
Использование Transact-SQL Первое, что выполняется при конфигурировании связанного сервера — это его регистрация. Как уже было сказано, информация о связанных серверах хранится в системной таблице sysservers. В принципе, регистрация сервера (как и любая другая операция управления связанными серверами) может быть выполнена с помощью команды INSERT. Таким способом можно добавить новую строку в таблицу с нужными данными. Однако данный метод требует точного знания назначения всех столбцов таблицы и поведения сервера в зависимости от того или иного значения. Даже небольшая ошибка может привести к неправильной интерпретации данных сервером, и, как следствие, невозможности обращения к удаленному источнику данных. Лучшим решением будет использование системных хранимых процедур, специально предназначенных для выполнения тех или иных административных задач. Эти процедуры выполняют множество различных проверок и гарантируют, что операция будет выполнена корректно.
Регистрация связанного сервера Регистрация связанного сервера выполняется с помощью хранимой процедуры sp_addiinkedserver, имеющей синтаксис: sp_addlinkedserver [Sserver =] 'server' [, [Qsrvproduct =] 'product_name'] [, [@provider =] 'provider_name'] [, [Sdatasrc =] 'data_source'] [, [@location =] 'location'] [, [@provstr =] 'provider_string'] [, [Scatalog =] 'catalog']
Замечание Конкретный смысл каждого из параметров может отличаться для различных источников данных. Более того, не каждый из источников данных требует определения всех параметров. То есть при использовании различных поставщиков список и назначение параметров могут значительно меняться. Замечание Пользователи не смогут выполнять удаленных запросов к только что добавленному связанному серверу. Дело в том, что по умолчанию доступ к связанному серверу не
284
Часть III. Администрирование разрешен. Для разрешения доступа необходимо выполнить s p _ s e r v e r o p t i o n ' S e r v e r N a m e ' , ' d a t a a c c e s s ' , 'TRUE'.
команду
EXEC
Рассмотрим назначение и использование каждого из параметров: П1 [@server =]
'server'
С помощью этого параметра указывается имя, которое будет присвоено конфигурируемому связанному серверу. Можно сказать, что конфигурируемому набору данных будет присвоено имя, указанное с помощью рассматриваемого параметра. К параметру @server предъявляется требование уникальности в пределах сервера. То есть не должно быть связанного сервера с аналогичным именем. Параметр имеет тип данных sysname, значение по умолчанию не определено. (
Замечание
^
Параметр g s e r v e r задает имя связанного сервера, которое будут использовать пользователи в распределенных запросах. Хотя рекомендуется указывать в качестве имени связанного сервера имя источника данных (например, имя сервера сети), но в принципе, может быть указано любое имя. Более того, при конфигурировании двух и более связанных серверов, ссылающихся на один источник данных, обязательно придется использовать имена, отличающиеся от имени источника данных. П
[@srvproduct =] 'product_name'
С помощью данного параметра указывается имя продукта, который используется на конфигурируемом сервере. В принципе, этот параметр не имеет особого значения и может быть опущен. Если в качестве удаленного сервера конфигурируется Microsoft SQL Server, то значение параметра должно быть равно 'SQL s e r v e r ' . В этом случае не нужно указывать поставщика (@provider), источник данных (@datasrc), размещение (eiocation), строку для установления соединением (@provstr), а также имя каталога (@catalog). Однако параметр @server должен однозначно идентифицировать SQL Server 2000 в сети, а при конфигурировании связанного сервера для именованной инсталляции содержать и имя инсталляции. Параметр имеет тип данных nvarchar (128), значение по умолчанию — NULL. О
[@provider =] 'provider_name'
Указанный параметр определяет идентификационный номер поставщика OLE DB, который будет использоваться для работы с конфигурируемым удаленным сервером. Каждый поставщик имеет уникальный идентификационный номер. Прежде чем станет возможным использование того или иного поставщика, он должен быть установлен на локальный компьютер. В табл. 10.] приведен список поставщиков, устанавливаемых при инсталляции SQL Server 2000. Параметр @provider имеет тип данных nvarchar (128), значение по умолчанию — NULL.
Глава 10. Административные задачи
285
Замечание Информация об установленных поставщиках хранится в различных местах реестра. Просмотреть список имен поставщиков можно в ключе реестра HKEY_CURRENT_ USER\Software\ Microsoft\Microsoft SQL Server\80\DTS\ Enumeration\OLEDBProviders. Таблица 10.1. Поставщики, устанавливаемые с SQL Server
2000
Полное название
Значение параметра @provider
Описание
Microsoft OLE DB Provider for SQL Server
SQLOLEDB
Поставщик для SQL Server
Microsoft OLE DB Provider for DTS Packages
DTSPackageDSO
Поставщик, предназначенный для доступа к пакетам DTS
SQL Server Replication OLE DB Provider for DTS
SQLReplication.OLEDB
Используется для доступа к данным, сконфигурированным для репликации
MSDataShape
MSDataShape
Нет информации
OLE DB Provider for Microsoft ADsDSOObject Directory Services
Позволяет обращаться к службам каталога, например к Active Directory Windows 2000
Microsoft OLE DB Provider for OLAP Services 8.0
MSOLAP
Предназначен для обеспечения доступа к системам OLAP, работающим на SQL Server 2000
Microsoft OLE DB Provider for Internet Publishing
MSDAIPP.DSO
Предоставляет доступ к ресурсам Интернета
Microsoft OLE DB Provider for Microsoft Search
Microsoft Search Collator data source
Позволяет обращаться к данным службы Microsoft Search
Microsoft OLE DB Provider for ODBC Drivers
MSDASQL
Используется для доступа к источникам ODBC
Microsoft Jet 4.0 OLE DB Provider
Microsoft.Jet.OLEDB.4.0
Предназначается для доступа к данным, расположенным в файлах различных систем (mdb, dbf и другие)
Microsoft OLE DB Simple Provider
MSDAOSP
Упрощенный поставщик для доступа к серверам SQL Server
Microsoft OLE DB Provider for Oracle
MSDAORA
Предназначен для работы с серверами Oracle
Microsoft OLE DB Provider for Indexing Service
MSIDXS
Позволяет обращаться к данным службы индексирования
Замечание Технология O L E DB, в том числе и поставщики, рассматривались в главе 3.
286 П
Часть III. Администрирование [@datasrc =] 'data_source•
Данный параметр определяет местонахождение источника данных. При конфигурировании в качестве связанного сервера SQL Server 2000 это будет сетевое имя NetBIOS компьютера, на котором установлен SQL Server 2000. Если выполняется регистрация именованной инсталляции, то дополнительно должно быть указано имя инсталляции в формате имя_сервера\имя_инсталляции. Для неименованной инсталляции достаточно указать только имя компьютера. При работе с поставщиком •Microsoft. J e t . O L E D B . 4 . 0 ' это будет путь к файлу данных. Параметр имеет тип данных nvarchar (4000), значение по умолчанию — NULL. П
[@location =] 'location'
Параметр задает местонахождение базы данных. Обычно параметр @location не указывается, т. к. местонахождение базы данных определяется другими методами. Параметр имеет тип данных nvarchar (4 ООО), значение по умолчанию — NULL. d
[@provstr =] 'provider_string'
Этот параметр определяет символьную строку, которая может содержать дополнительные настройки, используемые при установлении соединения. Строка может включать имя и пароль учетной записи, которая будет использоваться для установления соединения. Кроме того, в ней может быть задано имя базы данных, с которой предполагается работать и некоторые другие параметры. Большая часть параметров соединения, указываемых при конфигурировании связанного сервера, будут отображены в строке, используемой для установления соединения. В принципе, необходимая для установления соединения информация может быть указана непосредственно в строке. Однако это не совсем удобно и лучше конфигурировать все параметры по отдельности. Тем не менее, параметр Sprovstr позволяет это сделать. Обычно он служит для указания некоторых специфичных опций установления соединения, не отображенных в интерфейсе Enterprise Manager и хранимой процедуры sp_addiinkedserver. Но в большинстве ситуаций, особенно при работе с широко применяемыми источниками данных, указание параметра gprovstr не требуется. Параметр имеет тип данных nvarchar (4000), значение по умолчанию — NULL. L"J [Scatalog =] 'catalog'
Параметр определяет каталог на конфигурируемом связанном сервере, который будет использоваться по умолчанию при установлении соединения. Смысл каталога может различаться для разных поставщиков. Например, при работе с поставщиком SQL Server 2000 @cataiog определяет имя базы данных. Параметр имеет тип данных sysname, значение по умолчанию — NULL. Мы рассмотрели все параметры, необходимые для регистрации связанного сервера. Теперь же приведем несколько примеров, иллюстрирующих вызов хранимой процедуры sp_addiinkedserver. Для начала рассмотрим регистрацию связанного сервера SQL Server 2000: sp addlinkedserver 'STORAGE\TRELON', 'SQL Server'
Глава 10. Административные задачи
287
Замечание При конфигурировании связанного сервера не выполняется проверках на достоверность указанных значений. То есть если в одном или более параметра была ошибка, то связанный сервер все равно будет создан. Однако при попытке обращения к такому серверу появится сообщение об ошибке. Этого достаточно, чтобы зарегистрировать связанный сервер SQL Server 2000. Как видно, с помощью параметра @server было указано имя связанного сервера, которое позволило также однозначно идентифицировать SQL Server 2000 в 1 сети. Параметр @srvproduct равен 'SQL s e r v e r , поэтому конфигурирование других параметров не требуется. Замечание Обычными средствами не допускается конфигурирование двух связанных серверов, ссылающихся на один и тот же SQL Server 2000. Дело в том, что при указании параметра @ s r v p r o d u c t , равного 'SQL S e r v e r ' не разрешается указание других параметров. То есть имя сервера определяется с помощью параметра @server. Однако параметр @ s r v p r o d u c t не имеет особого значения и при конфигурировании связанного сервера SQL Server 2000 можно указать другое значение, например ' O r a c l e ' , но задать поставщика, источник и другие параметры, как при конфигурировании связанного сервера SQL Server 2000. Также можно изменить данные непосредственно в таблице s y s s e r v e r s .
Для настройки связанных серверов, ссылающихся на некоторые программные продукты, необходимо конфигурирование и других параметров. Приведем пример конфигурирования связанного сервера для Oracle: sp_addlinkedserver Sserver = 'Baxus', @srvproduct = 'Oracle', @provider = 'MSDAORA', @datasrc = 'ServerName'
В этом примере конфигурировался связанный сервер с именем Baxus, ссылающийся на сервер Oracle с именем ServerName. Можно легко создать несколько связанных серверов, ссылающихся на один и тот же сервер Oracle, подставляя вместо Baxus другие значения. Рассмотрим конфигурирование связанного сервера, данных MS Access с помощью механизмов Jet:
ссылающегося
на базу
sp_addlinkedserver 'Access_Pubs', 'OLE DB Provider for Jet', 'Microsoft.Jet.OLEDB.4.0', 'C:\MSOffice\Access\Samples\Pubs.mdb'
Последний параметр (@datasrc) определяет местонахождение файла базы данных, к которому необходимо получить доступ. В завершение рассмотрим вариант конфигурирования связанного сервера SQL Server 2000, доступ к которому будет осуществляться с помощью поставщика
288
Часть III. Администрирование
ODBC. В этом примере также будет проиллюстрировано использование строки конфигурирования соединения (параметр eprovstr): sp_addlinkedserver Qserver = 'JavaLand', gprovider = 'MSDASQL', gprovstr = 'DRIVER={SQL Server};SERVER=JL;UID=sa;PWD=;'
Здесь создается связанный сервер JavaLand, который будет использовать поставщика для ODBC. Параметр @provstr содержит информацию о свойствах соединения ODBC. В частности, указывается имя драйвера ODBC, который необходимо использовать (SQL server), а также имя сервера, с которым нужно установить соединение (JL). ПОМИМО ЭТОГО, задается имя и пароль учетной записи SQL Server, которые будут использоваться для регистрации соединения. Как видно, соединение устанавливается под учетной записью за, однако пароль не указан. В этом случае пользователь должен будет вводить пароль при каждом обращении к связанному серверу. Если это утомительно, то пароль можно определить в строке конфигурирования соединения. Однако это снижает защищенность данных.
Просмотр информации о связанных серверах Если вы сконфигурировали множество связанных серверов, то спустя несколько недель вряд ли будете помнить все параметры конфигурации каждого из них. Да это и не нужно. Всегда можно легко просмотреть информацию о сконфигурированных связанных серверах. Для этого можно применить два метода: • прямое обращение к таблице sysservers; • использование системной хранимой процедуры sp_linkedservers. Для непосредственного просмотра таблицы достаточно выполнить следующую команду: SELECT * FROM s y s s e r v e r s
В ответ будет выдано все содержимое таблицы sysservers. Эта таблица состоит примерно из 30 столбцов, значительная часть которых не имеет особого значения для пользователя. Для получения более компактной информации рекомендуется использовать хранимую процедуру splinkedservers, не имеющую параметров. Она является всего-навсего модифицированным запросом SELECT, выводящим только 7 столбцов таблицы sysservers. Убедиться в этом можно с помощью хранимой процедуры spheiptext, специально предназначенной для просмотра кода Transact-SQL, на основе которого был создан тот или иной объект базы данных. Для просмотра кода хранимой процедуры splinkedservers необходимо в контексте базы данных Master выполнить следующую команду: EXEC sp_helptext
'sp_linkedservers'
Будет возвращен результат: Text create proc sp_linkedservers as
Глава 10. Административные задачи
289
select SRV_NAME = srvname, SRV_PROVIDERNAME = providername, SRV_PRODUCT = srvproduct, SRV_DATASOURCE = datasource, SRV_PROVIDERSTRING = providerstring, SRV_LOCATION - location, SRV_CAT = catalog from master.dbo.sysservers order by 1
Назначение столбцов, возвращаемых хранимой процедурой sp_linkedservers, соответствует параметрам, используемым при вызове хранимой процедуры sp_addlinkedserver.
Определение отображения Как уже говорилось, для установления соединения со связанным сервером необходимо зарегистрироваться на нем. SQL Server 2000 позволяет выполнять регистрацию локальных пользователей на удаленном сервере под различными учетными записями. Для этого SQL Server 2000 определяет, какой пользователь пытается обратиться к связанному серверу, и использует для него соответствующее имя учетной записи и (если определен) ее пароль. Соответствие локальных и удаленных учетных записей определяется с помощью системной хранимой процедуры sp_addiinkedsrviogin и хранится в системной таблице sysxiogins базы данных Master. Данная таблица имеет множество столбцов, описывающих различные свойства учетных записей. Мы не будем подробно рассматривать структуру таблицы sysxiogins, а только скажем, что в ней хранится имя и пароль учетной записи, под которой будет устанавливаться соединение со связанным сервером. Замечание Таблица s y s x i o g i n s предназначена для хранения информации о всех учетных записях, участвующих в работе SQL Server 2000. В частности, в этой таблице хранится информация об учетных записях SQL Server, созданных на локальном сервере. Список учетных записей, созданных на локальном SQL Server 2000, можно просмотреть с помощью представления s y s l o g i n s , отображающего только те строки таблицы s y s x i o g i n s , для которых в столбце s r v i d установлено значение N U L L .
По умолчанию при создании связанного сервера в таблицу sysxiogins добавляют сопоставление (или отображение) для всех учетных записей локального сервера. При этом применяется так называемое отображение в себя (self mapping). В этом случае для выполнения обращения к связанному серверу пользователи, имеющие учетные записи Windows NT, станут работать с аутентификацией Windows NT. Им автоматически будут предоставлены права, сконфигурированные для их учетной записи. Для пользователей с аутентификацией SQL Server для установления соединения будут использоваться имя и пароль, которые они указывали для установления соединения с локальным сервером. То есть соединение удастся устано-
290
Часть III. Администрирование
вить, если на обоих серверах (как локальном, так и связанном) имеются учетные записи с одинаковыми именами и паролями. В противном случае пользователь получит сообщение об ошибке регистрации (Login failed). Синтаксис хранимой процедуры sp_addiinkedsrviogin следующий: sp_addlinkedsrvlogin [Srmtsrvname =] 'rmtsrvname' [, [@useself =] ' u s e s e l f ] [, [@locallogin =] ' l o c a l l o g i n ' ] [, [@rmtuser =] 'rmtuser'] [, [@rmtpassword = ] 'rmtpassword']
Замечание
)
Правами выполнения этой хранимой процедуры обладают члены фиксированных ролей сервера s y s a d m m и S e c u r i t y a d m i n .
Рассмотрим назначение и использование каждого из параметров процедуры: П
[@rmtsrvname =] 'rmtsrvname'
Определяет имя связанного сервера, для которого будет добавляться отображение. Имя сервера должно присутствовать в таблице s y s s e r v e r s . Параметр имеет тип данных sysname, значение по умолчанию не определено. d
[Suseself =]
'useself'
Этот параметр имеет тип данных varchar(8) и может принимать значения TRUE или FALSE. По умолчанию используется значение TRUE.
Когда указывается TRUE, TO установление соединения со связанным сервером будет выполняться с правами учетной записи Windows NT пользователя, выполняющего обращение. Подобный подход позволяет повысить безопасность обработки распределенных запросов. Конфигурирование прав пользователей полностью возлагается на администратора соответствующего связанного сервера. Администратору локального сервера достаточно определить единственное отображение для учетных записей, чтобы разрешить обращаться к удаленному серверу всем пользователям, использующим аутентификацию Windows NT и имеющим доступ к связанному серверу. В этом случае нет нужды указывать значения параметров @rmtuser и @rmtpassword, т. к. они все равно будут проигнорированы. Значение FALSE ВВОДИТСЯ, когда пользователи локального сервера используют аутентификацию SQL Server. В этом случае необходимо явно указать, в какую учетную запись связанного сервера должна быть отображена учетная запись локального пользователя. Для этого следует задать имя и пароль учетной записи на связанном сервере, для чего, соответственно, предназначены параметры Ormtuser И @rmtpassword. О
[Slocallogin =] 'locallogin' Параметр определяет имя локальной учетной записи, для которой выполняется отображение. Это имя должно присутствовать в столбце name представ-
Глава 10. Административные задачи
291
ления syslogins. Значение NULL соответствует всем учетным записям как SQL Server, так и Windows NT. При этом учетные записи Windows NT могут получать доступ либо через указанную учетную запись SQL Server, либо непосредственно или через членство в группах Windows NT. Для учетных записей SQL Server необходимо явно указать как минимум имя учетной записи на связанном сервере. Параметр имеет тип данных sysname, по умолчанию определено значение NULL. О
[Srmtuser =] 'rmtuser'
С помощью этого параметра задается имя учетной записи, имеющейся на конфигурируемом связанном сервере. При попытке пользователя, указанного с помощью предыдущего параметра, обратиться к связанному серверу, для установления соединения будет использоваться учетная запись, указанная с помощью рассматриваемого параметра. Однако сервер ведет себя подобным образом, только если значение параметра @useseif равно FALSE. Параметр имеет тип данных sysname и значение NULL ПО умолчанию. О
[@rmtpassword =] 'rmtpassword' Данный параметр определяет пароль для учетной записи, указанной с помощью предыдущего параметра. Параметр имеет тип данных sysname и значение NULL по умолчанию. Однако значение NULL разрешается применять, когда удаленный пользователь имеет пустой пароль. Использование NULL В остальных случаях приведет к выводу сообщения об ошибке при попытке обращения к связанному серверу.
Мы рассмотрели все параметры хранимой процедуры sp_addiinkedsrviogin. Рассмотрим несколько примеров вызова этой хранимой процедуры. Предложенный ниже вариант иллюстрирует предоставление доступа к серверу STORAGE\Treion для учетной записи Windows NT с именем storage\Administrator: EXEC sp_addlinkedsrvlogin 'STORAGE\Trelon', 1 'false , 'STORAGE\Administrator' , ' sa' , 1 [;k.by@[]wb,f&gfhec' В этом примере учетная запись Windows NT будет регистрироваться на связанном сервере под учетной записью sa. В следующем примере той же учетной записи Windows NT предоставляется доступ к тому же серверу с правами учетной записи Windows NT: EXEC sp_addlinkedsrvlogin 'STORAGENTrelon', 'true', 'STORAGE\Administrator'
Замечание Если для указанной с помощью параметра @ l o c a l l o g i n учетной записи уже существовало отображение в таблице s y s x l o g i n s , оно будет удалено, а вместо него вставлено новое с измененными свойствами. Таким образом, для любой учетной записи может быть определено только одно отображение для каждого связанного сервера.
292
Часть III. Администрирование
В завершение рассмотрим отображение локальной учетной записи sa в одноименную учетную запись на связанном сервере: EXEC sp_addlinkedsrvlogin 'STORAGE\Trelon', 'false', ' sa' , ' sa', NULL В данном примере в качестве пароля указано значение NULL. ЭТО означает, что на связанном сервере для учетной записи sa не установлено никакого пароля. В данном случае вместо NULL МОЖНО было использовать пустую строку.
Просмотр отображений Если вы определили множество отображений для связанных серверов, то вряд ли будете помнить о каждом из них спустя несколько недель или даже месяцев. Однако бывает необходимо просмотреть, в какую учетную запись связанного сервера отображается каждый из локальных пользователей. Это можно выполнить различными путями. Один из них подразумевает непосредственное обращение к системным таблицам с помощью команд SELECT, тогда как другой предполагает использование СИСТемНОЙ хранимой Процедуры sp_helplinkedsrvlogin. В принципе, хранимая процедуры в конце концов является тем же самым запросом SELECT, поэтому в большинстве случаев удобнее применять уже имеющиеся средства просмотра информации об отображении учетных записей, чем писать свой собственный запрос. Однако в некоторых ситуациях все же нужно получить дополнительную Информацию, не отображаемую Процедурой sphelplinkedsrvlogin. В этих случаях без использования прямого обращения к системным таблицам не обойтись. Однако в этом разделе мы ограничимся рассмотрением применения интерфейса хранимой процедуры sp_heipiinkedsrviogin, имеющей синтаксис: sp_helplinkedsrvlogin [[@rmtsrvname =] 'rmtsrvname'] [, [@locallogin =] 'locallogin']
При вызове процедуры без параметров будет выведена информация обо всех имеющихся отображениях для всех сконфигурированных связанных серверов. Если необходимо получить сведения об отображениях, определенных для конкретного связанного сервера, то следует с помощью параметра @rmtsrvname указать имя интересующего сервера. Когда же нужно получить информацию обо всех отображениях конкретной локальной учетной записи, сделанных для всех связанных серверов, то этого можно добиться использованием параметра e i o c a i i o g i n с указанием имени интересующей учетной записи. При указании как параметра @rmtsrvname, так и параметра @iocaiiogin будет выведена информация об отображении конкретной учетной записи для конкретного связанного сервера.
Глава 10. Административные задачи
293
Результатом выполнения процедуры sp_heipiinkedsrviogin будет набор строк, каждая из которых соответствует отдельному отображению. Информация выводится в столбцах: О Linked Server — имя связанного сервера, для которого определено отображение; •
Local Login — имя локальной учетной записи, для которой определено отображение;
П i s s e l f Mapping — если в этом столбце указывается значение 1, то учетная запись Windows NT получит на связанном сервере права на основе аутентификации Windows NT. Для учетных записей SQL Server всегда указывается значение 0; •
Remote Login — имя учетной записи на связанном сервере, в которую отображается локальная учетная запись, указанная в столбце Local Login. Если для учетных записей Windows NT используется отображение в себя (в столбце i s s e l f Mapping выведено значение 1), то в этом столбце будет значение NULL.
В качестве примера рассмотрим получение списка всех имеющихся отображений: EXEC sp_helplinkedsrvlogin
Будет получен следующий результат: Linked Server
Local Login
Is Self Mapping Remote Login
JM DM
NULL NULL NULL
0 1 1 0 1 1
STORAGE STORAGE\TRELON sa STORAGE\TRELON STORAGE\Administrator TRELON NULL (6 row(s) affected)
NULL NULL NULL sa NULL NULL
Теперь же попробуем получить список отображений, определенных для сервера STORAGE\Trelon: EXEC s p _ h e l p l i n k e d s r v l o g i n
'STORAGE\Trelon'
Будет получен результат: Linked server
Local Login
STORAGE\TRELON sa STORAGE\TRELON STORAGE\Administrator (2 row(s) affected)
Is Self Mapping Remote Login 0 1
sa NULL
Удаление отображения Мы рассмотрели добавление отображения для связанного сервера. Теперь же рассмотрим удаление имеющегося отображения. Это можно сделать либо с помощью хранимой процедуры sp_droplinkedsrviogin, либо путем непосредственного обращения к таблице sysxlogins через команду DELETE.
294
Часть III. Администрирование
В последнем случае необходимо найти нужную строку в таблице sysxiogins. Для этого сначала нужно определить идентификационный номер связанного сервера, для которого предполагается удалить отображение учетных записей. Идентификационный номер связанного сервера можно просмотреть в таблице sysservers. В столбце srvname указывается имя связанного сервера, присвоенное ему при создании. Идентификационный номер же выводится в столбце srvid. Например, для просмотра списка имен и идентификационных номеров имеющихся связанных серверов можно выполнить следующий запрос: SELECT srvid, srvname FROM sysservers
Будет выведен результат, подобный приведенному ниже: srvid
srvname
1 2 0 3 5
JL DM
STORAGE STORAGE\TRELON TRELON (5 row(s) affected)
После того, как идентификационный номер нужного связанного сервера будет определен, необходимо найти в таблице sysxiogins строку для нужной учетной записи. Для просмотра списка всех локальных учетных записей, отображаемых на связанный сервер, можно выполнить запрос: SELECT syslogins.name FROM syslogins, sysxiogins WHERE srvid = 3 AND syslogins.sid = sysxiogins.sid
Вместо цифры З следует подставить идентификационный номер нужного сервера. В результате выполнения запроса будет выведен список имен учетных записей и их идентификаторов безопасности (SID, Security Identificator). Остается только запустить команду DELETE, ограничив список строк указанием идентификационного номера сервера и SID нужного пользователя. Команда DELETE будет иметь примерно следующий вид: DELETE FROM s y s x i o g i n s WHERE s r v i d = 3 AND SID = 0x010500000000000515000000833D2B4 654190E291525AF47F4010000
Замечание Подобная операция удаления строки из системной таблицы требует прямого доступа к системным объектам. По умолчанию доступ к системным объектам не предоставляется. Для его разрешения можно воспользоваться вкладкой Server Settings окна свойств сервера или выполнить команду EXEC s p _ c o n f i g u r e ' a l l o w u p d a t e s ' , l . Более подробно предоставление прямого доступа к системным таблицам было рассмотрено в разд. "Вкладка Server Settings" главы 8.
Как видно, удаление отображения учетных записей для связанного сервера путем непосредственного обращения к системной таблице sysxiogins требует определенных усилий и нескольких предварительных операций. При управлении большим количеством отображений такой метод работы будет обременительным.
Глава 10. Административные задачи
295
Более простым способом удаления отображения является использование хранимой процедуры sp_dropiinkedsrviogin. Она сама выполняет все необходимые промежуточные операции, предоставляя администратору удобный механизм управления отображением учетных записей. Синтаксис процедуры таков: sp_droplinkedsrvlogin [@rmtsrvname =] 'rmtsrvname', [@locallogin =] 'locallogin'
Как видно, процедура имеет всего два параметра, и оба они являются обязательными. Параметр [@rmtsrvname = ] ' rmtsrvnarne ' определяет ИМЯ связанного сервера, для которого необходимо удалить отображение. Учетная запись, отображение которой предполагается удалить, указывается с помощью параметра [@locailogin =] ' l o c a l l o g i n ' . Правами выполнения этой хранимой процедуры обладают члены фиксированных ролей Сервера sysadmin И Securityadmin. В качестве примера рассмотрим удаление отображения для учетной записи Windows NT с именем storage\Administrator, определенного для связанного Сервера STORAGE\Trelon". EXEC sp_droplinkedsrvlogin 'STORAGE\treIon', 'STORAGE\Administrator'
На этом управление отображением локальных учетных записей в учетные записи связанного сервера заканчивается.
Конфигурирование связанного сервера Помимо параметров, указываемых при создании связанного сервера, имеется еще ряд параметров, влияющих на отработку запросов к этому связанному серверу. К ним относится информация о сопоставлениях (текстовых данных), периоде ожидания установления соединения, периоде ожидания выполнения запроса, разрешении обращения к связанному серверу и некоторые другие параметры. (
Замечание
^
Текущие параметры настройки связанного сервера хранятся в столбце s r v s t a t u s таблицы s y s s e r v e r s . Для каждого значения отводится один из битов. Выставление бита соответствует установленной опции и наоборот..В принципе, управление конфигурацией связанных серверов можно выполнять путем изменения значений в столбце s r v s t a t u s . Однако данный метод требует знания назначения каждого из битов. Более простым и удобным вариантом является запуск хранимой процедуры.
Управление опциями конфигурации связанного сервера осуществляется с помощью системной хранимой процедуры sp_serveroption, имеющей синтаксис: sp_serveroption [@server =] ' s e r v e r ' , [Qoptname =] 'option_name', [@optvalue =] 'option_value'
Замечание Право на выполнение указанной хранимой процедуры имеют члены фиксированных ролей сервера s y s a d m i n и S e t u p a d m i n .
296
Часть III. Администрирование
Рассмотрим назначение и использование параметров процедуры. О
[Sserver =] 'server'
Параметр определяет имя связанного сервера, настройками которого предполагается управлять. Указываемый связанный сервер должен быть создан, т. е. в столбце srvname таблицы sysservers должно иметься значение, указанное с помощью параметра @server. Параметр имеет тип данных sysname, значение по умолчанию не определено. П [Soptname =] 'option_name' С помощью этого параметра указывается имя опции конфигурации связанного сервера, которой предполагается управлять. В табл. 10.2 приведен список всех допустимых значений, а также дано краткое описание каждой из них. Параметр имеет тип данных varchar(35), значение по умолчанию не определено. Таблица 10.2. Опции конфигурации
связанного
сервера
Имя опции
Краткое описание
collation compatible
Если эта опция установлена, то сервер предполагает, что все характеристики (порядок сортировки, сопоставление, набор символов) связанного сервера совместимы с характеристиками локального сервера. Это позволяет передавать данные между серверами без дополнительной обработки. Если опция не установлена, то на локальном сервере всегда выполняется сравнение, что налагает дополнительную нагрузку на сервер
collation name
Эта опция определяет имя сопоставления, используемого на удаленном сервере. Применяется только при установленной опции use r e m o t e c o l l a t i o n . Если удаленный сервер не является SQL Server, но использует набор символов, порядок сортировки и другие параметры, аналогичные одному из сопоставлений SQL Server, то можно явно определить, каким образом будут обрабатываться данные связанного сервера, указав имя соответствующего сопоставления
connect timeout
С помощью этого параметра указывается количество секунд, в течение которого система будет ожидать установления соединения со связанным сервером. Если указывается 0, то будет использоваться значение, определенное с помощью параметра
'remote login sp_configure
timeout' системной хранимой процедуры
data access
Установка данной опции разрешает пользователям локального сервера выполнять распределенные запросы, обращающиеся к соответствующему связанному серверу. До тех пор, пока опция не будет установлена, пользователи не смогут обращаться к связанному серверу. По умолчанию опция сброшена и пользователи не могут выполнять распределенные запросы
Dist
Устанавливается, если связанный сервер является дистрибьютором
Глава 10. Административные задачи
297 Таблица 10.2 (окончание)
Имя опции
Краткое описание
Dpub
Эта опция устанавливается, если связанный сервер является удаленным издателем для локального дистрибьютора, т. е. локальный сервер является дистрибьютором, распространяющим публикации указанного связанного сервера
lazy schema validation
Если эта опция установлена, то перед выполнением распределенного запроса к связанному серверу будет выполняться проверка соответствия столбцов, указанных в запросе, столбцам, имеющимся в удаленной таблице
pub
Эта опция устанавливается, если связанный сервер является издателем
query timeout
С помощью данной опции указывается период в секундах, в течение которого система будет ожидать выполнения запроса к соответствующему связанному серверу. Если установлено значение 0, то будет использоваться интервал, определенный с помощью параметра 'remote query timeout1 процедуры sp_configure
rpc
Установка этой опции разрешает выполнение вызовов удаленных процедур (RPC) с соответствующего связанного сервера
rpc out
Установка этой опции разрешает выполнение вызовов удаленных процедур (RPC) к соответствующему связанному серверу
sub
Эта опция устанавливается, если связанный сервер является подписчиком
system
Данная опция предназначена только для внутренних нужд SQL Server 2000 и не должна изменяться пользователем
use remote collation
Установка этой опции предписывает использовать на удаленном сервере конкретное сопоставление. Имя сопоставления указывается с помощью параметра c o l l a t i o n name
С] [Soptvalue =] ' option_value'
Параметр определяет значение, которое будет присвоено для опции конфигурации сервера, указанной с помощью @optname. Для большинства опций указывается либо TRUE ИЛИ ON ДЛЯ установки опции, либо FALSE ИЛИ OFF ДЛЯ запрещения опции. Однако для опций, определяющих период ожидания, указывается целое значение, а для параметра c o l l a t i o n name — имя одного из сопоставлений SQL Server. Рассмотрим несколько примеров конфигурирования параметров связанного сервера. В приведенном ниже варианте разрешается выполнение удаленных запросов К связанному Серверу STORAGE\Trelon: EXEC sp_serveroption •STORAGE\Trelon', 'data access', 'TRUE'
Часть III. Администрирование
298
Теперь же укажем, что связанный сервер имеет те же параметры, что и локальный сервер: EXEC sp_serveroption
'STORAGE\Trelon',
1
'collation compatible , 'ON'
Удаление связанного сервера Как бы хорошо ни планировалась структура сети, все же в нее иногда требуется вносить изменения. Как частный случай, это требует удаления связанных серверов. Удаление связанного сервера выполняется с помощью системной хранимой процедуры s p d r o p s e r v e r , имеющей синтаксис: sp_dropserver [@server =] 'server' [, [@droplogins =] { 'droplogins' I NULL}]
Параметр @server определяет имя связанного сервера, который необходимо удалить. После удаления связанного сервера не должно остаться информации об отображениях локальных учетных записей в учетные записи удаленного сервера. Для удовлетворения этого требования можно либо предварительно удалить все отображения вручную (это было рассмотрено в одном из предыдущих разделов), либо воспользоваться возможностью автоматического удаления всех отображений при удалении связанного сервера с помощью хранимой процедуры sp_dropserver. Для этого предназначен параметр gdropiogins, для которого необходимо указать значение ' d r o p l o g i n s ' . Например, для удаления связанного сервера STORAGE\Trelon с изъятием всех отображений учетных записей необходимо использовать команду: EXEC sp_dropserver 'STORAGE\Trelon',
'droplogins1
На этом рассмотрение связанных серверов можно считать законченным.
Использование Enterprise Manager В предыдущих разделах рассматривалось управление связанными серверами с помощью средств Transact-SQL — в основном с помощью системных хранимых процедур, но также была дана информация о том, как SQL Server 2000 хранит информацию о связанных серверах. Если возникнет необходимость, то, основываясь на приведенной информации, вы сможете написать свои собственные хранимые процедуры для управления связанными серверами. По сравнению с использованием команд непосредственного доступа к системным таблицам (SELECT, UPDATE, DELETE И INSERT) хранимые процедуры являются
довольно удобным средством, избавляющим от необходимости досконально помнить все аспекты представления связанных серверов на уровне системных таблиц. Однако и использование хранимых процедур требует определенных знаний. В частности, администратор либо должен держать в голове синтаксис хранимых процедур и помнить назначение всех параметров, либо постоянно иметь под рукой справочное руководство.
Глава 10. Административные задачи
299
Это довольно обременительно и не каждый администратор захочет держать в голове синтаксис процедуры, которой может воспользоваться всего один-два раза. Гораздо более удобным было бы иметь инструмент, предлагающий графический интерфейс для выполнения административных задач. Таким инструментом в SQL Server 2000 является Enterprise Manager, который также позволяет управлять и связанными серверами.
Замечание Enterprise Manager представляет всего-навсего удобный и интуитивно понятный интерфейс для указания параметров хранимых процедур. Какие бы элементы управления не использовались, в конце концов, Enterprise Manager применяет для управления связанными серверами те же хранимые процедуры, что были рассмотрены в предыдущих разделах. Для управления связанными серверами Enterprise Manager предлагает использовать папку Linked Servers (рис. 10.12), которую можно найти в папке Security, расположенной в корневой папке каждого сервера.
\Щ
Console
j Action
Window
View
Tools
Help
V-lai
Linked Servers 1- У master
;
i
;
:
i
H ClJ Security
! '
: ',
•
• ;•• i j f j Logins ;• ^ Server Roles
;
;
:
'- № Щ AUTHORS JET
:
J
AUTHORS JET
r ^ Northwind L }• ^ pubs j У ternpdb ЙЗ i_J Data Transformation Services Ш ; _ J Management L+J C J Replication + j F ; Replication Monitor
; :
7 Items
_^J
i | ) model -i ( j rnsdb i
1
| j <£> \ « • | Й j Щ \ N
Tree |
;
:
J
J
DIRKA
J
J
PARATRUPER
U
J
PROBA
STAR
J
J
J
STORAGE\Pl...
Cj|i 4 9 a TRELON
и; j j i DIRKA 3 Щ PARATRUPER • j j PRO8A 3 I j y i STAR h; Щ STORAGE\PlanetX • j j i fRELON j j ^ Remote Servers H r_J Support Services '•• i S Q Meta Data Services ' У -j'o 5TORAGE\TRELON (Windows NT/2000; : :+! t O TERAN Щ C j Other Servers
4\.;-
— jt\ 1
м-
Рис. 10.12. Папка Linked Servers
Каждый из сконфигурированных связанных серверов представлен в папке Linked Servers отдельным объектом. Однако в ней не отображаются серверы,
300
Часть III. Администрирование
установленные на том же компьютере, что и рассматриваемый SQL Server 2000. То есть в папке не будут отображены ни инсталляция по умолчанию, ни именованные инсталляции, хотя в таблице sysservers и будут присутствовать соответствующие записи. Замечание Хотя в Enterprise Manager и не отображаются локальные инсталляции, тем не менее, можно зарегистрировать их в качестве связанного сервера еще раз под другим именем. Такой связанный сервер станет виден в панели Enterprise Manager.
В следующих разделах будет рассмотрено выполнение с помощью Enterprise Manager основных операций администрирования.
Регистрация связанного сервера Для регистрации нового связанного сервера с помощью Enterprise Manager предназначено окно Linked Server Properties - New Linked Server (рис. 10.13). Для его открытия необходимо выбрать папку Linked Servers и в ее контекстном меню или в раскрывающейся кнопке Action выбрать команду New Linked Server. Окно содержит три вкладки, с помощью которых можно определить источник данных, связанный с конфигурируемым связанным сервером, а также задать отображения учетных записей и управлять параметрами работы связанного сервера. В этом разделе будет рассмотрена только первая вкладка General (см. рис. 10.13), с помощью которой выполняется настройка источника данных. Вкладка имеет ряд элементов управления, с помощью которых и определяется источник данных для связанного сервера. Не трудно заметить, что имеющиеся на вкладке элементы управления отображают те же параметры, что указываются при регистрации связанного сервера при вызове хранимой процедуры sp_addlinkedserver.
Рассмотрим элементы управления, имеющиеся на вкладке. • Linked server. В этом текстовом поле указывается имя, которое будет присвоено конфигурируемому связанному серверу. При выборе имени необходимо следовать общим правилам именования объектов SQL Server 2000. Кроме того, на текущем сервере не должно быть ранее зарегистрировано связанного сервера с аналогичным именем. Данный элемент соответствует параметру @server, с помощью которого указывается имя связанного сервера при регистрации его с помощью системной хранимой процедуры sp_addlinkedserver.
• SQL Server. При установке переключателя Server type в это положение будет считаться, что конфигурируемый связанный сервер является SQL Server 2000. При этом имя, указанное в поле Linked server, должно являться именем соответствующего SQL Server 2000. Для инсталляции по умолчанию достаточно задать сетевое имя NetBIOS компьютера, на котором установлен SQL Server 2000. При регистрации именованной инсталляции помимо имени компьютера дополнительно должно быть указано имя инсталляции в формате
Глава 10. Административные задачи
301
имя_сервера\имя_инсталляции. Установка переключателя в это положение равнозначна указанию значения 'SQL s e r v e r ' для параметра @srvproduct при регистрации связанного сервера с помощью хранимой процедуры s p a d d l i n k e d s e r v e r . В этом случае не требуется задания никаких других параметров. П Other data source. В общем случае установка переключателя Server type в это положение необходима, когда конфигурируется источник данных, отличный от SQL Server. Однако таким образом также можно конфигурировать и серверы SQL Server 2000. Это необходимо, когда предполагается зарегистрировать связанный сервер с именем, отличным от сетевого имени соответствующего SQL Server 2000. При установке переключателя в положение Other data source становятся доступными дополнительные элементы управления, которые рассматриваются ниже. • Provider name. Этот раскрывающийся список содержит перечень всех поставщиков OLE DB, установленных на текущем сервере. В зависимости от того, какой поставщик выбран, будет изменяться список доступных элементов управления, расположенных ниже. Мы не будем приводить список поставщиков, устанавливающихся вместе с SQL Server 2000, т. к. он указан в табл. 10.1. • Product name. В этом поле указывается имя продукта, который используется для управления конфигурируемым источником данных. Например, для rndbфайлов это может быть MS Access. Указанное значение используется в качестве параметра @srvproduct при ВЫЗОВе хранимой Процедуры sp_addlinkedserver. В принципе, значение в этом поле носит информативный характер и не влияет на работу связанного сервера. Единственно, указание в этом поле значения ' SQL Server' будет равносильно установке переключателя Server type в положение SQL Server. После выполнения регистрации при последующем просмотре свойств связанного сервера можно будет увидеть, что переключатель Server type установлен именно в это положение. • Data source. В этом поле указывается источник данных. Для получения более подробной информации о данном элементе следует обратиться к описанию параметра @datasrc хранимой процедуры spaddlinkedserver, предложенному в подразд. "Регистрация связанного сервера"разд. "Использование Transact-SQL"ранее в этой главе. Значение, указанное в рассматриваемом поле, подставляется как параметр @datasrc. Конкретный смысл значения, указываемого в поле Data source, зависит от типа используемого поставщика OLE DB. Например, если применяется поставщик Microsoft OLE DB Provider for SQL Server, то в этом поле необходимо указать сетевое имя соответствующего SQL Server. Когда же используется поставщик Microsoft Jet 4.0 OLE DB Provider, то необходимо указать полный путь до соответствующего файла с данными. Замечание Краткое назначение элемента управления и пояснение того, какие конкретно данные необходимо ввести с учетом выбранного поставщика, указывается в текстовом по-
Часть III. Администрирование
302
ле, расположенном в нижней части вкладки. Это касается всех элементов управления, имеющихся на вкладке. • Provider string! Поле предназначено для ввода строки, которая будет участвовать при инициализации источника данных, к которому обращается конфигурируемый связанный сервер. В большинстве случаев это поле остается пустым. Для получения дополнительной информации о использовании этой строки следует обратиться к подразд. "Регистрация связанного сервера" разд. "Использование Transact-SQL". П Location. Это поле предназначено для ввода более точного местоположения источника данных. Оно используется только для поставщиков, для которых указания значения в поле Data source недостаточно. О Catalog. Определяется каталог источника данных, с которым предполагается работать. Конкретное значение понятия каталог зависит от типа используемого поставщика. Например, при указании поставщика для SQL Server под каталогом понимается база данных.
Linked Server Properties - New General I Security | Server Options |
j
JCIT
\ _jj Linked server:
Server type: Г SQLServer Other data source Provider name:
Microsoft OLE DB Provider for SQL Serve r j
Product name:
_SQL_Setver_
Data source:
CIT
Provider Options...
Provider string:
Catalog:
Г" pubsj
Database name (optional).
OK
Cancel Hep l
Рис. 10.13. Окно Linked Server Properties - New Linked Server
На этом конфигурирование основных параметров связанного сервера завершается. После ввода всех значений остается только нажать кнопку ОК, что приведет К ВЫПОЛНеНИЮ СИСТеМНОЙ ХраНИМОЙ процедуры sp_addlinkedserver СО ЗНЭчениями параметров, указанными с помощью элементов управления вкладки General.
Глава 10. Административные задачи
303
Конфигурирование поставщика При рассмотрении вкладки General окна Linked Server Properties - New Linked Server (см. рис. 10.13) мы не рассмотрели назначение кнопки Provider Options. С помощью этой кнопки можно открыть окно Provider Options (рис. 10.14), предназначенное для управления некоторыми свойствами работы поставщика. Прежде чем модифицировать настройки поставщика, необходимо выбрать его в раскрывающемся списке Provider name.
С
Замечание
К сожалению, кнопка Provider Options доступна только при регистрации нового связанного сервера. При последующем просмотре свойств связанного сервера эта кнопка заблокирована. Возможно, в будущих релизах SQL Server 2000 этот недостаток будет устранен. Provider Options - Microsoft OLE DB Pr These options are applied to all linked servers that use this provider. Provider options: Enable iName Dynamic parameters Nested queries D I | Level zero only ЙГ Allow InProcess Non transacted updates Index as access path
_J :
Linked servers using this provider: PARATRUPER PROBA STAR STORAGE\PlanetX TRELON
OK
Help
Cancel
Замечание
Рис. 10.14. Окно Provider Options выбранного поставщика услуг
j
Свойства поставщика, определяемые в окне Provider Options, распространяются на работу поставщика в целом, а не только в пределах конфигурируемого связанного сервера. Для каждого поставщика хранится отдельный набор свойств. Окно Provider Options разделено на две части. В нижней части имеется поле Linked servers using for this provider, в котором выводится список всех связанных серверов, использующих конфигурируемого поставщика. При модификации 11. Зак. 83
Часть III. Администрирование
304
свойств поставщика следует учитывать, что изменения отразятся на всех связанных серверах, использующих этого же поставщика, т. е. приведенных в поле Linked servers using for this provider.
В верхней части окна существует таблица Provider options, состоящая из двух столбцов, первый из которых (Enable) отражает текущее состояние параметра — установлен (имеется галочка) или сброшен (пустой флажок). Собственно имя параметра выводится во втором столбце (Name). Каждая из строк таблицы соответствует отдельному параметру поставщика. Пользователь может управлять следующими настройками: • Dynamic parameters. Установка этого параметра указывает, что поставщик поддерживает использование символа ? для параметризованных запросов. Отмеченный параметр Dynamic parameters для SQL Server 2000 позволяет выполнять параметризованные запросы с помощью поставщика, что может повысить производительность. В общем случае для выполнения параметризованных запросов поставщик должен поддерживать интерфейс IcommandWithParameters. • Nested queries. Установка этого параметра свидетельствует о том, что поставщик поддерживает выполнение вложенных запросов. То есть в качестве источника данных в разделе FROM при выборке данных может указываться не только имя таблицы или представления, но и запрос SELECT. П Level zero only. Если параметр установлен, то для взаимодействия с поставщиком будет использоваться интерфейс OLE DB нулевого уровня. П Allow InProcess. Установка параметра предписывает выполнять процессы поставщика как часть SQL Server 2000. Это позволяет поставщику выполнять Обновление (UPDATE, INSERT) ДаННЫХ боЛЬШОГО Объема ( t e x t , n t e x t И image).
Однако в этом случае сервер не защищен от ошибок, вызванных работой поставщика. При сброшенном флажке поставщик выполняется как отдельный процесс, что защищает SQL Server 2000 от ошибок. • Non transacted updates. Установка данного параметра разрешает поставщику выполнять изменения, даже если источник не поддерживает транзакций. С момента установки параметра откат транзакций не поддерживается. • Index as access path. При установке параметра SQL Server 2000 будет применять для выборки данных индексы поставщика. П Disallow adhoc accesses. Установка этого параметра запрещает обращение через поставщика к данным с использованием команд OPENROWSET () и OPENDATASOURCE (). В таком случае для обращения к данным необходимо использовать связанные и удаленные серверы. На этом рассмотрение конфигурирования параметров поставщика заканчивается.
Управление отображениями Для управления отображениями средствами Enterprise Manager служит вкладка Security (рис. 10.15) окна свойств связанного сервера Linked Server Properties. Конфигурирование отображений можно выполнить как сразу же при регистрации связанного сервера, так и позже. Окно свойств связанного сервера можно открыть, выбрав в контекстном меню сервера команду Properties.
Глава 10. Административные задачи
305
Linked Server Properties - ST General Security | Server Options | Local server login to remote server login mappings: mpeisonate j Remote User | Remote Password
For a login not defined in the list above, connections will: (• Not be made ("* Be made without using a security context С Be made using the login's current security context C* Be made using this security contest:
OK.
Cancel
Apply
Help
Рис. 10.15. Вкладка Security окна свойств связанного сервера
В верхней части вкладки находится таблица, в которой и определяются отображения. В столбце Local Login указывается имя учетной записи локального сервера, которая будет отображаться в учетную запись на связанном сервере. Имя учетной записи на связанном сервере, под которым будет регистрироваться поставщик при выполнении запросов указанного локального пользователя, приводится в столбце Remote User. В столбце Remote Password содержится пароль для данной учетной записи. Установка флажка в столбце Impersonate приведет к тому, что регистрация соединения на связанном сервере будет использовать то же имя и пароль, что и учетная запись. То есть на локальном и удаленном сервере должны иметься учетные записи с одинаковыми именами и паролями. В нижней части вкладки размещается переключатель For a login not defined in the list above, connections will, определяющий, как будет устанавливаться соединение со связанным сервером для пользователей, для которых не было явно сконфигурировано отображение: • Not be made — пользователи, не имеющие отображения, не смогут обращаться к связанному серверу. П Be made without using a security context — для установления соединения не используется конкретная учетная запись. Предполагается, что связанный сервер разрешает установление соединения не аутентифицированным пользователям, например, под гостевой учетной записью.
Часть III. Администрирование
306
• Be made using the login's current security context — для установления соединения со связанным сервером будут выбраны имя и пароль, которые использовал пользователь для регистрации на локальном сервере. П Be made using the security context — в этом случае все пользователи, для которых не определено отображение, начнут соединяться со связанным сервером с помощью одной и той же учетной записи. При установке переключателя в это положение становятся доступными два дополнительных элемента управления: • поле Remote login, в котором указывается имя учетной записи связанного сервера, используемой для установления соединения; • поле With password задает пароль учетной записи, указанной в поле Remote login. На этом управление отображениями заканчивается. После того, как отображения были определены, администратор может в любое время открыть окно свойств связанного сервера и внести изменения или дополнения в имеющийся список отображений, а также изменить метод соединения для учетных записей локального сервера, для которых явно не определены отображения.
Управление параметрами связанного сервера При использовании средств Transact-SQL управление параметрами связанного сервера осуществляется с помощью системной хранимой процедуры spserveroption. Linked Server Properties - STOR General] Security Server Options Option Name Value Collation Compatb i le .ШВШШ Data Access RPC RPC Out Use Remote Collation Collation Name Connection Tm i eout 0 Query Tm i eout 0
Cancel
yr Ш Ш Ш M
Apply
Help
Рис. 10.16. Вкладка Server Options окна свойств связанного сервера
Глава 10. Административные задачи
307
При работе с Enterprise Manager для этих же целей предназначена вкладка Server Options (рис. 10.16) окна свойств связанного сервера Linked Server Properties. Вкладка Server Options содержит всего одну таблицу, с помощью которой и осуществляется управление параметрами работы связанного сервера. Таблица имеет два столбца: • Option Name, где выводится имя параметра сервера. • Value, содержащий только флажки. Установленный флажок соответствует установленной опции и наоборот. Список и назначение параметров настройки сервера были рассмотрены в подразд. "Конфигурирование связанного сервера" разд. "Использование Transact-SQL" ранее в этой главе.
Удаленные серверы Предыдущие разделы были посвящены рассмотрению связанных серверов. Напомним, что связанные серверы позволяют пользователям выполнять удаленные и распределенные запросы к данным, расположенным в распределенных гетерогенных источниках данных. Технология связанных серверов является довольно мощной. До SQL Server 7.0 в распоряжении пользователей, желающих обратиться к удаленным источникам данных, была только возможность работать с удаленными серверами (remote servers). Удаленные серверы дают возможность пользователям локального компьютера выполнять хранимые процедуры, расположенные на удаленном сервере, без установления дополнительного соединения. То есть клиенту достаточно иметь лицензию на одно подключение. Тем не менее, при этом необходимо иметь права на выполнение хранимых процедур, размещенных на удаленных серверах. Однако при этом пользователи не смогут выполнять удаленные и распределенные запросы, обращающиеся к удаленному серверу. Более того, в качестве удаленного сервера для локального SQL Server 2000 может выступать только другой SQL Server. Очевидно, что технология удаленного сервера проигрывает по функциональности технологии связанного сервера. Действительно, связанные серверы помимо возможности выполнения удаленных хранимых процедур позволяют выполнять пользователям сложные распределенные запросы, обращающиеся к множеству распределенных гетерогенных источников данных. Причем в качестве такого источника данных может выступать не только СУБД, но и обычный текстовый файл, файл базы данных MS Access, dbf-файл и т. д.
Замечание В SQL Server 2000 технология удаленных серверов оставлена для обеспечения совместимости с предыдущими версиями SQL Server. Начиная с SQL Server 7.0, пользователи могут работать с более мощной технологией связанных серверов.
308
Часть III. Администрирование
На уровне ядра SQL Server 2000 удаленные серверы реализованы как подмножество связанных серверов, обладающее ограниченными возможностями. То есть для выполнения удаленных хранимых процедур с помощью технологии удаленных серверов используются те же механизмы, что и при выполнении удаленных хранимых процедур с помощью технологии связанных серверов. Если нет особых причин, то рекомендуется применять связанные серверы, а не удаленные. В будущем это позволит легко обеспечить возможность выполнения удаленных и распределенных запросов. Как и для связанных серверов, информация об удаленных хранится в системной таблице s y s s e r v e r s системной базы данных Master. Как уже было сказано, с точки зрения сервера удаленный сервер является ничем иным, как связанным сервером с ограниченными возможностями. В принципе, можно изменить параметры связанного сервера SQL Server 2000 таким образом, что он будет иметь те же возможности, что и удаленный сервер. В отличие от связанных серверов, при работе с удаленными серверами их регистрация выполняется парами. То есть, чтобы пользователи сервера servA могли выполнять хранимые процедуры на сервере servB, необходимо на ServA сконфигурировать ServB в качестве удаленного сервера, и, наоборот, на ServB определить ServA в качестве удаленного сервера. Таким образом, пользователи сервера ServB также получат возможность выполнять хранимые процедуры на сервера ServA.
Замечание Как и при работе со связанными серверами, использование удаленных серверов требует конфигурирования отображения учетных записей пользователей локального сервера в учетные записи удаленного сервера. Эта операция будет рассмотрена в одном из следующих разделов. Тем не менее, по умолчанию для учетных записей будет применяться отображение в себя (self mapping). Поведение системы безопасности при использовании отображения в себя рассматривалось при описании связанных серверов. В следующих разделах обсудим управление удаленными серверами.
Использование Transact-SQL Работа с удаленными серверами, как и многие другие задачи администрирования, могут быть выполнены разными способами. В подразделах данного раздела будет рассмотрена работа с удаленными серверами средствами хранимых процедур и команд Transact-SQL.
Регистрация удаленного сервера Регистрация удаленного сервера средствами Transact-SQL выполняется с помощью системной хранимой процедуры sp_addserver, имеющей следующий синтаксис: sp_addserver [©server =] 'server' [, [§local =] 'local'] [, [Sduplicate ok =] 'duplicate_OK']
Глава 10. Административные задачи
309
Замечание Правом выполнения хранимой процедуры s p _ a d d s e r v e r обладают члены фиксированных ролей сервера s y s a d m i n и S e t u p a d m i n .
Замечание Хранимая процедура s p _ a d d s e r v e r оставлена для обеспечения совместимости с предыдущими версиями SQL Server. В принципе сервер, зарегистрированный как связанный, может использоваться и как удаленный. Регистрация связанного сервера выполняется с помощью системной хранимой процедуры s p _ a d d l i n k e d s e r v e r , которая была описана в одном из предыдущих разделов данной главы.
Рассмотрим назначение и использование каждого из параметров хранимой процедуры. СЗ [@server =]
'server'
С помощью данного параметра указывается имя сервера. Это сетевое имя NetBIOS компьютера, на котором установлен SQL Server 2000. Если выполняется регистрация именованной инсталляции, то дополнительно должно быть указано имя инсталляции в формате имя_сервера\имя_инсталляции. Для неименованной инсталляции достаточно указать только имя компьютера. •
[@local = ]
'local'
Если выполняется регистрация SQL Server 2000, установленного на локальном компьютере, то, указав этот параметр, можно зарегистрировать имя, определенное с помощью предыдущего параметра, в качестве имени локального сервера. Данное имя можно просмотреть с помощью переменной @@SERVERNAME.
Изменение имени локального SQL Server 2000 будет отображено только после следующего запуска сервера. До останова будет использоваться то имя, которое имел SQL Server 2000 при запуске. О
[@duplicate_ok =] 'duplicate_OK']
Это последний параметр хранимой процедуры sp_addserver. Указав его, можно избежать вывода сообщения об ошибке при попытке регистрации удаленного сервера с именем, уже имеющимся в таблице sysservers. Процедура просто завершает свою работу в случае обнаружения ранее добавленного связанного или удаленного сервера в таблице sysservers. Никаких действий по изменению имеющихся данных не предпринимается. Если параметр @duplicate_ok не указывается, или имеет иное значение чем 'dupiicate_OK', то при обнаружении совпадения имен процедура вернет код завершения 1 и будет выдано следующее сообщение об ошибке: Server: Msg 15028, Level 16, State 1, Line 1 The server 'Sserver' already exists.
310
Часть III. Администрирование
Как уже говорилось, информация обо всех зарегистрированных серверах, в том числе и локальном, хранится в системной таблице sysservers. Каждый из серверов имеет уникальный в пределах сервера идентификационный номер (столбец srvid). Локальный сервер всегда имеет идентификационный номер 0. Когда хранимая процедура sp_addserve.r вызывается с параметром @iocai, рав1 ным 'LOCAL , то процедура ищет в таблице sysservers сервер с идентификационным номером 0. Если такой сервер существует, то выдается сообщение об ошибке. Никаких действий по удалению имеющейся записи локального сервера не выполняется. Если же сервер с номером 0 не найден, то указанное с помощью параметра @server имя регистрируется в качестве имени локального SQL Server 20»К). Таким образом, чтобы изменить имя локального сервера, необходимо сначала удалить имеющуюся запись. Более простым способом изменения имени локального SQL Server 2000 будет прямое обращение к системной таблице sysservers с помощью запроса: USE master UPDATE sysservers SET srvname = 'NewServerName' WHERE srvid = 0
Изменение имени локального SQL Server 2000 не отображается на имени инсталляции. То есть изменение имени никаким образом не отобразится на том, как пользователи устанавливают соединение с сервером. Также это не отобразится на настройках связанных и удаленных серверов, сконфигурированных на других серверах сети. Изменение имени локального SQL Server 2000 отображается лишь на запросах, выполняемых локально. Если в именах объектов указывается имя сервера, то необходимо соответствующим образом скорректировать эту часть имени объекта. Например, если ранее SQL Server 2000 имел имя STORAGE\Trelon, пользователи могли выполнять следующий запрос на этом же сервере: SELECT * FROM [STORAGE\Trelon].pubs..authors
Администратор изменяет имя сервера на STORAGE\Train с помощью команды: UPDATE master..sysservers SET srvname '= 'Storage\Train' WHERE srvid = 0
В дальнейшем для обращения пользователи должны будут указывать новое имя сервера: SELECT * FROM [STORAGE\Train].pubs..authors
На первый взгляд непонятно, зачем может понадобиться изменение имени сервера. Однако это бывает нужно при переносе с другого сервера баз данных, использующих при обращении к объектам имя сервера. Конечно, можно указать корректное имя при установке SQL Server 2000, но иногда это невозможно из-за необходимости работы как с новым, так и имеющимся сервером. Нахождение в сети двух серверов с одинаковыми именами не допускается. Кроме того, поддержка изменения имени локального сервера открывает некоторые возможности перед разработчиками. Например, при разработке хранимых процедур можно умышленно использовать в именах объектов имя сервера. Изменяя значения в таблице sysservers, возможно заставить сервер обращаться к
Глава 10. Административные задачи
311
объектам, расположенным на любом из серверов сети, в том числе и локальном. Таким образом, нетрудно создать распределенные базы данных. Сконфигурировав несколько связанных или удаленных серверов, можно использовать их имена в хранимых процедурах для обращения к объектам. Если в будущем понадобится перенести объекты одного из SQL Server 2000 на другой сервер, то достаточно будет изменить данные в таблице sysservers и не вносить никаких изменений в хранимые процедуры. Более того, можно будет перенести все объекты на один сервер и изменить свойства связанных или удаленных серверов таким образом, чтобы все они ссылались на этот сервер, который является также и локальным. Мы рассмотрели все параметры хранимой процедуры sp_addserver, предназначенной для добавления удаленного сервера. В качестве примера приведем регистрацию удаленного сервера J L : EXEC sp_addserver 'JL' , NULL, 'duplicate_ok'
Определение отображения на локальном сервере Как и при конфигурировании связанных серверов, использование удаленных серверов требует определения отображения локальных учетных записей в учетные записи удаленного компьютера. Это связано с тем, что видимость учетных записей пользователей ограничивается локальным SQL Server 2000. Для доступа к удаленному SQL Server 2000 необходимо работать с учетной записью, определенной на этом удаленном сервере. Однако технология использования отображений для удаленных серверов отличается от применения отображений связанных серверов. При работе со связанными серверами поставщик OLE DB использует имя учетной записи и пароль, определенные для локального пользователя, для установления соединения с соответствующим связанным сервером. При этом поставщик OLE DB рассматривается как обычный клиент, выполняющий запрос. При работе с удаленными серверами достаточно указать лишь имя учетной записи, в которую будет отображена локальная учетная запись пользователя. Ввод пароля не требуется. Однако администратор удаленного сервера должен со своей стороны разрешить выполнение подобного отображения, явно указав, в какую учетную запись должно выполняться отображение. То есть при использовании удаленных серверов необходимо выполнять конфигурирование как локального, так и удаленного сервера.
Замечание
J
При использовании связанных серверов достаточно сконфигурировать только локальный сервер. На первый взгляд подобный подход обеспечивает более высокую безопасность, т. к. пароль не передается по сети. Однако при ближайшем рассмотрении мож-
312
Часть III. Администрирование
но заметить, что удаленный сервер выполняет проверку сервера, устанавливающего соединение, только по его имени. То есть злоумышленник может попытаться установить в сети SQL Server 2000 с именем, для которого имеется отображение на удаленном сервере. Информация об отображении локальных учетных записей в учетные записи удаленного сервера, как и при работе со связанными серверами, хранится в системной таблице sysxiogins системной базы данных Master. Также как и при работе со связанными серверами, для определения отображения локальных учетных записей в учетные записи удаленного сервера используется системная хранимая процедура sp_addiinkedsrviogin, работа с которой была рассмотрена в разд. "Определение отображения"ранее в этой главе. Необходимо отметить, что если удаленный рервер ранее уже был сконфигурирован в качестве связанного, и были определены отображения, то они могут быть использованы. При этом применяется как имя, так и пароль учетной записи. Замечание Технология удаленных серверов в SQL Server 2000 устроена таким образом, что использование учетных записей Windows NT не поддерживается, т. е. нельзя запускать хранимую процедуру s p _ a d d l i n k e d s r v l o g i n с параметром @useself, равным TRUE. Хотя процедура будет выполнена успешно, при попытке установления соединения появится сообщение о невозможности установления соединения.
Определение отображения на удаленном сервере Как уже говорилось, при работе с удаленными серверами недостаточно конфигурирования отображения локальных учетных записей в учетные записи удаленного сервера. Необходимо выполнить конфигурирование прав доступа и на удаленном сервере. Администратор удаленного сервера должен указать, с какого локальный сервера допускается выполнение процедур. Также может быть определено, какая учетная запись локального сервера в какую учетную запись удаленного сервера должна быть отображена. Замечание Далее в тексте сообщается, что необходимо выполнить некоторые действия на удаленном сервере. Однако при описании действий, выполняемых на этом сервере, мы будем говорить о нем как об удаленном сервере, а не как о локальном, что можно было бы ожидать. Соответственно, независимо от того, о каком сервере идет речь, мы будем называть локальным тот сервер, который выступает в качестве клиента, т. е. отправляет запрос на выполнение хранимой процедуры. До тех пор, пока на удаленном сервере не будет соответствующим образом определено отображения учетных записей, при попытке выполнить на локальном компьютере удаленную хранимую процедуру пользователи будут получать примерно следующие сообщения об ошибке: Server: Msg 11, Level 16, State 1, Line 1 General network error. Check your network documentation.
Глава 10. Административные задачи
313
Server: Msg 7221, Level 18, State 2, Line 1 Could not relay results of procedure 'ProcName' from remote server 'ServerName ' .
Для управления подобным отображением необходимо использовать следующую хранимую процедуру: sp_addremotelogin [@remoteserver =] 'remoteserver' [, [Sloginame =] 'login'] [, [Sremotename =] 'remote name']
Замечание Правами вызова данной хранимой процедуры обладают члены фиксированных ролей сервера s y s a d m i n и S e c u r i t y a d m i n .
Рассмотрим назначение и использование параметров хранимой процедуры. L~J [Sremoteserver =] 'remoteserver'
Параметр задает имя удаленного сервера, для которого необходимо определить отображение. Это имя должно иметься в системной таблице sysserve r s . Если указывается только данный параметр, то все учетные записи локальных пользователей будут отображаться в одноименные учетные записи удаленного компьютера. П
[@loginame =]
'login']
Имя локальной учетной записи, в которую будет выполняться отображение. Указываемая учетная запись должна уже быть создана, и в таблице sysxiogins должна иметься соответствующая строка. Если указывается параметр Qioginame, но не указывается параметр @remotename, то все учетные записи локального компьютера будут отображаться в одну и ту же учетную запись удаленного компьютера. О
[@remotename =] 'remote_name'] Параметр определяет имя учетной записи локального компьютера, для которой определяется отображение.
Ниже приведен пример, с помощью которого выполняется отображение учетной записи Casper локального компьютера в учетную запись sa удаленного компьютера. EXEC sp_addremotelogin 'STORAGE', 'Casper', 'sa'
После того, как будет осуществлено конфигурирование удаленного сервера, пользователи локального сервера смогут выполнять вызовы удаленных хранимых процедур. При внимательном рассмотрении процесса конфигурирования отображений для удаленных серверов можно заметить одну особенность. Ни удаленный, ни локальный сервер не выполняют проверок на достоверность указываемых внешних учетных записей. Это позволяет использовать произвольные имена, в том
314
Часть III. Администрирование
числе и не определенные в таблицах sysxiogins удаленного и локального серверов. При конфигурировании отображения со стороны удаленного сервера с помощью параметра @rmtuser указывается имя учетной записи удаленного сервера. Хотя и говорится, что указываемое имя должно присутствовать на удаленном сервере, эта проверка не выполняется. При обращении к удаленному серверу локальный сервер будет использовать указанное имя, передавая его удаленному серверу. При конфигурировании отображения со стороны удаленного сервера с помощью хранимой процедуры sp_addremoteiogin с помощью параметра @remotename указывается имя учетной записи локального компьютера. Опять же, никаких проверок на достоверность указанных данных не выполняется. Единственным требованием для успешного установления соединения является соответствие значений, указанных с помощью параметров @rmtuser и @remotename, а также соответствие пароля, определенного с помощью параметра @rmtpassword процедуры sp_addlinkedsrviogin, паролю учетной записи (указанной С ПОМОЩЬЮ параметра @loginame Процедуры sp_addremotelogin) удаленного сервера. Замечание По умолчанию удаленный сервер выполняет проверку соответствия паролей, однако и этой проверки можно избежать, если изменить параметры отображения на удаленном сервере. Модификация этих параметров будет рассмотрена в оном из следующих разделов. Таким образом, можно обойти ограничение на использование учетных записей Windows NT. Указав при определении отображения с помощью хранимой процедуры sp_addlinkedsrvlogin для параметра @useself значение FALSE, можно явно задать имя, которое будет участвовать в установлении соединения с удаленным сервером. Можно ввести произвольное значение. Единственно, при конфигурировании отображения на удаленном сервере нужно указать то же самое имя. (
Замечание
^
Вышеописанная технология имеет свои минусы. Если удаленный сервер сконфигурирован также и в качестве связанного, то подобные изощрения с большой вероятностью приведут к невозможности выполнения распределенных и удаленных запросов с использованием технологии связанного сервера. Проблема в том, что для каждой учетной записи локального сервера допускается конфигурирование единственного отображения к каждому из серверов. При этом связанный и удаленный серверы не разделяются. Тем не менее, к данным можно обратиться с помощью системной хранимой процедуры s p s q l e x e c , выполнив с ее помощью нужный запрос на удаленном сервере. В качестве пояснения к сказанному выше приведем пример конфигурирования отображения. Сначала определим отображение на локальном компьютере:
Глава 10. Административные задачи
315
sp_addlinkedsrvlogin 'STORAGE\Trelon', 'false', 'STORAGE\Administrator' , 1 RandomName',
Замечание В рассматриваемом примере предполагается, что учетная запись sa удаленного сервера имеет пустой пароль.
Теперь же необходимо настроить отображение на удаленном сервере: sp_addremotelogin ' sa', 'RandomName'
'STORAGE',
На этом рассмотрение определения отображений заканчивается.
Просмотр отображений Для просмотра информации об учетных записях локального сервера, сконфигурированных для обращения к удаленному серверу, как и при работе со связанными серверами, служит системная хранимая процедура s p h e i p i i n k e d s r v i o g i n , которая была рассмотрена в подразд. "Просмотр отображений" разд. "Связанные сервера" ранее в этой главе, поэтому мы не будем лишний раз останавливаться на этом. Основное же внимание в данном разделе будет уделено рассмотрению системной хранимой процедуры s p h e i p r e m o t e i o g i n , предназначенной для просмотра списка учетных записей, которые могут обращаться к текущему серверу как к удаленному. Синтаксис этой хранимой процедуры таков: sp_helpremotelogin [[Sremoteserver =] 'remoteserver'] [, [@remotename =] 'remote_name']
При вызове процедуры без параметров будет выведена информация обо всех сконфигурированных отображениях. Если необходимо получить информацию об отображениях учетных записей с конкретного сервера, то нужно с помощью параметра Sremoteserver указать имя интересующего сервера. Когда же требуется получить информацию обо всех отображениях конкретной учетной записи, сделанных для любого из серверов, необходимо указать имя интересующей учетной записи с помощью параметра gremotename. Результатом выполнения процедуры s p h e i p r e m o t e i o g i n будет набор строк, каждая из которых соответствует отдельному отображению. Информация выводится в колонках: •
server — имя сервера, который может обращаться к текущему как к удаленному;
G local_user_name — имя локальной учетной записи, в которую выполняется отображение;
316
Часть III. Администрирование
П remote_user_name — имя учетной записи внешнего сервера, которая отображается в локальную учетную запись, указанную в предыдущем столбце; П options — целое число, отображающее установленные опции. Приведенная ниже команда выводит список всех учетных записей, имеющих доступ к текущему серверу как к удаленному. EXEC sp_helpremotelogin
Будет выведен примерно следующий результат: server
local_user_name
remote_user_name
STORAGE STORAGE STORAGE
sa sa sa
JL DM
Casper Casper
Administrator RandomName STORAGE\Administrator RandomName RandomName
options
Если же укажем при вызове хранимой процедуры для параметра @remoteserver значение • STORAGE ', то будет получен такой результат: server
local user name
remote user name
STORAGE STORAGE STORAGE
sa sa sa
Administrator RandomName STORAGE\Administrator
options
Продемонстрируем также использование параметра @remotename: EXEC sp_helpremotelogin NULL ,
'RandomName'
Будет выведен примерно следующий результат: server STORAGE
JL DM
local_user_name
remote_user_name
sa
RandomName RandomName RandomName
Casper Casper
options
Для получения информации хранимая процедура sp_heipremoteiogin обращается к представлению sysremoteiogins, которое строится на основе системной таблицы sysxiogins. Для получения информации об отображениях также можно использовать непосредственно представление sysremoteiogins или таблицу sysxiogins. Однако подобный способ требует определенной квалификации и некоторых затрат на написание запроса. Однако данный метод незаменим, если нужно получить сведения помимо тех, которые предоставляет хранимая процедура sp_helpremotelogin. Представление sysremoteiogins имеет следующую структуру: •
remoteserverid — этот столбец содержит идентификационный номер связанного сервера, к которому относится отображение. Идентификационный номер должен соответствовать идентификационному номеру связанного сервера, указанного в столбце srvid таблицы sysservers;
Глава 10. Административные задачи
•
317
remoteusername — имя учетной записи удаленного сервера, в которую будет отображаться локальная учетная запись;
П s t a t u s — в этом столбце находится информации о статусе отображения. Столбец имеет тип данных small i n t . Каждый из битов числа, хранимого в столбце, соответствует одной из опций. Установленный бит соответствует установленной опции; •
s i d — идентификатор безопасности учетной (SID) записи локального сервера, которая отображается в учетную запись удаленного сервера, указанную в столбце remoteusername. Значение SID для пользователя можно получить с ПОМОЩЬЮ фуНКЦИИ SUSER_SID ( ' LoginName ' ) |
•
changedate — дата последнего изменения соответствующего отображения. При создании и последующих изменениях отображения в этом столбце указывается время, в которое была запущена соответствующая хранимая процедура. Если изменения выполняются непосредственно, то значение в этом столбце автоматически не меняется.
Свойства отображения Для отображений, конфигурируемых на локальном сервере, не имеется никаких свойств. Однако при настройке отображений со стороны удаленного сервера пользователь может изменить некоторые параметры. Для этого служит системная хранимая процедура s p r e m o t e o p t i o n , имеющая синтаксис: sp_remoteoption [[Sremoteserver =] 'remoteserver'] [, [Sloginame =] 'loginame'] [, [Sremotename =] 'remotename'] [, [@optname =] 'optname'] [, [@optvalue =] 'optvalue']
За^ечанисГ Правом выполнения данной процедуры обладают члены фиксированных ролей сервера s y s a d m i n И S e c u r i t y a d m i n .
Рассмотрим назначение и использование параметров хранимой процедуры. d
[@remoteserver =] 'remoteserver'
Имя сервера, для которого требуется изменить параметры отображения. Указывается имя сервера, который будет обращаться к текущему серверу как к удаленному. Этот сервер уже должен быть определен на текущем сервере, Т. е. его ИМЯ ДОЛЖНО Иметься В столбце srvname таблицы sysservers. П
[@loginame =] 'loginame'
Имя учетной записи локального сервера, в которую отображается учетная запись сервера с именем, заданным с помощью предыдущего параметра. Имя удаленной учетной записи определяется с помощью следующего параметра. Указываемая с помощью параметра @loginame учетная запись должна быть создана на текущем сервере.
318 О
Часть HI. Администрирование [@remotename =] 'remotename'
Имя учетной записи, которая отображается в локальную учетную запись. Отображение должно быть определено заранее с помощью хранимой процедуры spaddremoteiogin, описанной выше в одном из предыдущих разделов данной главы. О
[@optname =] 'optname'
Параметр определяет имя опции, значение которой предполагается изменить. В настоящее время количество опций невелико и, возможно, в будущем увеличится. Сейчас же пользователи могут управлять лишь одной опцией — ' t r u s t e d ' . Она определяет поведение сервера при попытке установления с ним соединения с помощью технологии удаленных серверов. Если опция ' t r u s t e d ' задана (@optvaiue='TRUE'), то устанавливается доверительное соединение. Это означает, что удаленный сервер не будет выполнять проверки соответствия пароля, указанного при конфигурировании отображения на локальном компьютере, паролю, установленному на удаленном сервере для учетной записи, в которую выполняется отображение. При сброшенной опции (@optvaiue=? FALSE 1 ) удаленный сервер будет проверять соответствие паролей. При каждом изменении пароля учетной записи на удаленном сервере необходимо будет также изменять пароль, указанный при определении отображения на локальном сервере. П
[@optvalue =] 'optvalue'
Этот параметр может принимать либо значение TRUE, ЧТО приведет к установке указанной опции, либо значение FALSE, ЧТО повлечет сброс опции. В качестве примера рассмотрим вызов процедуры, который разрешает подключаться с сервера STORAGE учетной записи RandomName, которая отображается в локальную учетную запись sa, без необходимости указывать пароль: sp_remoteoption 'STORAGE', 'sa1, . 'RandomName', Qoptname = 'trusted', @optvalue = 'TRUE'
Удаление отображения Для удаления отображений на локальном сервере, как и при работе со связанными серверами, существует хранимая процедура sp_dropiinkedsrviogin. Описание ее параметров и работа с ней были даны в подразд. "Удаление отображений" разд. "Связанные серверы"ранее в этой главе. Для удаления отображений на удаленном сервере используется хранимая процедура sp_dropremotelogin, имеющая синтаксис: sp_dropremotelogin [@remoteserver =] 'remoteserver' [, [@loginame =] 'login'] [, [@remotename =] 'remote name']
Глава 10. Административные задачи
319
Замечание Правом выполнения этой хранимой процедуры обладают члены фиксированных ролей сервера sysadmin и Securityadmin. Как видно, процедура имеет всего три параметра, и только первый из них является обязательным. Если указывается лишь параметр @remoteserver, то будут удалены все отображения для сервера, имя которого и определено этим параметром. Дополнительно с помощью параметра eioginame можно указать имя учетной записи текущего удаленного сервера, отображение в которую следует удалить. Список удаляемых отображений можно также сузить, указав с помощью параметра gremotename имя учетной записи, которая отображается в локальную учетную запись. В качестве примера рассмотрим удаление отображения для учетной записи Windows NT с именем Casper, определенного для связанного сервера STORAGE: EXEC sp_dropremotelogin @remoteserver = 'STORAGE', Sremotename = 'Casper'
На этом управление отображением локальных учетных записей в учетные записи связанного сервера заканчивается.
Удаление удаленного сервера Для полной деактивизации удаленного сервера необходимо удалить информацию как на локальном, так и на удаленном сервере. В принципе, чтобы запретить пользователям выполнение удаленных хранимых процедур, достаточно изъять отображения учетных записей. Деактивизация удаленного сервера необходима, когда он деинсталлируется и в будущем не станет использоваться, или когда требуется гарантия, что восстановление возможности выполнения удаленных хранимых процедур потребует определенных усилий. В принципе, для прекращения связи серверов достаточно удалить сведения с одной стороны — либо со стороны локального сервера, либо со стороны удаленного. Для удаления информации со стороны как локального, так и удаленного сервера предназначена системная хранимая процедура sp_dropserver. Ее использование было описано ранее в одном из разделов этой главы.
С
Замечание
)
Следует быть осторожным при удалении информации об удаленном сервере. Как уже было сказано, SQL Server 2000 не делает различия между связанным и удаленным сервером. Поэтому, при удалении информации об удаленном сервере будет устранена информация и о связанном сервере.
Использование Enterprise Manager Как было сказано ранее, использование технологии удаленных серверов требует конфигурирования как со стороны локального сервера, так и со стороны уда-
Часть III. Администрирование
320
ленного. Как мы уже говорили, между связанными и удаленными серверами существует лишь небольшое различие. Поэтому настройка со стороны локального сервера выполняется точно так же, как и при работе со связанными серверами. То есть для создания удаленного сервера необходимо использовать окно Linked Server Properties - New Linked Server. Описание создания связанного сервера средствами Enterprise Manager было рассмотрено ранее в этой главе. Для конфигурирования локального сервера в качестве удаленного для других серверов предназначена папка Remote Servers (рис. 10.17), которую можно найти в папке Security каждого сервера. Для разрешения использования локального сервера в качестве удаленного и для управления отображениями учетных записей используется окно Remote Server Properties (рис. 10.18), открыть которое можно с помощью команды New Remote Server из контекстного меню папки Remote Servers или при нажатии кнопки Action. 7* SQL Server Enterprise Manager - [Console Root\McrosoK SQL Servers\~ M m!X ^~A^J?i^feiJjiri м ^Viiiii^i r!lfri 1 "g] Consoe l Wn idow Hep l W 0 EC СЭ | Acto i n Ve iw loo Tree | 1 Remote Servers 8 Items Net Name ;+l |J master •* |Name ' a^FH483D-GL73 FH483D-GL73 £ <Jт5с|model 2^FOL ; ; ш0 ь FOL :J 2 HABA-HABA i ! *i t^i Northwind HABA-HABA : i Щ-Щ pubs g ^ repl_distributor repljdistributor • ft? U tempdb »9 STORAGE STORAGE : : ffl• (_J Data Transformation Services •^STORAGEUrelon STORAGE\Treo ln fJ ; • '+}• i'; l Management 2 TERAN TERAN + __J Replication VSM1 • ; ffi US Repl cation Monitor ;
;:
•• :
! ; !
; ; !
В E j Security
• Ш Logins : ' - ^ Server Roles : :- JJi Lnked Servers у, AUTHORSJET Q DIRKA J, PARATRUPER ^i PROBA
i
J i;
У, STAR 3 l STORAGE\PlanetX ^ TRELON
; ; В L J Support Services : ; Si CU Meta Data Services I i Щ) STORAGE\TRELON (Windows NT/2000) 1 >. - j TERAN — ffl £ J
other
Servers
X
-1PI I
-rj
Рис. 10.17. Папка Remote Servers
В поле Name указывается имя SQL Server 2000, пользователи которого смогут обращаться к локальному серверу как к удаленному. Для инсталляции по умолчанию достаточно указать сетевое имя NetBIOS компьютера, на котором установлен соответствующий SQL Server 2000. Для именованной инсталляции помимо имени компьютера необходимо указать и имя инсталляции. Кроме того,
Глава 10. Административные задачи
321
для имени следует соблюдать уникальность. То есть ранее не должно быть зарегистрировано сервера с тем же именем, что указано в поле Name. Более того, также не должно существовать связанного сервера с аналогичным именем. Remote Server Properties General Name: STORAGE f? gig Remote login mappn ig Г Map all remote logins to
(* Map remote logins to different local logins | Local Login Name Remote Login Name Я distributor_admin sa
distributor_admin distributor_admin
Cancel
Check Password
•
Help
Рис. 10.18. Окно Remote Server Properties
Замечание Напомним, что в качестве удаленных серверов допускается использование только SQL Server. Для обращения к другим источникам данных необходимо использовать технологию связанных серверов.
Устанавливая флажок RPC, можно разрешить пользователям удаленного сервера выполнять хранимые процедуры локального сервера с помощью технологии удаленного вызова процедур (RPC, Remote Procedure Call). В группе элементов Remote login mapping можно управлять отображением учетных записей сервера, с которого осуществляется вызов хранимых процедур, в учетные записи текущего сервера. При установке переключателя в положение Map all remote logins to все учетные записи станут отображаться в одну и ту же учетную запись локального сервера (т. е. удаленного сервера, с точки зрения пользователя, осуществляющего вызов хранимой процедуры). Имя учетной записи, в которую будет происходить отображение, выбирается в раскрывающемся списке справа от переключателя. По умолчанию в этом списке выбрано значение <Same Name>. Это означает, что каждый пользователь, обращающийся к удаленному серверу, будет проходить аутентификацию с использованием своего
322
Часть ///. Администрирование
имени и пароля. То есть для того, чтобы пользователь имел возможность вызвать хранимую процедуру на удаленном сервере, он должен иметь одноименные учетные записи как на локальном, так и на удаленном сервере. Также имеется возможность выполнять отображение всех учетных записей клиентов в одну и ту же учетную запись удаленного сервера. Для этого достаточно выбрать в списке имя нужной учетной записи. По умолчанию проверка соответствия паролей учетных записей не выполняется. То есть для установления соединения с конфигурируемым удаленным сервером достаточно использовать для аутентификации учетную запись, которая существует на удаленном сервере. При установке переключателя в положение Map remote logins to different local logins необходимо будет определить отображения для каждой учетной записи сервера, имя которого указано в поле Name. В столбце Remote Login Name указывается имя учетной записи, которая будет применяться на сервере-клиенте для вызова хранимых процедур с конфигурируемого удаленного сервера. Значения в этом столбце вводятся вручную. В столбце Local Login Name указывается имя учетной записи локального сервера, в которую будет выполняться отображение. Администратор должен выбрать в раскрывающемся списке имя одной из учетных записей, уже имеющихся на сервере. Установка флажка в столбце Check Password приведет к тому, что при установлении соединения будет выполняться проверка на соответствие паролей. Если флажок сброшен, то такая проверка не проводится, и для установления соединения будет достаточно определить отображение. На этом конфигурирование удаленного сервера можно считать рассмотренным.
Глава 11
Доступ к гетерогенным источникам данных При разработке хранилищ данных часто встает вопрос о необходимости периодического копирования разнородных данных в единый формат. Унаследованные из прошлого системы, используемые на предприятиях для хранения данных, весьма разнообразны. Применение различных архитектур и технологий создает дополнительные трудности. Объединение данных из множества гетерогенных источников является непростой задачей даже для опытных администраторов. Большинство информационных систем реализовывается в виде звезды. В центре располагается мощная система управления базами данных, накапливающая и обрабатывающая основную массу информации. В качестве периферийных клиентских систем выступают настольные приложения, такие, как, например DB2, Paradox, MS Excel, dBase и т. д. Служащие в начале месяца копируют с центрального хранилища информацию об имеющихся на складе товарах, их ценах и подготовленный аналитической службой список возможных покупателей. В конце месяца работники копируют данные о проданных товарах. Чем больше размеры системы и разнообразие используемых приложений, тем сложнее становится управлять циркулирующими на предприятии данными. Можно найти выход, перенеся всю информацию на единую платформу. Но часто это нецелесообразно или просто невозможно по тем или иным причинам. Повсеместная установка SQL Server 2000 и покупка дополнительных клиентских лицензий будет стоить немалую сумму, и поэтому не всегда возможна. К тому же, если учесть, что наверняка придется обновить большую часть компьютерного парка, то такая затея вряд ли вызовет поддержку начальства. Лучшим решением будет установка нескольких SQL Server, которые будут собирать, обрабатывать и тиражировать всю информацию, предоставляемую уже внедренными и проверенными системами. До момента появления SQL Server 2000 уже было создано достаточно много различных систем, предназначенных для хранения данных и управления ими. Помимо SQL Server 6.x и более ранних версий существует еще целый ряд продуктов, используемых и по сей день. Количество данных, накопленных на этих системах, весьма значительно. Если компания по тем или иным причинам решила начать работу с SQL Server 2000, то необходимо будет выполнить перенос накопленных данных на новую платформу. Для безболезненного перехода на SQL Server 2000 корпорация Microsoft позаботилась о создании инструментов, с помощью которых можно выполнить перенос данных практически с любой платформы на SQL Server 2000.
324
Часть III. Администрирование
В этой главе будут рассмотрены различные механизмы, с помощью которых можно выполнять обмен данными между SQL Server 2000 и другими системами хранения информации.
Экспорт и импорт данных Все операции обмена данными между SQL Server 2000 и другими системами можно разделить на импорт и экспорт. Чаще всего нужно организовать либо импорт, либо экспорт данных. Хотя в некоторых ситуациях бывает необходимо выполнить обе операции. Импорт данных подразумевает копирование SQL Server 2000 информации, хранящейся на различных внешних системах. В процессе выполнения импорта в таблицы баз данных SQL Server 2000 добавляется новая информация. Целью экспорта данных является предоставление внешним системам информации, хранящейся на SQL Server 2000. При этом данные преобразуются в формат, понятный внешней системе. Например, если требуется передать данные в MS Excel, то результатом выполнения экспорта будет xls-файл. Замечание Когда мы будем говорить об операциях обмена данными, то станем также употреблять термин "перенос данных". При этом не важно, что конкретно выполняется — импорт или экспорт.
Если SQL Server 2000 устанавливается с целью замены устаревшей системы хранения информации, то начальной задачей после завершения установки и конфигурирования системы будет перенос данных. Первое, что необходимо для этого сделать — это создание базы данных и таблиц, в которые будет осуществляться перенос данных. Для организации таблиц с нужной структурой можно использовать различные методы. Например, если внешняя система поддерживает скриптование объектов, то это позволяет получить готовый код, с помощью которого можно автоматизировать процесс создания таблиц. Кроме того, некоторые инструменты переноса данных SQL Server 2000 позволяют образовывать структуры данных, в которые может быть сохранена импортируемая информация. После того, как все необходимые таблицы были созданы, можно переходить непосредственно к процессу импорта данных. Операции импорта/экспорта могут выполняться лишь один раз или периодически на долговременной основе. Одноразовый перенос данных обычно наблюдается при переносе данных на SQL Server 2000 с других систем хранения данных. Например, при выполнении обновления с SQL Server 6.x до SQL Server 2000 достаточно только один раз перенести информацию. Затем все операции обработки данных можно выполнять непосредственно в SQL Server 2000. Периодический импорт данных используется в том случае, если на предприятии продолжается эксплуатация устаревших систем. Сотрудники отделов могут использовать в своей работе различные продукты, но все данные стекаются в SQL
Глава 11. Доступ к гетерогенным источникам данных Server 2000, где они анализируются, обрабатываются и хранятся. При этом необходимо выполнить преобразование данных из форматов используемых приложений в формат SQL Server 2000. Такие операции можно выполнять вручную или автоматически. Система автоматизации управления сервером и данными была рассмотрена в главе 5.
Выбор метода переноса данных SQL Server 2000 предоставляет пользователю несколько различных методов для импорта и экспорта данных. Каждый из них имеет свои недостатки и преимущества. Кроме того, SQL Server 2000 поддерживает несколько специализированных программных интерфейсов, используя которые можно создавать свои собственные приложения для переноса данных. В обычной практике применяют следующие методы переноса данных: •
Службы трансформации данных — Data Transformation Services (DTS). SQL Server 2000 предлагает несколько различных способов работы с механизмами DTS. Более подробно каждый из них будет рассмотрен в разд. "Использование Data Transformation Services"далее в этой главе.
О Программный интерфейс массивного копирования — Bulk Copy API. Для этого метода также поддерживается несколько способов работы, которые будут рассмотрены в разд. "Механизмы массивного копирования" далее в этой главе. •
Репликация данных. Данный метод является отдельной темой для разговора и будет рассмотрен в главе 14. Репликация является мощным инструментом обмена данными между серверами SQL Server. Все возможности подсистемы репликации могут быть использованы, если серверы-участники являются SQL Server 2000. Но также реализована поддержка серверов SQL Server 6.x и SQL Server 7.0.
•
Распределенные запросы — Distributed Query. Метод позволяет в одном запросе объединять данные, расположенные на множестве различных источников. Как частный случай распределенных запросов можно рассматривать удаленные запросы (remote query).
П1 Команда SELECT INTO. Она позволяет создавать новую таблицу на основе данных, полученных в результате запроса. При этом также выполняется вставка всех полученных запросом данных в созданную таблицу. Совместно с использованием распределенных запросов команда SELECT INTO предоставляет возможность создать на локальном сервере копию данных, полученных в результате слияния информации с множества удаленных источников данных. •
Команда INSERT. Указанная команда является стандартным средством добавления данных в таблицу. При этом допускается вставка данных, являющихся результатом выполнения сложных запросов, в т. ч. и распределенных.
Перед выбором конкретного метода следует оценить, к каким источникам данных придется обращаться, будет ли перенос данных выполняться единожды или
325
326
Часть III. Администрирование
периодически в течение длительного времени. Немаловажным при выборе инструмента является легкость его использования и обеспечиваемая производительность. В табл. 11.1 приведена сводная информация о возможностях каждого из методов. Таблица 11.1. Характеристики различных Требуемая функциональность
DTS
Вер
методов переноса
BULK INSERT
Репликация
данных
SELECT INTO/ INSERT
Автоматическое выполнение Графический интерфейс Импорт из ODBC Импорт из OLE DB Импорт из текстового файла Командная строка/пакетная обработка Максимальная производительность Программируемый интерфейс Сценарий Transact SQL Специальный импорт/экспорт Трансформация данных Экспорт в ODBC Экспорт в OLE DB Экспорт в текстовый файл
Автоматическое выполнение переноса данных с использованием DTS и подсистемы репликации можно считать встроенной характеристикой. Для того чтобы иметь возможность выполнять перенос данных с помощью утилиты bcp.exe, команд BULK INSERT SELECT и INTO/INSERT периодически и в определенное время
необходимо создать соответствующие задания для SQLServerAgent. Строго говоря, и службы трансформации данных DTS также для автоматического выполнения переноса данных используют службу SQLServerAgent. Только подсистема репликации сама обеспечивает автоматический перенос данных. Для того чтобы иметь возможность обращаться к удаленным источникам данных необходимо предварительно установить специального поставщика OLE DB. Это можно сравнить с настройкой ODBC-соединения. Рассмотрим технологию OLE DB более подробно. OLE DB — это основной интерфейс корпорации Microsoft для доступа к данным, занявший место DB-Library, до последнего времени являвшимся основ-
Глава 11. Доступ к гетерогенным источникам данных
327
ным низкоуровневым API для доступа к базам данных. Microsoft развила успех технологии ODBC, используемой для доступа к реляционным источникам данных, разработав технологию OLE DB, обеспечивающую универсальный доступ к широкому диапазону реляционных и нереляционных источников данных: • мэйнфреймы ISAM/VSAM и иерархические базы данных; О файловые хранилища и хранилища электронной почты; • текстовые, графические и географические данные; •
пользовательские бизнес-объекты и другие.
Universal Access — это новая технология, пришедшая на смену Universal Server, при которой все данные экспортировались в особые базы данных, называемые универсальными серверами. Основная проблема универсальных серверов заключалась в немедленном устаревании данных, т. к. хранилась копия данных, а не сами данные. Приходилось либо заново экспортировать всю информацию, либо на прикладном уровне реализовывать механизмы оперативного экспорта обновленных данных. Использование технологии Universal Access предполагает обращение непосредственно к данным, а не к их копии. Все данные остаются на своих местах в естественной для них форме. При этом необходимо использовать промежуточный слой, проводящий преобразование данных между различными форматами в реальном режиме. SQL Server решает эту проблему использованием поставщика OLE DB — специальных объектов, предоставляющих доступ к конкретным источникам информации. Дополнительным преимуществом технологии OLE DB является возможность использования "родных" механизмов при обработке данных с помощью запросов. В SQL Server 2000 реализован OLE DB 2.0, основанный на модели СОМ и представляющий из себя гибкий и масштабируемый API низкого уровня. OLE DB — это открытая спецификация, предоставляющая средства для безболезненной интеграции компонентов различных производителей в единую систему. Использование OLE DB повышает производительность операций переноса данных за счет снижения сетевого трафика, т. к. основная масса работы выполняется непосредственно в источнике данных. SQL Server 2000 включает множество поставщиков OLE DB, обеспечивающих доступ к большинству современных систем накопления данных. Независимые разработчики могут легко создавать новых поставщиков OLE DB для поддержки своих собственных хранилищ данных. (~
Замечание
^
Основой работы SQL Server 2000 с удаленными хранилищами данных является технология OLE DB. Но для сохранения обратной совместимости реализована возможность работы с SQL Server 2000 с использованием ODBC. При этом ODBC рассматривается как рядовой продукт, как, например MS Excel или MS Access. Для поддержки ODBC в SQL Server 2000 предназначен специальный поставщик OLE DB — OLE DB Provider for ODBC. Этот поставщик является своеобразным шлюзом между технологиями OLE DB и ODBC, выполняя преобразование из одного формата в другой.
328
Часть III. Администрирование
Перенос данных в текстовый файл Возможности SQL Server 2000 действительно весьма велики. Пользователи могут напрямую обращаться к различным источникам данных — Oracle, MS Access, dBase и многим другим. Тем не менее, в некоторых ситуациях возникает необходимость использовать "нейтральный" формат, понятный любой системе. Например, если требуется отправить прайс-лист по электронной почте множеству клиентов и гарантировать, что все они смогут его прочитать, выбор какого-то конкретного формата в этом случае нежелателен, т. к. нет гарантии, что все пользуются одинаковым программным обеспечением. Выходом из подобных ситуаций может служить использование простых текстовых файлов. Можно с уверенностью сказать, что текстовый файл способны прочитать все. Кроме того, большинство систем управления и обработки данных могут успешно работать с текстовыми файлами. Если используется приложение, не поддерживаемое SQL Server 2000, то для обмена данными также можно применять текстовые файлы. Конечно, при этом выполняется промежуточная операция, и скорость работы не велика, но все же это лучше, чем ничего. Текстовые файлы могут быть успешно использованы для передачи данных между серверами SQL Server 2000 с различными кодовыми страницами, порядками сортировки или сопоставлением Unicode. При выполнении изменения любого из трех перечисленных параметров на локальном сервере можно скопировать все данные в текстовые файлы, а после перестроения закачать их обратно. В SQL Server 2000 имеется несколько различных способов работы с текстовыми файлами: •
утилита командной строки bcp.exe (Bulk Copy Program);
•
команда Transact-SQL BULK INSERT;
•
службы трансформации данных DTS.
Более подробно работа каждого из упомянутых методов будет представлена далее в этой главе.
Службы Data Transformation Service В последнее время все больше используется централизованная модель хранения данных. Информация со всего предприятия стекается на один или несколько серверов баз данных, где она обрабатывается и хранится. Любой пользователь предприятия может обратиться к информации и получить ее в наиболее удобной форме. Если бы данные хранились распределенно, то каждый пользователь должен был бы сам заботиться о получении необходимых данных. Централизованное хранение информации к тому же позволяет создавать высокоэффективные системы поддержки принятия решений, которые становятся все более популярными в последнее время. Тем не менее, для хранения информации часто применяются самые разнообразные системы, нередко использующие разные технологии и поэтому имеющие несовместимые форматы хранения дан-
Глава 11. Доступ к гетерогенным источникам данных ных. Объединение всех существующих данных в один комплекс является довольно сложной задачей, способной озадачить даже опытных администраторов. Появление стандартов, подобных ANSI SQL-92, способствовало повышению совместимости механизмов различных СУБД. Тем не менее, каждый из производителей вносит в свой продукт дополнения и расширения языка для повышения конкурентоспособности. Наряду с пользой, получаемой от повышения гибкости и мощности языка, налицо и отрицательная сторона — несовместимость кода, написанного для разных СУБД. Корпорация Microsoft избегает этого, применяя в Data Transformation Services технологию сквозного доступа к источникам информации, реализованную в механизме DTS Transformation Engine. При использовании сквозного доступа код запроса отсылается непосредственно СУБД, избегая модифицирования или интерпретации команд механизмами DTS. Любой оператор, который работал при помощи "родного" интерфейса СУБД, будет работать точно так же и в процессе преобразования. Например, при обращении к серверу Oracle из DTS-пакета используется то же расширение ANSI SQL, что и при работе непосредственно с Oracle. DTS Transformation Engine гарантирует полную доступность функциональности источников. Пользователи могут без изменения обращаться к разработанным ранее сценариям и хранимым процедурам, вызывая их как обычно. В качестве источника информации для DTS может выступать не только СУБД, но и офисные приложения, например Microsoft Excel. Кроме того, используя OLE DB provider for ODBC со специфическим драйвером, можно получить доступ к ODBC-системам, например Sybase и Informix. В DTS также реализована поддержка текстовых файлов, причем как с помощью поставщика OLE DB, так и напрямую. Корпорация Microsoft максимально упростила процесс импорта и экспорта данных, позаботившись о написании эффективных инструментов для трансформации и переноса информации. Механизмы Data Transformation Services позволяют запускать операции импорта и экспорта между множеством гетерогенных хранилищ информации. Причем при выполнении одной задачи DTS можно осуществлять как импорт, так и экспорт. С помощью DTS можно создавать мощные автоматизированные системы, которые будут самостоятельно копировать данные из множества источников, выполнять их трансформацию и, возможно, экспортировать данные или их часть в другие хранилища. Трансформация — это процесс преобразования данных механизмами Data Transformation Services при их переносе с одного источника на другой. В SQL Server 2000 реализованы довольно мощные механизмы трансформации данных, позволяющие выполнять сложную обработку данных. Администратор может легко реализовать любой алгоритм трансформации данных. Для этого DTS позволяет использовать скриптовые языки. JavaScript, VBScript и PerlScript. Объединяя возможности автоматического выполнения задач DTS с механизмами трансформации, администратор может создавать очень мощные системы обработки данных. В центре такой системы будет располагаться SQL Server 2000, а на периферии могут находиться самые разнообразные системы. Однажды на-
329
330
Часть III. Администрирование
строив процесс переноса и трансформации данных, администратор может лишь изредка контролировать параметры его работы и при необходимости вносить какие-то изменения. Службы DTS возьмут на себя всю "черновую" работу. Это освободит администратора для решения более интеллектуальных задач. Механизмы DTS позволяют переносить между источниками информации не только сами данные, но и описание таблиц. Кроме того, если все участники переноса данных работают на серверах SQL Server 2000, то допускается также перенос различных объектов базы данных: индексов, умолчаний, триггеров, ограничений целостности и т. д. Кроме того, допускается перенос пользователей и разрешений, выданных пользователям на доступ к объектам.
Архитектура DTS Перед тем, как начать процесс переноса данных, необходимо сначала описать все источники информации, к которым будет выполняться обращение, а также описать действия, которые будут осуществляться при переносе данных. Описание всех этих параметров сохраняется в специальном объекте — пакете (package). Любой пакет DTS состоит из трех основных объектов: • Connections objects. Объекты этого типа используются для описания источников данных OLE DB, к которым будет выполняться обращение в процессе выполнения пакета. Сразу же после запуска пакета SQL Server 2000 службы трансформации устанавливают соединение с описанными источниками данных. Объекты Connections objects бывают следующих типов: • File connections. Тип предназначен для работы с текстовыми файлами. При описании файлового соединения необходимо указать имя файла и его местонахождение на диске, а также используемый формат (ANSI или Unicode). Кроме того, в случае необходимости можно указать разделители строк и столбцов. • Data Source Connections. Данный тип служит для работы с источниками данных, поддерживаемых DTS автоматически. В зависимости от типа объекта необходимо указать имя и пароль пользователя, имя и нахождение файлов и т. д. Может быть использован для работы с SQL Server 2000, Paradox, dBase, MS Access 2000, Oracle, электронными таблицами MS Excel, источниками HTML, ODBC, т. е., всеми источниками, для которых имеются поставщики OLE DB. • Microsoft Data Link Connections. Если необходимо установить соединение с источником данных, не поддерживаемым автоматически DTS, но имеющим соответствующего поставщика OLE DB, то нужно будет воспользоваться Microsoft Data Link Connections. Описание источника данных сохраняется в файлах с расширением udl. Конкретный набор свойств, которые необходимо будет сконфигурировать, зависит от источника данных. • Task Objects. Объекты этого типа DTS пакета описывают действия, которые необходимо выполнить. Действия представляются в виде задач (tasks). Каждая задача имеет множество параметров, управляя которыми можно выпол-
Глава 11. Доступ к гетерогенным источникам данных
331
нять сложные преобразования данных. Объекты Task Objects могут использоваться для выполнения следующих типов задач: •
Преобразование данных. К задачам указанного типа относятся задачи Data Driven Query Task, Transform Data Task и ParallelDataPump Task Objects. Они могут использоваться для выполнения преобразования данных практически любой сложности. Для описания преобразования служат возможности скриптовых языков Microsoft ActiveX.
•
Копирование и управление данными. К задачам этого типа относятся Сору SQL Server Objects Task, Execute SQL Task и Bulk Insert Task. Основным их назначением является обеспечение эффективного обмена данными. Например, можно удалить таблицу, создать ее заново, закачать в нее данные, сделать выборку из таблицы и на основе полученного результата принять решение о том, какая задача должна быть выполнена следующей.
•
Запуск заданий из пакета DTS. К задачам этого типа относятся задачи ActiveX Script Task, Dynamic Properties Task, Execute Package Task, File Transfer Protocol Task, Execute Process Task и Send Mail Task. Используя их возможности, допустимо ежедневно запускать приложение, которое будет выполнять сбор и обработку данных. После этого можно запустить второй пакет, который станет выполнять обработку агрегированных данных. Помимо всего прочего, можно отправлять сообщения по электронной почте, извещающие администратора о ходе выполнения пакета.
П Step Objects. Объекты этого типа описывают последовательность, в которой должны выполняться задачи в пакете. Для этого между задачами устанавливаются отношения предшествования (precedence constraints), определяющие зависимость задач друг от друга. Например, задача создания резервной копии может выполняться только после того, как будет завершено слияние данных из трех источников. Ниже приведен список отношений предшествования, который имеется в распоряжении пользователей. Для описания отношений предшествования будем предполагать, что существуют задачи TaskA и TaskB, и между ними определено отношение предшествования, причем задача TaskA выполняется первой и от результата ее выполнения будет зависеть, начнет ли выполняться задача TaskB. •
Безусловное (Unconditional) — означает безусловное выполнение одной задачи после завершения другой. То есть задача TaskB будет выполнена всегда, независимо от результата завершения задачи TaskA. Этот тип отношения предшествования используется, когда необходимо обязательно выполнить две задачи, но в определенном порядке.
• Успешное (On Success) — при использовании отношения предшествования этого типа задача TaskB будет выполнена только в том случае, когда задача TaskA успешно завершена. Данное ограничение предшествования может применяться, например, когда задача TaskA выполняет удаление таблицы, а задача TaskB — ее повторное создание. Таким образом, если таблица не будет удалена, то система не станет пытаться ее создавать, т. к. эта операция сразу же обречена на неудачу.
332
Часть III. Администрирование
• Неудачное (On Failure) — отношение предшествования используется, когда необходимо выполнить задачу TaskB в случае неудачного завершения задачи TaskA. Развивая предыдущий пример, в случае невозможности удаления таблицы можно выполнить задачу, которая удаляет все строки и соответствующим образом изменяет структуру таблицы. Пакет DTS может быть создан интерактивно с помощью мастера DTS Import and Export Wizard или DTS Designer. Используя мастер DTS Wizard, можно копировать данные из таблицы или SQL запроса, включая распределенные. Неопытные пользователи могут прибегнуть к помощи инструмента DTS Query Builder для интерактивного построения запросов. В процессе переноса можно изменить имя, тип, размер и другие свойства столбца, а также выполнить автоматическое преобразование типов данных. Сложность преобразований, предоставляемая мастерами, весьма ограничена. Они позволяют использовать только один источник и одного получателя данных. Все возможности, предоставляемые DTS, раскрываются во время применения DTS Designer — простого и наглядного средства. В рамках этого инструмента можно определять доступ ко множеству гетерогенных источников данных, устанавливать отношения предшествования и создавать сложные сценарии преобразования данных с использованием ActiveX. Каждый из объектов пакета отображается своим собственным значком, что позволяет легко воспринимать структуру пакета. Между Task-objects устанавливаются отношения предшествования в виде направленных каналов. Каждый из трех видов отношений предшествования в DTS Designer выделяется своим цветом, облегчая понимание логики трансформации данных. Можно устанавливать сложные отношения трансформации непосредственно между источниками данных. Помимо использования графических средств, DTS пакет можно создать и запустить из приложений, реализующих программирование через СОМ-интерфейс. Такой подход часто применяется сторонними производителями клиентских продуктов для избавления пользователей от написания пакетов. Пакет создается приложением автоматически и запускается на SQL Server. Действия, выполняемые DTS-пакетом по импорту, экспорту и трансформации данных, прозрачны для пользователя приложения. Созданные пакеты данных могут храниться в системной базе данных SQL Server Msdb, в Microsoft Repository или в имеющих СОМ-структуру файлах. Интеграция DTS и Microsoft Repository позволяет отслеживать происхождение пакетов и данных. Хранение в MS Repository информации о первоначальном состоянии данных и проводимых с ней трансформациях позволяет отслеживать все операции, выполняемые в хранилище. Пользователи могут отследить происхождение своих данных как на уровне таблиц, так и на уровне строк. Это обеспечивает возможность полного аудита объектов, хранимых в репозитории. Продукты различных производителей могут совместно использовать метаданные об источниках и приемниках данных, их происхождении и трансформации за счет интеграции с моделью Open Information Model, являющейся фундаментальной архитектурой Microsoft Repository.
Глава 11. Доступ к гетерогенным источникам данных
333
SQL Server предлагает разнообразные способы выполнения пакета. Запуск DTSпакета может быть назначен на определенные моменты времени как задание SQLServerAgent, выполнен интерактивно с помощью Enterprise Manager или запущен с помощью утилиты командной строки dtsrun.exe. Data Transformation Services поддерживает выполнение задач как потоков операционной системы, что увеличивает производительность за счет распараллеливания процесса трансформации. Выполнение пакета всегда происходит одинаково, независимо от того, как он был создан, где хранится и каким способом запущен. Каждый пакет обусловливает одну или более задач, выполняемых в определенной последовательности. Задача представляет собой описание специализированного действия, выполняемого как часть преобразования, и хранится в пакете как Task-objects. DTS имеет стандартные задачи выполнения трансформаций с помощью сценариев ActiveX (написанных на VBScript, JavaScript или PerlScript), запуска внешней команды, выполнения SQL запроса, сложной трансформации данных, массивной закачки данных из текстового файла и передачи объектов базы данных. Кроме того, из пакета можно отправить сообщение по электронной почте. Эта возможность часто используется для уведомления администратора об ошибке, произошедшей при исполнении пакета. DTS поддерживает расширяемый СОМ-интерфейс, что позволяет создавать новые задачи для трансформации данных. Самые большие возможности переноса и трансформации данных предоставляет Data Driven Query Task. Реализованные в этой задаче механизмы позволяют устанавливать отображение столбцов между источниками информации. Можно выполнять непосредственное копирование данных между таблицами, имеющими столбцы одинакового или разного типа данных, или использовать один из доступных методов преобразований. Сложные трансформации данных могут быть реализованы с помощью сценариев ActiveX и параметризированных запросов. Data Driven Query Task позволяет создавать множество каналов трансформации, каждый из которых имеет собственные флаги и выполняется независимо. Если в процессе трансформации происходят исключения из-за несоответствия форматов копируемых данных и таблицы назначения, можно сохранить неправильные строки в файл. Счетчик ошибок позволяет установить ограничение на количество неправильных строк, после превышения которого выполнение задачи прервется. Дополнительно можно выполнить копирование только части данных, указав первую и последнюю строку. Разрешается оптимизировать процесс копирования, изменяя количество строк, выбираемых в источнике за одну операцию. Задача Data Driven Query Task имеет средство Data Transformation Lookups, обеспечивающее отдельное соединение в процессе выполнения запроса и включение результатов его выполнения в таблицу назначения. Если в исходной таблице существует только ID покупателя, а сами имена хранятся в другой базе данных, с помощью Data Transformation Lookups из сценария ActiveX можно выполнить запрос для преобразования ID в имя покупателя и вставки полученного значения в таблицу-получатель. Достигаемая при этом функциональность и оптимизация для быстрого поиска данных не может быть получена с использованием СОМ-объектов и глобальных переменных.
334
Часть III. Администрирование
Некоторые задачи требуют конфигурирования одного или двух соединений с источником данных, реализованных в DTS как Connection-objects. Соединения описываются используемым для подключения поставщика OLE DB, именем сервера, именем базы данных, именем и паролем пользователя или другой информацией. Каждый поставщик OLE DB требует ввода специфичных для него сведений. DTS Designer имеет встроенные объекты соединения для MS Access, FoxPro, MS Excel, SQL Server, Oracle, Paradox, dBase и текстовых файлов. Кроме того, применяя объекты Microsoft Data Link и Other Connections, можно подключить практически любой источник данных. Некоторые задачи в пакете должны выполняться в определенном порядке. Для выяснения последовательности выполнения задач предназначены отношения предшествования, реализуемые в DTS-пакете как Step-objects. Отношения предшествования позволяют создавать сложные системы импорта, экспорта и трансформации данных, охватывающие множество разнородных источников и гибко реагирующие на происходящие при выполнении DTS-пакета события. Например, задача TaskB массированного копирования данных в таблицу должна выполняться после того, как завершится задача TaskA создания этой таблицы. Таким образом, задача TaskB имеет отношение предшествования по отношению в задаче TaskA. Отношения предшествования могут накладываться на успешное, неудачное или независимое завершение задачи. Кроме того, на выполнение одной задача может быть наложено несколько отношений предшествования. В то же время одна задача может участвовать в нескольких отношениях предшествования. Задача будет запущена только тогда, когда все установленные для нее отношения предшествования будут сняты. Для повышения производительности пакета можно определить несколько отдельных цепочек задач, выполняемых параллельно. Например, можно одновременно экспортировать данные из репозитория в таблицу Oracle и в файл Paradox. Перенос данных осуществляется объектом DTS Data Pump, который является многопоточным объектом OLE DB Service Provider, предоставляющим интерфейс для импорта, экспорта и трансформации данных. DTS Data Pump представляет из себя высокопроизводительный внутренний СОМ-сервер, осуществляющий массивное перекачивание и трансформацию данных из систем, поддерживающих интерфейс OLE DB. DTS Data Pump поддерживает поставщиков OLE DB третьих фирм. В процессе переноса данный объект открывает источник данных и извлекает из него все записи. Далее Data Pump запускает определенные в пакете запросы и сценарии ActiveX, выполняющие трансформацию, проверку целостности и другие действия. Сложные преобразования с использованием ActiveX могут обращаться к любым методам OLE объекта. Кроме того, DTS позволяет создавать и использовать свои собственные СОМобъекты для преобразования данных. После трансформации данные возвращаются Data Pump, который запрашивает поставщика OLE DB получателя о наличии поддержки высокоскоростной загрузки данных. Если поддержка не реализована, то применяются стандартные механизмы загрузки. Некоторые операции копирования требуют предварительного уничтожения существующих в таблице получателя данных. DTS Data Pump обеспечивает как добавление, так и замену данных.
Глава 11. Доступ к гетерогенным источникам данных
335
SQL Server 2000 поддерживает ActiveX Data Objects 2.0 (ADO), совместимый с OLE Automation и обеспечивающий простой доступ к OLE DB источникам информации из высокоуровневых языков программирования (Visual Basic, Visual J, C++) и из скриптовых языков (VBScript, JavaScript, PerlScript). В процессе трансформации пользователь может обращаться к источникам данных и СОМобъектам через интерфейсы ADO. Помимо механизма передачи данных DTS имеет механизм DTS Objects Transfer, обеспечивающий перенос объектов базы данных между реляционными базами. Полная функциональность копирования объектов реализуется только между серверами SQL Server 2000. Другие СУБД могут копировать только схемы таблиц и расположенные в них данные. В процессе исполнения DTS-пакета DTS Objects Transfer генерирует определения объектов и передает сгенерированный Transact-SQL сценарий на сервер-получатель. Для установления соединения с сервером-получателем используется SQL-DMO поверх ODBC, а не OLE DB. Передача объектов возможна только на системы с установленным SQL-DMO. Для передачи доступны не только объекты базы данных, такие как таблицы, представления, индексы, триггеры, хранимые процедуры, умолчания и правила, но и учетные записи, пользователи и роли базы данных, а также права доступа на уровне объектов. Можно передавать как все объекты, так и их часть. Кроме того, вместе с копированием объектов можно выполнить копирование данных с одновременным контролем их целостности. DTS может автоматически отслеживать объекты, необходимые для корректной работы копируемых объектов и выполнять также и их копирование. К таким объектам относятся триггеры, ограничения целостности, умолчания, правила и пользовательские типы данных. Копирование объектов может быть реализовано средствами как DTS Wizard, так и DTS Designer. Запуская в DTS Wizard стандартную задачу Transfer SQL Server Objects, можно перенести как все, так и часть объектов базы данных. При копировании объектов можно предварительно уничтожить одноименные объекты в базе данных назначения. Это позволяет избежать проблем несовместимости, связанных с изменением структуры объектов. Этот раздел был посвящен обзору возможностей, предоставляемых как службами трансформации в целом, так и DTS Wizard и DTS Designer в частности. Следующие же разделы будут посвящены подробному рассмотрению возможностей каждого из инструментов создания пакетов DTS.
Мастера DTS Export и Import Wizard Не откроем секрета, если скажем, что мастера были придуманы специально для того, чтобы с легкостью решать сложные задачи. Мастера импорта и экспорта данных с использованием DTS не являются исключением. С помощью этих мастеров пользователь может легко перенести данные между двумя источниками, выполнив при этом несложные преобразования. Данный раздел будет посвящен рассмотрению возможностей мастеров DTS Import Wizard и DTS Export Wizard, а также подробному описанию работы с ними. В принципе, большой 12 Зак. 83
336
Часть III. Администрирование
разницы между мастерами нет и можно без особых проблем запускать один вместо другого. Это связано с тем, что в процессе создания пакета с помощью любого из мастеров нужно указать источник и получатель данных. Таким образом, одну и ту же операцию переноса данных можно рассматривать и как импорт, и как экспорт (смотря со стороны какого сервера). Как уже было сказано, к недостаткам работы с мастерами относится невозможность использования более двух источников данных, а также определения сложных преобразований и отношений предшествования. Кроме того, большая часть возможностей DTS, например отправка сообщений по электронной почте, будет недоступна. Тем не менее, несомненным достоинством применения мастера является легкость решения простых задач. Если необходимо закачать в таблицу базы данных информацию из файла MS Excel, то возможностей мастера будет вполне достаточно. Таким образом, даже неопытные пользователи смогут выполнять основные операции обмена данными.
Запуск мастера Перед работой мастера его необходимо запустить одним из предложенных ниже способов: П Нажать кнопку Run a Wizard в панели инструментов Enterprise Manager. В ответ откроется диалоговое окно Select Wizard (рис. 11.1), с помощью которого можно запустить любого мастера. Мастера DTS находятся в папке Data Transformation Services. Для запуска нужного мастера достаточно выбрать его имя и нажать кнопку ОК. Окно Select Wizard также можно открыть, выбрав в меню Tools команду Wizards. П Открыть главное меню, выбрать пункт Programs (Программы), а затем в группе Microsoft SQL Server указать команду Import and Export Data. • Выполнить команду dtswiz в окне Run (Запуск программы) (рис. 11.2), которое можно вызвать с помощью команды Run (Выполнить) главного меню.
С~
Замечание
^
Мастера DTS Import и Export Wizard реализованы в виде утилиты dtswiz.exe, которая расположена в папке \Program Files\Microsoft SQL Server\80\Tools\BINN. Однако указание полного пути не требуется, т. к. он указан с помощью переменной окружения PATH, что делает доступными все программы, размещенные в указанной папке. Поэтому для запуска мастера с помощью окна Run (Запуск программы) достаточно указать только d t s w i z , не вводя полный путь и расширение файла.
После того, как мастер будет запущен (неважно каким способом), откроется первое окно (рис. 11.3), в котором указывается общая информация о программе. Вся работа мастера DTS Import/Export Wizard основана на наборе окон, с помощью которых пользователи описывают процесс переноса и преобразования данных.
Глава 11. Доступ к гетерогенным источникам данных
337
Select Wizard Please select the Wizard you wish (o use: Register Server Wizard Database • :••• Create Database Wizard Create Index Wizard • :••• Create Login Wizard : Create Stored Procedure Wizard • ;•• Create View Wizard Full-Text Indexing Wizard Data Transformation Services
; ШШЁШШЁШ DTS m I port Wziard Management ackup Wziard ;: B Copy Database Wziard ; Create Alert Wziard Create Job Wziard : Database Man itenance Pa ln Wziard !n I dex Tunn ig Wziard Make Master Server Wziard '• Make Target Server Wziard Web Asssitant Wziard OK
• • Н и н а м
?ixi
,****! Type the name of a program, folder, document, or ^? 1 Internet resource, and Windows will open it for you, Open:
dtswzi
rl OK
Cancel
Cancel
Browse,., j
Рис. 11.2. Окно Run
Рис. 11.1. Окно Select Wizard
ill
%, DTS import/EKport Wizard
Data Transformation Services Import/Export Wizard The Data Transformation Services Import/Export Wizard allows you to import, export, and transform heterogeneous data. This wizard guides you through the steps to import or export data between many popular data formats including databases, spreadsheets, and text files.
Hext> j]
Cancel
Help
Рис. 11.3. Первое окно мастера DTS Import/Export Wizard
Замечание Как видно, окно имеет заголовок, содержащий совмещенное имя DTS Import/Export Wizard, что лишний раз говорит о том, что между мастерами импорта и экспорта нет
Часть III. Администрирование
338
принципиальной разницы. В дальнейшем для мастера мы будем использовать указанное имя.
Замечание Когда мастер запускается из Enterprise Manager, то он выполняется как часть Enterprise Manager и не выводится на панели задач (task bar) операционной системы как отдельное приложение. Однако, если мастер запускается с помощью команды dtswiz или из главного меню, то он работает как самостоятельное приложение и отображается на панели задач. При этом Enterprise Manager может быть даже не запущен.
Конфигурирование источника данных Первое окно мастера не представляет особого интереса и может быть сразу же пропущено. Для перехода ко второму окну (рис. 11.4) достаточно нажать кнопку Next. Второе окно мастера называется Choose a Data Source, что переводится как выбор источника данных. % DTS Import/Export Wizard Choose a Data Source From where do you want to copy data? You can copy data from one of the folowing sources. Sour£e: Microsoft OLE DB Provider for SQL Server , To connecto Microsoft SQL Server, you must specify the server, user i'За
name, and password.
Server:
.
(STORAGE VTRELON
(• Use Windows NT authentication С Use SQL Server authentication
Database:
Next>
Cancel
Help
Рис. 11.4. Окно Choose a Data Source мастера DTS Import/Export Wizard
В верхней части окна имеется раскрывающийся список Source, в котором необходимо выбрать имя поставщика OLE DB для использования в установлении соединения с источником данных. Ниже, в рамке, размещена группа элементов управления, с помощью которой указываются параметры источника данных. Конкретный набор элементов управления зависит от выбранного поставщика. На рис. П.4 приведен набор элементов управления для поставщика Microsoft OLE DB Provider for SQL Server. Конфигурирование других источников данных
Глава 11. Доступ к гетерогенным источникам данных будет рассмотрено далее в этой главе при описании применения DTS Designer. В этом же разделе приведем лишь список типов источников данных, которые поддерживаются автоматически и доступны сразу же после установки SQL Server 2000: •
СУБД dBase - версии V, III и IV;
G текстовые файлы (txt); •
файлы рабочих областей MS Excel (csv);
•
базы данных MS Access (файлы mdb);
•
таблицы dBase (файлы dbf);
П электронные таблицы MS Excel (файлы xls) — версии 3—5, 97—2000; П базы данных Paradox (файлы db) — версии 3.x, 4.x и 5.x; •
СУБД Visual FoxPro;
•
СУБД Oracle;
•
СУБД SQL Server;
•
ресурсы Интернета;
•
службы OLAP Services 8.0;
•
источники ODBC.
При импорте данных с SQL Server (т. е. когда выбран поставщик Microsoft OLE DB Provider for SQL Server), пользователь должен сконфигурировать следующие элементы: О Server. С помощью этого раскрывающегося списка необходимо выбрать имя сервера SQL Server, с которого предполагается импортировать данные. В списке приведены имена серверов сети, которые удалось обнаружить мастеру., Если имени нужного сервера нет в списке, то его можно ввести вручную.
С
Замечание
При работе SQL Server 2000 под управлением Windows 98 список Server будет всегда пуст, т. к. эта операционная система не поддерживает необходимых средств просмотра. П Use Windows NT authentication. После того, как имя нужного SQL Server было указано в списке Server, необходимо выбрать тип аутентификации, с использованием которого будет устанавливаться соединение с сервером. При установке переключателя в рассматриваемое положение для успешного выполнения пакета DTS нужно, чтобы пользователь, выполняющий пакет, вошел в домен Windows NT, и его учетной записи Windows NT на указанном SQL Server были предоставлены требуемые права доступа к данным. О Use SQL Server authentication. При выборе данного переключателя установление соединения с источником данных будет выполняться на основе учетной записи SQL Server. В этом случае становятся доступными два дополнительных элемента:
339
Часть III. Администрирование
340
• Username — в этом поле следует задать имя учетной записи, которой предоставлены необходимые права доступа к данным на указанном в раскрывающемся списке Server источнике. Учетная запись должна быть создана на выбранном сервере; • Password — в этом поле нужно ввести пароль учетной записи, указанной в предыдущем поле. • Database. В раскрывающемся списке надо выбрать имя базы данных, из которой предполагается экспортировать данные. В отличие от списка Server, допускающего указание произвольных значений, в раскрывающемся списке Database можно выбрать только значение, имеющееся в списке. В этом элементе управления перечислены все базы данных (в том числе и системные), имеющиеся на выбранном сервере. Однако в списке присутствует еще один элемент — <default>. При выборе этого значения пакет будет работать с той базой данных, которая назначена в качестве базы данных по умолчанию для учетной записи, используемой для установления соединения с сервером. Список Database не обновляется автоматически. Поэтому только что созданная база данных может быть не отображена в списке. Для принудительного обновления списка следует нажать кнопку Refresh, что приведет к повторному считыванию списка баз данных. • Advanced. С помощью данной кнопки можно открыть диалоговое окно Advanced Connection Properties (рис. 11.5), предназначенное для управления дополнительными свойствами соединения. В большинстве случаев значения по умолчанию являются вполне удовлетворительными, и конфигурирование свойств не требуется. Поэтому мы не будем заострять внимание на описании параметров этого окна. Advanced Connection Properties The OLE DB driver supports the advanced options listed below. Enter any custom settings you requite in the value column. Property ; Type Persist Security Info Window Handle 4-byte signed int Connect Timeout 4-byte signed int General Timeout 4-byte signed int Current Language Binary String Network Address Binary String Netwoik Library Binary String Auto Translate Boolean Application Name Binary String Workstation ID Binary String Use Encryption for Data Boolean
i Value
0
0
—•
0
Z. 1 •!
OK
Cancel
Рис. 11.5. Окно Advanced Connection Properties
Help
Глава 11. Доступ к гетерогенным источникам данных
341
Напомним, что конкретный набор элементов управления в окне зависит от типа выбранного в списке Source имени поставщика OLE DB. В этом же разделе рассматривалось только конфигурирование источника SQL Server.
Конфигурирование получателя данных После того, как источник данных будет соответствующим образом сконфигурирован, можно переходить к третьему окну мастера (рис. 11.6). Оно имеет название Choose a destination, что дословно можно перевести как выбор получателя. Как следует из названия окна, оно предназначено для конфигурирования получателя данных. штшшшш
% OTS Import/Export Wizard
Choose a destination То where do you want to copy data? You can copy data to one of the following destinations.
Destination:
J
| r j Microsoft OLE DB Provider for SQL Server
To i о connect connec to Microsoft SQL Server,you must specify the server, user name, and password Server:
(STORAGE
(* Use Windows NT authentication Г
Use SflL Server authentication
Database:
| У Bon
Next>
Cancel
Help
Рис. 11.6. Окно Choose a destination мастера DTS Import/Export Wizard
Конфигурирование получателя данных практически ничем не отличается от конфигурирования источника данных, что было рассмотрено в предыдущем разделе. Единственное отличие состоит в том, что на источнике данных можно создать новый каталог, в который будут импортированы данные. Применительно к SQL Server 2000 (т. е. при выборе поставщика Microsoft OLE DB Provider for SQL Server) это означает, что в списке Database существует дополнительный элемент — , с помощью которого можно создать на импортирующем SQL Server новую базу данных, где и будут сохранены переносимые данные. Выбор в списке Database значения приводит к открытию окна Create Database (рис. П.7), с помощью которого можно указать имя и размер новой базы данных.
Часть III. Администрирование
342
Замечание Чтобы попытка создания базы данных завершилась успешно, нужно, чтобы на получателе данных учетной записи, которая используется для установления соединения с ним, было предоставлено право создания баз данных. В противном случае будет выдано сообщение о невозможности создания базы данных ввиду отсутствия необходимых прав доступа. Create Database Specify the name and properties of the SQL Server database.
Name:
NewDatabase
Data file size:
|2
^ j мв
Log file size:
Б
Щ MB
OK
Cancel
Рис. 11.7. Окно Create Database
В поле Name необходимо ввести имя, которое будет присвоено создаваемой базе данных. При этом нужно придерживаться общих правил именования объектов и соблюдать уникальность имен баз данных в пределах сервера. Значение, указанное в поле Name, также определяет имена первичного файла и файла журнала транзакций, из которых будет состоять база данных. Файлы базы данных будут размещены по адресу, указанному в полях Default data directory (файлы данных mdf и ndf) и Default log directory (файлы журнала транзакций ldf) на вкладке Database Settings окна свойств сервера. Работа с вкладкой Database Settings была описана в разд. "Вкладка Database Settings" главы 8. Созданная с помощью окна Create Database база данных будет состоять их одного файла данных (первичного) и одного файла журнала транзакций. Дополнительно можно указать исходный размер как первичного файла (в поле Data file size), так и файла журнала транзакций (в поле Log file size). Если в свойства базы данных Model на получателе данных не вносилось никаких изменений, то для созданной базы данных будет разрешено автоматическое увеличение размера с шагом в 10% от первоначального объема. В остальном же пользователь оперирует теми же элементами управления, что и во втором окне мастера. Поэтому мы не будем повторно описывать элементы управления и перейдем к рассмотрению следующего окна мастера.
Выбор режима копирования данных Когда окажутся сконфигурированными и источник, и получатель данных, то можно приступить к описанию собственно процесса переноса информации. В четвертом окне мастера (рис. 11.8) необходимо выбрать режим, который будет использоваться для подготовки исходного набора данных. Окно называется Specify Table Copy or Query, что можно перевести как "укажите таблицу или запрос для копирования".
Глава 11. Доступ к гетерогенным источникам данных
343
% DTS import/EKport Wizard Specify Table Copy or Query Specify whether to copy one or more tables/Views or the results of a query from the data source. J
i Microsoft SQL Server
Microsoft SQL Server <• igopy teble( I it I iewl I turn Ни
iu f database
С L]se a query to specify the data to transfer С Cojsy objects and data between SQL Server databases
< Back
Next>
Cancel
Help
Рис. 11.8. Окно Specify Table Copy or Query мастера DTS Import/Export Wizard
В распоряжении пользователей имеется единственный переключатель, который можно установить в одно из следующих положений: П Copy table(s) and view(s) from the source database. Этот режим переноса данных выбирается, когда необходимо перенести данные из одной или более таблиц или представлений. То есть исходным набором данных будут являться все данные, имеющиеся в указанных таблицах. В процессе переноса можно будет выполнить некоторые преобразования данных, используя для этого возможности скриптовых языков ActiveX. Кроме того, можно копировать не все столбцы, а лишь необходимые. Также можно изменять свойства столбцов на получателе данных. • Use a query to specify the data to transfer. При использовании данного режима исходный набор данных будет формироваться в результате выполнения запроса. Код запроса может быть указан либо непосредственно, либо создан визуально с помощью построителя запросов Query Builder. Кроме того, также можно подгрузить готовый запрос. Полученный с помощью запроса набор данных рассматривается как единственная таблица, которую предполагается перенести. П Copy objects and data between SQL Server databases. Особенностью указанного режима является то, что помимо переноса данных также можно выполнить и перенос объектов. Используя рассматриваемый режим, можно организовать копирование всех объектов базы данных с источника на получателя.
С
Замечание
Последний режим переноса доступен, когда и источник, и получатель являются серверами SQL Server. Именно такой вариант и приведен на рис. 11.8. В верхней части
Часть III. Администрирование
344
окна изображены пиктограммы, обозначающие источник данных. Если же получатель или источник не являются SQL Server, то последнее положение переключателя будет недоступно. Последующий набор окон, выдаваемых мастером, будет зависеть от того, какой режим переноса данных был выбран в четвертом окне мастера. Далее три раздела будут посвящены подробному рассмотрению каждого из режимов переноса данных в той последовательности, в которой они были перечислены в приведенном выше списке.
Копирование данных из таблиц и представлений Если в четвертом окне переключатель был установлен в положение Copy table(s) and view(s) from the source database, то перенос данных будет осуществляться путем копирования данных из одной или более таблиц или представлений с источника данных. После того как в четвертом окне будет нажата кнопка Next, мастер перейдет к очередному окну, которое будет иметь вид, подобный приведенному на рис. 11.9. % DTS Import/Export Wizard Select Souice Tables and Views You can choose one or more tables or views to copy. You can copy the schema and data as it appears in the source or click (...) to transform the data using ActiveX scripts.
Table[s) and View(s): Source
! Destination
Д
[pubs].[dbo].[authors]
И
[pubs].[dbo].[discountsl
|Щ [pubs], [dbo]. [employee] [pubsMdboltiobs]
1 Transform | *•
Ш [BonLis].[dbo].[authors] to [B onus], [dbo]. [discounts] Ш
[Bonus] [dbo].[employee] [[Bonus]. [dbo].[jobs]
[pubs].[dbo].[pub_info] [pubs].[dbo].[publishers] [Dubsl.fdbol.Irovschedl Select All
Deselect All
Preview..
include all Prir ary Foreign K,ej
cfiack
Cancel
Help
Рис. 11.9. Окно Select Source Tables and Views мастера DTS Import/Export Wizard
Пятое окно мастера при выборе режима переноса данных из таблиц и представлений имеет название Select Source Tables and Views, что переводится как "выберите исходные таблицы и представления". Основную часть окна занимает список таблиц и представлений, имеющихся на источнике в базе данных, указанной во втором окне мастера. В столбце Source выводится название таблицы
Глава 11. Доступ к гетерогенным источникам данных
345
или представления, а также значок, с помощью которого можно определить тип объекта — таблица или представление. Его изображение в виде небольшого квадрата обозначает таблицу, в виде очков — представление. В самой левой части каждой строки имеется флажок, отметив который можно включить соответствующую таблицу или представление в процесс копирования. После установки флажка в столбце Destination становится доступным список, с помощью которого можно выбрать таблицу или представление на получателе данных, куда предполагается закачать данные. Список столбца Destination позволяет либо выбрать существующую таблицу, либо оставить это поле пустым. Если в базе данных на получателе нет подходящей таблицы, в которую бы могли быть закачаны данные из выбранной таблицы источника данных, то мастер позволяет ее создать. Более того, если таблица и существует, то в процессе переноса она может быть удалена и вместо нее будет создана новая с нужными свойствами. Для управления этими возможностями предназначено окно Column Mappings, Transformations, and Constraints (рис. U.IO), которое открывается нажатием расположенной в столбце Transform кнопки \. С помощью указанного окна можно управлять параметрами копирования лишь конкретной таблицы. Поэтому необходимо использовать окно для каждой копируемой таблицы отдельно. Column Mappings, Transformations, and С Source:
[pubs].[dbo], [authors]
Destination:
[B onus]. [dbo].[authors]
Column Mappings; Transformations Constraints 1 (* Cjeate destination table
Г" Crop and recreate destination table
r
Г* Enable identity insert
.
С Append row* Mappings: Source
^Destination
Type
INullable iSize "Precision !Scale
aujname
aujname
varchar
П
40
aujname phone
au_fname
varchar
phone
20 -|2
address
address
city
city
char varchar varchar
Q Г"! Й БЙ
40 20
*
au_id
Source column:
j
aujdvarchar(11) NOT NULL OK
Cancel
Help
Рис. 11.10. Окно Column Mappings, Transformations, and Constraints
С помощью окна Column Mappings, Transformations, and Constraints можно управлять не только созданием таблиц на получателе, но и множеством других параметров переноса данных. Оно состоит из трех вкладок, каждая из которых позволяет
346
Часть III. Администрирование
настраивать те или иные параметры переноса и преобразования данных. В верхней части окна выводится информация об именах объектов, выступающих в качестве источника и получателя данных. В столбце Source указывается имя исходного объекта (таблицы или представления), тогда как в столбце Destination — имя таблицы получателя, в которую будет выполняться закачка данных. Имена объектов отображаются с указанием имени базы данных и имени владельца. В следующих трех разделах будет подробно рассмотрена каждая из вкладок окна Column Mappings, Transformations, and Constraints.
Вкладка Column Mappings Основным назначением вкладки Column Mappings (см. рис. 11.10) является управление отображением столбцов исходной таблицы в столбцы таблицы назначения. Помимо этого вкладка может быть использована для выполнения подготовительных операций на получателе данных. Управление этими действиями осуществляется с помощью переключателя, который может устанавливаться в одно из трех положений: • Create destination table. При установке переключателя в данное положение при выполнении пакета система создаст на получателе таблицу, в которую будут закачиваться данные из источника. Однако создание таблицы возможно лишь в той ситуации, если на получателе нет таблицы с аналогичным именем. В противном случае попытка создания таблицы завершится неудачно. Вполне возможно, что при первом выполнении пакета на получателе и не будет существовать нужной таблицы, и ее создание пройдет успешно. Но если вы снова попытаетесь выполнить пакет, то попытка создания таблицы завершится неудачно. Чтобы избежать подобных проблем, можно воспользоваться флажком Drop and recreate destination table, который становится доступным при установке переключателя в рассматриваемое положение. Выбор флажка приведет к тому, что в ходе выполнения пакета сначала будет предпринята попытка удаления на получателе таблицы, в которую предполагается перенести данные, а затем эта таблица будет повторно создана. Данная возможность весьма полезна при создании пакетов, которые должны периодически автоматически выполняться системой. • Delete rows in destination table. Если удаление таблицы на получателе по каким-то причинам нежелательно (например, если для нее были дополнительно определены индексы, ограничения целостности, статистика и т. д.), но необходимо гарантировать, что таблица будет содержать только данные из источника, то вместо удаления таблицы целиком можно всего-навсего удалить все строки таблицы. Однако подобное решение можно использовать только тогда, когда структура таблиц на источнике и получателе данных совпадают в той мере, в какой это необходимо для переноса данных. Отметим, что полное совпадение структур не требуется, т. к. механизмы DTS позволяют выполнять копирование между столбцами с различными именами и даже типами данных. Более того, допускаются и более сложные преобразования, например, прием значения для столбца таблицы получателя на основе выра-
Глава 11. Доступ к гетерогенным источникам данных жения, которое использует значения трех столбцов таблицы источника и некоторые функции. • Append rows to destination table. Это положение применяется, когда необходимо добавить строки, полученные из таблицы источника данных, в таблицу на получателе данных. При этом не будет выполнять ни удаление таблицы на получателе, ни удаление имеющихся строк. Подобный подход часто используется для объединения данных из множества источников в одной таблице. Однако следует быть внимательным при установке переключателя в рассматриваемое положение. Следует учитывать, что при повторном запуске пакета механизмы DTS добавят в таблицу на получателе все строки, имеющиеся в таблице на источнике. Таким образом, получатель может иметь по две копии одних и тех же строк. При последующих запусках пакета количество копий еще более увеличится. Если в таблице получателя были определены ограничения целостности на уникальность данных, то проблема усложнится, т. к. сервер будет выдавать сообщение об ошибке, говорящее о нарушении ограничения целостности, требующего уникальности данных. Выходом будет создание дополнительного механизма, удаляющего скопированные строки на источнике. Таким образом, можно легко обеспечить централизованное накопление информации из множества источников на одном сервере. Замечание Последние два пункта, рассмотренные в приведенном выше списке, не будут доступны, если на получателе еще не существует таблицы, в которую предполагается копировать данные. Помимо приведенного списка в верхней части вкладки имеется флажок Enable identity insert, с помощью которого можно контролировать поведение сервера при вставке значений в столбец-счетчик. Столбцом-счетчиком называется столбец таблицы, для которого установлено свойство IDENTITY. Установка этого свойства приводит к тому, что сервер будет автоматически вставлять значения в соответствующий столбец. Данные значения монотонно возрастают от введенного значения с определенным интервалом. Чаще всего столбцы-счетчики используются в качестве первичных ключей таблиц. При копировании таблиц, в которых имеется столбец-счетчик, могут возникнуть проблемы. Допустим, что необходимо скопировать две таблицы. Одна из них (главная) содержит первичный ключ, которым является столбец-счетчик с установленным свойством IDENTITY, тогда как другая (зависимая) имеет внешний ключ, связанный с первичным ключом первой таблицы. При копировании данных с источника из главной таблицы в соответствующую таблицу получателя сервер будет генерировать новые значения в столбцесчетчике. Конечно, есть определенная вероятность, что значения в столбцесчетчике в таблицах источника и получателя совпадут, но в подавляющем большинстве случаев на получателе появятся совсем другие значения. Тем не менее, с точки зрения сервера копирование выполнено нормально и никаких ошибок нет. Затем настает очередь копирования данных зависимой таблицы. Так как
347
348
Часть III. Администрирование
строки зависимой таблицы связаны со строками главной, то в первичном ключе главной таблицы должны иметься значения, указанные во внешнем ключе зависимой таблицы. Однако, во внешнем ключе зависимой таблицы получателя будут присутствовать те же значения, что и на источнике. Но значения первичного ключа на получателе были изменены из-за особенностей работы со столбцами-счетчиками. Таким образом, в простейшем случае получается, что строки зависимой таблицы не смогут быть связаны со строками главной таблицы, что приведет к нарушению ограничения целостности внешнего ключа, выдаче соответствующей ошибки в процессе переноса и невозможности копирования данных. В более сложных случаях в главной таблице получателя будут существовать все значения, упоминаемые во внешнем ключе зависимой таблицы. Но это вовсе не те строки, что были на источнике. Тем не менее, процесс копирования окажется успешно выполненным и пользователь не получит никакого сообщения об ошибке. Однако логическая целостность данных будет нарушена. Именно для избежания подобных проблем и используется флажок Enable identity insert, установка которого разрешает вставку явных значений в столбецсчетчик, временно отменяя автоматическое генерирование значений сервером. Это позволяет делать полные копии таблиц, не опасаясь вмешательства сервера в формирование значений для столбцов с установленным свойством IDENTITY. Замечание Описанная проблема возникает и при репликации данных. Решается она аналогично. Если необходимо вставить в таблицу со столбцом-счетчоком явные значения вручную, то временно отменить автоматическое генерирование сервером значений ДЛЯ СТОЛбца I D E N T I T Y МОЖНО С ПОМОЩЬЮ КОМанДЫ SET
IDENTITY_INSERT.
На вкладке Column Mappings осталась нерассмотренной таблица Mappings, с помощью которой выполняется управление отображением столбцов таблицы источника в столбцы таблицы получателя. Каждая строка таблицы соответствует одному отображению. По умолчанию применяется отображение "один-кодному", т. е. каждый столбец таблицы источника отображается в одноименный столбец получателя. Для описания отображения используются столбцы: П Source. Здесь указывается имя столбца таблицы источника, который предполагается отобразить. Значение столбца представляет собой раскрывающийся список, в котором перечислены все столбцы таблицы источника. Помимо имен столбцов, в списке также имеется значение . Если выбрать его, то в соответствующем столбце таблицы получателя (имя которого указано в столбце Destination) будет сохранено либо значение NULL, либо (если определено) значение по умолчанию. Причем приоритет отдается значению по умолчанию. Если значение по умолчанию не определено, и столбец таблицы получателя не разрешает хранение значений NULL, TO при установленном в столбце Source значении попытка выполнения пакета завершится неудачно.
Глава 11. Доступ к гетерогенным источникам данных
349
В нижней части вкладки имеется текстовое поле Source column, в котором выводится информация о выбранном столбце таблицы источника. В частности, указывается тип данных и возможность хранения значений NULL. ЭТИ сведения могут быть использованы при выборе типа данных для столбца таблицы получателя. П Destination. В данном столбце указывается имя, которое будет присвоено соответствующему столбцу таблицы на получателе. В отличие от списка в колонке Source, в столбце Destination можно выбирать не только значения из списка (в котором имеются имена всех столбцов, сконфигурированных для переноса в колонке Source), но и вводить свои собственные значения. Однако при выборе имени следует соблюдать уникальность имен столбцов таблицы получателя. Как и в списке колонки Source, в списке колонки Destination присутствует значение . Его выбор приведет к тому, что в таблице на получателе не будет создано соответствующего столбца и, как следствие, данные из соответствующего столбца таблицы источника не будут скопированы. •
Туре. Данная колонка содержит название типа данных, который будет иметь столбец получателя. Значение представляет собой раскрывающийся список, содержащий перечень всех допустимых типов данных, поддерживаемых получателем. Пользователь может выбрать любой тип данных, независимо от типа данных исходного столбца. Мастер не осуществляет проверку возможности выполнения определенным пользователем переноса данных. Если неявное преобразование типов данных невозможно, то при попытке выполнения пакета будет выдано соответствующее сообщение об ошибке. Однако, если грамотно выбирать значения в столбце Туре, то можно организовать преобразование типов данных. Например, можно легко преобразовать данные типа smaliint в тип данных i n t или данные типа smaiimoney в тип данных money.
•
Nullable. Столбец содержит лишь флажок, с помощью которого производится управление возможностью хранения значений NULL В соответствующем столбце таблицы получателя.
•
Size. Столбец позволяет управлять размером столбца некоторых типов данных. Например, если столбец таблицы получателя имеет символьный тип данных (char, varchar, nchar и nvarchar), то в колонке Size указывается максимальное количество символов, которое можно будет хранить в соответствующем столбце. Часть типов данных имеет фиксированный размер, который нельзя изменить. К таким типам данных можно отнести целочисленные типы данных ( t i n y i n t , s m a l i i n t , i n t и b i g i n t ) , типы даты и времени (smalldatetime И datetime), Денежные ТИПЫ данных (smaiimoney И money) И
некоторые другие. О Precision. При работе с нецелочисленными типами данных (numeric, decimal, f l o a t и r e a l ) в этой колонке указывается максимальный размер данных, которые можно будет хранить в соответствующем столбце. Значение в столбце Precision определяет максимальное количество десятичных цифр (в
350
Часть III. Администрирование
том числе и после запятой), которое может храниться в соответствующем столбце таблицы. G Scale. Колонка используется совместно с предыдущей при работе с нецелочисленными типами данных. В ней указывается количество цифр после запятой, которое будет храниться в соответствующем столбце таблицы получателя. Значение в колонке Scale напрямую связано со значением в колонке Precision и может его превышать. Количество цифр до запятой, которое можно будет хранить в столбце, можно подсчитать как разницу между значениями в колонках Precision и Scale.
Замечание Подробно типы данных, их размерность и точность будут рассмотрены в главе 26. Мы объяснили назначение всех колонок таблицы Mappings, предназначенной для управления отображением столбцов при копировании данных. При описании колонок предполагалось, что изменения значений в таблице получателя разрешены. Однако это возможно только в том случае, когда выполняется настройка переноса в еще несуществующую таблицу. Если же таблица на получателе существует, то пользователь будет весьма ограничен при работе с таблицей настроек Mappings. Тем не менее, если установить переключатель в верхней части вкладки в положение Create destination table и отметить флажок Drop and recreate destination table, то будет считаться, что таблицы на получателе не существует, и будет разрешено внесение любых изменений в таблицу Mappings. (
^
Замечание
На основе таблицы Mappings генерируется сценарий Transact-SQL, с помощью которого на получателе будет выполняться создание таблицы для закачки данных. Более подробно сценарий создания таблицы получателя будет разъяснен при рассмотрении вкладки Constraints. При работе с таблицей Mappings можно определить отображение одного столбца исходной таблицы в два или более столбцов таблицы получателя. Для этого достаточно дважды выбрать в колонке Source имя нужного столбца таблицы получателя. При этом для каждого столбца таблицы получателя можно использовать различные типы данных. Более того, можно выполнить не простое копирование, а провести сложные преобразования данных.
Вкладка Transformations Сложные преобразования Transformations (рис. 11.11).
данных
определяются
с
помощью
вкладки
В верхней части окна имеется переключатель, который может быть установлен в одно из двух положений: П Copy the source columns directly to the destination columns. При установке переключателя в это положение будет осуществляться непосредственное копирование данных из таблицы источника в таблицу получателя без выполнения
Глава 11. Доступ к гетерогенным источникам данных
351
каких-либо явных преобразований. При этом допускается выполнение неявных преобразований, связанных с различием типов и свойств соответствующих столбцов таблиц источника и получателя. • Transform information as it is copied to the destination. Данное положение используется, когда необходимо выполнить преобразование данных в процессе их копирования. После установки переключателя в рассматриваемое положение на вкладке становятся доступными дополнительные элементы управления. Column Mappings, Transformations, and Consli щ^
Source:
[pubs].[dbo].[authors]
ШЛЯ
Destination:
[Bonus].[dbo]. [authors]
Column Mappings Transformations j Constraints | <"* Cflpy the source columns directly to the destination columns i'ion as t ii copied to the destination'
f*" IT-
' Visual Basic Transformation Script Copy each source column to the ' destination column
Function Man iO DTSDestination["au_id") = DTSSource("au_id") DTSDestinationf'auJname") = DTSSoufce("au_lname") DTSDestination("au_fnarne")« DTSSource("au_fname") DTSDestinationf'phone") = DTSSourcef'phone") DTSDestination("address") = DTSSource("address") Language:
Browse..
iVB Script Language OK
Cancel
Help
Рис. 11.11. Окно Column Mappings, Transformations, and Constraints, вкладка Transformations
По умолчанию переключатель установлен в первое положение. При этом окно для ввода сценария преобразования недоступно. Лишь после выбора второго положения переключателя можно указать сценарий, в соответствии с которым будет осуществляться преобразование данных. Для описания преобразования данных используются скриптовые языки ActiveX — VBScript (Visual Basic scripting language) и JavaScript (Java scripting language). Выбор языка, который должен быть применен для описания процесса преобразования, осуществляется с помощью раскрывающегося списка Language в нижней части вкладки. При изменении языка мастер будет генерировать код на соответствующем языке. При этом написанный ранее код будет потерян.
С
Замечание
Поддержка скриптовых языков VBScript и JavaScript добавляется при инсталляции SQL Server 2000. Однако дополнительно можно установить поддержку языка PerlScript.
Часть III. Администрирование
352
Мастер автоматически генерирует код, который выполняет простое копирование данных из столбцов таблицы источника в столбцы таблицы получателя в соответствии с отображением, определенным с помощью таблицы Mappings вкладки Column Mappings. Можно либо полностью удалить сгенерированный мастером сценарий и написать новый, либо внести в предложенный код необходимые дополнения. Также имеется возможность использовать готовый код, загрузив его из файла. Для этого необходимо воспользоваться кнопкой Browse. (~
^
Замечание
Мы не будем рассматривать программирование преобразований с помощью языков ActiveX, т. к. это достаточно обширная тема, достойная отдельной книги.
Вкладка Constraints Основным назначением вкладки Constraints (рис. 11.12), как следует из названия, является управление ограничениями целостности. Однако элементы управления данной вкладки доступны только в том случае, если в процессе выполнения пакета предполагается создание на получателе соответствующей таблицы. Другими словами, переключатель вкладки Column Mappings должен быть установлен в положение Create destination table. При необходимости дополнительно может быть установлен флажок Drop and recreate destination table. Column Mappings, Transformations, anP^j9 k-iH
Source: Destination:
[pubs], [dbo]. [authors] [Bonus], [dbo]. [authors]
Column Mappings I Transformations Constraints j p
Create Primary Key:
(• 1_. At Create Time
С 2. After data transformation
p
Create Foreign Kens:
(* 3. At Create Time
С 4. After data transformation Auto Generate
Create Table Statement:
ЯЕАТЕ TABLE [Bonus] [dbo].[authors] ( 'au_id] varch-ar i l l '- ' ^aujname] varchai 140; N01 HULL. au_fname] varchai :20
it
JJLI
Auto Generate
Atler Tabe l Statement: il OK
Cancel \ Hep l
Рис. 11.12. Окно Column Mappings, Transformations, and Constraints, вкладка Constraints
Глава 11. Доступ к гетерогенным источникам данных В левой верхней части окна содержится два флажка: П Create Primary Key. Установите этот флажок, если необходимо создать в таблице получателя все первичные ключи, которые были определены в таблице источника. Выбор флажка приведет к изменению кода в полях Create Table Statement и Alter Table Statement. •
Create Foreign Keys. Данный флажок устанавливается, если необходимо создать в таблице на получателе любые внешние ключи, которые имелись в соответствующей таблице источника данных.
При отметке любого из перечисленных выше флажков справа от них становится доступным переключатель, с помощью которого можно управлять тем, когда должно быть выполнено создание ключей соответствующего типа. Переключатель может быть установлен в одно из двух положений: П At Create Time. Если переключатель установлен в это положение, то соответствующее ограничение целостности (первичный или внешний ключ) будет образовано в момент создания таблицы на получателе. То есть в сценарий, используемый для создания таблицы на получателе, будут внесены необходимые изменения, чтобы соответствующие ключи возникли в момент создания таблицы. • After data transformation. Установка переключателя в это положение приведет к тому, что указанные ограничения целостности будут созданы после копирования всех данных. Это бывает необходимо, если копирование таблиц выполняется не в той последовательности, что требуют ограничения целостности. Предположим, что ограничения целостности определяются как часть процесса создания таблицы (переключатель установлен в положение At Create Time). Также предположим, что у нас имеется главная и зависимая таблица. В этом случае сначала нужно скопировать все строки главной таблицы, а уже после этого приступать к копированию данных зависимой таблицы. Если же сначала попытаться скопировать строки зависимой таблицы, то сервер выдаст сообщение об ошибке, свидетельствующее о нарушении ограничения целостности FOREIGN KEY (внешний ключ). Действительно, в главной таблице нет значений, на которые мог бы ссылаться внешний ключ зависимой таблицы. Решением проблемы является установка переключателя в рассматриваемое положение. В этом случае данные в каждую из таблиц получателя будут закачаны независимо друг от друга, и уже после копирования всех данных выполненится создание необходимых ограничений целостности. Для этого применяется команда ALTER TABLE, С ПОМОЩЬЮ которой будут внесены необходимые изменения в структуру таблицы получателя. Помимо перечисленных элементов управления, на вкладке также имеются два поля: П Create Table Statement. В поле выводится код команды CREATE TABLE, которая будет использована для создания таблицы на получателе. Установка флажков Create Primary Key и Create Foreign Keys и соответствующих переключателей в положение At Create Time приводит к тому, что в текст команды добавится дополнительный код, определяющий первичный и внешние ключи. Текст команды CREATE TABLE, на основе которого будет выполнено
353
Часть III. Администрирование
354
создание таблицы, также формируется на основе значений, указанных в таблице Mappings вкладки Column Mappings. Мастер автоматически строит код на основе определенных значений. Тем не менее, пользователь может внести в текст команды любые необходимые изменения. Если код в поле Create Table Statement был изменен, то восстановить его в первоначальном виде можно с помощью кнопки Auto Generate, находящейся справа над полем. П Alter Table Statement. В данном поле указывается текст команды ALTER TABLE, которая будет выполнена после завершения копирования данных. Текст кода будет генерироваться автоматически только в том случае, если выбран хотя бы один флажок (Create Primary Key или Create Foreign Keys), a соответствующий переключатель установлен в положение After data transformation и при всем этом в таблице на источнике существовало соответствующее ограничение целостности (первичный или внешний ключ). Тем не менее, если даже мастер не сгенерирует автоматически никакого сценария, пользователь может вручную указать нужный код. Эту возможность удобно использовать для создания в таблице получателя индексов, дополнительных ограничений целостности (например, ограничения целостности UNIQUE, обеспечивающего уникальность значений) и изменению любых других параметров таблицы.
Замечание Подробно синтаксис команд CREATE
TABLE И ALTER
TABLE будет рассмотрен в
главе 21. View Data Ш [pubs].[dbo].[autho(s up to first 1 Source: n0e0s1 ) laujd i au n Iame lag fnarne • 172-32-1176 White Johnson 213-46-8915 Green Maro jrei 238-95-7766 Carson C h e ryl 267-41-2394 OL ' eary M c i h ael 274-80-9391 Straight Dean 341-22-1782 Smtih Meander В ennet 409-56-7008 A braham Dull 427-17-2319 A nn Gringlesby 472-27-2349 B urt Locksley 486-29-1786 Chae rlne I
I phone I •*• 4d8 49S-7223 • 415 986-7020 415 543-7723 408 286-2428 415 834-2319 913 843-0462 415 658-9932 415 836-7128 707 938-6445 415 585-4620
OK
Hep l I
Рис. 11.13. Окно View Data
На этом рассмотрение вкладки Constraints и окна Column Mappings, Transformations, and Constraints можно считать оконченным. Более того, на этом заканчивается и конфигурирование копирования данных из таблиц и представлений. Следующее окно мастера (Save, schedule, and replicate package) используется для управления временем запуска создаваемого пакета DTS, местом его хранения и некоторыми другими параметрами. Это окно имеет один и тот же
Глава 11. Доступ к гетерогенным источникам данных
355
вид независимо от того, какой режим копирования был выбран в четвертом окне мастера. Работа с окном Save, schedule, and replicate package будет рассмотрена в разд. "Сохранение и выполнение пакета" далее в этой главе. В окне Select Source Tables and Views (см. рис. 11.9) имеется кнопка Preview, с помощью которой можно открыть окно View Data (рис. 11.13). В этом окне можно просмотреть, какой вид примут данные после трансформации. Следующий же раздел будет посвящен второму режиму копирования, при использовании которого дублируемый набор данных формируется в результате выполнения запроса.
Использование запроса для подготовки данных В предыдущих разделах было рассмотрено копирование информации из таблиц и представлений источника данных. Хотя этот режим и позволяет выполнять определенные преобразования, все же его возможности ограничены. В частности, в процесс преобразования могут быть вовлечены только данные одной таблицы. Тем не менее, иногда бывает необходимо выполнить копирование данных, объединенных из нескольких таблиц. В этом случае нужно использовать режим копирования Use a query to specify the data to transfer. Напомним, что режим копирования выбирается в четвертом окне мастера (см. рис. 11.8). После того, как будет отмечен нужный режим и нажата кнопка Next, мастер перейдет к пятому окну, которое имеет вид, подобный приведенному на рис. 11.14. %i DTS Import/Export Wizard x| Type SQL Statement f~Jili Type the SQL query statement that wil generate data from the selected database. Query statement: SELECT au_id. aujname, aujname phone FROM authors WHERE sTate N contract • 1
Query Bud li er
Parse < Sack
fJ
^
Browse.. Ne«t> I
Cancel
Help
Рис. 11.14. Окно Type SQL Statement мастера DTS Import/Export Wizard
Центральную часть окна занимает поле Query statement, содержащее запрос, на основе которого будет формироваться набор данных для копирования. Этот за-
356
Часть III. Администрирование
прос выполняется на источнике, указанном во втором окне мастера и в контексте выбранной базы данных.
Замечание
^
Хотя в поле можно ввести и более одного запроса, мастер будет работать только с результатом, получаемым после выполнения самого первого из них. Таким образом, результаты выполнения второго и всех последующих запросов будут потеряны. Текст запроса может быть введен вручную, построен с помощью Query Builder или загружен из файла. В последнем случае необходимо воспользоваться кнопкой Browse, расположенной в правом нижнем углу окна. С помощью кнопки Parse можно выполнить грамматический анализ указанного запроса. При этом, в ходе анализа выполняется не только проверка синтаксиса введенного запроса, но также и правильность указания имен объектов, к которым обращается запрос. Если в запросе упоминаются имена таблиц, представлений или их столбцов, которые на самом деле не существуют, то при попытке перейти к следующему окну мастер выдаст сообщение об ошибке. Аналогичное сообщение появится и при нажатии кнопки Parse. (
Замечание
)
Подробно написание запросов SELECT, С ПОМОЩЬЮ которых выполняется выборка данных, будет рассмотрено в главе 29. Для пользователей, имеющих отдаленное представление о написании запросов, мастер предлагает воспользоваться интерактивным построителем запросов Query Builder, который позволяет создать запрос, не вводя ни единой строки кода. Query Builder представляет собой небольшой мастер, который выполняется внутри мастера DTS Import/Export Wizard. Для запуска построителя запроса достаточно нажать кнопку Query Builder, расположенную в нижней части окна. После этого откроется первое окно построителя запроса Query Builder.
Выбор столбцов Первое окно Query Builder (рис. 11.15) имеет имя Select Columns, что переводится как "выбор столбцов". В соответствии с этим окно содержит два списка, с помощью которых и производится выбор столбцов, входящих в запрос. Включение в результат выборки не всех столбцов называется вертикальной фильтрацией. ^виугечание С помощью первого окна построителя запроса подготавливается список столбцов для
р а з д е л а
S E L E C T .
В левой части окна находится список Source tables с перечнем всех таблиц, доступных для копирования. Каждая таблица представляет собой папку, содержащую список имеющихся в этой таблице столбцов. Открыв таблицу, столбцы которой предполагается включить в запрос, остается только выбрать имя нуж-
Глава 11. Доступ к гетерогенным источникам данных
357
ного столбца и нажать кнопку > в центральной части окна. После этого имя соответствующего столбца будет добавлено в список Selected columns, расположенный в правой части окна. Данный список содержит перечень всех столбцов, которые будут включены в запрос. Помимо имени самого столбца в списке также указывается имя таблицы, которой он принадлежит. Если какой-то столбец был внесен в список Selected columns ошибочно, то его можно удалить с помощью кнопки <. Кнопка << предназначена для удаления всех столбцов. Внизу под списком Selected columns имеется две кнопки, с помощью которых можно управлять порядком отображения столбцов в результате выборки. 2<J
% DTS Import/Export Wizard Select Columns Select the cou l mns that you want to copy to the destination. ^Source tables; LJ authors •• au_id •• au Iname
Selected cou l mns: Table | Cou lmn authors au_id authors contract authors zip authors state authors city authors phone authors au_n l ame authors au_fname
phone address city state zip contract
Next>
Cancel
Help
Рис. 11.15. Первое окно Query Builder
После того, как имена всех интересующих столбцов будут внесены в список Selected columns, можно переходить к следующему окну построителя запросов.
Управление порядком сортировки Второе окно построителя запросов (рис. 11.16) имеет имя Specify Sort Order, что можно перевести как "укажи порядок сортировки". В соответствии с названием это окно позволяет управлять порядком, в котором будут перечисляться строки в результате выборки. Как и предыдущее, второе окно имеет два списка, с помощью которых и выполняется управление порядком сортировки. В левой части окна имеется список Selected columns, который в точности соответствует одноименному списку первого окна построителя запросов, включая и список столбцов. Используя кнопки в центральной части окна, можно переносить те или иные столбцы из списка Selected columns в список Sorting order.
Часть III. Администрирование
358 % DTS import/Export Wizard Specify Sort Otdei Select Ihe ordei in which you want (he data sorted. Sotting order: Table ; Column authors aujname authors au_fname
Selected columns: Table ! Column authors aujd authors contract authors zip authors state authors city
Cancel
Help
Рис. 11.16. Второе окно Query Builder
Замечание
^
С помощью второго окна построителя запросов формируется раздел ORDER запроса S E L E C T , который будет использоваться для формирования набора данных для копирования.
Включение столбца в список Sorting order приводит к тому, что результат выборки будет упорядочиваться в соответствии со значениями в указанном столбце. При этом в список Sorting order может быть включено более одного столбца. Соответственно, сортировка будет выполняться по всем столбцам, перечисленным в списке. При этом сначала будет выполняться упорядочивание по самому первому столбцу, указанному в списке, затем по второму и т. д. Таким образом, управляя последовательностью перечисления столбцов в списке Sorting order, можно контролировать последовательность использования столбцов для сортировки строк результата выборки. Для перемещения имен столбцов в списке Sorting order служат кнопки Move Up и Move Down, которые, соответственно, перемещают выбранный столбец вверх и вниз в списке. После того, как в список Sorting order будут внесены и упорядочены имена всех столбцов, которые должны служить критерием сортировки, можно переходить к следующему окну построителя запросов. Замечание
D
В принципе, в списке Sorting order может быть не указано ни одного столбца. В этом случае данные сортироваться не будут, а выведутся в том порядке, в котором они хранятся физически.
Глава 11. Доступ к гетерогенным источникам данных
359
Определение условий выборки Последнее, третье окно Criteria, что переводится окна пользователь может включаемых в результат тальной фильтрацией.
мастера (рис. 11.17) имеет название Specify Query как "определите критерии запроса". С помощью этого задать условие, позволяющее ограничить набор строк, выборки. Подобное ограничение называется горизон-
% DTS Import/Export Wizard Specify Queiji Criteria Specfiy (he criteria (hat wil be used to selecCtlicrk ow(...) s. to select a value from a list. f All rows (* Qny l Rows meetn i g criteria Cou l mn: Oper.: Value/Colurnn: |[au(hors].[state] d!= d JCA (AND J_J ([authors].[contract] d i = d j zl J dl d
г
< Back
Next>
dd dd d i Hep l
Рис. 11.17. Третье окно Query Builder
В верхней части окна содержится переключатель, который управляет тем, будет ли вообще выполняться горизонтальная фильтрация или нет. Установка переключателя в положение All rows приведет к тому, что в результат выборки будут включены все строки, имеющиеся в указанных таблицах. Если же необходимо включить только те строки, которые удовлетворяют определенному условию, то переключатель необходимо установить в положение Only Rows meeting criteria. В последнем случае в центральной части окна становятся доступными элементы управления, с помощью которых и указывается необходимое условие. Рассмотрим подробно формирование условия выборки. В раскрывающемся списке Column выбирается имя столбца, от значений которого зависит включение соответствующей строки в результат выборки. Список содержит перечень всех столбцов, которые были включены в список Selected column в первом окне построителя запросов. Когда имя столбца будет выбрано, становится доступным список Орег, с помощью которого выбирается логическая операция (<, >, =, о , <=, >=), используемая для принятия решения о включении или невключении строки в результат выборки. Когда определена и логическая операция, становится доступным поле Value/Column, с помощью которого указывается величина для сравнения значения столбца, выбранного в
Часть III. Администрирование
360
списке Column. В элементе управления Value/Column можно задать либо имя столбца, выбрав его имя в раскрывающемся списке, либо ввести конкретное значение. Select a distinct value for the column:
[authors], [state] 1
'IN 'KS'1 'MD 'Ml1 'OR' W 'UT'
Помимо ввода значения вручную, можно выбрать один из вариантов, имеющихся в столбце, указанном в списке Column. Для этого предназначено диалоговое окно Select a Value (рис. 11.18), открыть которое можно с помощью кнопки , 1 , расположенной в правой части строки.
В данном окне приводятся все значения, которые имеются в соответствующем столбце таблицы. При этом повторяющиеся значения не выводятся. Определение условия заканчивается на вводе значения в поле Value/Column. Cancel OK Тем не менее, можно сконфигурировать более одного условия. Если это необходимо, то поРис. 11.18. Окно Select a Value сле конфигурирования условия в первой строке необходимо в самом левом раскрывающемся списке второй строки выбрать логическую операцию, которая будет связывать второе условие с первым. Можно выбрать одно из двух значений: • AND. При выборе этой операции соответствующая строка будет включена в результат выборки в том случае, если она удовлетворяет как первому, так и второму условию. П OR. В данном случае для включения строки в результат выборки достаточно выполнения хотя бы одного из сконфигурированных условий. Помимо указания логической операции формирование второго условия практически ничем не отличается от формирования первого условия. При необходимости можно определить и третье условие. Однако на этом возможности построителя запроса ограничиваются. Если требуется назначить более трех условий, то необходимо это будет сделать непосредственно в коде запроса с помощью поля Query statement в пятом окне мастера. Замечание Необходимо отдельно отметить, что построитель запросов не выполняет проверки на совпадение типов данных столбца, выбранного в списке Column, и значения, указанного в поле Value/Column. Однако, когда создание запроса завершится и сгенерированный код будет помещен в поле Query statement пятого окна мастера, при попытке перехода к следующему окну будет выдано сообщение об ошибке, говорящее о несовместимости типов данных. Аналогичное сообщение будет выдано и при нажатии кнопки Parse.
После того как все условия выборки будут определены, работа построителя запросов заканчивается. Нажатие кнопки Next в третьем окне построителя запроса перенесет пользователя к пятому окну мастера DTS Import/Export Wizard.
Глава 11. Доступ к гетерогенным источникам данных
361
Однако в поле Query statement будет отображен построенный запрос. Для проверки его правильности можно воспользоваться кнопкой Parse. Если в ходе проверки не было обнаружено ни одной ошибки, то на этом формирование запроса, на основе которого будет получен набор данных для копирования., можно считать законченным. Следующее, шестое окно мастера не имеет отношения к созданию запроса и для указания, куда должен быть помещен набор данных, получаемый в результате выполнения запроса.
Указание таблицы получателя После того, как был подготовлен запрос, на основе которого будет формироваться набор данных для дублирования, необходимо указать таблицу и ее столбцы, куда будут копироваться подготовленные данные. Для выполнения указанных действий используется седьмое окно мастера (рис. 11.19), имеющее название Select Source Tables and Views. % DTS Import/Export Wizard Select Source Tables and Views You can choose one or more tables or ve i ws to copy. You can copy the schema and data as it appears in the source or click (...) to transform the data usn ig ActiveX script*. lable(s) and View(s): Source j Destination ; Transform ••: oV Query Sj[Bonus].[dboJ.[autr-iorsljJ ,:l
Next > | • Cancel J
Hep l
Рис. 11.19. Окно Select Source Tables and Views мастера DTS Import/Export Wizard
Работа с окном Select Source Tables and Views практически ничем не отличается от работы с одноименным окном, используемым при работе в режиме копирования данных из таблиц и представлений (см. рис. 11.9). Работа в этом режиме, и в частности работа с окном Select Source Tables and Views, была рассмотрена в разд. "Копирование данных из таблиц и представлений"ранее в этой главе. Единственным и главным отличием является то, что при использовании режима формирования исходного набора данных на основе выполнения запроса окно Select Source Tables and Views содержит только один источник данных — представление Query, которое является ничем иным, как запросом, указанным в предыдущем окне мастера.
362
Часть III. Администрирование
Следующее окно мастера (Save, schedule, and replicate) служит для управления временем запуска создаваемого пакета DTS, местом его хранения и некоторыми другими параметрами. Оно имеет один и тот же вид независимо от того, какой режим копирования был выбран в четвертом окне мастера. Работа с окном Save, schedule, and replicate package будет рассмотрена в разд. "Сохранение и выполнение пакета"далее в этой главе. Следующий же раздел будет посвящен третьему режиму копирования, который позволяет переносить не только данные, но и объекты базы данных.
Перенос объектов базы данных Предыдущие разделы были посвящены рассмотрению двух режимов копирования, в основном используемых для переноса данных. В качестве дополнительной операции при копировании данных из таблиц и представления (первый режим) можно было выполнить создание на получателе таблиц. Дополнительно для таблиц можно было создать и ограничения целостности. Однако на этом возможности предыдущих двух режимов по копированию объектов баз данных заканчиваются. Тем не менее, иногда можно не выполнять копирование данных с выполнением сложных преобразований, а всего-навсего нужно перенести несколько объектов базы данных с одного SQL Server на другой. Для выполнения подобных операций и предназначен третий режим копирования — Copy objects and data between SQL Server databases.
(
Замечание
Л
Как уже было сказано ранее в этой главе, перенос объектов базы данных допускается только для серверов SQL Server. При выборе в качестве источника или получателя не SQL Server, возможность копирования объектов базы данных будет недоступна. Допускается перенос объектов из баз данных SQL Server 7.0 и SQL Server 2000 в базы данных SQL Server 2000. Напомним, что режим переноса данных выбирается в четвертом окне мастера, имеющем название Specify Table Copy or Query (см. рис. 11.8). Это окно подробно рассматривалось в разд. "Выбор режима копирования" ранее в этой главе. После того, как будет выбран нужный режим и нажата кнопка Next, мастер перейдет к очередному окну, которое будет иметь вид, подобный приведенному на рис. 11.20. Пятое окно мастера при работе в режиме копирования объектов базы данных имеет название Select Objects to Copy, что можно перевести как "выберите объекты для копирования". Как нетрудно догадаться из названия, это окно используется для выбора объектов, предназначенных для переноса из исходного SQL Server на SQL Server-получатель. Помимо выбора объектов для копирования, окно позволяет управлять параметрами переноса. Например, можно сконфигурировать предварительное удаление на получателе объектов, имеющих те же имена, что и переносимые объекты исходного сервера.
Глава 11. Доступ к гетерогенным источникам данных
363
% DTS Import/Export Wizard Select Objects to Copy You can copy tables, data, stored procedures, referential integrity constraints, security, and indexes. Choose the object(s) to copy. W Create destination objects (tables, views, stored procedures, constraints, etc.; W Drop destination objects first 17 include all dependent objects I? Copy data f*" Replace existing data С Append data f~ Use Collation Г" Copy all objects I
yse default options'
Script file directory:
Select Objects... Options... f^1 '".'.' "'———'— G:\Prograrn FilesVMicrosoft SQL Server\80V
Next>
Cancel
Help
Рис. 11.20. Окно Select Objects to Copy мастера DTS Import/Export Wizard
Замечание Перенос объектов базы данных реализуется с помощью задачи Copy SQL Server Objects Task. Если пакет, создаваемый с помощью мастера, будет сохранен для дальнейшего использования, то при его редактировании с помощью DTS Designer можно будет увидеть, что он содержит единственную задачу Copy SQL Server Objects Task, которая и выполняет все действия. Следующие три раздела будут посвящены рассмотрению элементов управления, имеющихся в окне.
Выбор объектов для копирования В верхней части окна имеется флажок Create destination objects (tables, views, stored procedures, constraints, etc.), установив который можно разрешить создание в базе данных получателя объектов, выбранных для копирования: таблиц, представлений, ограничений целостности, индексов, пользователей, триггеров и т. д. Если флажок сброшен, то создание объектов выполняться не будет. Это бывает полезно, если ранее в базе данных получателя были созданы все необходимые объекты и целью создания пакета является перенос данных, а не объектов. Если все же необходимо перенести объекты, или быть уверенным, что получатель имеет необходимые объекты, то флажок Create destination objects (tables, views, stored procedures, constraints, etc.) должен быть установлен. При данном установленном флажке оказываются доступными два других флажка: •
Drop destination objects first. Отметка данного флажка приведет к тому, что прежде чем в базе данных получателя будут созданы объекты, выбранные для копирования, механизмы DTS удалят все объекты, имеющие те же имена,
364
Часть III. Администрирование
что и выбранные для копирования. При этом структура удаляемых объектов получателя и объектов, которые выбраны для копирования на источнике, может не совпадать. Подобное удаление необходимо, когда нет уверенности, что база данных получателя уже не содержит объектов с теми же именами, что и копируемые. Наличие подобных объектов может привести к ошибке создания нового объекта, а позже и к невозможности вставки данных (при работе с таблицами) из-за несоответствия структур. • Include all dependent objects. При установке этого флажка в процесс копирования будет включен не только сам объект, но и все другие объекты, которые необходимы для успешной его работы. Примером такой связи может являться указание одной или более таблиц, на основе которых построено представление. Если скопировать только представление без исходных таблиц, то использование этого представления будет невозможно, т. к. самих данных нет. Другим примером зависимости может служить индекс и таблица. Не секрет, что копирование индекса (равно как и ограничения целостности или значения по умолчанию) отдельно от таблицы не имеет смысла. Установив флажок Include all depends objects, можно не беспокоиться о том, что вы могли забыть включить в процесс копирования один или более объектов. Рассмотренные три флажка используются для управления дублирования объектов. Список же объектов, которые будут копироваться из базы данных источника в базу данных получателя, указывается отдельно. Для выбора объектов, которые должны быть скопированы, предназначено окно Select Objects (рис. 11.21), открыть которое можно с помощью одноименной кнопки в нижней части окна мастера. Однако по умолчанию кнопка Select Objects не доступна, т. к. установлен флажок Copy all objects. Когда этот флажок отмечен, то в ходе выполнения пакета будут скопированы все объекты базы данных источника. Если же необходимо скопировать только часть объектов, то следует сбросить его и воспользоваться окном Select Objects для выбора объектов. В верхней части окна Select Objects содержится набор флажков, которые служат для включения в таблицу Objects всех объектов соответствующего типа. В распоряжении пользователя имеются перечисленные ниже флажки: П Show all tables — таблицы; О Show all views — представления; G Show all stored procedures — хранимые процедуры; П Show all defaults — умолчания; •
Show all rules — правила;
•
Show all user-defined data types — пользовательские типы данных.
Если предполагается скопировать только несколько таблиц и хранимых процедур, то достаточно оставить установленными флажки Show all tables и Show all stored procedures, сбросив все остальные. В итоге в области Objects будут перечислены все таблицы и хранимые процедуры, которые имеются в базе данных, выбранной во втором окне мастера. Конечно, можно оставить включенными все флажки, но тогда поиск нужных объектов усложнится.
Глава 11. Доступ к гетерогенным источникам данных
365
Select Objects
Objects Щ P Show all .tables
Г™] f ? Show all defaults
oV P Show all views
E3 Is? Show all rules
plj p Show all stored firoceduies (5
1*^ S how user-defined data types
Objects: .Object Name V; у]
Ец| authors ЦЦ discounts
:Type Table Table
&}
ИЗ employee
Table
* \Йшpub_info Б
П
D
j*J —J
Table Table
S I publishers
-rj 1
Select All
Check
I
Uncheck
OK
'* 1
J
Cancel
Help
Рис. 1 1 . 2 1 . Окно Select Objects
Рассмотрим теперь работу с таблицей Objects. Каждая ее строка соответствует отдельному объекту базы данных. В столбце Object выводится пиктограмма, обозначающая тип объекта. Соответствие изображений и типов объектов можно легко узнать с помощью флажков в верхней части окна — слева от каждого флажка выводится соответствующий значок. Тип объекта также указывается в столбце Туре. Имя же объекта отображается в столбце Object Name. В самом левом столбце каждой строки имеется флажок, установив который можно тем самым включить объект в процесс копирования. В нижней части окна находится кнопка Select All, с помощью которой можно выделить все строки таблицы Objects. Используя кнопки Check и Uncheck можно, соответственно, установить и сбросить флажки в выделенных строках. Помимо кнопки Select All для выделения объектов также можно использовать мышь. Удерживая нажатой клавишу можно выделить более одного объекта. После того, как будут выбраны все нужные объекты, работу с окном Select Objects можно считать законченной, и остается только нажать кнопку ОК.
Управление копированием данных После того, как были определены свойства копирования объектов, можно приступать к конфигурированию процесса копирования данных. Первое, что необходимо сделать для этого — разрешить собственно копирование данных. Для этого достаточно установить флажок Copy data (см. рис. П.20), что приведет к копированию данных всех таблиц, выбранных в окне Select Objects. Если же флажок Copy data не установлен, то данные скопированы не будут. Тем не менее, это никаким образом не влияет на копирование объектов. То есть флажок Copy data может быть сброшен, если предполагается всего-навсего скопировать объекты базы данных, но оставить все таблицы пустыми.
366
Часть III. Администрирование
Если флажок Copy data все же отмечен, то становится доступным переключатель, расположенный непосредственно ниже флажка. Этот элемент управления может быть установлен в одно из двух положений: П Replace existing data. Когда переключатель установлен в это положение, то при выполнении пакета в таблицах базы данных получателя будут удалены все имеющиеся строки. Таким образом, таблицы получателя будут содержать только те данные, которые имелись на источнике. • Append data. В этом случае данные источника будут добавлены к имеющимся данным получателя. Указанный метод позволяет выполнять накопление информации. На этом конфигурирование свойств копирования данных заканчивается.
Конфигурирование дополнительных свойств В двух предыдущих разделах был рассмотрен выбор объектов, которые предполагается скопировать, а также управление параметрами копирования данных таблиц. Однако, помимо перечисленных свойств в окне Select Object to Copy мастера DTS Import/Export Wizard можно сконфигурировать и другие параметры, определяющие возможность копирования настроек системы безопасности, индексов, триггеров, полнотекстовых индексов, а также управлять некоторыми иными параметрами. Копирование объектов баз данных осуществляется в два этапа. В ходе выполнения первого этапа на источнике генерируется код Transact-SQL, с помощью которого можно создать объекты, выбранные для копирования. Второй же этап включает запуск сгенерированного кода на сервере-получателе. После выполнения этого кода в базе данных получателя будут созданы все объекты, выбранные для копирования. Дополнительно, в генерируемый код могут быть включены команды, выполняющие удаление в базе данных получателя объектов, тип и имя которых совпадают с аналогичными характеристиками объектов, выбранных для копирования. Мастер DTS Import/Export Wizard позволяет сохранять код, который будет использоваться для создания объектов в базе данных получателя. В этот код включаются команды создания не только объектов, выбранных в окне Select Objects, но и команды создания пользователей, триггеров, индексов и некоторых других объектов базы данных. По умолчанию генерируемый код сохраняется в каталоге \Program Files\Microsoft SQL Server\80\Tools. Однако можно указать любой другой каталог, введя его имя вручную в поле Script file directory или выбрав интерактивно с помощью окна Browse for Folder, открыть которое можно с помощью кнопки 1, расположенной справа от указанного поля. Сохраненный код может быть позже использован для повторного создания объектов на любом из серверов SQL Server.
(
Замечание
^
Код генерируется не как единственный файл с расширением sqi, а в виде набора файлов, каждый из которых отвечает за выполнение специализированных действий. По-
Глава 11. Доступ к гетерогенным источникам данных
367
мимо файлов сценариев, в указанном каталоге также будут сохранены журнальные файлы (с расширением log), в которых описываются проблемы, встреченные при выполнении пакета. Эти журнальные файлы весьма полезны в случае неудачного выполнения пакета, т. к. с их помощью можно легко найти причину возникших ошибок. Помимо возможности сохранения генерируемого кода, можно также управлять дополнительными параметрами копирования объектов. Для этого предназначено диалоговое окно Advanced Copy Options (рис. 11.22), открыть которое можно с помощью кнопки Options. Однако по умолчанию данная кнопка недоступна, т. к. мастер предлагает использовать свойства по умолчанию. Об этом свидетельствует установленный флажок Use default options. Если параметры по умолчанию чем-то вас не устраивают, то необходимо сбросить указанный флажок и установить нужные параметры с помощью окна Advanced Copy Options.
С
Замечание
На рис. 11.22 приведено состояние параметров по умолчанию. То есть использование установленного флажка Use default options равнозначно установке параметров в указанное состояние. Advanced Copy Options
Opo tins I Secutryi opo tins Щ
C o p y database users and database roles'
Г™ Copy SQL Server .logins (Windows NT a n d SQL Server logins) ft? Copy gbject-level permissions
Table options _£5=| I** Copy indexes f/ Copy triggers f? Copy full text indexes F Copy PRIMARY and FOREIGN keys Г™ .Generate Scripts in Unicode Quoted identifiers G*l i i f£\ fi? Use guoted identifiers when copying objects
OK
Cancel
Hep l
Рис. 11.22. Окно Advanced Copy Options
В группе элементов Security options имеется три флажка, с помощью которых можно управлять свойствами копирования настроек системы безопасности базы данных: О Copy databases users and databases roles. Установка этого флажка предписывает дублирование не только объектов, но и пользователей базы данных. Также будут скопированы все пользовательские роли и роли приложений, созданные в базе данных источника, а также информация о членстве пользователей в тех или иных ролях. Копирование пользователей обязательно, если некото13
Заг.83
368
Часть III. Администрирование
рые из переносимых объектов принадлежат конкретным пользователям, а не владельцу базы данных (пользователю dbo). Если в базе данных получателя не будет существовать некоторых пользователей, то создание принадлежащих им объектов окажется невозможным. В принципе, необходимые пользователи могут быть созданы на получателе вручную. Другим решением проблемы непереноса объектов является передача прав владения всеми копируемыми объектами пользователю dbo. Замечание В целях безопасности, механизмы DTS не выполняют генерирования сценариев для ролей приложения. Дело в том, что при создании роли приложения необходимо указать пароль, который будут использовать пользователи для установления соединения. То есть этот пароль должен быть явно указан в генерируемом сценарии, что позволяет легко прочитать его. Если пользовательская роль владеет какими-то из копируемых объектов, то на получателе эти объекты созданы не будут. Тем не менее, можно вручную создать на получателе необходимые роли приложения до выполнения пакета DTS.
G Copy SQL Server logins (Windows NT and SQL Server). После установки указанного флажка помимо пользователей базы данных будут скопированы все учетные записи (как SQL Server, так и Windows NT), которые были сконфигурированы на сервере-источнике. Рассматриваемый флажок должен быть всегда установлен, если выполняется копирование пользователей базы данных (т. е. установлен предыдущий флажок) и на получателе не определены учетные записи, с которыми должны быть связаны пользователи базы данных. Создание пользователя при копировании выполняется с помощью хранимой процедуры sp_grantdbaccess, работа с которой была подробно рассмотрена в главе 9. Одним из обязательных параметров данной процедуры является имя учетной записи, с которой должен быть связан создаваемый пользователь базы данных. А поскольку нужной учетной записи на получателе нет, то выполнение операции закончится ошибкой. Замечание Для учетных записей SQL Server, создаваемых в процессе копирования на получателе, устанавливается пустой пароль. То есть при выполнении хранимой процедуры s p _ a d d l o g i n , предназначенной для создания учетных записей SQL Server, для параметра @passwd указывается значение N U L L . Поэтому после выполнения пакета необходимо установить пароли для учетных записей SQL Server, особенно если они состоят в фиксированных ролях сервера. Работа хранимой процедуры s p _ a d d l o g i n была подробно рассмотрена в главе 9.
• Copy object-level permissions. Если вы потратили много времени на конфигурирование прав доступа пользователей на сервере-источнике, то наверняка захотите воспользоваться имеющимися настройками, а не выполнять всю работу заново. При помощи рассматриваемого флажка можно разрешить или запретить копирование прав доступа пользователей к объектам базы данных. При установленном флажке в генерируемый код (сценарий) будут включены
Глава 11. Доступ к гетерогенным источникам данных
369
команды GRANT и DENY, с помощью которых будет, соответственно, предоставляться или отклоняться доступ тем или иным пользователям к копируемым объектам базы данных. Замечание По умолчанию для всех копируемых пользователей сконфигурировано неявное отклонение доступа. Поэтому команда REVOKE В генерируемом сценарии не фигурирует. Более того, если флажок Copy object-level permissions сброшен, все копируемые пользователи будут иметь в базе данных получателя неявное отклонение доступа ко всем объектам. Рассмотренные три флажка исчерпывают возможности мастера по управлению копированием параметров системы безопасности. То есть нельзя продублировать лишь часть пользователей или ролей базы данных, не скопировав других. Также невозможно, например, скопировать только права на разрешения доступа (GRANT), не скопировав информацию о запрещении доступа (DENY). Однако необходимые исправления могут быть произведены уже после выполнения пакета непосредственно в базе данных получателя. Другим вариантом внесения изменений является исправление сценария, генерируемого мастером. Этот сценарий представляет собой всего-навсего набор команд Transact-SQL, с помощью которых выполняется создание объектов базы данных, пользователей и ролей, предоставление им прав доступа к объектам и т. д. Ничто не мешает внести необходимые исправления и дополнения и выполнить сценарий в Query Analyzer. Немалую часть окна Advanced Copy Options занимает группа элементов Table options, которая предназначена для управления копированием вспомогательных объектов, используемых совместно с таблицами. В группе имеется следующий набор флажков: •
Copy indexes. Разрешает или запрещает копирование индексов таблиц, включенных в процесс дублирования в окне Select Objects.
•
Copy triggers. Разрешает или запрещает копирование триггеров таблиц.
•
Copy full text indexes. Разрешает или запрещает копирование полнотекстовых индексов таблиц.
•
Copy PRIMARY and FOREIGN keys. Разрешает или запрещает копирование первичных и внешних ключей таблиц.
О Generate Scripts in Unicode. При установке этого нерироваться в стандарте Unicode, что позволяет нами в любом из национальных языков. Данная на таблицы, но и на весь генерируемый сценарий
флажка сценарий будет гепереносить объекты с имеопция действует не только целиком.
Нерассмотренным остался только флажок Use quoted identifiers when copying objects, выбор которого предписывает заключать имена копируемых объектов в ограничители. Это необходимо, если имена объектов включают недопустимые символы (например, пробелы). Рекомендуется всегда устанавливать данный флажок, т. к. это не приведет ни к каким осложнениям, но поможет избавиться от проблем с нестандартными именами объектов.
Часть III. Администрирование
370
На этом конфигурирование дополнительных параметров, равно как и всего процесса копирования объектов и данных между базами данных серверов SQL Server, можно считать законченным. Четыре предыдущих раздела были в основном посвящены описанию работы с окном мастера Select Object to Copy, с помощью которого выполняется выбор объектов и данных для копирования. Следующее окно мастера имеет имя Save, schedule, and replicate package и предназначено для управления временем запуска создаваемого пакета DTS, местом его хранения и некоторыми другими параметрами. Указанное окно имеет один и тот же вид независимо от выбранного режима копирования в четвертом окне мастера и будет рассмотрено в следующем разделе.
Сохранение и выполнение пакета Три предыдущих раздела были посвящены рассмотрению различных режимов копирования, выбираемых в окне мастера Specify Table Copy or Query. Представленные далее окна служат для конфигурирования выбранного режима копирования. После того, как настройка будет завершена, мастер переходит к окну Save, schedule, and replicate package (рис. 11.23), которое всегда имеет один и тот же вид, независимо от выбранного режима копирования. % DTS Import /Export Wizard Save, schedule, and leplicate package Specfiy if you want to save this DTS package. You may also replicate the data or schedue l the package to be executed at a later time. When }• Ruri m i meda i teyl
Г™ Use replication to publish destination data ... j Occurs every 1 day(s), at 0:00:00.
Save
•p SQL Server f SQk Server Meta Data Services (~" Structured Storage File
Save DTS Package
Г Visual Basic File
< Back
Next>
Cancel
Help
Рис. 11.23. Окно Save, schedule, and replicate package
Рассматриваемое окно предназначено для указания времени и условия запуска создаваемого пакета, а также для определения места хранения пакета. Для управления временем запуска пакета предназначена группа When, в которую входят элементы управления: • Run immediately. Установка флажка предписывает выполнить создаваемый пакет незамедлительно после завершения его создания. Если же пакет пред-
Глава 11. Доступ к гетерогенным источникам данных
371
полагается обработать позже, запустив его вручную или автоматически, то следует сбросить флажок. • Use replication to publish destination data. Если скопированные из источника таблицы предполагается опубликовать с использованием подсистемы репликации, то можно установить рассматриваемый флажок. В этом случае после завершения работы мастера DTS Import/Export Wizard будет запущен мастер Create Publication Wizard, предназначенный для создания публикаций. По умолчанию будет определена публикация, включающая все копируемые в ходе выполнения пакета таблицы. В принципе, ничто не мешает определить публикацию позже с помощью того же самого мастера. Более подробно подсистема репликации, и в частности работа с мастером Cpeate Publication Wizard, будет рассмотрена в главе 14. П Schedule DTS package for later execution. Как было сказано, при установленном флажке Run immediately пакет запустится на выполнение сразу же после того, как завершится его создание. То есть пакет будет обязательно запущен хотя бы один раз. Однако часто бывает необходимо стартовать созданный пакет периодически (например, раз в неделю) в автоматическом режиме. Для реализации подобного требования достаточно установить рассматриваемый флажок. Это приведет к тому, что мастер создаст новое задание для службы SQLServerAgent, которое будет автоматически выполнять созданный пакет. При разрешении автоматического выполнения пакета время его запуска отображается в поле, расположенном непосредственно ниже флажка Schedule DTS package for later execution. По умолчанию пакет запускается каждый день ровно в полночь (Occurs every I day(s), at 0:00:00). Однако пользователь может выбрать время запуска пакета произвольным образом. Для этого применяется окно Edit Recurring Job Schedule (рис. 11.24), вызвать которое можно с помощью кнопки ^ J . Более подробно работа с этим окном рассмотрена ниже в разд. "Управление временем запуска ". Edit Recurring Job Schedule Job name: (New Job) г Occurs •
r
—-] : Monthly
Daily
^i of every II ^4 monthfs
| -C Weekly 1
Daily frequency f* Occurs once at:
j
f" Occujs every:
Durato in Start date: 101.10.2001
jjj
Г
£nddate: <•" No end date Cancel
Рис. 11.24. Окно Edit Recurring Job Schedule
372
Часть III. Администрирование
В окне Save, schedule, and replicate package (см. рис. 11.23) также можно разрешить сохранение пакета для дальнейшего использования. Более того, подобное сохранение обязательно, если предполагается последующий автоматический запуск пакета. Таким образом, если установлен флажок Schedule DTS package for later execution, то должен быть установлен и флажок Save DTS Package, что предписывает мастеру сохранить пакет. Пакет также может быть сохранен и без установки флажка Schedule DTS package for later execution. В этом случае пакет может быть запущен в любое время вручную. Место хранения определяется с помощью переключателя, расположенного в правой части группы Save. Данный переключатель может быть установлен в одно из следующих положений: • SQL Server. При установке переключателя в это положение пакет будет сохранен В системной Таблице sysdtspackages базы данных Msdb. • SQL Server Meta Data Services. В этом случае пакет хранится в структурах службы метаданных SQL Server, что позволяет отслеживать изменение пакета, его использование, потоки данных, которыми оперировал пакет, и некоторую другую информацию. П Structured Storage File. Пакет будет сохранен в структурированном СОМфайле; • Visual Basic File. Пакет сохранится в файле Visual Basic. На этом конфигурирование времени запуска и сохранения пакета заканчивается. Следующие два подраздела посвящены конфигурированию времени автоматического запуска пакета и определению некоторых свойств сохранения пакета.
Управление временем запуска Как было сказано выше, окно Edit Recurring Job Schedule (см. рис. 11.24) используется для конфигурирования времени запуска пакета. Настоящий раздел будет посвящен детальному описанию работы с указанным окном. С помощью переключателя Occurs выбирается базис частоты выполнения пакета. В зависимости от того, в какое положение установлен переключатель, меняется и вид окна, точнее список элементов управления, расположенных в группе справа от переключателя. Переключатель Occurs может быть установлен в одно из трех положений: П Daily — на дневном базисе. В этом случае группа справа от переключателя имеет имя Daily и содержит единственное поле, в котором указывается частота выполнения пакета. Пакет может выполняться раз в день, в два дня, три и т. д. • Weekly — на недельном базисе. В этом случае группа справа от переключателя имеет имя Weekly и содержит набор флажков, с помощью которых указывается, в какие дни недели будет запускаться пакет. Помимо этого можно определить, будет ли пакет выполняться в указанные дни каждой недели, каждых двух недель, трех и т. д.
Глава 11. Доступ к гетерогенным источникам данных П Monthly — на месячном базисе. В этом случае группа справа от переключателя называется Monthly. Запуск пакета может быть либо назначен на определенное число каждого месяца, либо на определенный день конкретной недели. Описанные выше элементы управления используются для задания дней, в которые будет запускаться пакет. Однако помимо этого можно указать и время старта пакета. Для этого существует группа Daily frequency. Момент запуска пакета в пределах дня может определяться двумя способами: П Occurs once at. При установке переключателя в это положение запуск пакета в указанные дни будет выполняться в строго указанное время, которое вводится правее. По умолчанию предлагается выполнять пакет ровно в полночь (0:00:00). Таким образом, пакет будет запускаться один раз в каждый из выбранных дней. О Occurs every. Если необходимо выполнять пакет более одного раза в день, то нужно установить переключатель в рассматриваемое положение. В этом случае пользователь должен будет указать, станет ли задание выполняться раз в час, раз в два часа, три и т. д. Помимо этого, в поле Starting at можно указать время, начиная с которого будет выполняться запуск пакета. Время, до которого пакет может запускаться, указывается в поле Ending at. По умолчанию два последних поля сконфигурированы таким образом, что пакет может быть выполнен в любое время суток. Тем не менее, время запуска пакета всегда сдвигается на начало часа. Помимо всего прочего, с помощью элементов управления группы Duration можно определить промежуток времени, в течение которого будет осуществляться запуск пакета. Все указанные ранее установки начнут действовать только в пределах указанных границ. Для управления промежутком времени запуска пакета используются следующие элементы управления: •
Start date. В данном раскрывающемся списке указывается дата, начиная с которой станет возможным запуск задания. После наступления назначенной даты начинают действовать установки, определенные с помощью описанных выше элементов управления. Таким образом, задание может быть выполнено гораздо позже даты, указанной в списке Start date. Это возможно, например, когда в нем указано первое апреля 2001 года, но переключатель Occurs установлен в положение Monthly, и для запуска пакета выбрано 25 число каждого месяца. Таким образом, пакет будет выполнен спустя 25 дней с момента разрешения запуска пакета. По умолчанию в поле Start date указывается дата создания пакета.
П End date. В этом поле можно ввести дату, до которой разрешено выполнение пакета. После наступления указанной даты пакет можно будет либо запустить вручную, либо определить для него новое расписание. Более подробно ручной запуск и конфигурирование расписаний запуска заданий будут рассмотрены в следующей главе. •
No end date. При установке переключателя в данное положение время выполнения пакета не ограничивается.
373
Часть III. Администрирование
374
После того, как автоматический запуск пакета на выполнение будет определен и работа мастера завершиться, в папке Management\SQL Server Agent\Jobs панели Enterprise Manager сервера, на котором был сохранен пакет, можно будет увидеть, что было добавлено новое задание, выполняющее запуск созданного пакета. При необходимости можно в любое время открыть это задание и внести в него необходимые изменения. Это может понадобиться, например, для изменения времени запуска пакета. Более подробно управление заданиями будет рассмотрено в следующей главе.
Конфигурирование хранения пакета Если в окне Save, schedule, and replicate package (см. рис. 11.23) был установлен флажок Save DTS Package, что свидетельствует о желании пользователя сохранить пакет для дальнейшего использования, то следующее окно мастера (рис. 11.25) будет называться Save DTS Package, что переводится как "сохранение пакета DTS". В соответствии с названием это окно мастера используется для конфигурирования параметров сохранения пакета. % OTS Import/Export Wizard Save DTS Package You can save the DTS Package for reuse. You must save the package to schedue l it for later execution. Na,me: fJescription: fjwner password: Location: Server name: J
2<J
jTransfer pubs data |Нечегопгг комме нгировать User password: j
Iми—— SQL Server
jSTORAGEURELON
i* Use Windows NT authentication С Use SQLServer authentication
< Back
Next>
Cancel
Help
Рис. 11.25. Окно Save DTS Package
Окно содержит ряд элементов управления, с помощью которых и определяются свойства сохранения пакета: • Name. В этом поле указывается имя, под которым будет сохранен пакет. Имя должно быть уникально в пределах хранилища, в которое записывается пакет. • Description. Поле предназначено для ввода краткого описания пакета и носит чисто информативный характер.
Глава 11. Доступ к гетерогенным источникам данных П Owner password. В этом поле указывается пароль владельца пакета. Пользователь, знающий пароль владельца, может вносить в пакет любые изменения. Если пароль в данном поле не указан, то изменения в пакет может вносить любой пользователь. • User password. Указывается пользовательский пароль, который должен вводиться всякий раз, когда пакет будет запускаться. Знание этого пароля дает пользователям возможность только выполнять пакет, но не изменять его. D Location. В данном поле указывается тип используемого хранилища. П Server name. Раскрывающийся список позволяет выбрать имя сервера SQL Server, на котором будет сохранен пакет. • Use Windows NT authentication. При установке переключателя в это положение для подключения к выбранному в списке Server name серверу будет использоваться аутентификация Windows NT. О Use SQL Server authentication. В этом случае для сохранения пакета для подключения к серверу будет применяться аутентификация SQL Server. Тогда необходимо указать имя учетной записи (Username), которая будет участвовать в установлении соединения, а также пароль (Password) этой учетной записи. Мы рассмотрели вид окна Save DTS Package (см. рис. 11.25), который оно имеет, когда пакет сохраняется в базе данных SQL Server или в структурах службы метаданных SQL Server. При сохранении пакета в структурированном СОМфайле или в файле Visual Basic окно Save DTS Package будет иметь другие элементы управления. В частности, потребуется указать имя пакета, описание, а также имя файла, в котором будет сохранен пакет.
Завершение работы мастера После завершения настроек во всех предыдущих окнах работу мастера также можно считать законченной. Последнее окно мастера (рис. J1.26) содержит сводную информацию о свойствах пакета, определенных на предыдущих шагах. Нажатие кнопки Finish приведет к созданию пакета и, если определено, к его выполнению. Пакет может быть выполнен непосредственно после нажатия кнопки Finish, если в окне Save, schedule, and replicate package был установлен флажок Run immediately. Ход выполнения пакета отображается в окне Execution Package (рис. 11.27). Весь пакет разбивается на несколько этапов, которые выполняются отдельно. Каждый из таких этапов отображается отдельной строкой в окне Execution Package. На этом описание работы с мастером DTS Import/Export Wizard можно считать законченным. Следующий раздел будет посвящен рассмотрению возможностей DTS Designer, с помощью которого можно создавать пакеты DTS практически любой сложности.
375
Часть III. Администрирование
376 %DTS Impart/Export Wizard Completing the DTS Import/Export Wizard You have successfully specified the information required to copy, transform, or transfer the data. Review the selections below and click on FINISH to execute
Summary:
Source: Microsoft SQL Server Usn i g Microsoft OLE DB Provd i er for SQL Server Location: STORAGEVTRELON Database: pubs Destination: Microsoft SQL Server Usn i g Mc i rosoft OLE DB Provd i er for SQL Server Location: STORAGE Database: Bonus «J I < Back
Finish
Cancel
Рис. 11.26. Последнее окно мастера DTS Import/Export Wizard Executing Package J Microsoft SQL Server
J Microsoft SQL Server
Progress:
IIIIIIIIIIIIIIIIII S_tatus: Scrp itn ig compelted !S am eage Ste ap veN P ack Schedue l Package Copy SQL Server Obe jcts
I Status Compe l te Compe l te Scripting (100%)
iL Cancel
Рис. 11.27. Окно Execution Package
Инструмент DTS Designer Предыдущий раздел этого уровня был полностью посвящен рассмотрению работы с мастером DTS Import/Export Wizard. С помощью этого мастера можно выполнять копирование и трансформирование данных, а также копирование объектов баз данных SQL Server. Перечисленные задачи мастер решает весьма эффективно. Помимо этого, полученный после выполнения мастера пакет мож-
Глава 11. Доступ к гетерогенным источникам данных
377
но сконфигурировать для автоматического выполнения с помощью службы SQLServerAgent. Однако выполнять более сложные действия с помощью мастера невозможно. Когда мы описывали архитектуру DTS, были упомянуты отношения предшествования. Как видно, при работе с мастером эти объекты совсем не используются. Дело в том, что отношения предшествования применяются только при работе с двумя и более задачами. Однако мастер создает единственную задачу, поэтому нет смысла использовать отношения предшествования. Более того, при работе с мастером в распоряжении пользователей имеется всего две задачи. Однако механизмы DTS предоставляют пользователям более пятнадцати задач, предлагающих широкие возможности по управлению данными и объектами. Все упомянутое выше было сказано для того, чтобы лишний раз подчеркнуть: возможности мастера DTS Import/Export Wizard весьма ограничены. Создать пакет DTS, использующий возможности служб трансформации данных в полной мере можно с помощью DTS Designer. Этот простой в работе инструмент позволяет создавать пакеты практически любой сложности. Для запуска DTS Designer необходимо в панели Enterprise Manager выбрать нужный сервер и в контекстом меню папки Data Transformation Services выбрать команду New Package. В ответ откроется окно DTS Package: (рис. 11.28). PJi SQL Server Enterprise Manager - [&DTS Package; «Sew P '£] Console | Package
Window Edit
Help
Co_nneriion
Task
Workflow
j |Щ i
mв?i x ъas;««и >
:
^a
Connection
Task
JLJ Рис. 11.28. Окно DTS Package: внутри Enterprise Manager
378
Часть III. Администрирование
На рис. 11.28 приведено пустое окно, не содержащее ни одного источника данных, ни одной задачи. Большую его часть занимает пустое пространство, являющееся рабочей областью, в которой пользователь и будет конфигурировать пакет. Основной интерес для пользователя представляют две панели инструментов, расположенные в левой части окна. Первая из них называется Task и содержит список задач (task), поддерживаемых SQL Server 2000. Вторая панель называется Data и содержит список источников (datasource), с которыми может работать DTS Designer. Следующие разделы будут посвящены рассмотрению источников данных и задач, которыми может оперировать пользователь.
Источники данных В простейшем случае при работе с данными пользователь должен указать для них как минимум два источника, один из которых выступает в качестве импортера данных, а другой — в качестве экспортера. В более сложных пакетах может использоваться множество источников данных, обмен информацией между которыми будет выполняться с помощью множества различных преобразований.
Замечание Термин источник данных в этой ситуации применяется как в качестве импортера, так и в качестве экспортера. В дальнейшем, при описании практической работы, для экспортера будет использоваться термин "источник данных", тогда как для импортера — термин "получатель данных". Как было сказано в одном из разделов в начале главы, конфигурирование источников данных при работе с пакетами DTS осуществляется с помощью объектов Connection objects. В DTS Designer в распоряжении пользователя имеется множество шаблонных объектов, которые предназначены для установления соединения с распространенными источниками данных. Помимо этого, для установления соединения с менее распространенными системами можно воспользоваться объектами Microsoft Data Link и Other Connections. Чтобы сконфигурировать источник данных в пакете DTS, создаваемом с помощью DTS Designer, нужно воспользоваться панелью инструментов Data. Необходимо выбрать в панели кнопку нужного источника данных и перетащить ее в рабочую область. После того, как будет отпущена кнопка мыши, появится окно свойств источника данных, в котором потребуется указать специфические характеристики.
Замечание Поместить источник в рабочую область также можно с помощью двойного щелчка на обозначающей его кнопке. Напомним, что в основе работы механизмов DTS лежит технология OLE DB, позволяющая обращаться к источникам данных самых различных типов. Объек-
Глава 11. Доступ к гетерогенным источникам данных ты, имеющиеся на панели инструментов Data, являются отображением поставщиков OLE DB. То есть, тот или иной источник данных использует соответствующего поставщика OLE DB и имеет свойства, специфичные для этого поставщика. Замечание Источники данных, определенные в пакете, используются при конфигурировании задач копирования и преобразования данных. Поэтому, прежде чем начать конфигурирование этих задач, необходимо сначала определить и настроить источники данных.
На панели инструментов Data имеются следующие объекты: • Microsoft OLE DB Provider for SQL Server используется для обращения к серверам Microsoft SQL Server; •
Microsoft Access предназначен для доступа к файлам баз данных Access;
• Microsoft Excel 97-2000 позволяет обращаться к файлам электронных таблиц Microsoft Excel версий 97—2000; • dBase 5 применяется для работы с файлами СУБД dBase версии 5; П HTML File (Source) позволяет использовать в качестве источника данных (экспортера) файлы HTML; • Paradox 5.x предназначен для обращения к файлам СУБД Paradox 5.x; • Text File (Source) используется, когда требуется обратиться к текстовому файлу как к источнику данных (импортеру); • Text File (Destination) используется, когда требуется обратиться к текстовому файлу как к получателю данных (экспортеру); П Microsoft ODBC Driver for Oracle позволяет обращаться к СУБД Oracle; • Microsoft Data Link предназначен для конфигурирования произвольных источников данных, для чего применяются специальные файлы UDL, которые описывают, какой поставщик OLE DB должен использоваться и с какими параметрами. В принципе, доступ ко всем указанным ранее источникам данных может быть осуществлен с использованием Microsoft Data Link; • Other Connections используется, когда необходимо обратиться к источнику ODBC. Как видно, DTS Designer предоставляет пользователям возможность работы со множеством различных источников данных, не прибегая ни к каким дополнительным действиям (например, к установке драйверов). В большей своей части конфигурирование источников данных является интуитивно понятным, и поэтому мы не будем заострять на этом внимания.
Задачи Как мы уже говорили, задача DTS представляет собой компонент, позволяющий выполнять специализированные действия. Список задач, доступных пользовате-
379
380
Часть III. Администрирование
лям при работе с DTS Designer, представлен на панели инструментов Task. В распоряжении пользователя имеются следующие задачи: G File Transfer Protocol Task используется для выкачивания файлов с удаленных серверов и сайтов Web; П ActiveX Script Task позволяет выполнять преобразование данных с помощью скриптовых языков ActiveX; • Transform Data Task — стандартный механизм копирования данных между двумя источниками, предоставляющий возможность также выполнить и довольно сложные преобразования данных; • Execute Process Task позволяет выполнять стандартные приложения операционной системы, а также запускать пакетные файлы; П Execute SQL Task используется для выполнения пакетов команд Transact-SQL; • Data Driven Query Task предоставляет пользователю самый мощный механизм закачки и преобразования данных с возможностью выполнения подзапросов и установлением дополнительных соединений с источниками данных; П Copy SQL Server Objects Task предназначена для копирования объектов баз данных между двумя серверами SQL Server 2000 или SQL Server 7.0. Вместе с объектами можно выполнить и копирование данных, однако, их преобразование средствами рассматриваемой задачи невозможно; • Send Mail Task позволяет отправлять сообщения по электронной почте. Часто используется для извещения администратора (оператора) о результате (успешном или неудачном) выполнения пакета; П Bulk Insert Task служит для массивной закачки данных из текстовых файлов и обратно. Является аналогом утилиты bcp.exe; • Execute Package Task позволяет запускать пакеты DTS; • Message Queue Task предоставляет пользователям механизм обмена информацией между пакетами DTS; П Transfer Error Messages Task предназначена для переправления сообщений об ошибках, появляющихся в ходе выполнения пакета, на удаленный сервер SQL Server 2000; • Transfer Database Task позволяет выполнять копирование баз данных между серверами SQL Server; • Transfer Master Stored Procedures Task — с помощью этой задачи можно копировать хранимые процедуры, определенные для выполнения на множестве серверов. Используется для автоматизации администрирования SQL Server 2000. Более подробно автоматизация администрирования будет рассмотрена в следующей главе; • Transfer Jobs Task — эта задача, как и предыдущая, применяется при автоматизации администрирования и позволяет копировать задания с главного сервера на подчиненные серверы;
Глава 11. Доступ к гетерогенным источникам данных О Transfer Logins Task позволяет выполнять копирование учетных записей между серверами SQL Server; • Dynamic Properties Task предоставляет возможность управления свойствами пакета во время его выполнения. Если вы работали с SQL Server 7.0, то, наверное, заметили, что список задач в SQL Server 2000 был существенно расширен. В основном нововведения коснулись подсистемы автоматизации и расширения возможностей работы с серверами SQL Server. Замечание Задачи в списке перечислены в соответствии с их расположением в панели инструментов Task. Так, первая задача в списке соответствует самой верхней левой кнопке, вторая — верхней правой и т. д. Добавление задач в рабочую область конфигурирования пакета выполняется точно так же, как и добавление источника данных — перетащить кнопку нужной задачи в рабочую область или просто дважды щелкнуть на ней. В ответ откроется окно свойств задачи, в котором необходимо определить параметры ее выполнения. Конфигурирование задач, в отличие от конфигурирования источников данных, является довольно сложной проблемой. Следующие разделы будут посвящены подробному рассмотрению каждой из задач.
Задача File Transfer Protocol Task Окно свойств задачи File Transfer Protocol Task имеет вид, показанный на рис. 11.29. Окно имеет две вкладки — FTP Site и FTP Transformation. На первой указывается адрес источника данных, с которым будет работать задача, тогда как вторая вкладка используется для конфигурирования преобразования. Первая вкладка окна (рис. 11.29) имеет следующие элементы управления: • Description. В этом поле указывается имя, под которым задача будет идентифицироваться в пакете. Имя должно быть уникально в пределах пакета. • Source. Раскрывающийся список содержит перечень типов источников, которые могут использоваться для получения файла. В зависимости от того, какое значение выбрано в списке, будет изменяться набор элементов управления в расположенной ниже группе. Список содержит всего два значения: •
Internet Site — в этом случае задача будет устанавливать соединение с указанным сайтом и выкачивать файл с него. При этом окно будет иметь вид, приведенный на рис. 11.28. Ниже рассмотрены элементы управления для конфигурирования выкачивания файла с сайта;
•
Directory — файл будет скачиваться из каталога на диске. Этим каталогом также может быть ресурс локальной сети. При выборе в списке Source рассматриваемого значения в расположенной ниже группе будет иметься единственный элемент управления — Directory path, в котором следует выбрать каталог размещения необходимого файла.
381
Часть III. Администрирование
382 File Transfer Protocol Task Properties FTP Site | FTP Transformato in | $z\ File Transfer Protocol Task alows you to transfer files from an internet site ^-^/ or a directory to the desination directory you specified. Description: Source:
jFile Transfer Protocol Task: undefined |Internet Site
| FTP site: i Username: | Password: | Number of retries:
jflp.khakasnet.ru [anonymous
_^J
Г
Destination: i Directory path:
|G:\Docurnents and Setn igs\Adrnn isi(rator\My ... 1
OK
Cancel
Help
Рис. 11.29. Окно свойств задачи File Transfer Protocol Task
• FTP Site. В этом поле указывается адрес сайта в Интернете, с которого необходимо получить файлы. Помимо имени сайта также можно указать и каталог, в котором расположены нужные файлы. П Username. Если для соединения с указанным в предыдущем поле сайтом необходимо пройти аутентификацию, то в данном поле можно ввести имя пользователя, с правами которого предполагается устанавливать соединение. По умолчанию указано значение anonymous, т. е. соединение будет устанавливаться с гостевыми правами. П Password. Указывается пароль учетной записи, введенной в предыдущем поле. Для учетной записи anonymous ввод пароля обычно не требуется. П Number of retries. В этом поле можно указать количество попыток, которое задача будет пытаться соединиться с указанным сайтом. Если в течение этих попыток соединение не устанавливается, то задача заканчивается неудачно. • Directory path. Используется для указания каталога, в котором будут сохраняться файлы, скачанные с сайта (в списке Source установлено значение Internet Site) или из каталога (в списке Source выбран вариант Directory). Можно указать не только локальный каталог, но и сетевой ресурс. Когда все необходимые параметры на вкладке FTP Site будут указаны, можно переходить к вкладке FTP Transformation (рис. П.30). С ее помощью пользователь может выбрать конкретные файлы, которые необходимо скачать с выбранного сайта (или каталога). При переходе на вкладку FTP Transformation будет предпринята попытка установления соединения с указанным сайтом для получения списка файлов. Если установить соединения не удается (например, имя
Глава 11. Доступ к гетерогенным источникам данных
383
сайта введено неверно или соединение с Интернетом недоступно), то будет выдано соответствующее сообщение об ошибке. xj
File Transfer Protocol Task Properties FTP Site FTP Transformation Г • $ W Select '''es'° ' 3 e t r a n s 'sred from the source list and add them to the Чй>» destination list.
Source: Filename Attributes _B00... ZAKON Zip _B00... For-auL. Forjon.arj HTML-... pspbrw... • H i recens... reklam.... reklam.... sql_20... CQI Ca "I
iS«e Ш
Destination: Filename : Attributes 'Size pspbrw... 14400 recens... 12595 reklam.... 878087 sql_20... 47104
12595 400800 350227 12595 15233 876087 47104 int;^ JL
Refresh
jOvt OK
Cancel
Help
Рис. 11.30. Окно свойств Properties File Transfer Protocol Task, вкладка FTP Transformation
Основную часть вкладки FTP Transformation занимают два списка. С их помощью пользователь может указать файлы, которые должны быть выкачаны. В левой части окна расположен список Source, в котором выводятся файлы, найденные на указанном в предыдущей вкладке ресурсе (сайте или каталоге). Помимо собственно файлов также выводятся и подкаталоги. Пользователь может войти в произвольный подкаталог и выбрать для копирования любой из расположенных в нем файлов. Однако переход на каталог, находящийся выше указанного в поле FTP Site (или Directory Path), запрещен. Например, если необходимо скачать файл из каталога и в поле Directory Path указано значение C:\Windows\System32, то пользователь сможет выбрать для копирования любой из файлов, расположенных в каталоге C:\Windows\System32 или в любом из его подкаталогов любого уровня. Однако перейти на каталог C:\Windows (а тем более на С:\) в списке Source будет невозможно.
Замечание Если при переходе на вкладку FTP Transformation установить соединение с указанным ресурсом не удалось, то список Source будет пуст. Список Destination предназначен для указания файлов, которые должны быть выкачаны. По умолчанию этот список пуст. Пользователь должен копировать из списка Source в список Destination имена тех файлов, которые должны быть
384
Часть III. Администрирование
продублированы в ходе выполнения задачи. Для помещения имен файлов как в список Destination, так и для удаления из него, предназначены кнопки, расположенные в центральной части вкладки между списками. В ходе конфигурирования задачи список файлов на указанном ресурсе может измениться. Для обновления списка файлов достаточно нажать кнопку Refresh. Под списком Destination имеется флажок Overwrite, установив который можно разрешить перезапись файлов, уже имеющихся на диске, новыми версиями. Выбор этого флажка необходим, если предполагается многократное выполнение конфигурируемого пакета. То есть возможна ситуация, когда в каталоге, указанном в поле Directory Path группы Destination вкладки FTP Site, будут существовать все файлы, выбранные для копирования. В этом случае сохранить новые выкачанные файлы не удастся. Для решения данной проблемы и требуется установить флажок Overwrite. После того, как имена всех нужных файлов будут помещены в список Destination, конфигурирование задачи File Transfer Protocol Task можно считать оконченным. Теперь, при каждом выполнении пакета механизмы DTS будут устанавливать соединение с указанным ресурсом и выкачивать с него выбранные файлы.
Задача ActiveX Script Task Задача ActiveX Script Task предназначена для выполнения преобразований данных с использованием возможностей скриптовых языков ActiveX. По умолчанию в распоряжении пользователей имеются языки VBScript и JavaScript. С помощью рассматриваемой задачи можно: • выполнять преобразование данных, копируемых от источника к получателю; П создавать функции, которые будут контролировать протекание процесса выполнения пакета; • манипулировать объектами СОМ, предназначенными для обеспечения доступа к данным; П создавать и использовать объекты ADO (ActiveX Data Objects), такие так соединение, команды, наборы строк и другие объекты для доступа и манипулирования данными. Замечание Помимо двух указанных- языков, устанавливаемых вместе с SQL Server 2000, пользователи могут отдельно добавить компиляторы для дополнительных языков, например PerlScript.
Окно свойств задачи ActiveX Script Task имеет вид, подобный приведенному на рис. 11.31. Рассматриваемая задача содержит широчайшие возможности по преобразованию данных, предоставляя пользователям всю мощь скриптовых языков. Доступ к данным осуществляется с использованием функций и переменных DTS.
Глава 11. Доступ к гетерогенным источникам данных
385
-,- ActiveX Script Task Properties {Description: Language:
.',„,V „s „iu „„„, Л Func oitn Mani() ё End Func oitn
VB Sciipt Language Functions:
zl
And Array Asc Atn Call Case Case Else CBool TRute Entry function; |Main Language iP'omerj
Auto Gen. 1 Browse Parse ~~
Undo
i
Save. ™ ..
<\
i >r f~ LnOC .o b l
Рис. 1 1 . 3 1 . Окно свойств задачи ActiveX Script Task
Поле Description, расположенное в верхней части вкладки, предназначено для указания имени, по которому конфигурируемая задача будет идентифицироваться в пакете. Как уже было сказано, это имя должно быть уникальным в пределах пакета. Основную часть окна занимает поле, в котором пользователь должен указывать код на выбранном скриптовом языке. Код, предлагаемый по умолчанию, ничего не делает и лишь возвращает флаг успешного завершения работы задачи. (~
Замечание
)
Рассмотрение возможностей скриптовых языков ActiveX не входит в задачи этой книги. Данный материал настолько объемен, что достоин отдельного издания. Для получения информации об использовании языков VBScript и JavaScript следует обратиться к дополнительным источникам информации, например, к электронной документации MSDN (Microsoft Developer Network).
Как уже было сказано, код, описывающий преобразования данных, может быть введен на различных языках. Выбор языка, на котором будет писаться код, производится с помощью раскрывающегося списка Language. По умолчанию этот список содержит всего два значения — VB Script Language и JavaScript Language. При выборе в списке Language того или иного языка не выполняется преобразование уже указанного кода в формат нового языка. Поэтому, при последующей проверке синтаксиса будет выдано сообщение об ошибке. Тем не менее, для выбранного в списке Language языка сценариев можно сгенериро-
386
Часть III. Администрирование
вать код по умолчанию, который будет следовать синтаксису этого языка. В сгенерированный код пользователь может вносить необходимые дополнения. Тем не менее, можно ввести весь код вручную. На рис. 11.31 приведен код, генерируемый по умолчанию для языка VBScript. Для генерирования кода по умолчанию можно нажать кнопку Auto Gen. В левой части окна имеется список Functions, в котором перечислены все встроенные функции, доступные для языка, выбранного в списке Language. Этот список весьма объемен и рассмотрение его в данной книге заняло бы не один десяток страниц. Поэтому подробное рассмотрение функций и работы с ними оставляем для других изданий. В поле Entry function указывается имя функции, которая будет считаться точкой входа в указанный код. То есть выполнение задачи будет начинаться с выполнения функции, введенной в поле Entry function. По умолчанию в поле указывается значение Main. Соответственно, генерируемый по умолчанию код имеет единственную функцию, которая носит имя Main. Тем не менее, ничто не мешает пользователю написать дополнительные функции. Не трудно заметить, что элементы Language, Functions и Entry function расположены на вкладке Language. Помимо этой вкладки, имеется еще и вкладка Browser, которая содержит список констант и глобальных переменных, используемых при выполнении пакета и задачи в частности. Вид окна свойств задачи с выбранной вкладкой Browser приведен на рис. 11.32. -. ActiveX Script Task Properties Description:
:
[ActiveX Script Task: undefined
'•••• Jj3 DTSTran:' Visual Вasic ActiveX Script рй DTSTran:
] : ТДЭ DTSTran: H-JjS ActiveX Scrip : • Щ DTSTask : -Щ DTSTask В -!*• Steps Constant ; -У DTSStepExec i У DTSStepExec i I- У DTSStepExec ; I
'••••• У
: El
^
Function Main[) Main = DTSTaskExecResult_Success End Function
DTSStepExec
Global Variables :
Ф rrr
~
4|
j
Language
Browser |
Auto Gen. 1
Parse Undo
J>J~
Browse...
Ln 0. Col 0
Save.. OK
Cancel
Рис. 11.32. Окно свойств задачи ActiveX Script Task
Help
Глава 11. Доступ к гетерогенным источникам данных
387
Помимо того, что пользователь может вводить текст кода вручную, он также может подгрузить готовый код, сохраненный на диске. Для этого нужно воспользоваться кнопкой Browse. С другой стороны, введенный в окне код можно сохранить на диск для последующего применения или в качестве резервной копии. Для этого предназначена кнопка Save. В распоряжении пользователя также имеется кнопке Parse, с помощью которой можно выполнить синтаксический анализ введенного кода. В принципе, подобный анализ выполняется и при закрытии окна свойств задачи с помощью кнопки ОК. Однако удобно бывает выполнить подобный анализ и при написании кода. Нерассмотренной осталась только кнопка Undo. Она позволяет отменять одно или более последних действий, выполненных в окне свойств конфигурируемой задачи. Использование кнопок OK, Cancel и Help стандартно, и мы не будем лишний раз останавливаться на этом. После того, как в окне будет указан код, с помощью которого станет выполняться преобразование данных, конфигурирование задачи можно считать законченным. В принципе, из всех элементов управления, имеющихся в окне свойств задачи, можно было бы оставить только поле для ввода кода. Остальные же поля носят чисто вспомогательный характер, упрощая и ускоряя написание сценария. Тем не менее, профессиональные пользователи могут работать только с полем для ввода кода.
Задача Transform Data Task Рассматриваемая задача предназначена для выполнения копирования данных между двумя источниками данных. Один из этих источников выступает в качестве импортера данных, тогда как второй — в качестве экспортера. Таким образом, для работы задачи необходимо сначала определить два источника данных, воспользовавшись объектами панели инструментов Data, которые были рассмотрены в одном из предыдущих разделов. Задача изображается в пакете не отдельной кнопкой, как это было для двух описанных выше задач, а в виде линии, соединяющей два источника данных (рис. 11.33). Когда пользователь выбирает в панели инструментов Task значок задачи Transform Data Task, он должен будет сначала определить источник данных, который будет выступать в роли экспортера (source), а затем источник данных, который будет рассматриваться как импортер (destination). В принципе, как импортер, так и экспортер могут быть выбраны до момента нажатия кнопки задачи Transform Data Task в панели Task. Для этого необходимо в рабочей области пакета сначала выбрать источник данных, который будет рассматриваться как экспортер, а затем, удерживая нажатой кнопку клавиатуры , выбрать импортера данных. После нажатия кнопки задачи Transform Data Task между выбранными источниками данных будет установлена связь. Помимо использования панели Task, задача Transform Data Task может быть определена с помощью контекстного меню, если выбрано более одного источника данных. Окно свойств задачи Transform Data Task имеет вид, подобный приведенному на рис. 11.34. Как видно, оно имеет пять вкладок.
Часть III. Администрирование
388 й) SQL Server Enterprise Manager - [2:DTS Package: New Package Console Package
Window Edit
£ata
Help Task
Workflow
M E H e l Й1
Task
mm J
mm
Microsoft OLE
Qj &
DB
Microsoft OLE
DB
ЗиЛ
Copy SQL Server...
Рис. 11.33. Изображение в пакете задачи Transform Data Task Transform Oata Task Properties Source I Destination j Transformations j Lookups) Options] Enter a table name or the results of a query as a data source. J {Description:
j Transform Data Task: undefined
Connection:
Microsoft OLE DB Provider for SQL Server
• C Table /View:
Iffl
<*" SQL query: SELECT TOP 10 PERCENT". titles-title, id AS Expd titles title <.iS Expr2.titles, type AS ЕхргЗ, titles price A S Expr4. titles, royalty AS Expr5 FROM titles INNER titleauthor ON titles, title id ••• titleauthor.title_id WHERE AND priced ? 4| !
Paiameters...
:|
Preview..
Build Query...
Browse...
Parse Query
Cancel
Help
Рис. 11.34. Окно свойств задачи Transform Data Task
Глава 11. Доступ к гетерогенным источникам данных
389
Определение исходных данных Первая из вкладок носит название Source и предназначена для определения источника, из которого будут получаться данные для копирования. Помимо элементов конфигурирования собственно источника, на вкладке имеется поле Description, в котором необходимо указать имя, присваиваемое создаваемой задаче. Напомним, что это имя должно быть уникально в пределах текущего пакета. В поле Connection отображается имя объекта источника данных, который был выбран в качестве экспортера данных при конфигурировании задачи Transfonn Data Task. Как видно, сменить источник данных после создания задачи невозможно. Ниже на вкладке расположен переключатель, с помощью которого можно указать, будут ли данные браться из таблицы или получаться с помощью запроса. При установке переключателя в положение Table/View в расположенном правее раскрывающемся списке пользователь должен будет задать имя таблицы или представления на выбранном источнике данных. Все данные, содержащиеся в указанной таблице или представлении, будут включены в процесс копирования. Нажав кнопку Preview, с помощью окна View Data (рис. П.35) можно просмотреть, какие данные содержатся в выбранной таблице или представлении, т. е. подлежащие копированию. Однако следует учесть, что выводятся только первые 200 строк.
Source: titlejd I8U1032 BU1111 BU2075 В U 7832 МС2222 МС3021 MC302G РС1035 РС3888 РСЭЭ99 1|
Query (up to first 200 lines] I title
The Busy Execu... Cooking with Co... You Can Combat... Straight Talk Ab... Silicon Valley Ga... The Gourmet Mi... The Psychology... But Is It User Fri... Secrets of Silico... Net Etiquette
I pubjd 1389 1389 0736 1389 0877 0877 0877 1389 1389 1389
I type business business business business mod_cook mod_cook UNDECIDED popular_comp popular_cornp popiJar_comp
1
| •*•
•1 OK
Help
Рис. 11.35. Окно View Data
Если необходимо получить данные на основе выполнения запроса, то нужно установить переключатель в положение SQL query. В этом случае станет доступным поле в центральной части вкладки, предназначенное для указания запроса, на основе которого будет подготавливаться набор данных для копирования. Более того, также становятся доступными кнопки Build Query, Browse и Parse Query- После того, как будет набран какой-нибудь текст в поле для ввода кода, станет доступной также и кнопка Parameters.
Часть III. Администрирование
390
Пользователь может ввести код в поле несколькими способами: • написать его вручную, в том числе и скопировав из буфера обмена; О подгрузить готовый код из файла, воспользовавшись кнопкой Browse; П создать код с помощью построителя запросов Query Builder. Первые два способа особого интереса не представляют. Написание запросов SELECT, предназначенных для выборки данных, будет рассмотрено в главе 29. Интерес же представляет использование инструмента Query Builder. Построитель запросов Query Builder Для запуска Query Builder необходимо нажать кнопку Build Query. В ответ откроется окно Data Transformation Services Query Designer (рис. 11.36). •: Data Transformation Services Query Designer Ln i ked server:
В I j* (All Cou l mns) 5 tttejd V'title V type 1 Ipubjd
STORAGE p[pubs].[dbo].[aulhors] ijj] [pubs].[dbo]. [discounts] Щ] [pubs].[dbo].[dtpropeities] jfjj] [pubs].[dbo].[employee] P[pubs].[dbo].[iobs] ip[pubs].[dbol.[Liliya] § f [pubs).[dbo]. [M S pubjdenti j§p[pubs].[dbo].[pub_info] j}][pubs].[dbo].[publishersl Щ] [pubs].[dbo].[roysched] P[pubs].[dbo].[sales] §][pub4[dbo].[stores] Щ] [pubs].[dbo].[sysarticleupdc Щ [pubs].[dbo]. [sysschemaart p[pubs].[dbo].[titleaUhoi] ppub4[dbo].pes] Щ1 [pubs].[dbo].[sysarticles] Щ [pubs].[dbo].[syscolumns] ^ 1 [pubs].[dbo). [syscomrnents' ^ 1 [pubs).[dbo].[sysdepends] Д [pubs].[dbo].[sysfilegroups]
Coulmn titlejd title type SELECT FROM
J 1
;*' (All Cou lmns) :aujd ilifejd ;au_ord jroyafcyper
I Output 1 Sort Type Exprl Expr2 ЕхргЗ
[Sort Order [Criteria
titles titles titles
*, titles.titlejd AS Exprl, titles.title AS Expr2, titles.type AS ЕхргЗ, titles.price AS Expr4, titles.royalty i *) titles INNER"JOIN titleauthor ON titles.title id = titleauthoi.title id
title id
_•_ PS3333 BU1032 BU2075
Ie tyipp esychoo Proo l nged Data D l gy |pu0b7jd 36 The Busy Executvie busn i ess 1389 You Can Combat d busn i ess 0736
fiefresh List
I2000 advance ^.
19,99 19,99 2,99
5000 10125
Cancel
Help
Рис. 11.36. Окно Data Transformation Services Query Designer
Все окно разделено на отдельные области (рапе), каждая из которых имеет свое назначение: П Table/View Pane. Эта область расположена в левой части окна и содержит список таблиц, представлений и функций, имеющихся в источнике данных, выбранном в качестве экспортера при определении задачи Transform Data
Глава 11. Доступ к гетерогенным источникам данных Task. Для включения таблицы или представления в создаваемый запрос необходимо перетащить ее из рассматриваемой области в область Diagram Pane. •
Diagram Pane. В данной области, расположенной в верхней части окна, указываются все таблицы, представления и функции, которые предполагается использовать для построения запроса. С помощью этой области можно разрешить или запретить включать те или иные столбцы с результат выборки, определить связь между столбцами таблицы, указать порядок сортировки, а также выполнить некоторые другие действия. Каждая таблица или представление отображается в виде самостоятельного объекта, имеющего список столбцов, определенных в соответствующей таблице или представлении. Установка флажка слева от имени столбца приведет к включению этого столбца в результат выборки (включение в раздел SELECT). В контекстном меню столбца можно выбрать тип сортировки. Если выбрать команду Sort Ascending, то результат выборки будет отсортирован по возрастанию по соответствующему столбцу. Команда Sort Descending приводит к сортировке по убыванию. Определение упорядочивания по столбцу влечет за собой включение имени соответствующего столбца в раздел ORDER BY создаваемого запроса. Помимо всего прочего, можно определить отношения между столбцами двух таблиц. Для создания такого отношения необходимо нажать левую кнопку мыши на имени столбца и, не отпуская кнопки мыши, переместить курсор к имени столбца, с которым необходимо установить отношение. Отношения между таблицами определяются с помощью раздела JOIN. Изменения, выполняемые в области Diagram Pane, немедленно отображаются в областях Grid Pane и SQL Pane.
•
Grid Pane. Данная область является второй сверху, расположенной непосредственно под областью Diagram Pane. Область Grid Pane позволяет выполнять частично те же задачи, что и предыдущая область, только в другой форме. Тем не менее, включить таблицу или представление в создаваемый запрос можно только с помощью области Diagram Pane. Для включения столбца в запрос при работе с областью Diagram Pane необходимо было установить флажок слева от его имени, тогда как при работе с областью Grid Pane имя нужного столбца должно быть выбрано в столбце Column. Элемент этого столбца представляет собой раскрывающийся список, в котором перечислены имена столбцов всех таблиц, имеющихся в области Diagram Pane. Выбрав имя столбца в указанном раскрывающемся списке, вы тем самым включаете его в запрос. Однако при этом еще не ясно, какую роль станет играть столбец — будет просто включен в результат выборки, будет служить критерием сортировки или использоваться для указания условия с целью ограничения диапазона строк, которые включаются в результат выборки. В колонке Alias можно указать псевдоним, который станет использоваться для соответствующего столбца в результате выборки. Таким образом, с помощью псевдонима можно выполнять изменение имени столбца. В колонке Table указывается имя таблицы, к которой принадлежит столбец. Хотя при выборе имени столбца в колонке Column имя столбца приводится с указанием имени таблицы, впоследствии в колонке Column выводится только имя собственно
391
392
Часть III. Администрирование
столбца, тогда как имя таблицы отображается в колонке Table. В колонке Output имеется флажок, установка которого позволяет включить соответствующий столбец в результат выборки. Данное действие аналогично установке флажка слева от имени столбца при работе с областью Diagram Pane. Напомним, что это приводит к включению имени соответствующего столбца в раздел SELECT создаваемого запроса. С помощью колонки Sort Type можно выбрать тип сортировки, если предполагается использовать соответствующий столбец для определения критерия сортировки. В распоряжении пользователя имеется всего два значения — Ascending и Descending. При конфигурировании сортировки, помимо выбора ее типа, необходимо также задать очередность сортировки по выбранному столбцу. Очередность сортировки опреде., ляется в колонке Sort Order. Если конфигурируемый столбец должен использоваться для ограничения количества строк, которые необходимо включить в результат выборки, то для этого можно, воспользоваться колонкой Criteria. В ней необходимо указать условие, с которым будет сравниваться значение соответствующего столбца каждой строки. Если это условие выполняется, то строка будет участвовать в дальнейших операциях выборки. В противном случае она исключается и далее нигде не фигурирует. Можно указать более одного условия, воспользовавшись колонками Ог. Однако следует учитывать, что условия, вводимые в отдельные колонки, объединяются с помощью оператора OR. Таким образом, строка будет включена в результат выборки, если выполняется условие хотя бы в одной колонке. Для создания условий, использующих оператор AND, необходимо определить единственную колонку и во вводимом в ней значении указывать оператор AND. •
SQL Pane. Рассматриваемая область содержит текст запроса, созданного с помощью описанных выше областей. Внесение изменений в любую из двух предыдущих областей немедленно отображается на коде, указанном в области SQL Pane. Например, определение порядка сортировки приводит к формированию или изменению раздела ORDER BY, тогда как указание или изменение условий выборки приводит к созданию или модификации раздела WHERE. Помимо использования двух предыдущих разделов, создание запроса можно выполнять и вручную. То есть пользователь может написать текст запроса непосредственно в области SQL Pane. (
Замечание
^
Подробное написание запроса S E L E C T будет рассмотрено в главе 29.
О Results Pane. В этой области можно просмотреть результат выборки, возвращаемый после выполнения запроса. Таким образом, с помощью рассматриваемой области пользователь может сразу же увидеть, как те или иные изменения, выполняемые в трех описанных выше областях, отразятся на результате выборки. Данные, отображаемые в области Results Pane, будут рассматриваться как исходные данные при выполнении задачи Transform Data Task. Мы перечислили все области окна Data Transformation Services Query Designer, существующие для работы. Однако не все эти области могут быть доступны од-
Глава 11. Доступ к гетерогенным источникам данных
393
новременно. Непосредственно после открытия окна в распоряжении пользователя будут лишь области Table/View Pane, Diagram Pane и SQL Pane. Остальные же две области будут скрыты. Дело в том, что пользователь может скрывать или показывать произвольные области, освобождая место в окне для более удобной работы. Для этого предназначены кнопки левой части панели инструментов. Самая левая кнопка управляет областью Table/View Pane, вторая слева — областью Diagram Pane и т. д. Дополнительные свойства запроса Мы рассмотрели работу непосредственно с областями. Однако при построении запроса можно также сконфигурировать дополнительные свойства, позволяющие управлять некоторыми специфическими параметрами выполнения запроса. Для управления этими параметрами используется окно Properties (рис. 11.37), открыть которое можно с помощью контекстного меню любой из областей (кроме Table/View Pane), выбрав в нем команду Properties. Properties Query Parameters | Query name; | QUERY 1 r Options | f? Output all cou l mns Г
j
•: • Г
P
WITHGUgE
f" W П
DISTINCT values
j 10
3ROUP.B t ter« Г
JPERC BNTj
Г
. . : IP
'•.VIjH TIE 5
SQL. Comment: 11
Close
Help
Рис. 11.37. Окнао Properties, вкладка Query
Окно Properties имеет две вкладки, первая из которых, Query, и приведена на рис. 11.37. Она содержит следующие элементы управления: • Query name. В этом поле указывается имя запроса. При вызове построителя запросов из задачи, значение в этом поле доступно только в режиме чтения и особой роли не играет. Дело в том, что построение запросов требуется не только при конфигурировании задачи Transform Data Task, но и при выполнении множества других задач. Поэтому был разработан единый интерфейс, который содержит и поле Query name. Однако при работе с задачей Transform Data Task имя запроса не играет никакой роли.
394
Часть III. Администрирование
П Output all columns. При установке данного флажка в разделе SELECT создаваемого запроса будет указан символ *, что приведет к включению в результат выборки всех столбцов всех таблиц, включенных в область Diagram Pane. • DISTINCT values. Установка этого флажка приведет к тому, что в раздел SELECT создаваемого запроса будет добавлено ключевое слово DISTINCT, ЧТО приведет к тому, что в результате выборки будут удалены все дублирующиеся строки. Таким образом можно обеспечить уникальность строк в результате выборки. П GROUP BY extension. Флажок будет доступен только в том случае, если запрос строится с помощью группировки. При установке флажка GROUP BY extension при выполнении группировки станут использоваться дополнительные возможности, управлять которыми можно через перечисленные ниже элементы управления: • WITH CUBE — в раздел GROUP BY будет добавлено WITH CUBE, ЧТО позволяет включать в результат выборки итог по группам. Если используются функции агрегирования, таким образом, будет выполнено суперагрегирование; • WITH ROLLUP — в раздел GROUP BY будет добавлено WITH ROLLUP, ЧТО также позволяет выполнять суперагрегирование данных; • ALL — при использовании этого параметра в результат выборки будут включены все группы, независимо от того, соответствуют ли связанные с ними данные включенным в разделе WHERE условиям выборки. В строках, которые не соответствуют условиям выборки, во всех столбцах кроме тех, по которым выполняется группировка, будут выведены значения NULL. Замечание Подробно выполнение группировки, а также использование дополнительных возможностей группировки, будут рассмотрены в главе 29 при описании запроса S E L E C T . В этой же главе будет рассмотрено использование ключевых слов ТОР, . PERCENT И WITH T I E S .
О ТОР. Выбор флажка позволяет ограничить количество строк, включаемых в результат выборки. После его установки является доступным текстовое поле, в котором необходимо указать целое число, определяющее количество строк, включаемых в результат выборки. • REPCENT — при установке этого флажка количество строк, попадающих в результат выборки, будет задаваться в процентах от общего количества строк. Таким образом, значение в поле ТОР ДОЛЖНО находиться в пределах от 0 до 100; • WITH TIES — отметка этого флажка предписывает включить в результат выборки дополнительные строки, имеющие то же значение в столбцах, указанных в разделе ORDER BY, ЧТО И последняя строка. Это достигается добавлением ключевого слова WITH TIES В формируемый запрос.
Глава 11. Доступ к гетерогенным источникам данных
395
G SQL Comment. В этом поле вводится комментарий, поясняющий суть действий, выполняемых запросом. В принципе, в это поле может быть помещена любая информация, например, об авторе запроса и дате создания запроса. Текст из поля SQL Comment помещается Source окна Transform Data Task Properties (см. рис. 11.34) в начале запроса в виде комментария. На этом рассмотрение вкладки Query окна свойств запроса Properties можно считать оконченным. Следующая вкладка окна называется Parameters (рис. 11.38) и предназначена для управления параметризированными запросами. Параметризированные запросы Параметризированный запрос позволяет пользователю вводить значение одного из параметров, используемых в запросе, не во время создания запроса, а во время выполнения пакета DTS. Например, вы можете написать задачу, которая будет копировать с удаленного источника данные об авторах, проживающих в определенном штате. Но вы не хотите исправлять пакет каждый раз, когда необходимо получить данные об авторах нового штата. Решением проблемы будет использование параметризированного запроса. В качестве условия добавляется не конкретное выражение, а параметр. При запуске задачи пользователю будет выдано окно для ввода значения параметра. _J
Properties Query Parameters Prefix characters: | @| Suffix characters: Escape character: \
Exampe l s using prefix and suffix characters: %parameter name% ©parameter name Exampe l s using ' V escape character: %my\%pararneter% @my\@parameter
Close
Help
Рис. 11.38. Окно Properties, вкладка Parameters
Вкладка Parameters предназначена для задания символов, которые будут определять начало и конец параметра, а также для назначения символа исключения. Все эти параметры конфигурируются с помощью трех текстовых полей, в которых должен быть указан единственный символ:
396
Часть III. Администрирование
• Prefix characters. Указывается символ, который будет определять начало параметра. По умолчанию никакой символ не определен и использование параметризированных запросов не поддерживается. Предлагается использовать символы % или @. П Suffix characters. Вводится символ, который будет определять конец параметра. Можно указать тот же символ, что и для начала параметра, хотя допускается использование и различных значений. • Escape character. Символы, приведенные в двух предыдущих полях, становятся зарезервированными и не могут использоваться в запросе непосредственно, т. к. любая их последовательность после символа префикса будет восприниматься как имя параметра. Однако, иногда бывает необходимо использовать символы, определяющие параметр, как самостоятельные. В этом случае нужно после символа префикса указать так называемый символ перехода (Escape-символ). В рассматриваемом поле задается символ, который будет восприниматься механизмами DTS в качестве символа перехода. Предлагается использовать символ \. Мы рассмотрели назначение всех элементов управления на вкладке Parameters. Чаще всего для ограничения имени параметра служит символ % (как для начала, так и для конца параметра). Однако также можно использовать и символы [ и ] или { и }. Замечание При работе с задачей Transform Data Task использование параметризированных запросов в том виде, в котором с ними работает построитель запросов, не поддерживается. Тем не менее, построение параметризированных запросов возможно с помощью глобальных переменных пакета, значения которых могут изменяться в ходе выполнения пакета.
На этом работа с окном свойств создаваемого запроса заканчивается. После того, как будет введен и весь код запроса, то окно Data Transformation Services Query Designer построителя запросов можно закрыть. Код, указанный в области SQL Pane, будет скопирован на вкладку Source окна Transform Data Task Properties (см. рис. 11.34). Помимо собственно кода, также может быть добавлен и комментарий, указанный в поле SQL Comment в окне свойств запроса Properties на вкладке Query (см. рис. 11.37). Замечание Указанный на вкладке Source код можно проверить на корректность синтаксиса, нажав кнопку Parse Query.
Как мы уже говорили, при работе с задачей Transform Data Task допускается применение параметризированных запросов. Однако для этой задачи значения параметров могут быть получены только из глобальных переменных пакета DTS, в котором определена задача. Для включения параметра в запрос достаточно указать символ ? в том месте, куда должно быть подставлено значение параметра. Обычно значение параметра подставляется в раздел WHERE, Т. е. параметр
Глава 11. Доступ к гетерогенным источникам данных
397
используется для создания динамически определяемого условия. Например, на вкладке Source можно указать следующий запрос: SELECT * FROM authors WHERE (state = ?)
Как видно, значение параметра будет определять штат, в котором проживают интересующие авторы. В одном запросе допускается указание множества параметров. Параметры задачи Transform Data Task не имеют имен, но нумеруются, начиная с 1. Указав в запросе символ ?, мы тем самым требуем подстановки в соответствующее место запроса значения параметра. Однако необходимо определить, откуда будут браться необходимые значения. Для связывания параметров с глобальными переменными пакета служит окно Parameter Mapping (рис. 11.39), открыть которое можно с помощью кнопки Parameters вкладки Source. Однако, это окно не появится, если в запросе не указано ни одного параметра. Parameter Mapping Input Parameters 1 You can map global variables to input parameters. Parameter Mapping: . Input Global Variables
Deate Global Variables.. OK
Cancel
Help
Рис. 11.39. Окно Parameter Mapping
Как видно, основную часть окна занимает таблица, с помощью которой и определяется соответствие параметров и глобальных переменных. Имена всех параметров, (точнее их номера), используемых в запросе, указываются в столбце Parameters, тогда как имя соответствующей глобальной переменной, с которой будет связываться параметр, выбирается в столбце Input Global Variables, поле которого представляет собой раскрывающийся список, содержащий имена всех глобальных переменных, определенных в пакете. Если нужная переменная еще не существует, то ее можно создать с помощью окна Global Variables (рис. П.40),
Часть III. Администрирование
398
открыть которое можно с помощью кнопки Create Global Variables, находящейся в нижней части окна Parameter Mapping. Global Variables Add, edit, or delete global variables from the DTS package. You can access these variables from any script in the DTS package. Variables: Name rrr Var1 iForm
••••
T!y p e S n r i g n IStn trig
1 :EA Va ule 93 'T рапеция'
• 1
OK
New
Delete
Cancel
Help
Рис. 11.40. Окно Global Variables
Окно Global Variables содержит список всех глобальных переменных, определенных в пакете. В этом же окне можно просмотреть значения, присвоенные переменным по умолчанию. В ходе выполнения эти значения могут изменяться. Для этого могут использоваться различные механизмы, например, такие как задача ActiveX Script Task или задача Dynamic Properties Task. Для создания новой переменной с помощью окна Global Variables необходимо в самой нижней пустой строке в столбце Name ввести имя, которое будет присвоено переменной. В столбце Туре этой же строки выбирается тип данных, который будет иметь создаваемая переменная. В распоряжении пользователя имеется множество различных типов данных, большая часть которых не является типами данных Transact-SQL. В столбце Value пользователь может установить значение, которое будет присваиваться создаваемой переменной сразу же после запуска пакета. Впоследствии значение этой переменной может изменяться. Однако при следующем запуске пакета переменная снова будет иметь значение, указанное в столбце Value. Как только новая переменная будет создана, необходимо в окне Parameter Mapping выбрать ее имя в столбце Input Global Variables для соответствующего параметра. После того, как будет установлена связь всех параметров с необходимыми глобальными переменными, конфигурирование запроса можно считать законченным.
Глава 11. Доступ к гетерогенным источникам данных
399
В целом мы рассмотрели использование вкладки Source окна свойств задачи Transform Data Task. Теперь же можно переходить к рассмотрению следующей вкладки. Определение получателя данных Вторая вкладка окна свойств задачи Transform Data Task называется Destination (рис. 11.41) и, как следует из названия, предназначена для определения получателя данных. Transform Data Task Properties Source Destination | Transformations | Lookups j Options] •J
Store the results for this transformation.
Connection: Table name: Name titlejd title type pubjd price advance royalty ytd_sales notes pubdate
Microsoft OLE DB Provider for SQL Server 2 Create..
IN liability iSize ! Precision Scale • о H80I varchar 12 char char H 4 money Ш Й money jgj int Ш int V) 200 varchar datetirne
IType
OK
Cancel
Help
Рис. 1 1 . 4 1 . Окно Transform Data Task Properties, вкладка Destination
В поле Connection указывается имя источника данных, сконфигурированного в пакете и рассматриваемого в пределах текущей задачи в качестве импортера данных. Весь набор данных, подготовленный на вкладке Source, будет скопирован в указанную на вкладке Destination таблицу. Имя этой таблицы выбирается в раскрывающемся списке Table name, который содержит имена всех таблиц, имеющихся на указанном источнике данных. Центральную часть вкладки занимает область, в которой перечисляются все столбцы, имеющиеся в таблице, выбранной в раскрывающемся списке Table name. Для каждого столбца отображается его имя, тип данных, возможность хранения значений NULL, размер и точность (для нецелочисленных типов данных). С помощью этой информации можно увидеть, соответствует ли формат данных, подготовленных для копирования с помощью вкладки Source, структуре таблицы, в которую их предполагается закачать. В принципе, точного совпадения типов не требуется, если между типом данных источника и получателя допускается явное или неявное преобразование. В частности, если исходные 14 Зак. 83
Часть III. Администрирование
400
данные имеют тип данных smalidatetime, то вполне допустимо, чтобы соответствующий столбец таблицы получателя имел тип данных datetime. Более того, также допускается, например, помещение данных типа i n t в столбец с типом ДаННЫХ c h a r ( 1 0 ) .
Таким образом, указывая тип данных, отличный от исходного, с помощью задачи Transform Data Task можно выполнить простое преобразование данных. Однако выполнение более сложных операций, требующих использования функций или значений из нескольких столбцов, невозможно без использования скриптовых языков. Ранее было сказано, что таблица, в которую будут закачиваться данные, выбирается с помощью раскрывающегося списка Table name. Но помимо выбора уже существующей таблицы, пользователь также может создать новую. Для этого достаточно нажать кнопку Create справа от списка Table name. В ответ откроется окно Create Destination Table (рис. 11.42) с указанием кода команды CREATE TABLE, с помощью которого и будет выполняться создание новой таблицы.
Замечание Окно Create Destination Table может применяться для получения информации о формате исходных данных. То есть можно просто просмотреть, какие названия столбцов и типы данных предлагается использовать, а затем нажать кнопку Cancel. При этом новая таблица создана не будет. Create Destination Tame SQL statement: CREATE TABLE [NewTable]! [title id] varchar 6 • J. 1 [title] varchar |80: NOT MULL. [type] char i12i NOT NULL, [pubjd] char [4] MULL, [price] money HULL. [advance] money NULL. [loyalty] int NULL. [ytd_sales] in! Nl ILL , r ^ l '1
оэг^Цаг .
ОПГК M M '
. OK
Cancel
Hep l
Р и с . 1 1 . 4 2 . Окно C r e a t e Destination Table
Структура новой таблицы, точнее код, предлагаемый в окне по умолчанию, формируется на основе формата данных, подготовленных с помощью вкладки Source. Таким образом, количество столбцов, их порядок, название, тип данных и другие свойства полностью соответствуют аналогичным параметрам исходных данных. Тем не менее, пользователь может вносить в приведенный код любые исправления, изменяя тем самым структуру создаваемой таблицы.
Замечание Подробно создание таблиц, а также синтаксис команды C R E A T E с м о т р е н ы в главе 22.
T A B L E будут рас-
Глава 11. Доступ к гетерогенным источникам данных
401
На этом рассмотрение вкладки Destination, которая используется для выбора таблицы, в которую будут закачиваться данные, можно считать оконченным. Можно переходить к рассмотрению следующей вкладки. Конфигурирование преобразования данных В предыдущих разделах были рассмотрены две вкладки окна свойств задачи Transform Data Task, с помощью которых выбирается источник и получатель данных. Следующая, третья вкладка окна свойств называется Transformations (рис. 11.43) и предназначена для определения того, как должен происходить процесс копирования данных. Пользователь должен определить, какой столбец исходного набора данных в какой столбец выбранной таблицы получателя будет копироваться. Более того, в процессе копирования можно использовать сценарии скриптовых языков ActiveX, что позволяет выполнять в ходе дублирования довольно сложные преобразования данных. 2SJ
Transform Data Task Properties Source] Destination Transformations | Lookups) Options) £!
Define the transformations between the source and destination.
D T S T ransf orm.6 ation_
.Name: Type:
New Source
titlejd title type pubjd pri adcve ance royalty ytd_sales notes ni |ЬНд|-р
Edit
z\ JDee l te |
lest
Destination
_^_
^ title, jd
± .
title type p u b .j d price a d v . mce roya t y y t d _ sales
__
note s т
Select All
Delete All
Cancel
Help
Рис. 11.43. Окно Transform Data Task Properties, вкладка Transformations
В верхней части вкладки имеется раскрывающийся список Name, в котором выбирается имя преобразования, с которым предполагается работать. В SQL Server 7.0 можно было работать с единственным набором преобразований. В SQL Server 2000 для задачи Transform Data Task разрешается последовательное выполнение множества преобразований. Таким образом, если предполагается скопировать данные несколько раз между двумя таблицами с использованием различных преобразований, то все это можно сделать в пределах одной задачи, а не создавать множество, как это было в SQL Server 7.0.
402
Часть III. Администрирование
В списке Source, размещенном в левой части вкладки, указываются имена всех столбцов исходного набора данных, подготовленного с помощью вкладки Source. Список Destination содержит перечень столбцов таблицы, выбранной на вкладке Destination в качестве получателя данных. Связь между исходным столбцом и столбцом-получателем задается в виде соединительной линии. По умолчанию выполняется копирование всех столбцов исходного набора данных во все столбцы таблицы получателя, т. е. первый столбец исходных данных связывается с первым столбцом таблицы получателя, второй — со вторым и т. д. Замечание Количество столбцов, их название и типы данных в списках Source и Destination могут не совпадать. Тем не менее, по умолчанию все же выстраивается связь первого столбца списка Source с первым столбцом списка Destination, второго — со вторым и т. д. Если количество столбцов неодинаково, то лишние столбцы остаются несвязанными и в процесс копирования не включаются.
Таким образом, количество преобразований в задаче можно подсчитать по количеству соединительных линий между списками Source и Destination на вкладке Transformations. По умолчанию для каждой пары связываемых столбцов создается отдельное преобразование, для которого указывается имя DTSTransformation_N, где вместо символа N подставляет номер преобразования. Преобразование включает в себя описание соответствия копирования столбцов исходного набора данных в столбцы таблицы получателя. При этом необходимо явно указать связь между каждой парой столбцов. Преобразования, созданные по умолчанию, работают с одним столбцом исходного набора данных и с одним столбцом таблицы получателя. Однако пользователь может создать новые преобразования, которые будут работать с несколькими столбцами. Преобразования при выполнении задачи производятся последовательно, а не одновременно. Таким образом, сначала осуществляется копирование данных между столбцами, определенными в первом преобразовании, затем во втором, третьем и т. д. Для удаления имеющегося преобразования достаточно выбрать соответствующую связь и нажать кнопку Delete вкладки или клавишу . Выделенное преобразование будет удалено, а приоритет преобразований, выполняемых после данной операции, увеличится на единицу. Если вы не хотите использовать преобразования, предлагаемые по умолчанию, то все их можно удалить и создать новые. Создание нового преобразования выполняется с помощью кнопки New. Предварительно в списках Source и Destination можно выбрать имена столбцов, которые будут включены в преобразование, хотя это можно сделать и позже. После нажатия кнопки New будет открыто окно Create New Transformation (рис. 11.44), в котором необходимо выбрать тип создаваемого преобразования. По умолчанию в этом окне выведен список всех типов преобразований, поддерживаемых DTS. Однако задача Transfer Data Task может работать только с двумя из них — ActiveX Script и Copy Column. Установка флажка Only show valid transformations
Глава 11. Доступ к гетерогенным источникам данных
Specify the transformation you want to apply to the source and destination columns. Г" lOnly show
(iattons
предписывает отображать в окне только допустимые типы преобразований. Таким образом, после выбора этого флажка в окне останутся только два указанных типа преобразования. После указания нужного типа преобразования будет открыто окно Transformation Options, с помощью которого и выполняется конфигурирование создаваемого преобразования. Как видно, окно имеет три вкладки. Первая из них назвается General (рис. 11.45) и содержит общие сведения о создаваемом преобразовании.
ActiveX ScriDt Copy Column DateTirne String Lowercase String Middle of String Read File Trim String Uppercase String Write File
OK
403
Cancel
Help Рис. 11.44. Окно Create New Transformation
Transformation Options General | Source Columns | Destination Columns | View and modify general information about the transformation and its properties.
Type: Sequence:
11
Fjroperties... Transformation Description: Copy the contents of the source data unchangedtothe destination.
I OK
Cancel
Help
Рис. 11.45. Окно Transformation Options, вкладка General
В поле Name пользователь может ввести имя, которое будет присвоено создаваемому преобразованию. По умолчанию предлагается имя в формате DTSTrans format ion N. Тем не менее, пользователь может ввести любое другое
Часть III. Администрирование
404
имя, соблюдая при этом уникальность имен преобразований в пределах задачи. В поле Туре отображается тип преобразования, который был выбран в окне Create New Transformation. Значение в этом поле доступно только в режиме чтения и не может быть изменено. Если тип преобразования был выбран неверно, то необходимо будет начать операцию создания преобразования заново. В поле Sequence указывается шаг, на котором будет выполнено создаваемое преобразование. Можно сказать, что значение в данном поле определяет, каким по счету будет выполнено создаваемое отображение. Значение в поле Sequence также доступно только для чтения и не может изменяться пользователем. Таким образом, каждое новое создаваемое преобразование будет выполняться после завершения всех созданных ранее преобразований. Если необходимо выполнить копирование данных на одном из более ранних этапов, то можно внести соответствующие изменения в преобразования с нужным значением в поле Sequence. На этом рассмотрение вкладки General пока закончим и обратимся к рассмотрению двух других вкладок окна. Вкладка Source Columns (рис. 11.46) предназначена для формирования списка исходных столбцов, которые будут обрабатываться в создаваемом преобразовании. Transformation Options General Source Cou l mns | Destination Cou l mns | Select the source cou l mns you wart to use in the transformation.
See l cted coulmns advance pubdate type notes
Available cou l mns title id title"
type pub_id price
advance royalty ytd_sales notes pubdate msrepl_tran_ version Expri Expr2 Expr4 Expr5
2l\
2l\
OK
Cancel
Hep l
Рис. 11.46. Окно Transformation Options, вкладка Source Columns
Глава 11. Доступ к гетерогенным источникам данных
405
Вкладка Source Columns содержит два списка: • Available columns. Отображается перечень всех столбцов, имеющихся в исходном наборе данных, который был сконфигурирован с помощью вкладки Source окна Transform Data Task Properties (см. рис. 11.34). G Selected columns. В этот список пользователь должен скопировать из предыдущего списка имена всех столбцов, которые предполагается использовать в конфигурируемом преобразовании. В данный список по умолчанию включаются имена всех столбцов, которые были выбраны в списке Source вкладки Transformations (см. рис. 11.43) при нажатии кнопки New. Кнопки в центральной части окна предназначены для дублирования новых и удаления существующих имен столбцов в список Selected columns. После того, как будут указаны имена всех интересующих столбцов исходного набора данных, можно переходить к следующей вкладке. Последняя вкладка окна Transformation Options имеет имя Destination Columns (рис. 11.47) и служит для управления столбцами, в которые будут вставляться копируемые данные. Transformation Options General) Source Cou l mns Destination Cou l mns j Select the destination table cou l mns you want to use in the transformation. Selected cou l mns
Available cou l mns title_id title type pubjd price advance
advance pubjd royalty
royalty
ytd_sales notes
OK
Cancel
Рис. 11.47. Окно Transformation Options, вкладка Destination Columns
406
Часть III. Администрирование
Нетрудно заметить, что вкладка Destination Columns очень напоминает вкладку Source Columns. Действительно, как и вкладка Source Columns, вкладка Destination Columns включает два списка — Available columns и Selected columns. Первый из этих списков содержит перечень всех столбцов таблицы, выбранной для закачки данных на вкладке Destination окна свойств задачи Transform Data Task Properties (см. рис. 11.41). В списке Selected columns пользователь перечисляет все столбцы, в которые будет выполняться закачка данных в ходе выполнения преобразования. Если при создании преобразования был выбран тип Сору Column, то количество выбранных столбцов в списках Selected columns на вкладках Source Columns и Destination Columns окна Transformation Options должно быть одинаковым, хотя имена и типы данных столбцов могут и не совпадать. При использовании типа преобразования ActiveX Script количество столбцов может быть различным. После того, как список исходных столбцов и столбцов получателей будет сформирован, можно переходить к собственно указанию путей перетекания и определению преобразования данных. ВыColumn Order полнение этой операции заметно Column Order отличается при использовании различных типов преобразования. Для открытия окна конфигурирования ЕхргЗ собственно преобразования преднаnotes значена кнопка Properties вкладки type General окна Transformation Options pubdate (см. рис. 11.45). На рис. 11.48 привеadvance дено окно Column Order, которое служит для конфигурирования преобразований типа Copy Column. Окно Column Order содержит лишь таблицу Columns, с помощью котоOK Help Cancel рой пользователь должен указать соответствие столбцов исходного Рис. 11.48. Окно Column Order набора данных и столбцов таблицы получателя при копировании. В колонке Source по умолчанию перечислены имена всех столбцов, указанных в списке Selected columns на вкладке Source Columns. Элемент колонки Source представляет собой раскрывающийся список, который содержит имена всех столбцов, указанных в списке Selected columns на вкладке Source Columns. Каждый столбец приводится один раз. Тем не менее, пользователь может выбрать любой из исходных столбцов несколько раз. Кроме того, в раскрывающемся списке можно выбрать значение . Если указан этот пункт, то в соответствующем столбце таблицы получателя (имя которого указано в колонке Destination) будет сохранено либо значение NULL, либо (если определено) значение по умолчанию. Причем приоритет отдается значению по умолчанию. Если значение по умолчанию не определено и столбец таблицы получателя не разрешает хранение значений NULL, TO при установленном в колонке Source значении попытка выполнения пакета завершится неудачно. Cou l mns: Source
Destination (22^3 royalty pubjd advance
Глава 11. Доступ к гетерогенным источникам данных
407
В колонке Destination отображается имя столбца таблицы получателя, в которую будут копироваться данные из соответствующего столбца исходного набора данных. Элемент колонки Destination представляет собой раскрывающийся список, который содержит имена всех столбцов, указанных в списке Selected columns на вкладке Destination Columns. Как и в списке колонки Source, в списке колонки Destination существует значение . Так же, как и при установке подобного пункта в списке Source, это приведет к тому, что данные из соответствующего столбца таблицы источника не будут скопированы. После определения всех сопоставлений создание преобразования можно считать оконченным. Как видно, конфигурирование преобразований типа Copy Column выполняется довольно просто. Гораздо сложнее осуществляется конфигурирование преобразований типа ActiveX Script. После нажатия кнопки Properties на вкладке General окна Transformation Options (см. рис. 11.45) откроется окно ActiveX Script Transformation Properties (рис. 11.49), где пользователь должен будет ввести сценарий на одном из установленных скриптовых языков ActiveX, который и будет выполнять преобразование данных.
„|D|;
НИ Л} Ш! 1-ДИ I flWI ffffiff i l ^ y f f » : ^ ! $$ Create a new transformation script 01 view and modify an existing script. <
Щ _anguage:
[uncto i ns: A bd s A An ray Asc Atn Cal Case Case Esle CBool CByte C Curate CD CDbl Chr Cn lt CLng
1
tin Scrp it zl ' Vsiual Basci Transformao 1 Copy each source coulmn to the destn i ato i n cou lr Funco tinDT M a n i ( J SDesn tiao tin("advance") = DTSSource Mani = DTSTranso frmSa t_ tOK End Funco tin
£ntry function: [Main Language ) Browser ] Auto Gen. Parse
Undo
Browse. Save. lest...
— 1 •Г1 ! Lnacoio Cancel Hep l
Рис. 11.49. Окно ActiveX Script Transformation Properties
Часть III. Администрирование
408
Как видно, это окно весьма напоминает окно свойств задачи ActiveX Script Task (см. рис. 11.31), хотя их размеры несколько и отличаются. Мы не будем подробно рассматривать работу с окном ActiveX Script Transformation Properties, т. к. все элементы управления и принципы работы с этим окном были описаны при рассмотрении задачи ActiveX Script Task. Однако заметим, что на вкладке Browser (рис. 11.50) добавлены дополнительные элементы (Source Columns, Destination Columns и Lookups), с помощью которых можно легко обратиться как к исходным данным, так и к столбцам таблицы получателя, а также к результату, возвращаемому после выполнения внешних запросов (lookups). Внешние запросы конфигурируются с помощью вкладки Lookups окна свойств задачи Transform Data Task, которая будет рассмотрена в одном из следующих разделов этой главы. ".; ActiveX Script Transformation Properties Create a new transformation script or view and modfiy an existing script.
Tasks Constant §] Data Pump Constant jO Data Driven Query Con SI ActiveX Script Constan Steps Constant У DTSStepExecStat_Cor У DTSStepExecStatJnai У DTSStepExecStatJnP: У DTSStepExecStat_Wa Global Variables % rrr - Ф Var1 •••^> Form Source Columns *«• advance Destination Columns «•• advance ' Lookups -fir" ssd
iL Language Browser Auto Gen. Browse. Save. Parse Test... Undo
Visual Basc i Transformato i n Scrp it Copy each source coulmn to the destn i ato i n cou lr uncto i n Man i [) DTSDestn i ato i n("advance") = DTSSource Man i = DTSTransformStat_OK !nd Functo in
Ln 0, Col 0 OK
Cancel
Help
Рис. 11.50. Окно ActiveX Script Transformation Properties, вкладка Browser
Между окнами свойств задачи ActiveX Script Task и ActiveX Script Transformation имеется еще одно различие — последнее содержит кнопку Test, предназначенную для проверки работы конфигурируемого преобразования. После нажатия этой кнопки открывается окно Testing Transformation (рис. И.51), в котором
!
:
Глава 11. Доступ к гетерогенным источникам данных
409
отображается ход выполнения преобразования. Если преобразование удается выполнить успешно, то пользователь получает соответствующее сообщение. В противном случае будет выдано сообщение об ошибке. Testing Transformation The transformation is executed with a temporary text file as the destination. The destination you selected in the transformation is not affected.
• I Microsoft SQL Server
Text File
Execution progress: I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I Execution status: iStep
! Status Complete (2)
View Results..
Help
Рис. 1 1 . 5 1 . Окно Testing Transformation
Помимо получения информации об успешном или неудачном выполнении преобразования, пользователь также может просмотреть сведения о данных, закачиваемых в выбранные столбцы таблицы получателя. Для этого достаточно нажать кнопку View Results в окне Testing Transformation. В ответ откроется окно View Data (рис. 11.52), в котором будет приведено состояние данных после выполнения преобразования.
Source: G:\D0CUME~TWDMINI~1 \LOCALS~1Vremp\E,tmp.txt (up to first 200 business business business rnod_cook mod_cook UNDECIDED popular_comp popular_comp popular_comp psychology
d
Help Рис. 11.52. Окно View Data
410
Часть III. Администрирование
В данном окне пользователь может посмотреть, действительно ли данные преобразованы к тому виду, что он хотел. Если в сценарии были допущены логические ошибки, то хотя преобразование и будет выполнено успешно, результат окажется логически неверным. Протестировать ход выполнения преобразования можно и непосредственно со вкладки Transformations (см. рис. 11.43), нажав кнопку Test. Указанным способом осуществляется проверка выполнения не только преобразований типа ActiveX Script, но и преобразований типа Copy Column. На этом рассмотрение определения преобразований данных при копировании можно считать оконченным. В принципе, можно также закончить и конфигурирование всей задачи Transform Data Task, не обращаясь к двум оставшимся нерассмотренными вкладкам — Lookups и Options. Значения, установленные на данных вкладках по умолчанию, вполне устраивают множество пользователей. Именно так и рекомендуется поступать в большинстве случаев. Тем не менее, в некоторых ситуациях все же требуется обращение к указанным вкладкам для использования дополнительных возможностей. Представленные далее разделы будут посвящены рассмотрению работы со вкладками Lookups и Options.
Внешние запросы Предыдущие разделы были посвящены рассмотрению трех первых вкладок окна свойств задачи Transform Data Task. Как уже было сказано, в большинстве случае для конфигурирования задачи достаточно использовать только эти три вкладки. Однако, при выполнении преобразований типа ActiveX Script для реализации некоторых действий может понадобиться обращение к данным источника и получателя помимо тех, что выбраны на вкладках Source и Destination. Это можно выполнить с помощью механизма внешних запросов, также называемых запросами поиска (lookup queries). Данные запросы могут быть использованы для выполнения хранимых процедур, команд SELECT, UPDATE, INSERT И
DELETE. Таким образом, пользователь может создавать задачи, которые будут не просто выполнять копирование данных (пусть даже с выполнением преобразований), но и попутно корректировать информацию в других таблицах, вставляя, удаляя или изменяя в них данные. Внешние запросы также могут быть использованы для получения дополнительных данных, которые должны быть вставлены в столбцы получателя. При этом в качестве исходной информации может использоваться один столбец, а с помощью внешнего запроса можно получить данные еще для нескольких столбцов, которые и будут закачаны в таблицу получателя. Кроме того, полученные в результате выполнения внешнего запроса данные могут быть использованы для контроля хода выполнения сценария ActiveX. Выполнение внешних запросов осуществляется с установления отдельного соединения к источнику данных. Запуск внешних запросов и доступ к возвращаемым ими данным осуществляется из сценария ActiveX. При конфигурировании внешнего запроса пользователь должен указать код запроса, его имя, выбрать имя соединения, сконфигурированного в пакете, а также указать количество строк, которое будет кэшировано. Управление всеми перечисленными парамет-
Глава 11. Доступ к гетерогенным источникам данных
411
рами выполняется с помощью вкладки Lookups (рис. 11.53) окна свойств задачи Transform Data Task. Transform Data Task Properties Source ] Destination Transformations Lookups Options Lookups can be used by transformations like an ActiveX transform to return a value from a separate connection. Lookups: Name ssd
I Connection
! Cache
:
Query
Microsoft OLE DB Provider... 0
Add OK
Cancel
Delete
Help
Рис. 11.53. Окно Transform Data Task Properties, вкладка Lookups
На вкладке имеется всего одна таблица Lookups, с помощью которой и конфигурируются внешние запросы. По умолчанию не определено ни одного запроса. Для создания нового запроса достаточно нажать кнопку Add или просто внести изменения в пустую строку таблицы. В колонке Name необходимо указать имя, присваиваемое создаваемому внешнему запросу. В колонке Connection необходимо выбрать имя одного из источников данных, определенных в пакете. В контексте этого источника данных и будет выполняться указанный запрос. Отдельно обратим внимание на то, что внешний запрос может обращаться не только к источникам данных, указанных при создании задачи Transform Data Task, но и к любым другим. Замечание В принципе, используя внешние запросы и соответствующим образом написав сценарий ActiveX, можно обработать данные вовсе не из источника, указанного на вкладке Source. Более того, данные можно закачивать в иной источник данных, чем который указан на вкладке Destination. В колонке Cache указывается количество строк, которое должно быть сохранено для работы. Информация из других строк теряется. По умолчанию установлено значение 0, что приведет к сохранению всех строк, возвращенных после выполнения внешнего запроса.
412
Часть III. Администрирование
Собственно код запроса формируется с помощью построителя, который вызывается кнопкой Щ , расположенной в колонке Query в строке соответствующего внешнего запроса. После нажатия указанной кнопки откроется окно построителя запроса, подобного приведенному на рис. 11.36. В разд. "Построитель запросов Query Builder" была подробно рассмотрена работа с построителем запросов, поэтому здесь мы не будем лишний раз останавливаться на этом. Отменим однако, что опытные пользователи могут указать код запроса непосредственно в области SQL Pane, не прибегая к помощи областей Diagram Pane и Grid Pane. При создании внешних запросов следует учитывать, что они также могут быть и параметризированными. Синтаксис параметризированных запросов и их применение были рассмотрены в разд. "Параметризированные запросы" ранее в этой главе. Здесь же напомним, что параметр определяется символом ?. После того, как код внешнего запроса будет указан или построен, к нему можно будет обращаться из сценария ActiveX при конфигурировании преобразования типа ActiveX Script. На вкладке Browser окна ActiveX Script Transformation Properties (см. рис. 11.50) в папку Lookups будут добавлены имена всех внешних запросов, определенных на вкладке Lookups окна свойств задачи Transform Data Task (см. рис. 11.53). Для примера приведем код ActiveX, позволяющий поместить в столбец au_fname таблицы получателя данных результат выполнения внешнего параметризированного запроса GenNewName, в качестве параметра которого используется глобальная переменная NumAuth: DTSDestination("au_fname DTSLookups("GenNewName
") = ").Execute(NumAuth)
Указанный код должен быть набран в поле для ввода сценария окна ActiveX Script Transformation Properties. В приведенном примере использовался единственный параметр, значение которого подставлялось из глобальной переменной. Тем не менее, допускается применение множества параметров, значения которых могут, например, браться из исходного набора данных с помощью команды DTSSource (). Последовательность указания значений параметра должна соответствовать последовательности использования параметров в запросе. При этом пользователь должен следить за соответствием типа данных, ожидаемого запросом, и типа передаваемого значения. На этом рассмотрение конфигурирования внешних запросов можно считать законченным. К сожалению, из-за ограничений объема в данной книге нет возможности рассмотреть все объекты DTS, а также их свойства и методы. Тем не менее, для профессионального программирования преобразований типа ActiveX так же, как и для профессиональной работы с задачей ActiveX Script Task и программирования механизмов DTS в целом необходимо знание объектов, их свойств и методов. Для получения подробной информации следует обратиться к дополнительным источникам информации, например, Books Online или MSDN.
Управление свойствами задачи Данный раздел будет посвящен рассмотрению последней, пятой вкладки окна Transform Data Task Properties, имеющей название Options (рис. 11.54). Она со-
Глава 11. Доступ к гетерогенным источникам данных
413
держит набор элементов, которые позволяют управлять самыми различными параметрами выполнения задачи. Transform Data Task Properties Source] Destination] Transformations] Lookups Options Г t-xuepuun me [ Name:
ICAerror.txt
i г File type ; ! j F 7.0 format I•, Г Error tent " | Г Source error fqas ' Г . .
rite rorrnat"~ ДОЛР delimiter:
|{CR}{LF} j j
Column delimiter:
(Vertical Batj^J j
Text qualifier:
]<none>
i|
_^J j
Data movement
First row: L.ast row:
Май error count: Fetch buffer size: rSQL Server | P Use fast load Г Keep NULL values W Check constraints I- Г" Table lock
Г" Enable identity insert Г" Always commit final batch Jnsert batch size: JO
OK
Cancel
Help
Рис. 11.54. Окно Transform Data Task Properties, вкладка Options
Группа параметров Exception file предназначена для настройки свойств файла исключения, в котором будет отображаться информация об ошибках, встреченных в ходе выполнения задачи. В распоряжении пользователя имеются следующие элементы управления: • Name. В этом поле указывается имя файла исключения, а также его положение на диске. Имя может быть указано вручную или интерактивно с помощью окна Browse, открыть которое можно с помощью кнопки ^J, расположенной справа от поля Name. Файл исключения может быть расположен только на локальном или на подключенном сетевом диске. • File type. С помощью данной группы параметров пользователь может определить тип файла исключения. Группа содержит перечисленные ниже флажки: •
7.0 format — установка флажка предписывает генерировать файл исключения в формате SQL Server 7.0. Это позволяет использовать анализаторы (parsers) ошибок, написанные для предыдущей версии. При установке рассматриваемого флажка три других флажка группы File type становятся недоступными.
• Error text — когда этот флажок установлен, то в файле исключения будет сохраняться информация обо всех ошибках, встреченных в ходе выполнения задачи. Эта информация включает имя пакета, имя задачи, время на-
414
Часть III. Администрирование чала и завершения этапов и другие сведения. Таким образом, файл исключений может быть использован в качестве журнала, позволяющего восстановить ход выполнения задачи.
•
Source error rows — если необходимо сохранить данные о всех строках исходного набора данных, которые не удалось скопировать в таблицу получателя, то можно сохранить эти строки в отдельный файл. Для этого необходимо отметить рассматриваемый флажок. При выполнении задачи будет создан отдельный файл, в который и станут помещаться строки исходного набора данных, во время копирования которых произошел сбой. Имя создаваемого файла соответствует имени файла, указанного в поле Name, однако он будет иметь расширение Source.
•
Dest error rows — этот флажок устанавливается, если необходимо сохранить строки, которые не удалось поместить в таблицу получателя. Так же, как и при выборе предыдущего флажка, в рассматриваемом случае будет создан отдельный файл с расширением Dest, где и будут сохранены строки, которые не удалось вставить. При использовании преобразований типа Copy Column строки в файлах Source и Dest будут совпадать. Однако, если применяется преобразование типа ActiveX Script, то различия между строками этих файлов могут быть весьма значительными. Замечание Файлы Source и Dest могут быть впоследствии использованы для ручной вставки не скопированных данных или для других целей.
О File format. Данная группа содержит элементы управления, с помощью которых контролируется внутренний формат файлов исключения. Эти параметры действуют не только на сам файл исключения, но и на файлы Source и Dest. Рассмотрим элементы управления. •
Row delimiter — раскрывающийся список предназначен для выбора символа (или символов), которые будут вставляться в конце каждой строки файлов исключения. По умолчанию в списке выбраны символы возврата строки и перевода каретки — значение {CR}{LF}. Эти символы могут использоваться и по отдельности. Помимо указанных символов можно использовать точку с запятой (Semicolon), запятую (Comma), символ табуляции (Tab), вертикальную полосу (Vertical Bar) или любой другой произвольный символ. Разрешается также не использовать никакого символа (<попе>).
•
Column delimiter — в этом раскрывающемся списке выбирается символ, который будет использоваться для разделения данных различных столбцов. Можно либо выбрать символ из списка, либо ввести произвольный. По умолчанию для разделения столбцов предлагается использовать вертикальную полосу (Vertical Bar).
• Text qualifier — с помощью данного раскрывающегося списка можно выбрать символ, который будет применяться для ограничения текстовых
Глава 11. Доступ к гетерогенным источникам данных строк при записи их в файл исключения. По умолчанию в списке выбрано значение <попе>, и текст в ограничители не заключается. Помимо этого значения в списке содержатся также варианты Double Quote {"} и Single Quote {'}, что, соответственно, означает двойные и одинарные кавычки. Помимо значений, указанных в списке, можно задать любой произвольный символ. Мы рассмотрели элементы управления, имеющиеся в группе Exception file и предназначенные для управления сохранением информации об ошибках, произошедших во время выполнения задачи. Следующая группа элементов управления называется Data movement и предназначена для управления общим ходом копирования строк. В распоряжении пользователя имеются элементы управления: П Max error count. В этом поле указывается максимальное количество ошибок, которое считается допустимым при выполнении задачи. Копирование строк осуществляется не отдельно, а пакетами, которые в принципе могут содержать и по одной строке. Если при копировании строк пакета при вставке хоть одной строки встречается ошибка, то вставка всего пакета отменяется, а счетчик ошибок увеличивается на единицу. В файлы исключения добавляются соответствующие записи. В момент запуска задачи счетчик ошибок равен 0. Когда счетчик ошибок превышает значение, указанное в поле Max error count, выполнение задачи прерывается и считается законченным неудачно (Failed). По умолчанию в поле установлено значение 0, что приводит в прерыванию работы задачи при встрече первой же ошибки. • Fetch buffer size. В данном поле указывается, какое количество строк будет входить в пакет и обрабатываться за одну операцию. По умолчанию установлено значение 1, и в большинстве случаев изменять его не нужно. • First row. По умолчанию выборка данных из источника начинается с первой строки. Однако выборка может быть начата с произвольной строки. Это используется, например, для разделения всего процесса копирования на несколько этапов, выполняемых отдельно. В рассматриваемом поле указывается номер первой строки, с которой должна быть начата выборка данных. • Last row. В данном поле задается номер строки, которая должна быть скопирована последней. По умолчанию указывается значение 0, и будут скопированы все строки, начиная с указанной в поле First row и заканчивая последней. Группа параметров SQL Server предназначена для управления параметрами, специфичными для источников данных SQL Server. При использовании источников данных, отличных от SQL Server, элементы управления данной группы будут недоступны. Рассмотрим назначение параметров, имеющихся в группе: П Use fast load. Установка этого флажка предписывает применять при выполнении задачи высокоскоростные механизмы массивной закачки данных. Однако использование этих механизмов доступно только при выборе поставщика OLE DB Provider for SQL Server. Если рассматриваемый флажок сброшен, то все перечисленные ниже элементы управления будут недоступны. • Keep NULL values. Если в столбце таблицы получателя определено значение по умолчанию, то при попытке вставки в нее значения NULL В нем будет со-
415
416
Часть III, Администрирование хранено значение по умолчанию, даже если в данном столбце и разрешено хранение значений NULL. Однако, в некоторых случаях необходимо обеспечить копирование и значений NULL. В этом случае необходимо установить рассматриваемый флажок. По умолчанию значения NULL будут заменяться значениями по умолчанию. Если значение по умолчанию не определено и разрешено хранение NULL, ТО В столбце будет сохранено значение NULL. ЕСЛИ же и хранение значений NULL запрещено, то при попытке вставки в столбец пустого значения (NULL) будет выдано сообщение об ошибке.
•
Check constraints. Если в таблице получателя определены ограничения целостности, то по умолчанию все вставляемые данные проверяются на соответствие этим ограничениям целостности. Если добавляемая строка не удовлетворяет установленным ограничениям целостности, то ее вставка отменяется и генерируется ошибка. Проверку на соответствие ограничениям целостности можно отменить, если сбросить флажок Check constraints. Это поможет увеличить скорость вставки данных в таблицу получателя, но может привести к тому, что в ней будут содержаться данные, не соответствующие определенным для таблицы ограничениям целостности. Тем не менее, проверка данных на соответствие ограничениям целостности может быть выполнена позже с помощью команд проверки целостности базы данных DBCC (DataBase Console Commands или DataBase Consistency Check).
•
Table lock. Выбор этого флажка требует установки на время выполнения задачи, точнее на время вставки данных в таблицу получателя, блокировки на уровне таблицы. По умолчанию используются блокировки на уровне строк, что требует заметно большего объема ресурсов. Для повышения производительности копирования данных можно применять блокировки на уровне таблицы. Однако, в этом случае таблица получателя окажется недоступной для выполнения других операций. То есть пользователи, желающие получить доступ к таблице, должны будут ожидать завершения выполнения задачи, даже если они хотят обратиться всего к одной строке, с которой задача может вовсе не работать.
•
Enable identity insert. При вставке строк в таблицу с определенным столбцомсчетчиком (свойством IDENTITY) значения для столбца-счетчика будут генерироваться сервером автоматически, а исходные данные будут игнорироваться. Таким образом, значения в столбцах-счетчиках источника и получателя данных, скорее всего, будут различаться. Однако, в некоторых случаях необходимо обеспечить точное совпадение значений на источнике и получателе. Для разрешения вставки явных значений в столбец счетчика на получателе необходимо установить флажок Enable identity insert. По умолчанию данный флажок не сброшен.
П Always commit final batch. Если флажок установлен, то механизмы DTS будут выполнять фиксирование всех строк пакета, которые были обработаны до встречи ошибки. В противном случае будет выполнен откат всех строк, вставленных в ходе выполнения пакета, в котором произошла ошибка. Фиксирование строк полезно, когда выполняются пакеты большого размера, и
Глава 11. Доступ к гетерогенным источникам данных повторное копирование строк является накладным. По умолчанию флажок Always commit final batch сброшен. О Insert batch size. С помощью этого поля указывается количество строк, которое будет обрабатываться при выполнении одного пакета. Если введено значение 0, которое также установлено по умолчанию, то все строки будут вставлены за одну операцию. Если вставка одной из строк заканчивается неудачно, то добавление всех строк пакета откатывается. Дело в том, что вставка строк осуществляется в виде транзакции. Каждый из пакетов выполняется как отдельная транзакция. Если вставка одной из строк не удается, то вся транзакция откатывается. Пользователь может установить размер пакета равным 1. В этом случае не будут вставлены только те строки, добавление которых не удается по тем или иным причинам. Все остальные строки будут размещены. Вставка всех строк за одну транзакцию (в поле Insert batch size установлено значение 0) выполняется быстрее, однако установка размера пакета равным 1 гарантирует добавление всех корректных строк. На этом рассмотрение вкладки Options можно считать оконченным. Задание тех или иных значений зависит от конкретных ситуаций. Приведенной информации достаточно для принятия решения о том, какое значение должно быть установлено для того или иного параметра. На этом также заканчивается рассмотрение конфигурирования задачи Transform Data Task.
Задача Execute Process Task С помощью рассматриваемой задачи в ходе выполнения пакета можно запустить любое приложение Windows, такое, например, как MS Word или MS Access. Однако чаще всего задача Execute Process Task используется для запуска приложений, выполняющих дополнительную обработку данных. Нередко эти приложения разрабатываются программистами компаний. Кроме того, задача может служить для запуска архиваторов, сжимающих текстовые файлы, в которые с помощью механизмов массивного копирования была закачана информация из баз данных. Закачка данных может быть выполнена также в ходе работы пакета. Сжатые файлы могут быть отправлены по электронной почте определенной задачей пакета. Таким образом, в ходе выполнения одного пакета можно выкачать данные из баз данных в текстовый файл, заархивировать его и отправить по электронной почте в офисы компании. Таким образом, например, можно реализовать автоматическую ежедневную рассылку прайс-листов менеджерам офисов. Конфигурирование задачи Execute Process Task выполняется несравненно легче, чем управление задачей Transform Data Task. Окно свойств рассматриваемой задачи (рис. 11.55) содержит всего несколько полей: • Description. В этом поле указывается имя, по которому будет выполняться идентификация задачи. Имя задачи должно быть уникально в пределах пакета. П Win32 process. В данном поле пользователь должен указать командную строку, которая будет выполняться каждый раз при запуске задачи. Фактически
417
Часть III. Администрирование
418
необходимо задать имя исполняемого файла (com, exe, bat), а также полный путь к нему. Эту информацию можно ввести либо вручную, либо выбрать нужный файл в окне Select File, открыть которое можно с помощью кнопки -„, [, расположенной справа от рассматриваемого поля. Execute Process Task Properties General Run any Win32 executable (".exe] or batch file as part of the DTS Package. You can also provide command line arguments and a time out period. Description: Win32 process: Parameters: Return code: T irneout:
Execute Process Task: C:\DN\DN.COM C:\DN\DN.COM
Cancel
Help,
Рис. 11.55. Окно Execute Process Task Properties
П Parameters. Если приложение должно быть запущено со специфическими параметрами, то их можно указать в этом поле. • Return code. Каждое приложение при завершении своей работы возвращает специальный код, по которому можно судить об успешности выполнения приложения. В зависимости от того, удачно ли было завершено приложение, будет зависеть, успешно ли завершится конфигурируемая задача Execute Process Task. Обычно код 0 свидетельствует о нормальном завершении приложения. Тем не менее, в некоторых приложениях этому может соответствовать совсем другой код. В рассматриваемом поле указывается значение, при возвращении которого приложением будет считаться, что оно выполнилось успешно. При возврате иного кода считается, что приложение завершилось с ошибкой и, как следствие, задача Execute Process Task считается выполненной неудачно. П Timeout. С помощью этого поля можно указать количество секунд, в течение которого будет ожидаться завершение работы запущенного приложения. Если в указанный срок приложение не завершит работу, то будет считаться, что задача Execute Process Task выполнена неудачно. При указании значения О (по умолчанию) время ожидания завершения приложения не ограничивается. В этом случае выполнение пакета останавливается до завершения соответствующего приложения. П Terminate process after timeout. Флажок становится доступным при указании в поле Timeout ненулевого значения. Если флажок установлен, то по истечении указанного периода ожидания система будет принудительно закрывать
Глава 11. Доступ к гетерогенным источникам данных соответствующее приложение. Это необходимо, если пакет выполняется автоматически и требуется обеспечить продолжительную работу сервера. Если флажок не установлен и приложение не закрывается самостоятельно, то по прошествии некоторого времени может оказаться, что на сервере будет запущено множество копий приложения. Это может привести к нехватке оперативной памяти и высокой загрузке центрального процессора, что отрицательно отразится на работе SQL Server 2000. Мы рассмотрели назначение и использование всех элементов управления, имеющихся в окне свойств задачи. В большинстве случаев достаточно указать имя задачи и имя приложения, которое необходимо выполнить. Конфигурирование остальных параметров обычно не требуется, т. к. значения по умолчанию являются вполне удовлетворительными. На этом рассмотрение конфигурирования задачи Execute Process Task можно считать оконченным.
Задача Execute SQL Task Задача Execute SQL Task служит для выполнения пакетов команд Transact-SQL, которые могут включать команды выборки, вставки, изменения или удаления данных, выполнения хранимых процедур, команды создания, удаления или модификации таблиц база данных и т. д. Помимо этого, с помощью рассматриваемой задачи можно присвоить значения глобальным переменным выполняемого пакета. При этом в качестве присваивомого значения может выступать набор данных, возвращаемый в результате выполнения запроса SELECT. При конфигурировании задачи Execute SQL Task пользователь должен в окне свойств задачи (рис. 11.56) сконфигурировать следующие элементы управления: • Description. В поле указывается имя задачи, которое должно быть уникальным в пределах пакета. • Existing connection. В данном раскрывающемся списке пользователь обязан выбрать имя одного из источников данных, сконфигурированных в пакете. В контексте выбранного источника данных и будут выполняться указанные команды. • Command time-out. Если время выполнения запроса необходимо ограничить, то это можно сделать с помощью рассматриваемого поля, указав в нем количество секунд, в течение которых будет ожидаться завершение выполнения запроса. Если за указанный период времени запрос не завершится естественным путем", то его выполнение прервется принудительно и будет считаться, что задача завершилась неудачно. При указании значения 0 (по умолчанию) время выполнения запроса на уровне задачи не ограничивается. Тем не менее, время выполнения может быть ограничено на уровне сервера. G SQL statement. В поле указывается собственно код запроса, который необходимо выполнить. Код может быть введен в поле непосредственно, подгружен из файла или создан с помощью Query Builder. Если вы хотите использовать готовый код, то необходимо нажать кнопку Browse и указать файл, содержа-
419
Часть III. Администрирование
420
щий запрос. При этом файл может находиться как на локальном, так и на сетевом диске. Для запуска Query Builder, предназначенного для визуального построения запросов, требуется нажать кнопку Build Query. В ответ откроется окно, подобное приведенному на рис. 11.36. Подробно использование построителя запросов было рассмотрено в разд. "Построитель запросов Query Builder" ранее в этой главе. В процессе конфигурирования задачи можно выполнить проверку правильности синтаксиса кода, указанного в поле SQL statement. Для этого достаточно нажать кнопку Parse Query. Execute SQL Task Properties General You can run SQL code on the selected connection. You must select a connection and then provide the SQL code to execute. Description: Existing connection: Command Jime-out: SQL statement: declare @int1
(Execute SQL Task: undefined JMicrosoft OLE DB Provider tor SQL Ser • j
integer IS-ж: NOT 1 <> (select value from !;v«
±1 where config » 102;
begin exec @int1 ••••• sp_configure 'atoi updates' .1 it 0" @int1 О О
Build Query..
Parameters.
I OK
Parse Query
Cancel
Help
t Рис. 11.56. Окно Execute SQL Task Properties
Задача Execute SQL Task допускает использование параметризированных запросов, ссылающихся на глобальные переменные пакета. Назначение и применение параметризированных запросов было рассмотрено в разд. "Параметризированные запросы" ранее в этой главе. Параметры могут применяться не только при выполнении запросов, но также и в качестве аргументов хранимых процедур: EXEC GetListAuthors ?
Напомним, что связывание параметров запроса и глобальных переменных выполняется с помощью окна Parameter Mapping (рис. 11.57), открыть которое можно с помощью кнопки Parameters в окне свойств задачи. Видно, что окно имеет две вкладки — Input Parameters и Output Parameters. Как следует из названия, первая из вкладок предназначена для связывания глобальных переменных со входными параметрами запроса, тогда как вторая — для присвоения результатов, возвращаемых запросом, глобальным переменным пакета.
Глава 11. Доступ к гетерогенным источникам данных
421
Parameter Mapping Input Parameters | Output Parameters | You can map global variables to input parameters. Parameter Mapping: Input Global Variables Form rrr Var1
I Parameters Parameter 2 Parameter 3
Create Global Variables.. OK
Cancel
Help
Рис. 11.57. Окно Parameter Mapping
Работа со вкладкой Input Parameters (см. рис. 11.57) была приведена в разд. "Параметризированные запросы" ранее в этой главе. В данном же разделе
рассмотрим работу со вкладкой Output Parameters (рис. 11.58). Parameter Mapping Input Parameters Output Parameters j You can map the output from the SQL query to global variables. r Output Parameter Type: j (* None ! Г flow Value j (* iRowsej Parameter Mapping: Parameters title_id title type pub_id price advance
I Form i Output Global Variables <none> <none> Form <none> Var1 <none>
ft __ z\
Create Global Variables.. OK
Cancel
Help
Рис. 11.58. Окно Parameter Mapping, вкладка Output Parameters
422
Часть III. Администрирование
Первое, что должен сделать пользователь на вкладке Output Parameters, это выбрать тип связывания возвращаемых запросом значений и глобальных переменных пакета. Для этого предназначена группа переключателей Output Parameter Туре, в которой может быть установлен один из перечисленных переключателей: • None. В этом случае никакое связывание не используется и возвращаемые запросом данные теряются. Данный тип связывания применяется, когда весь обмен данными происходит внутри выполняемого пакета команд, и передача их во вне не требуется. По умолчанию переключатель установлен именно в это положение. • Row Value. При установке переключателя в указанное положение каждый столбец данных, возвращаемый в результате выполнения запроса, будет сохранен в отдельной глобальной переменной. При установке переключателя в положение Row Value становится доступной таблица Parameter Mapping, расположенная в нижней части вкладки. Она служит для определения связей между столбцами возвращаемого результата и глобальными переменными. В колонке Parameters, значения которой не изменяются, перечислены имена всех столбцов результата. Имя глобальной переменной, в которую будет помещен столбец, указывается в колонке Output Global Variables. Элемент этой колонки представляет собой раскрывающийся список, содержащий имена всех глобальных переменных, определенных в пакете. Выбрав имя той или иной переменной, вы тем самым предписываете поместить в нее соответствующий столбец. В списке также может быть выбрано значение <попе>. В этом случае данные соответствующего столбца будут потеряны. Для создания новой переменной достаточно нажать кнопку Create Global Variables, после чего появится окно Global Variables, подобное приведенному на рис. 11.40. Ранее мы уже обсуждали работу с данным окном и поэтому не будем лишний раз останавливаться на этом. П Rowset. Когда переключатель установлен в это положение, то весь результат выборки будет помещен в единственную глобальную переменную. Имя переменной, в которую будет помещен результат, отображается в раскрывающемся списке слева от переключателя. Сохраненный подобным образом результат может впоследствии использоваться как отсоединенный набор строк ADO (disconnected ADO recordset). Для работы с данными, сохраненными в глобальных переменных в виде столбцов или даже наборов строк, применяются стандартные механизмы ADO. Например, в пакете может быть определена задача ActiveX Script, которая выводит пользователю диалоговое окно с полученными данными. Сохраненные в глобальных переменных данные также могут быть использованы при выполнении преобразований с помощью задачи Transform Data Task. Само по себе конфигурирование задачи Execute SQL Task не представляется трудным. Гораздо более сложной задачей является последующее использование данных, сохраненных в глобальных переменных. Подробное описание подобной работы потребовало бы детального рассмотрения функций DTS, доступных при работе со скриптовыми языками ActiveX. Однако вследствие ограничений на объем книги это не представляется возможным.
Глава 11. Доступ к гетерогенным источникам данных
423
Задача Data Driven Query Task В одном из предыдущих разделов была рассмотрена работа с задачей Transform Data Task, предоставляющей довольно широкие возможности по копированию и преобразованию данных. Однако возможности этой задачи были несколько ограничены. В частности, в распоряжении пользователей имеется всего два типа преобразований — Copy Column и ActiveX Script. Хотя последний тип преобразования и предоставляет практически неограниченные возможности при работе с данными, все же иногда более удобным является работа с шаблонными типами преобразований, реализующих те или иные операции. При создании пакета DTS в распоряжении пользователей имеется задача Data Driven Query Task, которая предоставляет самые широкие возможности по копированию и преобразованию данных. Эта задача имеет более широкие возможности, чем Transform Data Task. В частности, помимо копирования данных, дополнительно можно выполнять вставку, изменение или удаление данных в некоторых связанных таблицах.
Замечание Использование задачи Data Driven Query Task требует довольно высокого уровня профессионализма. Используйте эту задачу только для выполнения сложных операций, недоступных другим типам задач. В большинстве случаев вполне достаточно возможностей, предоставляемых задачей Transform Data Task. Окно свойств задачи Data Driven Query Task имеет шесть вкладок. Напомним, что конфигурирование задачи Transform Data Task выполняется с помощью пяти вкладок. В большинстве вкладки задачи Data Driven Query Task повторяют вкладки задачи Transform Data Task. Дополнительная вкладка имеет название Queries и ее назначение будет рассмотрено ниже. Первая вкладка окна свойств задачи Data Driven Query Task имеет имя Source (рис. 11.59). Она полностью соответствует вкладке Source окна свойств задачи Transfer Data Task (см. рис. 11.34). Более того, назначение и использование элементов управления обеих вкладок полностью идентично. Для получения информации о работе со вкладкой Source окна Data Driven Query Task Properties следует обратиться к описанию работы с задачей Transfer Data Task в разд. "Задача Transfer Data Task" ранее в этой главе. Более того, вкладки Bindings, Transformations, Lookups и Options окна свойств задачи Data Driven Query Task практически полностью совпадают, соответственно, с вкладками Destination, Transformations, Lookups и Options окна свойств задачи Transfer Data Task. Работа с этими вкладками была рассмотрена в разд. "Задача Transfer Data Task". Хотя и было сказано, что вкладки указанных задач в значительной степени совпадают, однако определенные отличия все же есть. В частности, при работе со вкладкой Transformations при создании нового преобразования в распоряжении пользователя имеются следующие типы преобразований: • ActiveX Script позволяет выполнять преобразование данных с использованием языков VBScript или JavaScript, а также с помощью дополнительных компиля-
Часть III. Администрирование
424
торов, например PerlScript. Этот тип преобразований поддерживается задачей Transform Data Task и был подробно рассмотрен при ее описании. Data Driven Query Task Properties Source Bindings] Transformations | Queries | Lookups] Options] Enter a table name or the results of a query as a data source. J Description:
Data Driven Query Task: undefined
Connection:
Microsoft OLE DB Provider for SQL Server i
**" lable/View:
Ш [pubs], [dbo]. [titles]
f SQL query:
Preview..
OK
Cancel
Help
Рис. 11.59. Окно свойств задачи Data Driven Query Task
• Copy Column используется для простого копирования данных столбца источника в столбец получателя. Также был рассмотрен при описании задачи Transform Data Task. • Date Time String преобразует данные о времени и дате в символьную строку указанного формата. При этом можно выделить любую из составляющих исходных данных: год, месяц, день, час, минуту, секунду или миллисекунду. П Lowercase String выполняет преобразование всех символов текстовых данных в нижний регистр. • Middle of String применяется для копирования в столбец получателя только части исходной строки. Пользователь указывает, с какого символа будет начинаться копирование и количество символов, которое необходимо скопировать. • Read File позволяет использовать файл в качестве исходного столбца. П Trim String удаляет из строки лидирующие, конечные и внутренние пробелы, символы табуляции, символы конца строки, перевода строки, вертикальной линии, прогона строки (т. е. имеющие коды 0x09—OxOd, 0x20). При работе со строками Unicode будут удаляться аналоги указанных символов. • Uppercase String — выполняет преобразование всех символов текстовых данных в верхний регистр.
Глава 11. Доступ к гетерогенным источникам данных
425
Мы не будем подробно останавливаться на конфигурировании перечисленных выше типов преобразований, т. к. работа с ними не представляет особого труда. Помимо рассмотренного отличия между вкладками Transformations задач Data Driven Query Task и Transform Data Task, как уже было сказано ранее, существует и различие между вкладками Options этих задач. На рис. 11.60 приведен вид вкладки Options задачи Data Driven Query Task. Как видно, отсутствует группа элементов SQL Server, предназначенная для оптимизации обмена данными между серверами SQL Server. В остальном же состав и назначение имеющихся элементов на вкладке элементов управления соответствуют назначению элементов на вкладке Options задачи Transform Data Task. Data Driven Query Task Properties Queries j Lookups source 1 BindingsTransformations) j Exception file Name: r File type | W 7.0 format
Options
_ J ! £ow delimiter:
; Г Eire te?l
I i Column delimiter:
{ Г Sburc&'effc j Г .Best error f l ,.,
! Text qualifier:
{CR}{LF}
j j
Vertical Bar J^J I <none>
2J '
Data movement
! Max error count:
Г
Z-Hj First row:
0
j Fetch buffer size
И
-Н
0
OK.
Last row:
Cancel
Help
Рис. 11.60. Окно Data Driven Query Task Properties, вкладка Options
Таким образом, к данному моменту читатель должен уметь работать с пятью вкладками окна свойств задачи Data Driven Query Task. Нерассмотренной осталась только вкладка Queries (рис. 11.61), которой и будет посвящена оставшаяся часть данного- раздела. Вкладка Queries служит для указания запросов, которые будут автоматически выполняться задачей при копировании каждой из строк. Это позволяет выполнять при дублировании информации довольно сложные преобразования данных как на источнике, так и на получателе. Более того, разрешается обращение и к источникам данных, не участвующим непосредственно в процессе выполнения задачи.
Часть III. Администрирование
426 Data Driven Query Task Properties Source j Bindings I Transformations Queries | Lookups | Options I For each query type used, provide a SQL statement, choosing a destination column to fill each parameter. fluery type SELtCT type FROM titles GROUP BY type WHERE price;?
destination to parameter mapping: iDestination
I Parameters
Parameter 1
Cancel
Help
Рис. 11.61. Окно Data Driven Query Task Properties, вкладка Queries
Самым первым элементом вкладки является раскрывающийся список Query type, предназначенный для выбора типа операции, для которой необходимо определить запрос. Список содержит значения: П Insert — используется для вставки данных; П Update — предназначен для выполнения обновления; • Delete — позволяет выполнять удаление; • Select — служит для выполнения выборки данных. В поле, расположенном непосредственно ниже списка Query type, отображается код запроса. Для каждого из типов операции пользователь может указать отдельный запрос, который и будет реализовывать выполнение соответствующей операции. Текст запроса может быть введен в поле вручную или сгенерирован с помощью построителя запросов Query Builder. В последнем случае для вызова построителя запросов достаточно нажать кнопку Build. Работа с построителем запросов была подробно рассмотрена в разд. "Построитель запросов Query Builder" ранее в этой главе. Отметим, что в запросе могут использоваться параметры. Подробно назначение и применение параметров было рассмотрено в разд. "Параметризированные запросы" ранее в этой главе. Указанный запрос каждого типа будет отдельно запускаться в ходе выполнения задачи для каждой вставляемой в таблицу получателя строки. В нижней части вкладки расположена таблица Destination to parameter mapping, с помощью которой указывается отображение столбцов получателя в параметры запроса. Когда в коде запроса используются параметры, для каждого из них в
Глава 11. Доступ к гетерогенным источникам данных
427
таблице Destination to parameter mapping создается отдельная строка. В колонке Parameters указывается имя параметра (точнее его номер). В колонке Destination пользователь должен выбрать имя столбца таблицы получателя, значение которой будет подставлять вместо параметра. Обратим внимание, что для задания значений параметров используют только те строки, которые копируются в таблицу получателя в ходе выполнения задачи. Данные, уже существующие в таблице, не используются. Нерассмотренной осталась только кнопка Parse/Show Parameters, с помощью которой можно выполнить проверку синтаксиса введенного запроса и обновить список параметров, отображаемых в таблице Destination to parameter mapping. На этом рассмотрение конфигурирования задачи Data Driven Query Task можно считать оконченным.
Задача Copy SQL Server Objects Task С помощью уже описанных задач можно выполнять копирование данных между самыми различными источниками данных, попутно осуществляя довольно сложные преобразования копируемых данных. Однако рассмотренные задачи выполняют дублирование данных в готовые таблицы. Копирование же собственно структуры таблицы при этом не выполняется. Более того, нередко с таблицами ассоциированы индексы, ограничения целостности, умолчания и т. д. При организации данной операции все эти объекты остаются "за бортом". Тем не менее, нередко бывает необходимо скопировать не только собственно данные, но и таблицы, в которых хранятся соответствующие данные, а также вспомогательные объекты, связанные с этими таблицами. Кроме того, иногда требуется скопировать хранимые процедуры, триггеры, пользователей баз данных, функции и т. д. Дублирование объектов баз данных, а также содержащейся в них информации, можно выполнить с помощью задачи Copy SQL Server Objects Task, специально разработанной для этих целей. Однако эта задача имеет одно существенное ограничение — она работает только с источниками данных SQL Server 2000 и SQL Server 7.0. Таким образом, обмен объектами и данными с использованием задачи Copy SQL Server Objects Task возможен только между серверами SQL Server версий 7.0 и 2000. Для копирования объектов с более ранних версий SQL Server (6.5 и 6.0) необходимо использовать мастер обновления Upgrade Wizard. Работа с более ранними версиями SQL Server не реализована. Тем не менее, можно выполнить обновление более ранних версий (например, SQL Server 4.1) до SQL Server 6.x, и тогда применить Upgrade Wizard для копирования объектов и данных. Более подробно выполнение обновления было рассмотрено в главе 6. Окно свойств задачи Copy SQL Server Objects Task представлено на рис. 11.62. Как видно, окно содержит три вкладки. Первая вкладка имеет имя Source и предназначено для указания источника данных, с которого будут копироваться объекты и данные. База данных получателя, а также имя сервера, выбирается на вкладке Destination. Ранее уже были рассмотрены задачи, имеющие похожие вкладки Source и Destination, поэтому мы не будем лишний раз останавливаться на рассмотрении элементов управления, имеющихся на них, и перейдем к рассмотрению вкладки Сору.
428
Часть III. Администрирование
Copy SQL Server objects Task Properties Source j Destination) Copy Description:
(Copy SQL Server Objects Task: undefinec
Before you can copy information from a Microsoft SQL Server, you must specify the server, username, password, and database. Server:
|STORAGE\TRELON
<•" Use Windows NT Authentication Г Use SQL Server Authentication
Database:
Refresh
| Ш pubs
OK
Cancel
Help
Рис. 11.62. Окно Copy SQL Server Objects Task Properties
Copy SQL Server Objects Task Properties Source I Destination Copy Copy tables, data, stored procedures, referential integrity constraints, security, and indexes. Specify the object(s) to copy. f? jDeate destination
view? stored procedures, constraints, etc.j
P? Drop destination objects first P* Include all dependent objects p Copy data (* Replace existing data С Append data Г" Use Cojlation ig1>:-c'U;>^ ;
W Coey all objects $7 jJse default options S_cript file directory:
iGAProgram FilesSMicrosoft SQL Server\80V OK
Cancel
... I
Help
Рис. 11.63. Окно Copy SQL Server Objects Task Properties, вкладка Copy
Глава 11. Доступ к гетерогенным источникам данных
429
Вкладка Сору (рис. 11.63) является ничем иным, как окном Select Object to Copy мастера DTS Import/Export Wizard (см. рис. 11.20). Соответственно, работа с указанным окном мастера была рассмотрена в разд. "Выбор объектов для копирования" ранее в этой главе. Более того, при конфигурировании копирования объектов с помощью мастера DTS Import/Export Wizard в результате будет получен пакет DTS, содержащий единственную задачу Copy SQL Server Objects Task. Таким образом, конфигурирование задачи Copy SQL Server Objects Task можно считать рассмотренным.
Задача Send Mail Task Задача Send Mail Task позволяет отправлять сообщения по электронной почте. Однако, прежде чем станет возможным работа с этой задачей, необходимо для службы SQLServerAgent сконфигурировать почтовый профиль, который будет использоваться для отправления сообщений. Конфигурирование почтового профиля для службы SQLServerAgent было рассмотрено в подразд. "Вкладка General" разд. "Конфигурирование службы SQLServerAgent" главы 8. Окно свойств задачи Send Mail Task приведено на рис. 11.64. Send Mail Task Properties Geneial Send e-mali as part of the DTS package using MAPI. Enter your profile and the properties of the message. Description:
Send Mail Task: undefined
Profile name:
JEvgeniyMamaev 3 [email protected] [email protected]
1°:
£C: Subject: Message:
Pass
Ui0'd: J
ВНИМАНИЕ! На одном из жестких дисков недостаточно свободного пространства для роста баз данных...
J
Attachments: ОК
Cancel
Рис. 11.64. Окно Send Mail Task Properties
Конфигурирование задачи Send Mail Task практически ничем не отличается от отправки обычного сообщения по электронной почте с помощью почтовых программ. Тем не менее, рассмотрим элементы управления, использующиеся для конфигурирования задачи:
430
Часть III. Администрирование
П Description. В этом поле, как и при конфигурировании всех других задач, указывается имя, по которому будет выполняться идентификация создаваемой задачи Send Mail Task в пределах пакета. П Profile name. Раскрывающийся список содержит перечень почтовых профилей, сконфигурированных для службы MS SQLServer. Выбирая тот или иной профиль, вы тем самым определяете адрес, на который будет осуществляться отправка сообщения. • Password. Если для применения почтового профиля необходимо указывать пароль, то его можно ввести в данном поле. П То. В этом поле указывается адрес, на который будет отправлено сообщение (например, оператору). Адрес может быть либо введен вручную, либо выбран из адресной книги, открыть которую можно с помощью кнопки X расположенной в правой части окна в той же строке, что и поле То. О СС. В данном поле можно указать адрес, по которому следует отправить копию сообщения (например, оператору последней надежды или администратору). Однако, если копию отправлять не требуется, то поле можно оставить пустым. •
Subject. Указывается тема сообщения. Обычно почтовые программы предлагают пользователям лишь список сообщений, но для каждого из них указывается тема. Предполагается, что тема будет коротко объяснять содержимое и назначение сообщения. Тем не менее, ее можно опускать.
•
Message. В этом текстовом поле задается собственно текст сообщения.
П Attachments. В данном поле можно определить имя и путь к файлу, который должен быть отправлен вместе с сообщением. Это дает возможность посылать по электронной почте файлы, подготовленные другими задачами пакета. Таким файлом может являться как список встретившихся ошибок, так и файл с данными, скачанными задачей Bulk Insert Task. Пример конфигурирования задачи Send Mail Task приведен непосредственно на рис. 11.64.
Задача Bulk Insert Task Рассмотренные ранее задачи позволяют выполнять копирование информации между самыми различными источниками данных с выполнением сложных преобразований и дополнительных изменений данных в различных таблицах. Эти задачи требуют значительных усилий для конфигурирования и не оптимизированы для выполнения простого копирования. Тем не менее, часто бывает необходимо закачать информацию из форматированного текстового файла. И выполнить это нужно довольно быстро. При этом не нужно выполнять никаких прямых или косвенных преобразований данных, а достаточно просто поместить в таблицу всю информацию, содержащуюся в файле. Для решения подобных проблем была разработана задача Bulk Insert Task, позволяющая выполнять массивную закачку данных в таблицу из текстового фай-
Глава 11. Доступ к гетерогенным источникам данных
431
ла, обеспечивая при этом максимальную по сравнению с другими задачами скорость копирования данных. При этом обеспечивается поддержка стандарта Unicode. На рис. 11.65 приведено окно свойств задачи Bulk Insert Task. J*J
Bulk Insert Task Properties; General j Options |
The SQL Server Bulk Insert mode provides the fastest way to import text files into SQL Server. However,you cannot validate, scrub, or transform data using this mode. .Description: Existing connection: Destination table: Source data file:
Bulk Insert Task: undefined [Microsoft OLE DB Provider for SQL Serv • j j[pubs].[dbo].[aaa)
С Use format file. (• Specify format:
"3
Refresh
C:\DN\FILES.BBS
J .
Row delimiter: Column delimiter:
а Tab Cancel He pl 3
Рис. 11.65. Окно Bulk Insert Task Properties
Как видно, окно имеет две вкладки. Первая из них, General, содержит элементы управления, с помощью которых задаются основные свойства задачи. Рассмотрим эти элементы управления. О Description. В этом поле указывается имя, по которому будет выполняться идентификация задачи в пакете. Имя задачи должно быть уникально в пределах пакета. П Existing connection. Раскрывающийся список содержит имена всех источников данных, сконфигурированных в пакете. Пользователь должен выбрать источник данных, в таблицу которого предполагается закачивать информацию. • Destination table. Имя таблицы, в которую будут закачиваться данные, выбирается в рассматриваемом раскрывающемся списке. Если нужная таблица была только недавно создана и еще не отображена в списке, то, нажав кнопку Refresh, можно обновить список таблиц. Отметим, что возможностями рассматриваемой задачи создать новую таблицу нельзя. Если же нужной таблицы в базе данных еще нет, то она должна быть создана другими средствами. • Source data file. В этом поле указывается имя и путь к текстовому файлу, в котором содержатся данные для копирования. Имя и путь могут быть указаны либо непосредственно, либо выбраны с помощью окна Browse For Existing File, открыть которое можно с помощью кнопки , I, расположенной ..а..,'..,..!
15 Зак. 83
Часть III. Администрирование
432
справа от поля. Отметим, что задача Bulk Insert Task работает только с файлами, размещенными на локальных дисках. П Use format file. В текстовом файле не содержится никакой информации о названии столбцов, их размере, типе данных и т. д. При выполнении закачки данных из текстового файла в таблицу могут возникнуть проблемы с интерпретацией формата данных. Задача Bulk Insert Task должна иметь необходимую информацию о каждом столбце текстового файла. Эта информация хранится отдельно от самих данных в специальном файле форматирования (format file). Установка переключателя в положение Use format file предписывает при выполнении задачи использовать конкретный файл форматирования, имя и путь к которому указываются в списке правее переключателя. Если готового файла нет, то его можно создать интерактивно, нажав кнопку Generate. В ответ откроется окно мастера, с помощью которого можно будет сконфигурировать все необходимые свойства и сразу же просмотреть результат форматирования. • Specify format. В большинстве случаев структура закачиваемых текстовых файлов довольно проста и нет нужды применять сложные файлы форматирования. Установка переключателя в рассматриваемое положение позволяет не использовать конкретный файл форматирования, а задать данные о формате текстового файла непосредственно в окне свойств конфигурируемой задачи. В этом случае становятся доступными следующие элементы управления: • Row delimiter — этот раскрывающийся список служит для выбора символа (или символов), которые будут вставляться в конце каждой строки файлов исключения. По умолчанию в списке выбран символ перевода каретки — {LF}, но допускается использование символа возврата строки — {CR}. Эти символы могут применяться и вместе — {CR}{LF}. Помимо указанных символов можно использовать точку с запятой (Semicolon), запятую (Comma), символ табуляции (Tab), вертикальную полосу (Vertical Bar) или любой другой произвольный символ. Разрешается также не использовать никакого символа (<попе>). • Column delimiter — в этом раскрывающемся списке выбирается символ, который будет использоваться для разделения данных различных столбцов. Можно либо выбрать символ из списка, либо ввести произвольный. По умолчанию для разделения столбцов предлагается применять символ табуляции (Tab). (
Замечание
j
В настоящей главе мы не будем подробно рассматривать механизмы массивного копирования и использование файлов форматирования в частности. Эта тема будет раскрыта в полной мере в главе 28.
На этом работа со вкладкой General заканчивается. В принципе, на этом можно закончить и конфигурирование всей задачи, т. к. значения, установленные на вкладке Options по умолчанию, вполне подходят для большинства пользователей. Тем не менее, некоторые проблемы массивного копирования данных нель-
Глава 11. Доступ к гетерогенным источникам данных
433
зя разрешить, не воспользовавшись вкладкой Options (рис. 11.66). Кроме того, с помощью указанной вкладки можно выполнить тонкую настройку процесса закачки данных. ill
Bulk Insert Task Properties General Options | Г" [Check constraint^
Г Keep Nulls
Г finable identity insert
Г" Table Lock
Г Sorted data: Code gage:
JOEM
I Cjata file type:
jchar
| Г* Insert commit size:
|-
~ 3 _J
i
! Г" Only copy selected rows: Firs] row:
F~
Last row
OK
Cancel
Help
Рис. 11.66. Окно Bulk Insert Task Properties, вкладка Options
Вкладка Options имеет следующий набор элементов управления: П Check constraints. Если в таблице получателя определены ограничения целостности, то по умолчанию все вставляемые данные проверяются на соответствие этим ограничениям целостности. Если вставляемая строка не удовлетворяет установленным ограничениям целостности, то ее вставка отменяется и генерируется ошибка. Проверку на соответствие ограничениям целостности можно отменить, если сбросить флажок Check constraints. Это поможет увеличить скорость вставки данных в таблицу получателя, но может привести к тому, что в таблице будут содержаться данные, не соответствующие определенным для таблицы ограничениям целостности. Тем не менее, проверка данных на соответствие ограничениям целостности может быть выполнена позже с помощью команд проверки целостности базы данных DBCC. •
Keep Nulls. Если в столбце таблицы получателя определено значение по умолчанию, то при попытке вставки в нее значения NULL В нем будет сохранено значение по умолчанию, даже если в этом столбце и разрешено хранение значений NULL. Однако, в некоторых случаях следует обеспечить копирование и значений NULL. В этом случае необходимо установить рассматриваемый флажок. По умолчанию значения NULL будут заменяться значениями по умолчанию. Если значение по умолчанию не определено и разрешено хранение NULL, ТО В столбце будет сохранено значение NULL. ЕСЛИ
434
Часть III. Администрирование
же размещение значений NULL запрещено, то при попытке вставки в столбце пустого значения (NULL) будет выдано сообщение об ошибке. • Enable identity insert. При вставке строк в таблицу с определенным столбцомсчетчиком (свойством IDENTITY) значения для столбца-счетчика станут генерироваться сервером автоматически, а исходные значения будут игнорироваться. Таким образом, значения в столбцах-счетчиках источника и получателя данных, скорее всего, будут различаться. Однако, в некоторых случаях нужно обеспечить точное совпадение данных на источнике и получателе. Для разрешения вставки явных значений в столбец-счетчик на получателе необходимо установить флажок Enable identity insert. По умолчанию этот флажок сброшен. • Table Lock. Выбор флажка требует установки на время выполнения задачи, точнее на время вставки данных в таблицу получателя, блокировки на уровне таблицы. По умолчанию применяются блокировки на уровне строк, что требует заметно большего объема ресурсов. Для повышения производительности копирования данных можно использовать блокировки на уровне таблицы. Однако в этом случае таблица получателя окажется недоступной для выполнения других операций. То есть пользователи, желающие получить доступ к таблице, должны будут ожидать завершения выполнения задачи, даже если они хотят обратиться всего к одной строке, с которой задача может не работать вовсе. П Sorted data. Если столбец, по которому отсортированы данные в файле, входит в кластерный индекс таблицы, то это может помочь увеличить производительность операций массивного копирования. Для этого необходимо установить рассматриваемый флажок и в поле справа от него ввести имя столбца таблицы получателя, по которому отсортированы данные в текстовом файле. По умолчанию считается, что данные в текстовом файле не отсортированы. П Code page. С помощью данного раскрывающегося списка указывается, для какой кодовой страницы был создан текстовый файл. При переносе данных, не поддерживаемых Unicode (столбцы типа t e x t , varchar и char), требуется явно указать, к какой кодовой странице они принадлежат. Однако этого можно не делать, если не используются символы с кодом ниже 32 или выше 127. При необходимости сервер выполняет автоматическое преобразование данных. Значение кодовой страницы применяется для типов данных char, varchar и t e x t и влияет только на символы с кодом меньше 32 или больше 127. Список содержит элементы: •
OEM — кодовая страница, установленная на локальном компьютере;
• АСР — кодовая страница 1252 (ANSI/Microsoft Windows — ISO 1252); •
RAW — при указании данного параметра данные записываются в "сыром" (raw) виде. Никакое преобразование не выполняется. Это позволяет достичь максимальной производительности. Часто используется при переносе данных между однотипными серверами.
Глава 11. Доступ к гетерогенным источникам данных П Data File type. Задача Bulk Insert Task может работать с текстовыми файлами нескольких форматов. С помощью раскрывающегося списка Data file type пользователь может выбрать один из четырех поддерживаемых форматов: •
char — исходный текстовый файл имеет символьный формат. Это самый простой формат текстовых файлов, который может быть сгенерирован практически любым приложением или введен вручную с помощью самого простого текстового редактора;
•
native — специальный формат файлов, называющийся исконным (native). В этом формате данные представляются именно в том виде, в каком они хранятся в таблице SQL Server 2000. Пользователь не должен указывать никакой информации о формате текстового файла. Полученный файл исконного формата не может быть просмотрен напрямую в текстовом редакторе. Данный формат обеспечивает наиболее высокую производительность операций массивного копирования. К недостаткам можно отнести несовместимость с другими приложениями. Исконные файлы поддерживаются только серверами SQL Server;
widechar — в этом случае предполагается, что данные в файле хранятся в символьном формате с поддержкой Unicode. Для разделения колонок применяется символ табуляции \ t , для разделения строк — символ новой строки \п. Файлы widechar в принципе можно прочитать с помощью тек• стового редактора, но это связано с определенными трудностями. Кроме того, рассматриваемый формат нельзя использовать при работе с файлами, сгенерированными SQL Server 6.x, т. к. эти системы не поддерживают стандарта Unicode;
•
•
.
widenative — формат является комбинацией форматов native и widechar. При выборе рассматриваемого формата предполагается, что для всех текстовых данных используется формат Unicode, а остальные типы данных представляются в исконном, внутреннем формате SQL Server 2000. Такой подход обеспечивает высокую производительность наряду с возможностью хранения данных на любом национальном языке. Поэтому такие файлы часто применяются для переноса данных между серверами SQL Server 2000 и SQL Server 7.0.
О Insert commit size. Для каждой базы данных можно установить, будут ли операции вставки данных при выполнении массивного копирования выполняться с помощью транзакций или напрямую. Вставка данных с помощью транзакций позволяет добавить либо все данные, либо никакие. По умолчанию задача Bulk Insert Task вставляет все данные одним блоком. Если данная операция осуществляется с использованием транзакций, и происходит ошибка при вставке всего лишь одной строки, то выполняется откат всей операции вставки. Если производится вставка нескольких сотен тысяч строк, то такой вариант неудовлетворителен. Для решения указанной проблемы механизмы массивного копирования позволяют выполнять вставку данных блоками или пакетами (batch). Пакет состоит из ограниченного количества строк. Вставка каждого пакета выполняется как отдельная транзакция. Неудачная вставка
435
436
Часть III. Администрирование
одного пакета не приведет к полной отмене массивного копирования. Весь процесс добавления разбивается на множество более мелких операций. Установка флажка Insert commit size предписывает выполнять копирование всех данных в виде серии отдельных пакетов. Размер пакета задается в поле справа от флажка. По умолчанию установлено значение 0, что означает копирование всех строк за одну транзакцию. • Only copy selected rows. Предположим, что вы выполняли копирование миллиона строк, и где-то на половине переноса произошел сбой. Часть данных была скопирована, а другая — нет. Если процесс копирования первой половины строк занял несколько часов, то вряд ли вы захотите начинать все с начала. К счастью, механизмы массивного копирования позволяют начинать и заканчивать копирование с произвольных строк. Для этого достаточно установить рассматриваемый флажок. В ответ станут доступными дополнительные элементы управления, с помощью которых и указывается, с какой строки должно быть запущено копирование, и на какой строке оно должно быть окончено: •
First row — по умолчанию выборка данных из источника начинается с первой строки. Однако выборка может быть начата с произвольной строки. Это может быть использовано для разделения всего процесса копирования на несколько этапов, выполняемых отдельно. В рассматриваемом поле указывается номер первой строки, с которой должна быть начата выборка данных;
•
Last row — в этом поле указывается номер строки, которая должна быть скопирована последней. По умолчанию указывается значение 0 и будут скопированы все строки, начиная с указанной в поле First row и заканчивая последней.
На этом рассмотрение задачи Bulk Insert Task можно считать оконченным. Задача является своего рода графическим интерфейсом для утилиты командной строки bcp.exe (bulk copy program). Однако возможности этой утилиты гораздо шире, чем у рассмотренной задачи. В частности, утилита bcp.exe позволяет выполнять не только закачку данных из текстового файла в таблицу, но и копирование данных из таблицы в файл. Скорее, задачу Bulk Insert Task можно сравнить с командой Transact-SQL BULK INSERT, которая так же позволяет выполнять только закачку данных из текстового файла в таблицу. Как работа с утилитой bcp.exe, так и использование команды BULK INSERT будут рассмотрены в разд. "Механизмы массивного копирования" главы 28.
Задача Execute Package Task Когда необходимо реализовать сложный процесс копирования и трансформации данных, может понадобиться создать пакет, содержащий десятки задач. Работа с таким пакетом как с одним целым может быть достаточно сложной. Гораздо проще разбить один пакет на множество более мелких и выполнять их по отдельности. При работе с SQL Server 7.0 это было невозможно, т. к. нельзя запускать один пакет из другого. В SQL Server 2000 добавилась задача Execute Package Task, которая позволяет запускать один пакет из другого.
Глава 11. Доступ к гетерогенным источникам данных
437
Использование задачи Execute Package Task позволяет распределить работу по реализации процесса копирования и преобразования данных между несколькими пользователями, каждый из которых будет ответственен за часть работы. Каждый пользователь создает отдельный пакет, являющийся законченным и работающим самостоятельно. Затем администратор создает главный пакет, из которого производится-вызов остальных пакетов. Окно свойств задачи Execute Package Task имеет две вкладки. Первая вкладка имеет название General (рис. 11.67) и содержит перечисленные далее элементы управления: • Description. В этом поле указывается имя, под которым задача будет идентифицироваться в пакете. Имя должно быть уникально в пределах пакета. Execute Package Task Properties General | Opto i ns | ^_ , You can execute a DTS Package using Execute Package task. Description: [Execute Package Task: undefn i ed |SQL S« Location: Package name: JTest New Package |p| Password: | Package ID: {6415BE82-E69F-4ADC-8031-78BA45BF39D0} Version: {A1FA6D15-3A9A-4D6F-A2C8-544EDF8CF6BB} i ,• j To connect to SQL Server, click the server name and authentication mode Server: [(local] (* Use Wn i dows NT Authentication С Use SQL Server Authentication
OK
Cancel
Help
Рис. 11.67. Окно Execute Package Task Properties, вкладка General
D Location. С помощью раскрывающегося списка задается источник, в котором содержится нужный пакет. В зависимости от того, какой элемент выбран в списке, меняется состав элементов управления в группе, расположенной в нижней части вкладки. На рис. П.67 приведен вид вкладки, когда в списке выбран элемент SQL Server. Вкладка будет иметь подобный вид и при выборе SQL Server Meta Data Services. Список имеет следующие элементы: • SQL Server — при установке переключателя в это положение можно будет выбрать любой из пакетов, сохраненных на сервере. Описание пакетов содержится в системной таблице sysdtspackages базы данных Msdb;
Часть III. Администрирование
438
• SQL Server Meta Data Services — в этом случае будет доступен любой из пакетов, хранящихся в структурах службы метаданных SQL Server. Службы метаданных позволяют отслеживать изменение пакета, его использование, потоки данных, которыми оперировал пакет, и некоторую другую информацию; • Structured Storage File — в этом случае необходимо указать файл (структурированный СОМ-файл) на диске, в котором хранится нужный пакет. Когда в списке выбран пункт Structured Storage File, то в группе будет содержаться только поле Package name, в котором пользователь должен будет указать полный путь к соответствующему файлу. Package name. В этом поле задается имя пакета DTS, который необходимо выполнить. Указанный пакет должен существовать в хранилище, выбранном в списке Location и определенном с помощью элементов управления, расположенных в нижней части вкладки. Если вы не помните имени пакета, то для просмотра доступных пакетов можно воспользоваться окном Select Package (рис. 11.68), которое является своего рода их браузером, позволяющим также просматривать и версии пакетов. Для открытия окна Select Package достаточно нажать кнопку 1, расположенную справа от поля Package name. Select Package Select the package to load. The file selected has multiple DTS packages or package versions. Packages;
Ш 2ОСП-09-11 23:05:47.817 Щ 2001-09-10 21:39:50.363 Test New Package J
New Package Щ 2001-09-11 19:24:34.710 Ш 2001-09-10 23:58:23.207 OK
Cancel
Help Рис. 11.68. Окно Select Package
О Password. Когда в одном из предыдущих разделов этой главы мы рассматривали создание пакетов с помощью мастера DTS Import/Export Wizard, то при описании сохранения созданного пакета было сказано, что для пакета можно установить пароль, без знания которого выполнение данного пакета будет невозможно. Если для пакета, который предполагается запустить с помощью конфигурируемой задачи, был установлен такой пароль, то его нужно указать в поле Password. В противном случае попытка выполнения пакета, и, следовательно, соответствующей задачи Execute Package Task, закончится неудачно. П Package ID. В этом текстовом поле указывается шестнадцатеричное число, являющееся уникальным идентификатором пакета, определенного в поле Package name.
Глава 11. Доступ к гетерогенным источникам данных • Version. Как уже говорилось, один и тот же пакет может иметь множество версий. При внесении изменений в пакет и последующем сохранении автоматически генерируется новая версия. Пользователь может получить доступ к любой из версий пакета (если пакет хранится в структурах службы метаданных). • Server. В этом раскрывающемся списке пользователь должен выбрать имя сервера SQL Server, на котором расположен необходимый для выполнения пакет. • Use Windows NT Authentication. После того, как имя нужного SQL Server было выбрано в списке Server, необходимо выбрать тип аутентификации, с использованием которого станет устанавливаться соединение с сервером. При установке переключателя в рассматриваемое положение для успешной работы пакета DTS нужно, чтобы пользователь, выполняющий пакет, вошел в домен Windows NT, и его учетной записи Windows NT на указанном SQL Server были предоставлены необходимые права доступа к данным. О Use SQL Server Authentication. При выборе данного переключателя установление соединения с источником данных будет выполняться на основе учетной записи SQL Server. В этом случае становятся доступными два дополнительных элемента: •
в поле Username следует указать имя учетной записи, которой предоставлены права доступа к данным на указанном в раскрывающемся списке Server источнике. Учетная запись должна быть создана на выбранном сервере;
•
в поле Password нужно ввести пароль учетной записи, указанной в предыдущем поле.
На этом работу со вкладкой General можно считать рассмотренной. Теперь же перейдем к описанию вкладки Options (рис. 11.69), предназначенной для тонкой настройки выполняемого пакета. Вкладка Options позволяет управлять глобальными переменными запускаемого пакета. Их конфигурирование осуществляется с помощью таблицы Variables, содержащей три колонки: G Name. Элемент этой колонки представляет собой раскрывающийся список, содержащий имена всех глобальных переменных, имеющихся в выбранном пакете. П Туре. В этой колонке указывается тип соответствующей переменной. Разрешается изменять тип не только вновь создаваемых переменных, но и имеющихся. Элемент колонки представляет собой список всех доступных типов. П Value. Указывается значение, которое будет присваиваться соответствующей переменной в момент запуска пакета. Для создания новой переменной достаточно нажать кнопку New. Другим вариантом создания новой переменной является редактирование самой нижней пустой строки таблицы. Если нужно удалить существующую переменную, то это можно сделать с помощью кнопки Delete. Однако при удалении переменной
439
Часть III. Администрирование
440
следует быть внимательным. Дело в том, что удаляемая переменная может использоваться в одной или более задач пакета, a DTS Designer не выполняет проверки на нарушение работы заданий вследствие удаления переменной. *J
Execute Package Task Properties General Options |
View or modify the global variable settings for the Execute Package task. Variables:
New OK
Cancel
Delete
Help
Рис. 11.69. Окно Execute Package Task Properties, вкладка Options
На этом описание конфигурирования задачи Execute Package Task можно считать оконченным.
Задача Message Queue Task С помощью задачи Message Queue Task пакеты DTS могут обмениваться символьными строками, глобальными переменными и файлами. Это реализуется с помощью технологии Message Queuing. Поддержка обмена данными между пакетами открывает большие возможности по управлению ходом выполнения пакетов. Например, пакет может выполнять массивную закачку данных из файла, полученного с помощью механизмов Message Queuing. Помимо этого, с помощью полученных значений глобальных переменных можно управлять ходом выполнения параметризированных запросов. Таким образом, набор строк, вставляемых в таблицу, может зависеть от результата выполнения пакета на сервере в офисе, расположенном в другом городе. Окно свойств задачи Message Queue Task представлено на рис. 11.70.
Глава 11. Доступ к гетерогенным источникам данных
441
Message Queue Task Properties Message Queue Task allows you to send or receive string, global variables, and data (ile messages when executing a DTS package. Description:
[Message Queue Task: undefinec
Message:
jSend i
Queue:
Queue 1
I Messages to be sent: Number iMessage Type 1 String Message |2 Data File Message
Add
£dit
OK
Cancel
Delete Help
Рис. 11.70. Окно Message Queue Task Properties
Замечание Для нормальной работы задачи Message Queue Task нужно предварительно установить службу Message Queuing Services. Для Windows NT 4.0 требуется установить Microsoft Windows NT 4.0 Option Pack. При работе с Windows 2000 необходимые компоненты поставляются в составе этой операционной системы. Тем не менее, по умолчанию они не устанавливаются.
Конфигурирование задачи выполняется с помощью следующих управления:
элементов
• Description. Как и для всех других задач, в этом поле указывается символьная строка (имя), по которой можно будет идентифицировать конфигурируемую задачу. Имя должно быть уникально в пределах пакета. П Message. С помощью одной задачи Message Queue Task можно либо принимать, либо отправлять строки, переменные и файлы. Конфигурирование как приема, так и отправки осуществляется с использованием единственного окна свойств задачи. С помощью рассматриваемого раскрывающегося списка пользователь указывает, что он хочет сконфигурировать — отправку (Send messages) или получение (Receive messages). В зависимости от того, какой пункт выбран в списке, меняется состав элементов управления, расположенных в нижней части окна. На рис. П.70 приведен вид окна, когда в списке выбрано значение Send messages. Как видно, в этом случае в нижней части окна содержится лишь таблица Message to be sent. • Queue. В этом поле указывается имя очереди, в которую будет отправляться (приниматься) сообщение. Имя очереди указывается в формате
Часть III. Администрирование
442
имя_компьютера\имя_очереди. Указанный компьютер должен быть доступен в момент выполнения конфигурируемой задачи. В противном случае ее работа завершится неудачно и будет выдано сообщение об ошибке. Кроме того, на указанном компьютере должен быть установлен клиент Message Queue Services, который и станет непосредственно принимать данные. Имена очередей, указываемых на отправителе и получателе, должны совпадать. Мы перечислили элементы управления, используемые как при конфигурировании отправки, так и при приеме данных. Элементы управления, расположенные ниже рассмотренных, являются специфичными для выбранного режима работы задачи. Как уже было сказано, если конфигурируется отправка данных, то в нижней части окна расположена лишь таблица Message to be sent (см. рис. 11.70), содержащая список отправляемых сообщений с указанием их типа. В колонке Number указывается номер отправляемого сообщения, тогда как его тип отображается в колонке Message Type. Для редактирования свойств сообщения достаточно дважды щелкнуть на его имени или нажать кнопку Edit. Удаление же сообщения выполняется с помощью кнопки Delete. Для создания нового сообщения предназначено окно Message Queue Message Properties (рис. 11.71), открыть которое
можно с помощью кнопки Add. Message Queue Message Properties gg&. You can send string message, global variables message and data file ЛШ message using Message Queue Task.
Message type: String message:
OK
Cancel
Help
Рис. 11.71. Окно Message Queue Message Properties
При создании нового сообщения достаточно выбрать его тип и сконфигурировать данные, которые будут отправляться. Тип сообщения выбирается с помощью раскрывающегося списка Message type, содержащего следующие элементы: П Data File Message — отправка файлов. В этом случае в нижней части окна появится строка File name, в которой необходимо будет указать имя и путь к отправляемому файлу. Разрешается пересылка не только файлов, расположенных на локальных дисках, но и файлов, расположенных на сетевых ресурсах.
Глава 11. Доступ к гетерогенным источникам данных
443
П Global Variables Message — отправка глобальных переменных. В этом случае окно Message Queue Message Properties будет иметь вид, подобный приведенному на рис. 11.72. Конфигурирование отправляемых переменных осуществляется с помощью таблицы Global variables. Каждая строка таблицы соответствует одной из отправляемых глобальных переменных текущего пакета. По умолчанию таблица Global variables является пустой. После нажатия кнопки New в таблицу добавляется новая строка. В этой строке в колонке Name пользователь должен выбрать имя одной из глобальных переменных текущего пакета, которую необходимо отправить. В колонках Туре и Value указываются, соответственно, тип и значение по умолчанию выбранной переменной. Управление глобальными переменными пакета (удаление, модификация и создание) осуществляется с помощью окна Global Variables (см. рис. 11.40), открыть которое можно с помощью кнопки Create Global Variables. Работа с этим окном была рассмотрена в разд. "Параметризированные запросы"ранее в этой главе. • String Message— отправка текстовых строк. При выборе в списке этого пункта окно Message Queue Message Properties имеет вид, приведенный на рис. 11.71. Как видно, в этом случае окно содержит всего одно поле String message, в котором пользователь должен указать отправляемый текст. Message Queue Message Properties щ&. You can send string message, global variables message and dala file Z j i message using Message Queue Task.
Message type:
(Global Variables Message
Global variables: Name
jType
Var1
Int
j Value В'Трапеция' 99
Create Global Variables..
New
OK
Cancel
Delete
Help
Рис. 11.72. Окно Message Queue Message Properties
На этом рассмотрение конфигурирования отправки сообщений можно считать оконченным. Теперь же перейдем к рассмотрению приема сообщений. Чтобы использовать задачу Message Queue Task для приема сообщений, в окне Message Queue Task Properties (см. рис. 11.70) в раскрывающемся списке Message следует выбрать значение Receive messages. В этом случае окно Message Queue Task Properties примет вид, приведенный на рис. 11.73.
Часть III. Администрирование
444 Message Queue Task Properties Message Queue Task allows you to send or receive string, global variables, and data file messages when executing a DTS package. Desertion: Message: flueue:
(Message Queue Task: undefn i ed [Receive messages A j dmn i Swappn ig
j Message type:
jData File Message
; Save file as:
KAWork\Upload\Report33.txt
; P? Overwrite i Only receive message from a specific package or version. •; **" Ш?*Ё
*~ From Package
I identifier:
j
<"" From yersion ,
' Г* Remove from message queue j Г" Jime out after:
seconds OK
Cancel
Help
Рис. 11.73. Окно Message Queue Task Properties
Как уже стало ясно, с помощью одной задачи Message Queue Task можно отправить данные трех типов: строки, глобальные переменные и файлы. Соответственно, за один раз можно принять также данные всех трех типов. Конфигурирование приема каждого типа данных осуществляется отдельно. В раскрывающемся списке Message type пользователь должен задать тип сообщений, свойства приема которых необходимо настроить. В зависимости от того, какой элемент выбран в этом списке, будет меняться и набор элементов. Для управления свойствами приема файлов (Data File Message) используется набор элементов управления: П Save file as. В этом поле указываются путь и имя, под которым будет сохранен принятый файл. Файл можно сохранить как локально, так и на сетевом ресурсе. О Overwrite. Если задача выполняется не впервые, то вполне возможно, что по указанному в предыдущем поле пути уже будет существовать файл. По умолчанию предварительное удаление старого файла перед записью нового не выполняется. В этом случае, если указанный в поле Save file as файл уже существует, то будет выдано сообщение об ошибке. Установка рассматриваемого флажка предписывает выполнить удаление имеющегося файла перед записью нового. • Only receive message from a specific package or version. В одну и ту же очередь могут быть помещены файлы из различных пакетов. Если необходимо гарантировать, что файл будет получен от конкретного пакета, то можно воспользоваться рассматриваемым переключателем для указания идентификатора конкретного пакета, от которого будет разрешено принимать файл. Более того, можно даже указать конкретную версию пакета, от которой будет приниматься файл. Переключатель может быть установлен в следующие положения:
Глава 11. Доступ к гетерогенным источникам данных
445
• No filter — в этом случае никакие дополнительные ограничения налагаться не будут. То есть разрешается прием файлов от любой версии любого пакета, выполняемого на компьютере, указанном в имени очереди (поле Queue); • From package — при установке переключателя в данное положение становится доступным поле Identifier, где нужно указать идентификатор пакета, от которого будет разрешено принимать файлы. Идентификатор представляет собой длинное шестнадцатеричное число вроде {CF94A366-13024366-A037-A59FAFF6D400}. Вряд ли кто станет запоминать подобные идентификаторы, тем более что можно воспользоваться браузером пакетов для выбора идентификатора нужного пакета. Открыть браузер можно с помощью кнопки Ч расположенной справа от поля Identifier. Прием файлов разрешается от любой версии указанного пакета. То есть даже если впоследствии в выбранный пакет будут внесены значительные изменения, прием файлов не будет нарушен; •
From version — в этом случае разрешается прием файлов только от конкретной версии указанного пакета. То есть при внесении даже незначительных изменений в пакет-отправитель прием файлов со стороны пакета-получателя выполняться не будет. Дело в том, что при внесении любых изменений для пакета генерируется новый идентификатор версии. Подобное строгое ограничение позволяет гарантировать, что вы принимаете именно те файлы, которые хотите. При внесении изменений в задачу Message Queue Task (например, в имя отправляемого файла) в пакетеотправителе прием сообщений будет нарушен. Идентификатор версии, от которой предполагается принимать файл, указывается в поле Identifier. Для просмотра списка доступных пакетов и их версий также можно воспользоваться браузером пакетов.
• Identifier. Поле становится доступным только при установке переключателя Only receive message from a specific package or version в положение From package или From version. Как уже было сказано, в поле Identifier указывается идентификатор пакета или конкретной версии, от которых будет разрешен прием файлов. • Remove from message queue. По умолчанию полученные данные сохраняются в очереди в структурах службы Message Queue Services. Это можно сравнить с хранением уже отправленных на печать заданий. Однако хранение множества больших файлов может привести к определенным проблемам, например, недостаче ресурсов. Во избежание подобных проблем можно выполнять удаление полученных файлов. Для этого достаточно всего-навсего установить рассматриваемый флажок. После успешного завершения выполнения задачи Message Queue Task из очереди будут удалены все обработанные сообщения. П Time out after. По умолчанию задача Message Queue Task ожидает неопределенное время получения данных от отправителя. В принципе, к моменту запуска задания в очереди уже могут находиться одно или более сообщений, которые и будут обработаны задачей. Тем не менее, когда очередь пуста, можно ограни-
446
Часть III. Администрирование
чить время ожидания получения сообщений, установив рассматриваемый флажок. В этом случае нужно будет указать количество секунд, в течение которого задача будет ожидать получения данных. Можно установить период ожидания от 1 до 9999 секунд. Если в течение указанного времени ни одно сообщение получено не будет, то задача заканчивается неудачно.
(
Замечание
)
Последние два элемента управления являются общими для всех трех типов принимаемых сообщений. Конфигурирование приема строк и глобальных переменных принципиальных отличий от рассмотренного конфигурирования приема файлов не имеет.
На этом конфигурирование задачи Message Queue Task можно считать рассмотренным.
Задача Transfer Error Messages Task При разработке больших профессиональных приложений активно используются определяемые пользователем сообщения об ошибках (user-defined error messages). Эти сообщения представляют удобный механизм контроля в ходе выполнения хранимых процедур, триггеров и пакетов. Когда осуществляется копирование хранимых процедур или триггеров, то вполне возможно, что они будут обращаться к пользовательским ошибкам. Однако на сервере, куда будут скопированы процедуры и триггеры, скорее всего используемых сообщений не будет существовать. При работе с SQL Server 7.0 пользователь должен был вручную создавать на сервере-получателе все необходимые сообщения об ошибках заново. Механизмы DTS SQL Server 2000 позволяют выполнять копирование сообщений об ошибках автоматически. Для этого предназначена задача Transfer Error Messages Task. Окно свойств задачи Transfer Error Messages Task имеет три вкладки. Первая из них — Source (рис. 11.74) — предназначена для указания имени исходного сервера, с которого будет производиться выкачивание имеющихся сообщений об ошибках. Как видно, на вкладке Source пользователь должен лишь выбрать с помощью раскрывающегося списка Source server имя нужного сервера и указать тип аутентификации, который будет использоваться для установления соединения с этим сервером. Ранее уже не раз было рассмотрено конфигурирование подключения в серверу, поэтому мы не будем лишний раз на этом останавливаться. Отметим, что задача Transfer Error Messages Task может работать не только с серверами SQL Server 2000, но и с серверами SQL Server 7.0. На вкладке Destination пользователь должен указать сервер, на который будет осуществляться закачка сообщений об ошибках с SQL Server, выбранного на вкладке Source. Состав и назначение элементов управления, имеющихся на вкладке Destination, полностью соответствует вкладке Source.
Глава 11. Доступ к гетерогенным источникам данных
447
Transfer Error Messages Source I Destination | Error Messages | >
J
To connect to an instance of SQL Server,you must specify the source server, user name, and password. Source server:
" 3 _ J
(* U se Vylndows N T Authentication <~ Use SQL Server Authentication User name: Password:
Cancel Рис. 11.74. Окно Transfer Error Messages, вкладка General
Интерес представляет вкладка Error Messages (рис. 11.75), с помощью которой можно ограничить диапазон копируемых сообщений, для чего используется переключатель Error Message Copy Option, который может быть установлен в одно из положений: • All error messages detected at package runtime. В этом случае будут пересылаться все сообщения, возникающие в ходе выполнения пакета. • Selected error messages. При установке переключателя в это положение можно сконфигурировать пересылку только определенных пользовательских сообщений об ошибках (user-definer error messages). Подобные сообщения генерируются не SQL Server 2000, а написанными пользователем хранимыми процедурами, триггерами, пакетами и т. д. Таким образом, пользователь может пересылать только те сообщения, которые свидетельствуют о конкретных сбоях в работе. В верхней части вкладки находится таблица User-defined error messages, которая становится доступной только при установке описанного выше переключателя в положение Selected error messages. В таблице содержится список всех пользовательских сообщений об ошибках, созданных на сервере, выбранном на вкладке Source. В колонке Error указывается номер сообщения. В этой же колонке содержится флажок, установка которого предписывает пересылать соответствующие сообщения об ошибках на сервер, выбранный на вкладке Destination. Для разрешения копирования всех сообщений (установки всех флажков) можно воспользоваться кнопкой Select All. Соответственно, для сброса всех флажков используется кнопка Clear All.
С
Замечание
Пользовательские сообщения начинаются с номера 50 000. Для создания нового сообщения предназначена системная хранимая процедура sp_addmessage. Список
448
Часть III. Администрирование сообщений, имеющихся на сервере, хранится в таблице sysmessages системной базы данных M a s t e r .
Transfer Error Messages Source j Destination Егюг Messages | User-defined error messages Error 50001 50002
! Severity 'Message ;Langua... ; Status 13 Test mess... 1033 Errot already exists Error already exists 13 1049 1 Test mess... 1033 Error already exists
Error Messages Copy Option f"\ All error messages detected at package runtime f* Selected error messages
OK
Cancel
Рис. 11.75. Окно Transfer Error Messages, вкладка Error Messages
В колонке Severity указывается уровень серьезности (seventy) соответствующей ошибки. Текст сообщения указывается в колонке Message. В колонке LanguagelD приводится идентификатор языка, на котором создано сообщение. Сообщение с одним и тем же номером может быть указано более одного раза, если используются разные языки. В колонке Status показывается информация о состоянии соответствующего сообщения об ошибке.
Замечание
D
Ошибками с уровнем серьезности меньше 19 могут управлять все пользователи, но только пользователь, обладающий правами системного администратора (system administrator), может управлять ошибками с уровнем серьезности с 19 по 25, которые являются фатальными для системы. На этом рассмотрение работы с задачей Transfer Error Messages Task можно считать оконченным.
Задача Transfer Databases Task В одном из предыдущих разделов мы рассматривали работу с задачей Copy SQL Server Objects Task, предназначенной для копирования объектов и информации между двумя базами данных SQL Server. Этот процесс копирования выполнялся в несколько этапов: •
генерирование сценария, с помощью которого были созданы выбранные для копирования объекты исходной базы данных;
Глава 11. Доступ к гетерогенным источникам данных
449
О выполнение на сервере-получателе сценария, сгенерированного на предыдущем этапе, что приводит к созданию всех объектов, выбранных для копирования; • копирование данных из таблиц источника в таблицы получателя. Как видно, задача Copy SQL Server Objects Task дублирует в базе данныхполучателе все действия, выполненные в свое время в базе данных-источнике. Однако копирование баз данных может быть выполнено и другими способами. В составе DTS имеется задача Transfer Databases Task, которая осуществляет копирование баз данных на уровне файлов базы данных, а не на уровне объектов, как это выполняет задача Copy SQL Server Objects Task. Окно свойств задачи Copy SQL Server Objects Task имеет четыре вкладки. Две первые из них имеют имена Source и Destination и предназначены, соответственно, для конфигурирования источника и получателя. Ранее уже не раз была рассмотрена работа с подобными вкладками, и поэтому мы не будем лишний раз останавливаться на этом, а перейдем сразу к вкладке Databases (рис. 11.76). 2<J
Transfer Databases Source Destination Databases File locations j Databases Move | Copy >Source: STOR|.D . estn i ato i n:ST0RAGE\TRELON
•
0 (|||ЗРЦРИ| Northwn id Arleady exists pubs Arleady exists distribution System database master System database model System database
_*_ —
Refresh Cancel Рис. 11.76. Окно Transfer Databases, вкладка Databases
Как видно, основное пространство на вкладке занимает таблица Databases, с помощью которой пользователь может выбрать для копирования одну или более баз данных с сервера-источника. Каждая база данных (включая системные), имеющаяся на сервере-источнике, представлена отдельной строкой. В колонке SourcerServerName указывается имя базы данных, тогда как в колонке Destination:ServerName отображается статус возможности копирования или переноса базы данных. Значение ОК свидетельствует о возможности копирования базы данных. Если на сервере-получателе существует база данных с именем, совпадающим с именем базы данных источника, то в соответствующей строке таблицы Databases в колонке DestinationrServerName будет указано Already exists.
Часть III. Администрирование
450
а в колонках Move и Сору будут отсутствовать флажки. Для системных баз данных будет указано System database, и также будут отсутствовать флажки в колонках Move и Сору. Таким образом, копирование системных баз данных с совпадающими именами будет невозможно. Задача Copy SQL Server Objects Task позволяет не только копировать, но и перемещать базы данных с одного сервера на другой. Перемещенная база данных после успешного копирования на получателя будет удалена с сервера-источника. Для копирования базы данных необходимо установить флажок в столбие Сору, тогда как для выполнения перемещения нужно установить флажок Move. Отметим, что для каждой базы данных возможна установка только одного из флажков. При попытке установки второго флажка первый автоматически сбрасывается. В нижней части вкладки расположена кнопка Refresh, с помощью которой можно обновить список баз данных сервера-источника. Как было сказано ранее, при работе с задачей Copy SQL Server Objects Task копирование базы данных выполняется на физическом уровне. То есть происходит копирование на сервер-получатель всех файлов, из которых состоит база данных, а затем выполняется присоединение (attach) скопированной базы данных. Таким образом, задача Copy SQL Server Objects Task оперирует лишь файлами базы данных. С помощью вкладки File locations (рис. 11.77) пользователь может внести некоторые изменения в процесс копирования файлов. В верхней части вкладки имеется таблица, с помощью которой можно оценить, какой объем дискового пространства потребуется для скопированных баз данных. В столбце Files указывается тип копируемых файлов. Возможны следующие варианты: • Data files — файлы с данными (имеют расширения mdf и ndf); П Log files — файлы журнала транзакций (имеют расширение ldf)Transfer Databases Source I Destination 1 Databases File locations Destination drives
I Size
(Status
1,00 MB Files ate ready to be moved or copied. Files on the source have the same name as on the destination or there is not enough free disk space on the destination. Click Modify to specify new file names and destinations. Modify... Refresh
I OK
Рис. 11.77. Окно Transfer Databases, вкладка File locations
Cancel
Глава 11. Доступ к гетерогенным источникам данных
451
В столбце Destinations drives указывается логический диск получателя, на котором предполагается сохранить копируемые файлы баз данных. Файлы базы данных будут размещены по адресу, указанному в полях Default data directory (файлы данных mdf и ndf) и Default log directory (файлы журнала транзакций ldf) на вкладке Database Settings окна свойств сервера. Работа со вкладкой Database Settings была описана в разд. "Вкладка Database Settings" главы 8. В столбце Size указывается объем дискового пространства, который потребуется для хранения файлов на соответствующем диске. Если места на диске, приведенном в столбце Destinations drives, меньше чем указано в столбце Size, то в колонке Status будет выведен красный крестик. Если места достаточно, то будет выведена галочка. В случае, когда места на диске не хватает, можно попробовать освободить дополнительное пространство, удалив ненужные файлы или перенеся часть файлов на другой диск. Для получения новой информации об объеме дискового пространства необходимо нажать кнопку Refresh. Другим способом решения проблемы с нехваткой пространства на диске является перенос части файлов баз данных на другой диск. Эта операция выполняется с помощью окна Database files (рис. 11.78), открыть которое можно с помощью кнопки Modify. § Database Files •J Specify the location of the database files. Database Bonus Bonus
Source Files jSize ; Destination •Status 3onus Data... 1,0... GAProgram FilesNMicrosoft SQL Server\MSSQLi..JOK Bonus_Log.LDF 1,0... -•-• GAProgram Files\Microsoft SQL ServerSMSSQ >L. OK
Status
Name conflict: Type a new name into the Source Files fields Disk space: Change the destination or free disk space Drive iAvailable Space I Required Space c"
D E
125,00 MB 0,00 MB 0,00 MB 0,00 MB
OK
Refresh
Cancel
Рис. 11.78. Окно Database files
Окно Database files разделено на две части. В нижней части находится таблица, с помощью которой можно получить сведения об объеме доступного простран-
452
Часть III. Администрирование
ства на каждом из локальных дисков, а также узнать, сколько места требуется на каждом из них для размещения файлов копируемых баз данных. Имя диска отображается в колонке Drive, тогда как объем свободного и необходимого пространства отображается, соответственно, в колонках Available Space и Required Space. Для обновления значений в двух последних колонках можно использовать кнопку Refresh. С помощью таблицы, расположенной в верхней части окна, можно изменять местоположение файлов баз данных. В таблице приведена информация о файлах всех баз данных, предназначенных для копирования или переноса. Каждая строка соответствует одному из файлов какой-нибудь базы данных. В колонке Database указывается имя базы данных, которой принадлежит соответствующий файл. Собственно имя файла, которое будет ему присвоено на сервере-получателе после копирования, отображается в колонке Source Files. По умолчанию предлагается то же имя, что имел файл на сервере-источнике, однако пользователь может задать любое другое. Каталог, в который будет помещен файл, указывается в колонке Destination. При необходимости, пользователь может определить для хранения файла любой другой каталог или диск, чем предлагаемые по умолчанию. Можно ввести информацию либо вручную, либо с помощью окна CDW (рис. 11.79), открыть которое можно, щелкнув по серой кнопке в левой части поля Destination.
! !+;-О YAMAHA : it' £3 Мои документы - u J D:\ (125 MB free)
! В I \ ; !
:
CJ MSSQL7 * Ш BACKUP + _J Binn v _J Books
i+i £ j DevTools | + _J FTDATA > _J HTML S Cj Install : +: •_! JOBS ! ffl D LOG i + _J REPLDATA : IB CO Upgrade
zl
File name:
Bonus_Data.MDF
Selected file:
D:\MSSQL7\Data\Bonus Data.MDF
OK
Cancel Рис. 11.79. Окно CDW
Размер соответствующего файла отображается в колонке Size. С помощью колонки Status можно получить информацию о возможности копирования файла под заданным именем в указанный каталог. Если в колонке для файла содержится красный крестик, то либо на выбранном диске не хватает пространства,
Глава 11. Доступ к гетерогенным источникам данных
453
либо в указанном каталоге уже имеется файл с именем, приведенным в колонке Source Files. На этом работа с окном Database files заканчивается. После нажатия кнопки ОК пользователь снова попадет на вкладку File locations окна Transfer Database Task Properties (см. рис. 11.77). После того, как в столбце Status на вкладке File, locations во всех строках появится зеленая галочка, конфигурирование всей задачи можно считать законченным. Остается только нажать кнопку ОК.
Задача Transfer Master Stored Procedures Task Рассматриваемая задача используется для копирования хранимых процедур с главного сервера (master server) на другие серверы. Конфигурирование этой задачи практически не отличается от конфигурирования задачи Transfer Error Messages Task. Окно свойств задачи Transfer Master Stored Procedures Task (рис. 11.80) имеет три вкладки. Конфигурирование вкладок Source и Destination не представляет особых затруднений. Интерес вызывает вкладка Stored Procedures, с помощью которой пользователь может ограничить список копируемых хранимых процедур. Это выполняется точно так же, как и ограничение списка копируемых сообщений при работе с задачей Transfer Error Messages Task. JSl
Transfer Master Stored Procedures Source j Destination Stored Procedures Stored procedures Source objects
iOwner name .1 Type
: Destination
Stored Procedures Copy Option (* j£i ! at package runtime £"" Selected stored procedures OK
Cancel
Рис. 11.80. Окно Transfer Master Stored Procedures
Задача Transfer Jobs Task С помощью задачи Transfer Jobs Task можно копировать задания SQLSei'verAgent между серверами SQL Server. Как и для предыдущей задачи, окно свойств задачи Transfer Jobs Task имеет три вкладки, и первые две из них используются для конфигурирования источника и получателя заданий. Сразу же перейдем к рас-
454
Часть III. Администрирование
смотрению вкладки Jobs (рис. 11.81), т. к. работа с двумя другими вкладками рассматривалась уже не раз. 2<J Transfer Msdb Jobs Source] Destination Jobs | Jhe selected jobs from msdb are disabled on the destination server until you enable them. i Destination OK OK OK
IType Source Hi 999 backup Jobs vj New Package Jobs Ж TSQL Job 1
Jobs
-Jobs Copy Option
-
••-
Select All
С All jobs detected at package runtime <•" Sejected jobs
Clear All OK
Cancel
Рис. 11.81. Окно свойств задачи Transfer Jobs Task
С помощью переключателя Jobs Copy Option можно разрешить либо копирование всех заданий, либо только выборочных: • All jobs detected at package runtime. Будут скопированы все задания, обнаруженные в момент выполнения пакета. • Selected jobs. Будет выполняться копирование только определенных заданий. Выбор заданий для копирования осуществляется с помощью таблицы, расположенной в верхней части вкладки. Эта таблица становится доступной только при установке переключателя в рассматриваемое положение. Каждое задание, имеющееся на сервере-источнике, представлено отдельной строкой. Отмечая флажок в колонке Source, вы тем самым предписываете скопировать соответствующее задание. После того, как будет определен список копируемых заданий, конфигурирование задачи Transfer Jobs Task можно считать оконченным.
Задача Transfer Logins Task Если вы интенсивно используете копирование объектов, то наверняка вам потребуется продублировать не только объекты, но и информацию системы безопасности, а именно, учетные записи и пользователей баз данных. Без копирования этой информации, скорее всего, вам придется вручную создавать на сервереполучателе все необходимые учетные записи и пользователей базы данных. В некоторых случаях требуется обязательный перенос пользователей базы данных, поскольку без этой процедуры невозможно будет перенести объекты самой базы данных, принадлежащие соответствующим пользователям.
Глава 11, Доступ к гетерогенным источникам данных
455
При выполнении копирования баз данных с помощью задачи Transfer Database Task автоматически будет перенесена вся информация о пользователях, созданных в копируемых базах данных. Однако, эти пользователи должны быть связаны с учетными записями. Связывание выполняется на основе идентификатора безопасности (SID, security ID) учетной записи. Однако задача Transfer Database Task не копирует учетные записи. То есть вполне может оказаться, что хотя в базе данных и будут существовать пользователи, реально они работать не будут, т. к. связь с учетными записями окажется нарушенной. Для избежания подобных проблем следует дополнительно выполнить и копирование учетных записей. Мы рассмотрели лишь один вариант, когда требуется скопировать учетные записи с одного сервера на другой. Однако легко можно привести еще несколько примеров. Копирование учетных записей можно выполнить с помощью задачи Transfer Logins Task. При работе с SQL Server 7.0 администратор должен был выполнять эту работу вручную, что заметно усложняло его жизнь. Окно свойств задачи Transfer Logins Task имеет три вкладки: Source, Destination и Logins. Работа с первыми двумя вкладками уже не раз рассматривалась, и поэтому мы сразу перейдем к вкладке Logins (рис. 11.82). Transfer Logins Properties Source j Destination Logins |
x|
databases Databases [J Plbs 0 Chair Wi Boms • Northvvind • Logins Copy Option
i
С All server logins detected at package runtime (* Logins for selected databases
OK
Cancel
Рис. 11.82. Окно свойств задачи Transfer Logins Task
Вкладка Logins предназначена для управления диапазоном копируемых учетных записей и пользователей базы данных. По умолчанию предлагается скопировать все учетные записи, которые будут обнаружены на сервере в момент выполнения задачи (переключатель Logins Copy Option установлен в положение All server logins detected at package runtime). Если же необходимо скопировать лишь учетные записи, имеющие отображение в конкретную базу данных, то указанный переключатель должен быть установлен в положение Logins for selected databases. В этом случае становится доступной таблица в верхней части вкладки. Каждая строка данной таблицы соответствует одной из баз данных, имеющихся на сервере-источнике, т. е. на сервере, указанном на вкладке Source. Установка
456
Часть III. Администрирование
флажка в левой части строки предписывает скопировать учетные записи, отображаемые в пользователей соответствующей базы данных. С помощью кнопок Select All и Clear All можно, соответственно, установить и сбросить флажки для всех баз данных. После того, как будут выбраны все базы данных, конфигурирование задачи Transfer Logins Task заканчивается.
Задача Dynamic Properties Task К настоящему моменту уже стало ясно, что пакет DTS представляет собой довольно сложный объект, имеющий множество свойств. Более того, все соединения и задачи, определенные в пакете и являющиеся его частью, еще более утяжеляют этот набор свойств и методов. При конфигурировании пакета с помощью DTS Designer пользователь может изменять любые свойства как самого пакета, так и входящих в него соединений и задач. Однако, иногда требуется изменять некоторые свойства в ходе выполнения пакета. При работе с SQL Server 7.0 это было довольно сложно и связано с определенными проблемами. В SQL Server 2000 управление свойствами пакета в ходе выполнения осуществляется довольно легко с помощью задачи Dynamic Properties Task. Эта задача была специально разработана для легкого изменения свойств пакета в ходе его выполнения. Более того, используя отношения предшествования, можно по разному изменять свойства в зависимости от результата выполнения той или иной задачи. Dynamic Properties Task Properties General You can change package properties at runtm i e with values from an . m i i file, query result set, global variable, envrionment variable, data file 01 constant. Description: I Dynamc i Properties Task: undefined Change list: Destination Property! Source Type (Sou rce Value Constant Value IN1 3uery FristRow SELECT TOP 1 title FROM pubs..titles SortedData N1 File DrvieS ummayi
i Add..
£dit..
OK
Cancel
Delete
Help
Рис. 11.83. Окно свойств задачи Dynamic Properties Task
Глава 11. Доступ к гетерогенным источникам данных
457
Как видно, окно свойств задачи (рис. 11.83) состоит из одной вкладки и является довольно простым. В верхней части окна расположено поле Description для указания имени, по которому конфигурируемая задача будет идентифицироваться в пакете. Это имя должно быть уникальным в пределах пакета. Основное пространство в окне занимает таблица Change list, содержащая все свойства, которые будут изменяться конфигурируемой задачей. По умолчанию таблица пуста. Для добавления новой строки (т. е. для конфигурирования изменения того или иного свойства), требуется нажать кнопку Add. В ответ откроется окно Dynamic Properties TaskrPackage Properties (рис. 11.84). _*]
Dynamic Properties Task: Package Properties Select a property in the list to be dynamicaly set and then hit the Set button
El
Connections | £ | Microsoft OLE DB Provider for SQL Server ;+; ^ OLE DB Properties ; § t | Microsoft OLE DB Provider for SQL Server ffi 4«3 OLE DB Properties •0 Microsoft Excel 97-2000 Ш ° Й OLE DB Properties Tasks У Steps Global Variables
A
Default Value
Property Name 1
Й AutoComm (Transaction
-1
Eff1 Description Of1 E wplicitG lobar/ariables
DTS package description
П51 FailOnError
0
Й? FailPackageOnLogFailure
0
S'LineageOplions
0
0
Eg? LogFileName Й? LogServerFlags
0
(S? LogServerName Ё? LogServerPassword OS LogServerUserNarne f S LogToSQLServer
0
Й* MaxConcurrentSteps
4
ESP PackagePriorityClass Й 1 PackageType
2 0 0 40Э6
Й* RepositoryMetadataOptions OS1 TransactionlsolationLevel
iL
__
w
|
JjJ
Г" Leave this dialog box open after adding a setting
Set... •
1 i «
CJose
Help
Рис. 11.84. Окно Dynamic Properties Task:Package Properties
В окне Dynamic Properties TaskrPackage Properties перечислены все свойства, используемые в работе пакета. Помимо свойств собственно пакета, в окне также приводится список свойств всех соединений, задач, отношений предшествования и глобальные переменные, определенные в пакете. Как видно из рисунка, окно разделено на две части. В левой части отображается иерархия объектов пакета. Корнем является собственно пакет. На втором уровне иерархии присутствуют следующие объекты: • Connections. Этот контейнер содержит список всех соединений, определенных в пакете. Собственно объект Connections не имеет никаких свойств. Однако, открыв его, можно получить доступ к свойствам соединений.
Часть III. Администрирование
458 • Tasks содержит список всех задач.
П Steps включает список отношений предшествования, определенных в пакете. П Global Variables содержит список всех глобальных переменных, имеющихся в пакете.
С
Замечание
С помощью окна Dynamic Properties Task:Package Properties нельзя ни удалить объект, ни создать новый. Пользователь может лишь выбрать одно из имеющихся свойств и указать для него значение, которое должно быть присвоено выбранному свойству при выполнении конфигурируемой задачи.
В правой части окна отображается набор свойств объекта, выбранного в левой части окна. Информация о свойствах выводится в виде таблицы, имеющей колонки Property Name и Default Value. Первая из них содержит имя свойства, тогда как во второй выводится значение этого свойства, присвоенное по умолчанию. Каждая строка таблицы соответствует отдельному свойству объекта. Пользователь не имеет права изменять набор свойств, а может только изменять их значения. Для присвоения свойству нового значения необходимо выбрать его в правой части окна и нажать кнопку Set (или просто дважды щелкнуть на имени нужного свойства). В ответ откроется окно Add/Edit Assignment (рис. 11.85). В помощью этого окна пользователь должен указать значение, которое будет присвоено соответствующему свойству в ходе выполнения конфигурируемой задачи. Add/Edit Assignment —« A property can be assignedtoa value from an .mi file, query, [Щ
global, environment variable, data file or constant. Choose the type of source and provide the necessary information.
j==| Source:
INI File
г-Source information File:
|CAWN l 95\cdMMAND\SCANDS I K.N iI Г
Section:
CUSTOM
Preview:
(Always
; Never, Always, Prc
OK
Cancel
Refresh
Hep l
Рис. 11.85. Окно Add/Edit Assignment для присвоения значений на основе INI-файлов
Глава 11. Доступ к гетерогенным источникам данных
459
С помощью списка Source пользователь должен выбрать способ получения значения, которое будет присвоено соответствующему свойству. В зависимости от того, какой способ выбран, меняется набор элементов управления в группе Source information. В распоряжении пользователя имеются следующие способы: П INI File используется для присвоения значений на основе INI-файлов (см. рис. 11.85). При выборе этого способа получения значений для присвоения, пользователь должен указать имя и путь к INI-файлу (поле File), из которого должно быть извлечено значение для конфигурируемого свойства. Помимо собственно имени файла, необходимо определить секцию (список Section) и ключ (список Key), в котором находится нужное значение. Указанные списки автоматически обновляются при выборе файла. В поле Preview отображается значение, которое содержится по указанному адресу. Данное значение и будет присвоено соответствующему свойству. С помощью кнопки Refresh можно обновить информацию в поле Preview. Add/Edit Assignment: i e assignedtoa value from an .ini file, query, rgry A property can b [3J global, environment variable, data file or constant. Choose the type of source and provide the necessary information. .Source:
Query
Source information Connection:
[Microsoft OLE DB Provider for SQL Serv T |
fluery: SELECT TOP 1
type
FROM titles
III
iL Parse business.log OK
Browse... |j Refresh j|
Cancel
Help
Рис. 11.86. Окно Add/Edit Assignment для присвоения значений на основе запроса
Query. При выборе этого пункта окно примет вид, подобный приведенному на рис. 11.86. В этом случае значение для присвоения получается в результате выполнения обычного запроса Transact-SQL. При конфигурировании запроса в первую очередь необходимо в раскрывающемся списке Connection выбрать имя одного из источников данных, определенных в пакете. В контексте этого источника и будет выполняться запрос. Собственно код запроса указывается в поле Query. Пользователь может ввести код либо вручную, либо подгрузить готовый с диска, воспользовавшись кнопкой Browse. К сожалению, генерирование запроса с помощью построителя запросов Query Builder не реализовано. Нажав кнопку Parse, можно проверить синтаксис
Часть III. Администрирование
460
введенного запроса. Запрос должен возвращать единственное значение, т. е. результат выборки должен состоять из одного столбца и одной строки. Если запрос возвращает лишние данные, то они будут проигнорированы. В поле Preview отображается значение, возвращаемое запросом. Значение в этом поле не обновляется автоматически при внесении изменений в запрос. Пользователь должен принудительно обновлять значение с помощью кнопки Refresh всякий раз, когда он модифицирует запрос. • Global Variable. В этом случае свойству будет присваиваться значение глобальной переменной. Окно Add/Edit Assignment примет вид, подобный приведенному на рис. 11.87. При конфигурировании присвоения пользователь должен всего-навсего задать имя интересующей переменной в раскрывающемся списке Variable, который содержит список всех определенных в пакете глобальных переменных. В поле Preview отображается значение, которое присвоено выбранной переменной по умолчанию. В ходе выполнения задач пакета это значение может изменяться. Add/Edit Assignment psC A property can be assigned to a value from an .ini file, query, \\Щ global, environment variable, data file or constant. Choose the type of source and provide the necessary information.
Щл Source:
Global Variable
Source information Variable: Refresh
Preview:
Create Global Variables..
OK
Cancel
Help
Рис. 11.87. Окно Add/Edit Assignment для присвоения значений на основе Global Variable
О Environment Variable. Этот пункт применяется, когда необходимо присвоить свойству значение, хранящееся в переменной окружения операционной системы. Использование переменных окружения является, по всей видимости, простейшим способом обмена информацией между утилитами командной строки (или любым приложением Win32) и пакетом DTS. В одном из предыдущих разделов была описана работа с задачей Execute Process Task, с помощью которой можно запускать на выполнение обычные приложения операционной системы. Эти приложения могут изменять значения переменных окружения, чтобы передать в пакет DTS какую-то информацию. При выборе
Глава 11. Доступ к гетерогенным источникам данных
461
в списке Source пункта Environment Variable окно Add/Edit Assignment примет вид, подобный приведенному на рис. П.88. В раскрывающемся списке Variable будут перечислены все переменные окружения, доступные на момент конфигурирования. В поле Preview отображается значение соответствующей переменной окружения. Замечание Просмотреть список переменных окружения, а также их значения, можно с помощью команды S E T , выполнив ее в командной строке. С помощью этой же команды можно создать новую переменную или присвоить значение существующей.
Add/Edit Assignment ^ A property can be assigned to a value from an .ini file, query, pBj global, environment variable, data file or constant. Choose the type of source and provide the necessary information. Source:
[Environment Variable r Source information j Variable: IcOMPUTERNAME i Preview: STORAGE
OK
Cancel
jjeiresh
Help
Рис. 11.88. Окно Add/Edit Assignment для присвоения значений на основе Environment Variable
П Constant. Данный пункт выбирается, когда необходимо присвоить свойству конкретное значение, заданное константой. Окно Add/Edit Assignment имеет вид, как на рис. 11.89. В поле Constant пользователь должен указать значение, которое необходимо присвоить свойству. Дополнительно пользователь может выбрать значение одной из констант пакета, воспользовавшись окном Select Enumeration Value (рис. 11.90). Это окно можно открыть с помощью кнопки Select. П Data File. Этот пункт используется, если необходимо присвоить свойству содержимое одного из файлов. Например, можно присвоить глобальной переменной пакета содержимое текстового файла и вставить его в столбец таблицы. При выборе рассматриваемого пункта окно Add/Edit Assignment будет иметь вид, как на рис. 11.91. Пользователь должен будет указать в поле File имя файла, содержимое которого необходимо присвоить свойству пакета.
Часть III. Администрирование
462
Это содержимое будет отображено в поле Preview. Если в файл были внесены изменения, то обновить поле можно с помощью кнопки Refresh. Add/Edit Assignment "г*с A property can be assigned to a value from an .ini file, query, Ц ] global, environment variable, data file or constant. Choose the type of source and provide the necessary information. $iQL Source:
Constant
Source information Constant: 'D ЛМ S S Q LALO G \package. log'
u Select.. OK
Cancel
Рис. 11.89. Окно Add/Edit Assignment для присвоения значений на основе Constant
Help
J*J The below table lists the constants and their corresponding values for most enumerations within DTS. Select any one constant by double clicking on it.
Constants:
[Value
Constant Name
DTSStepE xecS tat_Waiting D T S S tepE xecS tatj nProgress 2 D T S S tepE xecS tat_l nactive 3 D T S S tepE xecS tat_Cornpleted 4 D T S S tepE xecR esult_S uccess 0 DT SS tepE xecResult_Failure 1 D T S S tepS criptR esult_E xecuteT ask 0 DTSStRnFlrrintRftSul nnntFxftrulfiT с 1 OK
Cancel
zl Help
Рис. 11.90. Окно Select Enumeration Value
Каждое изменяемое свойство отображается отдельной строкой в окне Dynamic Properties Task:Package Properties (см. рис. 11.84). После того, как будут указаны значения для всех свойств, которые необходимо изменить, конфигурирование задачи Dynamic Properties Task заканчивается. Мы не будем рассматривать варианты использования этой задачи, т. к. их очень большое количество, а оставим это на самостоятельное изучение пользователя.
Глава 11. Доступ к гетерогенным источникам данных
463
2£] Add/Edit Assignment A property can be assigned to a value from an . ini file, query, global, environment variable, data file or constant. Choose the type of source and provide the necessary information.
l§ji Source:
Data File
- Source information JCAProgiram Files\Far\License.txt File:
• T he F A R man agerF s iRsha ae rrwae re.xc T h s il m en ae n s: byh 1E .•u A l c o p g y i r h s t o t A e u l s v i e y o w d te au h tor gene Rosha .l 2F .olw A n yoneh m a ye use h tsiofso w t4 f0ae rdad u nirgoraelse tss tifpy e o ird o fh 40 days l n i g t s i t s t p e o i r d y s , o u w s i «J ' | Re rfsh el Cancel Hp
Preview:
Рис. 1 1 . 9 1 . Окно Add/Edit Assignment
Отношения предшествования В предыдущих разделах были описаны задачи, которые может применять пользователь при создании пакета DTS. Задачи, имеющиеся в пакете, могут выполняться либо независимо друг от друга, либо в определенной последовательности. В первом случае работа каждой из задач начинается в момент запуска пакета. Когда будет закончено выполнение последней задачи, работа всего пакета DTS будет завершена. Однако, подобный подход используется лишь при работе с простыми пакетами, содержащими 1—3 задачи. При создании больших пакетов, включающих множество задач, скорее всего, вам потребуется выполнять задачи в определенной последовательности. Например, если в задаче Data Driven Query Task применяется параметризированный запрос, то перед выполнением этой задачи необходимо присвоить значение глобальным переменным, которые отображаются в параметры запроса. Этим переменным могут быть присвоены значения переменных окружения операционной системы, которые изменяются при выполнении пакетного файла. Таким образом, выстраивается следующая цепочка: 1. Запускается задача Execute Process Task, с помощью которой выполняется пакетный файл (bat). Этот файл изменяет значения переменных окружения операционной системы в зависимости от тех или иных обстоятельств. 2. Запускается задача Dynamic Properties Task, которая осуществляет присваивание глобальной переменной значения переменной окружения. 3. Запускается задача Data Driven Query Task, в которой выполняется параметризированный запрос, использующий в качестве параметра значение глобальной переменной пакета. 16 Зак. 83
464
Часть III. Администрирование
Приведенный пример показывает, что в некоторых случаях необходимо обеспечить строгую последовательность выполнения задач пакета. Это требование может быть реализовано с помощью отношений предшествования, определяющих порядок выполнения задач в пакете. Отношение предшествования устанавливается между двумя задачами. Для описания отношений предшествования будем предполагать, что существуют задачи TaskA и TaskB и между ними определено отношение предшествования, причем задача TaskA запускается первой и от результата ее выполнения будет зависеть, станет ли работать задача TaskB. В распоряжении пользователя имются следующие отношения предшествования: • Безусловное (Unconditional) означает безусловное выполнение одной задачи после завершения другой. То есть задача TaskB будет выполнена всегда, независимо от результата завершения задачи TaskA. Этот тип отношения предшествования используется, когда необходимо обязательно выполнить две задачи, но в определенном порядке. • Успешное (On Success). При использовании отношения предшествования данного типа задача TaskB будет выполнена только в том случае, когда задача TaskA успешно завершена. Это ограничение предшествования может применяться, например, когда задача TaskA выполняет удаление таблицы, а задача TaskB — ее повторное создание. Таким образом, если таблица не будет удалена, то система не станет пытаться ее создать, т. к. эта операция сразу же обречена на неудачу. П Неудачное (On Failure). Это отношение предшествования используется, когда необходимо выполнить задачу TaskB в случае неудачного завершения задачи TaskA. Развивая предыдущий пример, в случае невозможности удаления таблицы можно выполнить задачу, которая удаляет все строки и соответствующим образом изменяет структуру таблицы. Для определения отношения предшествования необходимо выбрать две задачи. Причем от результата выполнения первой выбранной задачи будет зависеть, выполнится ли вторая. После того, как задачи будут выбраны, остается только указать в меню Workflow нужный тип отношения предшествования. Можно также воспользоваться контекстным меню, выбрав в нем команду Workflow. Замечание Хотя и сказано, что необходимо выбрать две задачи, тем не менее, пользователь может определить и большее количество. В этом случае от результата выполнения первой выделенной задачи будет зависеть возможность выполнения всех остальных задач. После выбора нужного типа отношения предшествования соответствующие задачи окажутся соединенными линией. Причем со стороны подчиненной задачи линия будет иметь вид стрелки. В зависимости от используемого типа отношения предшествования меняется и цвет линии — On Completion отображается синим цветом, On Success — зеленым, On Failure — красным.
Глава 11. Доступ к гетерогенным источникам данных
465
Каждое отношение предшествования имеет определенные свойства. Если дважды щелкнуть на соответствующей соединительной линии, изображающей отношение предшествования, то откроется окно свойств этого отношения предшествования (рис. 11.92). Workflow Properties Precedence
Add, remove, or modify any of the precedence constraints below. Precedences: [Source Step S Precedence Copy SQL Server Objects Failure
i D estination S tep Send Mail Task: undedne
<none> Completion Success
JNJew OK
Cancel
Delete Help
Рис. 11.92. Окно Workflow Properties
Сохранение пакета Когда все необходимые источники данных, задачи и отношения предшествования будут определены, остается только сохранить созданный пакет. Для этого достаточно нажать кнопку Save на панели инструментов или выбрать аналогичную команду в меню Package. При сохранении подобным образом только что созданного пакета будет выдано окно Save DTS Package (рис. П.93), с помощью которого необходимо указать некоторые параметры сохранения пакета. Если вы редактировали пакет и сохраняете его указанным способом, то окно Save DTS Package не появляется, и пакет сохраняется со свойствами, указанными ранее. Однако, можно сохранить редактируемый пакет и с новыми свойствами (например, под другим именем), воспользовавшись командой Save as в меню Package. Окно содержит ряд элементов управления, с помощью которых и определяются свойства сохранения пакета: • Package name. В этом поле указывается имя, под которым будет сохранен пакет. Имя должно быть уникально в пределах хранилища, в которое записывается пакет.
466
Часть III. Администрирование
Save DTS Package You can save a DTS package to a SQL Server database, to Meta Data Services, to a structured storage file, or to a Visual Basic file. P
a
c
k
a
g
flwner
e
n a m e :
j
P
a
c
k
a
g
e
N
u
m
b
e
r
5
••
M a i n t e n a n c e
User password:
p a s s w o r d :
L o c a t i o n :
J
J
S
Q
L
S e r v e r
i о save to Microsort ЪЦ|_ usernarne, and password. T
o
s a v e
Server:
s e r v e r
t o
M i c r o s o f t
S
Q
L
S e r v e r
( L o c a l ] ,
[STORAGE
I*" pJse Windows NT Authentication!
y o u
m u s t
e n t e r
t h e
s e r v e r .
zl ;
С Use SQL Server Authentication
Г
г
O K
Cancel He p l
Рис. 11.93. Окно Save DTS Package
• Owner password. В этом поле задается пароль владельца пакета. Пользователь, знающий пароль владельца, может вносить в пакет произвольные изменения. Если пароль в этом поле не указан, то изменения в пакет может вносить любой пользователь. П User password. Указывается пользовательский пароль. Данный пароль должен вводиться всякий раз, когда пакет будет запускаться. Знание этого пароля дает пользователям возможность только выполнять пакет, но не изменять его. П Location. С помощью этого раскрывающегося списка выбирается тип хранилища, в котором будет сохранен пакет. В зависимости от того, какой тип хранилища выбран в списке Location, будет изменяться набор элементов управления в нижней части окна. Мы рассматриваем набор элементов, которые выводятся при выборе в качестве хранилища SQL Server. В принципе, для хранилища SQL Server Meta Data Services выводится примерно такой же набор элементов управления. В распоряжении пользователя имеются следующие хранилища: •
SQL Server — при выборе этого значения пакет будет сохранен в системной таблице sysdtspackages базы данных Msdb;
•
SQL Server Meta Data Services — в этом случае пакет хранится в структурах службы метаданных SQL Server, что позволяет отслеживать изменение пакета, его использование, потоки данных, которыми оперировал пакет, и некоторую другую информацию;
•
Structured Storage File — пакет будет сохранен в структурированном СОМ-файле;
• Visual Basic File — пакет будет сохранен в файле Visual Basic.
•
Глава 11. Доступ к гетерогенным источникам данных П Server. В раскрывающемся списке можно выбрать имя сервера SQL Server, на котором будет сохранен пакет. • Use Windows NT authentication. При установке переключателя в это положение для подключения к выбранному в списке Server серверу будет использоваться аутентификация Windows NT. П Use SQL Server Authentication. В этом случае для сохранения пакета для подключения к серверу будет использоваться аутентификация SQL Server. В данной ситуации необходимо указать имя учетной записи (Username), которая будет участвовать в установлении соединения, а также пароль (Password) этой учетной записи. Мы рассмотрели вид окна Save DTS Package (рис. 11.93), который оно имеет, когда пакет сохраняется в базе данных SQL Server или в структурах службы метаданных SQL Server. При сохранении пакета в структурированном СОМ-файле или в файле Visual Basic окно Save DTS Package будет иметь другие элементы управления. В частности, необходимо будет указать имя пакета, описание, а также имя файла, в котором будет сохранен пакет.
467
Глава 12
Автоматизация администрирования SQL Server 2000 Целью автоматизации администрирования любой системы в конечном счете является снижение ее стоимости владения (ТСО, Total Cost of Ownership). В данную характеристику входит не только стоимость аппаратного и программного обеспечения, но и затраты на ее обслуживание. Причем необходимо заметить, что стоимость аппаратной части составляет всего около 10—15% общей стоимости системы. Сокращение стоимости владения происходит за счет того, что часть работы администраторов перекладывается на саму систему. В итоге организация может позволить себе сократить штат персонала или использовать их усилия для решения более сложных и объемных задач. Даже в небольших организациях найдется ряд задач, решение которых носит чисто технический характер и может быть представлено в виде последовательности шагов, например, создание резервной копии базы данных или обновление индексов. Для решения этих проблем не требуется использовать какую-то логику — это чисто механический процесс. Конечно, автоматизация подобных задач не всегда дает ощутимый результат, но, тем не менее, бывает весьма полезна. Когда же речь заходит о больших организациях, например о транснациональных корпорациях, состоящих из множества отделений и использующих большое число серверов баз данных, то отдача от автоматизации администрирования может составлять десятки, а то и сотни тысяч долларов. Любой здравомыслящий руководитель использует любую возможность сократить расходы своей организации. При выборе конкретного продукта в качестве системы управления базами данных следует обращать внимание не только на цену, но и учесть, в какую сумму обойдется владение конечной системой. Сэкономив при покупке СУБД, можно затем потратить в несколько раз больше на поддержку и сопровождение этой системы. Система управления базами данных SQL Server 2000 является продуктом, имеющим лучшее соотношение цена-производительность. На первый взгляд может показаться, что SQL Server 2000 дороже, чем другие аналогичные продукты, но выгода от его использования может перекрыть разницу в цене в несколько раз. Конечно, для небольших организаций может и не понадобиться такая мощная "молотилка" данных, как SQL Server 2000, и они вполне смогут обойтись небольшими, более дешевыми продуктами, но для больших организаций SQL Server 2000 является наиболее выгодным продуктом.
Глава 12. Автоматизация администрирования SQL Server 2000
469
Архитектура системы автоматизации Одним из важнейших направлений корпорации Microsoft при создании современных продуктов является сведение к минимуму администрирования систем. Это направление заметно во всех современных продуктах: MS Windows 2000, Exchange Server 2000 и многих других. Не является исключением и SQL Server 2000. Разработчики данного продукта позаботились о создании мощных инструментов, способных облегчить работу администратора. Для этих же целей в архитектуру SQL Server 2000 были внесены и другие существенные изменения. Например, функции автоматического конфигурирования освобождают администратора от управления объемом оперативной памяти, выделяемой серверу. SQL Server 2000 периодически анализирует работу операционной системы и определяет, какой объем памяти необходимо выделить серверу баз данных, чтобы добиться наилучшей производительности всех запущенных приложений. В настоящей главе будет рассмотрена специализированная подсистема SQL Server 2000, предназначенная для автоматического выполнения задач и контроля за работой сервера. Основы автоматического администрирования были заложены еще в SQL Server 6.x, однако, только начиная с SQL Server 7.0, стало возможным полномасштабное автоматическое управление сервером. Подсистема автоматизации может решать не только простые одношаговые задачи, но и сложные, реализующие разветвленные алгоритмы. Кроме того, если в сети имеется несколько серверов SQL Server 2000, то подсистема администрирования может быть настроена таким образом, что одно задание будет автоматически выполняться на всех серверах сети. Фундаментом подсистемы автоматического администрирования SQL Server 2000 является служба SQLServerAgent. Она представляет собой дополнение к SQL Server 2000, и ее запуск необязателен. Если в вашей организации не используется автоматическое администрирование, то служба SQLServerAgent может быть остановлена для освобождения ресурсов операционной системы. Однако для работы подсистемы репликации необходим запуск указанной службы. Подсистема репликации автоматически создает набор вспомогательных задач, которые обеспечивают продолжительное функционирование серверов, освобождая ненужные ресурсы. В архитектуре подсистемы автоматизации SQL Server 2000 существуют следующие объекты: П Jobs — задания; • Alerts — оповещения; • Operators — операторы. Замечание Описание всех перечисленных объектов, созданных на локальном сервере, хранится в системной базе данных Msdb, которая используется только для работы службы
470
Часть III. Администрирование SQLServerAgent. Каждый раз при запуске этот агент анализирует содержимое базы данных Msdb и определяет, какие задания должны быть запущены.
Управление подсистемой автоматизации осуществляется с помощью Enterprise Manager. Если с помощью этой утилиты открыть дерево папок сервера, то среди них можно найти папку Management, в которой представлена служба SQLServerAgent. Если щелкнуть на значке [+] слева в строке службы, то в раскрывшейся папке можно увидеть объекты Alerts, Operators и Jobs. При выборе любого из них в левой панели Enterprise Manager в правой отобразится список созданных в системе объектов автоматизации администрирования. Рассмотрим более подробно назначение и использование каждого из объектов подсистемы автоматизации SQL Server 2000.
Задания Любая задача администрирования SQL Server 2000 может быть представлена в виде одного или более шагов, которые необходимо выполнить для ее решения. Задания (j°bs) представляют собой последовательный набор действий, которые нужно реализовать для решения той или иной задачи. Каждое задание состоит из одного или более шагов (steps). Шаг представляет собой минимальный набор действий, который может быть выполнен подсистемой автоматизации. В SQL Server 2000 существуют различные типы шагов, каждый из которых необходим для решения специализированных задач. Приведем эти типы. П Transact-SQL Scripts (TSQL). Шаги этого типа состоят из одной или более команд Transact-SQL, в т. ч. и вызовов хранимых процедур. Для выполнения таких шагов служба SQLServerAgent подключается к службе MSSQLServer и передает ей набор команд. П Operating System Command (CmdExec). Данный тип шагов используется для запуска утилит командной строки или приложений Windows. При выполнении шагов этого типа запускается командный процессор cmd.exe для Windows NT или command.com, если SQL Server 2000 работает под управлением Windows 95/98. П Replication. Это набор шагов, необходимый для управления работой подсистемы репликации. В него входят: •
Replication Snapshot — подготовка файлов моментальных снимков, файлов схемы и сценариев;
•
Queue Reader — чтение данных из очереди;
•
Replication Transaction-Log Reader — чтение журнала транзакций на издателе;
•
Replication Distributor — распространение данных подписчикам;
•
Replication Merge — выполнение сведения данных в одну копию. Замечание
Более подробно подсистема репликации данных будет рассмотрена в главе 14.
Глава 12. Автоматизация администрирования SQL Server 2000 • ActiveX Script. Шаги этого типа предназначены для выполнения действий, описанных на языках сценариев. В SQL Server 2000 автоматически поддерживаются языки VBScript и JavaScript. Кроме того, отдельно можно установить модули и для других языков, например для PerlScript. На каждом сервере SQL Server 2000 может быть создано множество заданий. В свою очередь, любое задание способно состоять из нескольких шагов, причем в одном задании могут комбинироваться шаги самых различных типов. Разнообразие типов шагов в SQL Server 2000 предоставляет администраторам громадные возможности гибкого управления автоматической работой сервера. При выполнении сложных многошаговых заданий существует вероятность, что один из шагов завершится неудачно. SQL Server 2000 позволяет контролировать такие сбои и соответствующим образом реагировать на них. Каждый шаг задания возвращает подсистеме автоматизации код завершения, на основе которого можно контролировать успешность выполнения этого шага. В случае успешного выполнения шага можно определить одну последовательность действий, а в случае неуспешного — другую. Когда все шаги определены и задание сконфигурировано, встает вопрос — а когда оно будет выполняться? Для каждого задания SQL Server 2000 позволяет определить одно или более расписаний (schedules), в соответствии с которыми будет определяться запуск этого задания. Задание может быть запущено не только в определенный администратором момент времени, но и во время наименьшей активности сервера, каждый раз при старте службы SQLServerAgent или единожды сразу же после создания. Кроме того, независимо от установленного расписания администратор может использовать ручной запуск (manual start) задания.
Оповещения SQL Server 2000 является сложной многофункциональной системой, состоящей из множества различных компонентов, каждый из которых влияет на работу системы в целом. Поэтому администратор должен периодически проверять их работу. Не всегда неправильное функционирование одного из компонентов ведет к отказу всей системы. В большинстве случаев происходит лишь снижение производительности работы сервера. Внешне система выглядит работоспособной, однако это впечатление обманчиво. Жалобы пользователей на слишком длительную обработку их запросов будут дополнительным свидетельством этого. Ко всему прочему, медленная обработка запросов влечет за собой увеличение времени блокирования объектов баз данных, что может помешать работе других пользователей с этими объектами. Кроме того, в этом случае повышается вероятность возникновения мертвых блокировок или тупиков (deadlocks) и других подобных проблем. Помимо неполадок в работе самого SQL Server 2000, проблемы могут возникнуть и в функционировании операционной системы. Другой тип проблем связан с нехваткой ресурсов. Простейший пример — недостаток свободного дискового пространства. Если на диске, содержащем базу данных тетров, закончилось место, то подключившиеся после этого пользователи не смогут выполнять слож-
471
472
Часть III. Администрирование
ные задачи обработки данных, требующие создания временных объектов. Нехватка места для роста любой базы данных (как системной, так и пользовательской) приведет к проблемам. Проблемы, возникающие в ходе эксплуатации SQL Server 2000, не ограничиваются приведенным списком. При желании он может быть с легкостью продолжен. Однако и на основе вышесказанного можно оценить объем работы по контролю за состоянием сервера и поддержанием его работы на должном уровне, возлагаемый на администратора. Весьма печально смотреть на администратора, только и делающего, что наблюдающего за параметрами работы системы. Его время и способности могли бы быть использованы для решения более полезных задач. SQL Server 2000 позволяет избавить администратора от "черной" работы по контролю за функционированием сервера, переложив ее на подсистему автоматизации администрирования. Для этого используются оповещения (alerts).
Замечание При создании оповещения необходимо указать событие, контролируемое им, и действия, которые должны быть выполнены. Оповещения представляют собой механизм, приводящий к выполнению запрограммированных администратором действий при наступлении в системе определенного события (event). Событие представляет собой конкретное состояние системы, которое необходимо контролировать администратору. В качестве события могут выступать ошибки в работе SQL Server 2000 или сбои в операционной системе. Кроме того, события могут быть сконфигурированы таким образом, что администратор сможет определить не только факт уже состоявшегося сбоя, но и предупредить его возникновение. Например, администратор может не дожидаться, когда закончится место на диске, и работа пользователей будет остановлена. Он может сконфигурировать наступление события в случае уменьшения свободного пространства на диске менее 10%. Получив сигнал о наступлении критического состояния системы, администратор может вовремя предпринять действия к его устранению, а не дожидаться краха системы.
(
Замечание
^
С помощью оповещений можно контролировать практически все аспекты работы SQL Server 2000, т. к. большая часть критических состояний сервера описана в виде ошибок, отображающихся в журнале приложений. Однако SQL Server 2000 позволяет также создавать администратору собственные описания ошибок, которые могут быть использованы для контроля работы пользователей и приложений с конкретной базы данных SQL Server 2000. Это возможно благодаря тому, что Transact-SQL дает возможность генерировать ошибки с произвольным номером.
Строго говоря, подсистема автоматизации сама не анализирует работу сервера — она использует данные, полученные от других средств анализа функционирования системы. Для отслеживания наступления контролируемых событий служба SQLServerAgent периодически просматривает журнал приложений (application log).
Глава 12. Автоматизация администрирования SQL Server 2000
473
Замечание Журнал приложений ведется на уровне операционной системы. В нем отображается работа всех приложений, запущенных на локальном компьютере. Журнал приложений можно просмотреть с помощью утилиты Event Viewer, поставляемой в комплекте с Windows NT и устанавливаемой по умолчанию. Эту утилиту можно найти, нажав кнопку Start (Пуск), а затем выбрав в меню Programs (Программы) команду Administrative Tools (Средства администрирования).
При создании оповещения необходимо указать состояние, в котором должна находиться система, чтобы SQL Server 2000 автоматически инициализировал оповещение. Состояние системы можно описать тремя способами: О Конкретная ошибка SQL Server 2000. Вызов оповещения происходит, если в журнале приложений встречается указанная ошибка. • Серьезность ошибки SQL Server 2000. Если уровень серьезности (severity level) ошибки равен указанному или превышает его, то оповещение будет вызвано. •
Показания счетчика Performance Monitor. Вызов оповещения происходит в зависимости от показаний счетчиков производительности SQL Server 2000, используемых в работе утилиты Performance Monitor.
Необходимо пояснить, что же такое серьезность ошибки. Каждая ошибка SQL Server 2000 сопоставляется какому-то событию. Не обязательно ошибка является сбоем системы. Иногда это может быть просто информационное сообщение о работе сервера, деятельности пользователя или что-то другое. Но для обобщения все эти сообщения принято называть ошибками. Чтобы как-то классифицировать последствия той или иной ошибки на работу системы, было введено понятие уровня серьезности. Уровни серьезности нумеруются с нуля. Чем выше уровень, тем больше неприятностей доставит ошибка. Приведем перечень уровней серьезности: • 000 — Information; • 001 — Miscellaneous System Information; • 002—006 — Reserved; • 007 — Notification: System Information; • 008 — Notification: User Intervention Required; • 009 — User Defined; • 010 — Information; • 011 — Specified Database Object Not Fount; D 012 - Unused; • 013 — User Transaction Syntax Error; G 014 — Insufficient Permission; • 015 — Syntax Error In SQL Statements; • 016 — Miscellaneous User Error;
474
Часть III. Администрирование
П 017 — Insufficient Resources; • 018 — NonFatal Internal Error Detected; G 019 — Fatal Error In Resource; О 020 — Fatal Error In Current Process; П 021 — Fatal Error In Database Process; П 022 — Fatal Error: Table Integrity Suspect; О 023 — Fatal Error: Database Integrity Suspect; • 024 — Fatal Error: Hardware Error; • 025 — Fatal Error. Замечание Ошибками с уровнем серьезности меньше 019 могут управлять все пользователи, но только пользователь, имеющий права системного администратора (system administrator), может отслеживать ошибки с уровнем серьезности с 019 по 025, которые являются фатальными для системы.
Если администратор установил контроль за наступлением какого-то события, создав оповещение, то в таблице s y s a i e r t s базы данных Msdb будет иметься соответствующая запись. Служба SQLServerAgent сравнивает данные из таблицы s y s a i e r t s с данными, полученными из журнала приложений. При нахождении совпадений служба выполняет действия, определенные администратором при создании оповещения. SQL Server 2000 позволяет гибко определять реакцию системы в случае наступления запрограммированного события. Администратор может выбрать один или более следующих типов реакции: П Выполнение задания (Execute job). Такая реакция системы на наступление событий позволяет предпринять конкретные шаги для устранения проблемы или для сведения к минимуму ущерба. При наступлении события будет выполнено задание (job), которое должно быть предварительно создано. Чтобы избежать ненужного запуска этого задания, можно указать прошедшую дату. Задание может действовать как на уровне SQL Server 2000, так и на уровне операционной системы. Например, если необходимо увеличить размер журнала транзакций, а места на диске нет, то эта проблема может быть решена двумя способами. Первый из них предполагает усечение (truncation) журнала транзакций и действует на уровне SQL Server 2000, тогда как второй предполагает удаление ненужных файлов с диска (работа на уровне операционной системы). • Извещение оператора (Operators notify). Если проблема не может быть решена автоматически с помощью задания, то необходимо информировать оператора (operator) о ее возникновении. Кроме того, даже если решение проблемы производится автоматически с помощью задания, то для подстраховки можно дополнительно отправить сообщение и оператору. Передача сообщений возможна тремя следующими способами:
Глава 12. Автоматизация администрирования SQL Server 2000 •
e-mail — в этом случае оператору посылается письмо по электронной почте по установленному адресу. Для реализации данной возможности необходимо соответствующим образом настроить систему электронной почты SQL Server;
•
pager — на пейджер оператора посылается текст сообщения об ошибке;
•
net send — сообщение о наступлении события посылается с помощью стандартной команды NET SEND В локальной сети. Замечание Сообщение может быть отправлено всеми тремя способами одновременно. Кроме того, можно установить отправку более одного сообщения.
D Перенаправление ошибок. (Message forwarding). Этот тип реакции применяется в организациях со множеством серверов SQL Server 2000. Если в организации работает единственный администратор, следящий за всеми серверами, то ему гораздо удобнее контролировать работу всех SQL Server 2000 централизованно, а не обслуживать каждый из них по отдельности. Это может быть реализовано с помощью перенаправления сообщения об ошибках. Сообщения из журнала приложения (application log) локального сервера будут копироваться в журнал приложений на удаленный компьютер. Просмотрев единственный журнал приложений, администратор может получить полную картину о работе всех серверов сети и в случае обнаружения сбоев принять лучшее решение. Как видно, SQL Server 2000 предоставляет большие возможности администратору как для обнаружения, так и для устранения неполадок в работе сервера. Грамотное применение предоставляемых возможностей позволяет более эффективно использовать потенциал администраторов. Более подробно конфигурирование оповещений будет рассмотрено далее в этой главе.
Операторы При описании оповещений мы уже упоминали операторов. В этом разделе именно им будет уделено все внимание. Оператор (operator) — это лицо, на которое возлагается ответственность за работу сервера и выполнение определенных задач по управлению им. Не следует путать оператора с администратором. Системный администратор имеет максимальные права по управлению работой SQL Server 2000, тогда как оператор имеет ограниченный набор прав, необходимых для выполнения круга задач, за которые он отвечает. Однако ничто не мешает использовать в качестве оператора системного администратора. Такой подход часто действует в небольших организациях, которые не могут позволить себе иметь отдельных людей для решения разных задач. Но в больших организациях требование к разделению обязанностей между обслуживающим персоналом часто бывает обязательным. Каждый человек должен отвечать за ограниченный набор административных задач, но решать их он должен на высоком профессиональном уровне быстро и оперативно. Например, сотрудники
475
476
Часть III. Администрирование
могут отвечать за выполнение резервного копирования, обеспечение целостности баз данных или следить за использованием дискового пространства. Каждый из операторов должен получать сообщения от системы автоматизации, относящиеся к его обязанностям. Сам по себе факт конфигурирования пользователя в качестве оператора не дает ему никаких дополнительных прав доступа. Оператор подсистемы автоматизации SQL Server 2000 лишь определяет способ информирования других сотрудников и то, в каких случаях следует отправлять им сообщения. Оператор никак не связан с учетными записями Windows NT или SQL Server 2000, а также с пользователями баз данных. В принципе, в качестве оператора может выступать человек, не имеющий никаких прав доступа к серверу. При создании оператора SQL Server 2000 не выполняет никаких проверок на права оператора, возлагая всю ответственность на администратора. Оператор будет получать сообщения, посылаемые системой автоматизации, однако для выполнения действий по устранению сбоев системы администратор должен явно предоставить ему необходимые права доступа, например, включив его в одну из встроенных ролей сервера или базы данных.
Управление подсистемой автоматизации SQL Server 2000 предоставляет богатый набор методов управления подсистемой автоматизации, различающихся по сложности и наглядности их использования. Рассмотрим эти способы. • Wizards (мастера). Пользователи, не имеющие достаточного опыта в управлении подсистемой автоматизации, могут прибегнуть к помощи специальных мастеров. Мастера облегчают задачи администрирования с точки зрения требующегося объема знаний, т. к. они снабжены большим количеством подсказок и работают в пошаговом режиме, что делает процесс управления интуитивно понятным. В SQL Server 2000 имеются следующие мастера: •
Create Alert Wizard — с помощью этого мастера можно создать оповещение;
•
Create Job Wizard — этот мастер предназначен для создания заданий;
•
Make Master Server Wizard — применяя данный мастер можно создать главный сервер;
•
Make Target Server Wizard — при помощи этого мастера создается сервер назначения. Замечание Как видно, мастера предоставляют возможность только для создания объектов администрирования. Последующее управление ими должно быть выполнено с помощью других средств администрирования, описываемых ниже. Кроме того, следует отметить, что последние два мастера применяются только при работе с многосерверными заданиями.
•
Enterprise Manager. С помощью этого стандартного инструмента можно выполнять любые действия по управлению подсистемой автоматизации адми-
Глава 12. Автоматизация администрирования SQL Server 2000 нистрирования: создание, изменение или удаление заданий, оповещений и операторов. Enterprise Manager предоставляет удобный графический интерфейс, интуитивно понятный любому пользователю. Объекты подсистемы автоматизации можно найти в папке Management, находящейся в корневом каталоге сервера панели Enterprise Manager. П Transact-SQL. Как уже было сказано, информация обо всех свойствах объектов подсистемы автоматизации хранится в системной базе данных Msdb. Если разрешить прямой доступ к системным данным, то пользователи смогут изменять свойства объектов непосредственно, не прибегая к дополнительным инструментам. Однако для выполнения подобных операций нужен очень высокий профессиональный опыт и знание структур данных объектов подсистемы администрирования. В SQL Server 2000 имеется набор специальных системных хранимых процедур, с помощью которых можно управлять подсистемой автоматизации администрирования.
С
Замечание
j
Microsoft не советует изменять или читать системные данные напрямую. Взамен настоятельно рекомендуется использовать специальные хранимые процедуры, в достатке имеющиеся в SQL Server 2000. Microsoft не гарантирует, что структура системных таблиц, типы данных колонок и их назначение останутся неизменными в последующих версиях. Хранимые процедуры обеспечивают совместимость приложений, написанных для SQL Server 2000, с последующими версиями этого продукта. Каждый из перечисленных методов имеет свои достоинства и недостатки. Выбор конкретного метода зависит от квалификации пользователя и способа создания объектов. Например, при создании объектов из пользовательских приложений применение мастеров невозможно и необходимо обратиться к хранимым процедурам.
Управление заданиями Рассмотрим конкретные методы управления заданиями SQL Server 2000. Самый простой способ создания задания заключается в использовании мастера Create Job Wizard. С его помощью даже пользователи, имеющие лишь поверхностные сведения о работе подсистемы администрирования, смогут создать функционирующее задание. Более опытным пользователям SQL Server 2000 можно рекомендовать утилиту Enterprise Manager. Этот инструмент предоставляет возможности не только создания, но также изменения и удаления заданий. Наконец, в этом разделе будет рассмотрена системная хранимая процедура s p a d d j o b , которая предназначена для добавления в систему нового задания.
Мастер Create Job Wizard Для создания задания можно использовать мастер Create Job Wizard. Основным его преимуществом является простота его использования. Главным же недостатком можно считать ограничение на количество шагов в задании. Мастер позволяет создать задание с единственным шагом. Кроме того, с его помощью можно
477
Часть III. Администрирование
478
определить только единственное расписание (schedule) запуска задания. Для создания сложных заданий с множеством разнотипных шагов с возможностью ветвления и множеством расписаний запуска необходимо применять хранимые процедуры или Enterprise Manager. Для запуска мастера создания нового задания в панели инструментов Enterprise Manager нужно нажать кнопку Run a wizard и в открывшемся диалоговом окне для папки Management выбрать пункт Create Job Wizard. После этого остается нажать кнопку ОК. Первое окно мастера содержит лишь общую вводную информацию о мастере и поэтому без особых сожалений может быть пропущено. Во втором окне (рис. 12.1) необходимо выбрать тип создаваемого задания. Create Job Wizard - STORAGE Select job command type Select the type of command that the job should run. This command wil belong to the first - and only • step in the job. When the job runs the outcome of the _command wil be saved in the Job History _ Select the type of command that the job should execute: **" T.rarrj t j _ i r m and f fiperating-systern shell command (for example, run a batch script or invoke an application) (* Active script (for example, VBScript or JavaScript)
Next >
Cancel
Рис. 1 2 . 1 . Второе окно мастера Create Job Wizard
Пользователь может выбрать следующие типы задания: • Transact-SQL command — набор команд и хранимых процедур Transact-SQL. П Operating-system shell command (for example, run a batch script or invoke an application) — команды и утилиты командной строки. • Active script (for example, VBScript or JavaScript) — сценарии, написанные на одном из языков создания сценариев (VBScript, JavaScript или PerlScript).
С
Замечание
В верхней части окна мастера приведена краткая информация о действиях, выполняемых в этом окне.
Глава 12. Автоматизация администрирования SQL Server 2000
479
Содержание третьего окна зависит от того, какой тип задания был выбран. В общем смысл действий, выполняемых в третьем окне, сводится к указанию команд, которые будут выполнены. На рис. 12.2 приведено третье окно мастера при выборе типа задания Transact-SQL command. Create Job Wizard - STORAGE Enter Transact-SQL Statement Select a database and type the statement or open a file containing the Transact-SQL statement for this job to execute. Database name:]Administrator Database
z\
Xransact-SQL DELETE FROM o l gtabe l statement: WHERE Status-•• oponrfei. AND Days: 10
Qpen. Parse I < Back Next>
Cancel
Рис. 12.2. Третье окно мастера Create Job Wizard
В раскрывающемся списке Database name нужно выбрать базу данных, к которой будет подключаться агент SQLServerAgent во время выполнения задания. При ссылке на объекты выбранной базы данных (БД) в имени этого объекта не нужно указывать имя базы данных. Для ссылки на объекты других баз данных имя БД надо указать. В поле Transact-SQL statement указывается набор команд Transact-SQL, которые будут решать поставленную задачу. Если уже имеется подготовленный код, то для его подключения нажмите кнопку Open. Кнопка Parse позволяет проверить правильность введенного кода. При этом анализируется не только написание зарезервированных слов, но также имена объектов. В четвертом окне мастера (рис. 12.3) пользователь может определить время запуска создаваемого задания. Для этого надо установить один из переключателей: П Now. Задание будет запущено сразу же по завершении работы мастера. В будущем запуск заданий будет возможен ручным способом. • One time. Этот способ предполагает одноразовый запуск задания в определенное время. При выборе данного пункта нужно указать дату (раскрывающийся список On date) и время (раскрывающийся список At time), в которое необходимо запустить задание. После этого запуск возможен вручную.
Часть III. Администрирование
480
П Automatically when the SQL Server Agent starts. В указанном случае запуск задания производится при каждом старте службы SQLServerAgent. • When the computer is idle. При установке этого переключателя запуск задания производится в моменты простоя сервера. Характеристики работы сервера, при которых считается, что он простаивает, определяются отдельно на уровне сервера. G On a recurring basis. Перечисленные выше способы не позволяют запускать задание периодически в определенные моменты. При выборе этого пункта пользователь может определить запуск задания в конкретные моменты времени. Для создания такого расписания нужно нажать кнопку Schedule. В ответ откроется диалоговое окно Edit Recurring Job Schedule. Create Job Wizard -STORAGE Specify job schedule Jobs can run one time or be recurring.
m
When do you want the job to run? С Now f~ Onetime
On date: f02:10-2931
| Atjiffte:: j l 2 ' ': v
—M
С Automatically when the SQL Server Agent starts f When the computer is idle (* On a recurring basis
Schedule...
< Sack
Next >
Cancel
Рис. 12.3. Четвертое окно мастера Create Job Wizard
В пятом окне мастера (рис. 12.4) можно выбрать оператора, который будет получать сообщения о ходе выполнения задания. Пользователь может информировать оператора двумя способами: • Net send — сведения предоставляются стандартной командой NET SEND; L~J E-mail — сообщение отправляется по электронной почте. Мастер позволяет отправлять сообщения разным пользователям. Для этого в раскрывающихся списках Net send и E-mail следует выбрать разных операторов. Информация о параметрах отправки сообщения (имя пользователя в сети и адрес электронной почты) берется из свойств оператора.
Глава 12. Автоматизация администрирования SQL Server 2000
481
На этом конфигурирование задания завершается. В последнем окне мастера нужно указать имя задания (поле Job name). Кроме того, в этом окне приведена сводная информация о создаваемом задании. Create Job Wizard - STORAGE
Job Notifications Optionally, select operators to be notified about the status of the job.
Net send: | Diesel
z!
E-mail: 1 3
< Sack
Next >
Cancel
Рис. 12.4. Пятое окно мастера Create Job Wizard
Утилита Enterprise Manager Как было сказано в начале предыдущего раздела, возможности мастера Create Job Wizard весьма ограничены. С его помощью можно создать лишь одношаговое задание с единственным расписанием запуска. Ниже рассмотрено формирование заданий любой сложности с помощью консоли администрирования Enterprise Manager. Чтобы сформировать задание с помощью Enterprise Manager, необходимо перейти к папке Management, расположенной в корневой папке сервера. В папке Management необходимо нажать кнопку [+] слева в строке службы SQLServer Agent. В раскрывшемся списке представлены объекты подсистемы автоматизации администрирования: Jobs, Alerts и Operator. Чтобы сформировать новое задание в контекстном меню объекта Jobs, выберите команду New Job. Откроется диалоговое окно New Job Properties, подобное представленному на рис. 12.5. Это окно имеет четыре вкладки.
Общие сведения о задании Первая вкладка — General (см. рис. 12.5), предназначена для указания общих сведений о создаваемом задании. В окне представлено несколько элементов управления, с помощью которых пользователь должен указать необходимую информацию.
Часть III. Администрирование
482
В поле Name нужно ввести имя, которое будет присвоено заданию. Не допускается формирование на одном сервере двух заданий с одинаковыми именами. В поле Source указывается сервер, являющийся владельцем задания. Если задание сформировано на локальном сервере, то в этом поле будет выведено значение (local). В поле Created указывается дата создания. Поскольку формируется новое задание, то в этом поле будет стоять (Not yet created). Если открыть окно свойств уже существующего задания, то в поле Created будет указана дата его создания.
New Job Properties - STORAGE General j steps | Scheduels | Notficato i ns О Name: |M an itenance_D atabase_J obs Source: (local) Enabled С Target jocal server Created: (Not yet created) * Target multiple servers: Category: uncateaonzed (Local 1 STORAGEVAdministrator Owner: 5TORAGE\Treo ln ат выполняющее базовые Descrp i to i n: Задание, LIT операции сопровождения данных -• 1
агрегирование устаревши* подробных данных и перенос их в журнал
SECURT IY
zl
Last modified: (Not applicable) OK
Cancel
Apply
Help
Рис. 12.5. Окно New Job Properties, вкладка General
В правой части вкладки General имеются переключатели, с помощью которых устанавливается тип задания: • Target local server — задание будет выполняться только на локальном сервере; О Target multiple servers — при установке переключателя в это положение задание будет выполняться на множестве серверов. Ниже переключателей размещен список серверов, на которых будет выполняться задание. Списком можно управлять при помощи кнопки Change. Следующий элемент вкладки General — раскрывающийся список Category. Категории предназначены для группировки однотипных заданий с целью упрощения управления заданиями. В SQL Server 20Q0 имеется следующий набор стандартных категорий: • Database Maintenance — задания оптимизации базы данных; О Full-Text — задания, используемые службой полнотекстового поиска; П Jobs from MSX — используется при работе с многосерверными заданиями; О REPL-Alert Response — задание репликации, оповещения;
Глава 12. Автоматизация администрирования SQL Server 2000
483
•
REPL-Checkup — репликация, проверка данных;
•
REPL-Distribution — репликация, задания агента Distribution Agent;
•
REPL-Distribution Cleanup — репликация, освобождение ресурсов дистрибьютора;
•
REPL-History Cleanup — репликация, очистка базы данных распределения;
•
REPL-LogReader — репликация, задания агента LogReader Agent;
•
REPL-Merge — репликация, задания агента Merge Agent;
•
REPL-QueueReader — репликация, чтение данных из очереди;
•
REPL-Snapshot — репликация, задания агента Snapshot Agent;
П REPL-Subscription Cleanup — репликация, освобождение ресурсов подписчиков; •
Web Assistant — задания автоматического создания Web-страниц;
О [Uncategorized (Local)] — задания, не входящие ни в одну из созданных категорий. При необходимости пользователи могут создавать собственные категории для группировки заданий. Это можно сделать, выбрав в контекстном меню объекта Jobs в панели Enterprise Manager команду All Tasks, а затем команду Manage Job Categories. Откроется окно Job Categories, подобное приведенному на рис. 12.6. Job Categories - STORAGE Job Categories
: щ New Package !• Щ TSQLJobJ Щ^ ggg backup L_l Database Maintenance (0) ; C3 Full-Text (0) • :• C j Jobs from MSX(O) ffi u J RE PL-Alert Response (1) + _ J REPL-Checkup (1) H L _ i REPL-Distribution (2) В L£3 REPL-Distribution Cleanup [1] В О REPL-History Cleanup (1) i Щ* Agent history clean up: distribution I I Q REPL-LogReader (2) '• Г "I RFPI-Mfirni» mi :
Add..
Delete
Properties.. Close
Рис. 12.6. Окно Job Categories
В окне существует единственная вкладка, на которой приведены все категории, созданные на сервере. Список категорий представлен в виде дерева. Для каждой категории указывается ее имя, а в скобках — количество заданий, сформированных для нее. Если в категории имеется одно или более заданий, то слева от ее имени стоит знак Г+j, щелкнув на котором, можно открыть список заданий,
484
Часть III. Администрирование
принадлежащих выбранной категории. С помощью окна Job Categories нельзя управлять заданиями (открыть окно свойств задания) — оно используется лишь для управления категориями. В распоряжении пользователя имеются три кнопки, с помощью которых он может управлять категориями: П Add. После нажатия этой кнопки откроется диалоговое окно, в котором нужно указать имя новой категории. G Delete. Нажатие данной кнопки приведет к удалению выбранной категории. • Properties. Кнопка служит для вызова окна свойств категории, которое содержит список заданий, принадлежащих выбранной категории. Кроме того, с помощью этого окна можно переносить задания из одной категории в другую. Для этого необходимо установить флажок Show all jobs. В результате в окне будет выведен полный список всех заданий, созданных на сервере. Для каждого задания будет указана его категория. Чтобы перенести задание в текущую категорию, достаточно установить в строке нужного задания флажок в столбце Member. Вернемся к созданию задания, вкладке General (см. рис. 12.5). В раскрывающемся списке Owner необходимо выбрать пользователя, который будет являться владельцем (owner) задания. Владелец может модифицировать и запускать сформированное задание, тогда как другие пользователи этого делать не могут. Последнее поле — Description — предназначено для ввода описания задания. Это поле не играет никакой роли в процессе выполнения задания и предназначено лишь для информационных целей. На этой вкладке также имеется флажок Enabled, с помощью которого можно управлять активностью задания. По умолчанию данный флажок установлен, и задание автоматически выполняется в соответствии с установленными расписаниями. Если же флажок сброшен, то задание запускаться не будет. Тем не менее, в этом случае возможен ручной запуск задания. Замечание Флажок Enabled предоставляет удобный механизм временного отключения задания. Вам не нужно удалять его совсем, чтобы избежать его выполнения. Достаточно снять флажок. Если в будущем нужно будет использовать задание, то просто установите флажок Enabled, не создавая задания заново.
На этом рассмотрение вкладки General закончено.
Управление шагами задания Завершив ввод общих сведений о задании, можно перейти к вкладке Steps (рис. 12.7), предназначенной для создания, удаления и модификации индивидуальных шагов задания.
Глава 12. Автоматизация администрирования SQL Server 2000
485
New Job Properties - STORAGE General Steps | Schedules) Notifications] ID ^Y 2
3
j Step Name StepJ Step_2 Step_3
Move step:
iType Transact-SQ... Transact-SQ... Transact-SQ...
• | • j Start step:
On Success Goto next step Goto next step Goto next step
On Failure Quit with failure Quit with failure Quit with failure
| (1) StepJ
New..
Delete
Edit.. OK
Cancel
Apply
Help
Рис. 12.7. Окно New Job Properties, вкладка Steps
Только что сформированное задание не имеет еще ни одного шага. Для создания нового шага следует нажать кнопку New, после чего откроется окно New Job Step (рис. 12.8). New Job Step - STORAGE General J Advanced j £tep name: |Step_4 (Transact-SQL Script (TSQL) Database: j Administrator Database Command: DELETE FROM logtable [A/HERE status-
Go to:
Cancel
Apply
Help
Рис. 12.8. Окно New Job Step, вкладка General
Это окно имеет две вкладки — General и Advanced. Первая из них служит для ввода данных о самом шаге. В поле Step name указывается имя шага, которое должно быть уникальным в пределах задания. В поле Туре пользователь обязан выбрать тип шага. Описание каждого из типов шагов было дано в разд. "За-
Часть III. Администрирование
486
дания"ранее в этой главе. В зависимости от выбранного типа задания, содержимое вкладки General может меняться. В рассматриваемом примере выбран тип шага Transact-SQL Script (TSQL). В этом случае пользователь в поле Database должен выбрать имя базы данных, в контексте которой будет выполняться запрос. Сам запрос указывается в поле Command. Пользователь может ввести множество команд Transact-SQL, включая вызовы хранимых процедур. На вкладке General имеется кнопка Open, с помощью которой в шаг разрешается включить заранее подготовленный сценарий, сохраненный в файле. Нажав кнопку Parse, можно проверить правильность введенного запроса. При анализе кода учитывается не только синтаксис написания зарезервированных слов, но также существование используемых объектов базы данных. После того как будут описаны действия, выполняемые в шаге, можно перейти к вкладке Advanced (рис. 12.9). >
New Job Step - STORAGE General Advanced ; On success / failure flow On success action:
jGoto the next step
I Retry attempts:
JO
j. On failure action:
J Quit the job reporting failure
3]
Retry interval (minutes): 3
: Transact-SQL Script (TSQL) command options j Output file:
| d:\MSSQL\JobsLog\M ainten. txt
! W Append output to step history | Run as user: Go to:
.
... | View... | Hverwrite "*f jAppenj
j(Self)
: •••••••
OK
Cancel
Apply
Help
Рис. 12.9. Окно New Job Step, вкладка Advanced
С помощью указанной вкладки можно управлять расширенными (advanced) настройками шага. Группа элементов управления On success/failure flow позволяет управлять поведением задания после выполнения шага: • On success action. В этом раскрывающемся списке выбирается действие, которое будет выполнено в случае успешного завершения задания. Помимо выбора следующего конкретного шага, допускается определение некоторых дополнительных вариантов поведения задания: • Quit the job reporting success — выполнение задания будет завершено и возвращен код успешного выполнения; •
Quit the job reporting failure — выполнение задания будет завершено и возвращен код неудачного выполнения;
Глава 12. Автоматизация администрирования SQL Server 2000 • Goto the next step — будет выполнен шаг, который находится сразу же после текущего. Если шаг последний, то выполнение задания заканчивается с кодом завершения текущего задания. • Retry attempts. Поле определяет количество попыток выполнения шага задания подсистемой автоматизации, после которых оно завершится неудачно. По умолчанию устанавливается значение 0, и ни одна повторная попытка не выполняется. • Retry interval (minutes). Если в поле Retry attempts установлено количество попыток больше 0, то в данном поле необходимо указать количество минут, которое должно пройти с момента неудачного выполнения задания до начала повторного запуска шага. G On failure action. Подобно пункту On success action в этом раскрывающемся списке необходимо выбрать действие, которое будет выполнено в случае неудачного завершения шага. Список доступных действий аналогичен списку On success action. Следующая группа элементов управления — Transact-SQL Script (TSQL) command options — предназначена для управления выходной информацией, получаемой при выполнении шага. Для этого используются следующие элементы: • Output file. Поле с именем файла, в который будет записываться вся информация, выводимая при выполнении команд Transact-SQL или утилит командной строки. Вывод в файл позволяет с помощью заданий подготавливать текстовые файлы, содержащие данные из таблиц базы данных. Имя файла может быть указано вручную или с помощью стандартного диалогового окна, которое можно вызвать, нажав кнопку „-J. Если в поле Output file указано не пустое значение, то становятся доступными дополнительные элементы управления: • View — с помощью этой кнопки можно просмотреть выбранный файл; •
Overwrite — при установке переключателя в это положение новая информация будет замещать все данные, записанные в файл при предыдущем выполнении шага;
• Append — установите переключатель в это положение, если необходимо добавлять новые данные в конец файла, а не переписывать файл заново. • Append output to step history. При установке данного флажка вся информация, выводимая при выполнении шага, будет добавлена в файл журнала. Эта информация сохраняется в базе данных Msdb. Если объем выводимых сведений значителен, то следует убедиться, что база данных Msdb имеет достаточный зяапас роста. • Run as user. Если необходимо, чтобы при выполнении шага подсистема автоматизации имела права доступа конкретного пользователя базы данных, то в этом раскрывающемся списке нужно выбрать его имя. По умолчанию задание выполняется в контексте пользователя (Setf), создающего задание. Изменять значения в указанном поле может только пользователь, имеющий административные права.
487
488
Часть III. Администрирование
На этом процесс создания шага заканчивается. Вернемся к вкладке Steps окна New Job Properties (см. рис. 12.7). На вкладке автоматически отображаются все шаги задания, представленные в виде строк, каждая из которых соответствует одному шагу задания. Для любого шага в таблице приводятся следующие данные: • ID — порядковый номер шага. При создании шага нумерация начинается с 1 и последовательно увеличивается. П Step Name — имя шага. В этом поле указывается имя шага, введенное при его создании. • Туре — тип шага. В разд. "Задания" ранее в этой главе было дано описание используемых в SQL Server 2000 типов шагов. П On Success — в этом столбце указывается, как должно вести себя задание после успешного выполнения этого шага. • On Failure — в данном столбце указывается, как должно вести себя задание в случае неудачного завершения этого шага. В нижней части вкладки имеется набор элементов управления, с помощью которых можно управлять шагами в задании: • Move step — с помощью кнопок можно перемещать шаги вверх и вниз. При этом автоматически изменяется значение в поле ID. • Start step — в этом раскрывающемся списке необходимо выбрать шаг, который должен быть выполнен первым при запуске задания. По умолчанию первым выполняется шаг, для которого в поле ID установлено значение 1, но задание может начинаться с любого шага. Для шага, с которого начнется выполнение задания, справа от его номера устанавливается флажок. •
New — эта кнопка предназначена для создания нового шага и уже была рассмотрена.
• Insert — с помощью данной кнопки также выполняется создание шага, но он будет вставлен не в конец списка (как при нажатии кнопки New), а перед выбранным шагом. П Edit — кнопка вызывает окно редактирования шага. • Delete — нажав указанную кнопку, можно удалить выбранный шаг. На этом процесс создания шагов заканчивается.
Управление запуском задания Когда введены общие сведения о задании и созданы все необходимые шаги, то можно перейти к установке времени запуска задания. Для этого служит вкладка Schedules (рис. 12.10). Для формируемого нового задания время запуска не установлено. Чтобы создать новое расписание, необходимо нажать кнопку New Schedule. Откроется диалоговое окно New Job Schedule (рис. 12.11).
Глава 12. Автоматизация администрирования SQL Server 2000 New Job Properties - STORAGE General) Steps Schedules | Notifications | Note: The current date/time on target server ilD INarne
489
•J is 02.10.2001 13:00
i Enabled ! Description
«•Д? (New) Begin_andEnd_Week
Yes
Occurs every 1 weekfs) on Sunday, Monday, at 0:00:00.
New Alert.
New Schedule..
OK
Edit., Cancel
Apply
Delete Help
Рис. 12.10. Окно New Job Properties, вкладка Schedules
Первый элемент окна New Job Schedule — это поле Name. Здесь необходимо указать имя расписания. Имя должно быть уникальным в пределах задания. Справа от поля Name имеется флажок Enabled, установленный по умолчанию. Если этот флажок отмечен, то расписание активно, и в соответствии с ним будет выполняться запуск задания. В противном случае расписание при запуске задания игнорируется. New Job Schedule - STORAGE Enabled
£Jame: ]Wednesday_S chedule Schedule Type— -
- -
С Sjart automatically when SQL Server Agent starts С Start whenever the CPU(s) become idle С One time
-
|
i
(* R^ecurring Occurs every 1 week(s) on Wednesday, at 0:00:00. Change.. Cancel
Help
Рис. 1 2 . 1 1 . Окно New Job Schedule
Переключатель Schedule Type позволяет установить тип расписания: • Start automatically when SQL Server Agent starts. В этом случае запуск задания будет выполняться только в момент запуска службы SQLSei'verAgent, например, при перезагрузке сервера. Данный тип расписаний используется в ос-
Часть III. Администрирование
490
новном для заданий, проверяющих целостность данных перед началом работы пользователей. • Start whenever the CPU(s) become idle. В указанном случае выполнение задания начинается в момент простоя центрального процессора. Это позволяет запускать задания в моменты наименьшей активности пользователей, например, ночью или в обеденный перерыв. Тип запуска задания может быть использован для перестроения индексов, обновления полнотекстовых каталогов, создания резервных копий и выполнения других подобных операций. О One time. При выборе этого типа задание будет запущено лишь один раз. Когда переключатель установлен в данное положение, становятся доступными раскрывающиеся списки: • On date — дата запуска задания; • On time — время запуска задания. П Recurring. Данный тип расписания применяется для периодического запуска задания в строго определенное время. В нижней части окна указывается информация о времени запуска. По умолчанию задание запускается каждое воскресенье в 00:00. Для изменения этого значения необходимо нажать кнопку Change. В открывшемся диалоговом окне Edit Recurring Job Schedule можно устанавливать произвольную дату и время запуска задания, а также его периодичность. Кроме того, можно установить конечную дату. New Alert Properties - STORAGE General | Response j ЩШ
Name:
|Notify_Admin
ID: New
Type: jSQL Server event alert г Event alert definition
j j j R Enabled •• '
! Error number:
J2759
'
/1 CREATE SCHEMA failed due to prev...
i <"" Severity:
|u1u • тм.ч главен
| Database name:
| Administrator Database
jjj
; Error message contains this text:
»• ]
—
•History Date last occurred:
(Never occurred)
Date last responded to:
(Never responded)
Occurrence count: 0
OK
Reset Count
Cancel
Apply
Help
Рис. 12.12. Окно New Alert Properties, вкладка General
Глава 12. Автоматизация администрирования SQL Server 2000
491
Замечание Одно расписание позволяет описать только единственный тип запуска задания. Если необходимо запускать задание по нескольким параметрам, то следует создать дополнительные расписания. На этом создание расписания заканчивается. Вернемся к вкладке Schedule окна New Job Properties (см. рис. 12.10). Помимо того, что задание может быть запущено на основе календаря или в момент простоя процессора, разрешено также сконфигурировать автоматический запуск задания в ответ на оповещение. Подсистема автоматизации будет отслеживать наступление определенного события и автоматически выполнять задание. Для создания оповещения, в соответствии с которым будет запускаться задание, нажмите кнопку New Alert на вкладке Schedules. В ответ откроется диалоговое окно New Alert Properties (рис. 12.12). Это стандартное окно создания оповещения. Подробно создание оповещений средствами Enterprise Manager будет рассмотрено далее в этой главе. На этом процесс создания оповещения заканчивается. Мы рассмотрели конфигурирование автоматического запуска задания с помощью вкладки Schedules окна New Job Properties.
Извещение операторов о завершении задания Последняя вкладка окна New Job Properties — Notifications — предназначена для информирования операторов о завершении задания. Содержание этой вкладки приведено на рис. 12.13. New Job Properties -STORAGE General] Steps ] Schedules Notifications | P_/?J Actions to perform when the job completes: i* E-mali operator:
Irsa Diesel
d _ J
W Page operator:
|^ Diesel
""Ц ___ 1When the job fails
P" Net send operator: | Q Diesel
d_J
W Write to Windows NT application event log:
Whenever the job completes *j J
d
J ILn
i.VJj!!T'f('3l'':I.'.ll:lll" 'WWi • H When the job fails »-1
Г" Automatically delete job:
OK
Cancel
Apply
Help
Рис. 12.13. Окно New Job Properties, вкладка Notifications
На этой вкладке имеется пять флажков, которые влияют на поведение подсистемы автоматизации после завершения выполнения задания:
492
Часть III. Администрирование
П E-mail operator. В этом списке необходимо выбрать имя оператора, которому будет отправлено сообщение по электронной почте. С помощью кнопки _^J можно вызвать окно свойств выбранного оператора. Кроме того, в конце строки присутствует раскрывающийся список, в котором можно указать условие, при котором оператору будет отправлено сообщение: •
When the job succeeds — в случае успешного завершения задания;
•
When the job fails — в случае неудачного завершения задания;
•
Whenever the job completes — всякий раз, когда работа задания завершается независимо от результата.
• Page operator. В данном раскрывающемся списке указывается имя оператора, которому сообщение будет отправлено на пейджер. • Net send operator. Раскрывающийся список служит для выбора имени оператора, которому сообщение будет отправлено с помощью команды NET SEND. • Write to Windows NT application event log. Если отмечен этот флажок, то в журнал приложений операционной системы будет записано сообщение о завершении задания. • Automatically delete job. При установке данного флажка будет происходить автоматическое удаление задания.
(~
Замечание
)
Каждый способ допускает отправку сообщения только одному оператору. Мы рассмотрели все вкладки окна New Job Properties, и теперь вы имеете полное представление о всех возможностях, предоставляемых SQL Server 2000 по управлению заданиями.
Средства Transact-SQL Последний способ создания задания — это использование средств Transact-SQL. Данный способ предоставляет пользователю максимальные возможности, т. к. он напрямую работает с системными данными подсистемы автоматизации. Как было сказано ранее, вся информация подсистемы автоматизации SQL Server 2000 хранится в системной базе данных Msdb. В частности, задания описываются в системной таблице sysjobs. Пользователь может работать с этой таблицей напрямую
с помощью
команд
SELECT,
UPDATE
И DELETE, минуя
использование
мастеров или Enterprise Manager. По умолчанию изменения в системных таблицах запрещены. Тем не менее пользователи могут читать из них данные с помощью команды SELECT. Чтобы разрешить изменение данных в системных таблицах, необходимо изменить параметры конфигурации сервера. Для этого можно запускать следующую хранимую процедуру: sp configure
'allow update', { 0 I 1 }
Глава 12. Автоматизация администрирования SQL Server 2000
493
При указании значения 0 прямой доступ запрещен, при 1 — разрешен. Однако управление заданиями посредством изменения данных в таблице sysjobs — занятие утомительное и опасное, требующее специализированных знаний. Более удобным вариантом является запуск специальных системных хранимых процедур. Эти процедуры гарантируют, что данные будут изменены корректно, и никакие ограничения не будут нарушены. На самом деле работа всех вышеописанных средств создания заданий (с применением мастера или с помощью Enterprise Manager) в конце концов сводится к выполнению системных хранимых процедур, которые и выполняют создание задания. Ничто не мешает пользователю, имеющему соответствующие права, самому вызвать те же самые хранимые процедуры. Приведем хранимые процедуры для управления заданиями: П sp_add_job — добавление задания; П1 sp_update_job — изменение задания; •
sp_deiete_job — удаление задания;
•
sp_add_jobschedule — добавление расписания выполнения задания;
D sp_add_jobstep — добавление шага задания; П sp_heip_job — вывод информации о задании; О sp_heip_jobstep — вывод информации о шаге задания. Рассмотрим использование системной хранимой процедуры s p a d d j o b создания заданий:
для
sp_add_j ob [@ j ob_name =] 'j ob_name' [,[@enabled =] enabled] [,[Sdescription =] 'description'] [,[@start_step_id =] step_id] [,[@category_name =] 'category'] [,[@category_id =] category_id] [,[@owner_login_name =] 'login'] [,[@notify_level_eventlog =] eventlog_level] [,[@notify_level_email =] email_level] [,[@notify_level_netsend =] netsend_level] [,[@notify_level_page =] page_level] [,[@notify_email_operator_name =] 'email_name'] [, [@notify_netsend_operator_name =] 'netsend_name'] [,[@notify_page_operator_name =] 'page_name'] [,[@delete_level =] delete_level] t,[@job id =] job id OUTPUT]
Замечание Для более подробного знакомства с управлением заданиями с помощью системных хранимых процедур следует обратиться к соответствующей документации, например, Books Online.
Часть III. Администрирование
494
Копирование заданий Иногда возникает необходимость скопировать задание, успешно работающее на одном сервере, на другие серверы сети. В SQL Server 2000 нельзя просто скопировать задание с одного сервера на другой. Чтобы сделать это, необходимо создать сценарий (script) задания, содержащий набор команд Transact-SQL, выполнение которых приведет к созданию задания. Полученный код может быть выполнен как на удаленном сервере, так и на локальном. Выполнив полученный сценарий на удаленном компьютере, можно получить копию соответствующего задания. Выполнение сценария на локальном компьютере может понадобиться в ситуации случайного повреждения или удаления задания. После выполнения сценария задание будет восстановлено.
Замечание Копирование заданий можно выполнить с помощью механизмов DTS, воспользовавшись задачей Transfer Job Task. Создание пакета и, в частности, конфигурирование задачи Transfer Job Task, было рассмотрено в предыдущей главе.
Чтобы создать сценарий для конкретного задания, необходимо вызвать контекстное меню этого задания и в нем выбрать команду All Tasks, а затем команду Script Job. В ответ откроется диалоговое окно Generate SQL Script (рис. 12.14). Generate SQL Script - STORAGE/T Bpi , Generate SQL Script for creating job 'TSQL_Job_1'. File name:
|C:\jobs.sql
г File format j С MS-DOS Text (OEM) \ С Windows Text [ANSI] ! (* international Text (Unicode) г SQL generation options i P7 Replace job if it exists
Preview
OK
Cancel
Help
Рис. 12.14. Окно Generate SQL Script
Рассмотрим содержимое этого окна: • File name. Поле имени файла, в котором будет сохранен генерируемый сценарий. Значение можно ввести вручную или интерактивно, нажав кнопку •£$. •
File format. С помощью группы переключателей нужно выбрать тип, который будет иметь генерируемый текстовый файл:
Глава 12. Автоматизация администрирования SQL Server 2000
495
• MS-DOS Text (OEM) — стандартный текст в формате MS-DOS; • Windows Text (ANSI) — стандартный текст в формате Windows; •
Internationa] Text (Unicode) — текст в формате Unicode.
• Replace job if exists. Если установить этот флажок, то в генерируемый сценарий будут включены команды, которые проверят существование в системе одноименных заданий и в случае их нахождения удалят их. Когда все параметры будут установлены, остается только нажать кнопку ОК. После этого SQL Server 2000 сгенерирует сценарий и запишет его в указанный файл. Пользователь может скопировать этот файл и выполнить его на любом сервере. (
Замечание
^
Рассмотренный способ позволяет сгенерировать сценарий для отдельного задания. Если необходим сценарий для множества заданий, то описанную операцию выполняют отдельно для каждого задания. Тем не менее, в SQL Server 2000 имеется возможность создать скрипты сразу для всех заданий. Для этого в контекстном меню объекта Jobs необходимо выбрать команду All Tasks, а затем команду Script All Jobs.
Управление оповещениями В этом разделе рассмотрены методы, с помощью которых пользователи и администраторы могут управлять работой оповещений в SQL Server 2000. Как и в случае с заданиями, для создания оповещений можно использовать различные способы — это мастер Create Alert Wizard, консоль Enterprise Manager и хранимые процедуры. Применение мастера для создания оповещений накладывает некоторые ограничения на спектр конфигурируемых действий. Например, мастер Create Alert Wizard не позволяет создавать оповещение, реагирующее на показания счетчиков производительности. Поэтому с мастером в основном работают пользователи, только начинающие знакомство с подсистемой автоматизации и не имеющие достаточного опыта. Наибольшие возможности, конечно же, предоставляют системные хранимые процедуры. В итоге все другие методы рано или поздно приходят к вызову соответствующих системных хранимых процедур. Этот вызов происходит незаметно для пользователя.
Мастер Create Alert Wizard Для запуска мастера создания оповещений Create Alert Wizard необходимо нажать на панели инструментов Enterprise Manager кнопку Run a Wizard и в открывшемся диалоговом окне в папке Management выбрать пункт Create Alert Wizard. После этого остается только нажать кнопку ОК. В ответ появится первое окно мастера, содержащее обзорную информацию о предназначении программы 17 Змс. 83
Часть III. Администрирование
496
и ее возможностях. Окно не содержит никаких элементов управления и может быть пропущено. Во втором окне мастера (рис. 12.15) пользователь должен выбрать событие, при наступлении которого будет происходить вызов оповещения. Допускается указание одного из двух следующих вариантов: П Only if this error occurs. Указывается номер конкретной ошибки, при наступлении которой будет вызываться оповещение. Номер ошибки можно задать непосредственно в текстовом поле или выбрать в окне Manage SQL Server Messages, которое можно вызвать, нажав кнопку ^_J. При этом в поле Error Description отображается текст сообщения, соответствующий выбранной ошибке. П For any error of severity. В данном случае необходимо выбрать определенный уровень серьезности ошибок. Это позволяет вызывать оповещение не по конкретной ошибке, а по любой, уровень серьезности которой равен или больше указанного. Create Alert Wizard - STORAGE Define the Alert Specify the error or severity level that triggers the alert.
•0 0
Raise this alert: C" Ony l if this error occurs:
& For any error of severity:
__J
014 - Insufficient Permission
< Back
Next>
mmamzi
Cancel j
Рис. 12.15. Второе окно мастера Create Alert Wizard
В третьем окне мастера можно ограничить круг событий, на которые будет реагировать оповещение: • Database name. В раскрывающемся списке можно выбрать имя базы данных, в которой должна произойти ошибка, указанная во втором окне мастера. Если ошибка происходит в любой другой базе, то оповещение не вызывается. По умолчанию оповещение реагирует на указанную ошибку, произошедшую в любой базе (опция All Databases).
Глава 12. Автоматизация администрирования SQL Server 2000 П Error message contains this text. В это поле необходимо ввести текст, который должно содержать сообщение об ошибке. В противном случае оповещение не вызывается. Некоторые ошибки генерируются во многих случаях. Чтобы задать вызов сообщения о конкретной ошибке, необходимо указать содержащийся в сообщении текст. По умолчанию будут отслеживаться все сообщения. В следующем, четвертом окне мастера (рис. 12.16), можно выбрать задание, которое будет запускаться. Кроме того, в этом окне можно указывать, какие операторы и каким способом должны получать сообщение о наступлении ошибки. При выборе задания в раскрывающемся списке Job to execute можно указать одно из сформированных ранее заданий или создать новое, выбрав в списке значение New Job. Если никакое задание вызываться не должно, следует выбрать вариант No Job. Create Alert Wizard - STORAGE Define Aleit Response Optionally, select a job to execute or operators to notify when this alert is raised. Job to execute:
211
|Maintenance_Database_Jobs
Notify operators):
< Back
Next>
Cancel
Рис. 12.16. Четвертое окно мастера Create Alert Wizard
В пятом окне мастера Create Alert Wizard (рис. 12.17) можно ввести текст сообщения, которое будет отправляться операторам. Указание этого сообщения не обязательно, т. к. оно используется лишь для более подробного информирования о возникшей ошибке. Независимо от того, был ли введен текст в поле Alert notification message to send to operator или нет, в посылаемое сообщение автоматически будет включен текст сообщения об ошибке. С помощью флажков E-mail, Page и Net Send можно ограничить круг методов, которые будут использовать дополнительное сообщение. Следующее окно мастера является последним. Оно содержит сводную информацию о создаваемом оповещении. На этом работа с мастером Create Alert Wizard заканчивается. После нажатия кнопки ОК оповещение будет создано.
497
498
Часть III. Администрирование
Create Alert Wizard - STORAGE Define Alert Notification Message Optionally, you can specify the text of the message to send to the operator, and whether to include the error text in the message sent to the operator. Include error message text in:
P7 ji-rnail
Г Page
П? Net Send
Alert notification message to send to operator: В контексте базы данных Administration Database произошел КОНФЛИКТ прав до|ст"Ь1А 1
< Back
Next >
Cancel
Рис. 12.17. Пятое окно мастера Create Alert Wizard
Утилита EnterpriseManager Создание оповещения с помощью Enterprise Manager выполняется в окне New Alert Properties (рис. 12.18). Для вызова этого окна можно в контекстном меню объекта Alert выбрать команду New Alert. В поле Name необходимо ввести имя оповещения, уникальное в пределах сервера. В раскрывающемся списке Туре можно выбрать один из двух типов оповещений: • SQL Server event alert. В основе этого метода лежит анализ журнала приложения (application log) операционной системы. • SQL Server performance condition alert. При выборе данного способа оповещение реагирует на значения счетчиков (counts) SQL Server. Эти же счетчики используются утилитой Performance Monitor. Содержимое нижней части вкладки зависит от типа оповещения, выбранного в списке Туре. Рассмотрим сначала работу с первым типом оповещений. В группе элементов Event alert definition необходимо сконфигурировать условия запуска оповещения. Для этого используются следующие элементы управления: • Error number. При установке данного переключателя необходимо указать конкретный номер ошибки, при нахождении которой в журнале приложений будет происходить вызов оповещения. Нажав кнопку _ J , можно вывести окно со списком всех доступных ошибок. Кроме того, в этом окне можно создать собственные сообщения об ошибках — пользовательские ошибки (user errors).
Глава 12. Автоматизация администрирования SQL Server 2000
499
New Alert Properties - STORAGE General Response I .Name:
|No_Free_Space_for_Autogrow
ID: New
J_ype: j S Q L S erver performance condition alert ! Object:
1 SQLServecDatabases
d
! Counter:
(Data File(s) Size (KB)
d
\ Instance:
j_Total
i AJert if counter: (risesabove History Date last occurred: Date last responded to: Occurrence count: 0 OK •
Enabled
•d _^j yalue: J10000 (Never occurred) (Never responded) Reset Count Cancel
Apply
Help
Рис. 12.18. Окно New Alert Properties, вкладка General
Severity. Если установлен этот переключатель, то оповещение вызывается только в случае ошибки с определенным уровнем серьезности (severity). Такой подход позволяет с помощью одного оповещения реагировать на множество ошибок.
• Database name. С помощью этого раскрывающегося списка можно ограничить круг ошибок, на которые реагирует оповещение, конкретной базой данных. По умолчанию оповещение реагирует на выбранные ошибки, происходящие в любой базе данных (опция All Databases). • Error message contains this text. Можно указать не только номер ошибки или уровень ее серьезности, но и текст, который должно содержать генерируемое сервером сообщение об ошибке. Оповещение будет реагировать на ошибку только в том случае, если сообщение содержит указанный текст. Мы рассмотрели, какие опции конфигурирования доступны на вкладке General окна New Alert Properties при выборе типа оповещения SQL Server event alert. На рис. 12.18 приведен вид окна при выборе типа оповещения SQL Server performance condition alert. В группе элементов Performance condition alert definition устанавливается состояние SQL Server 2000, при наступлении которого будет активизироваться оповещение. Для этого используются следующие элементы: П Object. В раскрывающемся списке выбирается объект контроля. Доступны только объекты SQL Server 2000.
500
Часть III. Администрирование
• Counter. Для каждого объекта существует множество параметров, для которых выполняется сбор информации. В этом раскрывающемся списке необходимо выбрать нужный счетчик. П Instance. С помощью раскрывающегося списка нужно выбрать процесс, при выполнении которого начнется сбор данных. • Value. В этом поле указывается число, с которым будет сравниваться значение счетчика. • Alert if counter. В данном раскрывающемся списке нужно выбрать логическое условие сравнения данных счетчика с определенным значением. При выполнении условия происходит активизация оповещения. Доступны варианты: • falls below — счетчик находится ниже указанного значения; • becomes equal to — значение счетчика равно значению в поле Value; • rises above — значение счетчика превышает значение в поле Value. Этим разница между типами оповещений исчерпывается. Дальнейшее содержимое вкладки General окна New Alert Properties одинаково для обоих типов. В нижней части окна находится группа элементов History, в которой размещены перечисленные ниже элементы: П Date last occurred. В этом поле указываются дата и время последнего вызова оповещений. • Date last responded to. В данном поле выводится дата и время последнего сообщения, посланного оповещением. • Occurrence count. Количество вызовов оповещения с момента последнего сброса. • Reset Count. С помощью этой кнопки можно сбросить счетчик вызовов оповещения (Occurrence count). На этом работа с вкладкой General заканчивается. Пользователь может переходить к вкладке Response (рис. 12.19), предназначенной для управления сообщениями, которые будут отправляться операторам при вызове оповещения. В центре окна приведен список операторов (Operators to notify), сконфигурированных на сервере и получающих сообщения при вызове оповещения. Для создания нового оператора можно нажать кнопку New Operator. Для каждого оператора можно сконфигурировать отправку сообщений по электронной почте (E-mail), на пейджер (Pager) или по локальной сети (Net Send). Для этого достаточно установить флажок в соответствующем столбце. Текст сообщения, которое будет отправлено оператору, указывается в поле Additional notification message to send. Приводить текст сообщения не обязательно. Оно носит чисто информационный характер с целью помочь оператору правильно понять смысл возникшей проблемы. Замечание Информация для каждого способа отправки сообщения берется из свойств операторов.
Глава 12. Автоматизация администрирования SQL Server 2000 New Alert Properties - STORAGE
501
-*J
General Response P/ Execute job: STORAGE-Administtator Database-Administrator Dat3 _ J flperators to notify: Operator Name Diesel UJ
Include alert error text in:
New Operator... ; E-rnail I. :
ШШШ ио
P E.-rnail
| Pager iNet Send Й | D ^i
P?" Pager
i
e
P7 Net send
Additional notification message to send: На жестком диске нет свободного пространства для автоматического увеличения. Общий размер баз данных превысил 100 М байт. Н еобкодимо добавить в базы данных дополнительные Delay between responses: |1
OK
r-jminu'es
Cancel
j*j ZJ T J
|0 ~Tj seconds
Apply
Help
Рис. 12.19. Окно New Alert Properties, вкладка Response
Помимо включения в посылаемое сообщение дополнительного текста, в него также можно добавить сообщение об ошибке. Причем данный текст может быть помещен только в определенный тип отправляемых сообщений: электронную почту, пейджер или команду NET SEND. ДЛЯ ЭТОГО необходимо установить один из флажков Include alert error text in. В полях Delay between responses указывается пауза перед отправкой повторного сообщения. На этом процесс создания оповещения заканчивается.
Средства Transact-SQL Данные об оповещениях хранятся в таблице sysaierts базы данных Msdb. Для управления оповещениями можно использовать как команды Transact-SQL, так и системные хранимые процедуры: П sp_add_aiert — добавление оповещения; О sp_update_alert — изменение оповещения; П sp_deiete_aiert — удаление оповещения. Приведем синтаксис хранимой процедуры sp_add_aiert: sp_add_alert [@name =] 'name' [, [@message_id =] message_id] [, [Sseverity =] severity] [, [@enabled =] enabled]
502
Часть III. Администрирование
[, [@delay_between_responses =] delay_between_responses] [, [@notification_message =] 'notification_message'] [, [@include_event__description_in =] include_event_description_in] [, [@database_name =] 'database'] [, [@event_description_keyword =] 'event_description_keyword_pattern'] [, {[@job_id =] job_id I [@job_name =] 'job_name'}] [, [@raise_snmp_trap =] raise_snmp_trap] [, [@performance_condition =] 'performance__condition'] t, [@category__name = ] 'category']
Замечание Для более подробного знакомства с управлением оповещениями с помощью системных хранимых процедур следует обратиться к соответствующей документации, например, Books Online.
Копирование оповещений Приемы, используемые для копирования оповещений, те же самые, что и при работе с заданиями. Данная процедура может осуществляться как между различными серверами, так и внутри одного сервера. Для более подробного знакомства с принципами переноса оповещений следует обратиться к разд. "Копирование заданий"этой главы.
Управление операторами В отличие от работы с заданиями и оповещениями, пользователь не может прибегнуть к услугам мастера. В SQL Server 2000 нет мастера для создания операторов, поэтому в распоряжении пользователя остаются только два метода — утилита Enterprise Manager и язык Transact-SQL (в том числе и хранимые процедуры). В следующих разделах рассмотрено создание новых операторов. Если же необходимо изменить свойства одного из созданных ранее операторов, то для этого нужно в левой части консоли Enterprise Manager выбрать объект Operators. После этого в правой части отобразится список всех созданных на сервере операторов. Для редактирования оператора нужно дважды щелкнуть на его имени. Откроется диалоговое окно, в котором можно внести необходимые изменения. Содержимое этого окна идентично тому, с помощью которого выполняется создание операторов. Использование объектов управления, расположенных в окне редактирования, рассмотрено в следующих разделах.
Утилита Enterprise Manager Для создания нового оператора средствами Enterprise Manager предназначено окно New Operator Properties, которое можно вызвать, выбрав в контекстном меню объекта Operators в левой панели Enterprise Manager команду New Operator. В ответ откроется диалоговое окно, подобное приведенному на рис. 12.20.
Глава 12. Автоматизация администрирования SQL Server 2000
503
New Operator Properties - STORAGE General j Notifications | llj
Name:
Liliya
E-mail name:
ID : New
[email protected]
Test
Pager e-mail name:
j liliya@mobil. khakassia. ru
Tgst
Net sencj address:
NIT
Test
- Pager on duty schedule W Monday W Tuesday Workday begin W Wednesday W Thursday | 8:00:00 ~r, R Friday F? Saturday
) 8:00:00
Г" Sunday
iV:
j 9 00
OK
-rj —|
Cancel
V/oikday end 18:00:00
-71
13:00:00
-f-
IftO
Apply
:
'
—|
Help
Рис. 12.20. Окно New Operator Properties, вкладка General
Окно содержит набор элементов управления, с помощью которых необходимо указать общие сведения об операторе. Рассмотрим эти элементы: • Name. В этом поле указывается имя оператора, которое должно быть уникальным в пределах сервера. О E-mail name. Поле адреса электронной почты, на который будут отправляться сообщения для оператора. Нажав кнопку ,^-J. можно открыть адресную книгу со списком пользователей и выбрать в ней нужного человека. Его адрес будет автоматически подставлен в поле E-mail name. • Pager e-mail name. Если оператор имеет пейджер, то можно указать адрес электронной почты пейджинговой компании, на который должны посылаться сообщения. • Net send address. Если оператор работает в локальной сети, то сообщение ему может быть послано с помощью стандартной команды NET SEND.
С
Замечание
Для проверки каждого из сконфигурированных методов отправки сообщений можно нажать кнопку Test.
Если с адресом электронной почты оператора (параметр E-mail name) особых проблем не возникает, то посылка сообщений на пейджер требует отдельных комментариев. Указанный способ возможен только в том случае, если пейджинговая
Часть III. Администрирование
504
компания, которая обслуживает пейджер оператора, предоставляет сервис отправки сообщений на пейджер с помощью электронной почты. Для этого могут использоваться разные способы. Одним из них является создание индивидуального почтового ящика для оператора на почтовом сервере пейджинговой компании, куда будут приходить сообщения, подлежащие переправке на пейджер. Когда отправка сообщений на пейджер для оператора сконфигурирована, в нижней части окна становятся доступными несколько дополнительных элементов управления в группе Pager on duty schedule. С их помощью устанавливается время, когда оператору будет отправляться сообщение. По умолчанию оператор считается активным все рабочие дни с 8 часов утра и до 6 часов вечера. Если организация имеет множество операторов, то устанавливая для каждого из них индивидуальное время работы, можно организовать круглосуточное посменное обслуживание сервера. SQL Server 2000 сам определит, какой из операторов должен работать в конкретный момент времени и отправит сообщение именно ему. На этом работа с вкладкой General окна New Operator Properties заканчивается. Затем можно переходить к вкладке Notifications (рис. 12.21). New Operator Properties - STO! General Notifications Notifications sent to this operator by: Alett - Severity 14
**" Alerts
f~ ob
i E -mail iPager .NetSend
AlerL Demo: Full rnsdb log Demo: Full tempdb Demo: Sev. 19 Errors Demo: Sev. 20 Errors Demo: Sev. 21 Errors Demo: Sev. 22 Errors
Й Ш V; §| 0 Jj$ [J Г]
Ш
[I
7 Operator is available to receive notifications - Most recent notifications attempts By e-mail:
(Never e-mailed)
By pager:
(Never paged)
By net send:
(Never notified by net send)
Cancel
Send E-ma.li
Hep l
Рис. 1 2 . 2 1 . Окно New Operator Properties, вкладка Notifications
На этой вкладке можно определить, при выполнении каких оповещений оператор будет получать сообщение и каким способом. В средней части вкладки имеется таблица, содержащая список всех созданных на сервере оповещений. Для каждого оповещения можно выбрать отправку сообщений на адрес электронной почты, на пейджер или по локальной сети.
Глава 12. Автоматизация администрирования SQL Server 2000
505
С помощью флажка Operator is available to receive notifications можно управлять отправкой сообщений в целом. Если параметр установлен, то оператор будет получать сообщения в соответствии с установленными флажками в верхней таблице. В противном случае отправка всех сообщений блокируется. С помощью кнопки Send E-mail можно отправить оператору тестовое сообщение для проверки правильности настроек.
Средства Transact-SQL Информация об операторах хранится в системной таблице sysoperators системной базы данных Msdb. Администратор может управлять операторами, изменяя данные непосредственно в указанной базе данных. Однако все же рекомендуется использовать специальные хранимые процедуры, которые гарантируют правильную интерпретацию данных и их целостность. Для управления операторами предназначены следующие хранимые процедуры: • sp_add_operator — создание нового оператора; • sp_delete_operator — удаление оператора; • sp_update_operator — изменение различных параметров созданного ранее оператора; • sp_heip_operator — возвращает информацию о свойствах оператора. Рассмотрим синтаксис хранимой процедуры sp_add_operator: sp_add_operator [@name =] 'name' [, [genabled =] enabled] t, [@email_address =] 'email_address'] [, [@pager_address =] 'pager_address'] [, [@weekday_pager_start_time =] weekday_pager_start_time] [, [@weekday_pager_end_time =] weekday_pager_end_time] [, [@saturday_pager_start_time =] saturday_pager_start_time] [, [@saturday_j?ager_end_time =] saturday_pager_end_time] [, [@sunday_pager_start_time =] sunday_pager_start_time] [, [@sunday_pager_end_time =] sunday_pager_end_time] [, [@pager_days =] pager_days] [, [@netsend_address =] 'netsend_address'] [, [@category_name =] 'category']
Замечание Для получения информации о назначении и применении аргументов хранимой процедуры s p _ a d d _ o p e r a t o r , а также о работе с другими хранимыми процедурами управления операторами необходимо обратиться к дополнительным источникам, например, Books Online.
Оператор последней надежды Подсистема автоматизации SQL Server 2000 использует термин оператор последней надежды (fail-safe operator). Оператором последней надежды является чело-
Часть III. Администрирование
506
век, который должен обязательно получить сообщение в случае, если другие операторы окажутся недоступными. Оператором последней надежды нужно выбрать человека, который гарантированно получит сообщение от сервера. SQL Server 2000 будет автоматически отправлять сообщение оператору последней надежды в том случае, если все попытки известить обычных операторов по пейджеру завершились неудачей. Это может произойти не только по техническим причинам (например, повреждена линия связи), но и в случае, когда нет ни одного активного оператора (например, рабочее время операторов закончилось, или ошибка произошла в выходные). Кроме того, оператор последней надежды будет получать сообщения в случае, если база данных Msdb повреждена, или подсистема автоматизации не может обратиться к таблице sysnotif i c a t i o n s , в которой определены связи операторов с оповещениями. В качестве оператора последней надежды выбирается один из созданных ранее операторов. Для этого предназначена вкладка Alert System окна SQL Server Agent Properties (рис. 12.22). Для вызова этого окна в контекстном меню объекта SQLServerAgent в панели Enterprise Manager необходимо выбрать команду Properties. 5QL Server Agent Properties - STORAGE General | Advanced Alert System j job System | Connection | r Address formatting for pager e-mas li —• Prefix
Pager address
Suffix
Xo line: CCIine: N/A
S_ub|ect: г Т о line example
•• ••
| <Pager Address> Body:
W Include ^ody of e-mail in notification page
• Fail-safe operator • Operator:
: Diesel
ГЕ-rnai
OK
Cancel
Г ,..,:
Apply
Г
Help
Рис. 12.22. Окно SQL Server Agent Properties, вкладка Alert System
В группе Fail-safe operator, расположенной в нижней части окна, в раскрывающемся списке Operator нужно выбрать одного из созданных операторов, который будет восприниматься системой как оператор последней надежды. По умолчанию в указанном списке установлено значение No fail-safe operator, свидетельствующее о том, что в системе нет подобного.
Глава 12. Автоматизация администрирования SQL Server 2000
507
Замечание SQL Server 2000 не позволяет удалять оператора последней надежды. Если все же это необходимо сделать, то его следует сначала понизить до обычного оператора, выбрав в списке Operator имя другого оператора или значение No fail-safe operator.
Копирование операторов Иногда встречаются ситуации, когда один оператор должен быть скопирован на несколько серверов. Особенно часто это случается в больших организациях со множеством серверов. Кроме того, может понадобиться скопировать оператора на тот же сервер, на котором он был создан, например, в случае потери всех или части данных о его конфигурации. Как и в случае с заданиями и оповещениями, копирование операторов разделено на два этапа: создание скриптов для оператора на исходном сервере и последующее выполнение полученного сценария на сервере назначения. В результате "скриптования" администратор получит сценарий (script) — набор команд Transact-SQL, выполнение которого приведет к созданию оператора. В скрипте отображены все настройки оператора. Полученный сценарий может быть выполнен как на локальном, так и на удаленном сервере. Сгенерировать сценарий можно с помощью Enterprise Manager. Причем пользователь может создать скрипты как конкретного оператора в отдельности, так и всех операторов сразу. Чтобы сгенерировать сценарий для одного оператора, необходимо в левой панели Enterprise Manager выбрать объект Operators. В правой панели будет отображен список всех операторов, созданных на сервере. Затем необходимо указать нужный оператор и в его контекстном меню выбрать команду All Tasks, а затем команду Script Operator. В ответ откроется диалоговое окно Generate SQL Script, в котором необходимо задать имя файла для записи полученного сценария, а также выбрать формат файла и сконфигурировать некоторые другие параметры. Чтобы создать скрипты для всех существующих на сервере операторов, необходимо в контекстном меню объекта Operators в левой панели Enterprise Manager выбрать команду All Tasks, а затем команду Script All Operator.
Управление множеством серверов В предыдущих разделах подробно рассмотрено автоматическое управление локальным сервером. Читатель получил информацию о создании заданий и их шагов, оповещений и операторов. Приведенной информации достаточно, чтобы автоматизировать управление одиночным сервером. В больших организациях со множеством SQL Server 2000 управление серверами может быть весьма сложным. Часто необходимо придерживаться единого стандарта по управлению серверами и использовать одинаковые алгоритмы. Администратор должен следить за отображением изменений, сделанных в заданиях
508
Часть III. Администрирование
на одном сервере, на другие серверы. Выполнение этой работы вручную требует весьма больших усилий. Администратор должен каждый раз после внесения изменений создавать скрипты для заданий и выполнять полученные сценарии на других серверах. Для облегчения администрирования множества серверов в SQL Server 2000 была создана технология группового управления серверами (multiserver administration). Рассмотрим компоненты, используемые в групповом администрировании серверов: •
Master Server (MSX) — главный сервер;
• Target Server (TSX) — сервер назначения; П Multiserver Jobs — задание, которое будет выполняться на всех серверах группы. Каждый из перечисленных компонентов подробно рассмотрен в следующих разделах.
Главный сервер Чтобы управлять множеством серверов, их необходимо объединить в группу. Один из серверов группы должен быть выбран в качестве главного сервера (MSX, Master SQL Executive Server). Такой подход можно сравнить с концепцией домена Windows NT. Все компьютеры, которые могут иметь доступ к ресурсам домена, должны сначала быть включены в него, как того требует система безопасности. Если компьютер не включен в домен, он считается неавторизованным, и доступ к ресурсам ему запрещается. Доменом, пользователями домена и компьютерами управляет контроллер домена (domain controller). Группа серверов, которые должны управляться как одно целое, сравнима с доменом, а главный сервер — с контроллером домена. При выборе сервера, который будет сконфигурирован в качестве главного, следует оценить объем информации, которая станет им обрабатываться. Если в организации множество серверов и большое количество многосерверных заданий (multiserver jobs), то можно предположить, что нагрузка на главный сервер окажется значительной. В этом случае желательно не использовать этот сервер для хранения данных, а определить как выделенный для решения единственной задачи — управления серверами SQL Server 2000 организации. Такой сервер может служить центром управления серверами всей организации. Дополнительно администратор может копировать на этот сервер сообщения об ошибках SQL Server 2000, которые записываются в журнал приложений (application log) Windows NT на всех остальных серверах сети.
С
Замечание
J
Копирование сообщений с одного сервера на другой называется перенаправлением сообщений (forwarding events).
В принципе, сообщения SQL Server 2000 могут быть перенаправлены на любой другой сервер, но часто роль сервера сообщений и главного сервера принято со-
Глава 12. Автоматизация администрирования SQL Server 2000 вмещать на одном SQL Server 2000. Это позволяет быстро получать информацию о работе всех серверов сети и адекватно реагировать на происходящие события. Для копирования сообщений SQL Server 2000 в журнал приложений на удаленном компьютере служит вкладка Advanced окна SQL Server Agent Properties (рис. 12.23). Для вызова этого окна необходимо в контекстном меню объекта SQLServerAgent в панели Enterprise Manager выбрать команду Properties. SQL Server Agent Properties General Advanced | Д[ е [ ( System | Job System | Connection J г Restart services1
~
Auto restart SQL S_erver if it stops unexpectedly
'" Auto .restart SQL Server Agent if it stops unexpectedly SQL Server event forwarding [>7 Forward events to a different server Server:
| HABA-HABA
Events: (• LJnhandled events If event has severity of or above:
С All events
1010 - Information г Idle CPU condition |t he compute! is idle when:; Average CPU usage falls below: And remains below this level for:
OK
Cancel
G00
Apply
seconds
Help
Рис. 12.23. Окно SQL Server Agent Properties, вкладка Advanced
Управление копированием сообщений осуществляется с помощью группы элементов SQL Server event forwarding. Установка флажка Forward events to a different server разрешает перенаправление сообщений. В раскрывающемся списке Server необходимо выбрать имя одного из зарегистрированных серверов, на который должны пересылаться сообщения. Если нужный сервер еще не зарегистрирован, то его можно зарегистрировать, выбрав значение New Forwarding Server. С помощью переключателя Events можно определить круг сообщений, которые будут передаваться на удаленный сервер: • Unhandled events. В этом случае будут передаваться только те сообщения, которые не были обработаны на локальном сервере. • All events. При установке переключателя в данное положение на удаленный сервер будут передаваться все сообщения, независимо от того, были они обработаны на локальном сервере или нет. Кроме того, с помощью раскрывающегося списка If event has severity of or above можно определить уровень серьезности, который должны иметь сообщения,
509
Часть III. Администрирование
510
чтобы быть скопированными на удаленный сервер. Если уровень серьезности меньше указанного, то сообщение копироваться не будет. По умолчанию установлен минимальный уровень серьезности, т. е. копируются все сообщения. Для управления группой серверов необходимо создать оператора группы серверов (MSXOperator). Он получает сообщения о ходе выполнения заданий на серверах группы и в случае обнаружения сбоев в работе устраняет их. Желательно назначать оператором группы серверов человека, ответственного за администрирование группы в целом. Оператор группы серверов автоматически создается на всех серверах группы. В домене Windows NT может быть более одного контроллера домена, а в качестве главного сервера использоваться только один сервер группы. Не поддерживаются резервный или дублирующий серверы. При выходе из строя главного сервера автоматическое администрирование группы серверов будет остановлено. Для конфигурирования сервера в качестве главного предназначен мастер Make Master Server Wizard (или Make MSX Wizard), который можно вызвать, либо выбрав в контекстном меню объекта SQLServerAgent в левой панели Enterprise Manager команду Make This a Master, либо выбрав его в списке мастеров в окне Select Wizard, которое можно открыть, нажав на панели инструментов Enterprise Manager кнопку Run a Wizard. Первое окно мастера содержит информацию, которую необходимо ввести для создания главного сервера. Это окно может быть пропущено. Во втором окне мастера (рис. 12.24) необходимо сконфигурировать оператора группы серверов (MSXOperator). Make MSX Wizard - STORAGE Create "MSXOperator" Specify where to send notifications associated with this account. The MSXOperator wil be created at the MSX and each of the target servers (TSX). The multiserver jobs can send notification to this operator only. If you do not specify any addresses for this operator multiserver jobs wil not send completion notifications. Едай address:
1 emamae v@khakasnet. ru
Test
Pager address:
I ernamae v@mobil. khakassia. ru
Test
Net sen^ address:
STORAGE
< Back
Next >
Рис. 12.24. Второе окно мастера Make MSX Wizard
Cancel
Глава 12. Автоматизация администрирования SQL Server 2000 В окне необходимо указать адрес электронной почты (E-mail address), а также адрес пейджера (Pager address) или адрес пользователя в локальной сети (Net send address). Указанные данные должны принадлежать пользователю, выбранному в качестве оператора группы серверов. На каждом из серверов — участников группового администрирования — будет автоматически создан оператор с указанными адресами доставки сообщений. Этот оператор будет получать все сообщения, связанные с работой многосерверных заданий в группе. Если не указан ни один из адресов доставки, то система не будет иметь возможности информировать оператора о ходе выполнения многосерверных заданий. С помощью кнопки ^ J можно выбрать адрес отправки сообщения из адресной книги. Нажав кнопку Test, можно отправить тестовое сообщение для проверки связи. После того как все необходимые адреса доставки сообщения будут указаны, можно переходить к третьему окну мастера (рис. 12.25). В третьем окне мастера необходимо выбрать серверы, которые будут управляться создаваемым главным сервером. Эти серверы называются серверами назначения (TSX, Target SQL Server Executive). В окне имеется таблица, в которой приведены все серверы SQL Server 2000, которые были зарегистрированы на локальном сервере. Чтобы зарегистрировать новый сервер, нажмите кнопку Register Server. Откроется стандартное окно регистрации нового сервера Register SQL Server Properties. Для просмотра свойств сервера можно воспользоваться кнопкой Properties. Make MSX Wizard - STORAGE Select Servers to Enlist Select the servers running SQL Server that wil execute the multiserver jobs defined onJhjsjter^^These se[vers_wjl[be referred toas target servers (TSX). All servers selected must be running on a valid Windows NT account and should have access to network resources. Server Ж.ШШ5ШШ
Prompt for login credentials
Properties.. Regs iter Server. < Back
Next >
Рис. 12.25. Третье окно мастера Make MSX Wizard
Cancel
511
512
Часть III. Администрирование
Сервер назначения В предыдущем разделе было рассмотрено создание главного сервера, который является ключевым звеном в администрировании группы серверов. Серверы, получающие задания от главного сервера, называются серверами назначения (TSX, Target SQL Server Executive). В группе может иметься множество серверов назначения. Любой сервер назначения должен состоять только в одной группе серверов, т. е. не допускается получение сервером заданий с нескольких главных серверов. Кроме того, в качестве сервера назначения разрешается конфигурировать только SQL Server 2000, который работает под управлением операционной системы Windows NT. Также необходимо убедиться, что службы SQL Server 2000 запускаются под учетной записью пользователя домена. В противном случае сервер назначения не сможет работать с сетевыми ресурсами и, следовательно, не сможет подключиться к главному серверу для получения заданий.
(
Замечание
J
Необходимо убедиться, что учетная запись пользователя домена, под которой работают службы SQL Server 2000 сервера назначения, имеет необходимые права доступа к ресурсам главного сервера. В противном случае не удастся установить соединение между серверами. Для избежания подобных проблем настоятельно рекомендуется запускать службы всех серверов — участников одной группы под одной и той же учетной записью.
Для конфигурирования SQL Server 2000 в качестве сервера назначения используется мастер Make Target Server Wizard (или Make TSX Wizard). Для запуска этого мастера можно воспользоваться окном Select Wizard, в котором необходимо выбрать имя нужного мастера и нажать кнопку ОК. Для вызова данного окна достаточно нажать кнопку Run a Wizard в панели инструментов Enterprise Manager. Другой способ вызова мастера заключается в использовании контекстного меню объекта SQLServerAgent, в котором необходимо выбрать команду Make this a Target. Первое окно мастера традиционно не содержит никаких элементов управления и может быть пропущено. Во втором окне (рис. 12.26) необходимо указать информацию о главном сервере и сервере назначения. В окне содержится всего два элемента управления: П Master server (MSX). В этом поле необходимо указать имя главного сервера, которому будет подчиняться локальный сервер. С помощью кнопки _±j можно вызвать окно Select Server, в котором будут указаны все активные серверы сети. П Physical location of. В данном поле требуется ввести информацию о местонахождении конфигурируемого сервера назначения. Эти сведения предназначены для информирования администратора и не используются подсистемой автоматизации. На этом работа с мастером заканчивается. Следующее окно будет последним. В нем указан список задач, которые станут выполняться для конфигурирования сервера назначений.
Глава 12. Автоматизация администрирования SQL Server 2000
513
|маке TSX Wizard - STORAGE Specify Master Server and Target Server Locations Specify the master server (MSX) and (he physical location of the target server (TSX).
Master server (MSX):
STORAGEURELON
Physical location of 'STORAGE':
Аущшэрия 23G главного корпуса.
.
.. .
< Back
rt
M
fp^. jfJ
1
Next >
Cancel
Рис. 1 2 . 2 6 . Второе окно мастера Make TSX Wizard
Многосерверные задания После того как будет завершено создание главного сервера и конфигурирование серверов назначения, можно считать, что фундамент автоматического администрирования группы серверов создан. Пришло время приступать к созданию многосерверных задач (multiserver jobs). От обычных заданий многосерверные отличаются только тем, что последние будут автоматически выполняться сразу на нескольких серверах. Формирование многосерверного задания возможно только на главном сервере. Основные принципы при этом те же, что и в случае односерверного задания, которое было подробно рассмотрено ранее в этой главе. Чтобы сформировать многосерверное задание, необходимо в контекстном меню объекта Jobs выбрать команду New Job. Откроется диалоговое окно New Job Properties (рис. 12.27). Если сервер, на котором создается задание, сконфигурирован в качестве главного, то станет возможным установка переключателя Target multiple servers. В списке ниже приведен перечень серверов, на которых будет выполняться создаваемое задание. Для изменения данного списка необходимо нажать кнопку Change. На этом разница между обычным и многосерверным заданиями заканчивается. Все остальные действия по формированию задания одинаковы в обоих случаях. После того как будет сконфигурировано многосерверное задание, в таблицу sysdownioadiist базы данных Msdb добавится новая строка с описанием этого задания и указанием списка серверов назначения, которые должны его выполнить. Серверы назначения периодически подключаются к главному серверу и
Часть III. Администрирование
514
проверяют содержимое таблицы sysdownioadlist. Если для сервера назначения имеется новое задание, то он копирует его себе. New Job Properties - STORAGE General | Steps | Schedules] Notifications (?\ I Name: Created
i M aintenance_D atabase_J obs
Enabled <"" Target]ocal server I—i . (* Target multiple servers:
(Not yet created)
Category:
[uncateqorized (Local)
Owner:
STORAGE\Administratot
Description:
Source:
j
5TORAGE\Trelon
en
Zl
Задание, выполняющее базовые операции сопровождения данных -• агрегирование устаревших подробных данных и перенос их в журнал
LIT SECURITY
»|
Last modified: (Not applicable)
OK
Cancel
Apply
Help
Рис. 12.27. Окно New Job Properties
Замечание После того как все серверы назначения скопировали себе задания, из таблицы s y s d o w n i o a d l i s t должны удаляться соответствующие строки. Если этого не происходит, то на одном из этапов работы происходит сбой. Это возможно, например, в случае, когда один из серверов назначения не работает.
Задание выполняется в соответствии с установленным расписанием. SQL Server 2000 не координирует время выполнения заданий. То есть нельзя быть уверенным, что задания будут выполнены одновременно на всех серверах даже в случае указания конкретного времени их запуска. Часто это связано с тем, что на серверах установлено разное время. Чтобы точно синхронизировать время запуска заданий, нужно установить одинаковое время на всех серверах. Кроме того, в некоторых случаях задания могут быть не выполнены на части серверов, если запуск заданий зависит от состояния системы. После выполнения заданий серверы назначения могут подключаться к главному серверу, чтобы известить его о результатах выполнения задания. Сообщения о ходе выполнения многосерверного задания посылаются оператору группы серверов (MSXOperator). Этот оператор будет получать сообщения о ходе выполнения всех многосерверных заданий, созданных на одном главном сервере. В ходе выполнения многосерверного задания могут возникать ошибки. Они, как и другие сообщения SQL Server 2000, отображаются в журнале приложений Windows NT. Как уже говорилось, администратор может настроить перенаправление этих ошибок на любой другой зарегистрированный SQL Server 2000.
Глава 12. Автоматизация администрирования SQL Server 2000 Обычно сообщения со всех серверов назначения пересылаются на главный сервер для упрощения контроля работы серверов сети.
Мастер Database Maintenance Plan Wizard Подсистема автоматизации SQL Server 2000 позволяет администратору создавать довольно сложные задания, которые могут весьма заметно облегчить управление сервером. Но для создания задания часто необходимо иметь специальные знания не только непосредственно о формировании задания, но и о механизмах работы SQL Server 2000, чтобы грамотно выполнить ту или иную задачу. Даже для выполнения простых задач требуется некоторый объем знаний. Тем не менее, при работе с любой базой данных имеется ряд задач, которые придется выполнять любому администратору. К ним можно отнести обновление статистики, реорганизацию индексных страниц и страниц данных, уменьшение размера файлов баз данных и некоторые другие задачи. Для решения таких задач администратор может создать задания Gobs) подсистемы автоматизации. Однако, если вас не интересуют внутренние механизмы SQL Server 2000, и нет времени на изучение различных аспектов администрирования, то можно воспользоваться мастером сопровождения баз данных — Database Maintenance Plan Wizard. Мастер Database Maintenance Plan Wizard специально предназначен для создания плана, в соответствии с которым будут осуществляться автоматическое управление базами данных и решение типичных задач администрирования. Если открыть в Enterprise Manager папку Management любого сервера, то в ней можно найти объект Database Maintenance Plans. Если выбрать этот объект, то в правой панели Enterprise Manager отобразится список всех планов сопровождения баз данных, которые были созданы на локальном сервере. Для запуска мастера Database Maintenance Plan Wizard можно воспользоваться окном Select Wizard, вызываемым нажатием кнопки Run a Wizard в панели инструментов Enterprise Manager, или выбрать в контекстном меню объекта Database Maintenance Plans пункт New Maintenance Plan. Первое окно мастера содержит вводную информацию и может быть пропущено. Во втором окне (рис. 12.28) необходимо выбрать базы данных, на которые станет распространяться работа создаваемого плана. В окне есть группа переключателей, с помощью которых осуществляется выбор баз данных. Возможны следующие варианты: П All databases — все базы данных, созданные на сервере, включая системные. • All system databases (master, model, and msdb) — только системные базы данных. П All user databases (all databases other than master, model, and msdb) — только пользовательские базы данных. • These databases — при установке переключателя в это положение администратор может определить произвольный список баз данных, включающий как системные, так и пользовательские базы данных. Для этого предназначена таб-
515
Часть III. Администрирование
516
лица, размещенная в нижней части окна. Устанавливая флажок слева от имени базы данных, администратор тем самым включает ее в список баз данных, на которые будет распространяться создаваемый план. Database Maintenance Plan Wizard - STORAGE Select Databases Select the database for which to create the maintenance plan. Г All databases С All system databases (master, model, and msdb) С All user databases (all databases other than master, model, and msdb) f* it hese databases:! Database V; Administrator Database H Bonus
iL
Next> Cancel » — . .. i •
Hep l
Рис. 12.28. Второе окно мастера Database Maintenance Plan Wizard Database Maintenance Plan Wizard - STWtAGE Update Data Optimization Information As data and index pages fill, updating requires more time. Reorganising your data and index pages can improve performance. Reorganize data and index pages С Reorganize pages with the original amount of free space (* Change free space per page percentage to:
Remove unused space from database files When it grows beyond:
|5
MB
A.rnount of free space to remain after shrink:
|1O -f-j % of the data space
Schedule: Occurs every 1 week(s) on Sunday, at 1:00:00.
A Change...
Next>
Cancel
Help
Рис. 12.29. Третье окно мастера Database Maintenance Plan Wizard
Глава 12. Автоматизация администрирования SQL Server 2000
517
Когда список баз данных определен, можно переходить к третьему окну мастера (рис. 12.29). В этом окне администратор может разрешить перестроение данных. Со временем степень заполнения (fill factor) страницы данных и индексов увеличивается, что приводит к снижению производительности операций вставки и изменения данных. Этого можно избежать, выполнив реорганизацию данных, т. е. распределив их так, чтобы степень заполнения страниц снизилась до желательного уровня. Данная операция может быть выполнена как часть плана сопровождения базы данных. Чтобы добиться реорганизации страниц данных и индексов, в ходе выполнения плана сопровождения базы данных необходимо установить флажок Reorganize data and index pages. При этом станет активным переключатель, с помощью которого нужно выбрать режим перестроения страниц: • Reorganize pages with the original amount of free space. При установке переключателя в это положение степень заполнения страниц будет установлена на том уровне, который был определен при создании объекта (таблицы или индекса). • Change free space per page percentage to. В этом случае степень заполнения всех страниц в базе данных будет установлена на фиксированном уровне, задаваемом в процентах от размера страницы. По умолчанию предлагается степень заполнения 10%, т. е. размер базы данных будет в 10 раз больше реального объема данных. Зато количество расщеплений страниц (split page) окажется чрезвычайно низким. Помимо реорганизации страниц можно выполнить обновление статистики (statistics). Она используется оптимизатором запросов (query optimizer) для построения наиболее эффективного плана выполнения запроса. Чем более верна статистическая информация, тем более эффективным будет выполнение запроса. Для разрешения обновления статистики необходимо установить флажок Update statistics used by query optimizer. Дополнительно нужно определить (в процентах) объем базы данных, который станет применяться для создания статистики. Замечание Флажок Update statistics used by query optimizer будет активен только в том случае, если в базе данных разрешен сбор статистики. Позволить использование статистики для построения оптимизированного плана выполнения запроса можно с помощью хранимой процедуры s p _ d b o p t i o n , вызвав ее с параметром a u t o c r e a t e s t a t i s t i c s .
Размер базы данных со временем может существенно увеличиться. Причем, не всегда большая величина базы данных говорит о наличии существенного количества данных. Дело в том, что SQL Server 2000 автоматически не уменьшает размер базы при удалении данных. Может получиться, что в базе данных было создано несколько временных таблиц, которые содержат большой объем информации. Размер базы данных соответственно увеличился до необходимого размера. После анализа информации временные таблицы были удалены. Но размер базы данных
Часть III. Администрирование
518
не уменьшился. То есть в базе данных имеется много неиспользуемого пространства. Уменьшение (shrink) размера базы данных должно осуществляться вручную с помощью специальных хранимых процедур. Эти хранимые процедуры могут быть вызваны отдельно или как часть плана сопровождения базы данных. Чтобы уменьшить базу данных до нормальных размеров, в ходе выполнения плана сопровождения базы данных необходимо установить флажок Remove unused space from database files в третьем окне мастера Database Maintenance Plan Wizard. При этом станут активными два дополнительных элемента: П When it grows beyond. В данном поле указывается размер базы данных, превышение которого инициирует уменьшение ее размера. Если размер меньше указанного значения, то уменьшение выполняться не будет, даже если заполнение базы данных низкое. D Amount of free space to remain after shrink. В этом поле указывается объем свободного пространства, которое должно быть оставлено в базе данных для последующего роста. Значение указывается в процентах от объема данных. Последний элемент, который имеется в третьем окне мастера — поле Schedule, в котором указывается расписание запуска плана сопровождения базы данных. По умолчанию запуск производится каждое воскресенье в час ночи (Occurs every 1 week(s) on Sunday, at 1:00:00). Для изменения расписания запуска необходимо нажать кнопку Change. На этом работа с третьим окном мастера Database Maintenance Plan Wizard заканчивается. Четвертое окно мастера (рис. 12.30) предназначено для конфигурирования проверки целостности данных. Database Maintenance Plan Wizard - 51 ORAGE ; Database Integrity Check Database integrity tests can detect inconsistencies caused by hardware or software errors.
f? Check database integrity (* Include indexes I** Attempt to repair any minor problems у £xclude indexes |ч? iPei'forrn these tests Before doing backups] Schedule: Occurs every 1 week(s) on Sunday, at 0:00:00.
Jack
Next>
Cancel
Help
Рис. 12.30. Четвертое окно мастера Database Maintenance Plan Wizard
Глава 12. Автоматизация администрирования SQL Server 2000 Для разрешения проверки целостности данных необходимо установить флажок Check database integrity. После этого станут активными все остальные элементы управления, расположенные в этом окне: П Include indexes. При установке этого переключателя в проверку целостности будет включена проверка целостности индексов. В этом случае будет возможна пометка следующего флажка. • Attempt to repair any minor problems. Когда установлен данный флажок, сервер будет автоматически восстанавливать незначительные повреждения целостности данных. Рекомендуется всегда отмечать этот флажок. •
Exclude indexes. При выборе этого переключателя проверка целостности индексов выполняться не будет.
• Perform these tests before doing backups. Установка этого флажка предпишет выполнять проверку целостности данных перед тем, как будет начато создание резервной копии. Проверка действует только на операции резервного копирования, выполняемые в текущем плане сопровождения базы данных. Если после указанной операции в базе данных еще остаются ошибки, то в случае установки флажка создание резервной копии базы данных или журнала транзакций выполняться не будет. Для операций проверки целостности данных можно определить отдельное расписание, отличное от расписания реорганизации данных, устанавливаемого в третьем окне мастера. Для изменения расписания необходимо нажать кнопку Change. На этом работа с четвертым окном мастера заканчивается. Следующее, пятое окно (рис. 12.31), предназначено для управления операциями резервного копирования. Database Maintenance Plan Wizard - STORAGE Specify the Database Backup Plan Specify the database backup plan to prevent data loss due to system failure. •: of the maintenance pjaH
lB|ck up the '
П? Verify the integrity of the backup on completion of the backup Location to store the backup file:
Г Tape:
j
][]
Disk
Schedule: Occurs every 1 week(s) on Sunday, at 2:00:00.
< Дзск
Hex*. >
Cancel
Help
Рис. 12.31. Пятое окно мастера Database Maintenance Plan Wizard
519
520
Часть III. Администрирование
Резервное копирование относится к тем операциям, которые выполняются в любой организации, поэтому в план сопровождения баз данных была включена возможность создания резервных копий. Для разрешения резервного копирования данных необходимо установить флажок Back up the database as part of the maintenance plan. После этого станут доступными другие элементы управления: П Verify the integrity of the backup on completion of the backup. При установке флажка система начнет проверять целостность и полноту созданных резервных копий. • Location to store the backup file. Переключатели предназначены для выбора метода хранения резервной копии. Возможен один из следующих вариантов: • Таре — в этом случае данные хранятся на ленте. В раскрывающемся списке необходимо выбрать имя устройства резервного копирования, установленного на компьютере; •
Disk — при установке переключателя в это положение данные будут сохраняться на диске. В данном случае мастер добавит дополнительное окно, в котором необходимо определить размещение и формат файлов резервных копий.
В нижней части окна находится поле Schedule, содержащее расписание создания резервных копий данных. Для изменения этого расписания нужно нажать кнопку Change. Содержимое шестого окна мастера (рис. 12.32) зависит от того, какой метод хранения данных был выбран в пятом окне. Если в группе Location to store the backup file установлен переключатель Disk, то шестое окно мастера будет содержать набор элементов управления для конфигурирования файлов резервных копий. Предположим, что выбран именно этот способ хранения данных, и рассмотрим поведение мастера в указанном случае. Переключатели группы Directory in which to store the backup file служат для выбора каталога, в который будут записываться файлы резервных копий: П Use the default backup directory. В этом случае файлы резервных копий будут сохранены в стандартном каталоге \Mssql7\Backup. • Use this directory. При установке переключателя пользователь может указать произвольный каталог, в котором должны быть сохранены файлы резервных копий. Допускается использование только локальных жестких дисков. Дополнительно для файлов каждой базы данных можно создать отдельный каталог. Для этого необходимо установить флажок Create a subdirectory for each database. Если создание резервных копий выполняется периодически, то через какое-то время место на диске кончится. Чтобы избежать этого, можно разрешить системе автоматически удалять старые файлы, установив флажок Remove files older than. При этом станут активными еще два элемента управления. В первом из них необходимо выбрать количество периодов, которое должно пройти с момента создания файла, прежде чем он будет удален. Во втором выбирается тип периода — минута (Minute(s)), час (Hour(s)), день (Day(s)), неделя
Глава 12. Автоматизация администрирования SQL Server 2000
521
(Week(s)) или месяц (Month(s)). По умолчанию файлы удаляются через 4 недели после их создания. 2<J
Database Maintenance Plan Wizard - STORAGE Specify Backup Disk Directory Specify the directory in which to store the backup file. Directory in which to store the backup file: f> Use the default backup^ directory <~ Use this directory: P? Create a subdirectory for each database
В ackup file extension:
ВАК
(Note: Disk backup file names are generated automatically. For example: pubsjlogj 99803120206.bak, where 199803120206 is the timestamp].
<£ack
Next>
Cancel
Help
Рис. 12.32. Шестое окно мастера Database Maintenance Plan Wizard
В поле Backup file extension указывается расширение, которое будут иметь файлы резервных копий. По умолчанию это расширение bak.
Замечание Имена файлов резервных копий генерируются автоматически в виде "pubs_tlog_ 199803120206.bak", где 199803120206 является "временным штампом" (time stamp), с помощью которого достигается уникальность каждого генерируемого файла.
На этом работа с шестым окном мастера заканчивается. В следующем окне (рис. 12.33) пользователь может разрешить создание резервной копии журнала транзакций как часть плана сопровождения баз данных. Для разрешения автоматического создания резервной копии журнала транзакций необходимо установить флажок Back up the transaction log as part of the maintenance plan. Работа с остальными элементами окна ничем не отличается от работы с аналогичными элементами пятого окна мастера. В случае выбора диска в качестве места хранения восьмое окно мастера будет содержать набор элементов управления для конфигурирования файлов резервных копий. Работа с этим окном ничем не отличается от работы с шестым окном мастера. По умолчанию файлы резервных копий журнала транзакций имеют расширение trn. Мы не будем рассматривать данное окно, поэтому восьмое окно мастера (рис. 12.34) бу-
522
Часть III. Администрирование
дет использоваться для конфигурирования отчета о ходе выполнения создаваемого плана сопровождения баз данных. Database Maintenance Plan Wizard - STORAGE Г~5_ [лЗ\
Specify the Transaction Log Backup Plan Specify the transaction log backup plan to prevent failures and operator errors.
IBgck ' as part of the man i tenance piarj J7 Verify the integrity of the backup on compe l to i n of the backup Location to store the backup file: Г Tafie:
|
— —
~j
Dsik Schedue l:
Occurs every 1 week(s) on Monday, Tuesday, Wednesday, j Thursday, Friday, Saturday, at 0:00:00.
< Back
Next >
Change..
Cancel
Help
Рис. 12.33. Седьмое окно мастера Database Maintenance Plan Wizard
Database Maintenance Plan Wizard - STORAGE Reports to Generate Specify the directory in which to store the reports generated by the maintenance plan.
Write report to a text file in directory: Г* Delete text report files older than:
||e:
rato
[crosoft SQL Server\MSSQL\LOG\ И
_ j [WeekfsJ
v
j
Diesel New Operator..
Next>
Cancel
Help
Рис. 12.34. Восьмое окно мастера Database Maintenance Plan Wizard
Глава 12. Автоматизация администрирования SQL Server 2000
523
По умолчанию отчет о ходе выполнения плана не сохраняется. При установке флажка Write report to a text file in directory сгенерированный отчет будет сохранен в файл. Необходимо указать каталог, в который станет сохраняться отчет. Кроме того, можно сконфигурировать автоматическое удаление старых файлов, информация которых оказалась неактуальной. Для этого необходимо установить флажок Delete text report files older than и определить срок, по истечении которого файлы отчетов начнут удаляться. Помимо того что файлы будут сохраняться на диске, можно отправлять отчеты операторам по электронной почте. Для чего необходимо установить флажок Send e-mail report to operator. Затем в раскрывающемся списке следует выбрать имя оператора, которому будет отправляться сообщение. Адрес электронной почты, на который будет отправлено сообщение, берется из параметров настройки оператора. Database Maintenance Plan Wizard - STORAGE Maintenance History The record of the activities performed can be stored on the server on which they were performed, and/or another (remote) server. Local server f? Write history to the msdb.dbo.sysdbmaintplan_history table on this server Limit tows in the table to: 1000
-1 rows for this plan
Remote server History is added to the msdb.dbQ.sysdbmaintplan_history table on the remote server. Windows NT Authentication is used to log on to the remote server. Write history to the server:
CIT
K? Limit rows in the table to: 10000 < Back
Next>
*Tj rows for this plan Cancel
Help
Рис. 12.35. Девятое окно мастера Database Maintenance Plan Wizard
Информация о ходе выполнения плана сопровождения базы данных может быть сохранена В таблице sysdbmaintplan_history базы данных Msdb. Для этого в девятом окне мастера (рис. 12.35) необходимо установить флажок Write history to the msdb.dbo.sysdbmaintplanjhistory table on this server. Если генерируется большое количество информации для записи в указанную таблицу, то со временем база данных Msdb может значительно увеличиться. Чтобы этого не происходило, SQL Server 2000 позволяет автоматически удалять устаревшую информацию. Для этого нужно установить флажок Limit rows in the table to и указать количество строк, которое будет отводиться в таблице для
524
Часть III. Администрирование
хранения информации для создаваемого плана. По умолчанию размер таблицы ограничен 1000 строк. Помимо того, что информация о ходе выполнения плана хранится на локальном сервере, она может быть сохранена в таблице sysdbmaintpian__history на удаленном сервере. Для этого необходимо установить флажок Write history to the server. Затем следует выбрать сервер, на который станет копироваться информация. Дополнительно можно ограничить размер таблицы на удаленном сервере, установив флажок Limit rows in the table to. По умолчанию размер удаленной таблицы sysdbmaintpian_history ограничен 10 000 строк для этого плана. На этом создание плана сопровождения баз данных заканчивается. В последнем окне мастера приведена сводная информация о создаваемом плане. При необходимости пользователь может вернуться к любому предыдущему шагу и изменить произвольный параметр.
Глава 13
Резервное копирование Как бы хорошо ни работал администратор, нельзя дать стопроцентную гарантию надежности системы. В функционировании любой системы рано или поздно случаются сбои. Не всегда они связаны с плохой работой администратора. Во многих случаях сбои происходят по причинам, от него не зависящим. Например, вряд ли можно предсказать, когда именно произойдет скачок напряжения или в здании случится пожар. Также следует учесть сбои в аппаратной части компьютера, например, выход из строя жесткого диска. Кроме того, нельзя не брать в расчет стихийные бедствия, такие как землетрясения, ураганы, наводнения и т. д. В задачи администратора входит не только поддержание системы в работоспособном состоянии, но и оперативное ее восстановление в случае повреждения всей системы или одной из ее частей. Под повреждением системы понимается не только физическое повреждение компьютера или комплектующих, но также злонамеренное или неумышленное удаление или изменение данных пользователями, приведшее к искажению информации или нарушению целостности информационных структур организации. Во многих случаях администратор не может предотвратить повреждение системы, однако в его силах свести к минимуму возможный ущерб. Если в результате пожара сервер был полностью уничтожен, и нет никакой возможности считать данные с его жесткого диска, то остается единственный выход — использовать резервную копию данных. Создание полных копий данных является единственным надежным способом гарантированного сохранения информации. Поэтому созданию резервных копий данных следует уделять пристальное внимание. Лучше перестраховаться и, затратив небольшие усилия, создать резервную копию и спать спокойно, чем потом собирать информацию по кусочкам и объяснять начальству, что никакой вашей вины в потере данных нет. Помимо того, что администратор должен заниматься ликвидацией последствий кризисных ситуаций и сведением к минимуму ущерба от них, он также должен по возможности оградить систему от этих ситуаций. Человеку трудно противостоять землетрясению, но он может успешно бороться со скачками напряжения и временными отключениями электричества — достаточно установить источники бесперебойного питания или сетевые фильтры. Администратор SQL Server 2000 имеет в своем распоряжении множество средств обеспечения надежности системы: G резервное копирование данных и журнала транзакций; • использование резервного сервера;
Часть III. Администрирование
526 •
создание кластеров;
П возможности технологии RAID. Каждое из приведенных средств имеет свои недостатки и преимущества. Например, технологии RAID (Redundant Array of Independent Disks) обеспечивают работоспособность системы в случае небольших сбоев в функционировании дисковой системы, но при выходе из строя всего компьютера на помощь приходит резервный сервер или кластер. Когда же все серверы повреждены, и нет возможности восстановить данные ни с одного из них, то остается лишь обратиться к резервной копии. Упомянутые средства обеспечения надежности системы не исключают друг друга. Наоборот, желательно применять их совместно друг с другом. Например, информационная система предприятия может работать на главном сервере совместно с резервным, и на каждом из них может использоваться чередование дисков с контролем четности. Кроме того, необходимо периодически создавать резервную копию данных, чтобы иметь возможность восстановить информацию при выходе из строя обоих серверов баз данных (например, в случае пожара или природного катаклизма).
Замечание Технологии дублирования, зеркального отображения и чередования с контролем четности, предназначенные для обеспечения отказоустойчивости дисковых массивов RAID, будут рассмотрены в разд. "Технология RAID" главы 16. Эта глава полностью посвящена рассмотрению работы с подсистемой резервного копирования.
Введение в резервное копирование Резервное копирование (back up) является одним из самых надежных способов защиты данных от потери. Технологии RAID обеспечивают функционирование системы при выходе из строя одного из жестких дисков или даже дискового контроллера. Но они бессильны в случае выхода из строя оперативной памяти, центрального процессора или сетевой карты. В этом случае пользователи не смогут получить с сервера данные. Решением проблемы будет использование резервного сервера или кластера. Но предположим, что информация на всех серверах была уничтожена. Чтобы иметь возможность восстановить данные, необходимо иметь полную их копию. Такая копия данных называется резервной (backup), и ни пользователи, ни система не имеют к ней доступа. Отдельно необходимо отметить, что резервная копия имеет значительно меньший размер по сравнению с исходной базой данных. Часто процесс создания резервной копии также называют архивированием. При потере данных резервная копия переносится в систему, и пользователи могут снова работать с информацией. Конечно, система будет восстановлена в том состоянии, в котором она была во время создания резервной копии. Поэтому необходимо внимательно отнестись к вопросу частоты создания резерв-
Глава 13. Резервное копирование
527
ной копии. Если данные обновляются интенсивно, то администратор должен выполнять резервное копирование достаточно часто, чтобы в случае повреждения данных восстановить информацию с наименьшими потерями. Если же данные обновляются редко или вовсе не обновляются, то резервирование может производиться реже. Замечание Часто архивирование используется для переноса баз данных между серверами SQL Server 2000. База данных архивируется на исходном сервере на какой-нибудь носитель, который затем рассылается на другие серверы. На удаленном сервере администратор восстанавливает базу данных и может успешно с ней работать. Однако при выполнении подобного переноса следует учесть, что база данных может быть восстановлена только на SQL Server 2000, имеющем те же параметры кодовой страницы, порядка сортировки и сопоставления Unicode, что и переносимая база данных. В противном случае SQL Server 2000 выдаст соответствующее сообщение о невозможности восстановления БД. Если база данных имеет большой размер и интенсивно обновляется, то процесс создания резервной копии всех данных может занять очень много времени. Кроме того, если при создании резервной копии пользователи продолжают работать с данными, то к моменту завершения резервирования уже скопированные данные могут быть изменены, что способно привести к нарушению целостности информации. Во избежание подобных проблем SQL Server 2000 автоматически отслеживает изменения в уже скопированных данных и обновляет их. Однако если резервирование длится слишком долго, то пользователи не смогут полноценно работать с данными. Необходимо каким-либо образом сократить время архивирования, гарантируя при этом полноту резервной копии. SQL Server 2000 поддерживает различные типы резервного копирования, позволяя администратору очень гибко управлять данным процессом. Существует: П полная копия; •
разностная копия;
П копия журнала транзакций; П резервное копирование файлов и групп файлов. Каждый из упомянутых типов будет подробно рассмотрен в следующих разделах.
С
Замечание
^
Необходимо сразу отметить, что создаваемые средствами SQL Server 2000 резервные копии не упаковываются в полной мере. Хотя после архивирования базы данных и будет получен единственный файл, его можно дополнительно уплотнить профессиональным архиватором, таким как, например ARJ, RAR или ZIP. С помощью подобных утилит архивы SQL Server 2000 могут быть сжаты еще примерно в 10 раз.
Полная копия Полная копия базы данных (database backup) является стандартным типом резервного копирования. Этот тип резервирования предполагает полное копирование 18 Зак. 83
528
Часть III. Администрирование
всей информации, имеющейся в базе данных. В качестве приемника данных может выступать либо обычный файл, либо специальное устройство резервного копирования, такое как стример, магнитооптический или ZIP-диск. Замечание Работа с приемниками данных будет рассмотрена отдельно далее в этой главе.
Полное копирование данных имеет свои недостатки и преимущества. К последним можно отнести то, что для приведения системы в рабочее состояние достаточно восстановить лишь один архив, т. к. вся необходимая информация содержится в единственной резервной копии. К недостаткам же относится длительное время создания архива даже в случае внесения незначительных изменений в базу данных. Независимо от того, какая часть информации была изменена (или не изменена вовсе), создание архива будет занимать всегда одинаковое время. При работе с большими базами данных это является существенным недостатком, т. к. вследствие значительного времени создания архива приходится выполнять резервное копирование раз в сутки, обычно ночью, или даже раз в неделю на выходных. Актуальность таких архивов низка. Предположим, что создание резервных копий производится раз в неделю на выходных, а сбой происходит в пятницу. Администратор сможет восстановить систему, но изменения, производимые пользователями в течение недели, будут потеряны. Поэтому полное копирование данных необходимо комбинировать с дифференциальным копированием и копированием журнала транзакций, речь о которых пойдет в следующих разделах. Теперь предположим, что данные в системе изменяются очень интенсивно, и в промежуток времени между операциями резервного копирования большая часть строк таблиц изменяется по несколько раз. Использование дифференциальных копий и копий журнала транзакций предполагает отслеживание всех операций изменения данных, выполненных в базе данных после последней операции резервного копирования. Поэтому в рассматриваемом случае возможна ситуация, когда объем информации об изменениях в базе данных будет заметно превышать объем самих данных. Поэтому в подобных ситуациях лучше будет использовать полное копирование данных. Процесс резервирования часто длится довольно долго, и пользователи успевают изменить данные, которые уже были скопированы. Если не контролировать эти изменения, то целостность данных будет нарушена. Например, если пользователь удаляет строку, которая была расположена в уже скопированной части таблицы, и вставляет ее в конец таблицы, то она будет скопирована два раза. Если в исходной таблице установлено ограничение целостности, обеспечивающее уникальность строк, то при восстановлении данных SQL Server 2000 не разрешит вставить две дублирующиеся строки, и пользователь получит сообщение об ошибке. Как уже говорилось, SQL Server 2000 автоматически отслеживает изменения в уже скопированных данных и обновляет их в архиве. В результате к моменту завершения резервного копирования состояние данных в архиве будет соответ-
Глава 13. Резервное копирование
529
ствовать информации в исходной базе данных. Это гарантирует целостность и достоверность данных.
ЗамёчаНие При архивировании полной копии данных SQL Server 2000 не выполняет усечение (truncate) журнала транзакций. Со временем журнал транзакций может переполниться, и работоспособность системы будет нарушена. Администратор должен либо вручную выполнять усечение с помощью команды BACKUP LOG С использованием о п ц и и T R U N C A T E _ O N L Y , л и б о в о з л о ж и т ь эту о б я з а н н о с т ь на с и с т е м у . В п о с л е д н е м
случае для базы данных необходимо установить свойство T r u n c a t e l o g on c h e c k p o i n t . Это можно сделать как с помощью Enterprise Manager, открыв окно свойств базы данных, так и с помощью хранимой процедуры s p _ d b o p t i o n .
Существует ряд операций, которые не могут выполняться одновременно с процессом создания резервной копии. Приведем список этих операций: П создание и удаление файлов базы данных; •
создание индексов;
П выполнение операций, нерегистрируемых в журнале транзакций; • автоматическое или ручное уменьшение (shrinking) базы данных или ее файлов. Если при начале создания резервной копии запускается одна из указанных операций, то попытка завершится неудачей, и пользователь получит соответствующее сообщение об ошибке. Если же во время создания архива система или пользователь пытается выполнить запрещенные операции, то они отменяются, а процесс резервирования продолжается.
Разностная копия Разностное, или дифференциальное резервное копирование (differential database backup) было разработано с целью уменьшения времени, необходимого для получения копии базы данных. В основе дифференциальной копии лежит отслеживание изменений, вносимых пользователями в базу данных. Создание дифференциальной копии состоит из двух этапов: •
создание полной копии данных;
О создание собственно дифференциальной копии. Полная копия базы данных является отправной точкой, начиная с которой система может отслеживать изменения. Изменения отслеживаются на уровне страниц. Каждая страница имеет флаг архивирования, который сбрасывается при создании полной копии и устанавливается, если данные на странице были изменены. Это можно сравнить с атрибутом архивирования для файлов. При создании резервной копии 1 атрибут снимается, но если файл изменяется, то система автоматически устанавливает его. Программа резервного копирования ищет все файлы с установленным атрибутом архивирования и копирует их. АналоНе путайте с программами архивации данных типа ARJ, RAR или ZIP. — Ред.
530
Часть III. Администрирование
гично ведет себя и подсистема резервного копирования SQL Server 2000. Однако необходимо отметить, что флаг архивирования для страниц данных снимается только при создании полной копии данных. Это означает, что при создании последовательно нескольких дифференциальных копий каждая следующая будет полностью включать страницы, которые были включены в предыдущую копию плюс все страницы, измененные со времени создания предыдущей копии. Поэтому актуальна только самая последняя дифференциальная копия. Достаточно применить ее после восстановления полной резервной копии, чтобы целиком восстановить систему. Замечание Как и в случае с полным копированием, SQL Server 2000 не выполняет усечения журнала транзакций.
В больших базах данных с относительно небольшим количеством изменений дифференциальное копирование является наиболее оптимальным методом резервирования данных. Администратор может раз в неделю (обычно в выходные) создавать полную копию данных, а каждой ночью (или дополнительно еще и днем) создавать дифференциальную копию. Ежедневное создание полной копии было бы невозможно из-за того, что на это уходит очень много времени. Создание же дифференциальной копии требует значительно меньше времени.
Копия журнала транзакций В двух рассмотренных выше типах резервного копирования фиксируется состояние системы на конкретный момент времени. Восстановив полную копию базы данных или дополнительно еще и разностную копию, можно восстановить систему в том состоянии, в котором она была на момент создания архива. Однако нельзя восстановить систему в промежуточном состоянии. В некоторых случаях требуется восстановить систему в состоянии, в котором она была за полчаса до выполнения операции резервного копирования. Такая ситуация нередка при повреждении большого объема данных и недостаточно частом резервном копировании. Предположим, что полная резервная копия создается раз в неделю, а каждую ночь формируется разностная резервная копия базы данных'. В 8 часов утра вы обнаруживаете, что один из пользователей вчера по ошибке удалил большое количество информации из базы данных. Хотя у вас и имеется резервная копия, созданная в прошлую ночь, вы не сможете воспользоваться ею, т. к она содержит уже поврежденные данные. Для восстановления данных придется использовать еще более раннюю резервную копию. При этом будут потеряны все изменения, внесенные пользователями в базу данных за прошлый день. Эти изменения необходимо будет восстанавливать вручную. Решением подобных проблем является применение резервного копирования журнала транзакций (transaction log backup). Этот тип резервного копирования позволяет сохранять информацию обо всех транзакциях, выполненных в базе дан-
Глава 13. Резервное копирование
531
ных. В итоге резервная копия содержит непрерывную цепочку изменений, которые претерпели данные со времени последнего архивирования. Такая цепочка позволяет восстановить систему в состоянии, в котором она была в любой момент времени, и этот момент отображен в резервной копии. При восстановлении резервной копии журнала транзакций SQL Server 2000 последовательно выполняет все изменения, выполненные пользователями в базе данных. Естественно, чтобы иметь возможность восстановить резервную копию журнала транзакций, необходимо создать стартовую точку, начиная с которой можно применять транзакции. Состояние системы при этом должно соответствовать тому состоянию, в котором она была на момент, начиная с которого отслеживались транзакции. Такая отправная точка может быть получена в результате восстановления полной копии базы данных. Кроме того, дополнительно к восстановлению полной копии базы данных рекомендуется выполнить восстановление разностной копии, после чего восстановить резервную копию журнала транзакций. (
Замечание
^
Необходимо следить за соответствием времени создания полной и разностной копии и времени создания копии журнала транзакций. Если журнал транзакций содержит информацию обо всех изменениях данных, начиная с 10 часов утра, а разностная копия была создана в 8 часов утра, то восстановление системы может закончиться неудачей. Действительно, за те два часа, которые не отражены ни в одной резервной копии, база данных могла претерпеть значительные изменения. Транзакции, хранящиеся в резервной копии журнала транзакций, не будут соответствовать данным в разностной копии. Попытка применить транзакции к некорректным данным закончится неудачей. Если вы планируете применять резервное копирование журнала транзакций, необходимо следить за тем, чтобы в нем отображалась информация обо всех транзакциях, выполненных в базе данных, и чтобы эта информация была непрерывной. При этом нельзя устанавливать для базы свойство t r u n c . log on chkpt (Truncate transaction log on checkpoint). При установке этой опции SQL Server 2000 периодически удаляет из журнала транзакций информацию об уже завершенных (неактивных) транзакциях. Данная операция называется усечением (truncate). Усечение приведет к тому, что информация о транзакциях окажется потерянной, и будет нарушена непрерывность цепочки изменений, отображаемой в резервной копии журнала транзакций. (
Замечание
Автоматическое усечение журнала транзакций предназначено для поддержания минимального размера журнала транзакций. В противном случае журнал транзакций непрерывно увеличивается, пока не заполнит все свободное пространство. Администратор может выполнять усечение журнала транзакций вручную. При резервном копировании журнала транзакций SQL Server 2000 автоматически выполняет усечение журнала транзакций после завершения создания архива. То есть размер журнала транзакций будет автоматически поддерживаться на
532
Часть III. Администрирование
нормальном уровне. Еще раз заметим, что ни пользователь, ни SQL Server 2000 не должны выполнять усечения журнала транзакций. Иначе целостность информации об изменениях в базе данных будет нарушена. Операция усечения должна выполняться только после завершения создания резервной копии журнала транзакций. Следующий архив будет содержать только те транзакции, которые были выполнены после завершения создания последней резервной копии журнала транзакций. Между операциями создания полной или разностной копии базы данных могут выполняться несколько операций архивирования журнала транзакций. Но при восстановлении базы данных необходимо последовательно применять каждую из копий журнала транзакций. В отличие от дифференциальной копии, которая отображает все изменения, сделанные в базе данных после создания последней полной копии, резервная копия журнала транзакций отображает только цепочку изменений, сделанных после последней операции архивирования журнала транзакций. Это происходит потому, что SQL Server автоматически осуществляет усечение журнала транзакций после завершения создания его резервной копии. То есть журнал транзакций просто не содержит никакой информации о транзакциях, выполненных ранее. При создании резервной копии журнала транзакций SQL Server 2000 включает в архив только те транзакции, которые были завершены к моменту окончания создания резервной копии. Если транзакция была завершена на 99% к моменту создания архива, то она все равно не будет включена в резервную копию. Однако при выполнении усечения журнала транзакций эта транзакция не будет удалена из журнала и при следующем архивировании журнала транзакций будет включена в архив. При восстановлении резервной копии журнала транзакций можно не восстанавливать весь архив полностью. Администратор может указать конкретный момент времени, до которого он желает восстановить изменения. Предположим, что архив журнала транзакций охватывает промежуток времени с 8 часов утра и до 4 часов вечера. Вы предполагаете, что в 2 часа дня один из пользователей выполнил некорректный запрос, который повредил большое количество важной информации. Эти изменения отражены в резервной копии журнала транзакций. Полное восстановление архива не помогло бы восстановить систему в корректном состоянии. Но администратор при "реанимации" архива может явно указать, что должны быть восстановлены все изменения, выполненные до 2 часов дня. При этом не будут восстанавливаться транзакции, приводящие к повреждению информации.
Резервное копирование файлов и групп файлов Это последний из типов резервного копирование SQL Server 2000. Как уже было сказано, база данных состоит из одного или более файлов данных и одного или более файлов журнала транзакций. То есть любая база данных состоит минимум
Глава 13. Резервное копирование
533
из двух файлов. Ни полное, ни резервное копирование не позволяют архивировать только часть данных, например, только данные без индексов или только столбцы типа image, t e x t и ntext. Резервная копия журнала транзакций отображает лишь операции изменения данных. SQL Server 2000 позволяет выполнять частичное архивирование данных. Для этого администратор должен использовать копирование файлов или групп файлов. Такой подход позволяет контролировать диапазон архивируемых данных вплоть до конкретного столбца таблицы. В основе этого подхода лежит возможность привязывания таблицы или даже отдельного столбца к конкретному файлу или группе файлов. Все данные, принадлежащие столбцу, будут размещаться только в указанном файле или группе файлов. Обычно к файлу или группе файлов привязываются либо таблицы целиком, либо столбцы с типом данных image, t e x t и ntext, требующие значительных ресурсов для их обработки. Используя архивирование файла или группы файлов, администратор может создать резервную копию отдельной таблицы базы данных. Это бывает полезно, если большую часть базы данных составляет справочная информация, которая не изменяется. Создавая резервные копии отдельных файлов, содержащих интенсивно изменяемые таблицы, можно снизить общие затраты на резервирование данных. При работе с рассматриваемым типом баз данных обычно повреждаются только пользовательские данные, тогда как справочные сведения остаются неизменными.
Замечание Для гарантии неизменности справочных данных все содержащие их таблицы можно прикрепить к группе файлов и установить ее в режим только для чтения (read only). Для восстановления целостности данных будет достаточно восстановить отдельный файл или группу файлов. Однако чтобы такое восстановление не сопровождалось проблемами, администратор обязан следить за тем, чтобы связанные данные оставались согласованными после восстановления архива. Рассмотрим следующую ситуацию. Имеются две связанные таблицы, прикрепленные к разным файлам и архивируемые отдельно. В первой, основной таблице хранится описание сотрудников фирмы, а во второй — проекты, над которыми они работают. Проекты связаны с людьми по личным идентификаторам сотрудников, которые определяются в первой таблице. Предположим, что файл с основной таблицей был поврежден, и администратор восстановил архив недельной давности. За время, прошедшее с момента создания этого архива, в первую таблицу были добавлены несколько строк, описывающие новых сотрудников. Эти сотрудники были закреплены за определенными проектами, что было отображено во второй таблице. После восстановления файла с первой таблицей данные о новых сотрудниках окажутся потерянными. Однако во второй таблице останется информация о связи новых сотрудников с проектами. Налицо нарушение целостности данных. Во избежание подобных проблем рекомендуется хранить все связанные данные в одной группе файлов и выполнять ее архивирование за одну операцию.
534
Часть III. Администрирование
В некоторых случаях создание полной копии базы данных невозможно, т. к. необходимо обеспечить практически круглосуточную работу сервера семь дней в неделю. У администратора имеется в распоряжении всего два-три часа в сутки. С помощью архивирования файлов или группы файлов администратор может разбить архивирование большой базы данных на несколько менее "тяжелых" операций, занимающих меньше времени. Создание резервной копии всей базы данных можно разбить на несколько операций архивирования отдельных файлов базы данных. В этом случае архивирование базы данных может растянуться на несколько суток. В принципе этот процесс может быть непрерывным. По завершении архивирования последнего файла, SQL Server 2000 может начать все заново. Однако в таком подходе есть свои минусы. Может сложиться такая ситуация, что связанные данные архивируются в разные сутки, и восстановление отдельных файлов не гарантирует целостности базы данных. Для решения подобных проблем необходимо дополнительно создавать резервную копию журнала транзакций, с помощью которой можно будет синхронизировать все файлы базы данных. Архивирование отдельных файлов или групп файлов предоставляет администратору дополнительные возможности по восстановлению работоспособности системы в случае аппаратного сбоя. Если база данных размещена на множестве дисков, то в случае повреждения одного из них для восстановления системы достаточно будет установить новый жесткий диск и восстановить только файлы, которые находились на поврежденном диске. Не нужно будет восстанавливать всю базу данных.
Планирование стратегии резервного копирования На первый взгляд может показаться, что резервная копия журнала транзакций имеет меньший размер, чем разностная копия базы данных. Однако это не всегда так. Дифференциальная копия отображает состояние системы в конкретный момент времени. При этом не хранится информация о промежуточных изменениях. Если в базе данных каждая строка изменяется примерно один-два раза со времени создания полной копии, то разностная копия будет иметь больший размер, чем копия журнала транзакций. Однако если строки обновляются часто, то копия журнала транзакций может быть значительно больше разностной копии. Обычно дублирование журнала транзакций комбинируется с полным и разностным резервным копированием базы данных. Такой подход позволяет эффективно совместить актуальность резервных копий с низкими требованиями к ресурсам. Естественно, администратор хочет иметь резервную копию самых свежих данных. Это желание легко удовлетворить при работе с небольшими базами данных — достаточно с требуемой периодичностью создавать полные копии базы данных. Однако при работе с большими объемами данных, создание полной резервной копии которых может занять более 12 часов, поддерживать актуальность резервных копий гораздо сложнее. В этом случае применяется следующая комбинация типов резервного копирования:
Глава 13. Резервное копирование
535
1. Создается полная резервная копия. Обычно данная операция выполняется раз в неделю на выходных. В другие дни создание полной резервной копии невозможно, т. к. этот процесс может занять существенную часть рабочего дня. Кроме того, в больших корпорациях нередки случаи, когда пользователи работают ночью, и создание резервных копий в это время нежелательно. 2. Создается разностная копия. Этот процесс требует гораздо меньше времени, чем создание полной копии, и может выполняться каждую ночь, а в некоторых случаях и в обед. В первые дни недели разностная копия будет иметь небольшой объем, т. к. количество изменений невелико. Однако к концу недели размер разностной копии может существенно увеличиться. Прежде чем планировать время выполнения архивирования данных, необходимо провести наблюдение, как изменяется размер разностных копий с течением времени и сколько времени требуется для полного завершения этого процесса. 3. Создается копия журнала транзакций. Это последний этап. Данный процесс требует минимального количества системных ресурсов по сравнению с другими типами резервного копирования. Архивирование журнала транзакций можно выполнять гораздо чаще, чем создание разностной копии. При необходимости создание резервной копии журнала транзакций можно осуществлять каждые час-два или чаще. При выборе частоты архивирования следует учесть, что в сумме объем копируемой информации будет один и тот же, независимо от того, один раз выполняется архивирование, или десять. Чем чаще создается резервная копия, тем меньше потерь понесет ваша организация в случае сбоя системы. Однако помимо затрат на сам процесс архивирования имеются и побочные затраты на блокирование, копирование и т. д. В приведенной схеме создается набор резервных копий, с помощью которого можно восстановить систему в любом состоянии, в котором она была в течение недели. Ключевым звеном является полная резервная копия. При ее потере или повреждении все остальные резервные копии не имеют значения, т. к. нет отправной точки для их применения. Для восстановления резервной копии журнала транзакций необходимо сначала восстановить разностную копию, для которой, в свою очередь, необходимо сначала восстановить полную копию базы данных. Замечание Администратор должен позаботиться о создании нескольких наборов резервных копий, которые бы охватывали более чем одну неделю. В этом случае останется возможность восстановить систему даже в случае повреждения полной копии базы данных.
Выбор носителя Важным моментом планирования процесса резервного копирования является выбор носителя, на котором будет храниться резервная копия. Настоятельно рекомендуется не хранить резервную копию на одном диске с исходными данными, т. к. при повреждении аппаратной части вы можете лишиться и рабочих данных, и резервной копии. Хранение архива вместе с данными допустимо
536
Часть III. Администрирование
только в том случае, если вы уверены в аппаратной части и опасаетесь повреждений данных, вызванных действиями пользователей. Пользователи не могут повредить резервную копию. В качестве носителя информации для системы резервного копирования могут использоваться следующие средства: • Магнитная лента. Это наиболее часто используемый тип носителей для хранения резервных копий. Аппаратно реализуется в виде устройств, называемых стримерами. В стример вставляется кассета с лентой, с которой пользователь хочет работать. По завершении работы можно вставить другую ленту. Стримеры различаются по форматам используемых лент. К формату ленты относятся характеристики ее ширины, ширины корпуса (3,5" и 5,25") и длины ленты. Все эти параметры вместе с архитектурой самого стримера влияют на объем данных, которые можно хранить на одной ленте. Преимуществом использования стримера является большой объем данных, который можно записать на ленту. Однако существенный недостаток заключается в относительно медленной скорости записи и чтения данных. SQL Server 2000 позволяет записывать данные только на стример, подключенный к локальному компьютеру. Это означает, что если в вашей организации имеется множество серверов SQL Server 2000, и лишь на одном из них установлен стример, то вы сможете обратиться к стримеру только с него. SQL Server 2000 использует для лент тот же формат, что и утилита Windows NT Backup. Это означает, что резервные копии SQL Server 2000 могут храниться совместно с системными архивами Windows NT и пользовательскими резервными копиями. SQL Server 2000 может одновременно работать с несколькими стримерами. Эта особенность может быть использована при архивировании больших баз данных, не помещающихся на одной ленте, или для ускорения операции резервирования. Однако ничто не мешает выполнять архивирование с помощью одного стримера — необходимо лишь менять ленты по мере их заполнения. Замечание При обновлении SQL Server предыдущих версий мастер Upgrade Wizard использует специальный формат, который не совместим с форматом утилиты Backup и, следовательно, форматом резервных копий SQL Server 2000. Диск. В качестве носителя информации этого типа может выступать любой диск, с которым операционная система способна работать напрямую, т. е. без дополнительных утилит. Таким диском может являться и обычный жесткий диск, и гибкий диск, и ZIP-диск, и даже магнитооптический диск. В последнее время получают распространение диски DVD. Накопители этого типа также могут выступать в качестве носителя резервной копии. Архив SQL Server 2000 представляет собой обычный файл операционной системы, с которым могут выполняться те же операции, что и при работе с другими файлами: копирование, переименование, удаление, перемещение и т. д. Кроме того, если на диске, выбранном в качестве носителя при выполнении архивирования, используется файловая система NTFS, то необходимо убедиться, что права доступа сконфигурированы правильно. Пользователю, под учетной
Глава 13. Резервное копирование
537
записью которого работает SQL Server 2000, необходимо присвоить соответствующие права в каталоге, в который будет записываться архив. В противном случае операция архивирования закончится неудачей. • Сетевой ресурс. В качестве носителя можно также использовать сетевой диск. Данный вариант часто используется, если в организации установлено множество SQL Server 2000. Каждый из них автономно выполняет резервирование баз данных, а полученный архив записывает на центральный сервер, откуда администратор сможет скопировать резервные копии на магнитную ленту, компакт-диск или любой другой недорогой носитель информации длительного хранения. Прежде чем начать архивирование баз данных на сетевой ресурс, необходимо убедиться, что учетной записи, под которой работает SQL Server 2000, предоставлены соответствующие права доступа к используемому сетевому ресурсу, а также права доступа к удаленному диску на уровне NTFS. Замечание Архивирование баз данных SQL Server 2000 на сетевой ресурс невозможно, если службы SQL Server 2000 запускаются под локальной учетной записью (системы или пользователя). Обращение к сетевым ресурсам возможно только тогда, когда службы запускаются под учетной записью пользователя домена. • Именованные каналы. Это последний из типов носителей, применяемых системой резервного копирования. В принципе, при работе с любым из перечисленных выше типов носителей SQL Server 2000 также использует именованные каналы. Работа с именованными каналами (named pipes) в "чистом" виде необходима, если вы хотите использовать свое собственное приложение для обработки архивов SQL Server 2000. Именованные каналы предоставляют механизм обмена информацией между приложениями. SQL Server 2000 "закачивает" данные в канал, а ваше приложение получает их из него. Дальнейшие операции, выполняемые с полученными данными, зависят от вашей фантазии. Нельзя сказать, что один тип носителя лучше другого и следует стремиться использовать только его. Выбор зависит от множества факторов, уникальных в каждом случае. Можно лишь дать некоторые общие рекомендации. Как уже было сказано, не рекомендуется хранить резервные копии вместе с основными данными. Особенно важно это замечание при использовании в качестве носителя локального жесткого диска. По умолчанию SQL Server 2000 сохраняет резервные копии в каталоге \Program Files\Microsoft SQL Server\Mssql\Backup, тогда как файлы баз данных по умолчанию хранятся в каталоге \Program Files\Microsoft SQL Server\Mssql\Data. Если вы используете параметры по умолчанию, то при выходе жесткого диска из строя вы потеряете и сами данные, и резервные копии. Чем более независимы будут исходные данные и резервная копия, тем больше шансов, что информация не окажется потерянной. Не рекомендуется хранить данные и архивы в пределах одного компьютера, даже на разных жестких дисках. Если вы все же по некоторым соображениям хотите хранить резервные копии на
538
Часть III. Администрирование
жестком диске, то следует размещать их на удаленном компьютере. В случае уничтожения одного компьютера, например, в результате пожара, взрыва или наводнения, останется возможность восстановить данные с другого компьютера. При хранении данных на магнитной ленте или переносном диске (например, дискете, ZIP-диске, DVD-диске и т. д.), необходимо хранить их в защищенном от повреждения месте, например в сейфе. Хотя резервная копия требуется в случае повреждения основных данных, может оказаться, что и сами резервные данные будут повреждены, например, диск или ленты исчерпали свой ресурс на количество перезаписей, а администратор этого вовремя не заметил. Если ваши данные чрезвычайно важны, то, вероятно, вы примете решение о создании дубликата резервной копии. Отдельно стоит обратить внимание на конфиденциальность данных. Если вы архивируете важную коммерческую информацию, которая не должна попасть в руки конкурентов, то необходимо об этом позаботиться. Часто бывает, что сами данные хорошо защищены, и к ним трудно получить доступ, но резервные копии хранятся открыто. При определенных усилиях злоумышленник может получить к ним доступ и, следовательно, к конфиденциальным данным. Необходимо ограничить доступ к носителю резервной копии. При архивировании важной информации часто делаются две резервных копии, что еще больше усложняет проблему безопасности. В больших организациях с высоким уровнем безопасности резервные копии принято хранить в несгораемых сейфах.
Резервное копирование системных баз данных Когда мы говорили о резервном копировании, речь, прежде всего, шла о пользовательских базах данных. Но не стоит забывать и о системной информации, без которой работа SQL Server 2000 будет невозможной. Наиболее критическим местом являются системные базы данных Master и Msdb. Первая из них содержит всю системную информацию о работе SQL Server 2000. Повреждение этой базы данных приведет как минимум к неправильной работе сервера, а как максимум — к невозможности запуска.
(^
Замечание
J
Говоря про повреждение базы данных, мы имеем в виду не только порчу файлов базы данных (повреждение на физическом уровне), но и внесение неверных данных в системные таблицы, удаление или модификация этих таблиц (повреждение на логическом уровне). Наиболее важной для пользователя информацией, хранимой в базе данных Master, являются сведения об учетных записях, которым предоставлен доступ к SQL Server 2000, и информация о системных и пользовательских базах данных. Вся информация о пользовательских объектах баз данных, таблицах, хранимых процедурах и т. д. хранится в пользовательских базах данных. При повреждении или даже потере базы данных Master эта информация остается.
Глава 13. Резервное копирование
539
Замечание Рекомендуется выполнять архивирование базы данных M a s t e r каждый раз после выполнения важных операций: добавления учетных записей, создания или удаления баз данных, изменения настроек SQL Server 2000 и т. д.
Системная база данных Msdb содержит информацию подсистемы автоматизации SQL Server 2000, используемую службой SQLServerAgent. К указанной информации относятся данные об операторах, оповещениях и заданиях. Повреждение базы данных Msdb является гораздо менее серьезной проблемой, чем потеря базы данных Master, однако если вы активно используете подсистему автоматизации, то и это нежелательно. Если же подсистема автоматизации не используется и агент SQLServerAgent не запускается, то архивированием базы данных Msdb можно пренебречь. Базу данных Msdb можно архивировать, как обычную пользовательскую базу данных. Замечание Для системной базы данных M a s t e r разрешается создание только полных резервных копий. То есть создание резервных копий журнала транзакций и разностных резервных копий не допускается. Для базы данных Msdb позволительно создание не только полной, но и разностной резервной копии. Однако архивирование журнала транзакций не разрешается.
Мы не рассмотрели еще две системных базы данных — Model и Tempdb. Первая из них используется как шаблон при создании новой базы данных. Особой необходимости в ее архивировании нет. Вторая же предназначена для хранения всех временных объектов, создаваемых пользователями. Архивирование этой базы данных бессмысленно, т. к. база данных Tempdb создается заново каждый раз, когда стартует SQL Server 2000. При останове сервера происходит автоматическое уничтожение всех временных объектов и удаление самой базы данных Tempdb. Организация резервных копий системных баз данных выполняется точно так же, как и создание резервных копий пользовательских баз данных. Осуществление этой операции будет рассмотрено в одном из следующих разделов данной главы.
Восстановление системных баз данных Действия, выполняемые при восстановлении пользовательских и системных баз данных, весьма схожи. Однако база данных Master имеет некоторые особенности, которые необходимо учитывать. Как уже говорилось, база данных Master является фундаментом работы SQL Server 2000. В ней содержится вся системная информация, необходимая для функционирования SQL Server 2000 — начиная от размещения пользовательских баз данных и учетных записей пользователей и заканчивая информацией о процессорах и объеме оперативной памяти, доступных серверу и т. д. Повреждение этой информации может привести к тому, что служба MSSQLServer не запустится, и стандартные инструменты восстановления архивов SQL Server 2000 ока-
540
Часть III. Администрирование
жутся не доступны. Однако рассмотрим сначала ситуацию, когда все же удалось запустить SQL Server 2000, и администратор может воспользоваться стандартными инструментами. В указанном случае обычно теряется информация о пользовательских базах данных или учетных записях пользователей, но остается вся системная информация. В этой ситуации для восстановления базы данных Master применяется резервная копия, полученная с помощью средств самого SQL Server 2000. Администратор должен запустить SQL Server 2000 в однопользовательском режиме (singleuser mode), чтобы никто кроме самого администратора не мог работать с сервером и блокировать данные. Кроме того, перед запуском сервера в однопользовательском режиме следует удостовериться, что никакие службы, кроме службы MSSQLServer, не запускаются. В противном случае администратор не сможет работать с сервером. Это происходит потому, что с SQL Server 2000 разрешено устанавливать только одно соединение, и это соединение будет использовано дополнительной службой. Замечание Для запуска SQL Server 2000 в однопользовательском режиме нужно выполнить команду s q l s e r v r . e x e - т . Предварительно необходимо остановить сервер, если он был запущен.
После того как сервер будет запущен в однопользовательском режиме, администратор может приступать к восстановлению базы данных Master. При этом выполняются те же операции, что и при восстановлении обычных баз данных. Если со времени создания резервной копии администратор создал новые базы данных или учетные записи, или, наоборот, удалил их, то эти изменения необходимо будет воспроизвести заново. Операция подключения баз данных будет рассмотрена далее в этой главе. Мы рассмотрели методику восстановления базы данных Master средствами SQL Server 2000. Однако в некоторых случаях запуск сервера может быть невозможен, т. к. хранящаяся в базе данных Master информация является некорректной или вообще отсутствует. В подобной ситуации можно прибегнуть к одному из двух способов: запустить утилиту rebuildm.exe или восстановить базу данных Master как обычный файл операционной системы. Утилита rebuildm.exe восстанавливает базу данных Master, распаковывая ее с инсталляционного набора SQL Server 2000 и внося в нее необходимую информацию. Файл с шаблоном базы данных Master копируется в процессе установки на жесткий диск и может быть распакован в любой момент с помощью указанной утилиты. Однако у такого подхода есть значительный минус — теряется любая информация, которая была наработана. База данных Master будет находиться в том же состоянии, что и сразу после установки SQL Server 2000. Администратор должен будет восстанавливать все изменения вручную. Поэтому использование утилиты rebuildm.exe является крайним случаем, когда все другие возможности исчерпаны, и все что остается администратору — это добиться за-
Глава 13. Резервное копирование
541
пуска SQL Server 2000. Однако, как уже говорилось, пользовательские базы данных остаются неповрежденными, и администратор всегда может подключить их. Последний способ восстановления базы данных Master — это копирование ее файлов. Любая база данных представляет собой набор как минимум двух файлов. Администратор может продублировать базу данных как набор файлов и при необходимости восстановить ее, скопировав эти файлы обратно. Также файлы базы данных могут быть архивированы как обычные файлы операционной системы с помощью утилиты Windows NT Backup. Однако при выполнении подобных операций следует предварительно остановить службу MSSQLServer. Когда эта служба запущена, сервер блокирует файлы базы данных от любого использования другими процессами, так что попытки пользователя открыть файл закончатся неудачей. Подобным способом можно создать или восстановить резервную копию любой другой пользовательской или системной базы данных.
Присоединение баз данных После восстановления базы данных Master может оказаться, что некоторые базы данных не присутствуют в системе. Однако сами базы данных, а точнее их файлы, находятся на жестком диске и являются неповрежденными. Вы можете подключить эти базы данных к SQL Server 2000 и продолжить их эксплуатацию. Присоединение (attach) базы данных — это процесс создания в таблице sysdatabases базы данных Master новой строки с описанием базы данных. Каждая БД описывается единственной строкой, в которой указывается имя и размещение только главного, или первичного файла (primary file) базы данных. Описание всех остальных файлов, включая файлы журнала транзакций, хранится в первичном файле базы данных. Если положение этих файлов изменилось, то в процессе присоединения обновляется соответствующая информация в первичном файле. Кроме того, что присоединение баз данных производится после восстановления поврежденной базы данных Master как неизбежная операция, присоединение может использоваться для переноса баз данных между серверами. Помимо присоединения, пользователь может также выполнять отсоединение (detach) базы данных. В этом случае из таблицы sysdatabases базы данных Master просто удаляется соответствующая строка, и SQL Server 2000 теряет информацию о существовании соответствующей БД. Файлы отсоединенной базы данных могут быть скопированы на компакт-диски и разосланы в филиалы компании, где "местные" администраторы выполнят присоединение и смогут нормально работать. (~
Замечание
^
Если вы хотите отсоединить базы данных для перенесения их на другой SQL Server 2000, то следует учесть, что база данных может быть присоединена только на сервере, имеющем то же сопоставление, что и переносимая база данных.
Замечание Присоединение базы данных не сопровождается никакими проверками на целостность данных и соответствие пользователей базы данных учетным записям SQL
542
Часть III. Администрирование Server 2000. Вполне может встретиться ситуация, когда в базе данных существуют пользователи, не связанные ни с какой учетной записью.
Для присоединения базы данных предназначена sp_attach_db со следующим синтаксисом:
хранимая
процедура
sp_attach_db [@dbname =] 'dbname', [Qfilenamel =] 'filename_n' [ , . . . 1 6 ] Рассмотрим использование аргументов этой хранимой процедуры. О
[@dbname =] 'dbname' Указывает имя, которое будет присвоено присоединяемой базе данных. Обычно для присоединяемой базы данных используется то же имя, которое она имела до отсоединения, но администратор может задать и любое другое.
П
[@filenamel
=]
'filename_n'
[,...16]
Позволяет указать имена файлов БД. Если база данных не перемещалась, и все ее файлы находятся в тех же каталогах, что и до отсоединения, то достаточно указать имя и местоположение только главного файла (с расширением mdf). Если же база данных была перенесена в другой каталог или на другой диск, или же была скопирована с другого компьютера, то необходимо указать имена и местоположение всех файлов базы данных. Имена файлов должны отделяться запятыми. Как видно из синтаксиса, можно указать до 16 файлов базы данных.
Замечание Указание файлов журнала транзакций не обязательно. Присоединяя базу данных, администратор может определить только файлы данных. В этом случае SQL Server 2000 автоматически создаст новый журнал транзакций с единственным файлом. Имя этого файла будет dbnamejog.ldf. Для отсоединения баз данных служит хранимая процедура имеющая представленный ниже синтаксис: sp_detach_db [@dbname =] 'dbname1 [, [Sskipchecks =] 'skipchecks']
sp_detach_db,
С помощью аргумента ' dbname' указывается имя базы данных, которую необходимо отсоединить. Аргумент 'skipchecks' определяет, будет ли выполняться обновление статистики или нет. По умолчанию этому аргументу присвоено значение NULL. Если пользователь указывает значение TRUE, TO выполнение команды UPDATE STATISTICS пропускается. Когда же указывается значение FALSE, TO команда UPDATE STATISTICS выполняется.
Ограничения при выполнении архивирования При разработке механизмов резервного копирования программисты Microsoft исходили, прежде всего, из требования, что архивирование должно выполняться в процессе обычной работы сервера. Пользователи должны иметь возможность
Глава 13. Резервное копирование
543
работать с данными в то время, когда выполняется архивирование системы. Но при этом все же рекомендуется, чтобы дублирование выполнялось в периоды наименьшей активности пользователей, т. к. этот процесс требует существенных системных ресурсов. Тем не менее, все изменения, сделанные пользователями за время создания резервной копии, будут включены в архив. Однако включаются только те изменения, которые были закончены к концу процесса создания резервной копии, т. е. была завершена транзакция, в которой выполнялись соответствующие изменения. Хотя разработчики Microsoft в общем успешно решили вопрос о совмещении операций резервного копирования с нормальной работой пользователей, все же существует ряд операций, которые нельзя выполнять совместно с операциями резервного копирования: • создание или удаление базы данных; П создание индексов; • сжатие базы данных; •
выполнение операций, не фиксируемых в журнале транзакций.
Если одна из перечисленных операций выполняется в тот момент, когда администратор начинает создание резервной копии, то его попытка заканчивается неудачей. Администратор должен дождаться завершения выполняемой операции и уже после этого приступить к созданию архива. Если же во время создания архива сервер пытается выполнить одну из указанных в списке операций, то эта попытка заканчивается неудачей, и должна быть отложена до момента завершения архивирования.
Архивирование с использованием Transact-SQL SQL Server 2000 предлагает несколько способов создания архивов баз данных, журнала транзакций, файлов или групп файлов: •
Использование Enterprise Manager
•
Использование Backup Wizard
П Возможности Transact-SQL Замечание Помимо перечисленных методов создания резервных копий баз данных архивирование может выполняться как часть плана сопровождения баз данных. Для создания такого плана необходимо воспользоваться мастером Database Maintenance Plan Wizard. Работа с этим мастером была рассмотрена в разд. "Использование Database Maintenance Plan Wizard" главы 12.
При выполнении архивирования оредствами Transact-SQL служит команда BACKUP. С ее помощью можно выполнять создание полной и разностной резерв-
544
Часть III. Администрирование
ной копий базы данных, копии журнала транзакций и копий файлов или групп файлов. Мы рассмотрим создание резервных копий как с использованием указанной команды, так и с помощью Enterprise Manager и мастера. Однако сначала выясним, как организуется резервное копирование средствами Transact-SQL.
Создание полной и разностной копий Данный раздел будет посвящен рассмотрению создания полной и разностной резервной копий. В предыдущих разделах этой главы были подробно разобраны особенности каждого из типов архивирования. В текущем разделе будет рассмотрено создание полной и разностной копии базы данных с помощью команды BACKUP, которая при выполнении указанной операции имеет следующий синтаксис: BACKUP DATABASE {database_name I @database_name_var} TO [ , . . . n ] [WITH [BLOCKSIZE = {blocksize | @blocksize_variable}] [ [ , ] DESCRIPTION = {text I @text_variable}] [ [ , ] DIFFERENTIAL] [ [ , ] EXPIREDATE = {date | @date_var} I RETAINDAYS = {days | gdays_var}] [ [ , ] FORMAT | NOFORMAT] [ [ , ] {INIT | NOINIT}] [ [ , ] MEDIADESCRIPTION =• {text I @text_variable}] [ [ , ] MEDIANAME = {media_name I @media_name_variable}] [ [ , ] [NAME = {backup_set_name I @backup_set_name_var}] [ [ , ] {NOSKIP | SKIP}] [ [ , ] {NOUNLOAD | UNLOAD}] [ [ , ] [RESTART] [ [, ] STATS [= percentage]] Рассмотрим подробно назначение каждого из аргументов команды. G database_name
| @database_name_var
Указывает имя базы данных, которую необходимо архивировать. Имя базы ДанНЫХ МОЖеТ быТЬ Задано Непосредственно (database_name) ИЛИ С ПОМОЩЬЮ переменной (@database_name_var). Строка с именем базы данных может иметь любой символьный тип данных, кроме типов ntext или t e x t . О [, . . . п ] Эта конструкция определяет носитель, на который должна быть сохранена полученная резервная копия. Ее синтаксис таков: ::= { {backup_device_name I @backup_device_name_var}
Глава 13. Резервное копирование
545
{DISK | TAPE | PIPE} = {'temp_backup_device' | @temp_backup_device_var} }
Аргументы backup_device_name I @backup_device_name_var указывают логическое имя устройства резервного копирования, которое было ему присвоено при конфигурировании в SQL Server 2000 с помощью хранимой процедуры sp_addumpdevice. Имя устройства может быть указано как непосредственно, так и с помощью переменной. В качестве устройства резервного копирования может выступать как физическое устройство (стример, ZIPдиск или жесткий диск), так и каналы. Помимо использования уже сконфигурированного устройства, можно выполнить архивирование на временное устройство резервного копирования (temporary backup device). В этом случае подсистема резервного^опирования автоматически создает новое устройство перед началом архивирования и удаляет его по завершении создания резервной копии. Замечание Если вы хотите использовать временные устройства резервного копирования, то перед началом архивирования следует убедиться, что в системе уже нет устройства с аналогичным именем. В противном случае система не сможет создать новое устройство, и процесс архивирования закончится неудачей.
В р е м е н н ы е устройства часто п р и м е н я ю т с я , когда в качестве н о с и т е л я выступает каталог жесткого диска. П р и работе с о стримерами практикуется и с пользование п о с т о я н н ы х устройств. Аргументы D I S K | TAPE | P I P E задают тип временного устройства резервного к о п и р о в а н и я . И м я устройства о п р е деляется С ПОМОЩЬЮ аргументов 'temp_backup_device' И @temp_backup_device_var. Первый из них используется, когда имя устройства указано как строковая константа, второй же — когда имя устройства задается с помощью переменной. Замечание При выборе в качестве носителя магнитной ленты рекомендуется использовать параметр W I T H FORMAT, если нет уверенности, что лента, на которую выполняется архивирование, имеет формат Microsoft Tape Format (MTF). В этом случае перед записью данных будет выполнено предварительное форматирование ленты в корректном формате. При попытке записи архива на ленту с форматом, отличным от Microsoft Tape Format, будет выдана соответствующая ошибка.
Замечание Как видно из синтаксиса команды, SQL Server 2000 допускает архивирование сразу на несколько устройств. Это утверждение верно как в отношении ленточных накопителей (стримеров), так и именованных каналов и дисков. Однако все используемые устройства должны быть одного типа. То есть не допускается одновременное архивирование, например, на ленту и на жесткий диск.
546 •
Часть III. Администрирование BLOCKSIZE = {blocksize I @blocksize_variable} С помощью этого аргумента указывается размер в байтах, который будет иметь блок данных. Однако значение данного параметра учитывается только при работе с лентой, когда запись на нее выполняется с указанием ключа FORMAT. Однако при записи на компакт-диск необходимо всегда устанавливать размер блока, равный 2048 байт. Если в качестве носителя используется жесткий диск, то конкретный размер блока выбирается автоматически в зависимости от типа жесткого диска. При работе с именованными каналами размер блока равен 65 536 байт. В обоих случаях размер блока, указанный с помощью аргумента BLOCKSIZE, игнорируется.
П
DESCRIPTION = {text I @text_variable} Позволяет создать описание создаваемого архива. Текст описания размером до 255 символов сохраняется вместе с архивом, создаваемым на конкретном устройстве резервного копирования. Описание применяется чисто в информативных целях, помогая администратору понять, что за данные хранятся в архиве. На ход выполнения резервного копирования описание не влияет.
•
DIFFERENTIAL
При использовании этого ключевого слова будет создана разностная резервная копия базы данных. Создание такой копии возможно, только если уже есть полная резервная копия. Разностная копия содержит только те данные, которые были изменены со времени создания последней полной резервной копии. Если ключевое слово DIFFERENTIAL не указывается, то будет создана полная резервная копия базы данных. П
EXPIREDATE = {date I @date_var} Данный аргумент определяет время актуальности архива. После наступления указанной даты архив считается устаревшим и может быть перезаписан. Но до истечения срока система не даст перезаписать архив. Дата конца актуальности архива может быть указана с помощью текстовой строки (date), содержащей дату в правильном формате, или с помощью переменной (@date_var), имеющей ТИП данных smalldatetime ИЛИ datetime. Аргумент EXPIREDATE не используется при работе с именованными каналами, а учитывается лишь при записи архива на ленту или диск.
П
RETAINDAYS = {days
| @days__var}
В отличие от предыдущего аргумента этот определяет актуальность носителя не конкретной датой, а количеством дней, которое должно пройти со времени создания архива. До истечения указанного срока SQL Server 2000 не позволит переписать архив. Однако опция RETAINDAYS учитывается только при использовании опции INIT И игнорируется при задании опции SKIP. (~
Замечание
)
Если не приведены ни опция EXPIREDATE, НИ ОПЦИЯ RETAINDAYS, TO при создании
архива устанавливается срок актуальности, определенный на уровне сервера. Из-
Глава 13. Резервное копирование
547
менить значение этой опции можно с помощью хранимой процедуры s p _ c o n f i g u r e с применением параметра media r e t e n t i o n . •
FORMAT
При указании этого аргумента выполнится перезапись заголовков томов. Существующие заголовки будут удалены. Эта операция сравнима с операцией форматирования дискет перед записью на них. Все содержимое дискет при этом теряется. Если носитель защищен паролем, то пароль игнорируется. G
NОFORMAT
В отличие от предыдущего данный параметр явно указывает, что существующие заголовки не должны перезаписываться. Однако при использовании опции I N I T параметр NOFORMAT игнорируется. •
INIT
Параметр определяет, что резервная копия SQL Server 2000 должна быть первым файлом на диске или ленте. При указании этой опции любые данные на носителе будут перезаписаны. Однако перезапись не происходит, если на устройстве не истек срок актуальности архивов, установленный при его создании с помощью опций EXPIREDATE И RETAINDAYS.
Замечание Проверка актуальности пропускается, если при вызове команды BACKUP указана опция SKIP. •
NOINIT
Аргумент имеет действие, обратное аргументу INIT. TO есть архив будет добавлен к существующему набору файлов. •
MEDIADESCRIPTION = {text | @te^t_variable} Указывает описание для всего набора носителей резервных копий. Не нужно путать с параметром DESCRIPTION, С ПОМОЩЬЮ которого присваивается опи-
сание для архива, создаваемого на конкретном устройстве. Длина описания не должна превышать 255 символов и может указываться непосредственно в виде строковой константы или с помощью переменной любого текстового типа, исключая t e x t и ntext. П MEDIANAME = {media_name I @media_name_variable} Этот аргумент предназначен для указания имени носителя, на котором была создана резервная копия. Если имя носителя не определено, то будет подставлено имя, которое использовалось ранее. Имя носителя может быть длиной до 128 символов. •
NAME = {backup_set_name I @backup_set__name_var} Имя архива. Длина имени ограничивается 128 символами. Если имя не указывается, то будет использовано пустое имя.
548 П
Часть III. Администрирование SKIP
При задании этой опции пропускается проверка актуальности архива и имени, которая обычно производится при выполнении команды BACKUP. Указание опции SKIP позволяет перезаписывать архивы, которые еще актуальны. П
NOSKIP
В отличие от предыдущего аргумента требует выполнения проверки имени и актуальности архивов, чтобы избежать случайной перезаписи информации на носителе. •
UNLOAD
Используется только при сохранении архива на ленту. Если при создании архива указывается ключевое слово UNLOAD, TO после того как создание архива будет завершено или место на ленте кончится, она будет автоматически выгружена из устройства. По умолчанию лента выгружается. •
NOUNLOAD
Действие опции противоположно предыдущей опции — автоматическая выгрузка ленты из устройства резервного копирования не выполняется. П
RESTART
С помощью этого ключевого слова можно заставить SQL Server 2000 продолжить прерванную операцию создания резервной копии. Для этого необходимо указать команду BACKUP С такими же параметрами, которые были использованы при запуске процесса архивирования, и добавить ключевое слово RESTART. Продолжение прерванного архивирования необязательно, однако это позволяет сэкономить время. П
STATS [= percentage]
Аргумент позволяет указать (в процентах) дискретность шкалы индикатора процесса архивирования. По умолчанию пользователь получает сообщение по завершении каждых 10% процесса. В качестве примера рассмотрим создание полной резервной копии базы данных pubs. Резервная копия будет создана на локальном диске и сохранена в файле pubs.bak: BACKUP DATABASE pubs TO DISK = 'c:\pubs.bak'
После выполнения команды будет возвращена следующая информация: Processed 176 pages for database 'pubs', file 'pubs' on file 1. Processed 1 pages for database 'pubs', file 'pubs_log' on file 1. BACKUP DATABASE successfully processed 177 pages in 0.54 9 seconds (2.629 MB/sec).
На основе выведенных сведений можно судить об успешности попытки создания резервной копии и получить некоторые статистические данные, в частности, о количестве обработанных страниц данных, времени архивирования и скорости сохранения данных на выбранный носитель.
Глава 13. Резервное копирование
549
В приведенном выше примере резервная копия была создана на локальном диске. Теперь же рассмотрим образование резервной копии на устройстве резервного копирования. Однако, перед этим необходимо создать устройство резервного копирования, на которое будет сохраняться архив. Организация логического устройства резервного копирования выполняется с помощью системной хранимой процедуры sp_addumpdevice. Она имеет следующий синтаксис: sp_addumpdevice [Sdevtype =] 'device_type', [@logicalname =] 'logical_name', [@physicalname =] 'physical_name' [, { [Scntrltype =] controller_type I [Sdevstatus =] 'device_status' }]
Мы не будем подробно рассматривать синтаксис указанной хранимой процедуры, но приведем пример ее использования для создания логического устройства резервного копирования: EXEC sp_addumpdevice 'DISK', 'pubs_dev', 'С:\SQLBack\pubs_bak.dat'
После выполнения указанного кода будет создано логическое устройство резервного копирования с именем p u b s d e v , которое физически представлено файлом pubs_bak.dat, расположенным в каталоге SQLBack локального диска С:. Созданное устройство резервного копирования может быть использовано для хранения в нем резервной копии. Приведенный ниже пример иллюстрирует это: BACKUP DATABASE pubs TO pubs_dev
Создание копий файлов и групп файлов Как и любой тип архивирования, создание резервной копии файлов и групп файлов выполняется с помощью команды BACKUP. При этом используется следующий синтаксис этой команды: BACKUP DATABASE {database_name I @database_name_var} [,...n] TO [,...n] - [WITH [BLOCKSIZE = {blocksize I @blocksize_variable}] [[,] DESCRIPTION = {text I @text_variable}] [[,] EXPIREDATE = {date I @date_var} I RETAINDAYS = {days I @days_var}] [[,] FORMAT | NOFORMAT] [[,] {INIT | NOINIT}] [[,] MEDIADESCRIPTION = {text | @text_variable}] [[,] MEDIANAME = {media__name | @media_name_yariable} ] [[,] [NAME = {backup_set_name | @backup_set_name_var}] [[,] {NOSKIP | SKIP}] [[,] {NOUNLOAD | UNLOAD}] [[,] [RESTART] [[, ] STATS [= percentage]]
550
Часть III. Администрирование
Перечислим только те аргументы, которые специфичны для рассматриваемого типа архивирования и не были указаны в предыдущем разделе. Единственным таким аргументом является конструкция < f i l e _ o r _ f i l e g r o u p > , задающая файл или группу файлов, которые необходимо архивировать. Эта конструкция имеет следующий синтаксис: : : = { FILE = {logical_file_name I @logical_file_name_var} I FILEGROUP = {logical_filegroup__name I @logical_filegroup_name_var} }
Рассмотрим назначение каждого из аргументов данной конструкции. О
FILE = {logical_file_name I @logical_file_name_var} Определяет логическое имя архивируемого файла базы данных. Не следует путать логическое имя файла, которое используется для ссылки на него в командах Transact-SQL, с физическим именем файла, которое он имеет в операционной системе. Имя файла может быть указано либо непосредственно с помощью строковой константы, либо с помощью любой символьной переменной.
•
FILEGROUP = {logical_filegroup_name I @logical_filegroup_name_var} В отличие от предыдущего аргумента, с помощью которого можно указать конкретный файл базы данных, аргумент FILEGROUP задает имя архивируемой группы файлов.
Как видно из синтаксиса, одновременно можно архивировать множество файлов или групп файлов. SQL Server 2000 не ограничивает максимальное количество файлов и групп файлов, которые могут быть архивированы за одну операцию. Чтобы выполнить архивирование файлов или групп, необходимо предварительно создать полную резервную копию. Кроме того, следует позаботиться о создании резервной копии журнала транзакций, с помощью которой можно будет синхронизировать восстановленные файлы с другими файлами базы данных.
Создание копии журнала транзакций Этот тип резервного копирования также выполняется с помощью команды BACKUP со следующим синтаксисом: BACKUP LOG {database_name I @database_name_var} {[WITH {NO_LOG | TRUNCATE_ONLY}]} | {TO [,...n] [WITH [BLOCKSIZE = {blocksize I @blocksize_variable}] [[,] DESCRIPTION = {text | @text_variable}] [[,] EXPIREDATE = {date | @date_var} I RETAINDAYS = {days | @days_var}] [[,] FORMAT | NOFORMAT] [[,] {INIT | NOINIT}]
. •
Глава 13. Резервное копирование
551
[[,] MEDIADESCRIPTION = {text | @text_variable}] [[,] MEDIANAME = {media_name | @media_name_variable}] [[,] [NAME = {backup__set_name I @backup_set_name_var} ] [ [ , ] NO_TRUNCATE] [[,] {NOSKIP | SKIP}] [[,] {NOUNLOAD | UNLOAD}] [[,] [RESTART] [[,] STATS [= p e r c e n t a g e ] ] ] } Перейдем к параметрам, которые не были рассмотрены в предыдущих разделах. •
NO_LOG | TRUNCATE_ONLY
Приведенные опции являются синонимами, и их действие одинаково. При указании любой из них будет выполняться только усечение журнала транзакций без создания самого архива. Поскольку архив не создается, то указание остальных параметров не обязательно. В любом случае их значение будет проигнорировано. О
NOJTRUNCATE
При создании резервной копии журнала транзакций с ключевым словом NO_TRUNCATE SQL Server 2000 не выполняет усечение журнала транзакций. Эта опция используется автоматически, если архивируется журнал транзакций поврежденной базы данных или базы данных, подозреваемой в наличии поврежденных (suspect) данных. Также усечение журнала не происходит при архивировании не восстановленной (has not been recovered) базы данных.
Архивирование средствами Enterprise Manager Предыдущие разделы были посвящены рассмотрению создания резервных копий средствами Transact-SQL. Выполнение архивирования с помощью команды BACKUP требует определенного профессионализма и знания синтаксиса команды BACKUP. He каждый пользователь захочет без особых на то причин утруждать себя созданием копий с помощью команды BACKUP. Гораздо более удобным (с точки зрения наглядности и простоты) способом создания резервной копии является применение графического интерфейса Enterprise Manager. В этом случае пользователю не нужно вникать в особенности использования команды BACKUP, а достаточно иметь небольшой навык работы с Enterprise Manager и знание основ резервного копирования. Для создания резервной копии с помощью Enterprise Manager в первую очередь необходимо открыть окно SQL Server Backup (рис. 13.1), с помощью которого и выполняется создание резервных копий всех типов. Это окно можно открыть, выбрав в левой панели Enterprise Manager в контекстном меню базы данных команду All Tasks, а затем команду Backup Database. Напомним, что базы данных содержатся в папке Database корневого каталога сервера.
552
Часть III. Администрирование
SQL Server Backup - pubs General j Options) Database:
iAdministrator Database
Name:
Administrator Database backup
Description: Backup Г" D_atabase - complete C" Database-differential С Transaction log (* File and filegroup: Destination - Г Backup to: G:\Proaram Files\Microso t SOL Server^
Add.. Remove
Overwrtie Scheduel
±L
•I ——1
Contents... ~. 1
(* Appgnd to medai
С Overwrite existing media Г" Schedule: Cancel
Help
Рис. 1 3 . 1 . Окно SQL Server Backup для базы данных pubs
Как видно, окно SQL Server Backup содержит две вкладки. Первая из них имеет имя General и используется для задания общих свойств создаваемой резервной копии. Вторая вкладка — Options — предназначена для выполнения тонкой настройки создаваемой резервной копии. Рассмотрим элементы управления, имеющиеся на вкладке General. • Database. С помощью этого раскрывающегося списка пользователь должен выбрать, для какой из баз данных необходимо создать резервную копию. Список содержит перечень всех баз данных, имеющихся на сервере. По умолчанию выбрана база данных, из контекстного меню которой было открыть окно SQL Server Backup. G Name. В этом поле указывается имя, которое будет присвоено создаваемой резервной копии. Для одной и той же базы данных нельзя создавать два архива с одинаковыми именами. Однако для разных баз можно создавать архивы с одинаковыми именами. При последующем восстановлении базы пользователь будет выбирать нужную резервную копию именно по этому имени. • Description. Поле предназначено для указания краткого комментария к создаваемой резервной копии. Эта информация носит чисто вспомогательный характер. • Backup. С помощью данного раскрывающегося списка необходимо выбрать тип резервной копии, которую требуется создать:
Глава 13. Резервное копирование
553
• Database - complete — будет создана полная копия базы данных; •
Database - differential — будет создана разностная резервная копия;
•
Transaction log — будет создана копия журнала транзакций;
•
File and filegroup — выбирается для создания резервной копии одной или более групп файлов или отдельных файлов. При установке переключателя в рассматриваемое положение необходимо указать, какие файлы или группы файлов должны быть архивированы. Для этого предназначено окно Specify Filegroups and Files, открыть которое можно с помощью кнопки Ш, расположенной справа от переключателя. В окне Specify Filegroups and Files перечислены все определенные в базе данных группы файлов, а также входящие в них файлы. Устанавливая флажок в колонке Backup, вы тем самым предписываете включить соответствующий файл или группу файлов в процесс архивирования.
• Backup to. Переключатель служит для выбора типа носителя, на который должна быть сохранена созданная резервная копия: • Таре — данные будут сохранены на физическое устройство резервного копирования, причем в качестве такого устройства может выступать не только лента (стример), но и дисковод ZIP, магнитооптический диск или устройство резервного копирования любого другого типа. Если на компьютере, на котором установлен SQL Server 2000, не определено ни одного устройства резервного копирования, то переключатель Backup to будет неактивен и всегда установлен в положение Disk; • Disk — в этом случае данные будут сохранены на одном из локальных дисков в обычном файле. В зависимости от того, какой тип носителя был выбран, меняется и перечень доступных устройств в списке, расположенном ниже переключателя Backup to. В этом списке перечислены все устройства резервного копирования, определенные на сервере. Список этих устройств не зависит от того, какая именно база данных выбрана в раскрывающемся списке Database. Для только что установленного SQL Server 2000 список не содержит ни одного устройства. Создание нового устройства выполняется с помощью окна Select Backup Destination (рис. 13.2), открыть которое можно с помощью кнопки Add. При установке переключателя в положение File name новое устройство физически будет представлять собой файл на локальном диске. Это эквивалентно выполнению команды BACKUP С синтаксисом то DISK = ' f i l e n a m e ' . To есть создаваемое устройство резервного копирования не является таковым в полной мере. Пользователь должен будет ввести имя и путь к файлу, в который будет сохраняться резервная копия. Если же переключатель установить в положение Backup device, то будет создано полноценное новое устройство. (Организация подобных устройств может быть также выполнена и с помощью системной хранимой процедуры spaddumpdevice.) Пользователь должен будет выбрать в раскрывающемся списке имя одного из имеющихся устройств резервного копирования. Если
Часть III. Администрирование
554
такового устройства не имеется, то его можно тут же создать, выбрав в списке значение
OK
Cancel
Рис. 13.2. Окно Select Backup Destination
Замечание Нажав кнопку View Contents, можно просмотреть, какие данные имеются на выбранном устройстве резервного копирования. П Overwrite. С помощью этой группы переключателей можно определить, будет созданная резервная копия при сохранении на устройство резервного копирования записываться поверх имеющихся данных или добавляться в конец: • Append to media — новые данные будут добавляться к имеющимся. Подобный подход обычно используется при работе с физическими устройствами резервного копирования, например, с лентой; • Overwrite existing media — новая резервная копия будет записана поверх имеющихся данных. Обычно применяется, когда резервная копия сохраняется в обычный файл. Таким образом, файл со старой резервной копией удалится, а вместо него будет создан файл с новым архивом. Помимо описанных элементов, на вкладке имеется флажок Schedule. Его установка предписывает выполнять резервное копирование не единожды, сразу же после завершения работы с окном SQL Server Backup (т. е. после нажатия кнопки ОК), а периодически. Для этого создается соответствующее задание для службы SQLServerAgent, которое и будет осуществлять резервное копирование. Подобным образом можно автоматизировать создание резервных копий, предписав, например, создавать их каждое воскресенье в полночь. Именно в это время и предлагается выполнять создание резервных копий по умолчанию. Время запуска выводится в текстовом поле, расположенном правее флажка Schedule. Вы можете определить любое другое время по своему усмотрению. Изменение времени запуска задания осуществляется с помощью окна
Глава 13. Резервное копирование
555
Edit Schedule (рис. 13.3), открыть которое можно с помощью кнопки _J, размещенной справа от поля Schedule. Edit Schedule hJarne: (Schedule 1 г • Schedule type -
Enabled :
-
•—~
j Г* Start automatically when SQLServerAgent starts [ С Start whenever the CPU(s) become idle i f"" One time
0 > ia
J
.Recurring Occurs every 1 month(s] on the 1st Sunday of that month, at 4:33:00. Change. OK
Cancel
Help
Рис. 13.3. Окно Edit Schedule
Переключатель Schedule type позволяет установить тип расписания: • Start automatically when SQL Server Agent starts. В этом случае запуск задания будет выполняться только в момент запуска службы SQLServerAgent, например, при перезагрузке сервера. Данный тип расписаний используется в основном для заданий, проверяющих целостность данных перед началом работы пользователей. • Start whenever the CPU(s) become idle. В указанном случае выполнение задания начинается в момент простоя центрального процессора. Это позволяет запускать задания в моменты наименьшей активности пользователей, например, ночью или в обеденный перерыв. Рассматриваемый тип запуска задания может быть использован для перестроения индексов, обновления полнотекстовых каталогов, создания резервных копий и выполнения других подобных операций. G One time. При выборе этого типа задание будет запущено лишь один раз. Когда переключатель установлен в данное положение, становятся доступными поля: • On date — дата запуска задания; • At time — время запуска задания. П Recurring. Этот тип расписания используется для периодического запуска задания в строго определенное время. В нижней части окна указывается информация о времени запуска. По умолчанию задание запускается каждое воскресенье в 0:00:00. Для изменения данного значения необходимо нажать кнопку Change. В открывшемся диалоговом окне Edit Recurring Job Schedule
Часть III. Администрирование
556
можно устанавливать произвольную дату и время запуска задания, а также его периодичность. Кроме того, можно установить конечную дату. После того, как будет определено время автоматического выполнения резервного копирования, подготовку к созданию резервной копии можно считать оконченной. Выполненных действий вполне достаточно, чтобы успешно создать резервную копию. В большинстве случаев не требуется обращения к вкладке Options (рис. 13.4), т. к. значения, установленные по умолчанию, устроят большую часть пользователей. Однако, для полноты картины, рассмотрим и эту вкладку. SQL Server Backup - pubs General Options j Options — — --— Verifying the backup wil read the entire backup and check for ; ^s meda i integrity. Checking the identity and expiration of the meda i M-J prevents accidental'overwrites. P" Verify backup upon completion! . ;
Г Ei«* tap* after backup Г В~<кмеп v», e erfn«-fro~>b*w..cr \v fi? Check media set name and backup set expiration Media set name: Г
Backup .-•,••..•:•
Media set labels - iBs^h Initializing tape or disk media set erases the previous contents of the media and labels the media set with a name and description. Г
OK
Cancel
Help
Рис. 13.4. Окно SQL Server Backup, вкладка Options
На вкладке имеются следующие элементы управления: • Verify backup upon completion. После завершения создания резервной копии будет выполнена ее проверка. П Eject tape after backup. Флажок доступен только при архивировании на ленту, т. к. предписывает автоматически извлечь ленту из устройства резервного копирования. • Remove inactive entries from transactional log. Предписывает по завершении архивирования освободить неактивную часть журнала транзакций для повторного использования. П Check media set name and backup set expiration. Когда этот флажок установлен, выполняется проверка на то, не осуществляется ли попытка перезаписать ре-
Глава 13. Резервное копирование
557
зервную копию, срок хранения которой еще не истек. Если такая попытка обнаруживается, то пользователю выдается сообщение об ошибке и предлагается изменить параметры сохранения резервной копии. По умолчанию флажок установлен. Если его сбросить, то будет разрешена перезапись любых архивов. • Media set name. В этом поле указывается имя набора носителей, на котором будет сохранена создаваемая резервная копия. Указанный набор должен быть предварительно создан. При попытке записи архива на другой набор носителей будет выдано сообщение об ошибке. П Backup sell will expire. С помощью этого переключателя можно определить, когда должен закончиться срок хранения резервной копии. После истечения срока хранения резервная копия может быть перезаписана без всяких ограничений: • After — при установке переключателя в это положение пользователь должен будет указать количество дней, по истечении которых окончится срок хранения резервной копии; •
On — в этом случае необходимо будет явно указать дату, после наступления которой будет разрешено перезаписывать архив. Замечание На первый взгляд непонятно, зачем использовать два типа ограничения срока хранения архива. Однако ситуация проясняется, если учесть, что резервное копирование может выполняться автоматически довольно длительное время. Установка конкретной даты в этом случае способна привести к определенным проблемам, т. к. срок хранения всех созданных архивов будет закончен одновременно. Более удобным в этом случае является указание количества дней, в течение которого необходимо хранить резервную копию.
• Initialize and label media. Флажок доступен только при работе с лентой. Его установка предписывает записать в самом начале ленты новый заголовок MTF (Microsoft Tape Format). При этом все имеющиеся на ленте данные, включая и записанные ранее заголовки, будут потеряны. При этом не выполняется проверка на срок хранения имеющейся на носителе информации. Дополнительно становятся доступными два поля: •
Media set name — для указания имени набора носителей, которое будет включено в заголовок MTF;
•
Media set description — для ввода краткого комментария к имени набора носителей, указанного в предыдущем поле.
На этом работа с вкладкой Options заканчивается. Также можно считать полностью рассмотренной и подготовку к созданию резервной копии. После того, как будут указаны все необходимые параметры, остается только нажать кнопку ОК, после чего начнется создание резервной копии. Просмотреть с помощью Enterprise Manager список всех резервных копий, выполненных для всех баз данных, можно в папке Backup, найти которую можно в папке Management каждого сервера.
558
Часть III. Администрирование
Архивирование с помощью мастера Описанный в предыдущем разделе метод создания резервных копий с помощью средств Enterprise Manager является довольно удобным с точки зрения быстроты достижения нужного результата. Однако, выполнение резервного копирования подобным способом требует определенных знаний, что устанавливает некоторый барьер перед пользователями. Для начинающих пользователей, имеющих только общие сведения о работе подсистемы архивирования, для создания резервных копий скорее всего подойдет мастер Create Database Backup Wizard. Для запуска этого мастера можно воспользоваться окном Select Wizard (рис. 13.5), открыть которое можно с помощью кнопки Run a wizard, расположенной в панели инструментов Enterprise Manager. В окне Select Wizard необходимо открыть папку Management и выбрать пункт Backup Wizard. После этого остается только нажать кнопку ОК, что приведет к появлению первого окна мастера.
Select Wizard Please select the Wizard you wish to use: Register Server Wizard В Database j™ Create Database Wizard ;••- Create Index Wizard • Create Login Wizard \ Create Stored Procedure Wizard i Create View Wizard ;-• Full-Text Indexing Wizard Г-1 Data Transfoimation Services ;••• DTS Export Wizard • '••• DTS Import Wizard El Management
Copy Database Wizard Create Alert Wizard Create Job Wizard D atabase M aintenance Plan Wizard Index Tuning Wizard Make Master Server Wizard Make Target Server Wizard Web Assistant Wizard
OK Рис. 13.5. Окно Select Wizard
Cancel
В первом окне приведена информация о том, какие сведения должны быть указаны в процессе работы мастера. Данное окно не представляет особого интереса и может быть пропущено. Для перехода к следующему шагу достаточно нажать кнопку Next.
Второе окно мастера называется Select Database to Backup, что переводится как "выберите базу данных для архивирования". В окне имеется единственный элемент управления — раскрывающийся список Database, с помощью которого нужно определить имя одной из баз данных, имеющихся на сервере. Для выбранной базы данных и будет создаваться резервная копия. В списке Database можно указать не только имя пользовательской, но и имя системной базы данных. После того как будет выбрано имя интересующего объекта, можно переходить к следующему окну мастера. Третье окно мастера имеет имя Type Name and Description for Backup (рис. 13.6), что можно перевести как "введите имя и описание архива". В соответствии с названием окно имеет два поля: • Name. Указывается имя, которое будет присвоено создаваемому архиву. • Description. В этом поле пользователь может ввести небольшой комментарий к создаваемой резервной копии.
Глава 13. Резервное копирование
559 _xj
Create Database Backup Wizard - STORAGE Type Name and Description for Backup Type the name and description ol the backup.
9 1
Name: Admin_DB_backup Description: (Просто резервная копия одной из баз даннь
<Васк
Next >
Cancel 1
Рис. 13.6. ОКНО Type Name and Description for Backup мастера Create Database Backup Wizard
Указание имени архива обязательно, тогда как поле для комментария можно оставить пустым. Если даже оставить поле Name пустым, то мастер будет использовать имя до умолчанию, которое генерируется в формате databasename backup. После того, как необходимые данные будут введены, работа с третьим окном мастера заканчивается. Четвертое окно называется Select Type of Backup (рис. 13.7) и, в соответствии с названием, предназначено для выбора типа создаваемой резервной копии. В распоряжении пользователя имеется переключатель, который может быть установлен в одно из перечисленных положений: П Database backup - backup the entire database — полная резервная копия базы данных; • Differential database - backup only new and changed data — разностная резервная копия; • Transactional log - backup the record of all the changes made to the database — резервная копия журнала транзакций. Замечание Напомним, что при архивировании системных баз данных M a s t e r и Msdb существуют определенные ограничения. В частности, для базы данных M a s t e r разрешается создание только полной резервной копии, а для базы данных Msdb — полной и разностной резервных копий.
19 Зак. 83
Часть III. Администрирование
560
JSl
Create Database Backup Wizard - STORAGE Select Type of Backup Select the type of backup to perform.
What type of backup do you want to perform? (* Databa e backup • backup the entire database. i" £i'feren'ial database - backup only new and changed data <~ Transaction log - backup the record of all the changes made to the database
<£ack
Next >
Cancel
Рис. 13.7. Окно Select Type of Backup мастера Create Database Backup Wizard Create Database Backup Wizard - STORAGE Select Backup Destination and Action Select a device or file as the destination for the database being backed up. Either append or overwrite the backup media.
.*]
- Select backup device Г
I
,
С File:
|SSQ1ЛВ ACKUP*Admin_DB_backup.ВАК.
«'• Backup device.
|SE33SS
... j
Properties (* Append to the backup media С Overwrite the backup media Г
ElecUape mm backup
Г" Read and verify the integrity of the backup after backup
< Back
Next>
Cancel
Рис. 13.8. Окно Select Backup Destination and Action мастера Create Database Backup Wizard
После выбора типа резервной копии можно переходить к очередному окну мастера. Оно имеет название Select Backup Destination and Action (рис. 13.8). что дословно можно перевести как "выберите место записи архива и действие". В
Глава 13. Резервное копирование
561
принципе, можно не вносить никаких изменений в значения, установленные в окне по умолчанию и сразу же перейти к следующему окну мастера. Тем не менее, все же рассмотрим назначение имеющихся элементов управления. Как видно, все элементы управления, присутствующие в окне, объединены в две труппы. Первая из них называется Select backup device и содержит переключатель, позволяющий указать тип устройства резервного копирования, на которое предполагается сохранить создаваемую резервную копию: О Таре. Архив будет сохранен на ленту. Это положение доступно только в том случае, если на сервере установлен стример или другое устройство резервного копирования, использующее в качестве носителя магнитную ленту. В соответствующем раскрывающемся списке необходимо будет выбрать имя устройства, на который должен быть сохранен архив. • File. В этом случае резервная копия будет сохранена в обычном файле на локальном диске. В текстовом поле пользователь должен указать имя и путь к файлу, в котором будет сохранена резервная копия. О Backup device. При установке переключателя в данное положение будет использоваться устройство резервного копирования. Это устройство может бЫТЬ СОЗДанО С ПОМОЩЬЮ СИСТеМНОЙ ХраНИМОЙ Процедуры
sp_addumpdevice
либо с помощью окна Backup Device Properties - New Device. Оба этих метода создания логических устройств резервного копирования были приведены в предыдущих разделах. В частности, ранее было рассмотрено использование окна Backup Device Properties - New Device. В группе элементов Properties, предназначенной для управления дополнительными параметрами создаваемого архива, содержится переключатель и два флажка: • Append to the backup media. Новые данные будут добавляться к имеющимся. Подобный подход обычно используется при работе с физическими устройствами резервного копирования, например,-с лентой. П Overwrite the backup media. Новая резервная копия будет записана поверх имеющихся данных. Обычно применяется, когда резервная копия сохраняется в обычный файл. Таким образом, файл со старой резервной копией будет удален, а вместо него создан файл с новым архивом. Я Eject tape after backup. Этот флажок доступен только при архивировании на ленту, т. к. предписывает автоматически извлечь ленту из устройства резервного копирования. • Read and verify the integrity of the backup after backup. После завершения создания резервной копии будет выполнена ее проверка. Следующее окно мастера имеет название Backup Verification and Scheduling (рис. 13.9) и позволяет контролировать срок хранения резервной копии, конфигурировать автоматическое выполнение архивирования, а также управлять некоторыми другими параметрами резервного копирования. Устанавливая флажок Check media set name and backup set expiration date, вы тем самым предписываете выполнять проверку на попытку перезаписи архива, срок
Часть III. Администрирование
562
хранения которого еще не истек. Если такая проверка разрешена и выполняется попытка перезаписать неустаревший архив, то будет выдано сообщение об ошибке. При установке флажка также допускается проверка на сохранение резервной копии в конкретном наборе носителей. Имя набора носителя, в котором должна быть сохранена резервная копия, указывается в поле Media set name. По умолчанию это поле пусто и архив может быть сохранен в любом наборе носителей. Create Database Backup Wizard - STORAGE Backup Verification and Scheduling Check the meda i label and backup set expiration date and time to help prevent accidental overwrites. You can also schedule the backup to run periodicaly. -Checking meda i set — f? Check meda i set name and backup set expiration date Meda i set name: Backup set expiration Г Вас r
,
i
J
... P i|cnedulei
(Occurs every 1 week(s) on Sunday, a
<j3ack
Next>
Change... I
Cancel
Рис. 13.9. Окно Backup Verification and Scheduling мастера Create Database Backup Wizard
Замечание Имя набора носителей, к которому будет принадлежать конкретный носитель, задается при создании или переформатировании этого носителя. По умолчанию для создаваемой резервной копии не устанавливается какой-то конкретный срок хранения, т. е. архив может быть перезаписан сразу же после его создания. Если все же необходимо обезопасить архив от перезаписи, то следует отметить флажок Backup set will expire и определить срок хранения архива. Это осуществляется с помощью переключателя, устанавливаемого либо в положение After (Определенное количество дней), либо в положение On (Конкретная дата). Наконец, в окне имеется флажок Schedule, устанавливая который вы тем самым предписываете разрешить автоматическое создание резервных копий. Для получения более подробной информации об автоматическом архивировании следует обратиться к предыдущему разделу. Напомним, что резервное копирования мо-
Глава' 13. Резервное копирование
563
жет выполняться и как часть плана сопровождения баз данных, что было рассмотрено в разд. "Мастер Database Maintenance Plan Wizard" главы 12. Следующее окно мастера является последним и содержит сводную информацию о параметрах, указанных в ходе работы мастера. Если приведенная информация удовлетворяет вас, то остается только нажать кнопку ОК и на этом работа мастера закончится. Сразу же после этого начнется создание резервной копии. Если же вы вдруг обнаружили, что какие-то опции были сконфигурированы неверно, то можно вернуться к любому из шагов, воспользовавшись кнопкой Back.
Восстановление архива с использованием Transact-SQL В SQL Server 2000 существует два способа восстановления резервных копий: П при помощи утилиты Enterprise Manager; •
используя возможности языка Transact-SQL.
Замечание Мы не рассматриваем восстановление файлов базы данных, которые были архивированы не средствами SQL Server 2000, а как файлы операционной системы с помощью утилиты Windows NT Backup или ей подобных. Этот способ архивирования рекомендуется использовать только опытным пользователям. Восстановление любого типа резервной копии выполняется с помощью единственной команды Transact-SQL — RESTORE. В следующих разделах будет рассмотрено использование этой команды для восстановления архивов различных типов.
Восстановление полной и разностной копий Для восстановления полной или разностной резервной копий необходимо использовать команду RESTORE со следующим синтаксисом: RESTORE DATABASE {database_name I @database_name_var} [FROM [,...n]] [WITH [DBO_ONLY] [[,] FILE = file_number] [[,] MEDIANAME = {media_name I @media_name_variable}] [[,] MOVE 'logical_file_name' TO 'operating_system_file_name'] [,-..n] [[,] {NORECOVERY | RECOVERY | STANDBY = undo_file_name}] [[,] {NOUNLOAD | UNLOAD}] [[,] REPLACE] [[,] RESTART] [[,] STATS [= percentage]] ]
Рассмотрим назначение каждого из аргументов команды.
564 •
Часть III. Администрирование DATABASE {database_name
I @database_name_var}
Ключевое слово DATABASE указывает, что восстанавливается база данных, а точнее — ее полная или разностная резервная копия. За ключевым словом DATABASE следует имя восстанавливаемой базы данных. Имя может указываться как строковая константа (databasename) или с помощью переменной СИМВОЛЬНОГО т и п а ( @ d a t a b a s e _ n a m e _ v a r ) . •
FROM < b a c k u p _ d e v i c e >
[,...n]
С помощью ключевого слова FROM задается имя устройства резервного копирования, с которого необходимо восстановить базу данных. Имя устройства задается в конструкции backupdevice, синтаксис которой был приведен в разд. "Создание полной и разностной копий" ранее в этой главе. Можно использовать множество устройств. Если раздел FROM не указывается, то выполняется операция реконструкции (recovery) базы данных. В этом случае необходимо использовать опции NORECOVERY, RECOVERY ИЛИ STANDBY. •
DBO_ONLY
При вводе этого ключевого слова доступ к восстановленной базе данных будет иметь только владелец базы данных (DBO, database owner). Впоследствии база данных может быть переведена в обычный режим с помощью вызова хранимой процедуры sp_dboption с параметром dbo use only. •
FILE = file_number
Задает номер набора резервной копии (backup set) на носителе. Наборы располагаются на носителе последовательно. П MEDIANAME = {media_name I @media_name_variable} Имя носителя, с которого должна быть восстановлена резервная копия. •
MOVE 'logical_file_name' ТО 'operating_system_file_name' Этот параметр используется для присвоения логическим файлам базы данных физических имен, отличных от тех, которые они имени при архивировании. По умолчанию все восстанавливаемые файлы базы данных будут иметь то же имя и находиться в том же каталоге, что и исходные файлы.
•
NORECOVERY
При восстановлении базы данных с этим ключевым словом не выполняется откат незавершенных транзакций. Эта опция необходима, если после восстановления базы планируется применить дополнительный журнал транзакций. Опция NORECOVERY также применяется при последовательном восстановлении нескольких резервных копий, однако восстановление последней копии должно выполняться с указанием опции RECOVERY взамен NORECOVERY. •
RECOVERY
Если команда RESTORE выполняется с ключевым словом RECOVERY, TO после завершения восстановления система откатывает все незавершенные транзакции. До тех пор пока не будет выполнен откат незавершенных транзакций, нормальная работа с базой данных невозможна.
Глава 13. Резервное копирование
565
О STANDBY = u n d o _ f i l e _ n a m e
С помощью этой опции указывается файл отката (undo file), с помощью которого можно отменить действия, выполненные в ходе восстановления базы данных. Если указан ключ STANDBY, пользователи могут работать с базой данных в режиме только для чтения между операциями восстановления журнала транзакций. Ключ STANDBY задается при восстановлении базы данных на резервном сервере (standby server), который доступен только в режиме чтения и отображает все изменения, сделанные на основном сервере с помощью применения транзакций. Если указанный файл отката не существует, SQL Server 2000 автоматически создает его. Если файл отката является текущим файлом отката базы данных, то новая информация будет добавлена в него. В противном случае файл будет переписан. Замечание Если не указано ни одно из ключевых слов RECOVERY, NORECOVERY ИЛИ STANDBY, TO по у м о л ч а н и ю и с п о л ь з у е т с я п а р а м е т р R E C O V E R Y . •
UNLOAD
При указании этого ключевого слова после восстановления архива будет выполнена автоматическая выгрузка ленты из стримера. •
NOUNLOAD
В отличие от предыдущего параметра, по завершении восстановления выгрузка ленты из стримера не выполняется. •
REPLACE
При указании данного ключевого слова восстанавливаемая база данных будет заменять существующую одноименную базу. Если на сервере, на котором выполняется восстановление архива, уже существует база данных с тем же именем, что и восстанавливаемая, то она будет предварительно удалена. •
RESTART
Указав это ключевое слово, можно продолжить прерванный процесс восстановления архива с той позиции, в которой находился процесс восстановления до того, как он был прерван. Это позволяет сэкономить время при восстановлении больших архивов. П STATS [= percentage]
Этот аргумент позволяет (в процентах) задать дискретность шкалы индикатора процесса архивирования. По умолчанию пользователь получает сообщение по завершении каждых 10% процесса.
Восстановление файлов или групп файлов Для восстановления архива файлов или групп файлов используется команда RESTORE со следующим синтаксисом:
566
Часть III. Администрирование
RESTORE DATABASE {database_name I @database_name_var} [ , . . . n ] [FROM [ , . . . n ] ] [WITH [DBOjDNLY] [ [ , ] FILE = file_number] [ [ , ] MEDIANAME = {media_name I @media_name_variable}] [ [ , ] NORECOVERY] [ [ , ] {NOUNLOAD | UNLOAD}] [ [ , ] REPLACE] [[,] RESTART] [ [ , ] STATS [= p e r c e n t a g e ] ] ] Как видно, в этом варианте команды RESTORE используется только один параметр, не описанный в предыдущем разделе — конструкция [, . . . п ] . С помощью этой конструкции указываются файлы или группы файлов, которые должны быть восстановлены. Подробно синтаксис и использование указанной конструкции были представлены в разд. "Создание копий файлов и групп файлов"ранее в этой главе.
Восстановление журнала транзакций Для восстановления резервной копии журнала транзакций служит команда RESTORE со следующим синтаксисом: RESTORE LOG {database_name I @database_name__var} [FROM [,...n]] [WITH [DBOJDNLY] [[,] FILE = file_number] [[,] MEDIANAME = {media_name I @media__name_variable} ] [[,] {NORECOVERY | RECOVERY | STANDBY = undo_file_name)] [[,] {NOUNLOAD | UNLOAD}] [[,] RESTART] [[,] STATS [= percentage]] [[,] STOPAT = {date_time I @date_time_var}] ] Отличие синтаксиса команды RESTORE при восстановлении журнала транзакций от восстановления полной или разностной копии сводится к двум параметрам. Рассмотрим их. Вместо ключевого слова DATABASE используется ключевое слово LOG, говорящее о том, что восстанавливается резервная копия журнала транзакций. С ПОМОЩЬЮ аргумента STOPAT = {date_time I @date_time_var} МОЖНО указать конкретное время, до которого следует восстановить журнал транзакций. Время указывается в формате, используемом при работе с типом данных datetime. Допускается применение облегченного варианта — типа данных small datetime. Время можно задать в виде символьной константы или с помощью переменной, имеющей ТИП данных datetime ИЛИ smalldatetime.
Глава 13. Резервное копирование
567
Восстановление резервной копии журнала транзакций до конкретного времени позволяет свести к минимуму ущерб, нанесенный работой пользователей, приведшей к повреждению или удалению данных. С точки зрения SQL Server 2000 выполненные пользователями операции корректны, но с точки зрения целостности данных — нет. С помощью резервной копии журнала транзакций можно с точностью до секунд определить момент, до которого следует применять транзакции и тем самым избежать выполнения запроса, нарушившего целостность данных.
Восстановление архива средствами Enterprise Manager Как уже говорилось, использование команд Transact-SQL требует соответствующей профессиональной подготовки и навыков. Поэтому не каждый пользователь решится для восстановления резервной копии воспользоваться непосредственно командой RESTORE. Более того, для администратора знание синтаксиса и использования команд Transact-SQL вовсе не обязательно. Этого можно требовать от разработчика, но не от пользователя, пусть даже и весьма продвинутого, каковым является администратор. Для пользователей, не обремененных знанием команд Transact-SQL, лучшим вариантом выполнения восстановления резервной копии будет использование средств Enterprise Manager. Этот инструмент также может оказаться весьма удобным и для продвинутых разработчиков, уставших от стучания по клавиатуре и постоянного отслеживания имен архивов, файлов, версий и другой подобной информации. Восстановление резервной копии при работе с Enterprise Manager выполняется с помощью окна Restore database (рис. 13.10). Открыть это окно можно либо выбрав в меню Tools команду Restore Database, либо указав в контекстном меню какой-нибудь базы данных команду All Tasks, а затем команду Restore Database. Как видно, окно Restore database имеет две вкладки. Первая из них называется General и используется для управления общими свойствами восстанавливаемой базы данных. Вторая же вкладка — Options — предназначена для конфигурирования дополнительных параметров. Сначала рассмотрим элементы управления, имеющиеся на вкладке General (рис. 13.10): П Restore as database. С помощью этого раскрывающегося списка указывается имя базы данных, которое будет присвоено восстанавливаемой резервной копии. Можно выбрать как имя одной из существующих баз данных, так и ввести новое имя. В первом случае сначала будет удалена существующая база данных, а затем восстановлен архив под указанным именем. Во втором случае резервная копия просто восстанавливается под указанным именем. Замечание Таким образом, архив одной и той же базы данных может быть восстановлен под разными именами, что бывает довольно полезно, когда базу данных необходимо
Часть III. Администрирование
568
лишь частично восстановить в первоначальное состояние. Например, если пользователи в течение недели активно изменяли данные в двух десятках таблиц и вдруг оказалось, что в одной из них были выполнены неверные модификации, то можно восстановить резервную копию базы данных под другим именем и перенести в рабочую базу данных лишь поврежденную информацию. Из чего следует, что данные, внесенные в девять других таблиц, удастся сохранить. Restore database General Options I Restore as database: ip (• Database
Restore: г Parameters !
-
*Regroups or files -
Show backups of database:
[pubs
First backup to restore:
|i 2.09.2001 19:35:24-
Г
Poir
Restore H
<|
Г* From device
J Type (Backup Set Date iSize 'Restore From I Backup Set Name m
12.09.2001 19:...
14...
c:\aaa.bak
_ j
OK
Cancel
Help
Рис. 13.10. Окно Restore database
• Restore. С помощью данного переключателя производится выбор типа устройства или архива. В зависимости от того, в какое положение установлен переключатель, меняется состав элементов управления в группе Parameters. Рассматриваемый набор элементов управления (см. рис. 13.10) соответствует положению переключателя Database. Вообще же переключатель может быть установлен в следующие положения:
•
•
Database — полная или разностная резервная копия, а также резервная копия журнала транзакций;
•
Filegroups or files — резервная копия одного или более файлов или групп файлов;
•
From device — будет восстанавливаться архив, сохраненный на устройстве резервного копирования.
Show backups of database. С помощью этого раскрывающегося списка пользователь может выбрать имя одной из имеющихся на сервере баз данных.
Глава 13. Резервное копирование
569
Другие элементы управления, размещенные в группе Parameters, зависят от рассматриваемого раскрывающегося списка. Например, в таблице, расположенной в нижней части вкладки, будут отображаться архивы, созданные ранее на сервере для указанной базы данных. • First backup to restore. Содержимое данного раскрывающегося списка зависит от того, какая база данных была выбрана в предыдущем списке. С помощью рассматриваемого списка можно указать дату, начиная с которой будут отображаться архивы в таблице. Это бывает полезно, когда список созданных резервных копий довольно велик и вас не привлекает поиск нужного архива среди десятков других. Выходом является уменьшение набора отображаемых резервных копий с помощью указания даты, начиная с которой следует отображать архивы. • Point in time restore. Флажок доступен только в том случае, когда восстанавливается резервная копия журнала транзакций. Устанавливая флажок, можно восстановить базу данных в состояние, в котором она была в конкретный момент времени. Это время указывается в поле, расположенном справа от флажка. В нижней части вкладки находится таблица, в которой отображается список всех архивов, сделанных для базы данных, выбранной в списке Show backups of database, а также созданных начиная с момента, выбранного в списке First backup to restore. В таблице содержатся перечисленные ниже колонки: • Restore. В этой колонке выводится лишь флажок, устанавливая который, вы предписываете восстановить соответствующую резервную копию. Одновременно можно выбрать множество архивов. Это полезно при восстановлении полной при разностной копий, а также и последующем восстановлении резервной копии журнала транзакций. • Туре. Колонка содержит значок, отображающий тип резервной копии, а также взаимосвязь резервных копий. Связь возникает, когда создается разностная копия или копия журнала транзакций. Резервные копии указанных типов не могут восстанавливаться сами по себе, а требуют предварительного восстановления полной копии (или разностной для копии журнала транзакций). • Backup Set Date. В колонке отображается дата создания соответствующей резервной копии. П Size. Отображается размер, который имеет резервная копия. • Restore From. В данной колонке указывается источник, на который была сохранена резервная копия. Соответственно, с этого же источника и будет выполняться восстановление. В качестве источника может выступать файл или устройство резервного копирования. • Backup Set Name. Выводится имя набора носителей, к которому принадлежит носитель, содержащий соответствующую резервную копию. С помощью кнопки Properties отрывается окно свойств, с помощью которого можно выбрать иной носитель, чем тот, что указан в колонке Restore From. Это
570
Часть III. Администрирование
бывает необходимо, например, когда файл с резервной копией был перемещен в иное место, чем в то, куда он был сохранен при создании резервной копии. Мы рассмотрели элементы управления, которые имеются на вкладке General окна Restore database, когда переключатель Restore установлен в положение Database. Как уже было сказано, при установке указанного переключателя в иное положение в группе Parameters будет существовать другой набор элементов управления. Теперь же перейдем к рассмотрению вкладки Options (рис. 13.11), которая служит для тонкой настройки процесса восстановления резервной копии. На вкладке имеются следующие элементы управления: П Eject tapes (if any) after restoring each backup. После завершения восстановления будет автоматически извлечена лента из устройства резервного копирования. П Prompt before restoring each backup. Пользователю будет выдаваться диалоговое окно с вопросом о необходимости восстановления резервной копии. •
Force restore over existing database. Восстановление резервной копии будет осуществляться поверх существующей базы данных.
G Restore database files as. С помощью данной таблицы можно изменять имена и положение файлов базы данных. Таблица имеет следующие колонки: • •
Original File Name — имя файла, которое он имел в оригинале; Restore As — имя и местоположение на диске, которые будет иметь соответствующий файл. По умолчанию предлагаются те же значения, что были в первоначальном варианте. Однако пользователь может указать любые другие допустимые значения.
П Recovery completion state. С помощью этого переключателя можно определить, в каком состоянии должна находиться база данных после восстановления. Возможны следующие варианты: •
Leave database operational. No additional transaction logs can be restored — после завершения восстановления база данных будет приведена в рабочее состояние. При этом дополнительное восстановление резервной копии журнала транзакций будет невозможно;
•
Leave database nonoperational but able to restore additional transactional logs — в этом случае база данных не приводится в рабочее состояние, а остается в промежуточном состоянии. Это позволяет выполнять восстановление резервной копии журнала транзакций;
•
Leave database read-only and able to restore additional transactional logs — как и в предыдущем случае, установка переключателя в данное положение дает возможность восстанавливать резервную копию журнала транзакций. Однако при этом также разрешается чтение данных пользователями, что невозможно в предыдущем случае. Возможность чтения обеспечивается за счет того, что база данных устанавливается в состояние "только для чтения". Дополнительно в поле Undo file можно указать имя и путь
Глава 13. Резервное копирование
571
к файлу отката. С помощью этого файла можно будет отменить изменения, выполненные при последующем восстановлении журнала транзакций. На этом рассмотрение вкладки Options, а также и восстановления резервных копий с помощью Enterprise Manager, можно считать оконченным.
Restore database General Opto i ns | Г" Д|ес1- tape lit any] after re toring t ai h backup W Prompt before restoring each backup P" Force restore over existing database Restore database files as: Original File Name
j Restore As
G:\Prograrn Files\Microsoft SQL Serve..
G:\Pfogram FilesSM icrosoft SQL ServerSMSSQ.
G: \Program Files\M icrosoft S Q L S erv...
G AProgram Files\M icrosoft SQL ServerSMSSQ..
Recovery completion state
-
(* L e a v e database operational. No additional transaction logs can be restored. С Leave database nonoperational but able to restore additional transaction logs. С Leave database read-only and able to restore additional transaction logs.
OK
Cancel
Рис. 13.11. Окно Restore database, вкладка Options
Help
Глава 14
Репликация данных Обмен данными — одна из важнейших составляющих работы с информацией на любом предприятии. Данные, накопленные в одном подразделении, обрабатываются и агрегируются, после чего передаются в другое подразделение в качестве входных данных. Во втором подразделении данные снова обрабатываются и передаются в третий отдел. Эта цепочка может продолжаться довольно долго. Простейший случай — когда все подразделения предприятия располагаются в одном месте, и имеется возможность связать их в одно целое локальной сетью. Достаточно установить единственный SQL Server 2000, и все пользователи сети смогут работать с данными. Если организация небольшая, то сложные операции обмена данными могут вовсе не понадобиться. Но часто предприятие состоит из множества подразделений, которые географически удалены друг от друга. Многие организации имеют центральные офисы в больших городах и множество филиалов по всей стране. Каждый из филиалов накапливает оперативную информацию, обрабатывает ее и передает в центральный офис. Все данные стекаются в центральный офис, и руководство организации может в любой момент времени получить необходимые сведения о состоянии дел, объемах продаж, количестве товара на центральном складе и складах региональных представительств и много другой информации. Помимо того, что в центральном офисе хранится историческая информация, используемая в основном для анализа деятельности фирмы и темпах развития, там формируется финансовая политика всей организации. Отдел планирования в центральном офисе анализирует ситуацию на рынке и формирует цены на реализуемые товары, просчитывает объем спроса на ту или иную продукцию и другую информацию. Полученные данные должны быть распространены во все филиалы. Оперативность распространения информации играет большую роль. В некоторых ситуациях отображение изменений должно производиться в течение нескольких минут, а то и секунд. Например, изменение курса акций или курса валюты на одной из бирж должно быть как можно быстрее распространено на все другие биржи. В противном случае возможны значительные финансовые потери. Многие организации строят свои информационные системы таким образом, чтобы иметь возможность быстро обмениваться данными. В последнее время получили распространение распределенные информационные системы. Они могут строиться в виде звезды или в виде сети. В первом случае в центре системы располагается мощная система накопления и обработки информации, к которой подключаются менее мощные периферийные системы. Все потоки дан-
Глава 14. Репликация данных
573
ных проходят через центральное звено. Прямые контакты между компонентами исключаются. Налицо иерархичность системы. Во втором случае все компоненты системы стоят на одном уровне и могут обмениваться информацией с любым другим компонентом. Собственно обмен данными может осуществляться самыми различными способами, начиная от посылки дискет курьерской почтой и заканчивая прокладкой оптоволоконного кабеля или использованием спутниковой системы. Способы обмена информацией можно условно разделить на две категории: О Без постоянного физического соединения. В этом случае компоненты информационной системы организации не имеют постоянной связи друг с другом. Возможно, что они вообще не имеют каналов, которые могли бы связать их в одно целое. В этой ситуации обмен данными предполагает рассылку измененных данных в файлах с помощью электронной почты, обычной или курьерской почтой на дискете, компакт-диске или другом носителе информации. Администраторы региональных филиалов должны вручную синхронизировать изменения. • С постоянным физическим соединением. В этом случае имеется возможность практически мгновенного отражения изменений, сделанных на одном из компонентов системы, между всеми другими компонентами. Программные решения позволяют автоматизировать синхронизацию изменений. SQL Server 2000 предлагает пользователям и администраторам множество различных средств обмена данными между самыми разнообразными системами, с постоянным физическим соединением друг с другом или без него. В одной из предыдущих глав были рассмотрены возможности служб трансформации данных DTS и механизмов массивного копирования. Как ни широки возможности, предлагаемые этими инструментами, все же есть один существенный недостаток: эти механизмы являются надстройкой над базой данных, что влечет некоторые неудобства. В SQL Server 2000 имеется мощное средство обмена данными — репликация (replication). Механизмы репликации данных предоставляют серверам SQL Server 2000 мощный фундамент для создания распределенных систем хранения информации с использованием ODBC или OLE DB. Автоматическая синхронизация изменений (при постоянном физическом соединении или без него), сделанных на одном сервере, со всеми другими серверами делает возможным создание на основе SQL Server 2000 больших распределенных систем хранения информации, удовлетворяющих самым высоким современным требованиям. Система репликации SQL Server 2000 основывается на технологии Replication Distribution Interface. Эта технология позволяет включать в репликацию данных не только серверы SQL Server 2000, SQL Server 7.0 или SQL Server 6.x, но и другие системы хранения и обработки данных, например Microsoft Access, Oracle, dBase, Paradox и даже MS Excel. С помощью подсистемы репликации администратор может создавать распределенные гетерогенные системы хранения информации масштаба предприятия.
574
Часть III. Администрирование
^Замечание В принципе, достаточно просто организовать обмен данными и с использованием механизмов DTS. Однако подсистема репликации предлагает гораздо большие возможности, чем просто закачка данных в удаленные системы. Эта глава полностью посвящена рассмотрению работы с подсистемой репликации SQL Server 2000.
Введение в репликацию данных Репликация — это совокупность механизмов SQL Server 2000, обеспечивающих отображение изменений данных, сделанных на одном сервере, на другие серверы. Подсистема репликации реализована в виде специализированных агентов, выполняемых на сервере как самостоятельный процесс. Эти агенты подключаются к серверам-участникам репликации и выполняют создание копий данных и тиражирование их между другими серверами. В зависимости от используемого типа репликации и функции сервера набор агентов на конкретном SQL Server 2000 может сильно различаться. Существенные изменения в подсистеме репликации были сделаны еще в SQL Server 7.0. Была реализована автоматическая синхронизация изменений, сделанных на всех участвующих в репликации серверах. Это достигается применением репликации сведением, для тонкой настройки которой применяется система приоритетов серверов. Использование протокола 2РС позволяет реализовать системы, требующие незамедлительного отображения сделанных изменений на все серверы. Примером такой системы может быть реализация билетов через множество пунктов, когда данные о проданных билетах должны быть немедленно отражены во всех пунктах, чтобы избежать продажи нескольких билетов на одно место. В SQL Server 2000 также были внесены некоторые изменения в подсистему репликации. Самым важным из них является появление нового механизма, обеспечивающего изменение данных подписчиками — отложенное обновление (queue updating). Достоинством этой технологии по сравнению с технологией подписчиков незамедлительного обновления является возможность выполнения изменений на подписчике при отсутствии соединения между издателем и подписчиком. В состав SQL Server 2000 включены несколько мастеров, охватывающих все вопросы настройки репликации. Удобный графический интерфейс и наличие подсказок значительно облегчают процесс создания, удаления и конфигурирования издателя, дистрибьютора и подписчика. Репликация может быть реализована между базами данных одного и того же сервера или между различными серверами, которые объединены сетями LAN, WAN или Интернетом. Начало активного применения репликации данных было положено появлением SQL Server версии 6.0. Модель репликации базируется на метафоре "опубликуй и подпишись"— Publish and Subscribe, введенных в том же SQL Server 6.0. Терминология репликации использует понятия издатель — Publisher, дистрибьютор — Distributor и подписчик — Subscription.
Глава 14. Репликация данных
575
Замечание Не следует понимать, что издатель, подписчик и дистрибьютор— это специально сконфигурированный SQL Server 2000. Они являются лишь программными компонентами. Хотя обычно под издателем, подписчиком и дистрибьютором понимается отдельный сервер, наделенный некоторыми специальными функциями. Термин "издатель" употребляется для обозначения серверов, которые предоставляют информацию из своих баз данных другим серверам. Дистрибьютор — это промежуточный сервер, принимающий данные от издателя и распространяющий их подписчикам. Подписчик — это сервер, копирующий информацию, предоставляемую издателем. Введение промежуточного звена в процесс репликации позволяет снять нагрузку с основных серверов, публикующих информацию. Кроме того, в некоторых случаях это позволяет повысить производительность за счет снижения сетевого трафика и использования выделенного сервера. В последующих разделах этой главы каждый из участников будет рассмотрен более подробно.
(
Замечание
Хотя система репликации предназначена для обмена данными между множеством SQL Server 2000 (или других источников данных), в принципе можно организовать процесс репликации между базами данных одного и того же сервера. В этом случае издатель, дистрибьютор и подписчик запускаются на одном сервере SQL Server 2000. Помимо уже упомянутых терминов, при обсуждении репликации используются еще несколько: •
Публикация (Publication). Публикация представляет собой набор статей. Подписчик может подписаться только целиком на публикацию. Одна публикация способна включать статьи, принадлежащие одной базе данных. Чтобы предоставить данные из нескольких баз данных, придется создать отдельную публикацию в каждой из них.
•
Статья (Article). Статьей называется минимальный набор данных, рассматриваемый системой репликации как одно целое. Статья представляет собой таблицу или какую-то ее часть. Если необходимо выполнить тиражирование не всей таблицы, а только ее фрагмента, то необходимо использовать фильтрацию: •
Using a vertical filter (использование вертикального разделения), при которой в статью не включается одна или более колонок исходной таблицы;
•
Using a horizontal filter (использование горизонтального разделения), когда на строки, включаемые в статью, накладывается одно или более условий с ПОМОЩЬЮ КОНСТРУКЦИИ WHERE.
(
Замечание
J
Следует отметить, что в SQL Server 6.x существовала возможность подписки на отдельную статью публикации. Хотя в документации по SQL Server 2000 и указано, что подписка на отдельную статью не поддерживается, все же при обновлении SQL
576
Часть III. Администрирование Server 6.x до SQL Server 2000 настройки системы репликации сохраняются, и подписчик может копировать отдельную статью. Тем не менее, уже в SQL Server 7.0, а тем более в SQL Server 2000 средствами пользовательского интерфейса подписаться на отдельную статью публикации невозможно. Выходом является создание новой публикации, включающей только нужную статью. Microsoft не гарантирует, что поддержка репликации единственной статьи будет сохранена и рекомендует переписать приложения в соответствии с новыми требованиями.
Издатель Издателем (publisher) в терминологии системы репликации SQL Server 2000 называется сервер, который предоставляет (публикует) расположенную на нем информацию другим серверам. Администратор конфигурирует на издателе публикацию, включая в нее одну или более статей. Для публикации устанавливается список пользователей, имеющих право копировать ее себе. На каждую публикацию могут подписаться один или более подписчиков. То есть данные издателя могут быть отображены на множество других серверов-подписчиков. В свою очередь любой из серверов-подписчиков может являться издателем для других серверов. Такой подход позволяет создавать сложные разветвленные информационные системы, наиболее оптимальным образом использующие сетевые соединения. Замечание На сервере-издателе хранится вся информация о сконфигурированных публикациях, правах доступа к ним, о входящих в них статьях, а также о подписчиках, уже реплицирующих публикацию.
В функции издателя входит не только создание публикации, содержащей мгновенную копию информации базы данных, но, возможно, в зависимости от типа репликации, и постоянное отслеживание изменений, вносимых в данные пользователями. Периодически издатель может подготавливать либо новую полную копию публикуемых данных, либо только внесенные изменения. В некоторых типах репликации подписчики, в свою очередь, также могут вносить изменения в полученные от издателя данные. Простейший тип репликации — репликация моментальных снимков (Snapshot Replication). При этом изменения в данные могут вноситься только на издателе. Более сложные типы репликации допускают модификацию данных и на подписчиках. При этом система репликации автоматически отражает изменения, сделанные на издателе или на одном из подписчиков на все серверы — участники репликации.
Подписчик Подписчиком (subscriber) называется сервер, который принимает данные от издателя. Этот сервер подписывается на одну или более публикаций и единожды или периодически копирует опубликованные данные. Один подписчик может получать данные от множества издателей. Если учесть, что подписчик может
Глава 14. Репликация данных
577
выступать и в качестве издателя, то такой подход позволяет создавать сложные разветвленные системы распространения информации.
Замечание Система репликации SQL Server 2000 построена таким образом, что в качестве подписчиков могут выступать любые источники данных Microsoft Jet Database, ODBC и OLE DB. Важным моментом является то, что данные могут изменяться не только на издателе, но и на подписчике. Эта возможность появилась еще в SQL Server 7.0 и стала более функциональной в SQL Server 2000. Процесс изменения данных на подписчике не так прост, как кажется на первый взгляд. Если данные изменяются только на издателе, ситуация достаточно проста. Подписчики не могут вносить изменения, они должны лишь принимать изменения, сделанные на издателе. Изменение данных только на одном сервере исключает возможность возникновения конфликтов изменений. Если же изменения в данные разрешено вносить и на подписчиках, то появление конфликтов изменения данных неизбежно. Предположим, что два пользователя пытаются одновременно испоравить одну и ту же строку таблицы, причем значения, устанавливаемые пользователями, различны. Налицо конфликт изменения данных. SQL Server 2000 должен каким-то образом решить этот конфликт, т. к. существование двух различных состояний для одних и тех же данных крайне нежелательно. Для решения подобных конфликтов в SQL Server 2000 существуют три различных метода: • Репликация сведением (Merge Replication). Это самый сложный тип репликации. В этом случае допускается нахождение одних и тех же данных в нескольких различных состояниях. То есть каждый из серверов — участников репликации может иметь свое собственное значение для одной и той же строки. Для решения этой проблемы используется система приоритетов, в соответствии с которой решается, данные какого из серверов должны быть тиражированы на все другие серверы. • Подписчики незамедлительного обновления (Immediate Updating Subscribers). Эта технология позволяет избежать появления различных состояний для одних и тех же данных. Перед тем как на подписчике будет выполнено изменение, исправленные данные сравниваются с исходными данными на издателе. Если значения на подписчике и издателе совпадают, то изменение разрешается. Причем изменение данных выполняется сразу и на подписчике, и на издателе. • Отложенное обновление (Queue Updating). Эта технология, как и репликация сведением, допускает наличие на различных серверах нескольких состояний одних и тех же данных. Однако, в конце концов все изменения объединяются и из них остается только одно. Выбор этого изменения осуществляется в соответствии с правилами, установленными при создании соответствующей публикации.
578 •
Часть III. Администрирование
Замечание Более подробно каждая из технологий, реализующих изменение данных на подписчиках, будет рассмотрена в следующих разделах этой главы.
Весь смысл репликации в том, что данные на подписчиках должны являться копией данных издателя. Ни администратор, ни пользователи не должны прилагать усилий для распространения этих изменений. Вся работа по синхронизации данных ложится на SQL Server 2000. Не трудно прийти к вопросу о том, каким образом издатель и подписчик договариваются о времени распространения изменений? В SQL Server 2000 существует два различных метода обновления информации на подписчиках: П Принудительная репликация (Push Subscription). В этом случае подписчик играет пассивную роль. Он лишь ждет, когда дистрибьютор скопирует ему новую порцию данных. Вся работа по обновлению данных ложится на сервердистрибьютор, который сам должен установить соединение и выполнить все необходимые операции. Этот метод хорошо подходит для систем, в которых подписчик и дистрибьютор имеют постоянное соединение. Изменения данных могут быть распространены сразу же после того, как они были внесены. Процесс распространения данных может быть непрерывным. Интервалы обновления подписчиков устанавливаются на дистрибьюторе, и администратор может централизованно управлять скоростью распространения изменений. • Репликация по запросу (Pull subscription). Этот метод обновления предполагает, что вся работа по обновлению данных ложится на сервер-подписчик, который через определенные интервалы подключается к дистрибьютору и копирует с него новую порцию данных. Дистрибьютор подготавливает для каждого подписчика набор данных, отображающий все изменения, сделанные на издателе со времени последнего подключения этого подписчика. Репликация по запросу активно применяется мобильными пользователями и на серверах, не имеющих постоянного соединения с дистрибьютором. Такой метод репликации позволяет выполнять синхронизацию данных не только через определенные интервалы, но и в удобное для пользователей время. Мобильные пользователи могут всего на несколько минут подключиться к дистрибьютору и затребовать у него изменения. Кроме того, репликация по запросу позволяет разгрузить сервер-дистрибьютор. При работе в системе, в которой сконфигурировано большое количество мобильных пользователей, можно добиться заметного повышения производительности системы репликации. Репликация по запросу широко практикуется при работе с Интернетом. Пользователи глобальной сети могут начать копирование данных в наиболее удобный для них момент, а не сидеть около компьютера, пытаясь пробиться к серверу в строго определенное время.
Замечание Следует отметить, что в SQL Server 2000 для одной и той же публикации возможны как репликация по запросу, так и принудительная репликация. Это связано с тем, что выбор типа обновления определяется при конфигурировании подписчика, а не при создании публикации.
Глава 14. Репликация данных
579
Дистрибьютор Дистрибьютором (distributor) называется сервер, являющийся промежуточным звеном между издателем и подписчиком. Роль дистрибьютора сводится к сбору всей информации, которая должна быть скопирована подписчикам от издателя. Применение дистрибьютора в системе репликации позволяет гибко управлять загрузкой серверов. В качестве дистрибьютора может быть сконфигурирован как отдельный сервер, так и сервер, являющийся издателем или подписчиком. Если объем копируемой информации незначителен, то дистрибьютор можно установить на издателе. При повышении объема тиражируемой информации использование отдельного компьютера для работы дистрибьютора может повысить производительность всего процесса репликации в системе.
С
Замечание
^
Уже понятно, что дистрибьютор может работать с несколькими подписчиками. Но стоит сказать отдельно, что один и тот же дистрибьютор способен использоваться множеством издателей. Если информационная система организации включает множество издателей, и объем информации на любом из них не настолько велик, чтобы для каждого выделять собственного дистрибьютора, но все же существенно загружает издателя, то конфигурирование одного дистрибьютора для нескольких издателей может существенно повысить эффективность системы в общем. Дистрибьютор поддерживает специальную базу данных распределения (distribution database), в которой хранится информация обо всех подписчиках и издателях. Это база данных D i s t r i b u t i o n . Для каждого издателя в ней хранится информация о сконфигурированных на нем публикациях, их типе и параметрах статей в каждой публикации. Для подписчиков хранится список статей, на которые он подписан, информация о расписании обновления, времени последней синхронизации, и другие сведения. Кроме того, в базу данных распределения при репликации сведением стекается информация обо всех производимых на подписчиках и издателе изменениях. Специальный агент затем анализирует эту информацию и выполняет сведение множества данных в один блок.
(Замечание
J
В принципе, дистрибьютор может использовать более одной базы данных распределения. Это может быть полезным при работе со множеством издателей, для каждого из которых будет применяться своя собственная база данных распределения. Также для базы данных распределения можно использовать иное имя, чем предлагаемое по умолчанию. Правильное применение дистрибьютора может существенно снизить сетевой трафик и затраты времени на синхронизацию серверов. Предположим, что организация имеет множество филиалов, удаленных на значительное расстояние. В некоторых крупных городах имеется по несколько филиалов. В центральном офисе располагается база данных, информация из которой должна быть скопирована на серверы филиалов. Все серверы SQL Server 2000 связаны в единую сеть с помощью дорогих, но медленных наземных коммуникаций. Для распро-
580
Часть III. Администрирование
странения данных служит система репликации. При выборе места размещения дистрибьютора сначала приходит решение установить его в центральном офисе. Действительно, в этом случае можно обойтись единственным дистрибьютором, который будет обслуживать всех подписчиков. Но следует обратить внимание, что серверы связаны посредством медленных наземных соединений. При таком подходе неизбежна многократная передача информации в города, имеющие несколько филиалов. Лучшим решением будет установка дистрибьютора в городе с несколькими подписчиками. В этом случае достаточно единожды скопировать данные из центрального офиса, а затем распространить их между всеми подписчиками в городе по недорогим и быстрым каналам местной связи. Наряду с финансовой выгодой, такой подход может повысить скорость распространения изменений на все серверы информационной системы. Замечание Функции дистрибьютора может выполнять как выделенный сервер, так и сервер, сконфигурированный в качестве издателя или подписчика. В зависимости от метода репликации, функции дистрибьютора могут существенно меняться.
Механизмы репликации Как было сказано в начале главы, система репликации SQL Server 2000 реализована в виде специализированных агентов, выполняемых как самостоятельные процессы в контексте SQL Server 2000. В зависимости от типа репликации функции агентов могут изменяться вплоть до перемещения места запуска SQL Server 2000. Агенты репликации анализируют изменения, сделанные на подписчиках и издателях, подготавливают пакеты данных, копируют их подписчикам, решают конфликты изменений и т. д. Каждый из агентов репликации выполняет определенную роль. В процессе репликации участвуют как минимум два агента. Приведем список агентов подсистемы репликации SQL Server 2000: •
Snapshot Agent
•
Log Reader Agent
•
Queue Reader Agent
П Distribution Agent •
Merge Agent
Каждый из указанных агентов реализован как утилита командной строки. В пределах одного компьютера для всех инсталляций SQL Server 2000 предназначен общий набор агентов. Таким образом, при выполнении обновления агентов для одной инсталляции будет выполнено и обновление агентов для всех других инсталляций. Все агенты располагаются в каталоге \Program Files\Microsoft SQL Server\80\COM. В следующих разделах будет рассмотрено назначение агентов репликации, утилиты, представляющие каждый из агентов, и синтаксис этих утилит.
Глава 14. Репликация данных
581
Помимо указанных агентов, при конфигурировании механизмов репликации автоматически создаются несколько вспомогательных задач, которые выполняют "черновую" работу. Можно сказать, что перечисленные задачи убирают за агентами репликации. Например, эти задачи удаляют ненужные строки из базы данных D i s t r i b u t i o n , не позволяя ей разрастаться до необъятных размеров. Кроме того, они удаляют устаревшие файлы моментальных снимков и сценариев после того, как все участники репликации получают нужные данные. Приведем список этих задач: • Agent History Clean Up: Distribution запускается каждые 10 минут и выполняет удаление из базы данных распределения информацию о ходе работы агентов репликации. Удаляется вся информация, которая храниться более 48 часов. О Distribution Clean Up: Distribution запускается каждые 10 минут и удаляет из базы данных распределения информацию о всех транзакциях, которые были скопированы подписчиками. • Expired Subscription Clean Up запускается каждый день в час ночи и деактивирует все подписки, которые не были синхронизированы в течение указанного при создании публикации максимального периода ожидания. • Reinitialize Subscriptions Having Data Validation Failures — это задание не имеет расписания для автоматического запуска, однако активно и может быть с успехом запущено вручную. Рассматриваемое задание предназначено для повторной инициализации подписчиков, на которых обнаружено нарушение целостности данных. • Replication Agents Checkup осуществляет поиск агентов репликации, которые не запускались длительное время. Задание стартует каждые 10 минут и помогает администратору своевременно обнаружить сбои в работе агентов репликации. В принципе, применение вспомогательных задач не обязательно, и они могут быть удалены, но в этом случае администратор должен вручную выполнять всю "грязную" работу. Но лучше оставить все как есть. Вспомогательные задачи не требуют администрирования и работают в фоновом режиме незаметно для пользователей. Служба SQLServerAgent периодически запускает вспомогательные агенты для освобождения ресурсов, использованных агентами репликации. Замечание Механизмы репликации должны быть установлены отдельно после инсталляции SQL Server 2000. Репликация не является часто применяемым инструментом, поэтому программа установки SQL Server 2000 не включает ее в систему. Чтобы инициализировать механизмы репликации, достаточно вызвать один из мастеров репликации. SQL Server 2000 обнаружит, что система репликации не установлена и автоматически выполнит все необходимые действия. После этого на сервере добавится база данных D i s t r i b u t i o n , а в консоли Enterprise Manager— папка Replication Monitor. Рассмотрим подробно назначение и работу каждого из агентов.
582
Часть III. Администрирование
Агент Snapshot Agent Основное предназначение агента Snapshot Agent заключается в создании файлов моментальных снимков (snapshot file). Моментальные снимки представляют собой полную копию данных, выбранных для публикации, в конкретный момент времени. Моментальные снимки используются в каждом типе репликации. Независимо от типа репликации необходимо выполнить первоначальную синхронизацию подписчика и издателя. Подписчик должен быть приведен в то же состояние, что и издатель. Для этого агент Snapshot Agent создает файл моментального снимка. Кроме того, если на подписчике нет структур данных (таблиц), в которые должна копироваться информация с издателя, то нужно предварительно создать ее. Это также выполняется автоматически. Snapshot Agent генерирует файл сценария (script file), с помощью которого на подписчике можно выполнить создание таблицы с необходимой структурой. Файлы моментальных снимков и файлы сценариев сохраняются на дистрибьюторе и оттуда копируются подписчикам. На этом работа Snapshot Agent может закончиться. Однако в случае репликации моментальных снимков агент Snapshot Agent используется постоянно. Более подробно каждый из типов репликации рассмотрен далее в этой главе. Замечание Для каждой публикации SQL Server 2000 применяет индивидуальный Snapshot Agent. Агент Snapshot Agent реализован в виде утилиты snapshot.exe, которая имеет следующий синтаксис: snapshot -Publisher <..> -PublisherDB <..> -Publication <..> [-ReplicationType <1|2>] [-Distributor <..>] [-DistributorSecurityMode <0|l>] [-.DistributorLogin <..>] [-DistributorPassword <..>] [-PublisherSecurityMode <0|l>] [-PublisherLogin <..>] [-PublisherPassword <..>] [-MaxBcpThreads <....>] [-BcpBatchSize <..>] [-HistoryVerboseLevel <0|l|2|3>] [-RowDelimiter <..>] [-FieldDelimiter <..>] [-70Subscribers] [-ProfileName] [-DynamicFilterLogin <..>] [-DynamicFilterHostName <..>] [-DynamicSnapshotLocation <..>] [-Continuous]
Глава 14. Репликация данных
583
[-Output <..>] [-OutputVerboseLevel <0|l|2>] [-LoginTimeout <..>] [-QueryTimeout <..>] [-DefinitionFile <..>]
Мы не будем рассматривать назначение каждого из параметров утилиты snapshot.exe, т. к. это займет слишком много места. В разд. "Запуск агентов" далее в этой главе будет подробно рассмотрен принцип запуска агентов репликации. Сейчас же скажем, что агент Snapshot Agent по умолчанию запускается раз в неделю и обновляет файлы моментальных снимков. В принципе, владея синтаксисом утилиты snapshot.exe, можно инициировать процесс создания моментальных снимков из командной строки. Однако, более удачным способом будет принудительный запуск задания службы SQLServerAgent, реализующего запуск данного агента. Также можно сконфигурировать его запуск как реакции на генерирование сообщения об ошибке SQL Server, что позволит инициировать обновление файлов моментальных снимков из хранимых процедур, триггеров, функций и т. д. Для реализации этой возможности следует всего-навсего в свойствах соответствующего задания на вкладке Schedules определить оповещение, реагирующее на нужное сообщение об ошибке.
Агент Log Reader Agent Агент Log Reader Agent является основой репликации транзакций (Transactional Replication), запускается на дистрибьюторе и подключается к издателю. Затем он сканирует публикуемые таблицы и отслеживает строки, которые были изменены со времени последнего подключения. Эти строки отмечаются как обработанные И КОПИРУЮТСЯ В базу данных распределения Distribution. Из базы Dist r i b u t i o n информация затем распространяется всем подписчикам.
С
Замечание
^)
Как и в случае со Snapshot Agent, для каждой публикации используется индивидуальный Log Reader Agent. Агент Log Reader Agent реализован в виде утилиты logread.exe, которая имеет следующий синтаксис: logread -Publisher <.. > -PublisherDB <*..> [-KeepAliveMessagelnterval <..>] [-PublisherSecurityMode <0|l>] [-PublisherLogin <..>] [-PublisherPassword <.. >] [-Distributor <..>] [-DistributorSecurityMode <0I1>] [-DistributorLogin <..>] [-DistributorPassword <..>] [-Buffers <..>] [-SyncLogging]
584
Часть III. Администрирование
[-HistoryVerboseLevel <0|l|2>] [-PacketSize <..>] [-ReadBatchSize <..>] [-ReadBatchThreshold <.,>) [-Pollinglnterval <..>] [-Messagelnterval <..>] [-Continuous] [-Output <..>] [-OutputVerboseLevel <0|l|2>] [-LoginTimeout <..>] [-QueryTimeout <..>] [-DefinitionFile <..>]
Агент Queue Reader Agent В одном из предыдущих разделов этой главы было сказано, что в SQL Server 2000 появилась новая технология, позволяющая выполнять изменение данных на подписчиках — отложенное изменение (Queue Updating). Работа этой технологии базируется на помещении выполненных на подписчике изменений в специальную очередь (queue). Информация в эту очередь отправляется всеми серверами-подписчиками каждый раз, когда работающие на них пользователи вносят изменения в опубликованные данные. Сделанные на подписчиках изменения должны быть отображены на издателе и других подписчиках. То есть необходимо забрать у каждого подписчика информацию об изменениях, обработать ее и сделать доступной всем другим участникам репликации. Эти функции и выполняет агент Queue Reader Agent. Агент Queue Reader Agent всегда запускается на дистрибьюторе. Причем для всех издателей и подписчиков используется одна и та же копия агента. Основной задачей агента является считывание из очереди информации об изменениях опубликованных данных, которую предоставляют подписчики. Помимо считывания информации, агент также выполняет применение полученных изменений на издателе и разрешение конфликтов обновления, возникающих при изменении одних и тех же данных более чем одним сервером — участником репликации. Агент Queue Reader Agent реализован в виде утилиты qrdrsvc.exe, имеющей следующий синтаксис: Qrdrsvc [-Distributor ] [-DistributionDB ] [-DistributorLogin ] [-DistributorPassword ] [-DistributorSecurityMode <0-l>] [-ResolverState ] [-HistoryVerboseLevel <0-3>] [-Pollinglnterval <0-240 seconds>] [-Continuous] [-Output <..>] [-OutputVerboseLevel <0|l|2>]
Глава 14. Репликация данных
585
[-LoginTimeout <..>] [-QueryTimeout <..>] [-DefinitionFile <..>]
Агент Distribution Agent Назначение агента Distribution Agent состоит в распространении изменений, собранных агентами Snapshot Agent и Log Reader Agent. Агент Distribution Agent подключается к подписчику и копирует ему данные из моментальных снимков ИЛИ базы данных Distribution.
Если применяется репликация моментальных снимков или репликация транзакций с поддержкой подписчиков незамедлительного обновления, то для такой публикации запускается отдельный агент Distribution Agent. Во всех остальных случаях используется один общий Distribution Agent. Место запуска Distribution Agent зависит от метода обновления подписчика. При репликации по запросу (pull replication) агент запускается на подписчике. Когда же используется принудительная репликация (push replication), то старт агента выполняется на дистрибьюторе. Агент Distribution Agent реализован в виде утилиты distrib.exe, имеющей следующий синтаксис: distrib -Publisher <..> -PublisherDB <..> [-Publication <..>] [-SubscriptionType <0-2>] [-SubscriberDB <..>] [-SubscriberSecurityMode <0|l>] [-SubscriberLogin <..>] [-SubscriberPassword <..>] [-SubscriberType <0-2>] [-SubscriberDatabasePath <..>] [-Distributor <..>] [-DistributorSecurityMode <0|l>] [-DistributorLogin <..>] [-DistributorPassword <..>] [-DistributorNetwork <..>] [-DistributorAddress <..>] [-FileTransferType <0|l>] [-FtpAddress <..>] [-FtpPort <"..>] [-FtpUserName <..>] [-FtpPassword <..>] [-TransactionsPerHistory <..>] [-CommitBatchSize <..>] [-CommitBatchThreshold <..>] [-MaxDeliveredTransactions <..>] [-BcpBatchSize <..>] [-SubscriptionTableName <..>] [-ErrorFile <..>] [-MaxBcpThreads <..>]
-Subscriber <..>
586
Часть III. Администрирование
[-UselnprocLoader] [-NoTextlnitOnSync] [-Buffers] [-Quotedldentifier <..>] [-HistoryVerboseLevel <0|l|2|3>] [-ProfileName <..>] [-KeepAliveMessagelnterval <..>] [-AltSnapshotFolder <..>] [-SkipErrors] [-Hostname] [-UseDTS] [-PacketSize <..>] [-Pollinglnterval <..>] [-Messagelnterval <..>] [-Continuous] • [-Output <..>] [-OutputVerboseLevel <0|l|2>] [-LoginTimeout <.'.>] [-QueryTimeout!<..>] [-DefinitionFile <..>]
Агент Merge Agent Агент Merge Agent применяется исключительно при работе с репликацией сведением (merge replication). Это самый сложный тип репликации, появившийся в SQL Server 7.0. В более ранних версиях ничего подобного не было. Репликация сведением позволяет изменять данные не только издателю, но и подписчикам. Причем изменения вносятся таким образом, что не нужно постоянное соединение между издателем и подписчиком. Это выгодно отличает репликацию сведением от подписчиков незамедлительного обновления, для которых наличие соединения подписчика с издателем является обязательным. В случае репликации сведением подписчики могут лишь изредка подключаться к дистрибьютору и синхронизировать свои базы с базой издателя. Роль агента Merge Agent заключается в отслеживании изменений, сделанных на подписчиках в реплицированных с издателя данных. После того как подписчики получат моментальный снимок данных издателя, и будет выполнена первоначальная синхронизация, подписчики могут отключиться от дистрибьютора и вносить изменения автономно. Все выполняемые изменения автоматически фиксируются Merge Agent. При следующем подключении к дистрибьютору агент копирует ему все измененные данные. Таким образом, остальные подписчики и сам издатель могут получить измененные данные. Кроме того, агент Merge Agent решает конфликты изменения, неизбежные при таком способе внесения исправлений в данные. Агент собирает модифицированные строки с подписчиков и издателя и помещает их в базу D i s t r i b u t i o n . Если в один момент времени имеется более одного состояния для одной и той же строки (строка была изменена на нескольких серверах), то возникает конфликт изменения. Агент должен решить, какое изменение имеет право "на жизнь", а какое должно быть потеряно. Это заключение дается на основе шкалы
Глава 14. Репликация данных
587
приоритетов. Изменения, сделанные сервером с более высоким приоритетом, остаются, остальные теряются.
Замечание Репликация сведением может быть сконфигурирована таким образом, что данные будут перемещаться либо в одном направлении — от подписчика к издателю, либо в двух направлениях — сначала от подписчика к издателю, а затем обратно. Каждая публикация, сконфигурированная для репликации сведением, имеет своего собственного агента Merge Agent. Если для обновления подписчиков используется репликация сведением по запросу, то Merge Agent запускается на подписчике, а в случае принудительной репликации сведением агент работает на издателе. Агент Merge Agent подключается как к издателю, так и ко всем подписчикам. Он собирает все измененные данные в центральную базу, выполняет сведение множества изменений в единую базу и затем копирует полученный результат всем участникам репликации. Агент Merge Agent реализован в виде утилиты replmerg.exe, имеющей синтаксис: replmerg -PublisherDB <..> -Subscriber <..> -SubscriberDB <..> -Publication <..> [-Hostname <..>] [-Pollinglnterval ] [-Validatelnterval ] [-SubscriptionType <0|l|2>] [-SubscriberConflictClean <0|l>] [-PublisherSecurityMode <0|l>] [-PublisherLogin <..>] [-PublisherPassword <..>] [-SubscriberSecurityMode <0|l>] [-SubscriberLogin <..>] [(-SubscriberPassword I -SubscriberEncryptedPassword) <..>] [-SubscriberType <0111 2|3|4 I 5|6 I 7|8>] [-Validate <0|l|2|3>] [-FastRowCount <0|l>] [-HistoryVerboseLevel <0|l|2|3>] [-ProfileName <..>] [-MaxBcpThreads <..>] [-UselnprocLoader] [-InteractiveResolution <0|l>] [-KeepAliveMessagelnterval <..>] [-SrcThreads <..>] [-DestThreads <..>] [-ForceConvergenceLevel <0|1>] [-InputMessageFile <..>] [-InputMessageFromPublisher <0I1>] [-OutputMessageFile <..>] [(-Distributor <..>) I (-DistributorNetwork <..> -DistributorAddress <..>]) [-DistributorSecurityMode <0|l>] [-DistributorLogin <..>]
588
Часть III. Администрирование
[(-DistributorPassword | -DistributorEncryptedPassword) <..>] [-MaxDownloadChanges <..>] [-MaxUploadChanges <..>] [-UploadGenerationsPerBatch <..>] [-DownloadGenerationsPerBatch <..>] [-UploadReadChangesPerBatch <..>] [-DownloadReadChangesPerBatch <..>] [-UploadWriteChangesPerBatch <..>] [-DownloadWriteChangesPerBatch <..>] [-SubscriberDBAddOption 0|l|2|3] [-SubscriberDatabasePath <..>] [-FileTransferType <0|l>] [-FtpAddress <..>] [-FtpPort <..>] [-FtpUserName <..>] [-FtpPassword <..>] [-ExchangeType <1|2|3>] [-AltSnapshotFolder <..>] [-SyncToAlternate <0|l>] [-DynamicSnapshotLocation <..>] [-Continuous] [-Output <..>] [-OutputVerboseLevel <0Ц|2>] [-Log inT imeout <..>] [-QueryTimeout <..>] [-DefinitionFile <..>]
Запуск агентов Агенты репликации запускаются с помощью заданий службы SQLServerAgent. Следовательно, они будут иметь те же права доступа к данным, что и учетная запись, под которой стартует SQLServerAgent. Чтобы избежать проблем с разграничением доступа, можно запускать службу SQLServerAgent под той же учетной записью, что и службу MSSQLServer. Перед началом процесса репликации следует убедиться, что служба SQLServerAgent запущена. Рекомендуется установить автоматический запуск этой службы при каждом запуске операционной системы. Однако указанные проблемы возникают, если агенты репликации используют аутентификацию Windows NT. Однако агенты также могут устанавливать соединение и с помощью аутентификации SQL Server, что позволяет предоставлять им права, отличные от прав службы SQLServerAgent. Если посмотреть содержимое папки Management\SQL Server Agent\Jobs (рис. 14.1) на сервере, участвующем в репликации данных, то можно будет увидеть, что на нем имеется ряд заданий, относящихся к одной из категорий REPL. Эти задания как раз и реализуют работу агентов репликации. Для более полного понимания функционирования подсистемы репликации рассмотрим свойства одного из заданий, обеспечивающих выполнение репликации. На рис. 14.2 приведено окно свойств задания STORAGE-pubs-1, обеспечивающего работу агента Log Reader Agent.
Глава 14. Репликация данных
589
ж SQL Server Enterprise Manager - [Console Root\Mitro*oft S I "(И £ o n 5 o ' e
| Action
Window
View
Help
_J
'. • . : •
'; <> »ч
Ipols
dD'-Щ] ' У
Tree j
О (В СЗ
Ш ИЗ Щ>
s Jobs 15 Items
_J Consoe l Root ^jj Mc i rosoft SQL Servers
[Enabe l d | Runnat
| Category ^[STORAGE]. 7
REPL-QueueReader REPL-History Cleanup
^JAgent history clean up: distribution
В t$ MATRIX Servers ; sifjciT
£JCDW_JOB_STORAGE\TRELON_STORAGE_0 ; . Й - f S STORAGE (Windows NT/2000) ^Distribution clean up: distribution , ; Si-CD Databases Expired subscription clean up • • ' Ш C j Data Transformation Services Maintenance_DatatiaseJobs \ \ B - Q Management |§jNew Package й••§?) SQL Server Agent JJJpubsStat О Alerts ^Reinitialize subscriptions having data validation f. ! Ш Operators ^Replication agents checkup i 'olsTORAGE-pubs-l
Yes Yes
Yes Yes
[Uncategorized (Local)]
Yes
Yes
REPL-Distribution Cleanup
Yes
Yes
REPL-Subscription Cleanup
Yes
Yes
[Uncategorized (Local)]
Yes
Yes
; yp Backup
[Uncategori2ed (Local)]
Yes
Yes
[Uncategorized (Local)]
Yes
Yes
REPL-Alert Response
Yes
Yes
REPL-Checkup
Yes
Yes
REPL-LogReader
Yes
REPL-Snapshot
Yes Yes
REPL-Distribution
Yes
Yes
REPL-Distribution
Yes
Yes
[Uncategorized (Local)]
Yes
Yes
^STORAGE-pubs-pubs-1 Ш Щ\ Current Activity STORAGE-pubs-pubs-STORAGE-Administrator D.. — у й Database Maintenance Plai 1|]sTORAGE-pubs-pubs-STORAGE\Trelon-10 И f_2 SQL Server Logs *OJTSQLJob_l +' C_) Replication SI S | Replication Monitor El Q l Security Щ C_J Support Services (fl C j Meta Data Services @jj) STORAGE\TRELON (Windows NT/2 | Other Servers I b SIRIUS J Replication Monitor Group
Yes
Рис. 1 4 . 1 . Папка ManagementASQL Server Agent\Jobs при использовании репликации STORAGE-pubs i Properties - STORAGE General j Steps | Schedules | Notifications |/74 I Name: ".
S
T
O
R
A
G
E
-
p
u
b
s
-
1 S
Created:
2
Category.
0
.
R
6
E
.
P
1
L
-
2
L
0
o
0
g
0
R
1
e
4
a
:
d
2
S
T
O
R
A
G
E
V
\
d
m
i
7
e
:
4
R
4
£
n
a
b
l
e
d
o
Description:
N
( •
.
,
.
-
.
d
e
s
c
r
i
p
t
i
o
n
n
c
e
T
:
a
r
(
g
e
t
j
o
c
a
l
o
c
l
a
s
l
e
)
r
v
e
r
a
s
t
v
a
r
a
i
l
a
t
o
b
l
L
o
c
a
l
)
H
I
r
e
. J
Last modified: .
o
r
t
(
Owner:
u
:
2
6
.
•
1
0
•
.
2
•
0
:
0
•
0
1
•
4
:
2
.'..
7
:
4
•
6
•
O
K
C
a
n
c
e
l
-
A
p
p
i
y
H
e
l
p
Рис. 14.2. Вкладка General окна свойств задания
Интерес на вкладке General представляет только категория, к которой относится задание — REPL-LogReader. В принципе, сам по себе выбор категории не играет
Часть III. Администрирование
590
особого значения, т. к. все действия, которые будет выполнять задание, конфигурируются на уровне отдельных шагов. С помощью поля Name можно присвоить заданию более осознанное имя, чем предлагаемое по умолчанию. Имя задания не играет особого значения, т. к. на него нет ссылок из других подсистем. Именно поэтому изменение имени выполняется так просто. В поле Created указывается дата создания задания, по которой можно судить, как давно была инициирована репликация. Флажок Enabled позволяет контролировать выполнение задания. Если флажок установлен, то задание может быть запущено. В случае, если необходимо гарантировать, что задание временно не будет выполняться, то достаточно лишь сбросить указанный флажок. Удалять задание в этом случае не потребуется. Обратимся теперь ко вкладке Steps (рис. 14.3), с помощью которой конфигурируется собственно набор действий, выполняемых заданием. Как видно, задание состоит из трех шагов: П Log agent startup message; •
Run agent;
•
Detect nonlogged agent shutdown.
STORAGE pubs-1 Properties - STORAGE General Steps j Schedules | Notifications ] |lD .; {.Step Name I Type !0n Success iOn Failure в 1 *• Log agent startup message. Transact-SQL Script Goto next step Goto next step 2 Run agent. Replication Transaction-Log Reader Quit with success Goto next step 3 Detect nonlogged agent shut... Transact-SQL Script Quit with failure Quit with failure
Move step:
Start step: New.
|(1) Log agent startup _^J Insert... OK
Edit.. Cancel
Delete
Help
Рис. 14.3. Вкладка Steps окна свойств задания
Откроем окно свойств первого шага (рис. 14.4), выбрав его на вкладке Steps и нажав кнопку Edit. Как видно, шаг имеет тип Transact-SQL Script и выполняется в контексте базы данных D i s t r i b u t i o n , которая является базой данных распределения. Напомним, что данная база данных создается на дистрибьюторе. Собственно шаг представлен единственной командой — вызовом недокументированной системной хранимой Процедуры sp__MSadd_logreader_history, которая имеется только в базе данных распределения. Назначением этой процедуры является всего-навсего создание в специальной системной таблице базы данных распределения записи о том, что был осуществлен запуск агента Log Reader
Глава 14. Репликация данных
591
Agent. Впоследствии по подобным записям можно восстановить ход работы агентов репликации. В принципе, если вы не хотите оставлять следов, можно удалить первый шаг задания.
Edit Job Step - STORAGE\STQRAGE-pubs-l General I Advanced I Step name: (l-og agent startup message, lype:
d
I Transact-SQL Script (TSQL)
D atabase:
z\
distribution
Command: sp_MSaddJogreader_history @perfmonjncrernent = 0, @agent_id = 1, @runstatus = 1, ©comments = 'Startii>g at Go to:
OK
Next
Cancel
Apply
Help
Рис. 14.4. Окно свойств первого шага, вкладка General
Перейдя на вкладку Advanced (рис. 14.5), можно посмотреть, какое действие будет выполнено после завершения выполнения шага. Как видно, независимо от результата выполнения первого шага будет запущен второй шаг.
Edit Job Step - STORAGE\STORAGE-pubs-1 General Advanced j г On success / failure flowOn success action:
Goto the next stec
Retry attempts: On failure action:
Retry n i terval (mniutes): I! j Goto the next step
3'
Transact-SQL Script [TSQL) command options Output file: (~ Append output to step history Run as user:
Go to:
[(Self)
J I
0 K
Cancel
Apply
Help
Рис. 14.5. Окно свойств первого шага, вкладка Advanced 20 Зак. 83
~4 j
Часть III. Администрирование
592
Рассмотрим же теперь свойства второго шага задания (рис. 14.6). Этот шаг имеет тип Replication Transaction-Log Reader. Особенностью шагов этого типа является то, что они запускают утилиту командной строки logread.exe, реализующую агента Log Reader Agent. Текст, приведенный в поле Command, является ничем иным как ключами запуска этой утилиты, с помощью который указывается конкретный набор действий и их параметры, подлежащие выполнению агентом. Полный синтаксис вызова утилиты logread.exe будет дан ниже при описании агента Log Reader Agent. J*J
Edit Job Step - STORAGE\STORAGE pubs-J Geneial Advanced I £tep name: (Run agent. lype:
Command:
Go to:
j R eplication T ransaction-Log R eader
Publisher [STORAGE] PublisherDB [pubs] Distributor [STORAGE] DistributorSecurityMode 1 Continuous
Next
Previous
OK
Cancel
Apply
Help
Рис. 14.6. Окно свойств второго шага, вкладка General
Перейдя на вкладку Advanced (рис. 14.7) можно увидеть, что в случае успешного завершения работы утилиты logread.exe (поле On success action) работа всего задания завершится и будет возвращен код успешного завершения задания (значение Quit the job reporting success). В случае неудачного завершения шага (поле On failure action) будет выполнен следующий шаг (значение Goto the next step). Однако перед этим будет предпринято 10 попыток (поле Retry attempts) выполнения утилиты с интервалом в одну минуту (поле Retry interval (minutes)). В завершение рассмотрим свойства третьего шага задания (рис. 14.8), который, как уже стало ясно, выполняется лишь в случае неудачного выполнения всех 10 попыток запуска утилиты logread.exe. Как видно из рисунка, шаг имеет тип Transact-SQL Script (TSQL) и представляет собой выполнение недокументированной системной хранимой процедуры sp_MSdetect_nonlogged_shutdown, КОторая вносит соответствующую запись в базу данных распределения о неудачном завершении запуска агента Log Reader Agent. На вкладке Advanced (рис. 14.9) можно увидеть, что независимо от результата выполнения указанной хранимой процедуры работа всего задания будет завершена с выдачей кода неудачного выполнения.
593
Глава 14. Репликация данных Edit Job Step - STORAGEXSTORAGE General Advanced | г On success / failure flow !
On success action:
Quit the lob reoortinq success
Retry attempts: On failure action:
Retry interval (minutes): |1 j Goto the next step
Replication Transaction-Log Reader command options
There are no options for this command type.
Go to:
Next
Previous
OK
Cancel
Apply
Help
Рис. 14.7. Окно свойств второго шага, вкладка Advanced Edit Job S t e p - STORAGE\STQRAGE-pubs~l
[General] Advanced J S,tep name: (Detect nonlogged agent shutdown. lype:
Transact-SQL Script (TSQL)
Database: j distribution Command p_MSdetect_nonlogged_shutdown
zl
©subsystem : • @agent_id = 1
il Go to:
Prevo i us
OK
Cancel
Apply
Help
Рис. 14.8. Окно свойств третьего шага, вкладка General
На этом рассмотрение шагов задания, реализующего работу агента Log Reader Agent, можно считать оконченным. Как видно, для запуска собственно агента достаточно одного шага. Два же других шага являются вспомогательными для отображения в журнале репликации хода работы ее агентов. На основе этой информации впоследствии можно будет увидеть, как часто запускались агенты, в какой последовательности и с каким результатом.
594
Часть III. Администрирование
Edit Job Step - 5T0RAGE\ST0RAGE*pubs-l General Advanced | Г On success / failure flow
On success action: Betry atempts:
j Quit the job reporting failure JO Retry .interval (minutes): •
On failure action:
jQuit the job reporting failure
г Transact-SQL Script (TSQL) command options j
Output file:
|
Г" Append output to step history
j
Run as user:
Go to:
J
(Self) Previous
~3
Cancel
Appyl
Hep l
Рис. 14.9. Окно свойств третьего шага, вкладка Advanced STORAGE-pubs-l Properties - STORAGE General) Steps Schedules j Notifications | Note: The current date/time on target server [ID ^26
31.10.200015:46
iName j Enabled i Description Replication Agent Schedule. Yes Start automatically when SQL Server Agent Starts
New Schedule...
Edit..
New Alert.. OK
Cancel
Delete
Apply
Рис. 14.10. Вкладка Schedules окна свойств задания
Интерес также представляет и время запуска агента Log Reader Agent. Для получения этой информации необходимо в окне свойств задания перейти на вкладку Schedules (рис. 14.10). Как видно, для задания определено всего одно расписание запуска. В столбце Description можно просмотреть расписание запуска задания. Как видно, задание запускается каждый раз при старте службы SQLServerAgent (Start automatically when SQL Server Agent Starts). Запущенное однажды, оно загружает утилиту logread.exe, которая в дальнейшем функционирует как самостоятельный процесс операционной системы. Таким образом, нет
Глава 14. Репликация данных
595
нужды запускать агента каждый раз, когда необходимо обновить данные. Открыв менеджер задач (Task Manager) и перейдя на вкладку Processes (рис. 14.11), можно заметить, что утилита logread.exe находится в оперативной памяти. Там же можно увидеть, какой ее объем используется этой утилитой. Ш Windows Task ManagerFile Options View Help Applications Processes j Performance ] Image Name WinMgmt.exe Dfssvc.exe inetinfo.exe sqlagent.exe Explorer.exe internat.exe hh.exe sqlmangr.exe OS A. EXE svchost.exe Far.exe Photoshp.exe isqlw.exe distrib.exe iloqread.exe qrdrsvc ,exe mmc.exe taskmgr.exe excel.exe
1
CPU Time j Mem Usage |ж 0:00:08 168 К 1216K 0:00:00 0:00:01 3 180 К 0:00:02 3 820 К 3 248 К 0:00:45 0:00:00 1440 К 0:00:05 4 404 К 0:00:00 3 000 К 1 600 К 0:00:00 0:00:00 1308 К 0:00:02 1852 К 0:00:31 . .16 024 К 4 536 К 0:00:05 0:00:00 2 668 К 2 324 К Ш 0:00:00 0:00:37 4 440 К 8812К 0:00:38 0:00:01 2 168 К _ 4 776 К Ч 0:00:00
F I D ] CPU
768 824 844 992 1004 1016 1044 1108 1148 1164 1208 1472 1480 1500 1512 1560 1596 1620 1624
00 00 00 01 01 00 00 00 00 00 00 00 00 00 00 02 00 01 00
End Process
processes: 37
(CPU Usage: 1 1 %
Mem Usage: 144228K / 217216K
Рис. 14.11. Вкладка Processes менеджера задач
Замечание Открыть менеджер задач можно с помощью комбинации клавиш +<Shift>+ +<Esc>, или нажав в свободной части панели задач правую кнопку мыши и в открывшемся контекстном меню выбрать пункт Task Manager. Можно также нажать комбинацию клавиш ++ и воспользоваться кнопкой Task Manager. Отметим, что указанные действия относятся только к операционным системам Windows NT 4.0 и Windows 2000.
Замечание На рис. 14.11 отлично видно, что в памяти также постоянно находятся и другие агенты — Distributor Agent (distrib.exe) и Queue Reader Agent (qrdrsvc.exe). Агент Merge Agent (replmerg.exe) не присутствует в памяти, т. к. не сконфигурирована репликация сведением. Агент Snapshot Agent выгружается из памяти сразу же после того, как выполнит создание моментальных снимков. По умолчанию он запускается каждую субботу в 23:33.
На этом рассмотрение задачи, выполняющей запуск агента Log Reader Agent, можно считать оконченным. Вкладка Notifications при автоматическом создании
596
Часть III. Администрирование
задания средствами мастеров поддержки репликации не конфигурируется. Однако, если вы хотите извещать какого-то оператора о неудачном запуска агента, то ничто не мешает сделать этого. Мы на примере агента Log Reader Agent объяснили общие принципы запуска агентов репликации. Конфигурирование других агентов не имеет особых отличий, поэтому мы не будем их рассматривать.
Типы репликации В предыдущих разделах мы уже упоминали типы репликации. В этом разделе будет дана исчерпывающая информация о принципах их работы. Система репликации SQL Server 2000 предоставляет пользователям и администраторам потрясающие возможности распространения и объединения данных среди множества систем хранения и обработки данных. В SQL Server 2000 применяются три следующих базовых типа репликации: О Snapshot Replication — репликация моментальных снимков; П Transactional Replication — репликация транзакций; П Merge Replication — репликация сведением. Между перечисленными типами существует довольно значительная разница. Кроме того, базовые возможности некоторых типов репликации могут быть расширены, если разрешить выполнение изменения данных на подписчиках. При использовании указанных типов репликации в "чистом" виде изменение данных на подписчиках будет разрешено только при помощи репликации сведением. Однако, при работе с репликацией моментальных снимков и репликации транзакций также допускается выполнение изменений со стороны подписчиков. Для реализации этой возможности необходимо использовать дополнительные технологии: П Immediately-Update Subscribers — подписчики незамедлительного обновления; • Queue Updating — отложенное обновление. Замечание Напомним, что технология отложенного обновления является нововведением SQL Server 2000 и недоступна в SQL Server 7.0. Чтобы решить, какой тип репликации необходим в том или ином случае, нужно четко представлять, какие возможности предоставляет каждый из них. В последующих разделах подробно представлен каждый тип репликации, его преимущества и недостатки. Также отдельно будут рассмотрены обе технологии, позволяющие выполнять изменение данных на подписчиках для репликации моментальных снимков и репликации транзакций.
Глава 14. Репликация данных
597
Репликация моментальных снимков Начнем знакомство с типами репликации с самого простого — репликации моментальных снимков (Snapshot Replication). Свое название этот тип репликации получил за метод, которым данные распространяются подписчикам. Для тиражирования данных используются так называемые моментальные снимки (snapshot). Моментальный снимок представляет собой полную копию данных издателя, которые выбраны для репликации. Для каждой статьи производится выборка данных из исходной таблицы с учетом вертикальной и горизонтальной фильтрации. По завершении выборки для всех статей публикации полученная информация сохраняется в специальный файл — файл моментального снимка (snapshot file), который представляет копию реплицируемых данных издателя в конкретный момент времени — моментальный снимок. Преимуществом репликации моментальных снимков является низкая загруженность процессора. Если для обеспечения работы других типов транзакций потребуется постоянное присутствие в памяти соответствующих агентов, то при работе с репликацией моментальных снимков этого не требуется, т. к. никакой анализ данных не производится. Не нужно постоянно отслеживать изменения, вносимые пользователями в данные. В процессе репликации просто копируются все данные, включенные в публикацию. Но это является и недостатком. Если количество информации в базе данных значительно, то файлы моментальных снимков могут иметь очень большой размер. Загрузка сети будет расти пропорционально увеличению количества подписчиков. Передача файлов моментальных снимков всем подписчикам может занять слишком много времени. Изменение даже очень небольшой части данных приведет к необходимости доставки подписчикам всех публикуемых данных. Это препятствует частой синхронизации подписчиков с издателем, что, в свою очередь, ведет к снижению оперативности отображения изменений. Достоинством репликации моментальных снимков является гарантия согласованности данных на издателе и подписчиках. Можно с уверенностью сказать, что данные на подписчике являются копией данных издателя. Высокая требовательность к каналу передачи данных ограничивает область применения репликации моментальных снимков. Ее обычно применяют в системах, в которых изменения вносятся очень редко или вообще не вносятся, а также в системах, оперативность отображения изменений в которых не играет большой роли, и поэтому допустима редкая синхронизация данных. Лучшим примером систем "только для чтения" являются системы поддержки принятия решений (DSS, Decision Support Systems). Эти системы хранят в основном историческую информацию, изменения в которую обычно не вносятся. Например, базу данных финансовых операций за прошедший год вряд ли придется изменять, и она может быть установлена в режим "только для чтения". Репликация сведением является в этом случае лучшим вариантом тиражирования данных — достаточно один раз скопировать данные с издателя и репликация моментальных снимков будет лучшим решением.
Часть III. Администрирование
598
Кроме того, репликация моментальных снимков может быть использована в базах данных, характеризующихся очень большим количеством изменений. Предположим, что в организации имеется несколько мобильных пользователей, подключающихся к дистрибьютору всего несколько раз в неделю. Применение репликации транзакций или репликации сведением приводит к возникновению цепочки изменений для каждого подписчика, которые необходимо сделать в его базе данных. Если количество изменений велико, а пользователи выполняют синхронизацию редко, то объем накопленных изменений может иногда превышать объем публикуемых данных. Если учесть затраты процессорного времени на отслеживание изменений, то решение об использовании репликации моментальных снимков будет весьма логично. Рассмотрим, какие механизмы применяются для работы репликации моментальных снимков. На рис. 14Л2 приведена схема взаимодействия издателя и подписчика.
Публикуемая база данных База данных подписчика
I Snapshot Agent
Snapshot folder
Distribution Agent База данных распределения
• + > Данные или транзакции —*• История и ошибки
"Рис. 14.12. Репликация моментальных снимков
Как видно, репликация моментальных снимков реализуется всего двумя агентами — Snapshot Agent и Distribution Agent. Назначение каждого из них было рассмотрено ранее в этой главе. Рассмотрим теперь, что же конкретно делают эти агенты применительно к репликации моментальных снимков. Роль агента Snapshot Agent сводится к созданию данных, которые будут распространены подписчикам. Этот агент не работает постоянно, а лишь периодически запускается в соответствии с установленным расписанием. Каждый раз при запуске он производит выборку информации из базы данных и помещает ее в
Глава 14. Репликация данных
599
файлы моментальных снимков (snapshot files). Рассмотрим, какие шаги выполняются в этом процессе: 1. Агент Snapshot Agent автоматически запускается на дистрибьюторе и устанавливает соединение с издателем. После этого начинается процесс выборки данных. Для всех таблиц, для которых определены статьи, агент устанавливает коллективную или разделяемую блокировку (share-lock). Эта блокировка запрещает пользователям вносить любые изменения в данные таблицы, включая удаление и вставку. Но возможность чтения данных остается. Такой подход гарантирует, что целостность и последовательность копируемых данных не будут нарушены. В противном случае пользователь может удалить уже скопированную строку и вставить ее в конец. В итоге агент скопирует две одинаковые строки. При вставке этих данных на подписчике может быть нарушена уникальность строк, и репликация будет остановлена. Это обеспечивает целостность копируемых данных. Блокировка гарантирует, что скопированные данные будут последовательны, т. е. пользователь не сможет удалить уже скопированную агентом строку, а затем снова вставить ее в конец таблицы. Это могло бы вызвать нарушение целостности данных. Запрещение изменений данных может вызвать недовольство пользователей, особенно если создание файла моментального снимка длится достаточно долго. Поэтому имеет смысл подумать о планировании запуска агента Snapshot Agent в ночное время. 2. На этом шаге агент генерирует файл схемы с расширением SCH для каждой статьи. С помощью этого файла на подписчике можно создать таблицу со структурой, идентичной структуре статьи (но не обязательно таблицы, на основе которой создана статья). Кроме того, если исходная таблица статьи имела индексы, и эти индексы входят в статью, то агент также создает сценарий для организации этого индекса на подписчике и сохраняет его в файл с расширением IDX. Агент с издателя подключается к дистрибьютору и сохраняет файлы SCH и IDX в тот же каталог, в котором размещена база данных распределения D i s t r i b u t i o n . 3. На третьем шаге Snapshot Agent образует собственно копию публикуемых данных. Как уже говорилось, данные сохраняются в файлы моментальных снимков. Для создания этих файлов применяются механизмы массивного копирования. С помощью утилиты bcp.exe производится создание текстовых файлов исконного или внутреннего (native) формата для каждой статьи. Полученные файлы имеют расширение ВСР и, подобно файлам SCH и IDX, хранятся в одном каталоге с базой данных D i s t r i b u t i o n . Создание файла форматирования для текстовых файлов не выполняется, т. к. используется исконный формат, а файлы SCH гарантируют, что структура таблиц на подписчике будет соответствовать формату файлов ВСР.
(~
Замечание
^
Текстовые файлы сохраняются в исконном формате лишь в том случае, если все участники репликации являются серверами SQL Server 2000. В SQL Server 6.x или любой другой системе текстовые файлы имеют символьный формат. Файлы моментальных снимков в этом случае будут иметь расширение ТХТ.
600
Часть III. Администрирование
4. После того как сгенерированы все необходимые файлы (SCH, IDX, ВСР или ТХТ), необходимо сохранить всю информацию о проделанной работе. На четвертом шаге агент Snapshot Agent регистрирует в базе данных D i s t r i b u t i o n создание файлов, указывает их имя, дату создания и другую информацию, на основании которой данные затем рассылаются подписчикам. ДЛЯ ЭТОГО ИСПОЛЬЗУЮТСЯ ДВе Таблицы: Msrepl_commands И Msrepl_transactions. В первой из них указывается количество подготовленных файлов, факт их наличия, имена и т. д. В таблице Msrepi_transactions задается время создания копии данных издателя и устанавливается время следующей синхронизации подписчиков. 5. На последнем шаге снимается блокировка со всех таблиц издателя. В журнал репликации (log history file) сохраняется информация о проделанных действиях. Этот журнал может быть впоследствии использован для анализа ошибок (если таковые были), приведших к прерыванию репликации данных. На этом работа агента Snapshot Agent заканчивается. В случае успешного выполнения всех приведенных шагов на дистрибьюторе будет иметься необходимый набор данных, а в базе данных D i s t r i b u t i o n — вся необходимая для тиражирования данных информация. На этом этапе можно начинать распространение данных подписчикам.
Замечание Файлы моментальных снимков (ВСР или ТХТ), подготовленные агентом Snapshot Agent, участвуют не только в процессе репликации. Администратор может использовать эти файлы и для других целей. Это замечание касается и других файлов — схемы (SCH) и индексов (IDX). Копирование данных, подготовленных агентом Snapshot Agent, всем зарегистрированным подписчикам занимается агент Distribution Agent. Этот агент запущен постоянно и, отслеживая появление обновленных данных на дистрибьюторе, сразу же начинает их распространение подписчикам. Доставка данных осуществляется в несколько шагов: 1. Первое, что выполняется Distribution Agent — это установление соединения с дистрибьютором. В зависимости от выбранного метода обновления подписчика, место запуска агента может меняться. Если применяется репликация по запросу (pull replication), то агент запускается на подписчике. Когда же используется принудительная репликация (push replication), то агент запускается на дистрибьюторе.
Замечание Репликация по запросу может заметно снизить нагрузку на дистрибьютора в сети с множеством подписчиков, т. к. агент Distribution Agent в этом случае запускается на подписчике. Но при этом может возникнуть проблема со временем синхронизации серверов. Если устанавливается время подключения подписчика к дистрибьютору, то следует учесть, что информация о времени берется с подписчика. Когда же осуществляется принудительная репликация, то синхронизация происходит в соответствии с часами дистрибьютора.
Глава 14. Репликация данных
601
2. Следующий шаг — анализ базы данных распределения D i s t r i b u t i o n . Агент просматривает таблицы Msrepl_commands И Msrepl_transactions. Если В НИХ имеются строки, указывающие о поступлении новых данных, то агент выбирает информацию о подготовленных файлах моментальных снимков (ВСР или ТХТ), файлах схемы (SCH) и файлах индексов (IDX). 3. На этом этапе Distribution Agent приступает собственно к копированию данных. Сначала он подключается к подписчику и смотрит, имеются ли в базе данных назначения таблицы с нужной структурой. Если таковых нет, то агент создает их на основе информации, полученной из файла SCH. После создания таблиц начинается копирование данных из файлов моментальных снимков (ВСР или ТХТ). С помощью механизма массивного копирования (утилита bcp.exe или команда BULK INSERT) агент закачивает данные в таблицы подписчика. Если необходимо, то дополнительно создаются индексы, определенные в файле IDX. Мы перечислили основные шаги, исполняемые в процессе репликации моментальных снимков. Однако есть еще несколько вопросов, на которые нужно обратить внимание. Ни один из агентов не выполняет удаление файлов SCH, IDX, ВСР И ТХТ. Кроме ТОГО, ненужная информация В базе данных D i s t r i b u t i o n также остается. Решение этих проблем возложено на вспомогательные задачи, рассмотренные ранее в этой главе.
Репликация транзакций Более сложным типом репликации является репликация транзакций (Transactional Replication). Репликация транзакций существенно отличается от репликации моментальных снимков. В основе ее работы лежит передача информации об изменениях данных. Для этого анализируется журнал транзакций базы данных, в которой создана публикация, и выполняется поиск записей, затрагивающих публикуемые данные. Из журнала транзакций выбираются все транзакции, в ходе которых были выполнены команды изменения данных INSERT, DELETE И UPDATE. Полученная информация сохраняется в базе распределения D i s t r i b u t i o n на дистрибьюторе. При этом указывается информация о порядке выполнения транзакций. При выполнении синхронизации на подписчике применяются все транзакции, хранящиеся в базе данных D i s t r i b u t i o n . Причем в той же последовательности, в которой они происходили на издателе. Как видно, по сети передаются только данные, которые были действительно изменены. Это позволяет резко повысить производительность репликации по сравнению с репликацией моментальных снимков. Кроме того, небольшой объем передаваемых данных позволяет очень оперативно отображать на подписчиках все изменения, сделанные на издателе. Обычно репликация транзакций конфигурируется таким образом, что изменения отображаются в реальном времени или с минимальными задержками (всего несколько секунд).
602
Часть III. Администрирование
Замечание При использовании репликации транзакций исключается появление конфликтов изменений, т. к. все изменения данных выполняются на издателе, а подписчики лишь принимают цепочку изменений. Если транзакция была удачно выполнена на издателе, то можно с уверенностью ожидать успешного ее выполнения и на подписчике. Это гарантирует целостность данных.
Естественно, для оперативного отображения изменений необходимо наличие постоянного соединения между издателем, подписчиком и дистрибьютором. Тем не менее репликация транзакций может быть использована и для подписчиков, не имеющих постоянного соединения. Такие подписчики могут лишь периодически подключаться к дистрибьютору (например, раз в неделю) и обновлять свои базы. Конечно, в этом случае можно применить и репликацию моментальных снимков, однако если база данных достаточно большая, а количество изменений невелико, то репликация транзакций обеспечит более экономную эксплуатацию каналов связи. Репликация транзакций хорошо зарекомендовала себя в локальных сетях, которые обеспечивают постоянное соединение и высокую пропускную способность. В этом случае изменения могут отображаться практически мгновенно. На рис. 14.13 приведена схема работы репликации транзакций.
Distribution Agent * -' 1 i
Снимок и схема Новые транзакции История и ошибки
Рис. 14.13. Репликация транзакций
Как видно, при этом используются три следующих агента: • Snapshot Agent;
Глава 14. Репликация данных
603
П Log Reader Agent; •
Distribution Agent.
Рассмотрим роль каждого из них. Во-первых, при инициализации подписчика выполняется начальная синхронизация баз данных. Чтобы начать применение транзакций, необходимо сначала добиться полной согласованности данных на издателе и подписчике. Первоначальная синхронизация происходит по схеме работы репликации моментальных снимков. Агент Snapshot Agent подключается к издателю и создает набор файлов, используемых в стандартной репликации моментальных снимков — файлы схемы (SCH), сценарии создания индексов (IDX) и файлы моментальных снимков (ВСР или ТХТ). Затем эти файлы сохраняются на дистрибьюторе. Более подробно работа агента Snapshot Agent при выполнении этих операций рассмотрена в предыдущем разделе. После того как создание файлов первоначальной синхронизации будет закончено, начинается отслеживание изменений в статьях. Для этого на дистрибьюторе запускается агент Log Reader Agent. Этот агент и устанавливает соединение с издателем, просматривает журнал транзакций публикуемой базы данных и выбирает из него все транзакции, в которых было произведено изменение публикуемых данных. Таким образом будут найдены все команды INSERT, UPDATE И DELETE, выполненные на издателе, а также любые другие команды изменения данных.
С
Замечание
^
Каждая выбираемая транзакция может содержать множество команд, а каждая команда может иметь длину до 500 символов Unicode.
Транзакции, которые изменяли публикуемые данные на издателе, автоматически отмечаются специальным образом. Помеченные транзакции не удаляются из журнала транзакций даже при усечении журнала и остаются там до тех пор, пока не будут скопированы в базу данных распределения на дистрибьюторе. Кроме того, пометка транзакций позволяет ускорить процесс их поиска агентом Log Reader Agent.
^Замечание В SQL Server 2000 имеется набор системных хранимых процедур, с помощью которых производится управление процессом репликации. С помощью этих хранимых процедур можно выполнить любые необходимые действия. Например, для получения с издателя списка транзакций, помеченных для репликации, применяется хранимая процедура s p _ r e p l c m d s . Чтобы снять отметку с транзакции и тем самым разрешить ее удаление, применяется процедура s p _ r e p l d o n e .
Выбранные для репликации транзакции помещаются в таблицу MSrepl_transactions базы ДАННЫХ распределения D i s t r i b u t i o n . В ИТОГе В ЭТОЙ базе данных содержится цепочка изменений. С их помощью данные, полученные агентом Snapshot Agent, могут быть приведены в то же состояние, в котором они находятся на издателе. Мы подробно рассмотрели процесс получения
604
Часть III. Администрирование
данных, которые должны быть решшцированы подписчикам. Рассмотрим теперь процесс получения подписчиками накопленных изменений. Первое, что нужно сделать на подписчике, это синхронизировать его базу с базой издателя. Как уже говорилось, первоначальная синхронизация выполняется по тому же алгоритму, что и репликация моментальных снимков. Этот процесс осуществляется агентом Distribution Agent. Сначала на подписчике создаются таблицы с нужной структурой, в которые затем производится массивная закачка данных из файлов моментальных снимков. В итоге, после того как закончится первоначальная синхронизация, на подписчике будет создана стартовая точка для применения транзакций. Мы рассмотрели, как происходит автоматическая первоначальная синхронизация. Однако в случае репликации транзакций при создании публикации можно указать, что выполнение автоматической первоначальной синхронизации не нужно. В этом случае предполагается, что база данных на подписчике согласована с базой данных издателя. Тем не менее, применение транзакций начнется только после того, как SQL Server 2000 убедится, что данные действительно согласованы и структура таблиц подписчика идентична структуре статей издателя. Возможность избежать автоматической начальной синхронизации позволяет администратору выполнить первоначальную синхронизацию вручную. Это бывает полезно при выяснении соответствия баз данных большого объема. Предположим, что вы устанавливаете SQL Server 2000 в филиале компании и этот филиал расположен на другом материке. С центральным офисом филиал соединяется по медленному выделенному каналу. При этом размер базы данных превышает 100 Гбайт. Копирование такого объема информации через медленное выделенное соединение будет самоубийством. Единственный выход из ситуации — копирование центральной базы данных на жесткий диск или другой носитель информации и доставка его непосредственно в филиал. После того как ручная синхронизация будет выполнена, SQL Server 2000 начнет применение транзакций, скопированных с издателя. Замечание Ручная синхронизация связана с определенными трудностями, и поэтому ее рекомендуется выполнять только опытным пользователям. Необходимо гарантировать, что структура таблиц на подписчике и издателе, а также их содержание идентичны. Применением транзакции на подписчиках также занимается агент Distribution Agent. Место запуска этого агента к тому же зависит от выбранного метода распространения изменений. Если выполняется принудительная репликация, агент запускается на дистрибьюторе, а если репликация по запросу — на подписчике. Distribution Agent подключается к базе данных распределения дистрибьютора и анализирует содержимое таблицы MSrepi_transactions. Если он находит в таблице транзакции, еще не отображенные на подписчике, то он применяет их в том же порядке, в котором они произошли на издателе. Это гарантирует согласованность данных между издателем и всеми подписчиками. Принцип работы агента Distribution Agent при использовании репликации транзакций практически ничем не отличается от работы в случае репликации моментальных снимков.
Глава 14. Репликация данных
605
Как и для репликации моментальных снимков, в работе репликации транзакций используются несколько вспомогательных заданий, гарантирующих длительную работу дистрибьютора и базы данных распределения.
Репликация хранимых процедур Лишь иногда пользователи прибегают к непосредственному изменению данных с помощью команд INSERT, UPDATE ИЛИ DELETE. В подавляющем большинстве случаев изменение данных производится с помощью хранимых процедур, которые реализуют бизнес-логику, проверяют достоверность и целостность данных и т. д. Применение хранимых процедур позволяет централизованно управлять логикой обработки данных, обезопасить информацию от повреждения или несанкционированного доступа, а также облегчает пользователям доступ к данным. Подсистема репликации SQL Server 2000 является мощным и гибким средством распространения изменений данных между различными системами обработки и хранения информации. Но рассматриваемые ранее подходы недостаточно эффективны при выполнении большого количества однотипных изменений. Например, если пользователю необходимо поднять на 15% цену всех товаров, он может сделать это единственной командой UPDATE, воздействовав на несколько тысяч строк. Система репликации должна будет отобразить сделанные изменения на всех подписчиках. Выполнение лишь одной команды способно привести к интенсивному обмену данными. Важным усовершенствованием механизмов репликации в SQL Server 2000 по сравнению с предыдущими версиями стало появление репликации хранимых процедур (stored procedure replication). Репликация хранимых процедур позволяет подписчикам копировать не сами исправленные данные, а лишь информацию о том, как эти данные необходимо изменить. В рассмотренном ранее случае применение репликации хранимых процедур позволит избежать интенсивного обмена данными, ограничившись лишь передачей одной-единственной команды UPDATE. Каждый из подписчиков должен будет применить эту команду к хранимым на нем данным. После выполнения хранимой процедуры данные на подписчике будут находиться в том же состоянии, что и данные на издателе. Репликация хранимых процедур является своего рода надстройкой над репликацией моментальных снимков и репликацией транзакций. При создании публикации администратор может включить в нее одну или более хранимых процедур в качестве обычных статей. При выполнении репликации хранимых процедур в публикациях моментальных снимков сервер будет копировать все изменения данных, которые были произведены с помощью хранимой процедуры. Для копирования данных в этом случае используются те же алгоритмы, что и при обычной работе репликации моментальных снимков. Для таблиц, которые изменяются реплицируемой хранимой процедурой, создаются файлы моментальных снимков (ВСР или ТХТ), файлы схемы (SCH) и сценариев создания индексов (IDX), которые затем применяются на подписчиках. Хранимая процедура может быть также включена в публикацию репликации транзакций. В этом случае можно использовать все преимущества, предоставляемые
606
Часть III. Администрирование
репликацией хранимых процедур, а подписчикам копируется только информация о том, как должна быть выполнена хранимая процедура. Дублирование самих данных не выполняется. Наибольшую пользу от такого подхода можно получить в системах, характеризуемых большим количеством однотипных изменений, затрагивающих множество строк таблиц. Кроме того, репликация хранимых процедур весьма полезна при изменении множества строк по сложному алгоритму, когда для получения конечного результата необходимо выполнить множество промежуточных действий и дополнительных обработок данных. Применение репликации хранимых процедур дает резкое снижение объема сетевого трафика по сравнению с репликацией транзакций, не говоря уже о репликации моментальных снимков. В некоторых случаях можно добиться уменьшения объема передаваемых данных в несколько сотен (а иногда и тысяч) раз. Репликация хранимых процедур в SQL Server 2000 может работать в одном из двух следующих режимов: П Procedure Execution (Стандартное выполнение хранимой процедуры). В этом случае подписчик получает команду выполнить указанную хранимую процедуру с конкретным набором входных параметров. При этом контроль за качеством выполнения процедуры на подписчике не осуществляется. Это означает, что данные на подписчике могут находиться в состоянии, отличном от издателя. Например, если хранимая процедура осуществляет сложную обработку данных при помощи множества транзакций, то по каким-то причинам одна или более транзакций могут закончиться неудачно. При этом остальные транзакции будут успешно завершены, и сделанные в них изменения будут зафиксированы. В итоге данные на подписчике окажутся в промежуточном состоянии. Забота о согласованности данных в этом случае перекладывается на программиста, который должен учитывать эту особенность при разработке хранимых процедур, которые предполагается реплицировать.
Замечание Стандартный метод выполнения хранимых процедур требует внимательного отношения к устанавливаемой фильтрации. В случае вертикальной фильтрации хранимая процедура не должна обращаться к столбцам, не включенным в статью. Если задана горизонтальная фильтрация, то не следует использовать вычисления, основанные на агрегировании всех строк таблицы. Раз набор строк на издателе и подписчике будет различаться, то и полученные результаты агрегирования также будут разными.
О Serializable Procedure Execution (Последовательное выполнение хранимой процедуры). В отличие от предыдущего способа, данный метод работы репликации хранимых процедур обеспечивает согласованность данных на издателе и подписчике. Это достигается за счет того, что весь процесс выполнения хранимой процедуры разбивается на последовательность команд языка модификации данных (DML, Data Manipulation Language). Эти команды затем передаются подписчикам, где они выполняются в той же последовательности, что и на издателе. Такой способ выполнения хранимых процедур возможен только в том случае, если хранимая процедура выполняется внутри упорядоченной транзакции (serializable transaction).
Глава 14. Репликация данных
607
Замечание При выборе метода репликации хранимых процедур следует тщательно взвесить все "за" и "против". Последовательное выполнение хранимых процедур гарантирует идентичность данных на сервере и издателе. Но в этом случае количество передаваемых по сети данных значительно выше, чем при стандартном выполнении хранимых процедур. Зато стандартный метод требует предельного внимания и осторожности, т. к. легко нарушить согласованность данных между подписчиком и издателем. Но наградой является чрезвычайно низкий сетевой трафик и возможность реализации произвольной логики обработки данных. Нетрудно прийти к мысли, что перед тем как станет возможным выполнение реплицируемой хранимой процедуры на подписчике, необходимо ее там создать. Процедура создания хранимой процедуры на подписчике происходит автоматически при первоначальной синхронизации. Агент Snapshot Agent создает специальный скрипт, с помощью которого на подписчике будет создана реплицируемая хранимая процедура. В итоге издатель и все подписчики станут обладателями идентичных хранимых процедур. Тем не менее, система репликации SQL Server 2000 позволяет создавать хранимые процедуры на подписчике и вручную. Это бывает полезно, если необходимо использовать на подписчике логику обработки данных, отличную от логики, применяемой на издателе. Рассмотрим это на примере следующей ситуации. Из центрального офиса реплицируется хранимая процедура correct_price, которая корректирует цену товаров в филиалах в зависимости от курса валюты, спроса, предложения и некоторых других факторов. Эта процедура воздействует на таблицу goods. Кроме того, процедура c o r r e c t p r i c e удаляет из таблицы p r i c e i i s t товары, которых нет на складе. Структуры данных в части филиалов соответствуют структуре данных в центральном офисе, но в некоторых филиалах имеется еще несколько таблиц, данные в которых зависят от цен товаров, ХраНЯЩИХСЯ В Таблице goods. Кроме ТОГО, СТРОКИ ТабЛИЦЫ p r i c e i i s t ЯВЛЯЮТСЯ внешними ключами других таблиц. Наиболее простым вариантом было бы написание дополнительных триггеров и хранимых процедур, которые бы выполняли дополнительную обработку данных. Но все эти операции могут быть реализованы в теле хранимой процедуры c o r r e c t p r i c e .
(
Замечание
J
При создании реплицируемых хранимых процедур не рекомендуется, чтобы процедура обращалась к внешним структурам данных, не включенных в репликацию. Если вы не уверены в качестве процедуры, то лучше прибегнуть к последовательному выполнению. Тем не менее, если пользователь четко представляет структуру данных, их взаимосвязь и имеет достаточные квалификацию и опыт, лучшим вариантом все же будет репликация с помощью стандартного запуска хранимых процедур. Как уже понятно, SQL Server 2000 не проверяет идентичность хранимых процедур на издателе и подписчике. При репликации подписчик получает только имя хранимой процедуры и параметры ее запуска. Поэтому процедуры на издателе и подписчике могут отличаться и выполнять абсолютно разные действия. Когда
608
Часть III. Администрирование
на издателе работает хранимая процедура, включенная в публикацию, то выполняемые в ней транзакции не помечаются для репликации. Это позволяет избежать копирования данных, которые должны быть изменены с помощью хранимой процедуры, и добиться целостности данных. Замечание При выполнении хранимой процедуры, не включенной в публикацию, все входящие в нее транзакции помечаются для репликации (только если процедура изменяет данные в таблицах, включенных в публикацию). Проделанные изменения затем реплицируются обычными средствами.
Репликация сведением В одном из следующих разделов будет рассмотрена одна из технологий репликации, позволяющих изменять данные на подписчиках, — подписчики незамедлительного обновления (Immediate Updating Subscribers). Эта технология позволяет издателю быстро отображать изменения, сделанные на одном подписчике, всем другим подписчикам. Однако недостатком этой технологии является необходимость наличия постоянного соединения между подписчиком и издателем. Если связь между ними рвется, то внести изменения на подписчике нельзя. Другим недостатком является невозможность изменения данных, исправленных другим подписчиком, до тех пор, пока изменения не будут переданы на локальный сервер. Для решения указанных проблем в SQL Server 7.0 был создан новый тип репликации — репликация сведением (merge replication), которая позволяет подписчикам вносить изменения в данные без необходимости постоянного соединения с издателем. Каждый из подписчиков работает автономно и изменяет данные, как хочет. Изменения данных могут накапливаться, а не копироваться сразу же. Множество подписчиков способны беспрепятственно изменять одновременно одни и те же данные, что невозможно при использовании подписчиков незамедлительного обновления. Специальный агент отслеживает изменения, сделанные на каждом из подписчиков и при соединении с дистрибьютором объединяет эти изменения с исправлениями, внесенными на издателе и на других подписчиках. Затем агент копирует подписчику изменения, выполненные другими участниками репликации. Рассмотрим, как же SQL Server 2000 реализует все эти возможности. На рис. 14.14 приведена схема работы репликации сведением. При репликации сведением в SQL Server 2000 работают два агента: •
Snapshot Agent — выполняет подготовку файлов моментальных снимков и других файлов, необходимых для первоначальной синхронизации подписчиков с издателем.
П Merge Agent — объединяет изменения, сделанные на всех участниках репликации, в единую структуру, а также распространяет выполненные изменения подписчикам и издателю.
Глава 14. Репликация данных
609
Публикуемая база данных Таблица конфликтов
Snapshot Agent 4 Snapshot folder
„. Merge Agent /R\ •<-* 4 База данных распределения
i > J Л.ЮК и схема • ••»•• г. 1.ые транзакции •""•^^ История и ошибки
Рис. 14.14. Репликация сведением
Репликация сведением является самым сложным типом репликации SQL Server 2000. Трудность состоит в отслеживании автономных изменений, сделанных каждым участником репликации, и их объединение в единую копию. Модификация данных выполняется автономно, поэтому не избежать конфликтов изменения. Конфликты изменения происходят, когда два или более участников репликации исправляют у себя одни и те же данные. Механизмы репликации должны решить, какое из изменений должно быть оставлено, а какие — потеряны. Для решения описанных задач при создании публикации репликации сведением в структуре таблиц выполняют несколько важных трансформаций: •
SQL Server 2000 должен иметь возможность уникально идентифицировать каждую строку таблицы, чтобы сопоставлять изменения, сделанные на каждом участнике репликации. Идентификатор не должен изменяться с течением времени, поэтому в качестве него применяются глобальные уникальные идентификаторы (GUID, Global Unique Identifier). Значения GU1D хранятся в колонках специального типа данных — uniqueidentif ier, который разработан для хранения глобальных идентификаторов и больше никак не используется. Вероятность генерирования двух одинаковых значений GUID практически равна нулю. Применяемые алгоритмы гарантируют полную уникальность значений (даже в пределах планеты). При создании публикации репликации сведением SQL Server 2000 ищет в таблице, включенной в публикацию, колонку с типом данных uniqueidentif i e r и установленным свойством ROWGUIDCOL. Если такая колонка уже существует, то она будет использована автоматически. В противном случае будет создана колонка с именем ROWGUID., удовлетворяющая всем указанным требованиям. Кроме того, эта колонка автоматически индексируется для ускорения операций поиска.
610
Часть III. Администрирование
Замечание Идентификация строк в репликации сведением по колонке t i m e s t a m p недопустима, т. к. для этой колонки при каждом изменении строки будет генерироваться новое значение. Тогда как значения в колонке u n i q u e i d e n t i f i e r генерируются при создании строки и не меняются с течением времени.
П Каждый из участников репликации должен самостоятельно отслеживать изменения, которые вносятся им в реплицированные данные. Для этого в каждой таблице, включенной в репликацию, создаются специальные триггеры (triggers), которые автоматически вызываются при каждом выполнении команд INSERT, UPDATE, DELETE и сохраняют все выполняемые изменения в специальных таблицах. Триггеры могут отслеживать изменения как на уровне всей строки, так и на уровне отдельной колонки.
Замечание Самая важная часть репликации сведением — отслеживание изменений — стала возможной благодаря тому, что SQL Server 2000 поддерживает одновременно множество триггеров каждого типа. В предыдущих версиях SQL Server был реализован единственный триггер на каждую операцию (вставки, изменения или удаления). Триггеры репликации SQL Server 2000 успешно работают вместе с пользовательскими триггерами. •
Изменения данных, отслеживаемые триггерами репликации, должны быть где-то сохранены. Для этого в базе данных, сконфигурированной для репликации, создается набор специальных системных таблиц, в которые сохраняется вся информация о работе репликации сведением. Замечание
}
Например, таблицы M s m e r g e _ c o n t e n t s и Msmerge__ t o m b s t o n e содержат информацию обо всех выполненных в реплицируемых таблицах командах I N S E R T , UPDATE и D E L E T E . Каждая вспомогательная системная таблица имеет колонку ROWGUID, с помощью которой осуществляется связывание пользовательских данных со вспомогательной информацией.
После внесения всех необходимых изменений в БД можно приступать к репликации данных. Как и репликация транзакций, репликация сведением требует выполнения первоначальной синхронизации данных на издателе и подписчиках. Шаги, выполняемые при первоначальной синхронизации репликации сведением, ничем не отличаются от аналогичных шагов в случае репликации транзакций. Основной этап — подготовка файлов моментальных снимков (ВСР или ТХТ), файлов схемы (SCH) и скриптов (IDX) — выполняется агентом Snapshot Agent, который запускается на дистрибьюторе и подключается к издателю.
Замечание Более детально процесс первоначальной синхронизации был рассмотрен при описании репликации транзакций ранее в этой главе.
Глава 14. Репликация данных
611
При первом подключении подписчика к дистрибьютору агент Merge Agent применяет подготовленные файлы и выполняет первоначальную синхронизацию. Сразу после этого агент может применить на подписчике изменения, сделанные на издателе или других подписчиках. (
Замечание
^
Агент Merge Agent запускается на дистрибьюторе, если используется принудительная репликация (push replication), и на подписчике, если сконфигурирована репликация по запросу (pull replication). Первоначальная синхронизация также может быть выполнена вручную. Для этого следует создать резервную копию базы данных на издателе, затем эту копию доставить подписчику и там ее восстановить. Такой подход часто применяют при работе с большими базами данных, синхронизация которых по каналам связи займет очень много времени. Скопировав данные и записав их на диск CD-ROM или DVD и отправив его курьерской почтой, можно сэкономить и время, и деньги. Замечание Выполняя первоначальную синхронизацию вручную, администратор должен позаботиться, чтобы в каждой реплицируемой таблице имелась колонка u n i q u e i d e n t i f i e r с у с т а н о в л е н н ы м с в о й с т в о м R O W G U I D C O L . Кроме того, н е о б х о д и м о о б е с п е ч и т ь
наличие всех необходимых триггеров и системных таблиц. Лучше всего создание резервной копии данных выполнять сразу же после того, как будет создана репликация сведением. В этом случае можно гарантировать, что в базе данных будут иметься системные таблицы, а структура пользовательских таблиц окажется соответствующим образом измененной. Но администратор все же должен будет вручную перенести триггеры. После успешного завершения первоначальной синхронизации подписчики могут отключиться от дистрибьютора и начать изменение данных. Триггеры будут автоматически сохранять информацию о внесенных исправлениях в таблицы поддержки репликации на каждом из подписчиков и издателе. Данные об изменениях ВО Всех реПЛИЦИруеМЫХ Таблицах ХраНЯТСЯ В Таблице Msmerge__contents. Для связи с самими данными предназначен столбец ROWGUID, В котором хранится уникальный идентификатор исходной строки. Таблица, к которой принадлежит строка, идентифицируется по колонке TABLENICK. В колонке GENERATION указывается номер сеанса, в котором было произведено изменение. Таким образом, в таблице Msmerge_contents хранится информация обо всех изменениях в реплицируемых таблицах, сделанных пользователями. Любая модифицированная в базе данных строка отображается в единственную строку таблицы Msmerge_contents. При многократном изменении одной и той же строки в таблице Msmergecontents сохраняется только последнее значение. Изменения, производимые пользователями в таблицах, не будут отображены на других участников репликации до тех пор, пока не будет выполнено сведение
612
Часть III. Администрирование
(merge) данных. Выполняя сведение, Merge Agent подключается к дистрибьютору и сохраняет в базе данных распределения D i s t r i b u t i o n информацию об изменениях на локальном сервере. Новая информация сливается с информацией об изменениях, полученной от других участников репликации. Если не возникают конфликты изменений (любая строка данных изменялась только на одном участнике репликации), то Merge Agent забирает информацию об изменениях, проделанных на других участниках репликации, и применяет их на локальном сервере. На этом процесс сведения заканчивается. Но часто одни и те же данные бывают модифицированы на нескольких серверах. В этом случае агент Merge Agent должен разрешить конфликт сведения и определить, изменения какого сервера должны "победить"и будут применены на всех участниках репликации. Для решения этой задачи применяются специальные алгоритмы, в основе которых лежит шкала приоритетов. Для каждого сервера устанавливается определенный приоритет по 100-балльной шкале. Чем выше приоритет сервера, тем больше вероятность, что его изменения победят. Наибольший приоритет имеет издатель. Замечание Помимо шкалы приоритетов, при разрешении конфликтов сведения предназначен номер сеанса (колонка GENERATION) И счетчик изменений в строке (колонки L I N E A G E и C O L V I ) . Н о м е р сеанса у в е л и ч и в а е т с я п р и к а ж д о м с в е д е н и и д а н н ы х .
По окончании сведения на дистрибьюторе для каждой строки будет установлено единственное значение, которое должно быть скопировано всем участникам репликации. Если при разрешении конфликта изменений локальный сервер "проиграл", то агент Merge Agent сразу же в текущем сеансе обновит данные на нем. Кроме того, будут применены и изменения, сделанные на других участниках репликации и уже отображенные в базе данных дистрибьютора. Замечание Система репликации SQL Server 2000 построена таким образом, что пользователи могут определять свои собственные правила разрешения конфликтов, отличные от стандартных. Это можно сделать при помощи либо специальных хранимых процедур, либо интерфейса СОМ. Рассмотренный механизм разрешения конфликтов был единственным, предлагаемым пользователям в SQL Server 7.0. В SQL Server 2000 также активно используется описанный механизм разрешения конфликтов — он предлагается по умолчанию. Однако помимо этого стандартного механизма в распоряжении пользователей также имеется набор дополнительных механизмов, которые расширяют возможности расширения конфликтов обновления. Можно сказать, что это пользовательские механизмы разрешения конфликтов, разработанные программистами Microsoft и поставляемыми в составе SQL Server 2000. Перечислим эти механизмы:
Глава 14. Репликация данных
613
• Microsoft SQL Server Additive Conflict Resolver используется для столбов с числовыми типами данных. При обнаружении конфликта суммируются значения, предлагаемые подписчиком, и представленные на дистрибьюторе; • Microsoft SQL Server Averaging Conflict Resolver также применяется для числовых типов данных. Результатом разрешения конфликта будет вычисление среднего арифметического для измененных данных; • Microsoft SQL Server DATETIME (Earlier Wins) Conflict Resolver предназначен ДЛЯ ТИПОВ данных О дате И Времени (datetime И smalldatetime). Победителем будет признано изменение, имеющее более ранее значение даты; • Microsoft SQL Server DATETIME (Later Wins) Conflict Resolver используется для типов данных о дате и времени (datetime и smalldatetime). Победите лем будет признано изменение, имеющее более позднее значение даты; • Microsoft SQL Server Maximum Conflict Resolver применяется для числовых типов данных. Победителем считается изменение, имеющее максимальное значение; • Microsoft SQL Server Merge Text Conflict Resolver используется для символьных типов данных. Конфликт разрешается путем склеивания значений, предлагаемых обоими участниками конфликта; • Microsoft SQL Server Minimum Conflict Resolver служит для числовых типов данных. Победителем считается изменение, имеющее минимальное значение; • Microsoft SQL Server Subscriber Always Wins Conflict Resolver — при использовании этого механизма всегда будет оставляться изменение, предлагаемое подписчиком. Изменения, выполненные издателем или ранее другими подписчиками и отраженные на дистрибьюторе, будут потеряны. Как видно, основная часть дополнительных механизмов разрешения конфликтов работает лишь со столбцами определенных типов данных. При этом встает естественный вопрос о том, как же станет разрешаться конфликт изменения других столбцов. Ответ прост. Для разрешения конфликтов изменения других строк будет использоваться стандартный механизм, основанный на приоритете участников репликации. Замечание Необходимо отметить, что при создании публикации можно будет выбрать либо стандартный механизм разрешения конфликтов, либо один из вспомогательных. Нельзя сконфигурировать два или более механизмов, которые бы работали с разными типами данных. Как и в случае с репликацией транзакций и репликацией моментальных снимков, для репликации сведением разработаны специальные задачи, которые освобождают ресурсы серверов от ненужных данных: G Subscription cleanup at the Publisher; •
History cleanup at the Distributor.
614
Часть III. Администрирование
Обновление подписчиков До SQL Server 7.0 репликация допускала изменение данных только со стороны издателя. Подписчики могли только принять изменения, выполненные на издателе. Эта ситуация в полной мере соответствует реальным издателю и подписчику. То есть издатель выпускает какую-то книгу, журнал и т. д., а подписчик может только читать ее или перепечатать заново (стать издателем и опубликовать реплицированные данные). Однако пользователей не долго устраивала такая ситуация. Очень скоро они выдвинули новое требование — разрешить выполнять изменения опубликованных данных и со стороны подписчика. Эта заявка была удовлетворена в SQL Server 7.0. В этой версии SQL Server появились две технологии, разрешающие изменение данных со стороны подписчиков: •
репликация сведением (Merge Replication);
П подписчики незамедлительного обновления (Immediately-Updating Subscribers). Возможность изменения данных заставляет по-другому взглянуть на отношения издателя и подписчика. Сравнивать их с реальными издателем и подписчиком в этом случае не приходится. Скорее, можно сопоставить их со множеством редакторов, вносящих поправки в одни и те же данные. В предыдущем разделе была рассмотрена репликация сведением, которая позволяет подписчикам изменять данные, реплицированные с издателя. Неоспоримым достоинством этой технологии является возможность выполнения модификаций подписчиками и в том случае, когда между подписчиком и издателем отсутствует постоянное соединение. Строго говоря, репликация сведением как раз и разрабатывалась в расчете на то, что подписчик и издатель (точнее дистрибьютор) будут соединяться лишь изредка и обмениваться изменениями, выполненными с момента последней синхронизации. Однако обратной стороной медали является наличие конфликтов изменения, возникающих при подобном подходе к внесению исправлений. Механизм, реализующий разрешение конфликтов, является достаточно тяжелым и требует довольно много системных ресурсов. При этом становится невозможным использование преимуществ репликации моментальных снимков или репликации транзакций. В некоторых же случаях более рациональным с точки зрения нагрузки на каналы связи является использование репликации моментальных снимков или репликации транзакций. Помимо репликации сведением в SQL Server 7.0 была также введена и технология незамедлительного обновления подписчиков, которая также позволяет выполнять изменения публикуемых данных со стороны подписчика, однако использует принципиально иной подход к выполнению этих изменений. Необходимо отметить, что последняя технология не является самостоятельным типом репликации, а является своего рода надстройкой над репликацией моментальных снимков и репликацией транзакций. То есть во время применения подписчиков незамедлительного обновления пользователи могут использовать все преимущества, предоставляемые этими типами репликации. Подробно технология подписчиков незамедлительного обновления будет рассмотрена в следующем разделе. Сейчас же скажем, что изменение выполняется не только на подписчи-
Глава 14. Репликация данных
615
ке, но и одновременно на издателе. Работа с этой технологией позволяет полностью избежать возникновения конфликтов изменения данных, однако требует постоянного соединения между подписчиком и издателем. Если соединение отсутствует, то выполнить изменение не удастся. Необходимость постоянного соединения между подписчиком и издателем порой является серьезным недостатком, препятствующим использованию подписчиков незамедлительного обновления. Если все же необходимо обеспечить возможность изменения публикуемых данных на подписчике, то придется отказаться от репликации моментальных снимков (или репликации транзакций) и запускать репликацию сведением. При работе с SQL Server 2000 пользователи могут избежать подобных неприятных решений. В SQL Server 2000 имеется возможность выполнения изменений со стороны подписчика при работе с репликацией транзакций или моментальных снимков и при отсутствии постоянного соединения. Эта возможность реализуется технологией отложенного обновления (Queue Updating), при работе с которой не предпринимается попытки отобразить осуществляемые подписчиком изменения на издателе. Взамен информация о выполненных изменениях накапливается в так называемой очереди (queue). При этом не требуется наличия постоянного соединения, т. к. очередь представляет своего рода буфер, в который последовательно заносятся выполненные изменения. При установлении соединения данные отправляются на дистрибьютор, где они и обрабатываются. Как и при работе с репликацией сведением, отложенная обработка изменений неизбежно приводит к возникновению конфликтов изменений. Однако при их разрешении в технологии отложенного обновления существуют иные подходы, чем в репликации сведением. До сих пор мы рассматривали технологии подписчиков незамедлительного обновления и отложенного обновления по отдельности. Однако они могут применяться и вместе, что позволяет добиться более высокой функциональности. При одновременном использовании обеих технологий приоритет при изменении данных отдается технологии подписчиков незамедлительного обновления. Однако, если выполнить изменение с помощью этой технологии не удается вследствие отсутствия соединения с издателем, то на помощь приходит вторая указанная технология, с помощью которой и выполняется изменение.
Замечание Изменения, вносимые с помощью технологии подписчиков незамедлительного обновления, отражаются и на работе технологии отложенного обновления. Это реализуется путем автоматического изменения на издателе значений в столбце R O W G U I D C O L . П о д р о б н о роль этого с т о л б ц а в т е х н о л о г и и о т л о ж е н н о г о о б н о в л е н и я
будет рассмотрена в разд. "Отложенное обновление" далее в этой главе.
Безотлагательное обновление В рассмотренной в одном из предыдущих разделов этой главы схеме репликации моментальных снимков не предусмотрена возможность отображения изменений, сделанных на подписчиках, другим участникам репликации. Как и в
616
Часть III. Администрирование
случае с репликацией моментальных снимков, простейшая схема репликации транзакций допускает внесение изменений только на издателе. Даже если на одном из подписчиков и выполнено изменение, оно будет доступно лишь локально, причем оно будет потеряно, как только выполнится очередная синхронизация подписчика с издателем. Если нужно донести изменения до всех участников репликации, то изменение данных необходимо выполнять на издателе. Но это не всегда возможно. Разрешить внесение изменений и на подписчиках можно, если при создании публикации разрешить поддержку подписчиков незамедлительного обновления (immediate updating subscribers). Как уже было сказано, эта технология появилась в SQL Server 7.0 и значительно расширила возможности репликации моментальных снимков, позволив вносить изменения не только на издателе, но и на подписчиках.
Замечание Поддержка подписчиков незамедлительного обновления устанавливается во время создания публикации. После того как публикация создана, нельзя разрешить или удалить поддержку подписчиков незамедлительного обновления. Рассмотрим, как реализована возможность изменения данных на подписчике.
(
ЗаТлечание
^)
Поддержка подписчиков незамедлительного обновления действует только для серверов SQL Server 2000 и SQL Server 7.0. Фундаментом работы технологии безотлагательного обновления является двухфазный протокол подтверждения изменений (2PC, two-phase commit protocol), гарантирующий согласованность данных, изменяемых в теле одной транзакции на разных серверах. Протокол 2PC используется координатором распределенных транзакций (MSDTC, Microsoft Distributed Transactional Coordinator) для фиксирования распределенных транзакций (distributed transactions). Смысл технологии безотлагательного обновления состоит в том, что при изменении данных на подписчике одновременно должно быть выполнено изменение соответствующих данных на издателе. Если посмотреть с другой стороны, то, как и в стандартной схеме репликации моментальных снимков, изменение сначала осуществляется на издателе, а затем тиражируется подписчикам. Только подписчик, модифицирующий данные, получит обновленную информацию сразу же. Остальные подписчики получат измененные данные при следующей синхронизации. Когда пользователь пытается изменить данные на подписчике, то SQL Server 2000 автоматически начинает выполнение распределенной транзакции. В теле этой транзакции сервер пытается изменить данные как на подписчике, так и на издателе. Сначала выполняется сравнение соответствующих строк, и при их совпадении начинается изменение данных. В противном случае выполнение изменений прерывается. Такой подход позволяет избежать многократного исправления разными подписчиками одних и тех же данных. Если подписчик не
617
Глава 14. Репликация данных
получил обновленные данные и пытается изменить их, то это ему не удастся, т. к. изменяемые строки у него и издателя будут различаться. Если данные на издателе не могут быть изменены, то транзакция откатывается, и изменения на подписчике не выполняются. Если же изменение данных как на издателе, так и на подписчике прошло успешно, то транзакция фиксируется. Данные с издателя затем будут реплицированы всем другим подписчикам. Подписчик, инициировавший изменение данных, может сразу же работать с новой информацией, не дожидаясь следующей синхронизации. Целостность данных при этом гарантируется автоматически. Рассмотрим детально принципы функционирования технологии незамедлительного обновления. На рис. 14.15 приведена схема обмена данными между издателем, дистрибьютором и подписчиками незамедлительного обновления.
Снимок и схема Новые транзакции История и ошибки
Рис. 14.15. Подписчики незамедлительного обновления в репликации транзакций
При создании публикации с поддержкой подписчиков незамедлительного обновления в таблицах, для которых созданы статьи, SQL Server 2000 автоматически вносит некоторые изменения. В таблицу добавляется колонка с типом данных timestamp. Каждый раз, когда пользователи изменяют данные в таблице с этой колонкой, сервер автоматически генерирует для нее новое значение. Колонка timestamp включается в статью и тем самым создается и на подписчике.
618
Часть III. Администрирование
(
Замечание
J
Дословно timestamp переводится как "временной штамп". Но в действительности значения, хранимые в колонке timestamp, никакого отношения к времени не имеют. Значения в этой колонке монотонно возрастают и уникальны в пределах базы данных. То есть в одной базе данных нет двух одинаковых значений timestamp, т. е. гарантировано, что вставляемое значение ранее не использовалось. Кроме того, на подписчике в регашиированных таблицах создаются специальные триггеры (triggers), которые перехватывают все попытки пользователя изменить данные в публикуемых таблицах, отслеживая выполнение команд INSERT, UPDATE и DELETE. Всякий раз, когда пользователь пытается изменить данные в таблице, триггер перехватывает эту попытку и начинает распределенную транзакцию. Вся обработка распределенной транзакции делается прозрачно для триггера координатором распределенных транзакций (MSDTC), который применяет в своей работе протокол 2PC.
Замечание Если в теле одной транзакции необходимо выполнить изменение множества строк, то такая попытка будет успешна только, если соответствующие строки издателя и подписчика полностью совпадают. При несовпадении даже одной строки вся транзакция откатывается. В этом случае одну большую транзакцию можно разбить на множество маленьких. Начав выполнение распределенной транзакции, триггер пытается изменить данные и на издателе, и на подписчике. Для отслеживания изменений триггер ищет на издателе строку, которая имеет в колонке timestamp то же значение, что и в изменяемой строке на подписчике. Если такая строка не найдена, значит на издателе в исходную строку были внесены изменения и для колонки timestamp этой строки сгенерировано новое значение. В этом случае триггер откатывает распределенную транзакцию, и попытка изменения данных на подписчике заканчивается неудачей. Такой подход позволяет избежать возможных нарушений целостности данных. Если на издателе имеется строка с нужным значением timestamp, то триггер пытается выполнить изменение данных на издателе. Исправление, допустимое на подписчике, может не пройти на издателе. Причина этого, возможно, заключена в том, что другой подписчик ранее выполнил некоторые изменения на издателе и эти изменения несовместимы с изменениями, которые пытается сделать триггер. При внесении изменений на издателе осуществляется проверка соответствия новых данных всем установленным ограничениям целостности (constraints) и правилам (rules). Если вносимые триггером изменения недопустимы, то попытка изменения откатывается. Если же изменения на издателе прошли успешно, то триггер выполняет изменение данных и на подписчике. Это предпоследняя стадия технологии незамедлительного обновления. При этом для колонки timestamp модифицируемой строки на издателе генерируется новое значение. То же значение устанавливается и на подписчике.
Глава 14. Репликация данных
619
Замечание Этот момент очень важен. На подписчике в строке для колонки timestamp не генерируется новое значение, а копируется с издателя. Это гарантирует, что данный подписчик будет иметь возможность в будущем снова внести изменения в строку, не дожидаясь очередной синхронизации. На последнем этапе происходит фиксирование распределенной транзакции, в теле которой выполнялось изменение данных. На низком уровне распределенная транзакция представляет набор обычных транзакций, исполняемых в отдельной базе данных. Управление локальными транзакциями и их согласование возлагаются на координатора распределенных транзакций (MSDTC), который и инициирует локальные транзакции. Наиболее важная часть функционирования распределенных транзакций заключается в фиксировании локальных транзакций. Этот этап является и самым слабым местом. Предположим, координатор распределенных транзакций отправил команды завершить все локальные транзакции, и буквально сразу после этого происходит сбой. В итоге одна часть локальных транзакций будет зафиксирована, а другая — нет. Итог может быть печален. Для решения описанной проблемы используется специальный двухфазный протокол подтверждения изменений (2РС). Этот протокол гарантирует, что либо все локальные транзакции будут зафиксированы, либо для всех будет выполнен откат. После того как изменения будут успешно внесены, агент Log Reader Agent обнаружит их и скопирует в базу данных распределения D i s t r i b u t i o n , откуда они доставятся всем подписчикам. При этом считается, что подписчик, инициировавший изменения, уже синхронизирован, и повторное копирование данных к нему не выполняется. Спустя непродолжительное время все участники репликации будут иметь одинаковые данные.
Если изменение на подписчике выполняется не специально, а лишь как часть распределенной транзакции, в теле которой есть команды изменения таблиц в различных базах данных, то информация о выполненных распределенных транзакциях может быть потеряна. Репликация транзакций в таком случае потерпит неудачу.
Требования безотлагательного обновления Хотя SQL Server 2000 и скрывает от пользователя механизмы, с помощью которых становится возможным изменение данных на подписчиках, тем не менее необходимо следовать некоторым правилам: • Для каждой таблицы, включенной в публикацию с поддержкой подписчиков незамедлительного обновления, необходимо создать колонку timestamp. Обычно эта колонка создается автоматически при создании публикации, но она может быть создана и вручную. Кроме того, если в статью входит только часть таблицы (используется вертикальная фильтрация), то следует убедиться, что колонка timestamp также включена в статью.
620
Часть III. Администрирование
П При вставке строк в публикуемую таблицу с помощью команды INSERT необходимо явно указать список колонок. Это поможет выполнить распределенную транзакцию как на издателе, так и на подписчике. Особенно важно это в случае вертикальной фильтрации, т. к. количество колонок на издателе и подписчике не совпадает. •
SQL Server 2000 не запрещает размещение одной и той же таблицы в нескольких публикациях с поддержкой подписчиков незамедлительного обновления. Тем не менее, SQL Server 2000 позволяет в каждой таблице создавать только одну колонку times tamp. Механизмы технологии незамедлительного обновления не смогут отличить, из какой публикации было сделано изменение данных. Поэтому в данном случае создание подписчиков незамедлительного обновления невозможно.
П Для предыдущего пункта существует исключение. Создание подписчика незамедлительного обновления возможно в том случае, если на основе одной таблицы было создано несколько статей, включенных в разные публикации с поддержкой подписчиков незамедлительного обновления, и необходимо подписаться на все публикации с отображением их в одну базу данных подписчика. •
Пользователи не должны никаким образом изменять значения в колонках time stamp. Кроме того, не допускается изменение колонок IDENTITY. ЭТИ колонки обновляются автоматически сервером. Также подписчики не могут модифицировать данные в колонках с типом данных t e x t и image, поскольку изменение этих колонок невозможно из триггера.
Следование перечисленным требованиям поможет избежать проблем при использовании репликации с поддержкой подписчиков незамедлительного обновления.
Отложенное обновление Как уже было сказано, в SQL Server 2000 имеется две технологии, позволяющие выполнять обновление данных на подписчиках при работе с репликацией моментальных снимков и репликацией транзакций. Одна их этих технологий — подписчики незамедлительного обновления, была рассмотрена в двух предыдущих разделах. Напомним, что данная технология допускает выполнение изменений только в том случае, когда между подписчиком и издателем имеется соединение. Если же подписчик пытается изменить данные, которые уже были изменены другим подписчиком, то эта попытка ему не удастся. Требование постоянного соединения между издателем и подписчиком является существенным недостатком. Довольно часто постоянного соединения между подписчиком и издателем не существует. Поэтому приходится отказываться от применения технологии подписчиков незамедлительного обновления и работать с репликацией сведением взамен использования репликации транзакций или репликации моментальных снимков. Однако такая ситуация существовала в SQL Server 7.0. При работе с SQL Server 2000 в распоряжении пользователей
621
Глава 14. Репликация данных
имеется технология отложенного обновления (Queue Updating), которая, как и технология подписчиков незамедлительного обновления, работает совместно с репликацией моментальных снимков или репликацией транзакций. На рис. 14.16 приведена архитектура технологии отложенного обновления. Приложение клиента
Приложение клиента
Публикуемая база данных Таблица
Журнал транзакций
База данных подписчика Очередь SQL Server Таблица
Новые транзакции - . - - -^. И формация журнала и ошибки "•""
'"
'
чи
""Р*''
Команды отмены изменений и дополнительные изменения
Рис. 14.16. Архитектура технологии отложенного обновления
Уже по названию технологии можно отметить главную ее особенность — возможность применять выполненные на подписчике обновления не сразу же, а с некоторой задержкой. Причем эта задержка может длиться довольно долго. Конечно, в идеальной ситуации выполненные изменения сразу же отображаются на издателе. Однако технология разработана с расчетом на отсутствие постоянного соединения, но с требованием, что соединение между подписчиком и издателем все же периодически устанавливается, пусть даже с большим интервалом. Подписчик же всегда имеет возможность выполнить изменения опубликованных данных, даже если соединение с издателем и отсутствует. Информация о выполненных изменениях записывается в так называемую очередь (queue). Оче-
622
Часть III. Администрирование
редь представляет собой буфер, который накапливает информацию о всех выполненных на подписчике изменениях. Однако забота об обработке этих изменений ложится уже на дистрибьютора. То есть подписчик считает изменение выполненным, как только данные о нем будут сохранены в очереди. Если по каким-то причинам информация о выполненных изменениях не может быть помещена в очередь, то эти изменения не будут зафиксированы. Помещение информации в очередь считается частью транзакции и если эта часть не будет выполнена, то будет осуществлен откат всей транзакции, включая и собственно изменение данных. Интересным моментом в технологии отложенного обновления является собственно очередь. Этот механизм позволяет не заботиться о доставке данных на нужный компьютер. Достаточно сохранить информацию в очередь и специальные механизмы позаботятся о доставке данных. В обычной ситуации пользователь должен сам контролировать доставку данных на нужный компьютер. Конечно, когда имеется постоянное соединение, то проблем не возникает. Однако, в случае отсутствия постоянного соединения можно довольно долго ожидать его установления. То есть нужно будет постоянно проверять наличие соединения и пытаться сохранить данные. Если говорить о пользовательском приложении, то для них в большинстве случаев подобный подход неприменим. Однако, проблема с доставкой данных не пропадает. Специально для ее решения, а также для стандартизации механизмов обмена данных между удаленными компьютерами, были реализованы очереди.
Замечание В общем случае каждая очередь характеризуется своим собственным именем, по которому и выполняется работа с ней. Однако подсистема репликации создает соответствующую очередь автоматически и не требует явного указания ее свойств, в том числе и имени. Все сказанное выше относится в основном к очередям, реализуемым специализированными продуктами. Однако SQL Server 2000 может использовать и очереди, организованные собственными методами. Рассмотрим же подробно, какие типы очередей существуют для отложенного обновления и каковы особенности этих очередей: • Microsoft Message Queue. Тип очередей реализуется специальным программным обеспечением, т. е. очереди этого типа являются настоящими очередями, которые могут быть использованы для доставки самых разнообразных данных — значений переменных, текстовые сообщения, файлы, а также любые другие данные, в том числе и данные о выполненных на подписчике изменениях. Чтобы иметь возможность использовать для отложенного обновления очереди рассматриваемого типа, необходимо предварительно установить либо Microsoft SQL Server 2000 queue, либо Microsoft Message Queuing версии 2.О. Это является серьезным недостатком, т. к. инсталляция дополнительного программного обеспечения привлечет к увеличению нагрузки на все серверы SQL Server 2000, участвующие в репликации и использующие технологию отложенного обновления. Однако необходимо отметить и оче-
Глава 14. Репликация данных
623
видное достоинство — очередь является независимой от SQL Server. To есть после выполнения изменений опубликованных данных на подписчике можно вообще остановить SQL Server 2000, и это не воспрепятствует распространению изменений на других участников репликации. При использовании очередей типа Microsoft Message Queue подписчик сохраняет информацию о выполненных модификациях в очередь и механизмы Message Queue доставляют информацию на дистрибьютор, где они помещаются в соответствующую очередь, откуда затем и считываются агентом Queue Reader Agent. • SQL Server. Этот тип очередей представляет собой всего-навсего обычную таблицу SQL Server 2000 с именем MSRepiicationqueue, которая создается автоматически при инициализации технологии отложенного обновления. Несомненным преимуществом очередей данного типа является отсутствие необходимости установки дополнительного программного обеспечения, т. е. очередь этого типа может быть реализована под управлением любой операционной системы, на которую разрешена установка SQL Server 2000 — Windows 98/NT/2Q00. Считывание данных из созданных на подписчиках таблиц MSRepiicationqueue осуществляется агентом Queue Reader Agent, который запускается на дистрибьюторе. Для считывания данных предназначена недокументированная системная хранимая процедура spsqiqmon. Таким образом, основная часть нагрузки по считыванию данных о выполненных на подписчиках изменениях ложится на дистрибьютора. Подписчик же должен только сохранить информацию в указанную таблицу. Использование очередей SQL Server также характеризуется более высокой скоростью выполнения изменений за счет того, что запись информации об изменениях выполняется теми же механизмами, что и собственно осуществленные изменения. Мы неоднократно упоминали, что информация о выполняемых изменениях сохраняется в очереди, однако до сих пор не говорили о механизмах, которые собственно сохраняют эту информацию. Пришло время приподнять завесу. Отслеживание и запись информации об изменениях, выполняемых с опубликованными данными, осуществляется с помощью специальных триггеров, создаваемых автоматически при инициализации технологии отложенного обновления. Триггеры создаются для каждой операции изменения данных — DELETE, INSERT и UPDATE. Информация о выполняемых изменениях упаковывается специальным образом и помещается в очередь. На этом работа триггера заканчивается. Никаких действий по дополнительной обработке данных не предпринимается.
Необходимо отметить, что триггеры поддержки технологии отложенного обновления создаются с ключом NOT FOR R E P L I C A T I O N , ЧТО позволяет избежать их выполнения при изменении данных в таблицах подсистемой репликации. Такие изменения, например, постоянно выполняются при использовании репликации транзакций.
Помимо создания на подписчике триггеров для опубликованных таблиц, при инициализации технологии отложенного обновления в публикуемой базе данных издателя также выполняются некоторые изменения. В частности, создается 21 Зак. 83
624
Часть III. Администрирование
набор системных хранимых процедур, которые будут выполнять изменение опубликованных данных. Эти изменения являются отображением изменений, выполненных на подписчиках. На первый взгляд может показаться, что нет ничего сложного в применении выполненных на подписчиках изменений, и вполне можно было обойтись обычными командами UPDATE, DELETE И INSERT. Однако в этом случае будет невозможно отследить изменения, произведенные другими пользователями. Хранимые процедуры не просто осуществляют изменения, но также и отслеживают конфликты обновления и при их обнаружении разрешают их. Для выполнения изменений используется довольно сложный механизм, который гарантирует отслеживание конфликтов изменения данных. Поэтому разработчики Microsoft решили реализовать механизмы применения изменений в виде хранимых процедур, а не встраивать их непосредственно в агент Queue Reader Agent. Это также позволяет легко использовать различные механизмы разрешения конфликтов обновления, в том числе и написанные пользователями. В зависимости от механизма разрешения конфликтов хранимые процедуры могут подготовить набор так называемых компенсационных команд, которые должны применяться к конкретному подписчику для приведения его данных в соответствие с данными издателя. Запуск компенсационных команд позволяет на программном уровне выполнить отмену изменений, внесенных на подписчике и отмененных на издателе, как результат разрешения конфликта изменения. Раз уж начали говорить о конфликтах изменения и их разрешение, то следует рассмотреть их более подробно. Во-первых, прежде чем приступать к решению конфликтов изменения, следует сначала их обнаружить. Для этого предназначены столбцы ROWGUIDCOL, которые используются в качестве идентификатора строки таблицы. Столбец ROWGUIDCOL имеет тип данных u n i q u e i d e n t i f i e r . В качестве значения по умолчанию для этого столбца применяется функция NEW (). Таким образом, каждая строка публикуемых данных идентифицируется глобальным уникальным идентификатором (GUID, Global Unique Identifier). Более того, специальный триггер поддержки отложенного обновления меняет значение в столбце ROWGUIDCOL каждый раз, когда выполняется изменение данных в таблице. При сохранении информации о выполненных на подписчике изменениях указывается как старое значение GUID, так и новое. Когда информация об изменениях принимается на дистрибьюторе агентом Queue Reader Agent, она распаковывается, после чего агент пытается найти в таблице издателя строку со старым значением GUID. Если такая строка найдена, то это означает, что хранящиеся на издателе данные не были изменены, т. е. конфликта изменений нет. Когда же строка отсутствует, это означает, что данные на подписчике были изменены со времени последней синхронизации подписчика. То есть возникает конфликт изменения данных. В этом случае агент Queue Reader Agent должен разрешить конфликт. У внимательного читателя уже наверняка возник вопрос, а как же выполняется идентификация нужной строки данных на подписчике, если происходит конфликт изменения. Действительно, если значение GUID было изменено, то как найти нужную строку? Разгадка кроется в том, что для идентификации строк ис-
Глава 14. Репликация данных
625
пользуется не значение GUID, а первичный ключ. Значение первичного ключа измененной строки упаковывается на издателе вместе со значением GUID и собственно измененными данными и отсылается дистрибьютору. При обнаружении конфликта агент Queue Reader Agent находит нужную строку и либо выполняет ее изменение на издателе, либо генерирует набор компенсационных команд для подписчика. В обоих случаях строка идентифицируется по первичному ключу. Остается только рассмотреть, как же выполняется разрешение конфликтов обновления в технологии отложенного обновления. Как и в репликации сведением, при разрешении конфликта имеется победитель (winner) и проигравший (loser). Кто именно (издатель или подписчик) будет победителем и проигравшим, зависит от используемого метода разрешения конфликтов. В распоряжении пользователей имеется три стандартных метода разрешения конфликтов: • Reinitialize Subscriber. Метод предполагает выполнение повторной инициализации подписчика при обнаружении конфликта изменения. То есть если данные на подписчике были модифицированы, то изменения подписчика в любом случае отвергаются. Для него будет подготовлен новый моментальный снимок, который и применится на подписчике. До тех пор, пока подписчик не будет синхронизирован, сгенерированные им изменения на издателе не вступят в силу. Как и при выполнении первоначальной синхронизации, применение моментального снимка выполняется агентом Distributor Agent. • Publisher wins. При использовании этого метода победителем всегда является издатель. Конечно, если данные на издателе еще не исправлялись, то изменения подписчика применяются. Когда же другой подписчик попытается изменить те же данные, то агент Queue Reader Agent оставляет изменения, выполненные первым подписчиком, и генерирует для второго подписчика набор компенсационных команд, с помощью которых осуществляется откат выполненных на подписчике изменений. • Subscriber wins. В этом случае победителем всегда является подписчик. Следствием данного подхода является потеря изменений, выполненных всеми подписчиками ранее текущего изменения. То есть будет доступно только самое последнее изменение. Синхронизация других подписчиков выполняется стандартными средствами. При использовании репликации моментальных снимков это будет полный набор данных, тогда как для репликации транзакций — набор транзакций, выполняющий соответствующие изменения в таблицах подписчика. На этом рассмотрение технологии отложенного обновления можно считать оконченным.
Выбор топологии репликации Для работы системы репликации администратор должен сконфигурировать издателя, дистрибьютора и одного или более подписчиков. Как уже говорилось, SQL Server 2000 не ставит жестких рамок на размещение каждого из участников репликации. Администратор может использовать отдельные серверы для каж-
626
Часть III. Администрирование
дого из участников репликации или сконфигурировать их все на одном единственном сервере. В этом разделе будут рассмотрены различные топологии репликации. Топология определяет, где должен запускаться каждый из участников репликации. Допустимы следующие модели: О Репликация "один-ко-многим". Это наиболее часто используемая топология, предполагающая наличие единственного издателя и одного или более подписчиков. Наиболее часто эта модель топологии реализуется в системах, имеющих четко выраженную иерархическую зависимость. Схема топологии "один-ко-многим" представляет собой звезду. В центре располагается издатель, а на периферии — подписчики. Дистрибьютор в этом случае работает либо на отдельном сервере, либо на издателе. • Репликация "многие-к-одному". Топология встречается гораздо реже. Она характеризуется множеством издателей и единственным подписчиком и часто применяется в системах поддержки принятия решений (DSS, Decision Support Systems). Данные из множества филиалов, работающих самостоятельно, сливаются в центральную систему, где они анализируются и хранятся. Обратная связь с филиалами не обязательна, т. к. в системах поддержки принятия решений данные предназначены в основном только для чтения. П1 Репликация "многие-ко-многим". В этом случае каждый из издателей имеет множество подписчиков, причем каждый из подписчиков реплицирует данные со множества издателей. Топология "многие-ко-многим" может быть применена в организациях со множеством центральных серверов, каждый из которых выполняет свою собственную роль. В филиалах имеется масса подписчиков, выполняющих одинаковые задачи и нуждающихся в связи со всеми центральными серверами. Все возможные варианты топологии не ограничиваются приведенными моделями. SQL Server 2000 позволяет создавать сложные разветвленные системы со сложной топологией системы репликации. Например, в центральном офисе могут существовать несколько серверов, обменивающихся данными друг с другом. В филиалах сконфигурирован основной сервер, который реплицирует данные с одного из центральных серверов. Этот сервер затем публикует полученные данные в своем регионе. При этом могут комбинироваться различные типы репликации. Важную роль в создании системы репликации играет выбор места размещения дистрибьютора, который может работать на отдельном сервере, на издателе или на одном из подписчиков.
Управление издателем и дистрибьютором Все задачи, связанные с практической работой с издателем, подписчиком и дистрибьютором, а также создание публикации и подписки на нее, можно обозначить как администрирование репликации. Традиционно выполнение административных задач в SQL Server 2000 может осуществляться тремя способами:
Глава 14. Репликация данных •
системные хранимые процедуры поддержки репликации;
•
возможности графического интерфейса Enterprise Manager;
627
П набор мастеров работы с репликацией. Сразу необходимо отметить, что администрирование репликации с помощью хранимых процедур рассмотрено не будет. Это объясняется тем, что изучение их синтаксиса и значения того или иного параметра потребует довольно много времени и усилий, но вряд ли эти затраты окупятся при последующей эксплуатации SQL Server 2000. Если некоторые другие административные задачи с использованием хранимых процедур можно выполнить быстрее и эффективнее, то с репликацией ситуация совершенно обратная. Гораздо быстрее и проще воспользоваться возможностями Enterprise Manager или мастерами поддержки репликации, чем пытаться запускать хранимые процедуры. При описании агентов репликации был дан синтаксис утилит командной строки, которые реализуют соответствующие агенты. Как было видно, этот синтаксис достаточно сложен. А запуск утилит с нужными ключами является лишь одной из многих задач администрирования репликации. Синтаксис хранимых процедур поддержки репликации вряд ли уступает по сложности синтаксису указанных утилит.
Замечание Если все же имеется необходимость администрирования репликации с использованием хранимых процедур, то можно порекомендовать сначала инициализировать тот или иной компонент репликации средствами Enterprise Manager или мастеров и проанализировать сгенерированные ими команды выполнения хранимых процедур. Таким образом, мы будем рассматривать администрирование репликации только средствами мастером и Enterprise Manager. Администрирование репликации является настолько сложным процессом, что некоторые действия можно выполнить лишь с помощью мастеров. Практически все описанные ранее административные задачи с успехом могли быть выполнены средствами Enterprise Manager, а мастера предлагалось запускать пользователям, еще в недостаточной мере освоившим работу с Enterprise Manager. To есть вполне можно было обойтись и без мастеров. При работе с репликацией применение мастеров становится неизбежным, чему способствует сложившийся в отношении мастеров стереотип, рассматривающий их лишь как инструмент для неопытных пользователей.
^Замечание С помощью мастеров выполняется первоначальная инициализация того или иного компонента подсистемы репликации. Дальнейшее же администрирование осущесвляется средствами Enterprise Manager. Для более наглядного изложения материала по администрированию репликации работа с каждым компонентом будет рассмотрена в отдельном разделе. Предлагаемый далее материал посвящен описанию создания, управления и деактивации издателя и дистрибьютора. В следующих же разделах будет рассмотрена работа с подписчиком, а также создание публикации и подписка на нее.
628
Часть III. Администрирование
Инициализация издателя и дистрибьютора Первое, с чего начинается администрирование репликации — это конфигурирование издателя, а вместе с ним и дистрибьютора. Определить же сначала подписчика не удастся, т. к. при его инициализации необходимо указать публикацию, на которую он будет подписан. Но создать публикацию при отсутствующем издателе невозможно. Мы отметили, что при настройке издателя также понадобится сконфигурировать и дистрибьютора. Дело в том, что при создании подписчик сразу же связывается с конкретным дистрибьютором. Поэтому процесс конфигурирования издателя включает и конфигурирование дистрибьютора. Напомним, что создание дистрибьютора необходимо выполнять только в том случае, если в сети еще нет ни одного из них. Если же ранее уже был создан дистрибьютор, то можно связать создаваемого издателя с уже имеющимся дистрибьютором. Здесь возникает вопрос, что логичнее создать сначала дистрибьютора, а потом связывать с ним издателей. Однако в SQL Server 2000 нет средств выполнения создания дистрибьютора как отдельной операции. Как для организции издателя, так и для создания дистрибьютора, служит один и тот же мастер — Configure Publishing and Distribution Wizard. Уже в названии этого мастера указывается, что он предназначен как для конфигурирования издателя, так и дистрибьютора. Мастеров для выполнения этих операций по отдельности не разработано. ВыполJ<J нить же создание издателя или дистSelect Wizard рибьютора средствами Enterprise Please select the Wizard you wish to use: Manager нельзя. • Register Server Wizard :+; Database Для запуска мастера необходимо в \+r Data Transformation Services окне Select Wizard (рис. 14.17) в (+]•• Management El Replication папке Replication выбрать пункт Configure Publishing and Distribution Wizard Configure Publishing and Distribution Create Publication Wizard Wizard. Открыть окно Select Wizard Create Pull Subscription Wizard Create Push Subscription Wizard можно с помощью кнопки Run a Disable Publishing and Distribution Wizard wizard, размещенной в панели инструментов Enterprise Manager.
OK Рис. 14.17. Окно Select Wizard
Cancel
После нажатия кнопки ОК откроется первое окно мастера с перечнем основных шагов, которые необходимо пройти для конфигурирования издателя и дистрибьютора. Как видно из рисунка, окно не содержит никаких элементов управления (кроме стандартных кнопок) и поэтому можно смело переходить к следующему окну.
Глава 14. Репликация данных
629
Замечание При запуске мастера Configure Publishing and Distribution Wizard на сервере, сконфигурированном в качестве издателя, будет открыто не первое окно мастера, а окно свойств издателя и дистрибьютора, в котором можно управлять их свойствами. Работа с этим окном будет рассмотрена далее. Второе окно мастера называется Select Distributor (рис. 14.18) и, как следует из названия, предназначено для выбора сервера SQL Server 2000, который будет использоваться в качестве дистрибьютора для конфигурируемого издателя. Configure Publishing and Distribution Wizard for 'SI Select Distributor Use this server as its own Distributor or select another server as the Distributor. The Distributor is the server usualy responsible lor synchronizing data between Publishers and Subscribers. (* iMake S ' TORAGE' its own Distributor; SQL Server wil create a distribution database and log С Use the following server, which has already been configured as a Distributor
Next>
Cancel
Help
Рис. 14.18. Окно Select Distributor мастера Configure Publishing and Distribution Wizard
Главную роль в окне играет переключатель, который может быть установлен в следующие положения: П Make 'ServerName' its own Distributor; SQL Server will create a distribution database and log1. При установке переключателя в это положение в сети будет создан новый дистрибьютор, который разместится на том же сервере SQL Server 2000, что и создаваемый издатель. Если в сети еще нет ни одного дистрибьютора, то в любом случае придется устанавливать переключатель в рассматриваемое положение. То есть первый дистрибьютор сети всегда располагается на том же сервере, что и издатель. Впоследствии созданный дистрибьютор может быть использован другими издателями; • Use the following server, which has already been configured as a Distributor. Если в сети уже имеется дистрибьютор, то вы можете вполне использовать его, а Вместо 'ServerName' в окне будет указано конкретное имя сервера. — Ред.
630
Часть III. Администрирование
не создавать новый. Для этого достаточно установить переключатель в рассматриваемое положение. Используя эту возможность, можно несколько издателем связать с единственным дистрибьютором, который таким образом будет обслуживать всех подписчиков. При установке переключателя в данное положение становится доступным список, расположенный в нижней части окна. В этом списке приведены все серверы SQL Server 2000, зарегистрированные в Enterprise Manager. Если нужного сервера в списке нет, то его следует предварительно зарегистрировать. Регистрацию можно выполнить непосредственно из окна мастера. Для этого достаточно нажать кнопку Add Server, что приведет к открытию стандартного окна регистрации сервера. Подробно регистрация серверов была рассмотрена в разд. "Регистрация сервера" главы 10. Использование созданного ранее дистрибьютора не представляет особого интереса. Поэтому мы рассмотрим создание нового дистрибьютора. То есть переключатель должен быть установлен в первое положение. После этого можно переходить к очередному окну мастера. Третье окно мастера имеет название Customize the Configuration (рис. 14.19) и используется для выбора стратегии конфигурирования создаваемого дистрибьютора с помощью переключателя, устанавливаемого в положения: • Yes, let me set the distribution database properties, enable Publishers, or set the publishing settings. Если вы хотите полностью контролировать процесс создания базы данных распределения, выбора подписчиков и контроля некоторых других параметров, то следует установить переключатель в данное положение. В этом случае мастер предложит ряд дополнительных окон, с помощью которых и нужно будет соответствующим образом сконфигурировать те или иные параметры. В этих окнах по умолчанию будут установлены те же значения, что используются при установке переключателя в следующее положение. Таким образом, выбор данного переключателя вовсе не означает, что вам придется конфигурировать множество параметров. Просто вам предоставится возможность изменить часть из них, приняв для остальных (или даже для всех) предлагаемые по умолчанию значения. • No, use the following default settings. Если вы не в полной мере освоили конфигурирование свойств издателя и дистрибьютора, или просто вас удовлетворяют предлагаемые мастером параметры, то можно установить переключатель в рассматриваемое положение. В этом случае мастер будет использовать значения по умолчанию — база данных распределения будет иметь имя D i s t r i b u t i o n , ее файлы данных и журнала транзакций разместятся в стандартном каталоге, ни одна из баз данных не окажется доступной для публикации, а всем зарегистрированным серверам будет разрешено подписываться на публикации, создаваемые на инициализируемом подписчике. В текстовом поле, расположенном в нижней части окна, описаны параметры, предлагаемые по умолчанию. При установке переключателя в рассматриваемое положение следующее окно мастера станет последним. Для полноты описания работы с мастером рассмотрим ручное конфигурирование параметров издателя и дистрибьютора, т. е. установим переключатель в верхнее положение.
Глава 14. Репликация данных
631
Configure Publishing and Distribution Wizard lor "STORftpF Customize the Configuration You can configure yout server for replication with default settings, or you can customize the settings.
2<J
Do you want to customize the publishing and distribution settings? (* ^es, let me set the distribution database properties, enable Publishers, or set the publishing '•settings. No, use the following default settings: Configure 'STORAGE' as a Publisher. Use 'STORAGE' as the Distributor. Enable the following setvers as Subscribers to publications on 'STORAGE': CIT SIRIUS STORAGE STORAGEVTRELON Store the distribution database 'distribution' in 'G:\Prograrn FilesWicrosoft SQL
< Back
Next >
Cancel
Рис. 14.19. Окно Customize the Configuration мастера Configure Publishing and Distribution Wizard
В этом случае очередное окно мастера будет иметь имя Provide Distribution Database Information (рис. 14.20), что можно перевести как "укажите информацию в базе данных распределения". Рассмотрим элементы управления, имеющиеся в окне: • Distribution database name. В поле указывается имя, которое будет присвоено базе данных распределения. Как видно, по умолчанию предлагается имя d i s t r i b u t i o n . Однако ничто не мешает использовать вместо этого стандартного имени любое другое. Отметим также, что на одном дистрибьюторе можно создавать более одной базы данных распределения. G Folder for the distribution database file. С помощью данного текстового поля указывается каталог на диске, в разместятся файлы с данными (mdf и ndf) создаваемой базы данных распределения. Путь может быть введен как полностью вручную, так и выбран с помощью окна Browse for Folder, открыть которое можно с помощью кнопки I, расположенной непосредственно справа от поля; • Folder for the distribution database log file. Это поле предназначено для указания каталога для размещения в нем файлов журнала транзакций создаваемой базы данных распределения. Замечание Отметим, что по умолчанию база данных распределения будет состоять всего из двух файлов — одного файла с данными (первичного) и одного файла журнала транзакций. Однако ничто не мешает после завершения работы мастера добавить в базу данных новые файлы.
632
Часть III. Администрирование JSl
Configure Publishing and Distribution Wizard Provide Distribution Database Information Select the name and location of the distribution database and log files. The distribution database stores changes to transactional publications until Subscribers can be updated. It also stores historical information for snapshot and merge publications. Distribution database name:
I distribution
Fojder for the distribution database file: G:\Program FilesSMicrosoft SQL ServerVMSSQLVdata Fojder for the distribution database log file: G:\Prograrn Files\Microsoft SQL Server\MSSQL\data
_J
The paths must refer to disks that are local to 'STORAGE' and begin with a local drive letter and colon (for example, C:). Mapped drive letters and network paths are invalid.
< Back
Next >
Help
Cancel
Рис. 14.20. Окно Provide Distribution Database Information мастера Configure Publishing and Distribution Wizard Configure Publishing and Distribution Wizard tor Si
ill
Enable Publishers Enable,servers to use this Distributor after they are configured as Publishers. To set the login information and working folder for a server, select it, and then click the properties (...) button.
Registered servers: | Publishers 0 CIT • jSIRIUS 0 STORAGE 0 STORAGEVTRELON
i Distribution DB distribution distribution distribution
Enable All Enable None
... 1
New..
1 Click New to register a new server and enable it as a Publisher.
< Back
Next>
Cancel
Help
Рис. 14.21. Окно Enable Publishers мастера Configure Publishing and Distribution Wizard
После того, как свойства базы данных распределения будут сконфигурированы, можно переходить к следующему окну мастера, которое называется Enable Pub-
633
Глава 14. Репликация данных
Ushers (рис. 14.21), преднозначенному для разрешения издателям доступа к создаваемому дистрибьютору, а также для управления некоторыми свойствами работы с этими издателями. Центральную часть окна занимает таблица Registered servers, каждая строка которой соответствует одному из зарегистрированных серверов. В столбце Publishers указываются собственно имена серверов. Слева от имени сервера имеется флажок, с помощью которого можно разрешить соответствующему серверуиздателю использовать создаваемого дистрибьютора. В столбце Distribution DB указывается имя одной из баз данных распределения, которая будет применяться для соответствующего издателя. Мастер позволяет создавать при инициализации дистрибьютора только одну базу данных распределения, поэтому во всех строках будет указано одинаковое значение. Напомним, что имя базы данных распределения конфигурируется в предыдущем окне мастера. После установки флажка в самом правом столбце появляется кнопка J, с помощью которой можно открыть окно свойств издателя Publisher "Properties (рис. 14.22). Publisher Properties - STORAGE General Name:
STORAGE
Data storage at the Distiibutoi Distribution database: Snapshot |V£TORAGE\G$\ProgramFiles4Microsoft ... I folder: Replication agent connection to the Publisher ** Impersonate the SQL Server Agent account onS ' TORAGE' (trusted connection) С Use SQLServer Authentication:
Cancel
Help
Рис. 14.22. Окно Publisher Properties для сервера STORAGE
Рассмотрим элементы управления, имеющиеся в окне свойств издателя: П Name. В этом поле задается имя сервера-издателя. Изменять значение в этом поле нельзя. • Distribution database. Указывается имя базы данных распределения, в которой будет сохраняться информация конфигурируемого издателя. Так как к настоя-
634
Часть III. Администрирование
щему моменту на дистрибьюторе имеется всего одна база данных распределения, то ее имя и приводится в поле. Ввести другое значение не удастся. П Snapshot folder. Посредством этого поля можно выбрать каталог, в котором станут сохраняться файлы моментального снимка, генерируемые для публикации конфигурируемого издателя агентом Snapshot Agent. По умолчанию предлагается сохранять файлы в каталоге \Program Files\Microsoft SQL Server\MSSQL\ReplData. Однако ничто не мешает указать любое другое место, в том числе и вне дистрибьютора. При инициализации подписчиков файлы моментальных снимков автоматически будут копироваться с указанного каталога. Помимо конфигурирования свойств сохранения данных самой репликации, в окне также можно определить, каким образом агенты репликации, работающие на дистрибьюторе, будут устанавливать соединение с издателем: П Impersonate the SQL Server Agent account on 'ServerName' (trusted connection). В этом случае соединение будет устанавливаться с использованием аутентификации Windows NT. To есть агенты репликации попытаются установить соединение под той же учетной записью, что используется для запуска служба SQLServerAgent. Чтобы установление соединения прошло успешно, нужно учетной записи, предназначенной для запуска на дистрибьюторе службы SQLServerAgent, предоставить на издателе необходимые права. По умолчанию используется аутентификация Windows NT.
(
Замечание
\
Напомним, что установление соединения будет невозможно, если служба SQLServerAgent на дистрибьюторе запускается под локальной учетной записью (системы или пользователя). В обязательном порядке необходимо использовать учетную запись пользователя домена. • Use SQL Server Authentication. При выборе этого положения переключателя установление соединения будет осуществляться с помощью аутентификации SQL Server. Для этого понадобится конфигурирование еще нескольких элементов управления окна, которые становятся доступными при установке переключателя в рассматриваемое положение: •
Login — имя учетной записи, под которой будет устанавливаться соединение. Естественно, это должна быть одна из учетных записей, созданных на издателе;
•
Password — пароль учетной записи, указанной выше;
•
Confirm password — повтор пароля для избежания ошибок при его вводе.
На этом работа с окном свойств издателя заканчивается. Вернемся к работе с мастером, точнее с окном Enable Publishers (см. рис. 14.21). Нерассмотренными в этом окне остались лишь следующие кнопки: П Enable All разрешает использование конфигурируемого дистрибьютора всеми серверами, т. е. устанавливает все флажки слева от имен серверов;
Глава 14. Репликация данных
635
• Enable None сбрасывает все флажки; П New позволяет открыть окно регистрации нового сервера. После регистрации его имя сразу же появится в списке серверов. На этом работу с окном Enable Publishers можно считать оконченной. Следующее окно мастера называется Enable Publication Databases (рис. 14.23). С помощью этого окна можно сконфигурировать ту или иную базу данных издателя для публикации с помощью репликации транзакций (в т. ч. и репликации моментальных снимков), а также репликации сведением.
>
Configure Publishing and Distribution Wizard for "STORAGt Enable Publication Databases Enable databases for transactional (includes snapshot) or merge replication.
- Q 4*FW
databases: Trans ! Merge (DatabaseName 0 0 Administrator Database 0 0 Bonus • • Northwind
Transacto inal Enabe l Al Enabe l None u i u шшшшшшшшшшшшшшш Merge - — Enabe l Al j None <1 1 • Enabe
A database owner can create a publication only after an administrator has enabled the database for publishing.
Cancel
Hep l
Рис. 14.23. Окно Enable Publication Databases мастера Configure Publishing and Distribution Wizard
Прежде чем база данных сможет быть опубликована, администратор обязан разрешить создание публикаций для этой базы данных. Это позволяет гарантировать, что данные не будут опубликованы владельцем базы данных без ведома администратора. Разрешение баз данных для публикации выполняется с помощью таблицы Databases, в которой перечислены все пользовательские базы данных, созданные на издателе. Разрешение базы данных для публикации осуществляется путем установки флажка в одном из следующих столбцов: • Trans — разрешение базы данных для публикации средствами репликации транзакций, а также репликации моментальных снимков; П Merge — разрешение для создание публикации репликации сведением. В правой части окна имеются группы кнопок Transactional и Merge, с помощью которых можно либо установить все флажки (кнопка Enable All), либо сбросить все их (кнопка Enable None), соответственно, в столбце Trans и Merge. После
Часть III. Администрирование
636
того, как все необходимые базы данных будут разрешены для публикации, можно переходить к следующему окну. Следует отметить, что позже в любой момент можно будет разрешить создание публикаций для базы данных, или наоборот, запретить это. Следующее окно мастера носит имя Enable Subscribers (рис. 14.24), используемое для разрешения серверам сети подписываться на публикации, имеющиеся на конфигурируемом издателе. Как и при работе с предыдущими окнами, центральную часть окна занимает таблица, в которой перечислены все зарегистрированные серверы. Для разрешения серверу подписываться на публикации достаточно установить флажок слева от имени сервера. После этого в правом столбце появляется кнопка Ц, с помощью которой можно открыть окно свойств подписчика Subscribersrroperties (рис. 14.25). Configure Publishing and Distribution Wizard i Enable Subscribers Enable serverstosubscribe to publications from this Publisher. To set the login information and default synchronization schedule for a Subscriber, select it, and then click the properties (...) button. Registered servers: Subscribers if 0 SIRIUS 0 STORAGE 0 STORAGEURELON
Enabe l All Enabe l None New..
Click New to register a new server and enable it as a Subscriber. You can enable heterogeneous Subscribers after you complete this wizard.
Next>
Cancel
Help
Рис. 14.24. Окно Enable Subscribers мастера Configure Publishing and Distribution Wizard
Как видно, окно имеет две вкладки. Интерес на вкладке General представляет только поле Description, в котором можно указать краткое описание подписчика, а также набор элементов в нижней части вкладки. Эти элементы предназначены для управления параметрами подключения агентов репликации к подписчику для выполнения тех или иных операций. По умолчанию (переключатель Impersonate the SQL Server Agent account on 'ServerName' (trusted connection)) предлагается использовать учетную запись Windows NT, которая предназначена для запуска службы SQLServerAgent. Однако для установления соединения также можно применять и учетную запись SQL Server (переключатель Use SQL Server Authentication). В этом случае нужно будет указать имя (поле Login name) и пароль (поля Password и Confirm password) учетной записи.
Глава 14. Репликация данных
637
Subscriber Properties - STORAf General I Schedules I Щ
Name:
STORAGESJRELON
Identification • Type:
SQLServer
description: Agent connection to the Subscriber — — - —
— —
f*" Impersonate the SQL Server Agent account on 'STORAGE' (trusted connection) С Use S.QL Server Authentication:
Cancel
Help
Рис. 14.25. Окно Subscriber Properties, вкладка General
Перейдем к вкладке Schedules (рис. 14.26), с помощью которой можно управлять расписанием синхронизации подписчика. Вкладка разделена на две части. В верхней из них конфигурируется расписание работы агента Distribution Agent, тогда как в нижней части — агента Merge Agent. Можно сконфигурировать агентов либо для постоянной работы (положение переключателя Continuously), либо в соответствии с определенным расписанием (положение At the following scheduled times). В последнем случае необходимо сконфигурировать время запуска службы. Для этого предназначено окно Edit Recurring Job Schedule. После того, как будет разрешена подписка на публикации для всех нужных подписчиков и окажутся сконфигурированными их подписчики, работу с окном, а также со всем мастером можно считать оконченной. Следующее окно мастера будет последним. После нажатия кнопки Finish мастер приступит к непосредственной настройке издателя и дистрибьютора. После того, как мастер выполнит все необходимые действия, в дереве объектов Enterprise Manager для сервера-издателя будет создана папка Replication Monitor Group, с помощью которой можно быстро получить доступ к инструментам конфигурирования издателя, дистрибьютора, подписчика, а также публикаций и подписок. Помимо этого, в каждой базе данных, разрешенной для публикации, создается папка Publications, где станут отображаться все публикации, созданные в этой базе данных. Для баз данных, разрешенных к публикации, в панели Enterprise Manager будет использована пиктограмма с рукой, символизирующей предоставление данных для публикации.
Часть III. Администрирование
638 Subscriber Properties - STORAGEX General Schedules A default schedule is usedtoinitialize a Distribution or Merge Agent when creating a push subscription for this Subscriber. Distribution Agents By default, new Distribution Agents run iContinuousI^ С A] the following scheduled times:
Merge Agents —
-
By default, new Merge Agents run » Continuously (* At the following scheduled times: Occurs every 1 day(s), every 1 hour(s] between 0:00:00 and 23:59:00.
Change
You can override these default schedules when using the Push Subscription Wizard to create a new subscription. OK
Cancel
Help
Рис. 14.26. Окно Subscriber Properties, вкладка Schedules
Конфигурирование издателя и дистрибьютора В предыдущем разделе было рассмотрено создание издателя и дистрибьютора. Этот же раздел посвящен рассмотрению управления свойствами уже существующих дистрибьютора и издателя. Конечно, при создании издателя и дистрибьютора необходимо тщательно конфигурировать все их свойства, чтобы впоследствии не нужно было них изменять их. Однако, бывают ситуации, когда все же приходится обращаться к окну свойств издателя и дистрибьютора для изменения тех или иных параметров.
Замечание В качестве примера мы рассмотрим окно свойств дистрибьютора и издателя, размещенных на одном и том же сервере. В других ситуациях набор элементов управления может быть иным, нежели тот, что приведен далее.
Итак, прежде всего необходимо открыть окно свойств издателя и дистрибьютора. Как уже говорилось, для этого можно попытаться повторно запустить мастер Configure Publishing and Distribution Wizard. В ответ откроется окно Publisher and Distributor Properties (рис. 14.27). Другой способ открытия этого окна требует использования папки Replication Monitor Group. В ней следует найти имя нужного сервера и в его контекстном меню выбрать пункт Distributor Properties.
639
Глава 14. Репликация данных Publisher and Distributor Prope Distributor Publishers I Publication Databases Subscribers I ЦЦУ Name:
[STORAGE
Distribution databases databases:
distribution
Properties New.. Delete
Agent profiles
-
Sets the profile for each type of agent. Administrative link password
Agent Profiles.. ••
•
Publishers must use this password when connecting to the Distiibutor. Password:
Confirm password;
Cancel
Help
Рис. 14.27. Окно Publisher and Distributor Properties, вкладка Distributor
Как видно, окно имеет четыре вкладки, каждая из которых предназначена для конфигурирования определенного набора свойств. Первая из вкладок называется Distributor (см. рис. 14.27), и предназначена для управления свойствами дистрибьютора. В верхней части вкладки имеется поле Name, в котором указывается имя конфигурируемого дистрибьютора. Естественно, изменять это значение нельзя. В нижней части размещены поля Password и Confirm password, где необходимо указать пароль, который должен будет вводить каждый из издателей при установлении соединения с дистрибьютором. Первоначальные значения пароля конфигурируются автоматически мастером при создании дистрибьютора. Однако впоследствии администратор может изменить пароль по своему усмотрению. На вкладке также находится таблица Databases, в которой перечисляются базы данных распределения, доступные на дистрибьюторе. Мастер создания дистрибьютора создает всего одну базу данных и по умолчанию присваивает ей имя d i s t r i b u t i o n . Тем не менее, администратор может создать дополнительные базы данных распределения (кнопка New), удалить существующие (кнопка Delete) или изменить их свойства (кнопка Properties).
Замечание Прежде чем приступать к удалению базы данных распределения, необходимо убедиться, что она не задействована ни одним издателем. Если все же она используется, потребуется сначала удалить все публикации, хранящиеся в этой базе данных распределения.
640
Часть III. Администрирование
Рассмотрим, какие же свойства имеет база данных распределения. Для этого выберем ее имя в таблице Databases и нажмем кнопку Properties. В ответ откроется окно Distribution Database Properties (рис. 14.28). Distribution Database Properties - M) Database Name:
U P
u
b
l
T
i
s
h
h
e
•
e
s
r
s
e
P
u
b
l
i
s
h
e
r
s
u
s
e
t
h
i
s
d
a
t
a
b
a
s
e
:
_J Transaction retention Store the transactions: At least: But not more than: History retention Store .replication performance history at least: Cancel
(• Hoyrs С Days
Рис. 14.28. Окно Distribution Database Properties
В верхней части окна имеется поле Name, в котором выводится имя базы данных распределения. Ниже расположен список с перечислением всех издателей, использующих конфигурируемую базу данных распределения. В нижней части окна имеется две группы элементов, с помощью которых устанавливается период хранения информации об осуществленных транзакциях и истории выполнения задач репликации.
Замечание Конфигурируемые в окне свойства отражаются на параметрах запуска вспомогательных задач очистки, создаваемых на дистрибьюторе для удаления устаревшей информации. Чтобы убедиться в этом, достаточно открыть в панели Enterprise Manager для сервера-дистрибьютора папку Management\SQL Server AgentAJobs и отобразить окно свойств соответствующего вспомогательного задания. Сначала рассмотрим группу Transaction retention, которая предназначена для управления временем хранения информации о выполненных на издателе транзакциях. Подобная информация сохраняется при использовании репликации транзакций. В поле At least указывается минимальный срок хранения данных. По умолчанию он менее часа. То есть данные о транзакциях будут удаляться
Глава 14. Репликация данных
641
сразу же после того, как будут получены всеми подписчиками. Если необходимо обеспечить более длительное хранение информации, то следует установить иное значение. Это может потребоваться, если ожидается подключение нового подписчика. Этот подписчик сможет использовать созданный ранее моментальный снимок и применить для него накопленный набор транзакций. В поле But not more than задается максимальный срок хранения данных о выполненных на издателе транзакциях. Таким образом, указанное значение определяет максимальный период времени, в течение которого должна быть осуществлена синхронизация подписчика и издателя. Если за этот период синхронизации не произойдет, то из базы данных распределения будет удалена часть транзакций, что приведет к невозможности дальнейшего применения цепочки транзакций на подписчике. В этом случае останется только выполнить повторное применение моментального снимка. По умолчанию максимальный срок хранения составляет 72 часа. В нижней части вкладки существует поле, в котором указывается срок хранения информации о выполнении задач репликации. Каждые 10 минут запускается специальная вспомогательная задача, которая удаляет из таблиц базы данных распределения информацию старее указанного в поле значения. По умолчанию определен срок хранения 48 часов. На этом конфигурирование свойств базы данных распределения заканчивается. Отметим, что мы обсуждали только свойства базы данных, связанные с функционированием подсистемы репликации. Мы не рассматриваем управление базой данных распределения как обычной базой данных, например, управление файлами базы данных или создание резервной копии. Выполнение подобных задач администрирования базы данных распределения выполняется точно так же, как и для обычных баз данных. Не рекомендуется создавать в базе данных распределения пользовательские объекты. Вернемся к окну свойств дистрибьютора, точнее вкладке Distributor (см. рис. 14.27). На ней еще осталась нерассмотренной кнопка Agent Profiles, с помощью которой можно открыть окно конфигурирования профиля агентов репликации Agent Profiles (рис. 14.29). Это окно позволяет управлять поведением агентов при выполнении тех или иных операций. Как видно из рисунка, в окне пять вкладок, каждая из которых соответствует отдельному агенту репликации. Принципы работы с каждой из этих вкладок одинаковы и поэтому мы ограничимся рассмотрением только первой из них — Distribution, которая, как следует из названия, предназначена для конфигурирования агента Distribution Agent.
(~~~
Замечание
^
Количество профилей для каждого агента различно. Центральную часть окна занимает таблица, в которой перечислены все созданные для агента профили. Профиль (Profile) представляет собой набор конкретных значений свойств агента. Каждый агент имеет свой собственный набор свойств. При инициализации репликации система автоматически создает набор стандартных
642
Часть III. Администрирование
профилей. Для таких профилей в столбце Туре указывается значение System. Создаваемые же пользователем профили имеют значение User. Нельзя изменять значение свойств в стандартных профилях, так же как и удалить их. Однако при работе с пользовательскими профилями такая возможность имеется. Agent Profiles for 'STORAGE' Distribution j Merge | Snapshot | Log Reader ] Queue Reader Select the default profile for new Distribution Agents. To update existing Distribution Agents to use the selected profile, select the check box below.
Default Profile name Type Continue on data... System с Default agent profile System r О MyProfile User (5 Verbose history a... System г Windows Synchr... System
. : Description Agent profile for skipping data consi; Новый пользовательский профи* Agent profile for detailed history logg Profile used by the Windows Synchr
Л
J
Modfiy.
Delete..
Г" Cbange all existing Distribution Agents to use the selected profile
OK
Cancel
Apply
Help
Рис. 14.29. Окно Agent Profiles
Хотя свойства стандартных профилей изменять нельзя, ничто не мешает просмотреть их. Для этого достаточно нажать кнопку View Details (это имя имеет кнопка Modify, когда выбран системный профиль), выбрав предварительно нужный профиль. После нажатия кнопки откроется окно Replication Agent Profile Details. В этом окне перечислены все доступные для агента свойства, а также указаны установленные в профиле значения этих свойств. Мы не будем подробно рассматривать значение каждого из свойств, т. к. это займет много места. При необходимости следует обратиться к дополнительной документации. В общем же случае вполне достаточно набора стандартных профилей. Краткие характеристики профиля указаны в столбце Description (см. рис. 14.29). Вернемся же к окну свойств дистрибьютора и подписчика (см. рис. 14.27). Мы полностью рассмотрели работу со вкладкой Distributor и теперь можно переходить к следующей вкладке — Publishers (рис. 1430). Назначение вкладки Publishers полностью соответствует назначению окна Enable Publishers мастера Configure Publishing and Distribution Wizard (см. рис. 14.21). Таким образом, вкладка Publishers предназначена для разрешения использова-
Глава 14. Репликация данных
643
ния конфигурируемого дистрибьютора для хранения информации тех или иных издателей. Список потенциальных издателей отображается в таблице Servers. Возможно, указанные в таблице серверы и не являются издателями, однако вполне возможно, что в скором будущем они станут таковыми. Можно заранее разрешить им доступ к дистрибьютору, чтобы впоследствии не возвращаться к этому вопросу. Publisher and Distributor Properties • Distributor [.Publishers]J Publication Databases | Subscribers) Enable servers to use S ' TORAGE' as a Distributor. Click the properties (...) button to set security and other properties. Servers:
I Pubsilhers •Dsi trb i uto i n.. \ • ШШШШШШ • SR IU IS 0 STORAGE ds itrb i uto in ••STORAGEYTR!.
ii
Enable All
Enabe l None New..
Я"' OK
Cancel
Help
Рис. 14.30. Окно Publisher and Distributor Properties, вкладка Publishers
Как и при работе с мастером, имеется возможность управления свойствами издателя. Для этого предназначено окно Publisher Properties, открыть которое можно с помощью кнопки Ч Работа с этим окном уже была рассмотрена в предыдущем разделе (см. рис. 14.22). На этом работу со вкладкой Publishers также можно считать рассмотренной. Следующая вкладка называется Publication Databases (рис. 14.31) и предназначена для управления созданием публикаций для той или иной базы данных издателя. На вкладке приведен список всех пользовательских баз данных, которые потенциально могут быть опубликованы. Устанавливая для базы данных флажок в столбце Trans или Merge, вы тем самым разрешаете для нее создание соответственно публикации с использованием репликации транзакций (а также моментальных снимков) и репликации сведением. На этом назначение вкладки исчерпывается. Напомним, что та же операция выполнялась с помощью окна Enable Publication Databases мастера Configure Publishing and Distribution Wizard (см. рис. 14.23).
644
Часть III. Администрирование
Publisher and Distributor Proper* Distributor ] Publishers Publication Databases j Subscribers | Enable databases for transactional (includes snapshot) or merge replication.
databases: Trans Merge D :atabase Name
0 0
• •
0 ]Admn isitrator Database 0 Bonus a Northwn id • pubs
Transactional Enable All Enable None Merge Enable All Enable None
4 To enable or disable a database for both types of replication, double-click the database name. OK
Cancel
Help
Рис. 14.31. Окно Publisher and Distributor Properties, вкладка Publication Databases
Наконец, рассмотрим самую последнюю вкладку — Subscribers (рис. 14.32). Проводя сравнение с мастером, можно сказать, что данная вкладка по своему назначению соответствует окну Enable Subscribers (см. рис. 14.24). Напомним, что указанное окно мастера служит для разрешения серверам сети подписываться на публикации, созданные на конфигурируемом издателе. Работа со вкладкой Subscribers сводится к установке или сбросу флажка напротив имени базы данных, что соответственно разрешает или запрещает конфигурируемому подписчику релицировать публикации, созданные на издателе.
Замечание Помимо разрешения подписки на публикацию на уровне издателя, необходимо будет еще предоставить доступ и на уровне конкретной публикации. Так что не надо опасаться, что разрешение доступа подписчику на вкладке Subscribers приведет к несанкционированному выкачиванию публикаций. Дополнительно можно сконфигурировать и свойства подписчика. Для этого предназначено окно Subscriber Properties, которое можно открыть с помощью кнопки $'М, доступной для разрешенных подписчиков. Работа с этим окном была описана ранее при рассмотрении создания дистрибьютора и подписчика (см. рис. 14.25). На этом рассмотрение конфигурирования свойств дистрибьютора и издателя можно считать оконченным.
Глава 14. Репликация данных
645
Publisher and Distributor Properties - STO Distributor) Publishers] Publication Databases Subscribers j Enable Subscribers to receive data published by 'STORAGE'. Click the properties (...) button to set security and other properties. .Subscribers: 0 SIRIUS 0 STORAGE 0 STORAGEVTRELON
OK
New..
Cancel
Help
Рис. 14.32. Окно Publisher and Distributor Properties, вкладка Subscribers
Деактивизация дистрибьютора и издателя Выполнение деактивизации необходимо в том случае, когда репликация данных более не требуется. В принципе, не будет ничего страшного, если издатель и дистрибьютор не будут деактивизированы вовсе. Однако в этом случае часть ресурсов операционной системы будет расходоваться впустую. Это связано с тем, что некоторые агенты репликации постоянно запущены, тем самым расходуя оперативную память и процессорное время. Конечно, если в ближайшем будущем предполагается снова запускать репликацию, то можно и не деактивизировать издателя и дистрибьютора. Однако, если вы твердо уверены, что репликация в ближайшее время не потребуется, то необходимо деактивизировать издателя и подписчика. Для выполнения этой операции предназначен специальный мастер — Disable Publishing and Distribution Wizard. Запустить его, как и все другие, можно с помощью окна Select Wizard (см. рис. 14.17). В одном из предыдущих разделов уже были рассмотрены способы открытия этого окна. Первое окно мастера традиционно содержит общую информацию о шагах, которые будут выполнены мастером. В окне сообщается, что мастер выполнит удаление всех публикаций, созданных на соответствующем издателе, при этом также будут уничтожены все связанные подписки. Если вы все еще хотите деактивизировать издателя и дистрибьютора, то остается только нажать кнопку Next.
Часть III. Администрирование
646
Во втором окне мастера (рис. 14.33) пользователю предоставляется еще один шанс отказаться от деактивизации поддержки репликации на сервере. По умолчанию переключатель установлен в нижнее положение. Если продолжить работу мастера ничего не изменяя, то мастер не предпримет никаких действий. Нас же интересует деактивизация репликации, поэтому необходимо установить переключатель в верхнее положение. После этого остается только перейти к очередному окну мастера, которое будет последним. В нем выводится информация о действиях, которые выполнит мастер после нажатия кнопки Finish. Таким образом, для деактивизации на сервере издателя, дистрибьютора, удаления всех созданных публикаций и подписок на них, необходимо всего-навсего нажать кнопку Finish. Disable Publishing and Distribution Wizard A Disable Publishing Choose whether to disable publishing on this server. Do you want to disable publishing on S ' TORAGE? ' (• ^er di abje'publi hing on f fORAGEj • All publications on this server wil be dropped. • Subscriptions to these publications wil be dropped. • This server wil be disabled as a Distributor. С No, continue to use 'STORAGE' as a Publisher If you select Yes, the data remains on the Publisher and Subscribers; however, it loses its synchronization relationship.
Next>
Cancel
Рис. 14.33. Второе окно мастера Disable Publishing and Distribution Wizard
Необходимо отметить, что деактивизация поддержки репликации на сервере не приводит к удалению опубликованных данных на издателе или реплицированных данных на подписчике. Пользователи могут продолжать использование этих данных, однако синхронизация изменений между серверами выполняться не будет. При деактивизации репликации будут удалены все базы данных распределения, а также все созданные в базах данных вспомогательные объекты (например, триггеры) и отменены изменения в таблицах, к которым относится создание столбцов u n i q u e i d e n t i f i e r И timestamp.
Управление публикацией Первое, что необходимо выполнить при использовании репликации, — инициализация издателя и дистрибьютора. После их конфигурирования приступать к соз-
Глава 14. Репликация данных
647
данию публикации. Это второй этап, который необходимо реализовать при репликации данных. Последним этапом будет инициализация подписчика. Однако выполнить эту операцию удастся только после создания хотя бы одной публикации. Это связано с тем, что подписчик организуется при определении подписки. Данный раздел, включая все его подразделы, будет посвящен рассмотрению создания и управления публикациями.
Создание публикации Итак, второй этап конфигурирования репликации — это создание публикации. Напомним, что публикация представляет собой описание набора данных, которые должны реплицироваться, а также правил репликации данных. Каждая публикация создается для определенного типа репликации: G репликации моментальных снимков; П репликации транзакций; •
репликации сведением.
Дополнительно для двух первых типов репликации можно разрешить поддержку технологий обновления публикуемых данных со стороны подписчика: •
подписчики незамедлительного обновления;
•
отложенное обновление.
Замечание Как тип репликации, так и возможность использования технологий поддержки обновления публикуемых данных со стороны подписчика, конфигурируются при создании публикации и впоследствии не могут быть изменены. Поэтому необходимо внимательно подойти к выбору конкретной конфигурации публикации. Создание публикации осуществляется с помощью мастера Create Publication Wizard. Запуск мастеров был рассмотрен в одном из предыдущих разделов и поэтому предполагаем, что эта операция не представляет проблем. После запуска мастера из окна Select Wizard (см. рис. 14.17) откроется не первое окно мастера, как ожидается, а окно менеджера публикаций (рис. 14.34). С помощью этого окна можно не только создавать публикации, но также удалять их, управлять свойствами, а также организовывать для публикаций принудительную подписку и генерировать сценарий, с помощью которого была создана публикация. Для создания новой публикации необходимо в дереве Databases and publications выбрать имя базы, данные которой предполагается публиковать, и нажать кнопку Create Publication. Только после этого будет осуществлен запуск собственно мастера создания публикации Create Publication Wizard. Первое окно мастера Create Publication Wizard несколько отличается от первых окон других мастеров — в нем имеется флажок Show advanced options in this wizard, установка которого предписывает мастеру выводить элементы управления, предназначенные для управления расширенными (advanced) настройками. В ос-
648
Часть III. Администрирование
тальном же первое окно содержит лишь информацию о шагах, которые выполнит мастер. Create and Manage Publications on STORAGE data:bases and publications:
-Щ STORAGE Administrator Database : ^ •• у Northwind j§ pubs
Cieate Publication...
1
F'iC.peihf-- • .: :•; ::'.;: .; :.rj,o'iO!:?
Close
Рис. 14.34. Окно менеджера публикаций
Во втором окне мастера, имеющем название Choose Publication Database, пользователю предлагается выбрать базу данных, данные которой предполагается опубликовать. В качестве примера рассмотрим публикацию стандартной базы ДанНЫХ Northwind.
Когда имя нужной базы данных будет задано, можно переходить к очередному окну мастера, которое называется Select Publication Type (рис. 14.35). С помощью этого окна необходимо указать, какой тип репликации будет использоваться для создаваемой публикации. Выбор типа репликации осуществляется с помощью переключателя, который может быть установлен в следующие положения: G Snapshot publication — репликация моментальных снимков; • Transactional publication — репликация транзакций; О Merge publication — репликация сведением. От выбора типа репликации напрямую будет зависеть набор последующих окон мастера, отличия между которыми подчас довольно серьезные. Тем не менее, мы не будем рассматривать создание публикаций всех трех типов репликации, а ограничимся рассмотрением только самого сложного типа публикаций — репликации сведением. Итак, в окне Select Publication Type необходимо установить переключатель в самое нижнее положение, после чего остается нажать кнопку Next. Следующее окно мастера, имеющее имя Specify Subscriber Types (рис. 14.36), предназначено для разрешения поддержки подписчиков различных типов. В распоряжении пользователя имеется набор флажков, с помощью которых и осуществляется поддержка подписчиков того или иного типа:
Глава 14. Репликация
данных
649
П Servers running SQL Server 2000 — поддержка подписчиков SQL Server 2000; • Servers running SQL Server version 7.0 — поддержка подписчиков SQL Server 7.0; • Heterogeneous data sources, such as Oracle or Microsoft Access, or devices running SQL Server for Windows СЕ — поддержка подписчиков иного типа, чем SQL Server 2000 и SQL Server 7.0. Ими могут быть как серверы Oracle, так и серверы SQL Server 6.x. Create Publication Wizard Select Publication Type Select the publication type that best supports the requriements of your application. jSj|H *"" Snapshot publication •• The Pubs ilher periodicaly repa l ces Subscrb i er data with fZ^J// an updated snapshot. This is appropra i te when the Subscrb i er data need not be ^/ constantly up-to-date. jjMj^ ("" Jransactional publication -• Data is usualy updated at the Publisher, and
ЛуИ •*>«'
changes are sent incrementally to Subscribers. Updates to Subscribers preserve tiansactional consistency and atomicity.
BfeJ>j (• |Metge publication -- Data can be updated at the Publisher or any Subscriber, i ^J/^ IChanges are merged periodically at the Publisher. This supports mobile, ^4ir ioccasionally connected Subscribers.
< Sack
Next >
Cancel
Help
Рис. 14.35. Окно Select Publication Type мастера Create Publication Wizard 2<J
Create Publication Wizard Specify Subscriber Types What types of Subscribers will subscribe to this publication"? Select all of the types of Subscribers that you expect to subscribe to this publication. ^ sL?f.Y.?r
' erver 200Q
Г" Servers running SQL Server version 7.0 Г" Heterogeneous data sources/such as Oracle or Microsoft Access, or devices running SQL Server for Windows CE Subscribers that are servers running SQL Server version 7.0 cannot use properties that are new in SQL Server 2000. If you select this Subscriber type, the new properties will not be available in this wteard.
<£ack
Next>
Cancel
Help
Рис. 14.36. Окно Specify Subscriber Types мастера Create Publication Wizard
Часть III. Администрирование
650
Максимальные возможности предоставляет публикация, созданная только для подписчиков SQL Server 2000. Поддержка подписчиков SQL Server 7.0 приведет к уменьшению количества дополнительных возможностей, тогда как поддержка других подписчиков приведет к созданию простейшего типа публикации. В первую очередь нас интересуют нововведения, доступные при работе с SQL Server 2000. Поэтому необходимо установить лишь первый флажок. После выбора типа подписчиков можно переходить к конфигурированию статей публикации, для чего служит следующее окно мастера — Specify Articles (рис. 14.37). Как видно из рисунка, основную часть окна занимают две таблицы. Левая предназначена для выбора типа объектов, которые будут доступны для создания статьи. Create Publication Wizard
Specify Articles
Publish tables and other database objects as articles. You can filter the published data latei in the wizard.
A uniqueidentifier cou l mn wil be added automaticaly to published tables without one. Object Type
iShow : Publish/
0 0 0 0 0 0 0
1 Owner Object dbo Categories dbo Customers _^J dbo EmployeeTerritories >ZJ dbo Empo l yees i^l dbo Empo l yee Sales by Country P dbo Sales by Year <3 dbo Sae l sByCategory oV dbo Sales Totals by Amount
Article defaults.. < gack
Next >
Cancel
Help
Рис. 14.37. Окно Specify Articles мастера Create Publication Wizard
Замечание
^
Если вы работали с репликацией сведением SQL Server 7.0, то наверняка заметили, что теперь статья может быть создана не только на основе таблицы (Tables), но и на основе хранимых процедур (Stored procedures), представлений (Views) и определяемых пользователем функций (User-defined functions). Это значительное расширение возможностей подсистемы репликации. Однако, при установке в предыдущем окне флажка Server running SQL Server version 7.0 статью можно будет создать только на основе таблицы.
Замечание При создании публикации для репликации транзакций также будет доступно создание статей на основе индексированных представлений.
Глава 14. Репликация данных
651
В правой части окна имеется таблица, с помощью которой можно выбрать тот или иной объект для создания на основе его статьи. Для этого достаточно установить флажок в самом левом столбце в соответствующей строке. По умолчанию в этой части окна выводятся только имена таблиц. Чтобы сделать доступными объекты других типов, необходимо установить флажок в столбце Show в левой таблице для соответствующего типа объектов. Установка флажка в столбце Publish All позволяет сконфигурировать все объекты соответствующего типа в качестве статей.
Замечание При установленном флажке Show unpublished objects в правой таблице будут отображаться все объекты выбранных типов данных. Если же сбросить указанный флажок, то будут перечислены только объекты, разрешенные для публикации. Репликация объектов каждого типа имеет свои особенности. Управление свойствами копирования объектов выполняется с помощью окна свойств статьи, открыть которое можно кнопкой А, расположенной в самом правом столбце. Конкретный набор свойств для каждого типа объектов различен. Мы не будем сейчас останавливаться на конфигурировании свойств статьи, оставив это для следующего раздела. С помощью кнопки Article Defaults можно открыть окно свойств копирования статей разных типов. Эти значения будут использоваться для всех статей, для которых явно не было указано иных параметров. После того, как будут выбраны все необходимые статьи, можно переходить к следующему окну мастера — Article Issues (рис. 14.38). В этом окне выводится список замечаний к выбранным для публикации объектам. В верхней части окна предлагается краткое описание требования, тогда как в нижней части дано детальное описание с перечислением конкретных объектов и замечаний в зависимости от выбранного пункта в верхней части. Как видно, количество замечаний к публикуемым данным довольно значительно. Но это вовсе не означает, что создание публикации будет отложено до тех пор, пока вы не устраните указанные замечания. Все нужные изменения будут выполнены автоматически мастером создания публикации. Назначением рассматриваемого окна скорее является знакомство пользователя с изменениями, которые необходимо выполнить.
Замечание Вполне возможно, что эти изменения отрицательно скажутся на работе разработанных вами приложений, поэтому следует внимательно изучить их. Так как в окне Article Issues не требуется конфигурировать никаких элементов управления, то после прочтения приведенной информации можно смело переходить к очередному окну мастера — Select Publication Name and Description (рис. 14.39). Данное окно, позволяет указать имя публикации и ввести ее краткое описание, что впоследствии поможет быстро вспомнить назначение этой публикации. Название публикации вводится в поле Publication name. По умолчанию присваивается то же имя, что имеет база данных, объекты которой публикуются в
652
Часть III. Администрирование
создаваемой публикации. Описание же публикации приводится в поле Publication description. Мастер автоматически генерирует вариант примечания, включающий имя публикуемой базы данных, имя сервера-издателя, а также тип репликации. Однако пользователь может указать любое другое примечание.
Create Publication Wizard Article Issues The folowing si sues may lequire changes to your application to ensure it contn i ues to operate as expected. Un iN ue iITe ioeu co lsmrenq suwi taP bLC sTO ID Ea Td Yncth lrm nu irelthbeeNaOdTdeFd ORtoRE IeA I N option. Tabe l s referenced by ve i ws are required. Obe j cts referenced by stored procedures are required. .Description: SQL Server requires that all merge articles contain a uniqueidentifier column with a unique index and the ROWGUIDCOL property. SQL Server will add a uniqueidentifier column to published tables that do not have one when the first snapshot is generated. Adding a new column will: > Cause INSERT statements without column lists to fail » Increase the size of the table
< Sack
Next >
Cancel
Рис. 14.38. Окно Article Issues мастера Create Publication Wizard Create Publication Wizard Select Publication Name and Desciiption Select a name and description for this publication.
;
#
Publication name: N
3
;
o
r
u
M
t
b
l
e
h
i
r
w
c
g
i
a
n
t
e
o
i
p
j
o
n
u
d
b
l
i
e
c
s
a
c
t
r
i
i
o
p
t
n
i
o
o
f
n
:
N
o
r
t
h
w
i
n
d
d
a
i
v
t
a
b
a
D
i
s
e
f
r
o
m
P
u
b
l
e
x
i
s
h
e
r
S
T
O
R
A
G
E
.
•• ~
T
L
h
e
i
s
p
>
u
b
t
h
i
l
i
c
s
p
a
t
u
i
b
o
l
n
i
c
n
a
a
t
m
i
o
e
n
i
c
n
a
t
n
h
c
e
o
A
n
c
t
t
a
i
n
e
a
n
<
y
f
i
a
r
e
c
h
c
c
a
k
t
o
r
r
a
y
c
t
e
r
c
N
e
e
p
t
x
*
t
>
[
]
\
I
/
<
>
:
"
C
7
a
o
n
c
e
t
l
Z
••
.
|
Рис. 14.39. Окно Select Publication Name and Description мастера Create Publication Wizard
Глава 14. Репликация данных
653
Помимо двух описанных текстовых полей, в окне имеется еще флажок List this publication in the Active Directory, который по умолчанию сброшен. Устанавливая его, можно поместить информацию о публикации в базу данных Active Directory. Это позволит пользователям подписываться на публикацию, не зная ни имени сервера-издателя, ни его местоположения в сети. Перейдем же к рассмотрению следующего окна мастера — Customize the Properties of the Publication (рис. 14.40). Его назначением является выбор стратегии управления некоторыми свойствами публикации (фильтрации данных, разрешение анонимных подписчиков и т. д.). Как видно из рисунка, в распоряжении пользователя имеется единственный переключатель: • Yes, I will define data filters, enable anonymous subscriptios, or customize other properties. Если вы хотите сами управлять свойствами создаваемой публикации, то следует установить переключатель в рассматриваемое положение. В этом случае мастер предложит ряд дополнительных окон, с помощью которых и необходимо будет сконфигурировать те или иные свойства. Create Publication Wizard Customize the Properties of the Publication Define data filters or customize the remaining properties; otherwise, create the publication as specified. Do you want to define data filters or customize the lernaining properties of this publication? С Yes, I will define data filters, enable anonymous subscriptions, or customize other properties (* iNci,.,ciea!'
ji
,
Create a merge publication from database 'Northwind'. The following types of Subscribers may subscribe to this publication: Serveis running SQL Server 2000 Publish the following tables as articles: 'Categories' as 'Categories' 'Customers' as 'Customers' 'EmployeeTerritories' as 'ErnployeeTerritoiies'
< Back
Next>
zl Cancel
Hep l
Рис. 14.40. Окно Customize the Properties of the Publication мастера Create Publication Wizard
П No, create the publication as specified. При установке переключателя в это положение вся работа по конфигурированию соответствующих свойств публикации будет возложена на мастера. Данный вариант в полной мере подходит для пользователей, еще не овладевших в полной мере конфигурированием публикаций, а также часто используется в том случае, когда предлагаемые по умолчанию значения являются удовлетворительными. В нижней части окна указывается, какие действия выполнит мастер при выборе рассматриваемой
Часть III. Администрирование
654
стратегии. В частности, мастер не будет применять никаких фильтров при формировании статей, не разрешит подписываться на публикацию анонимным подписчикам и установит время запуска агента Snapshot Agent каждое воскресенье в 23:30. Этот агент также будет запущен сразу же после завершения работы мастера для подготовки файлов моментальных снимков. Автоматическое управление свойствами публикации особого интереса не представляет. Поэтому мы рассмотрим ручное конфигурирование свойств. То есть необходимо установить переключатель в верхнее положение.
Замечание Однако и при выборе этого варианта мастер по возможности максимально автоматизирует конфигурирование параметров путем установки для элементов управления определенных значений. Эти значения соответствуют значениям, используемым мастером при автоматическом конфигурировании. Итак, переходим к следующему окну, которое будет называться Filter Data (рис. 14.41), назначением которого является выражение пользователем желания (или нежелания) выполнять горизонтальную и вертикальную фильтрацию данных. Как видно из рисунка, для этого существует два флажка: • Vertically, by filtering the columns of published data. Установка этого флажка свидетельствует о необходимости выполнения вертикальной фильтрации данных, т. е. включения в сконфигурированные на основе таблиц статьи не всех столбцов, а лишь некоторых из них; Create Publication Wizard Filter Data Filter the data to be included in this publication. How do you want to filter this publication? P Vertically, by filtering the cou l mns of published data Г? |H
ra
the rows of published data
< Back
Next>
Cancel
Рис. 14.41. Окно Filter Data мастера Create Publication Wizard
Help
Глава 14. Репликация данных
655
П Horizontally, by filtering the rows of published data. При установке этого флажка будет выполнена горизонтальная фильтрация статей, что реализуется путем указания логического условия. Если строка таблицы удовлетворяет этому условию, то она окажется включенной в статью. В противном же случае строка не станет реплицироваться.
(
Замечание
^,
Необходимо отметить, что фильтрация (как горизонтальная, так и вертикальная) применяется только для статей, созданных на основе таблиц. Все другие типы статей, в том числе и созданные на основе обычных и индексированных представлений, публикуются полностью. Установка каждого из указанных флажков приведет к выводу мастером дополнительных окон, в которых и необходимо будет указать условия фильтрации данных. Рассмотрим создание публикации, использующей как горизонтальную, так и вертикальную фильтрацию. Итак, устанавливаем оба флажка в окне Filter Data и переходим к следующему окну, которое имеет имя Filter Table Columns (рис. 14.42). Оно разделено на две части, в каждой из которых имеется таблица. В левой части окна перечислены все таблицы, предназначенные для публикации. В правой же части окна приведен список всех столбцов, имеющихся в таблице, выбранной в левой части окна. Устанавливая флажок слева от имени того или иного столбца, вы тем самым разрешаете включение его в статью. По умолчанию в статью включаются все столбцы таблицы. Как видно из рисунка, некоторые столбцы не могут быть исключены из статьи. Это связано с тем, что на них ссылается какой-то из публикуемых объектов (представление, функция или хранимая процедура), и их исключение приведет к невозможности работы этих объектов. Также нельзя исключить из статьи и столбец с первичным ключом. После того, как для всех таблиц или только части из них будут указаны вертикальные фильтры, можно переходить к следующему окну мастера — Enable Dynamic Filters (рис. 14.43). Назначением данного окна является разрешение (положение переключателя Yes,, enable dynamic filters) или запрещение (No, use static filters) поддержки публикацией динамических фильтров. Использование динамических фильтров позволяет подписчикам самим формировать логическое условие, в соответствии с которым будет осуществляться отбор строк, предполагаемых к включению в публикацию. Таким образом, каждый подписчик может работать с уникальным набором строк, что позволяет избежать пересылки ненужной информации.
С~
Замечание
^
Использование динамических горизонтальных фильтров ни в коей мере не мешает функционированию механизмов разрешения конфликтов. Естественно, при использовании динамических фильтров для каждого подписчика необходимо формировать свой собственный набор данных, что и реализу22 Зак. 83
Часть III. Администрирование
656
ется. При этом для каждого подписчика может создаваться персональный моментальный снимок, который будет включать только выбранные им данные. Такой моментальный снимок называется динамическим моментальным снимком (dynamic snapshot). Create Publication Wizard Filter Table Columns Exclude unwanted table cou l mns from the articles in your publication. Select a table, and then clear the check boxes in the cou l mn list to exclude unwanted columns. Tables in publication: Owner Table dbo Categories dbo Customers dbo EmployeeT... dbo Employees
i
{Article Categories Customers EmployeeT... Employees I I
1
< Back
Columns in selected table ;Column Name Data Type (Base ... •* у ErnployeelD int 3 LastName nvarchar 0 FirstNarne nvaichar — nvafchar ]ЦЭ1 П TitleOfCourtesy nvarchar 0 BirthDate datetirne 0 HireDate datetime nvaichar _U Щ Address •< 1 *\
Next>
Cancel
Help
Рис. 14.42. Окно Filter Table Columns мастера Create Publication Wizard
Create Publication Wizard -• JL
Enable Dynamic Fillers Enable filters that allow different Subscribers to receive different partitions of the published data.
ri
Do you want to enable dynamic filters? ^* b С
filters?
No, use static filters
If you enable dynamic filters, you can create dynamic snapshots that contain only the data needed by a particular Subscriber. Dynamic snapshots allow subscriptions to be initialized more efficiently. To create a dynamic snapshot, create the publication and create a normal snapshot. Then right click on the publication in the server tree and click Create Dynamic Snapshot Job.
< Back
Next >
Cancel
Help
Рис. 14.43. Окно Enable Dynamic Filters мастера Create Publication Wizard
Глава 14. Репликация
данных
657
Замечание Чтобы разрешить для публикации поддержку динамических моментальных снимков, необходимо в контекстном меню публикации выбрать команду Create Dynamic Snapshot Work и с помощью открывшегося диалогового окна сконфигурировать нужные параметры. Более подробно эта процедура будет рассмотрена далее в этой главе.
Раз уж мы решили рассматривать все возможности подсистемы репликации SQL Server 2000, то разрешим и поддержку динамических фильтров, установив переключатель в верхнее положение. Следующее окно мастера, имеющее имя Generate Filters Automatically (рис. 14.44), предназначено для конфигурирования для одной из таблиц так называемого расширяемого фильтра (extend filter), который будет автоматически отображаться на другие таблицы на основе установленных между ними отношений. В раскрывающемся списке Table to filter необходимо выбрать имя таблицы, для которой будет определяться фильтр. По умолчанию в списке появляется значение None — do not extend filter, что говорит о ненужности указания фильтра. Однако в списке также можно выбрать имя любой их публикуемых таблиц, после чего станет доступным поле в нижней части окна. В этом поле указывается шаблон запроса SELECT, на основе которого будет формироваться соответствующая статья. Собственно условие указывается в разделе WHERE. К сожалению, мастер не предлагает графического интерфейса для построения горизонтального фильтра, поэтому придется вручную вводить в поле соответствующий код. Create Publication Wizard Generate Filters Automatically Specify a filter on one table, and SQL Server wil extend it to other tables based on defined relationships. Select a table that contains either the data you want or links to the data. iable to filter: |[dbo]. [Employees] jj Compe l te the following WHERE clause to specify the rows to be included in the article. SELECT published_columns: FROM [dbo] [Employees] WHERE TitleOfCourtesy « Ms J±T For example, to include rows only for Oho i businesses in a table named contact, type: contact.state • 'OH'
< Back
Next>
Рис. 14.44. Окно Generate Filters Automatically мастера Create Publication Wizard
Cancel
Help
Часть III. Администрирование
658
Замечание Подробно запрос S E L E C T , и в частности раздел WHERE, будет рассмотрен в главе 29. Сейчас же скажем, что простейшие условия предполагают использование
имен столбцов таблицы, сравниваемых с константой. Возможно объединение двух и более условий с помощью операторов OR И AND. При работе с динамическими фильтрами допускается применение функций, возвращаемое значение которых зависит от подписчика. После того, как работа с окном Generate Filters Automatically будет завершена, можно переходить к очередному окну — Filter Table Rows (рис. 14.45), предназначеному для указания персональных фильтров для каждой из публикуемых таблиц. Помимо этого, также можно задать применение сконфигурированного в предыдущем окне расширяемого фильтра. Как видно, окно разделено на две части. В верхней части перечислены все публикуемые таблицы с указанием имени (столбец Table) и владельца (столбец Owner) самой таблицы, а также имени публикации (столбец Article). Помимо этого, в столбце Filter Clause выводится условие фильтрации строк, представляющего собой часть запроса SELECT, а точнее раздел WHERE. ПО умолчанию публикуются все строки таблицы, о чем свидетельствует значение . Исключением является таблица, для которой в предыдущем окне был определен расширяемый фильтр. Create Publication Wizard
2<J
Filter Table Rows Exclude unwanted rows from the articles in your publication.
Click the build (...) button to filter the rows of an article:
Owner
dbo dbo
! Table
: Article
I Filter Clause
EmployeeTerritories ErnployeeTerritories < All rows published > Employees Employees TitleOfCourtesy = 'Mr.'
il _ _ _ _ _ Extend filtering on a table to a related table by defining a join between the Filtered Table and the Table to Filter: Filtered Table [dbo].[Employees]
IJOIN Filter Clause [dbo].[EmployeeTerritories] [EmployeeTetritories].[Employeel.
Table to Filter
< Create JOIN >
JjJ
Next >
Cancel
Help
Рис. 14.45. Окно Filter Table Rows мастера Create Publication Wizard
Для ввода или изменения условия фильтрации таблицы используется окно Specify Filter (рис. 14.46), открыть которое можно с помощью кнопки имеющейся в самом правом столбце каждой строки верхней таблицы окна.
Глава 14. Репликация данных
659
Specify Filter
^
ьlable to filter:
j[dbo]. [Employees]
Artc ie l name:
(Employees
Complete the WHERE clause in the following SELECT statement. The clause should specify the rows from '[dbo].[Employees]' to be included in this article. SELECT . published_columns FROM [dbo] [Employees] WHERE TitleOfCourtesy - Mr.'
For example, to include only rows from a table named sales that are needed by each subscriber (user), type: sales.rep = HQST_NAME()
OK.
Cancel
Help Рис. 14.46. Окно Specify Filter
В поле Table to filter окна Specify Filter указывается владелец и имя таблицы, для которой предполагается установить фильтр. В поле Article name задается имя статьи, созданной на основе указанной таблицы. Значения в обоих полях изменять нельзя. Интерес же представляет область в центральной части окна, где выводится шаблон запроса SELECT, С ПОМОЩЬЮ которого будет формироваться статья. Напомним, что условие фильтрации указывается после ключевого слова WHERE. Допускается использование не только констант, но и подзапросов, обращающихся к непубликуемым таблицам, а также пользовательских и встроенных функций. Особый интерес представляет конфигурирование динамических фильтров. Такие фильтры подразумевают применение функций, возвращающий различные результаты в зависимости от того, для какого конкретно подписчика генерируется набор данных. Типичным примером являются функции SUSER_SNAME () и HOSTNAME (), возвращающие, соответственно, имя текущего пользователя и имя сервера. Возможность использования этих функций связана с тем, что запрос SELECT выполняется в контексте подписчика и указанные функции возвратят значения для подписчика, а не издателя или дистрибьютора. При конфигурировании динамических фильтров также можно вызывать пользовательские функции. Каждый из подписчиков при этом должен будет иметь указанную в фильтре функцию, но набор команд, логика работы и возвращаемые этими функциями значения могут различаться.
С
Замечание
Если с применением функции HOST_NAME ( ) , возвращающей имя сервераподписчика, проблем не возникает, то относительно функции S U S E R _ S N A M E () возникает вопрос — имя какого пользователя она возвращает? В обычном случае это
660
Часть III. Администрирование имя текущего пользователя, установившего соединение. В нашем конкретном случае — имя учетной записи, которая была использована для установления соединения между подписчиком и дистрибьютором. Напомним, что это может быть как учетная запись Windows NT, так и учетная запись SQL Server.
Как видно, в окне для таблицы Employees приведен следующий запрос: SELECT < p u b l i s h e d _ c o l u m n s > FROM [ d b o ] . [ E m p l o y e e s ] WHERE T i t l e O f C o u r t e s y = ' M r . '
Вместо конструкции будет подставлен список столбцов, выбранных для таблицы в окне мастера Filter Table Columns (см. рис. 14.42). Горизонтальный фиЛЬТр Представлен теКСТОМ WHERE TitleOfCourtesy = 'Mr.', что требует включения в статью только тех строк, которые имеют в столбце TitleOfCourtesy значение мг.. Вернемся же к окну Filter Table Rows (см. рис. 14.45). Мы рассмотрели работу с верхней таблицей, с помощью которой указываются горизонтальные фильтры для статей. Теперь же обратимся к нижней таблице. С ее помощью можно выполнять связывание таблиц. Подобное связывание позволяет избавиться от копирования ненужных данных и избежать проблем с нарушением ограничений целостности FOREIGN KEY.
Связывание таблиц базируется на применении раздела JOIN запроса SELECT. Подробно назначение и использование этого раздела будет рассмотрено в главе 29. Сейчас же скажем, что при использовании этого раздела указываются две таблицы и логическое условие, по которому будут связываться указанные таблицы. Эти данные и должны быть введены в трех столбцах таблицы: • Filtered Table — имя главной таблицы, которая будет определять диапазон публикуемых строк. Обычно в этой таблице имеется ограничение целостности PRIMARY KEY (первичный ключ); П Table to Filter — имя зависимой таблицы, которая связана с первой таблицей ограничением целостности FOREIGN KEY (внешний ключ); П JOIN Filter Clause — логическое условие, определяющее правила связывания таблиц. Обычно ЭТО просто выражение ТИПа table2.fkey = t a b l e l . p r k e y , но могут приводиться и более сложные выражения, состоящие из множества условий, связанных операторами AND И OR. Условие указывается с помощью окна Specify JOIN, работа с которым не имеет принципиальных отличий от работы с окном Specify Filter (см. рис. 14.46).
С
Замечание
J
В окне Specify JOIN нижняя таблица позволяет конфигурировать более одной связи между таблицами.
После того, как все фильтры и условия связывания таблиц будут определены, можно приступать к работе со следующим окном мастера Validate Subscriber Information (рис. 14.47). Оно предназначено для выбора стратегии обновления подписки при изменении значений, возвращаемых используемыми в динамиче-
Глава 14. Репликация данных
661
ском фильтре функциями. При установке переключателя в положение Yes, validate Subscriber information будет разрешена автоматическая повторная инициализация подписчика в случае изменения условий формирования статьи. При этом в текстовом поле необходимо ввести функцию, изменение которой станет отслеживаться подсистемой репликации. Предполагается, что это будет та же функция, которая была использована при формировании динамического горизонтального фильтра. Однако может быть указана любая другая функция. JSl Create Publication Wizard Validate Subscriber Information You can validate Subscriber information used in dynamc i filters automaticaly before s each merge. When the value of a function used in a dynamc i filter changes at a Subscriber, the subscription at that Subscriber must be reinitialized. Do you want to validate Subscriber information automatically? <"* Yes, validate Subscriber information
iNo, do not v
:(nation! <£ack
Next>
Cancel
Help
Рис. 14.47. Окно Validate Subscriber Information мастера Create Publication Wizard
Если нет нужды отслеживать изменение условий формирования статьи, то следует установить переключатель в положение No, do not validate Subscriber information. Однако, при этом пользователь обязан сам заботиться о синхронизации подписчика с издателем при изменении фильтра. Следующее окно мастера имеет название Optimize Synchronization. Единственным элементом управления этого окна является переключатель, с помощью которого можно либо разрешить (положение Yes, minimize the amount of data), либо запретить минимизацию (No, do not minimize the amount of data) передаваемых по сети данных. Как следует из названия следующего окна мастера (Allow Anonymous Subscriptions), оно предназначено для управления возможностью осуществления подписки на создаваемую публикацию анонимных подписчиков. Эта операция осуществляется с помощью переключателя, который может быть установлен в одно из двух следующих положений: • Yes, allow anonymous subscriptions. В этом случае на публикацию могут подписываться все пользователи, имеющие доступ к серверу.
662
Часть III. Администрирование
П No, allow only named subscriptions. Возможность подписываться на публикацию будут иметь только определенные пользователи, имена учетных записей который должен будет указать администратор. Очередное окно мастера, имеющее имя Set Snapshot Agent Schedule, предназначено для конфигурирования времени запуска агента. Snapshot Agent, создающего моментальные снимки. По умолчанию предлагается запустить агент один раз в 23:30 того же дня, в который создана публикация. С помощью кнопки Change можно открыть окно Edit Recurring Job Schedule, которое позволяет установить иное время запуска агента Snapshot Agent, чем предлагается по умолчанию. Замечание Если необходимо создать файлы моментального снимка при завершении работы мастера, то следует установить флажок Create the first snapshot immediately. На этом работа с мастером заканчивается. Следующее окно мастера будет последним. В нем приведена сводная информация о свойствах создаваемой публикации. Чтобы создать новую публикацию с указанными свойствами, остается только нажать кнопку Finish. Однако перед этим стоит внимательно ознакомиться с информацией о свойствах публикации. Дело в том, что некоторые параметры не могут быть изменены после ее создания. Нажатие кнопки Finish приведет к непосредственному созданию публикации с указанными в окнах мастера свойствами. В случае удачного завершения создания задания мастер выведет диалоговое окно с информацией о созданной публикации. Непосредственно из этого окна можно открыть окно свойств созданной публикации, для чего достаточно нажать кнопку Publication Properties. Однако работа с этим окном будет рассмотрена в следующем разделе.
Создание динамического моментального снимка В предыдущем разделе, при рассмотрении создания публикации репликации сведением, было сказано, что имеется возможность использования в горизонтальном фильтре функций, возвращающих различные значения в для каждого из подписчиков. Такие фильтры, зависящие от подписчика, называются динамическими фильтрами. Таким образом, каждый из подписчиков способен работать с индивидуальным набором строк, которые могут как пересекаться, так и нет. Независимо от того, используются ли фильтры вообще и являются они динамическими или нет, при инициализации репликации сведением необходимо выполнить первоначальную синхронизацию. Для этого агент Snapshot Agent подготавливает файлы моментальных снимков, которые затем применяются на подписчиках агентом Merge Agent. Тонкость при работе с динамическими фильтрами заключается в том, что в обычном случае для всех подписчиков создается один и тот же моментальный снимок, включающий все строки, которые потенциально могут быть опублико-
Глава 14. Репликация данных
663
ваны. Подобный метод позволяет гарантировать, что каждый из подписчиков будет иметь все строки, удовлетворяющие условию динамического фильтра. Однако, как не трудно заметить, при этом ему будет передано и множество ненужной информации, которая предназначена для других подписчиков. Хотя эти данные и не мешают работе корректно написанных приложений, учитывающих подобное положение дел, отрицательные стороны налицо. Самой большой проблемой является загрузка сети. При использовании медленных каналов может копироваться достаточно много ненужной информации, что занимает массу времени и может обойтись в довольно "кругленькую" сумму. В SQL Server 2000 имеется возможность свести к# минимуму непроизводительные затраты Это решается путем использования динамических моментальных снимков (dynamic snapshot), которые представляют собой набор данных, специфичных для конкретного подписчика. Таким образом, при работе с динамическими моментальными снимками будет создаваться не один универсальный моментальный снимок, а множество снимков, каждый из которых предназначен для конкретного подписчика. Таким образом, для одной и той же публикации на дистрибьюторе будет храниться множество моментальных снимков. Мастер создания публикации конфигурирует создание моментальных снимков для публикации стандартным образом. То есть для всех подписчиков будет подготавливаться один универсальный моментальный снимок. Пользователь должен будет выполнить некоторые дополнительные операции, чтобы разрешить генерирование для публикации динамических моментальных снимков. Эта операция выполняется с помощью мастера Create Dynamic Snapshot Wizard, который работает со стандартным универсальным моментальным снимком, выбирая из него данные, удовлетворяющие конкретным значениям динамического фильтра. В результате работы мастера будет создан лишь один из множества возможных вариантов динамических моментальных снимков. Таким образом, для каждого из подписчиков необходимо персонально запускать мастера и подготавливать динамический моментальный снимок. Если такой снимок для подписчика подготовлен не будет, то его первоначальная синхронизация станет выполняться с использованием стандартного моментального снимка. Для запуска мастера Create Dynamic Snapshot Wizard необходимо открыть папку Publications той базы данных, для которой была создана публикация, а затем выбрать имя нужной публикации репликации сведением и в ее контекстном меню указать пункт Create Dynamic Snapshot Job (рис. 14.48), после чего и откроется первое окно мастера Create Dynamic Snapshot Wizard.
(
Замечание
j
Прежде чем станет возможным запуск мастера Create Dynamic Snapshot Wizard, предварительно для публикации должен быть создан стандартный моментальный снимок. Если до запуска мастера он еще не был создан, то будет выдано диалоговое окно с соответствующим сообщением, и предложено создать моментальный снимок немедленно, запустив для этого агента Snapshot Agent. Следует согласиться с этим предложением и подождать, пока агент завершит создание моментального снимка. Необходимо отметить, что агент работает в фоновом режиме, и может ело-
664
Часть III. Администрирование житься впечатление, что он отработал. Однако агент успешно завершился, следует обратиться ружить в папке сервера Management\SQL Server гории REPL-Snapshot. В столбцах Status и Last просмотреть текущий статус задания (запущено пешность его выполнения.
чтобы быть уверенным в том, что к папке Jobs, которую можно обнаAgent, и найти в ней задание катеRun Status можно, соответственно, оно еще или уже отработало) и ус-
I* SQL Server Enterprise Manager - [Console Root\MitrosoK 50Л ServersX
Console Window Help View
Tools i Publications
ffl IJ msdb
_^J
Name ••
1 Item Type
] Description
ffl У MyDistrib El |^J Northwind « § Diagrams : j]S| Tables ; oV Views • ' й ' stored Procedures If? Users ; WRoles '. : [_] Rules О Defaults ; 0 ] User Defined Data" ^ User Defined Functi I I и PiJ Publications : ! ^ t Northwind : £ j Full-Text Catalogs Щ-ф pubs Ш У ternpdb S; U3 Data Transformation Servic В _ J Management Й S1^ SQL Server Agent ; . 0 Alerts , • ; . Ш Operators • : ' f©j Jobs : • --ySi Backup ;M Llil Current Activity •••••• \$ Database Maintenance >rj __J _>|*~^
New Publication... Push New Subscription... View Conflicts... Reinitialize All Subscriptions Explore the Latest Snapshot Folder Create Dynamic Snapshot Job...
:
:
;
:
:
; ;
;
;
_<J
; ; \
1 ; \
'
'
Generate SQL Script.., New Window from Here Delete Refresh Properties Help
1
Рис. 14.48. Папка Publications
Содержание первого окна мастера Create Dynamic Snapshot Wizard вполне традиционно. В нем приводится общая информация о действиях, которые должен будет выполнить мастер. Так как никаких полезных элементов управления в этом окне не предлагается, можно смело переходить к следующему окну. Во втором окне мастера, имеющем имя Specify Filter Values (рис. 14.49), указываются значения для одной или обеих функций, используемых в динамическом фильтре — HOST_NAME () и SUSER_SNAME (). Эти значения подставляются в динамический фильтр вместо названий соответствующих функций, после чего производится выборка данных. Например, если в качестве условия динамического фильтра была задана конструкция WHERE Row0wner=H0ST_NAME(), а во втором окне мастера в верхнем поле указано значение STORAGE, TO мастер выполнит следующий запрос: SELECT < с п и с о к с т о л б ц о в > FROM <имя таблицы> WHERE RowOwner = 'STORAGE'
Глава 14. Репликация данных
665
Create Dynamic Snapshot Job Wizard Specify Filter Values Specify the filter values that identify the partition of the published data for this dynamic snapshot.
Enter values for one or both of the dynamic filter functions. Value of H0ST_NAME(): Value of suser_snarne(), the login used by Subscriber(s) to connect to the Publisher:
< Back
Next>
Cancel
Help
Рис. 14.49. Окно Specify Filter Values мастера Create Dynamic Snapshot Wizard
В результате будет получен динамический моментальный снимок для сервераподписчика STORAGE. Аналогично используется и вторая функция. К сожалению, мастер не позволяет работать с пользовательскими функциями, поэтому динамический моментальный снимок можно построить только с учетом двух указанных встроенных системных функций. Однако при грамотном подходе и этих возможностей может быть вполне достаточно. Замечание Необходимо будет запустить мастер для всех возможных значений функций, используемых в динамическом фильтре, чтобы обеспечить всех подписчиков динамическими моментальными снимками. Однако можно создать такие снимки лишь для нескольких подписчиков, использующих медленные каналы связи или для которых нежелательно наличие лишних данных.
Когда значения для функций будут указаны, можно переходить к третьему окну мастера (рис. 14.50). Как видно из рисунка, это окно имеет имя Specify Snapshot File Location, которое и определяет назначение этого окна — указание каталога, в котором будут сохранены файлы моментального снимка. Может быть задан как каталог, расположенный на локальном диске, так и сетевой ресурс (в том числе и ссылающийся на локальные диски). Из указанного каталога впоследствии агент Merge Agent и будет копировать файлы моментального снимка при выполнении первоначальной синхронизации соответствующего подписчика.
С
Замечание
Для каждого из динамических моментальных снимков необходимо указывать персональный каталог. Это связано с тем, что файлы моментального снимка всегда име-
666
Часть III. Администрирование ют одни и те же имена. Таким образом, если попытаться указать для двух снимков один и тот же каталог, то записанные ранее файлы будут затерты более новыми.
Create Dynamic Snapshot Job Wizard Specify Snapshot File Location Specify a network path to the folder in which to create the snapshot files.
Network path to the snapshot folder: ]V\storage\snapshot$\dynsnap5 Note: Do not select a folder currently used for other snapshots.
< Back
Next >
Cancel
Рис. 14.50. Окно Specify Snapshot File Location мастера Create Dynamic Snapshot Wizard Create Dynamic Snapshot Job Wizard Set Job Schedule Set the starting schedule for the dynamic snapshot job.
When should the Snapshot Agent run the dynamic snapshot job7 (* IRun the job on the following scb> Occurs every 1 week(s) on Saturday, at 23:49:00.
Change..
I <"" Ryn the job on demand only Create the first snapshot immediately
< Back
Cancel
Рис. 14.51. Окно Set Job Schedule мастера Create Dynamic Snapshot Wizard
Глава 14. Репликация данных
667
С помощью следующего окна мастера, имеющего название Set Job Schedule (рис. 14.51) выполняется конфигурирование времени запуска агента Snapshot Agent для создания файлов динамического моментального снимка с указанными параметрами. Дело в том, что мастер Create Dynamic Snapshot Wizard создает новое задание для службы SQLServerAgent, которое запускает агента Snapshot Agent с параметрами, обеспечивающими создание динамического моментального снимка. Как и любое другое задание, оно может иметь свое расписание запуска, независимое от запуска задания, подготавливающего стандартный универсальный моментальный снимок. Стратегия запуска агента, а следовательно и генерирования файлов, определяется с помощью переключателя, расположенного в центральной части окна: • Run the job on the following schedule. В этом случае создание файлов будет выполняться периодически на основе определенного расписания. По умолчанию предлагается подготавливать файлы раз в неделю каждое воскресенье, запуская для этого агента Snapshot Agent в 23:49. С помощью кнопки Change можно открыть окно Edit Recurring Job Schedule, в котором возможно установить любое другое расписание. Таким образом, используя периодический автоматический запуск задания, разрешается обновлять файлы динамического моментального снимка, который может быть использован для повторной синхронизации подписчика. • Run the job on demand only. При установке переключателя в это положение создание файлов моментального снимка будет производиться только по требованию пользователя. Для этого необходимо будет найти в папке Managem e n t SQL Server Agent\Jobs соответствующее задание и запустить его. Помимо определения правил генерирования файлов динамического моментального снимка в будущем, в окне также можно определить, станет ли создаваться моментальный снимок непосредственно после завершения работы мастера. Для этого предназначен флажок Create the first snapshot immediately, установка которого активизирует агента Snapshot Agent для подготовки моментального снимка непосредственно после завершения работы мастера. После того, как будут указаны параметры запуска задания, можно переходить к окну мастера Specify Job Name, предназначенному для указания имени, которое будет присвоено создаваемому мастером заданию. По указанному имени задание впоследствии может быть найдено в папке Management SQL Server Agent\Jobs и запущено вручную. По умолчанию для задания предлагается имя, основанное на имени публикации, к которому добавлено '_Dynamic'. Однако, при организации для публикации второго динамического моментального снимка использовать это имя уже нельзя и необходимо будет выбрать другое. На этом работа мастера заканчивается. Следующее окно является последним. В нем приведена сводная информация о свойствах создаваемого динамического моментального снимка. Если вся информация верна, то остается только нажать кнопку Finish для физического создания соответствующего задания, а возможно (в зависимости от указанных параметров), и его исполнения.
668
Часть III. Администрирование
Для созданной в предыдущем разделе публикации и при указанных в приведенных в окнах мастера параметрах будет создан моментальный снимок, состоящий из 33 файлов объемом немногим больше 200 Кбайт. На рис. 14.52 приведено содержимое папки DynSnap5, в которой расположены файлы моментального снимка. Подобный набор файлов необходимо подготовить для каждого из подписчиков.
С
Замечание
Как нетрудно заметить из рисунка, сетевое имя Wstorage\snapshot$\Dynsnap5, указанное в окне мастера Specify Snapshot File Location (см. рис. 14.50), ссылается на локальную папку C:\Tmp\Dynsnap5. То есть сетевой ресурс \\storage\snapshot$ связан с локальной папкой C:\Tmp. Щ C:\Tmp\DynSnap5 !
File
Edit
~X
View
:
Favorites
'"' Ь—"1
Tools
Help
Name •' j j j Categories_l 1 .bcp
Size
Type
| Modified
85 KB
BCP File
ls*jjCategories_12.sch
1 KB
SCH File
07.11.2000 13:32
D y n S n a p 5
S]Categories_15.cft
3 KB
CFT File
07.11.2000 13:32
i*i]Categories_16.trg
1KB
TRG File
07,11.2000 13:32
Select an item to view its description.
j i i ] Categones_17.dri SjCustomersJO.dri
1 KB DRI File
07,11.2000 13:32
1 KB DRI File
07.11.2000 13:32
07.11.2000 15:10
^]Customers_4.bcp
24 KB
BCP File
07.11.2000 15:10
Mv_Docurnents
i«]cu5tomers_5.sch
2KB
SCH File
07,11,2000 13:31
My Network places
Й Customers_8.cft
3 KB
CFT File
07.11,2000 13:32
мя_с°ш£ег.
£]Gjstomers_9,trg j * | Employee_Sales_by_Country_37.sch
1 KB
TRG File
07.11.2000 13:32
See also:
2KB
SCH File
07.11.2000 13:32
W] Employees_18.bcp
67 KB
BCP File
07,11.2000 15:10
b*| Employees_19.sch
2KB
SCH File
07,11.2000 13:32
jj»|Employees_22.cft
3 KB
CFT File
07,11.2000 13:32
W)Employees_23.trg
1KB
TRG File
07,11.2000 13:32
y»|Employees_24.dri
1KB
DRI File
07.11.2000 13:32
Й ErnployeeTerritories_25, bcp
2KB
BCP File
07,11.2000 15:10
Й Employee Territories_26.sch
1 KB
SCH File
07,11,2000 13:32
№]EmployeeTerricories_29.cft
3 KB
CFT File
i*j] EmployeeTerritories_30.trg
1 KB
TRG File
07,11.2000 13:32 07.11.2000 13:32
i*] EmployeeTerritories_31 ,dri
1 KB DRI File
07,11.2000 13:32
sjflFuncl_41.sch
1 KB SCH File
07.11.2000 13:32
j * ] M5merge_contents, bcp
OKB
BCP File
07.11,2000 15:10
M) MSmerge_contents_50,sch
1 KB SCH File
07.11.2000 13:32
!*) MSmerge_genhistory, bcp
1KB
BCP File
07.11,2000 15:10
И ] MSmerge_genhistory_52.sch
1KB
SCH File
07.11.2000 13:32
I*) MSmerge_tombstone. bcp
OKB
BCP File
07.11,2000 15:10
iaj] MSmerge Jombstone_51 .sch
1KB
SCH File
07,11,2000 13:32
S ] Sales_by_Year_l .sch
1KB
5CH File
07.11,2000 13:31
I*] Sales_Totals_by_Amount_45. sch
2KB
SCH File
07.11,2000 13:32
_
Рис. 14.52. Набор файлов динамического моментального снимка
При создании подписки с помощью мастера последний не выполняет автоматического поиска динамического моментального снимка, а по умолчанию использует стандартный универсальный моментальный снимок, который хранится на дистрибьюторе в папке ReplData. Однако мастер допускает указание произвольного каталога, из которого следует получать файлы моментального снимка. Используя эту возможность, следует указать каталог с файлами динамического мо-
Глава 14. Репликация данных
669
ментального снимка и установить флажок This is a snapshot for a dynamically filtered subscription. Более подробно создание подписки будет рассмотрено в одном из следующих разделов этой главы.
Конфигурирование публикации В этом разделе будет рассмотрено управление общими свойствами публикации. Хотя мы будем рассматривать свойства публикации репликации сведением, отличия между публикацией этого типа и публикациями репликацией транзакций и репликацией моментальных снимков хоть и весьма заметны, но не глобальны. Таким образом, приведенная в разделе информация может быть использована и при работе с публикациями репликации сведением или репликации моментальных снимков.
Общие сведения Управление созданной публикацией осуществляется с помощью окна Publication Properties (рис. 14.53). Как видно из рисунка, это окно имеет одиннадцать вкладок, с помощью которых осуществляется управление той или иной группой свойств. Первая вкладка окна называется General и позволяет ознакомиться или изменить общие свойства публикации. Рассмотрим элементы управления, доступные на этой вкладке: • Name. В этом поле указывается имя, присвоенное публикации при создании. Изменить его после создания публикации нельзя, поэтому поле доступно только для чтения. О Database. Это поле, как и предыдущее, доступно только для чтения. В нем отображается имя базы данных, для которой была создана публикация. П Description. Указывается краткое описание созданной публикации. В отличие от первых двух полей, информацию в этом поле можно изменять. П Туре — тип репликации (моментальных снимков, транзакций или сведением). • List this publication in the Active Directory. Установка этого флажка предписывает включить описание публикации в базу данных Active Directory, что позволит подписчикам находить публикацию, не зная ни имени сервера-издателя, ни его местонахождения в сети. П Subscription expiration. С помощью этого переключателя можно управлять удалением подписок, не синхронизированных длительное время: •
Subscriptions expire and are dropped if not synchronized in the following number of days — при установке переключателя в это положение необходимо будет указать количество дней, в течение которых подписчик должен выполнить синхронизацию изменений, установив для этого соединение с дистрибьютором. Если за указанный срок это выполнено не будет, то соответствующая подписка окажется удаленной. Однако это вовсе не
Часть III. Администрирование
670
означает, что будут удалены и реплицированные на подписчика данные. Просто в дальнейшем не станет выполняться синхронизация изменений. Позже подписчик может повторно подписаться на публикацию. •
Subscriptions never expire — в этом случае не устанавливается никаких ограничений на период, в течение которого будет ожидаться синхронизация изменений подписчика с данными, хранящимися на дистрибьюторе.
Перейдем к следующей вкладке, имеющей имя Articles. Publication Properties - North wind Snapshot ] Snapshot Location j Publication Access List | Sync Partners J Status General j| Articles | Filter Cou l mns | Filter Row | Subscriptions j Subscription Options ЩЛ
Name:
I North wind
Identification database:
INorthwind
Description:
Merge publication of Northwind database from Publisher STORAGE.
Type:
Merge
Г" List this publication in the Active Directory Subscription expiration -•-•-
-
—•
t* Subscriptions expire and are dropped if not synchronized in the following number of days: f 4 Subscriptions never expire
OK
Cancel
Apply
Help
Рис. 14.53. Вкладка General окна свойств публикации
Управление статьями Вкладка Articles (рис. 14.54) предназначена для управления статьями, входящими в публикацию. Окно разделено на две части. В расположенной слева таблице перечислены типы объектов, которые могут быть включены в качестве статей в публикацию репликации сведением. Необходимо отметить, что этот список неполон — в нем не хватает индексированных представлений, которые доступны для публикации только при работе с репликацией транзакций и репликацией моментальных снимков. Устанавливая флажок в столбце Show, можно позволить отображение объектов соответствующего типа в правой таблице, с помощью которой собственно и осуществляется разрешение того или иного объекта для публикации.
Глава 14. Репликация данных
671
Publication Properties - Northwind
2£]
Snapshot | Snapshot Location j Publication Access List | Sync Partners j Status General L.._!.'!™?...:i| Filter Columns | Filter Rows | Subscriptions | Subscription Options Specify the objects to publish as articles. Click the properties (...) button to set the properties of an article.
Owner dbo dbo dbo dbo ; ^ 3 dbo в U dbo dbo dbo dbo
Object Type 1 Show Publish A| Tables 0 a |Z1 Stored Procedures 0 Views 0 2 Zl User Defined Fu... 0 Zl
S_hoM i unpublished objects
1,1
Article Defaults...
OK
Obe j ct Categore is Customers Empo l yeeTerrtiore i s ...: Empo lyees Empo lyee Sae l s by C. Sae l s by Year ... i Sae lsByCategory Sae l s Totasl by Amount ... \ Fund ... |
i Cancel
Apply
Рис. 14.54. Вкладка Articles окна свойств публикации
Однако вернемся к левой таблице. В ней имеется еще столбец Publish All. Устанавливая в этом столбце флажок в той или иной строке, вы тем самым предписываете опубликовать все объекты соответствующего типа. Непосредственно ниже таблицы находится флажок Show unpublished objects, помечая который можно разрешить отображение в правой таблице объектов выбранных типов, не включенных в публикацию в качестве статей. По умолчанию этот флажок сброшен и отображаются только те объекты, которые уже были ранее опубликованы.
Свойства по умолчанию Репликация объектов каждого типа имеет свои особенности и может выполняться по-разному. Например, при репликации таблиц, имеющих столбецсчетчик, необходимо определить правила генерации значений в этом столбце на каждом из подписчиков. Управление подобными свойствами осуществляется с помощью окна свойств статьи. Для каждого типа статей это окно содержит различный набор вкладок с индивидуальным набором элементов управления. Помимо того, что имеется возможность управления свойствами репликации отдельной статьи, для статей каждого типа также можно указать свойства, которые будут использоваться для статей по умолчанию. То есть в том случае, когда для статьи персонально не было указано никаких свойств. Для управления свойствами по умолчанию следует нажать кнопку Article Defaults в нижней части вкладки Articles. В ответ откроется окно Default Article Туре (рис. 14.55), предна-
Часть III. Администрирование
672
значенное для выбора типа статей. После задания нужного типа статьи и нажатия кнопки ОК будет открыто окно свойств конкретного типа статей. Например, на рис. 14.56 приведено окно Default View Article Properties свойств статей, созданных на основе представлений. Default Article Type For which type of article do you want to custom2 i e the default properties? Table articles Stored procedure articles User defined function articles OK
Cancel Рис. 14.55. Окно Default Article Type
Default View Article Properties
General;| Snapshot] QYj
Name:
< Default is based on view name >
flwner:
< Source view owner >
Name:
< Source view name >
Destination view Ощпег:
< Source view owner >
Name:
< Default is based on view name >
Description:
OK
Cancel
Help
Рис. 14.56. Окно Default View Article Properties
Свойства статьи Мы не будем рассматривать работу с окном свойств по умолчанию, а обратимся к рассмотрению работы со свойствами отдельной статьи. При этом следует заметить, что для уже созданных статей некоторые свойства будут доступны только в режиме чтения. Поэтому, для полноты картины рассмотрим окно свойств новой статьи. Для этого следует установить флажок Show unpublished objects на вкладке Articles окна свойств публикации (см. рис. 14.54), чтобы иметь возможность выбо-
Глава 14. Репликация данных
673
ра нового объекта. В качестве примера рассмотрим свойства статьи, созданной на основе таблицы orders. Установив флажок в самом левом столбце в строке, соответствующей таблице orders, мы тем самым предписываем создать статью на основе этой таблицы. При этом в самом правом столбце появляется кнопка с многоточием, нажатие которой и приводит к открытию окна статьи. Окно свойств статьи имеет название Table Article Properties (рис. 14.57) и, как видно из рисунка, имеет пять вкладок. Однако такое количество вкладок имеет не каждая статья. Для управления статьями, основанными не на таблице, используется всего две вкладки — General и Snapshot, работа с которыми не имеет принципиальных отличий от соответствующих вкладок, применяемых при работе со статьями, основанными на таблицах. Поэтому мы не будем отдельно рассматривать свойства статей каждого типа, а ограничимся обзором свойств статей на основе таблицы. Table Article Properties - Orders
2ii
i General || Snapshot | Resolverj Identity Range) Merging Changes | | ==Л
Name:
Orders
Description: Table information Source table owner Source table name: D estination table owner:
dbo Orders dbo
f Treat changes to the same tow as a conflict (* Treat changes to the same column as a conflict (changes to different columns in the same row will be merged) OK
Cancel
Help
Рис. 14.57. Окно Table Article Properties, вкладка General
Рассмотрим элементы управления, имеющиеся на вкладке General (рис. 14.57): П Name — имя статьи. Для новой статьи значение в этом поле доступно для редактирования, тогда как при работе с созданными ранее статьями поле будет доступно только для чтения. П Description — краткое описание статьи. Поле всегда доступно для редактирования (как для новых, так и для старых^статей). П Source table owner. В этом поле, доступном только для чтения, указывается имя владельца таблицы, на основе которой создана статья.
674
Часть III. Администрирование
О Source table name. Выводится владелец таблицы, на основе которой создана статья. Значение в поле также доступно только для чтения и в совокупности с предыдущим полем позволяет однозначно идентифицировать исходный объект в пределах базы данных. П Destination table owner. В этом поле, доступном для редактирования, указывается владелец, которому будет принадлежать таблица при копировании ее на подписчика. При выборе имени владельца следует предварительно убедиться, что указываемый пользователь существует на каждом подписчике. Если на одном из подписчиков не будет существовать указанного пользователя, то создать таблицу не удастся. Отметим, что указание пользователя dbo позволяет избежать подобных проблем, т. к. этот пользователь имеется в каждой базе данных. Замечание При работе с репликацией транзакций или репликацией моментальных снимков в окне будет еще иметься поле Destination table name, с помощью которого можно будет определить имя, присвоенное реплицируемой таблице на подписчике. При работе с репликацией сведением такой возможности нет. • When merging changes from different sources. Данный переключатель предназначен для определения ситуации, при которой будет считаться, что произошел конфликт изменения данных: •
Treat changes to the same row as a conflict — конфликтом будет считаться изменение данных в одной и той же строке более чем одним участником репликации. При этом не важно, были данные изменены в одном и том же или в разных столбцах. Подобный подход позволяет обеспечить быстрое обнаружение конфликтов и их разрешение, что является несомненным достоинством. Однако явный недостаток заключается в низкой детализации отслеживаемых изменений. Если в одной и той же строке были изменены данные в разных столбцах, то часть изменений будет потеряна.
•
Treat changes to the same column as a conflict (changes to different columns in the same row will be merged) — в этом случае конфликтом будут считаться только изменения, затрагивающие данные одного и того же столбца одной и той же строки. Это позволяет максимально детализировать отслеживание изменений и избавиться от ненужных потерь информации. Однако платой за это является более высокое требование агента Merge Agent как к используемой памяти, так и к процессорному времени.
Перейдем к рассмотрению следующей вкладки, имеющей имя Snapshot. Вкладка Snapshot (рис. 14.58), как несложно догадаться из названия, предназначена для управления созданием моментального снимка и последующим его применением на подписчике. Окно разделено на три части. Вверху расположен переключатель, с помощью которого указывается метод поведения подсистемы репликации при обнаружении на подписчике объекта с тем же именем, что и реплицируемый. Допускаются следующие варианты поведения:
Глава 14. Репликация данных
675
П Keep the existing table unchanged. Никаких действий предприниматься не будет. П DROP the existing table and re-create it. На подписчике будет автоматически удалена одноименная таблица, после чего подсистема репликации создаст новую, основываясь на информации моментального снимка. Подобный подход позволяет гарантировать, что структура таблицы, имеющейся на подписчике, будет полностью отвечать структуре соответствующей статьи. • Delete data in the existing table that matches the row filter statement. В этом случае из таблицы подписчика будут удалены все строки, относящиеся к определенному для статьи горизонтальному фильтру. Это позволяет гарантировать, что при использовании соответствующего логического условия будет осуществляться работа с теми же данными, что имеются на издателе. Если горизонтальный фильтр для статьи не был определен, то из таблицы подписчика будут удалены все строки. • Delete all data in the existing table. Предусматривает удаление из таблицы подписчика всех имеющихся в ней строк. Table Article Properties - Orders General [ Snapshot :| Resolver | Identity Range ] Mergn i g Changes Name conflicts II a table named 'Orders' exists at the Subscriber: . C*- Keep the existing table unchanged (* [)R0P the existing table and re-create it <"* Delete data in the existing table that matches the row filter statement С Dejete all data in the existing table Copy objects to destination -
—••:
Indexes for primary keys are always copied. f? Include declared referential integrity F? W V? f Г*
Clustered indexes hjondustered indexes User triggers Extended properties Collation
W Convert user-defined to base data types OK
Cancel
Help
Рис. 14.58. Окно Table Article Properties, вкладка Snapshot
По умолчанию выбран второй метод разрешения конфликта. Это самый результативный, но в то же время и самый разрушительный метод, действующий напролом, но избавляющий пользователя от всяческих неожиданностей, связанных с присутствием в таблице подписчика посторонних строк или несоответствием структур объектов. Более того, удаление, а затем повторное создание таблицы позволяет также гарантировать, что с ней не будет связано никаких
676
Часть III. Администрирование
непредусмотренных объектов — ограничений целостности, триггеров, индексов и т. д. В центральной части окна расположен набор флажков, с помощью которых можно управлять включением в моментальный снимок команд, обеспечивающих создание на подписчике дополнительных объектов, связанных с реплицируемым объектом: • Include declared referential integrity. Включение команд, обеспечивающих создание в таблице подписчика ограничений целостности FOREIGN KEY (внешний ключ). При этом необходимо убедиться, что в публикацию также включена и таблица, с которой выполняется связывание. • Clustered indexes. Для реплицированной таблицы на подписчике будет создан кластерный индекс, включающий те же столбцы, что и на издателе. П Nonclustered indexes. Будут созданы все некластерные индексы. •
User triggers. На подписчике будут созданы все триггеры, организованные пользователями на издателе для соответствующей таблицы.
G Extended properties. Конфигурирование на подписчике тех же свойств для таблицы, что она имела на издателе. Это позволяет гарантировать, что выполнение различных операций как на издателе, так и на подписчике будет выполняться одинаково. •
Collation. Предписывает использовать для таблицы на подписчике то же сопоставление, что таблица имела на издателе. Замечание При создании в таблице подписчика дополнительных объектов следует внимательно относиться с конфигурированию вертикального фильтра. Некоторые из столбцов, не включенных в публикацию, могут использоваться для индексов, ограничений целостности или триггеров.
Помимо рассмотренных флажков, в нижней части вкладки имеется еще один флажок — Convert user-defined to base data types. Посредством его можно предписать агенту Snapshot Agent при создании сценариев, с помощью которого будет выполняться создание таблицы на подписчике, применять не определяемые пользователем типы данных (UDDT, user-defined data types), а использовать вместо них соответствующие системные типы данных. Это позволяет избежать проблем при создании таблиц на подписчиках, связанные с отсутствием в базе данных подписчика нужного пользовательского типа данных, а также проблем с несоответствием этих типов данных на издателе и подписчике. Когда работа с вкладкой Snapshot будет завершена, можно переходить к вкладке Resolver (рис. 14.59), которая предназначена для конфигурирования механизма разрешения конфликтов изменения. Сразу можно заметить, что центральную роль в окне играет переключатель. С его помощью определяется тип механизма, который будет использован для разрешения конфликтов:
Глава 14. Репликация данных
677
П Use the default resolver. При установке переключателя в это положение будет использоваться стандартный механизм разрешения конфликтов, основанный на приоритетах. Этот же механизм применялся для разрешения конфликтов и в SQL Server 7.0. • Use this custom resolver (registred at the Distributor). Установка переключателя в данное положение позволяет выбрать один из дополнительных механизмов разрешения конфликтов. В этом случае становится доступным список в центральной части вкладки, с помощью которого и выбирается нужный механизм разрешения конфликтов. Подробное описание поставляемых в составе SQL Server 2000 дополнительных механизмов разрешения конфликтов было дано в разд. "Репликация сведением"ранее в этой главе. Однако, помимо выбора встроенных механизмов, также разрешается запуск своих собственных механизмов, реализуемых в виде хранимой процедуры. Для этого в списке следует выбрать пункт Microsoft SQL Server Stored Procedure Resolver и в поле Enter information needed by the resolver ввести имя нужной хранимой процедуры. 2<J Table Article Properties •Orders General | Snapshot Resolver J Identity Range j Merging Changes | A resolver is a modue l called by the Merge Agent that controls how changes made to two members of the publication are merged. Г" Use the default resolver
(• Use this custom resolver (registered at the Distributor):
Microsoft SQL Server Mn im i um Conflict Resolver Microsoft SQL Server Priority Cou l mn Resolver Microsoft SQL Server Upload Ony l Conflict Resolver Microsoft SQLServer Stored Procedure Resolver I*? Require verification of a digital signature before mergn ig £nter information needed by the resolver:
I? Alow £ubscribers to resolve conflicts interactively during on-demand synchronizations Cancel
Help
Рис. 14.59. Окно Table Article Properties, вкладка Resolver
Помимо использования автоматического разрешения конфликтов с помощью конкретного механизма, также имеется возможность ручного (или интерактивного) разрешения конфликтов. Устанавливая флажок в нижней части вкладки, можно предписать подсистеме репликации при выполнении ручной синхронизации выводить пользователю специальное диалоговое окно, в котором будут перечислены обнаруженные конфликты изменения. Пользователь обязан будет
Часть III. Администрирование
678
сам решить, какое изменение должно победить. Подробно интерактивное разрешение конфликтов будет рассмотрено далее в этой главе. Сейчас же обратимся к рассмотрению вкладки Identity Range (рис. 14.60), с помощью которой можно управлять диапазонами значений для столбцов-счетчиков (с установленным свойством IDENTITY) на серверах — участниках репликации. Подобная возможность является довольно полезной. Если не контролировать процесс генерирования значений в столбцах-счетчиках, то вполне может получиться ситуация, когда на разных серверах будут созданы строки, имеющие одинаковые значения в столбце-счетчике для одной и той же таблицы. Не стоит и говорить, что необходимо всеми силами избегать подобных ситуаций. Наличие двух строк с одинаковыми идентификационными номерами недопустимо. Поэтому необходимо каким-то образом обеспечить уникальность значений в столбце-счетчике не только в пределах подписчика (что реализуется стандартными средствами SQL Server 2000), но и в пределах всех участников репликации. Table Article Properties - Orders General | Snapshot | Resolver Identity Range | Mergn i g Changes ] Identity Ranges
:
:
f? [Automatically assign and maintain a unique identity range for eacH jsubscription i Maxm i um identity value: Next range starting value: Identity increment: Range si2e at Publisher: Range si2e at Subscribers:
2147483647 1 100
100 Assign a new range when this percentage of values is used:
OK
Cancel
Help
Рис. 14.60. Окно Table Article Properties, вкладка Identity Range
Замечание Подробно использование столбцов-счетчиков будет рассмотрено в главе 21. Это реализуется путем выделения каждому серверу — участнику репликации определенного диапазона идентификационных номеров, что вполне возможно, т. к. при создании столбца-счетчика можно указать, с какого номера следует начинать генерацию значений. Вкладка Identity Range предназначена для указа-
Глава 14. Репликация данных
679
ния ширины диапазона, который будет выделяться участникам репликации для генерации значений в столбце-счетчике.
(
Замечание
^
Необходимо отметить, что вкладка Identity Range будет присутствовать в окне свойств статьи только в том случае, если в исходной таблице был определен столбец-счетчик.
В верхней части вкладки (см. рис. 14.60) имеется флажок, устанавливая который можно разрешить автоматический контроль подсистемой репликации уникальности значений в столбцах-счетчиках. Если флажок сброшен, то пользователи должны будут сами заботиться об уникальности значений в этих столбцах. После установки флажка на вкладке становятся доступными дополнительные элементы управления: •
Maximum identity value. Указывается максимально возможное значение для идентификатора в столбце-счетчике. Зависит от типа данных, используемого для столбца счетчика.
Замечание Для столбца-счетчика могут применяться только целочисленные типы данных — t i n y i n t (диапазон возможных значений от 0 до 255), s m a l l i n t (диапазон от -32 768 до 32 767), i n t (диапазон от - 2 147 483 648 до 2 147 483 647) и b i g i n t (диапазон от - 9 223 372 036 854 775 808 до 9 223 372 036 854 775 807).
П Next range starting value. Указывается число, с которого будет начинаться следующий диапазон значений издателя или одного из подписчиков. При создании новой статьи ничего в этом поле указано не будет. •
Identity increment — шаг приращения значений в столбце-счетчике. По умолчанию равен 1 и не может быть изменен.
•
Range size at Publisher — ширина диапазона, выделяемого для столбцасчетчика на издателе.
• Range size at Subscribers — ширина диапазона, выделяемого для столбцасчетчика на подписчиках. • Assign a new range when this percentage of values is used. Задается, на сколько процентов должен быть исчерпан существующий диапазон, прежде чем соответствующему серверу будет выделен новый диапазон. На этом работа со вкладкой Identity Range заканчивается. Необходимо заметить, что для созданной публикации не поддерживается возможность разрешения или запрещения автоматического контроля значений в столбце-счетчике. Поэтому следует нужным образом сконфигурировать статью во время создания. Теперь же обратимся к последней вкладке окна свойств статьи — вкладке Merging Changes (рис. 14.61). В верхней части вкладки имеется группа флажков Check permissions, с помощью которых можно разрешить проверку прав доступа
680
Часть III. Администрирование
агента Merge Agent к соответствующей таблице подписчика. По умолчанию предполагается, что агенту предоставлены все необходимые права. Однако, если агент не имеет прав на выполнение тех или иных действий, то он будет генерировать сообщение об ошибке каждый раз при неудачном выполнении той или иной команды. Это может привести к лавине ошибок и множеству безуспешных попыток изменения данных. Чтобы избежать загрузки агента ненужными попытками, можно сначала проверить, имеет ли агент необходимые права. Для этого и используются флажки: П INSERT — проверка возможности вставки данных; L~J UPDATE — проверка возможности изменения данных; П DELETE — проверка возможности удаления данных. Table Article Properties - Orders General) Snapshot] Resolver] Identity Range Mergn i g Changes Check permissions : When mergn i g Subscriber changes with the data at the Publisher, verify that the Merge Agent login has the permissions to perform the following commands: Г INSERT! Г
UPDATE
Г DELETE Verifying permissions requires that the Merge Agent login be a valid user with the appropriate permissions in the publication database. Multicolumn updates
•—
|v* When merging, apply changes to multiple columns in the same row in one UPDATE statement
OK
Cancel
Help
Рис. 1 4 . 6 1 . О к н о Table Article Properties, вкладка M e r g i n g Changes
Помимо трех указанных флажков, в нижней части вкладки присутствует еще один флажок, с помощью которого можно определить стратегию изменения данных в различных столбцах одной и той же строки. При установленном флажке указанные изменения будут выполняться как одна команда, даже если изменения в столбцы были внесены различными участниками репликации. При сброшенном флажке для каждого столбца станет генерироваться отдельная команда UPDATE, что потребует дополнительных ресурсов. На этом конфигурирование свойств статьи можно считать оконченным. Теперь же настало время вернуться к окну свойств публикации.
Глава 14. Репликация данных
681
Вертикальные фильтры Итак, в предыдущем разделе была описана работа с вкладкой Articles окна свойств публикации. В этом же разделе будет описано конфигурирование вертикальных фильтров для статей, основанных на таблицах. Для этого предназначена вкладка Filter Columns. Вкладка Filter Columns (рис. 14.62) служит для управления столбцами, которые будут включены в ту или иную статью, основанную на таблице. Как видно, вкладка разделена на две области. В левой части перечислены все таблицы, которые публикуются в конфигурируемой публикации в качестве статей. В правой же части вкладки выводится список столбцов, имеющихся в таблице, выбранной слева в окне. Как видно, каждый столбец описывается именем и типом данных. Установленный флажок слева от имени столбца свидетельствует о том, что этот столбец включен в статью. По умолчанию в статью включаются все столбцы. Publication Properties - Northwind Snapshot I Snapshot Location | Publication Access List j Sync Partners ] Status General | Articles Filter Cou l mns j Filter Rows (Subscriptions | Subscription Options Select a table and clear the checkboxes in the column list to exclude the unwanted columns. Jables in publication: Owner : Tabe l .Article dbo Categore i s Categories dbo Customers Customers dbo Empoly eeT.. Employee!".. [dbo Empo lyees Employees
ЕЭИ 1ВЕЕШ1
<J .,
1
1I
II
±1
Cou l mns in selected table:
и и и 0 0 0 0 0 0
Coulmn Name OrderD l CustomerD l Empoly eel D OrderDate RequriedDate Shp i pedDate Shp i Va i Freg i ht Shp iName Shp i Address Shp i Ctiy CtunQano in
IData Type (Base ..-** int nchar int datetm ie datetm ie datetm ie int money nvarchar nvarchar nvarchar • p"
Add Coulmn to Table. OK
Cancel
Hep l
Рис. 14.62. Вкладка Filter Columns окна свойств публикации
Сбрасывая тот или иной флажок, можно исключить из статьи соответствующий столбец, что и называется установкой вертикального фильтра. Отметим, что нельзя исключить из статьи столбцы, на основе которых построен первичный ключ, а также на которые ссылаются реплицируемые объекты и столбец ROWGUIDCOL. В нижней части вкладки находятся две кнопки — Add Column to Table и Drop Selected Column, с помощью которых, соответственно, можно добавить в табли-
Часть III. Администрирование
682
цу новый столбец или удалить один из существующих. Если удаление столбца не вызывает особых трудностей (достаточно выбрать его в правой таблице), то создание нового столбца требует пояснений. После нажатия кнопки Add Column to Table откроется окно Add Column to Replicated Table (рис. 14.63), с помощью которого необходимо указать параметры столбца. В верхней части окна имеется поле Table, где указывается имя таблицы, в которую будет добавлен столбец. Имя столбца необходимо ввести в поле Column name, тогда как собственно описание столбца приводится в текстовом поле Column definition (excliding the column name). Как минимум необходимо указать тип данных (параметр ), который должен иметь столбец. Все остальные параметры являются дополнительными и могут быть опущены. Подробно конфигурирование столбцов будет рассмотрено в главе 21. Add Column to Replicated Table You can add a column to areplicatedtable and replicate the new column in merge publications without reinitializing subscriptions to the published table. Table:
j[dbo]. [Employees]
Cou l mn name: Cou l mn definition (excluding the cou l mn name): data_type; DEFAULT xonstant_expression;-
IDENTITY <seed; increment:- NO Г FDR REPLICATION ROWGUIDCOL -nli imn с- с\г\<;\ г я into
111 Note: The new coulmn etiher must ao l w nul vau l es or must be specfied wtih a defautl vau l e. n i cu l de this coulmn in the foo l wn i g pubc il ato i ns: 1
Cancel
Hep l
Рис. 14.63. Окно Add Column t o Replicated Table
В нижней части окна имеется таблица Include this column in the following publications, с помощью которой можно сразу же включить создаваемый столбец в любую из публикаций, включающих соответствующую таблицу.
Горизонтальные фильтры Помимо вертикальных фильтров, определяющих какие столбцы должны быть реплицированы подписчикам, имеется возможность управлять и горизонтальными фильтрами, определяющими список строк, предлагаемых к копированию подписчикам. Таким образом, использование горизонтальных фильтров позволяет реплицировать только часть строк, имеющихся в таблице.
Глава 14. Репликация данных
683
Для управления горизонтальными фильтрами служит вкладка Filter Rows (рис. 14.64). В верхней части вкладки перечислены все таблицы, выбранные для публикации. Собственно условие фильтрации указывается в столбце Filter Clause. Для его редактирования предназначено окно Specify Filter (см. рис. 14.46), работа с которым, а также и другими имеющимися на вкладке Filter Rows элементами управления, была представлена в разд. "Создание публикации" ранее в этой главе. Поэтому мы не будем повторяться и сразу же перейдем к следующей вкладке. 2<J Publication Properties - Northwind Snapshot ] Snapshot Location ] Publication Access List | Sync Partners | Status j General | Articles | Filter Cou l mns j Filter Rows jj Subscriptions j Subscription Options Exclude rows by defining a filter on a table. You can extend the filter by defining a JOIN from a filtered table to another table. JEnter fitters that exclude the unwanted rows: I Table j Article Owner Categories Categories dbo Customers Customers dbo EmployeeTerritories EmployeeTerritories dbo Empo l yees Empo l yees
I Filter Clause < All rows published > < All rows published > < All rows published > TitleOfCourtesy = 'Mr.'
E xtend filtering on a table to a related table by defining a join between the filtered table and the table tolilter. Filtered Table < Create JOIN >
| Table to Filter
OK
i JOIN Filter Clause
Cancel
Help
Рис. 14.64. Вкладка Filter Rows окна свойств публикации
Управление подписками Следующей вкладкой, которую мы рассмотрим, будет вкладка Subscriptions (рис. 14.65), с помощью которой можно управлять подписками, созданными на конфигурируемую публикацию. К данному моменту еще не было создано ни одной подписки, поэтому основная часть элементов управления вкладки недоступна. Активной является только кнопка Push New, позволяющая запустить мастер создания принудительной подписки Push Subscription Wizard, работа с которым будет рассмотрена позже в одном из следующих разделов этой главы.
684
Часть III. Администрирование 2<J
Publication Properties - Northwind
Snapshot I Snapshot Location | Publication Access List | Sync Partners | Status General | Articles | Filter Columns | Filter Rows Subscriptions j Subscription Options Subscriptions: Subscription Name
Type
OK
! Priority
Cancel
Push New...
Apply
Help
Рис. 14.65. Вкладка Subscriptions окна свойств публикации
Помимо указанной кнопки, на вкладке еще имеются перечисленные ниже кнопки: • Properties открывает окно свойств подписки, работа с которым будет рассмотрена в одном из следующих разделов; • Delete предназначена для удаления подписки; • Reinitialize предписывает выполнить повторную инициализацию соответствующего подписчика, применив на нем моментальный снимок; • Reinitialize All предоставляет возможность выполнить повторную инициализацию всех подписчиков; • View Conflicts открывает окно просмотра конфликтов изменения. Работа с этим окном также будет рассмотрена в одном из следующих разделов данной главы. Кроме кнопок существует таблица Subscriptions, в которой выводится список подписок. Рассмотрим, какие же столбцы имеются в этой таблице: П Subscription Name — имя подписки; • Туре — тип подписки: принудительный (Push) или по требованию (Pull); П Priority — приоритет соответствующего подписчика.
Глава 14. Репликация данных
685
Управление свойствами подписок Если предыдущая вкладка использовалась для управления конкретными подписками, то вкладка Subscription Options (рис. 14.66) предназначена для управления общими свойствами публикаций. 2SJ Publication Properties - Northwind Snapshot I Snapshot Location ] Publication Access List | Sync Partners | Status I General ] Articles ) Filter Cou l mns ] Filter Rows | Subscriptions Subscription Options S ubscription creation
—
-
-•
г
f/ JAIIc
!р1[9П§
W Allow anonymous subscriptions f~ Allow new subscriptions to be created by attaching a copy of a subscription database Data conflicts;—
—
-
-
R Centralize conflicting reporting at the Publisher Dynamic filtering I Yes
Allow partitioning through dynamic filters.
Before merging, validate Subscribers with this expression:
Optimize synchronization of filtered subscriptions | Yes
-
Minimize network traffic by increasing the storage requirements at the Publisher.
OK Рис.
•
Cancel
Apply
Help
1 4 . 6 6 . Вкладка Subscription Options о к н а с в о й с т в п у б л и к а ц и и
Рассмотрим элементы управления, имеющиеся на вкладке: • Allow pull subscriptions. Установка этого флажка разрешает создание для публикации подписки по требованию. При этом становится доступным дополнительный флажок: • Allow anonymous subscriptions — разрешает подписку на публикацию анонимным подписчикам. • Allow new subscriptions to be created by attaching a copy of a subscription database. С помощью этого флажка можно контролировать автоматическое создание новой подписки для присоединяемой (attaching) базы данных если она имеет поддержку репликации сведением. Это позволяет автоматизировать создание подписок при рассылке отсоединенной базы данных множеству пользователей. • Centralize conflicting reporting at the Publisher предписывает централизованно хранить информацию о конфликтах изменения.
686
Часть III. Администрирование
О Allow partitioning through dynamic filters. В этом поле указывается, была ли публикация сконфигурирована для поддержки динамических фильтров. Таким образом, разрешить или запретить поддержку этих фильтров после создания публикации невозможно. О Before merging, validate Subscribers with this expression. В этом текстовом поле можно указать код раздела WHERE, С ПОМОЩЬЮ которого будет выполняться проверка данных на подписчике на соответствие установленному динамическому фильтру. Эта проверка осуществляется при синхронизации подписчика и позволяет гарантировать, что подписчик содержит данные, соответствующие горизонтальному фильтру. При обнаружении несоответствия будет автоматически применен моментальный снимок, что должно устранить несогласованность. П Minimize network traffic by increasing the storage requirements at the Publisher. В данном поле указывается, разрешено ли для публикации сведением к минимуму объема передаваемых по сети данных. Эта возможность конфигурируется при создании публикации и позже не может быть изменена.
Управление моментальным снимком Следующая вкладка, которую мы рассмотрим, — это вкладка Snapshot (рис. 14.67). С ее помощью можно управлять параметрами создания и размещения моментального снимка, который буДет использоваться агентом Merge Agent при выполнении первоначальной синхронизации подписчика. Publication Properties - Northwind General j Articles | Filter Columns j Filter R o w s j Subscriptions | Subscription Options Snapshot I Snapshot Location ] Fabrication Apcess List ] Sync Partners | Status Snapshot format • : • •; *"" Character m o d e format •- supports heterogeneous Subscribers and data transformations using DTS .•• •
Additional scripts Before applying the snapshot, execute this script: After applying the snapshot, execute this script: Additional scripts c a n b e specified only if snapshots are in native S Q L Server format. T h e paths must be accessible by the Snapshot Agent, running o n the Distributor. OK
Cancel
Apply
Рис. 14.67. Вкладка Snapshot окна свойств публикации
Help
Глава 14. Репликация данных
687
Первое, с чем сталкиваешься на этой вкладке — это переключатель Snapshot format, предназначенный для выбора формата, который будет использоваться для генерирования файлов с данными моментального снимка: • Native SQL Server format — all Subscribers must be servers running SQL Server. Будет использоваться так называемый исконный (native) формат, обеспечивающий более компактное хранение данных и более высокую скорость последующей закачки данных в таблицы подписчика. Однако этот формат может быть использован только для серверов SQL Server 2000 или SQL Server 7.0. • Character mode format — supports heterogeneous Subscribers and data transformations using DTS. Данные в файлах моментального снимка будут храниться в текстовом виде, что обеспечивает возможность их использования подписчиками любых типов (Oracle, SQL Server 6.x, SQL Server 2000 и т. д.). Помимо указанного переключателя, в нижней части вкладки имеется два текстовых поля, где можно указать путь к файлу с набором команд Transact-SQL, которые должны быть выполнены на подписчике до (верхнее поле) и после (нижнее поле) применения на подписчике моментального снимка.
Размещение моментального снимка С помощью вкладки Snapshot Location (рис. 14.68) можно определить место, в котором следует сохранить файлы моментального снимка. Publication Properties - Northwind General j Articles j Filter Columns j Filter Rows J Subscriptions j Subscription Options Snapshot Snapshot Location j Publication Access List ] Sync Partners | Status
(generate snapshots in the normal snapshot folder Generate snapshots in the following location: Folder: j\\Storage\snapshot$\General
_J
Compress the snapshot files in this location Subscribers can access this folder using FTP (File Transfer Protocol) When accessing this folder using FTP, Subscribers wil use the following information: FTP server name: STORAGE client path to this foldtorn er the FTP root: initialize Login: Password:
Port: F
"pnfirm Password:
] anonymous OK
Cancel
Apply
Help
Рис. 14.68. Вкладка Snapshot Location окна свойств публикации 23 Зак. 83
688
Часть III. Администрирование
Замечание При работе с предыдущими версиями SQL Server пользователи не могли явно указать каталог, в который будут сохраняться файлы моментального снимка. В SQL Server 2000 это стало возможным. Более того, подписчики могут выкачивать моментальный снимок не только стандартными средствами, но и с использованием протокола FTP. Рассмотрим элементы управления, находящиеся на вкладке Snapshot Location: • Generate snapshots in the normal snapshot folder. Когда для публикации установлен этот флажок, файлы моментального снимка будут располагаться в стандартном месте — в каталоге дистрибьютора Program Files\Micsoroft SQL Server\MSSQL\ReplData. Для каждой публикации в этом каталоге автоматически создается отдельный каталог, в котором и сохраняются файлы. Преимущества стандартного каталога в том, что его местоположение известно всегда.
Замечание К счастью, не приходится выбирать между стандартным хранилищем и произвольным — можно использовать оба типа хранилищ независимо друг от друга. По умолчанию на вкладке установлен только первый флажок. D Generate snapshots in the following location. Если необходимо сохранить файлы моментального снимка в ином каталоге, чем предлагаемый по умолчанию, то требуется установить данный флажок. После этого станут доступными следующие элементы управления: •
Folder — указывается каталог, в котором следует сохранить файлы моментального снимка. Можно задать как локальный каталог, так и сетевой ресурс;
•
Compress the snapshot files in this location — устанавливая этот флажок, можно выполнить сжатие файлов моментального снимка. Это позволит уменьшить нагрузку на каналы связи;
•
Subscribers can access this folder using FTP (File Transfer Protocol) — устанавливая этот флажок, можно разрешить доступ к файлам моментального снимка с помощью протокола FTP.
При установке последнего флажка становятся доступными дополнительные элементы управления, с помощью которых определяются параметры использования подписчиками протокола FTP: П FTP server name — имя сервера FTP, на котором расположены данные. Предполагается, что к каталогу, указанному в поле Folder, можно обратиться с помощью протокола FTP. • Port — номер порта, используемого на сервере для работы протокола FTP; • Client path to this folder from the FTP root — относительный путь к каталогу сервера FTP, в котором расположены файлы моментального снимка. При указании пути не нужно указывать имени сервера;
Глава 14. Репликация данных
689
П Login — имя учетной записи, которая имеет доступ к указанному каталогу сервера и которая будет применяться подписчиками для установления соединения с сервером; •
Password — пароль учетной записи, указанной в предыдущем поле;
П Confirm Password — повторение пароля для избежания ошибок при вводе. Мы рассмотрели все элементы управления, имеющиеся на вкладке Snapshot Location. Варианты использования предоставленных возможностей уже зависят от конкретной ситуации.
Доступ к публикации Перейдем к рассмотрению вкладки Publication Access List (рис. 14.69). Она предназначена для управления правами доступа к публикации. Publication Properties - Northwind General j Articles | Filter Cou l mns ] Filter Rows ) Subscriptions | Subscription Options Snapshot | Snapshot Location Publication Access List j Sync Partners j Status The publication access list specifies the logins used by pull and m i meda i te updating subscriptions to access this publication. Login Name IMBUiLfiNSAdministrators
С STORAGE^Adrninistrator HfJ distributor_admin (& sa
jType 1 NT Group NT User Standard Standard
OK
Add..
1
Remove Remove All
Cancel
Apply
Help
Рис. 14.69. Вкладка Publication Access List окна свойств публикации
Как видно, центральную часть вкладки занимает таблица, в которой перечисляются учетные записи. Любая учетная запись, указанная в таблице, имеет право подписываться на публикацию, и изменения, выполненные на соответствующем подписчике, начнут отображаться на всех участниках репликации. Для предоставления доступа новой учетной записи следует нажать кнопку Add, что приведет к открытию окна SQL Server Enterprise Manager, в котором будут
690
Часть III. Администрирование
перечислены все учетные записи, сконфигурированные на текущем сервере. Достаточно выбрать в окне необходимую учетную запись и нажать кнопку ОК.
Выбор партнеров для синхронизации Следующая вкладка — Sync Partners (рис. 14.70) — предназначена для выбора партнеров для синхронизации. Однако непонятно, что кроется за этой фразой. При работе по стандартной схеме данные публикуются издателем и реплицируются подписчикам. Однако по тем или иным причинам использование издателя, может оказаться нерациональным. Более того, неплохо было бы обезопасить участников репликации от выхода из строя издателя, что приведет к останову работы публикации. В SQL Server 2000 имеется возможность разрешить использование в качестве издателя иного сервера, чем тот, на котором была создана публикация. Для этого и предназначена вкладка Sync Partners. Publication Properties - Northwindi General | Articles | Filter Cou l mns | Filter Rows ] Subscriptions | Subscription Options Snapshot ] Snapshot Location | Publication Access List Sync Partners Status Г" Allow Subscribers to synchronize with other partners than the Publisher from which the 1 jsubscription was created I
I Partner (server) 0 STORAGE
1 Publication Database (Publication Northwind Northwind
OK
Cancel
Help
Рис. 14.70. Вкладка Sync Partners окна свойств публикации
По умолчанию взаимоотношения между участниками репликации осуществляются по стандартной схеме. Если же необходимо сконфигурировать один из серверов в качестве дополнительного издателя, то сначала следует установить флажок в верхней части вкладки. После этого станет доступной таблица в центральной части вкладки. В этой таблице перечислены все участники реплика-
Глава 14. Репликация данных
691
ции. Устанавливая флажок слева от имени сервера, можно разрешить использовать его в качестве дополнительного издателя.
Просмотр статуса Последняя вкладка, которую нам осталось рассмотреть, — это вкладка Status (рис. 14.71). Она предназначена для управления работой агента Snapshot Agent и запуском службы SQLServerAgent. Publication Properties - Northwirw General j Articles j Filter Cou l mns | Filter Rows | Subscriptions | Subscription Options Snapshot I Snapshot Location j Publication Access List ] Sync Partners [Status Snapshot Agent status — - - The Snapshot Agent must be run at least once before the Merge Agents can initialize new subscriptions. Last run: N
eat tun;
J07.11 200013:31:09
Run Agent Now
J08.11.2001 0:00:00
Agent Properties...
To view or copy the snapshot files: Service status
г
-
Explore Snapshot
-
This publication requires that the following services are running on the indicated servers.
I Service (on Server)
[Status
SQLServerAgent (on STORAGE)
Start Service
Running
OK
Refresh Status
Cancel
Apply
Help
Рис. 1 4 . 7 1 . Вкладка Status окна свойств публикации
В полях Last run и Next run указывается дата последнего и следующего запуска агента Snapshot Agent. Если необходимо запустить агент Snapshot Agent немедленно, то следует нажать кнопку Run Agent Now. С помощью кнопки Agent Profiles можно открыть окно свойств задания, которое позволяет запустить агент Agent Profiles. После нажатия кнопки Explore Snapshot открывается каталог с файлами моментального снимка (рис. 14.72). Эта операция также может быть выполнена из контекстного меню публикации, если в нем выбрать команду Explore The Last Snapshot Folder.
СНетрудноЗамечание заметить, что сохранение стандартного моментального снимка происхо-
дит иначе, чем запись динамического моментального снимка. Если файлы последнего записываются непосредственно в указанный каталог, то при работе со стан-
Часть III. Администрирование
692
дартным моментальным снимком в указанном каталоге образуется несколько дополнительных каталогов, что позволяет указывать один и тот же каталог для записи моментальных снимков различных публикаций. «C:\Tmp\General\unc\STORAGE_Northwind_Northwin File Edit View Favorites J_oosl : Help
20001108003924 Select an item to view its description. 5ee also: My Network Pa l ces My Computer
Categoriesjl Categories_.,. Categories_... Categories... Customers... Customers.,, .eft
m\
\m\ •
.—i
*
m\
i—i—I
Customers_...
Customers.,,
Employee....,
Employees.....
EmployeeT...
EmployeeT...
\m :
\m\ ;
i
i
m i—i
Employees..... E r n p l o y e e s _ . , , Employees.....
EmployeeT...
EmployeeT...
Funcl_48.sch
m\ \m\ щ :1я| jaa| |Д| MSmergcC j . MSmerge_g. MSmergeJ. Orders_29.sch Orders_32.cft Orders_33,trg
Orders_34,dri
Sales_by_Y.,,
Sales_Total...
SalesByCat,.,
snapshot,pre
sysmerges...
sysmergesu. |31 obe j ct(s)
30,6 КБ
У ; My Computer
Рис. 14.72. Окно просмотра каталога моментального снимка
Нижняя часть вкладки предназначена для управления запуском служб, необходимых для работы подсистемы репликации. Так как работа подсистемы репликации обеспечивается службой SQLServerAgent, то ее имя и будет выведено. Для службы в столбце Status указывается ее текущее состояние, которое также отображается в самом левом столбце в виде значка, символизирующего службу. Из операций управления службой в распоряжении пользователей имеется лишь кнопка Start Service, с помощью которой можно запустить выбранную службу. Кнопка Refresh Status предназначена для обновления информации о состоянии службы.
Удаление публикации Удаление публикации является, наверное, для нее самой простой операцией. Действительно, ломать — не строить. Итак, чтобы удалить публикацию, необхо-
Глава 14. Репликация данных
693
димо открыть папку Publications нужной базы данных и найти в ней требуемую публикацию. Затем в контекстном меню публикации необходимо выбрать команду Delete. Вот и все. При удалении публикации будут автоматически удалены все подписки, сделанные на нее. При удалении публикации не происходит удаления опубликованных данных ни на издателе, ни на подписчиках. После изъятия подписки просто перестает выполняться синхронизация изменений, выполненных участниками репликации. Таким образом, на издателе и подписчиках будут содержаться данные. Но с течением времени разница между ними будет становиться все более и более заметной.
Управление подпиской Предьщущие разделы были посвящены рассмотрению хотя и необходимой, но все же предварительной подготовке к репликации данных. К настоящему времени читатель должен уже уметь конфигурировать издателя и дистрибьютора, а также создавать публикации. После выполнения этих операций можно приступать к собственно репликации данных. Это подразумевает инициализацию подписчика и подписку его на одну из созданных публикаций. До тех пор, пока в сети не будет иметься хотя бы одного подписчика, никакой репликации данных выполняться не будет. Конечно, опубликованная база данных издателя будет иметь все механизмы для обеспечения репликации данных, на дистрибьюторе будут запущены необходимые агенты поддержки репликации, создана база данных распределения, и начнет осуществляться отслеживание изменения данных на издателе. Однако все это ни к чему, если никто не станет получать эту информацию. Итак, настоящий раздел посвящен инициализации подписчика и созданию подписки на существующую публикацию. Для целостности излагаемого в главе материала в качестве примера рассмотрим подписку на публикацию репликации сведением, созданную в одном из предыдущих разделов с помощью мастера Create Publication Wizard. Мы обсудим как создание принудительной подписки (Push Subscription), так и подписки по требованию (Pull Subscription).
Создание принудительной подписки Особенностью подписки этого типа является то, что она направлена от дистрибьютора к подписчику, т. е. подписчик играет пассивную роль, а все действия выполняются дистрибьютором. Все агенты репликации в этом случае работают на издателе и дистрибьюторе, но не на подписчике. Конкретные детали зависят от типа используемой репликации. Если говорить о репликации сведением, то во время применения принудительной подписки агент Merge Agent запускается на дистрибьюторе и устанавливает соединение с подписчиком, выкачивает у него информацию о выполненных изменениях, объединяет ее с имеющейся информацией на дистрибьюторе, при необходимости решая конфликты изменения данных, после чего закачивает подписчику окончательный вариант данных.
694
Часть III. Администрирование
Создание принудительной подписки выполняется с помощью мастера Push Subscription Wizard, который можно запустить различными способами. Самый простой из них — использование окна Select Wizard, которое можно открыть с помощью кнопки Run a wizard, расположенной в панели инструментов Enterprise Manager. Мастер также может быть запущен из окна свойств публикации. Эту возможность предоставляет вкладка Subscriptions (см. рис. 14.84), в которой необходимо нажать кнопку Push New. Мастер также может быть запушен из контекстного меню публикации, если в нем выбрать команду Push New Subscriptions. Эта же команда доступна в меню Action окна Enterprise Manager после предварительного указания нужной публикации. Заметим, что при запуске мастера с помощью окна Select Wizard сначала откроется окно менеджера публикаций Create and Manage Publications (рис. 14.73). В этом окне необходимо открыть базу данных, в контексте которой была создана нужная публикация, после чего выбрать имя самой публикации. Затем остается только нажать кнопку Push New Subscription.
Замечание Как видно, в окне Create and Manage Publications в распоряжении пользователей имеется кнопка Properties, с помощью которой можно открыть окно свойств публикации. Для открытия окна Create and Manage Publications можно также воспользоваться меню Tools, выбрав в нем команду Replication, а потом команду Create and Manage Publications.
Create and Manage Publications on STORAGE .databases and publications: •^STORAGE
Create Publication..
Ш - , ^ Administrator Database t+Kj^j Bonus H j i y Northwind
Push New Subscription..
Properties and Subscriptions
pubs
Script Publication Delete Publication
Close 'Northwind' description: -
—
-
Merge publication of Northwind database from Publisher STORAGE.
Рис. 14.73. Окно Create and Manage Publications
Что ж, предположим, что мастер удалось запустить (неважно каким способом). Первое окно мастера содержит общую информацию о шагах, которые будут выполнены при создании подписки. В нижней части окна имеется флажок, установка которого предписывает мастеру выводить расширенные свойства подпис-
Глава 14. Репликация данных
695
ки. Мы будем работать с мастером именно в этом режиме, поэтому следует установить флажок, который по умолчанию сброшен. Таким образом, работа с первым окном мастера не должна вызывать затруднений, поэтому можно смело переходить ко второму окну мастера, которое называется Choose Subscribers (рис. 14.74). _*J
Push Subscription Wizard Choose Subscribers Choose one or more Subscribers o; groups of Subscribers.
Select one or more Subscribers in the following list. Select a group name to select all Subscribers in that group. Subscribers: + _j MATRIX Servers + _ j Other Servers - j Enabled Subscribers ) RjjSIRIUS i-|f) STORAGE
< Back
Next >
Cancel
Help
Рис. 14.74. Окно Choose Subscribers мастера Push Subscription Wizard
Это окно предназначено для выбора подписчиков, для которых будет создана принудительная подписка. Для выбора более одного сервера необходимо указать в окне первый сервер, и, нажав клавишу или <Shift>, выбрать дополнительные серверы. Мы рассмотрим создание подписки для одного сервера. После того, как будут выбраны все подписчики, можно переходить к следующему окну мастера, имеющему имя Choose Destination Database (рис. 14.75). В нем необходимо определить имя базы данных, в которую будут реплицироваться данные. В распоряжении пользователя имеется единственное текстовое поле, в котором и необходимо ввести имя базы данных. Указанная база данных должна существовать на всех выбранных подписчиках. Если вы не помните имени нужной базы данных, то можно воспользоваться окном Browse Databases (рис. 14.76), в котором перечислены все имеющиеся на подписчике базы данных. Для открытия этого окна достаточно нажать кнопку Browse or Create.
С_
Замечание
Если во втором окне мастера было выбрано более одного сервера, то кнопка Browse or Create будет недоступна. Таким образом, можно будет указать имя базы данных только вручную. Нельзя также будет создать и новую базу данных. Однако
Часть III. Администрирование
696
можно выбрать во втором окне один из подписчиков, перейтиь к окну мастера Choose Destination Database, создать новую базу данных и возвратиться ко второму окну для выбора другого подписчика, повторяя указанную операцию. Push Subscription Wizard Choose Destination Database Specify the subscription database at the SQL Server Subscriber(s). .Subscription database name: iNorthwind
Browse or Create..
Note: The specified database must exist at each Subscriber when the subscription is initialized.
< Back
Next >
Cancel
Рис. 14.75. Окно Choose Destination Database мастера Push Subscription Wizard JiJ
Browse Databases on STORAGE\
Select the database in which the subscription will be created. You can create a new database by clicking Create New. Databases: Chair Conferenc Dekanat MATRIX 1ДЯЯЯ pubs
OK Cancel
Рис. 14.76. Окно Browse Databases
Помимо прочего, из окна Browse Databases можно открыть окно создания новой базы данных Database Properties (рис. 14.77), нажав для этого кнопку Create New. Мы не будем сейчас рассматривать работу с окном создания новой базы данных, отложив это до главы 20.
Глава 14. Репликация данных
697 _*)
Database Properties - NewDatabase General j Data Files | Transaction Log | \J
Name: *
NewDatabasej
D atabase ~~ • Status: Owner Date created: Size: Space available: Number of users: Backup ~~" "• • Last database backup: Last transaction log backup: Maintenance Maintenance plan: Collation name:
(Unknown) (Unknown) (Unknown) (Unknown) (Unknown) (Unknown) None None None (Server default)
OK
Cancel
Help
Рис. 14.77. Окно Database Properties
Сейчас же вернемся к окну мастера Choose Destination Database (см. рис. 14.75). Итак, при создании подписки для более чем одного сервера в окне необходимо указать имя базы данных, существующей на всех серверах. Если необходимо реплицировать данные в базы данных с разными именами, то следует запускать мастер Push Subscription Wizard персонально для каждой группы баз данных. Так как мы рассматриваем создание подписки для одного подписчика, то достаточно выбрать имя любой из существующих баз данных. Остановим свой выбор на базе данных Northwind, хотя, в принципе, можно задать любую другую. Следующее окно мастера имеет имя Set Merge Agent Location (рис. 14.78) и позволяет назначить место запуска агента Merge Agent. Хотя в обычной ситуации при использовании принудительной репликации агент Merge Agent стартует на дистрибьюторе, в SQL Server 2000 допускается управление местом запуска этого агента, что открывает дополнительные возможности. Выбор местоположения запуска агента осуществляется с помощью переключателя, который установливается в одно из перечисленных ниже положений: • Run the agent at the Distributor — стандартный вариант запуска агента на дистрибьюторе, который был единственным в SQL Server 7.0. • Run the agent at the Subscribers (administration will still be performed at the Publisher and Distributor). В этом случае агент будет запускаться на подписчике и
Часть III. Администрирование
698
устанавливать соединение с дистрибьютором для синхронизации изменений. Запуск агента на подписчике вовсе не означает, что подписка станет вести себя так же, как и подписка по запросу. Независимо от места старта агента Merge Agent инициатором синхронизации изменений всегда будет дистрибьютор. Администрирование агента также будет выполняться со стороны издателя или дистрибьютора. При установке переключателя в рассматриваемое положение становится доступным текстовое поле: Network computer name of Subscriber — в этом поле указывается сетевое имя NetBIOS сервераподписчика. При работе с инсталляцией по умолчанию сетевое имя совпадает с именем SQL Server 2000.
2SJ
Push Subscription Wizard
Г"3^ ^Зя NP
Set Merge Agent Location You can choose whether the Merge Agent runs at the Distributor or at the Subscriber. Where do you want the synchronization agent to run? C4 Run the agent at the distributor
(* iRun the agent at the Subscriber (administration will still be performed at the Publisher and'j [Distributor) I
Network computer name of Subscriber:
i
(STORAGE
|
I Alter the subscription is created, you can use the subscription properties dialog ! boxtoverify that the agent can run at the Subscriber.
< Back
Next>
Cancel
Help
Рис. 14.78. Окно Set Merge Agent Location мастера Push Subscription Wizard
Рассмотрим стандартный вариант расположения агента Merge Agent — на дистрибьюторе, установив переключатель в верхнее положение. После этого можно переходить к следующему окну мастера. Если предыдущее окно использовалось для управления местом запуска агента Merge Agent, то окно мастера Set Merge Agent Schedule (рис. 14.79) предназначено для указания времени запуска того же агента. Как видно, в распоряжении пользователя имеется переключатель, с помощью которого необходимо выбрать стратегию запуска агента: • Continuously — provides minimal latency between when an action occurs at the Publisher and is propagated to the Subscriber. В этом случае агент будет запущен постоянно. Подобный подход позволяет обеспечить минимальную задержку между выполнением изменения и отображением его на дистрибьюторе, а также отображение накопленных на дистрибьюторе изменений на
Глава 14. Репликация данных
699
подписчике. Однако при этом нужно быть готовым к тому, что часть системных ресурсов будет использоваться для работы агента Merge Agent. П Using the following schedule. Предыдущий метод запуска агента оправдывает себя только при наличии постоянного соединения между издателем и дистрибьютором и необходимостью оперативного отображения изменений. Если же соединение устанавливается лишь периодически, то лучше будет сконфигурировать запуск агента в соответствии с определенным расписанием. Для этого необходимо установить переключатель в рассматриваемое положение. При этом необходимо будет сконфигурировать и расписание запуска агента. По умолчанию предлагается запускать агента один раз в час. Если это расписание вас не устраивает, то его можно легко изменить с помощью окна Edit Recurring Job Schedule, открыть которое можно нажатием кнопки Change.
Push Subscription Wizard Set Merge Agent Schedule Specfiy how frequently the Merge Agent(s) updates the subscription(s). When should the Merge Agent update the subscription? С Continuously -- provides minimal latency between when an action occurs at the Publisher and is propagated to the Subscriber (* Using the following schedule: Occurs every 1 day(s), every 1 hour(s) between 0.00:00 and 23:59:00.
<Sack
Next>
Change..
Cancel
Рис. 14.79. Окно Set Merge Agent Schedule мастера Push Subscription Wizard
Замечание Как было сказано в начале главы, запуск агентов репликации осуществляется с помощью заданий службы SQLServerAgent. Таким образом, вы можете определить дополнительные расписания запуска любого агента репликации, в том числе и Merge Agent. Более того, можно также сконфигурировать запуск агентов при наступлении оповещений, что открывает дополнительные возможности по управлению подсистемой репликации. Подробно конфигурирование запуска заданий было рассмотрено в главе 12. Когда будет выбрана стратегия запуска агента Merge Agent, можно переходить к следующему окну мастера — окну Initialize Subscription (рис. 14.80), которое
700
Часть Ш. Администрирование
позволяет указать, нужно ли выполнять первоначальную синхронизацию подписчика: П Yes, initialize the schema and data. Установка переключателя в это положение свидетельствует о необходимости выполнения первоначальной синхронизации, которая включает в себя подготовку объектов и закачку данных. Естественно, прежде чем станет возможным выполнение первоначальной синхронизации, предварительно необходимо создать моментальный снимок: • Start the Merge Agent to initialize the subscription immediately — если этот флажок установлен, то первоначальная инициализация подписчика будет осуществлена непосредственно сразу же после завершения работы мастера. В противном случае эта операция выполнится при следующем запуске агента Merge Agent. • No, the Subscriber already has the schema and data. В этом случае предполагается, что подписчик уже содержит необходимые объекты и данные, т. е. первоначальная синхронизация уже была выполнена (вручную или каким-то иным способом). Push Subscription Wizard Initialize Subscription r^ Specify whether the subscription(s) needs to be initialized, and if so, when to start the initialization process. •«
t3§
Does Microsoft SQL Server need to initialise the publication schema and data at the Subscriber when the subscription is created? (* ^es IN1 i'r>- thr> chema and dajai If yes, the Snapshot Agent has already created the snapshot. The Merge Agent must apply the existing snapshot to the Subscriber. Start the Merge Agent.to initialize the subscription m i meda i tely f* No, the Subscriber already has the schema and data < Back
Next>
Cancel
Help
Рис. 14.80. Окно Initialize Subscription мастера Push Subscription Wizard
По умолчанию мастер предлагает выполнить первоначальную синхронизацию. Рекомендуется запускать эту операцию даже в том случае, когда подписчик содержит необходимые объекты и данные, т. к. это позволит гарантировать, что подписчик полностью соответствует требованиям репликации. Возможность невыполнения синхронизации используется в случаях, если соединение между подписчиком и хранилищем файлов моментальных снимков (обычно это дистрибьютор) имеет низкую пропускную способность.
Глава 14. Репликация данных
701
Хотя в базе данных Northwind подписчика и содержится та же информация, что и на издателе (конечно, если вы не вносили изменений), тем не менее, мы все же выполним первоначальную синхронизацию, причем сразу же после завершения работы мастера. Далее переходим к работе с очередным окном, называющимся Set Subscription Priority (рис. 14.81), которое предназначено для указания приоритета подписчика. Этот приоритет будет использоваться при разрешении конфликтов изменения данных. Приоритет может либо устанавливаться издателем (положение переключателя Use the priority setting of the Publisher to resolve the conflict), либо задаваться вручную (положение переключателя Use the following priority, between zero (lost) and 99.99 (highest), to resolve the conflict). В последнем случае пользователь должен в текстовом поле явно указать приоритет, который будет иметь подписчик. По умолчанию предлагается значение 75, однако можно указать любое другое в диапазоне от 0 до 99.
Замечание Хотя шкала приоритетов лежит в диапазоне от 0 до 100, значение 100 всегда зарезервировано за издателем. Push Subscription Wizard Set Subscription Priority /—>; Set the priority of this subscription, which helps decide the winner of conflicting 13 data changes. * When a data change at the Subscriber conflicts with a change made elsewhere: f LJse the priority setting of the Publisher to resolve the conflict (* Use ti i- ' I1 rig pi in1, bet *et i zero | iest) ir H -H 59(1 ji » M u resoi e tht j 75.00 Priorities of current subscriptions (for reference): Subscription Name
I Type
j Priority
J-LJ
li < Back | Next>
Cancel
Help
Рис. 14.81. Окно Set Subscription Priority мастера Push Subscription Wizard
Отметим, что каждый подписчик должен иметь свое собственное значение приоритета. Напомним, что при разрешении конфликтов изменения во время работы со стандартным механизмом разрешения конфликтов победителем будет считаться сервер, имеющий наивысший приоритет.
Часть III. Администрирование
702
В нижней части окна имеется таблица, в которой приводится список имеющихся подписчиков с указанием их приоритета. Эта таблица весьма полезна при выборе приоритета. Следующее окно мастера Start Required Services (рис. 14.82) предоставляет пользователю возможность запускать или останавливать службу SQLServerAgent, которая, как уже не раз говорилось, необходима для работы подсистемы репликации. Устанавливая флажок в самом левом столбце, вы тем самым предписываете запустить службу SQLServerAgent (если конечно она еще не запущена) после нажатия кнопки Finish в последнем окне мастера. Текущее состояние службы указывается в столбце Status.
С
Замечание
Если в окне Initialize Subscription было предписано выполнить первоначальную синхронизацию подписчика сразу же после завершения работы мастера, то служба SQLServerAgent должна быть запущена. Push Subscription Wizard Start Required Services See the status of the services requited for this subscription(s) and select those to be started after the subscription(s) is created. This subscription(s) requires the following services to be running on the indicated servers. iStatus | Service (onServerJ Ш
QLServerAgent (on STORAGE)
A service whose check box is selected will be started automatically after the subscription(s) is created. A service whose check box is not selected will have to be started manually for your subscription to work.
Next>
Cancel
Help
Рис. 1 4 . 8 2 . О к н о Start Required Services мастера Push Subscription Wizard
На этом конфигурирование принудительной подписки заканчивается. Следующее окно мастера будет последним. В нем перечислены сконфигурированные свойства создаваемой подписки. После нажатия кнопки Finish мастер приступит к собственно созданию подписки с указанными параметрами. При этом также будут внесены все необходимые изменения в базу данных подписчика — создание триггеров, таблиц поддержки репликации и всех других требуемых объектов.
Глава 14. Репликация данных
703
Создание подписки по требованию Напомним, что этот тип подписки характеризуется тем, что инициатором синхронизации изменений является подписчик. Таким образом, при работе с репликацией по требованию от пользователя понадобится больше внимания, однако при этом имеются и свои преимущества. В частности, пользователь может выбрать время, наиболее удобное для выполнения синхронизации изменений. Более того, при использовании подписки по требованию пользователи могут получать файлы моментального снимка не только из стандартного каталога, но и любого другого. Создание подписки по требованию осуществляется с помощью мастера Pull Subscription Wizard, первое окно которого содержит вводную информацию о выполняемых шагах. В нижней части окна имеется флажок, установка которого предписывает мастеру отображать элементы управления для конфигурирования расширенных свойств подписки. Рассмотрим работу с мастером именно в этом режиме.
Замечание Мастер Pull Subscription Wizard должен быть запущен в контексте того сервера, для которого необходимо создать подписку по требованию. Второе окно мастера называется Look for Publications (рис. 14.83) и определяет источник, в котором будет осуществляться поиск публикаций, предназначенных для подписки: П Look at publications from registered servers. В этом случае поиск публикации будет осуществляться в пределах зарегистрированных серверов. •
Look at publications in the Active Directory or specify publication information, this option is for Publisher running SQL Server 2000 or later. Этот вариант предполагает получение информации о доступных публикациях из каталога Active Directory. Однако, чтобы публикация могла быть найдена с использованием этого метода, необходимо разрешить сохранение информации о ней в Active Directory. Заметим, что использование Active Directory доступно только для SQL Server 2000, работающих под управлением операционной системы Windows 2000 и при установленной поддержке в сети Active Directory.
Мы рассмотрим первый метод поиска публикаций, который работает независимо от используемой операционной системы. В этом случае следующее окно мастера будет называться Choose Publication и иметь вид, подобный приведенному на рис. 14.84. Как видно, в окне приведен список зарегистрированных серверов и созданных на них публикаций. Если публикация располагается на незарегистрированном сервере, то, чтобы подписаться на нее, необходимо предварительно зарегистрировать соответствующий сервер. Это можно выполнить, не выходя из мастера. Регистрация сервера производится с помощью стандартного окна регистрации, открыть который можно с помощью кнопки Register Server.
704
Часть III. Администрирование
Pull Subscription Wizard Look for Publications Where do you wanttolook for a publication?
Where do you want ID look for the publication to which you want to subscribe? servers; С Look at publications in the Active Directory or specify publication information, this option is for Publisher running SQL Server 2000 or later
< Back
Next >
Cancel
Help
Рис. 14.83. Окно Look for Publications мастера Pull Subscription Wizard
ill
Pull Subscription Wizard
Choose Publication Choose the publication to which you want to subscribe. Select one publication from one of the following servers: + J CIT + J SIRIUS - j STORAGE * »!ДШ8ДМНЯДЗЕ
+ J STORAGEYTRELON Register Server.. Expand a Publisher to display publications accessible by the login used to connect to S ' TORAGEURELON' and those that allow anonymous subscriptions.
Next>
Cancel
Help
Рис. 14.84. Окно Choose Publication мастера Pull Subscription Wizard
В нашем случае нужный сервер уже зарегистрирован и остается только выбрать интересующую нас публикацию, после чего можно переходить к очередному окну мастера, которое будет называться Specify Synchronization Agent Login (рис. 14.85). Данное окно предназначено для указания учетной записи, которая
Глава 14. Репликация данных
705
будет использоваться агентом Merge Agent при установлении соединения с дистрибьютором для синхронизации изменений данных. Можно использовать либо учетную запись, предназначенную для запуска службы SQLServerAgent (положение переключателя Impersonated the SQL Server Agent account), либо произвольную учетную запись SQL Server, имеющуюся на дистрибьюторе (положение переключателя Use SQL Server Authentication). В последнем случае необходимо будет указать имя (поле Login) и пароль (поля Password и Confirm password) учетной записи. Pull Subscription Wizard Specify Synchronization Agent Login Specify the login used by the synchronization agent to connect to the Publisher and Distributor. The synchronization agent cannot tun because the SQL Server Agent account is not included in the publication access list for this publication.
When the agent connects to the Publisher: (* impersonate the 3QI rpw-r -IPIJ accounjj С Use SQL Server Authentication
If impersonating the SQL Server Agent account, contact your system administrator to ensure that the account is included in the publication access list.
Next> I
Cancel
Рис. 14.85. Окно Specify Synchronization Agent Login мастера Pull Subscription Wizard
Следующее окно мастера имеет имя Choose Destination Database и предназначено для выбора базы данных, в которую будут реплицироваться данные. В предыдущем разделе мы создали принудительную подписку, которая связана с базой данных Northwind, поэтому новую подписку мы свяжем с другой базой данных, например chair. Скорее всего, такой базы данных на подписчике не окажется, поэтому можно предварительно создать ее. Для открытия окна создания новой базы данных достаточно нажать кнопку New. С помощью окна Allow Anonymous Subscription (рис. 14.86) определяется, будет ли подписка на публикацию осуществляться анонимно или с указанием имени подписывающегося пользователя. Отметим, что мастер не станет выводить данное окно, если для публикации запрещена анонимная подписка. Так как нам нечего скрывать, то мы подпишемся на публикацию с указанием своего имени. Для этого необходимо установить переключатель в положение No, this a named subscription.
Часть III. Администрирование
706 Pull Subscription Wizard Allow Anonymous Subscription Specify whether the subscription is anonymous. Anonymous subscriptions are not registered at the Publisher and can be used lor Internet applications.
Do you want this subscriptiontobe anonymous? f* Yes, make the subscription anonymous • • (* jNo (hi is -i' -ptiorj
:
fiack
Next >
Cancel
Help
Рис. 14.86. Окно Allow Anonymous Subscription мастера Pull Subscription Wizard 1
Pull Subscription Wizard
1
2<J йА^ W\^ -
Initialize Subscription Specify whether the subscription(s) needs to be initialized, and if so, when to start the initialization process.
Does Microsoft SQL Server need to initialize the publication schema and data at the Subscriber when the subscription is created? (* Yes, initialize the schema and data If yes. the Snapshot Agent has already created the snapshot. The Merge Agent must apply the existing snapshot to the Subscriber.
iStart the Merge Agent to initialize the subscription irnmediateiij
No., the Subscriber already has the schema and data
< Back
Next >
Cancel
Help
Рис. 14.87. Окно Initialize Subscription мастера Pull Subscription Wizard
Окно мастера Initialize Subscription (рис. 14.87) позволяет определить, нужно ли выполнять первоначальную синхронизацию подписчика. Так как база данных, в которую будут реплицироваться данные, только что создана, то необходимо обязательно синхронизировать ее с издателем. Для этого переключатель должен
707
Глава 14. Репликация данных
быть установлен в положение Yes, initialize the schema and data. Дополнительно можно отметить флажок в центральной части окна, что предписывает выполнить синхронизацию непосредственно при завершении работы мастера, а не откладывать это до следующего запуска агента Merge Agent. Перейдем к очередному окну, которое называется Snapshot Delivery (рис. 14.88). Оно позволяет указать каталог, из которого следует получать файлы моментального снимка для публикации. В распоряжении пользователя имеется переключатель, с помощью которого и осуществляется выбор каталога: П Use snapshot files from the default snapshot folder for this publication. При установке переключателя в это положение файлы моментального снимка станут выкачиваться из каталога дистрибьютора ReplData, являющегося стандартным для хранения моментальных снимков. О Use snapshot files from the following folder. В этом случае можно указать любой произвольный каталог, из которого необходимо получить файлы моментального снимка. Это может быть как локальный каталог, так и сетевой. Файлы в указанный каталог могут быть помещены как автоматически агентом Snapshot Agent при создании для публикации моментального снимка, так и скопированы пользователем вручную. Если для первоначальной синхронизации будет использован динамический моментальный снимок, то необходимо установить флажок This snapshot is for a dynamically filtered subscription. Pull Subscription Wizard Snapshot Delivery Specify how to access the snapshot files at the time the subscription is initialized. С Use snapshot files from the default snapshot folder for this publication (* lUsejriap
folder:!
| C:\trnp\Dynsnap5 W Xhis snapshot is for a. dynamically filtered subscription.
<£ack
Next>
Cancel
Help
Рис. 14.88. Окно Snapshot Delivery мастера Pull Subscription Wizard
В качестве примера рассмотрим применение динамического моментального снимка, который был создан в разд. "Создание динамического моментального
708
Часть III. Администрирование
снимка"ранее в этой главе. Напомним, что этот снимок был сохранен в каталоге C:\Tmp\DynSnap5. Далее переходим к окну Set Merge Agent Schedule (рис. 14.89), предназначенному для выбора метода запуска агента Merge Agent, который для подписки по требованию всегда запускается на подписчике. Можно утановить переключатель в одно из положений: • Continuously — provides minimal latency between when an action occurs at the Publisher and is propagated to the Subscriber. Агент Merge Agent будет постоянно находиться в памяти. То есть соединение с дистрибьютором будет постоянно установлено и обнаружение и применение изменений станет происходить с минимальными задержками. • Using the following schedule. Агент начнет автоматически запускаться в соответствии с установленным расписанием. • On demand only — you can synchronize this subscription using SQL Server Enterprise Manager or the Windows Synchronization Manager. В этом случае агента можно будет запустить только вручную. То есть пользователь обязан запускать агента каждый раз, когда нужно будет выполнить синхронизацию подписчика с дистрибьютором. Первые два варианта запуска агента Merge Agent не представляют особого интереса, поэтому сконфигурируем ручной запуск. Pull Subscription Wizard Set Merge Agent Schedule Specify how frequently the Merge Agent(s) updates the subscription(s). When should the Merge Agent update the subscription? С
Continuously -- provides minimal latency between when an action occurs at the Publisher and is propagated to the Subscriber
С Using the following schedule: Occurs every 1 day(s), every 1 hour(s) between 0:00:00 and 23:59:59.
jOn demand only -you can synchronize this subscription using SQL Server Enterprise] iManager or the Windows Synchronisation Manager
< Back
Cancel
Рис. 14.89. Окно Set Merge Agent Schedule мастера Pull Subscription Wizard
Как и при создании принудительной подписки, в процессе конфигурирования подписки по требованию необходимо указать приоритет, который будет иметь
Глава 14. Репликация
данных
709
подписчик. Для этого и используется окно мастера Set Subscription Priority (рис. 14.90). Работа с этим окном уже была описана в предыдущем разделе (см. рис. 14.81). Как видно, в нижней части окна в таблице приведена принудительная подписка, созданная в предыдущем разделе и имеющая приоритет 75.
Pull Subscription Wizard |Щ W$ ^
Set Subsciiption Priority Set the priority of this subscription, which helps decide the winner of conflicting data changes. When a data change at the Subscriber conflicts with a change made elsewhere: <"* Use the priority setting of the Publisher to resolve the conflict
f* Use the following priority, between zero (lowest) and 99.99 (highest), to resolve the conflict
Priorities of current subscriptions (for reference): Subscription Name jpl
STORAGEVTrelon:Northwind
;Type
Priority
Push
75,00
J_d
< Back
Next >
Cancel
Help
Рис. 14.90. Окно Set Subscription Priority мастера Pull Subscription Wizard Pull Subscription Wizard Start Required Services See the status of the services required for this subscription(s) and select those to be started after the subscription(s) is created. This subscription(s) requires the following services to be running on the indicated servers. ! Service (on Server] •Status 51 I SQLServerAgent (on STORAGEURELON)
A service whose check box is selected will be started automatically after the subscription!s) is created. A service whose check box is not selected will have to be started manually for your subscription to work.
< gack
j
Next>
Cancel
Help
Рис. 14.91. Окно Start Required Services мастера Pull Subscription Wizard
710
Часть III. Администрирование
Следующее окно мастера Start Required Services (рис. 14.91) предоставляет пользователю возможность запускать или останавливать службу SQLServerAgent. Устанавливая флажок в самом левом столбце, вы тем самым предписываете запустить службу SQLServerAgent после нажатия кнопки Finish в последнем окне мастера. В столбце Status указывается текущее состояние службы. Если служба SQLServerAgent не сконфигурирована для автоматического запуска и была остановлена в момент создания публикации, то следующим окном мастера является окно Configure SQL Server Agent (рис. 14.92). С его помощью можно будет предписать мастеру сконфигурировать службу SQLServerAgent для автоматического запуска при старте операционной системы. Для этого достаточно установить переключатель в верхнее положение. В ином случае необходимо будет запускать службу SQLServerAgent вручную каждый раз, когда потребуется синхронизировать изменения. Pull Subscription Wizard Configure SQL Seivei Agent Select whether to automaticaly start the SQL Server Agent service when the computer is started. Because the replication agents that synchronise subscriptions run unattended, it is recommended that SQL Server Agent be configured to start automatically. Do you want to configure the SQL Server Agent service on S ' TORAGEMRELON' to start automatically when the computer is started? Yes, configure the SQL Server Agent service to start automaticaly jNo, I wil start the SOL Server Agent service manualy
< Back
Next>
Cancel
Рис. 14.92. Окно Configure SQL Server Agent мастера Pull Subscription Wizard
На этом работа с мастером создания подписки по требованию заканчивается. Следующее окно будет последним. После нажатия кнопки Finish в этом окне мастер приступит к непосредственному созданию публикации на основе указанных параметров.
Конфигурирование подписки В двух предыдущих разделах было рассмотрено создание подписок по требованию и по запросу. В этом же разделе рассмотрим управление свойствами уже созданной подписки. Сразу необходимо отметить, что некоторые свойства подписки не могут быть изменены после ее создания.
Глава 14. Репликация данных
711
Для начала рассмотрим управление принудительной подпиской. Для этого можно использовать вкладку Subscriptions (рис. 14.93) окна свойств публикации. При описании свойств публикации мы уже рассматривали эту вкладку. Однако тогда у нас не существовало еще ни одной подписки, поэтому продемонстрировать управление свойствами подписки не было возможности, да и тема была несколько другой. В этом же разделе мы наверстаем упущенное. J*J Publication Properties - Northwind Snapshot | Snapshot Location | Publication Access List | Sync Partners | Status General j Articles j Filter Cou l mns | Filter Rows Subscriptions Subscription Options .Subscriptions: Subscription Name ] Type STORAGEVTe io l n:Chari Pull )TORAGE\Trelon:Northwind Push
j Priority 85,00
Push New... Properties..
Delete Reinitialize Reinitialize i
J±J
Cancel
Help
Рис. 14.93. Вкладка Subscriptions окна свойств публикации
Итак, у нас в таблице приведено две подписки, которые мы создали в предыдущих разделах. Как видно, для каждой из них указывается тип и приоритет. Чтобы управлять свойствами подписки, необходимо выбрать ее имя в таблице Subscriptions и нажать кнопку Properties. В ответ появится окно свойств подписки. Рассмотрим сначала окно свойств подписки по требованию (Pull). Для подписки по требованию не допускается изменения никаких свойств. Однако корректнее сказать, что для подписки по требованию не допускается изменения свойств со стороны дистрибьютора/Ниже в этом разделе мы рассмотрим управление свойствами подписки со стороны подписчика. Откроем же теперь окно свойств принудительной подписки (рис. 14.94). Оно имеет две вкладки. Первая из них — General — весьма напоминает окно свойств подписки по требованию и также не допускает внесения никаких изменений в свойства подписки.
Часть III. Администрирование
712 Subscription Properties
ill
General ij Synchronization | s^3
Subscription Properties „
Identification
•, ,
-
Subscriber:
STORAGEVTrebn
.Database:
North wind
Type:
Push (created by the Publisher)
Status: Full Subscription:
Deactivated t'es, this subscription contains all articles in his publication.
Priority when resolving 75,00 data conflicts:
OK
Cancel
Рис. 14.94. Окно свойств принудительной подписки, вкладка General
Cancel
Рис. 14.95. Окно свойств принудительной подписки, вкладка Synchronization
Subscription Properties General Synchronization Synchronization agent location Where does the Merge Agent run? (• At the .Distributor Г At the Subscriber
OK
Глава 14. Репликация данных
713
Обратимся же ко второй вкладке — Synchronization (рис. 14.95). Как видно, вкладка содержит переключатель, который позволяет для созданной подписки изменять место запуска агента Merge Agen и может быть установлен в следующие положения: • At the Distributor — на дистрибьюторе; • At the Subscriber — на подписчике. При установке переключателя в это положение необходимо указать имя компьютера, на котором запущен SQL Server 2000-подписчик. С помощью кнопки Verify Agent можно проверить успешность запуска агента на указанном сервере. На этом работа со свойствами принудительной подписки заканчивается. Однако, помимо рассмотренного окна свойств подписки по запросу, имеется еще и возможность управления подпиской со стороны подписчика. Для этого необходимо на сервере-подписчике открыть папку Replications\Subscriptions (рис. 14.96) и выбрать в ней нужную подписку по запросу (значение Pull в столбце Туре).
__j_nj_xj -|g| 1
« SQL Server Enterprise Manager - [Console Root\Microsoft SQL Servere\M j "Щ Console • Acton
Window
View
IHelp
locJs
О
g] И
Tree i.."| Console Root R ^
•*
Name
Щ,
Q'
"г
:
%STORAGE:Northwind:Northwind
: :
fflgjcn &•§§ STORAGE (Windows NT/2000)
§ STORAGE :Northwind:Northwind
; •
: Ш C J Databases - S C l Data Transforrnat on Servic :
: : ; ' i ;
;
I :
'% STORAGE: pubs: pubs
Type Pul Pul Push
Status | La Fae lid Th Fae lid Th Never started
:
C i Subscriptions 131 Replication Monitor й C j Security : К C j Support Services +
i+i О M e t a Data Services El Щ STORAGE\TRELON (Windows N i+i C j Databases
i
;
Database Chari pubs Northwnid
^ E C l Publications • ; ^ Northwind:Northwir
i+i C j Data Transformat on Servic Ш C J Management
;
ивтсё
С
it! CCl Management 9 C J Replication
:
:
^
3 Items
Microsoft SQL Servers - f j MATRIX Servers
•
i\
Q | Subscriptions
S C J Replication Й C j Publications ' i (No items) Ш C J Security И C J Support Services iS C j Meta Data Services
-r | ±
r
1
Рис. 14.96. Папка ReplicationsXSubscriptions
Для открытия окна свойств подписки Pull Subscription Properties (рис. 14.97) нужно в ее контекстном меню выбрать команду Properties или просто дважды щелкнуть на имени подписки. Окно свойств имеет четыре вкладки.
Часть III. Администрирование
714 Pull Subscription Properties ! .?.? ™| Synchronization | Security | Snapshot File Location j
ill
C^Si Subscription to publication:
jNorthwind
Publication information Eublisher:
STORAGE
Publisher database:
Northwind
[description:
Merge publication of Northwind database f
Subscription information Anonymous: Priority when resolving data conflicts:
OK
No 85,00
Cancel
Рис. 14.97. Окно свойств подписки по запросу, вкладка General
Содержимое вкладки General практически ничем не отличается от содержимого окна свойств подписки, когда работа с ней осуществляется со стороны дистрибьютора. Внесение изменений не допускается, поэтому сразу перейдем к рассмотрению вкладки Synchronization (рис. 14.98). Вкладка Synchronization служит для управления процессом синхронизации подписчика с дистрибьютором, а также местом запуска агента Merge Agent. В верхней части окна имеется две кнопки — Agent Properties и View Conflicts. С помощью первой из них можно открыть окно свойств агента Merge Agent. Точнее говоря, будет открыто окно свойств задания службы SQLServerAgent, с помощью которого осуществляется запуск агента Merge Agent. Подробно принципы работы с этим окном были рассмотрена в разд. "Запуск агентов" ранее в этой главе. Нажатие второй кнопки — View Conflicts — приводит к открытию окна Microsoft Replication Conflict Viewer. С его помощью можно просмотреть имеющиеся в публикации конфликты изменения. Также это окно помогает вручную решить имеющиеся конфликты. Продолжим рассмотрение элементов управления, имеющихся на вкладке Synchronization. Ниже двух описанных кнопок расположен флажок Enable synchronization using Windows Synchronization Manager. Устанавливая этот флажок, можно разрешить выполнение синхронизации подписчика с дистрибьютором средствами менеджера синхронизации операционной системы, а не только средствами Enterprise Manager. По умолчанию флажок сброшен.
Глава 14. Репликация данных
715
Pull Subscription Properties - 'STORAGE General [.Synchronization]] Security | Snapshot File Location . Synchronization Agent Properties...
'-;.:-
W £nable synchronization using Windows Synchronization Manager On-demand synchronization - - ~ &fiesolveconflicts automatically С Resolve conflicts interactively (articles must support interactive resolution) Merge Agent location
—
(• Run the agent at the Subscriber Г* Run the agent at the Distributor
OK
Cancel
Help
Рис. 14.98. Окно свойств подписки по запросу, вкладка Synchronization
Замечание Запустить менеджер синхронизации операционной системы можно из главного меню Programs (Программы), выбрав затем в группе Accessories команду Synchronize. В центральной части вкладки расположен переключатель On-demand synchronization, с помощью которого можно контролировать возможность разрешения конфликтов обновления пользователями при выполнении ручной синхронизации: Q Resolve conflicts automatically. Разрешение конфликтов будет осуществляться автоматически независимо от пользователей. • Resolve conflicts interactively (articles must support interactive resolution). В этом случае пользователи будут иметь возможность вручную решать конфликты изменения с помощью окна Microsoft Replication Conflict Viewer.
Замечание Напомним, что возможность интерактивного разрешения конфликтов контролируется на уровне отдельной статьи. Таким образом, помимо ручного разрешения конфликтов на уровне подписчика, необходимо позволить выполнение этой операции и на уровне конкретной статьи.
На вкладке Synchronization также имеется переключатель Merge Agent Location, с помощью которого контролируется место запуска агента Merge Agent: • Run the agent at the Subscriber — агент будет запускаться на подписчике;
716
Часть III. Администрирование
П Run the agent at the Distributor — агент будет запускаться на дистрибьюторе. При этом в текстовом поле Network machine name of Distributor необходимо будет указать имя сервера-дистрибьютора. На этом рассмотрение вкладки Synchronization можно закончить и переходить к следующей вкладке — Security (рис. 14.99). Она используется для конфигурирования контекста подсистемы безопасности, в котором будет работать подписка. Точнее, на этой вкладке указывается, какая учетная запись будет использоваться агентом Merge Agent при установлении соединения с дистрибьютором и издателем. Pull Subscription Properties - "STORAGE General | Synchronization Security I Snapshot File Location | Distributor login <* ImpeTsoTa i te the SQCSe^ C~ Use SQL Server Authentication:
Publisher login
-
С Use the same login as for the Distributor <* impersonate the SQL Server Agent account on 'STORAGEVTRELON' (trusted connection) С Use SflL Server Authentication:
OK
Cancel
Рис. 14.99. Окно свойств подписки по запросу, Езкладка Security
Как видно из рисунка, вкладка разделена на две части — Distributor login и Publisher login, которые, соответственно, используются для конфигурирования свойств соединения с дистрибьютором и издателем. В распоряжении пользователя имеется переключатель, который может быть установлен в одно из перечисленных ниже положений: П Impersonate the SQL Server Agent account on 'ServerName' (trusted connection). При установке переключателя в это положение соединение будет осуществляться с использованием аутентификации Windows NT. При этом агент Merge Agent будет иметь те же права, что предоставлены учетной записи, которая применяется для запуска службы SQLServerAgent. При выборе этого варианта необходимо убедиться, что служба SQLServerAgent запускается под учетной записью пользователя домена.
Глава 14. Репликация данных
717
П Use SQL Server Authentication. В этом случае соединение может быть установлено с использованием любой учетной записи SQL Server. Имя и пароль учетной записи должны быть указаны в соответствующих полях. Рассмотренные положения переключателя являются общими для свойств установления соединения как с издателем, так и с дистрибьютором. Однако, для издателя также имеется положение Use the same login as for the Distributor. Установка переключателя в это положение предписывает использовать для установления соединения с издателем те же настройки, что и при установлении соединения с дистрибьютором. Теперь же перейдем к последней вкладке — Snapshot File Location (рис. 14.100). Она позволяет управлять получением файлов моментальных снимков. Pull Subscription Properties - 'STORAGE: General) Synchronization) Security Snapshot File Location ] Snapshot location С Get the snapshot from the Publisher's normal snapshot folder (* Get the snap hot from the following folder:! i Folder: I CAtmp\Dynsnap5 I
_J
P Jhis is a snapshot for a dynamically filtered subscription
(~ Download the snapshot using FTP (File Transfer Protocol]
Temporary working folder Folder: _J Do not specify a folder to use the Wn i dows temporary folder. OK
Cancel
Help
Рис. 14.100. Окно свойств подписки по запросу, вкладка Snapshot File Location
Ведущую роль на вкладке играет переключатель, определяющий тип источника, с которого необходимо получить файлы моментального снимка: П Get the snapshot from the Publisher's normal snapshot folder. Файлы моментального снимка будут получаться из стандартного каталога ReplData, расположенного на дистрибьюторе. • Get the snapshot from the following folder. Можно указать произвольный каталог, из которого и будут копироваться файлы моментального снимка. Собственно каталог указывается в поле Folder. Подобный вариант позволяет использовать динамические моментальные снимки, которые записываются не в стандартный каталог. Если необходимо получить динамический моменталь-
718
Часть III. Администрирование
ный снимок, то следует установить флажок This is a snapshot for a dynamically filtered subscription. • Download the snapshot using FTP (File Transfer Protocol). В этом случае подписчик будет выкачивать файлы с сервера FTP. Предварительно файлы должны быть положены на сервер либо вручную, либо автоматически агентом Snapshot Agent при генерировании моментального снимка. Имя сервера FTP, каталога и номер порта получаются от дистрибьютора. Напомним, что эти параметры конфигурируются с помощью вкладки Snapshot Location окна свойств публикации (см. рис. 14.68). В нижней части вкладки имеется поле Folder. В нем указывается каталог, который будет служить для временного хранения выкачанных файлов моментального снимка. Не рекомендуется указывать временный каталог, используемый операционной системой, т. к. файлы оттуда могут быть автоматически удалены.
Удаление подписки В предыдущих разделах были рассмотрены самые сложные операции работы с подписками — создание новой и конфигурирование существующей подписки, а также синхронизация изменений. Логическим завершением работы с подпиской является ее удаление. Эта операция не представляет ничего сложного и не требует особых знаний. Чтобы удалить подписку, достаточно найти ее в панели Enterprise Manager и в контекстном меню выбрать команду Delete. При удалении подписки не происходит удаления реплицированных данных. Удаление подписки представляет собой деактивизацию механизмов отображения на подписчике изменений, выполненных другими участниками репликации. Полученные в процессе репликации данные могут продолжать использоваться и далее. Однако, если же реплицированные данные необходимо удалить, то эту операцию придется осуществлять вручную.
Глава 15
Мониторинг и аудит Как бы хорошо вы не настроили систему при установке, рано или поздно в ее работе появятся проблемы. Это связано не с ошибками при администрировании, а в большей степени с последствиями добавления в базы данных новой информации, создания новых объектов, написания неоптимизированных запросов, использования новых приложений и т. д. Со временем эти проблемы могут привести к серьезным неприятностям в работе сервера и даже к его краху. Последнее случается достаточно редко, но все же вероятность остается. Чем больше сеть предприятия и чем больше объем обрабатываемой информации, тем выше вероятность возникновения проблем. Одной из обязанностей администратора является контроль работы сервера. Администратор должен периодически измерять нагрузку, которая ложится на подсистемы сервера. Это позволит выявить проблемы на стадии их появления и предпринять необходимые меры для устранения их причин. В противном случае придется смириться с убытками, понесенными вашей компанией, и объяснять начальству, что, мол, техника износилась и пора бы ее заменить, а вашей вины здесь нет. Мониторинг работы сервера может выполняться также для оптимизации работы пользователей. Обычно пользователям не разрешается работать с данными напрямую. Все алгоритмы обработки данных реализуются в виде хранимых процедур. Такой подход позволяет также реализовать при обработке данных бизнеслогику, специфичную для конкретной организации. Разработчик может реализовать правила контроля достоверности данных, которые выполняются при попытке пользователя изменить или удалить данные. Однако не всегда процедуры пишутся наиболее оптимальным образом. Неправильно написанная процедура может заметно снизить производительность выполнения обработки данных. Если хранимая процедура слишком долго блокирует информацию, то это может снизить производительность работы других хранимых процедур. Проблема не так страшна, когда таких процедур одна-две. Однако если количество неоптимизированных процедур значительно, то проблема растет в геометрической прогрессии. Процедуры мешают друг другу, блокируя ресурсы и загружая систему. В этом случае ваши пользователи наверняка отметят, что система работает нестабильно и часто выполнение запросов прерывается. Мониторинг работы SQL Server 2000 позволяет найти хранимые процедуры, которые не лучшим образом используют системные ресурсы и снижают производительность системы в целом. Администратор может проанализировать каждый шаг процедуры в отдельности и определить, какую операцию необходимо опти24 Зак. 83
720
Часть III. Администрирование
мизировать. Это лишь один из примеров оптимизации работы пользователей. Можно легко продолжить этот список. В описанном примере узким местом (bottlenecks) системы является неправильно написанная хранимая процедура. Однако неудовлетворительная производительность сервера может быть связана и с его аппаратной частью. Если пользователи жалуются на низкую производительность выполнения запросов, то прежде всего необходимо локализовать проблему. Будет обидно потратить полдня на поиск неоптимизированной хранимой процедуры, а потом выяснить, что проблема связана с нехваткой оперативной памяти. При выборе компьютера, который будет работать в качестве сервера баз данных предприятия, необходимо оценить объем нагрузки, который ожидается как на компьютер в целом, так и на каждую из подсистем в отдельности. Неудовлетворительная работа одной подсистемы может отрицательно сказаться на производительности всего сервера. Если для реализации крупной системы обработки информации вы приобретаете компьютер с мощной дисковой системой, представленной RAID массивом дисков SCSI, общим объемом 130 Гбайт, но объем оперативной памяти составляет всего 128 Мбайт, то вряд ли работа система будет удовлетворительной. Из-за нехватки оперативной памяти операционная система будет активно использовать виртуальную память, что существенно снижает производительность выполнения запросов пользователей. Приведенный пример является лишь верхушкой айсберга. Все аппаратные части сервера должны по производительности соответствовать друг другу. Медленный процессор может свести на нет производительность дисковой системы, но при использовании медленного винчестера процессор будет простаивать, ожидая завершения дисковых операций ввода/вывода. Если вы затрудняетесь оценить производительность аппаратных подсистем сервера, то можете приобрести готовый сервер. Многие фирмы — производители компьютеров предлагают серверы, оптимизированные под выполнение определенных операций. В крайнем случае обратитесь к специалистам. Профессиональный подход к выбору конфигурации сервера избавит вас от множества проблем в будущем. Из всего вышесказанного следует, что оптимизация работы сервера должна выполняться в комплексе. Простейшим путем увеличения производительности является простое наращивание аппаратных ресурсов сервера — добавление памяти, увеличение объема жестких дисков, установка более мощного или дополнительного процессора и т. д. Однако в некоторых случаях увеличения производительности можно добиться и другими способами. Например, вы можете разнести файлы базы данных, журнала транзакций и "тяжелые" индексы на разные жесткие диски. Это позволит добиться значительного увеличения производительности при выполнении запросов, активно использующих индексы и журнал транзакций.
Выбор инструмента мониторинга Мониторинг производительности системы может осуществляться с помощью различных инструментов. Как было сказано выше, мониторинг можно разделить на две категории:
Глава 15. Мониторинг и аудит
721
D Мониторинг операционной системы и аппаратной части компьютера. В этом случае администратор получит количественную информацию о работе системы. Этот тип мониторинга операционной системы предполагает применение следующих инструментов:
•
•
утилита Performance Monitor;
•
утилита Task Manager;
•
утилита Event Viewer;
•
протокол Simple Network Management Protocol, SNMP.
Мониторинг работы SQL Server 2000 и его подсистем. При использовании этого типа мониторинга вы сможете проанализировать работу отдельных запросов и хранимых процедур. Для получения качественной информации о работе SQL Server 2000 могут применяться следующие инструменты: •
утилита SQL Server Profiler;
•
утилита Enterprise Manager;
•
средства Transact-SQL.
Каждый из упомянутых инструментов мониторинга отличается своей спецификой. Выбор конкретного инструмента, прежде всего, зависит от типа анализируемых объектов. Например, если пользователи жалуются, что выполнение их запросов прерывается, и сервер часто выдает сообщение об ошибке 1205, то это говорит о том, что на сервере часто возникают мертвые блокировки (deadlocks). Вы желаете решить эту проблему. Нетрудно догадаться, что увеличение производительности аппаратной части сервера не приведет к решению вопроса. Необходимо определить, какие запросы образуют мертвые блокировки и переписать их таким образом, чтобы этого больше не возникало.
Замечание Мертвые блокировки — это взаимное блокирование ресурсов разными процессами таким образом, что каждый из них ждет, пока другой процесс освободит ресурсы, необходимые для завершения транзакции. Так как ресурсы, требуемые каждому из процессов, заблокированы, то завершение операций невозможно. Процессы могут бесконечно ожидать разблокирования ресурсов. Мертвая блокировка может состоять более чем из двух процессов. Со временем ситуация может только ухудшиться, когда пользователи запустят запросы, обращающиеся к блокированным ресурсам. Следует решить, какой инструмент должен быть использован для поиска запросов, приводящих к образованию мертвых блокировок. С помощью утилиты Performance Monitor, поставляемой в составе операционной системы, удастся лишь определить общее число мертвых блокировок, выполняемых на сервере, а также частоту их возникновения. То есть вы будете иметь количественную информацию. Для получения качественной информации, с помощью которой можно определить, какие именно запросы вызывают образование мертвых блокировок, должна быть использована утилита SQL Server Profiler.
722
Часть III. Администрирование
Утилита Performance Monitor Начнем рассмотрение методов мониторинга сервера с описания утилиты Performance. Эта программа является стандартной утилитой операционной системы Windows 2000 и предназначена для сбора количественной информации о работе операционной системы и приложений, запущенных в ней. Кроме того, утилита Performance позволяет проводить мониторинг удаленных компьютеров. Это дает возможность централизованно контролировать работу множества серверов сети. Администратору не нужно физически присутствовать при работе за анализируемым компьютером. Конечно, платой за это является увеличение нагрузки на сеть. Необходимо выбрать частоту обновления информации таким образом, чтобы мониторинг не мешал обычной работе пользователей. (
Замечание
)
Утилита Performance в операционной системе Windows NT 4.0 имеет несколько иное название — Performance Monitor. Несмотря на значительные различия в интерфейсе возможности утилиты Performance для Windows 2000 практически те же, что и у утилиты Performance Monitor для Windows NT 4.0. При описании утилиты мы будем использовать название Performance Monitor. Фундаментом работы утилиты Performance Monitor являются счетчики (counters). Счетчик представляет собой переменную, в которой хранится информация о различных параметрах работы анализируемой системы. Конечно, в системе, которую предполагается анализировать, должна быть реализована поддержка счетчиков. При разработке приложения должны быть предусмотрены механизмы, которые бы позволяли контролировать работу приложения. То есть само приложение должно предоставлять информацию о функционировании своих подсистем. С точки зрения утилиты Performance Monitor любое приложение представляет собой набор объектов (objects), работу которых можно анализировать с количественной стороны. Небольшие приложения могут состоять всего из одного объекта, тогда как сложные системы, например Microsoft SQL Server 2000, могут включать множество объектов. Кроме того, объекты наблюдения имеет и сама операционная система. С их помощью можно получить различную информацию об использовании как аппаратных ресурсов сервера, таких как процессор, оперативная память, жесткий диск и т. д., так и о применении ресурсов самой операционной системы, таких как потоки, сетевые протоколы, файл подкачки и т. д. (
Замечание
^
В системе может присутствовать несколько однотипных объектов. Например, на компьютере может использоваться два процессора или несколько жестких дисков. В этом случае для идентификации конкретного объекта существует понятие экземпляр объекта (instances). Возможность мониторинга приложения с помощью утилиты Performance Monitor реализуется на стадии разработки этого приложения. Разработчики должны
Глава 15. Мониторинг и аудит
723
включить в код приложения механизмы, реализующие счетчики и обеспечивающие изменение значений этих счетчиков в зависимости от тех или иных аспектов работы приложения. Однако реализация этих механизмов не означает, что счетчики приложения могут быть сразу же использованы утилитой Performance Monitor. Предварительно необходимо зарегистрировать список объектов, имеющихся в приложении, а также в имеющихся в этих объектах счетчиках. Эта операция обычно выполняется при установке приложения.
Замечание Отказ от регистрации счетчиков вовсе не означает, что приложение не станет отслеживать их значений. Просто значения счетчиков не будут доступны через утилиту Performance Monitor.
Все сказанное выше в полной мере относится и к SQL Server 2000. При его установке можно явно указать, нужно ли регистрировать счетчики производительности. Рекомендуется всегда регистрировать их, т. к. информация о счетчиках занимает всего 64 Кбайта, а кто знает, когда они могут понадобиться. Для регистрации счетчиков, не зарегистрированных при установке SQL Server 2000, впоследствии понадобится дистрибутив SQL Server 2000. В табл. 15.1 приведен список объектов, отражающих работу SQL Server 2000. Таблица 15.1. Список объектов SQL Server 2000 Объект
Описание
SQL Server: Access Methods
Информация о выполнении базовых операций доступа к объектам баз данных — выборке данных, расщеплении страниц, доступе к индексам и т. д.
SQL Server: Backup Device
Информация о записи и считывании данных с устройств резервного копирования
SQL Server: Buffer Manager
Информация об использовании буферов и кэшировании различных данных — считывание страниц в секунду, размер процедурного кэша, процент обнаружения страниц в буфере и т. д.
SQL Server: Cache Manager
Информация об использовании кэша для хранения информации о хранимых процедурах, триггеров и плана выполнения запросов
SQL Server: Databases
Информация о базе данных. В основном о применении журнала транзакций — транзакций в секунду, количество свободного пространства, процент выборки из кэша, количество байт в буфере в момент сброса буфера и т. д.
SQL Server: General Statistics
Общая информация о сервере — количество пользователей, операций установления и закрытия соединений в секунду
SQL Server: Latches
Общая информация о блокировках — среднее время ожидания установления блокировки, количество блокировок в секунду, которые не удалось установить немедленно, суммарное время ожидания установки блокировок
724
Часть III. Администрирование Таблица 15.1 (окончание)
Объект
Описание
SQL Server: Locks
Информация о блокировках для конкретной базы данных, таблицы, страницы и т. д. — среднее время ожидания установки блокировки, количество запросов на установление блокировок в секунду, время ожидания установки блокировки
SQL Server: Memory Manager
Информация об использования памяти — количество блокировок памяти, общее количество используемой сервером памяти, количество установленных блокировок на области памяти
SQL Server: Replication Agents
Общая информация о работе агентов репликации — общее количество обслуживаемых инсталляций
SQL Server: Replication Dist.
Информация о работе агента Distribution Agent подсистемы репликации — количество команд и транзакций, доставленных подписчикам, а также время ожидания применения этих команд и транзакций
SQL Server: Replication Logreader
Информация о работе агента Log Reader Agent подсистемы репликации — количество команд и транзакций, считанных с издателя и записанных в базу данных распределения
SQL Server: Replication Merge
Информация о работе агента Merge Agent подсистемы репликации — количество считанных и закачанных изменений, а также количество обнаруженных конфликтов
SQL Server: Replication Snapshot
Информация о работе агента Snapshot Agent подсистемы репликации — количество команд и транзакций, доставленных на дистрибьютор за секунду
SQL Server: SQL Statistics
Статистическая информация о работе сервера — количество пакетов команд, выполняемых в секунду, количество повторных компиляций в секунду и т. д.
SQL Server: User Settable Object
Счетчики этого объекта могут быть использованы для нужд пользователей
В табл. 15.1 перечислены объекты, позволяющие контролировать работу SQL Server 2000. Большинство из них содержит множество счетчиков, с помощью которых и контролируется тот или иной аспект работы SQL Server 2000. Мы не будем описывать все счетчики, т. к. это займет очень много места. Тем не менее, рассмотрим работу со счетчиками объекта SQL Server: User Settable Object. Как уже было сказано, этот объект используется для нужд пользователя. Объект SQL Server: User Settable Object имеет 10 счетчиков, именуемых с User Counter 1 до User Counter 10. С каждым из этих счетчиков связана специальная системная хранимая процедура, с помощью которой счетчику можно присвоить определенное значение. Эти хранимые процедуры нумеруются с s p u s e r c o u n t e r l до sp_user_counterlO.
Указанные хранимые процедуры всего-навсего выполняют команду dbcc с недокументированным параметром s e t i n s t a n c e . В этом легко убедиться, выполнив следующий запрос:
Глава 15. Мониторинг и аудит
725
USE master EXEC sp_helptext 'sp_user_counter7'
Будет возвращен результат: Text create proc sp_user_counter7 @newvalue int as dbcc setinstance ('SQLServer:User Settable 1 , 'Query', 'User counter 7', Qnewvalue)
Таким образом, можно довольно просто присвоить значение нужному счетчику напрямую: dbcc setinstance ('SQLServer:User Settable', 'Query', 'User counter 7', 10)
Замечание Отметим, что команда dbcc setinstance может быть применена для установки значений счетчиков объекта SQL Server: User Settable Object. Хотя при использовании указанной команды для установки значений других объектов и появится сообщение об успешном выполнении, на практике ничего изменено не будет. Теперь же перейдем от теории к практике и рассмотрим работу непосредственно с утилитой Performance Monitor. Эту утилиту можно запустить, выбрав в главном меню операционной системы Programs (Программы) группу Administrative Tools, а затем соответствующую пиктограмму. Другой метод запуска предполагает запуск утилиты с помощью командной строки. Для этого необходимо выполнить команду perfmon.exe.
Замечание Мы не будем рассматривать работу с утилитой Performance Monitor операционной системы Windows NT 4.0, а рассмотрим лишь работу с утилитой Performance операционной системы Windows 2000. Как уже было сказано, возможности утилит в этих операционных системах отличаются незначительно. То есть предполагается, что SQL Server 2000 работает под управлением операционной системы Windows 2000. Окно утилиты Performance (рис. 15.1) разделено на две области. В левой части окна представлен список режимов, в которых работает утилита. Выбирая тот или иной элемент в левой части окна, можно переключиться на конфигурирование соответствующего режима работы. Конфигурирование осуществляется в правой части окна, содержимое которого зависит от элемента, выбранного в левой части. По умолчанию работа ведется в режиме System Monitor, который позволяет контролировать показания счетчиков, добавлять новые счетчики, просматривать их в различных режимах, а также экспортировать данные. Вид окна утилиты при работе в этом режиме и приведен на рис. 15.1.
726
Часть ill. Администрирование шшшштшшишш
Ш Performance Щ j
Console
Action
Window
View
D & й : из -laixi;
Help
Favorites
|]
Tree I Favorites I
_] Consoel Root £*] Sysetm Mono tir
Xd Si F j J ШQl
ol \&\
100
Щ Performance Logs and Alerts : •• • Щ Counter Logs | M Trace Logs • l*\ Alerts
90 80 70 60 50 40 30
Lasts
16,000 Average I
8,328 Minimum i
0,000 Maximum | Duration |
Color j |
:
Scale
Counter
Instance
1,000 1,000 1,000
Query Query Query
User counter 1 User counter 3 User counter 5
| Parent Object SQLServenUser Settable SQLServer:User Settable SQLServer:User Settable
20,000 1:40 Computer \\STORAGEi \\STORAGE \\STORAGE
Рис. 1 5 . 1 . Утилита Performance, режим System Monitor
Помимо режима System Monitor, пользователи могут использовать перечисленные далее режимы: • Counter Logs. Этот режим работы позволяет собирать показания определенных счетчиков в специальный журнальный файл. При этом набор счетчиков, информация о которых сохраняется в файле, не зависит от счетчиков, используемых для режима System Monitor. Пользователь может сконфигурировать более одного журнального файлы. Утилита Performance будет записывать информацию в каждый из них параллельно, но друг от друга. Впоследствии сохраненная в журнальном файле информация может быть просмотрена в графическом режиме. Сохранение информации в журнальном файле является незаменимым при длительном наблюдении за системой. При работе в режиме System Monitor представленная в окне информация охватывает сравнительно небольшой участок времени, т. к. устаревшие сведения затирются новыми. Когда же необходимо собрать информацию о счетчиках, например, за неделю, то при использовании режима System Monitor оператор должен будет просидеть все это время у компьютера для обнаружения узких мест. Для применения режима Counter Logs достаточно запустить утилиту Performance и через неделю проанализировать собранную информацию.
Глава 15. Мониторинг и аудит
727
П Trace Logs. Данный режим напоминает предыдущий тем, что также создается журнальный файл. Но в нем сохраняется информация не о значениях счетчиков, а данные, предоставляемые программами или операционной системой. • Alerts. Режим позволяет отправлять сообщения администратору в случае, если показания одного или нескольких счетчиков приближаются к критическому состоянию. Можно сконфигурировать отправку сообщения как в ситуации совпадения значения счетчика с конкретным значением, так и уменьшения или превышения значением счетчика установленного предела. Мы не будем рассматривать использование утилиты Performance в трех последних режимах, а ограничимся обсуждением режима System Monitor. Как видно из рис. 15.1, центральную часть правой области окна занимает поле, в котором и отображаются значения счетчиков. Непосредственно после запуска утилиты для наблюдения не определено ни одного счетчика. Поэтому никакой информации в окне отображаться не будет. Для добавления нового счетчика следует нажать в панели инструментов утилиты кнопку Add (кнопка с плюсом). В ответ откроется окно Add Counters (рис. 15.2), с помощью которого и осуществляется выбор счетчика для добавления. Add Counters
<J
f*" Use Jocal computer counters Add (• Select counters from computer: Close JWSTORAGE _*j Explain Performance object: I'MW.W38iFTWffflPIPPI "J f All counters f All instances f* Select counters from list !* Select instances from list: Active Transactions ^j Backup/Restore Throughput/secdj Administrator Database 3onus Bulk Copy Rows/sec distribution master ЩГГ. 1 nrvr.pi Ягяп Rutas/spr. _L1 model msdb
j£
Рис. 15.2. Окно Add Counters
В верхней части окна расположен переключатель, с помощью которого указывается, будет ли осуществляться наблюдение за локальным компьютером (положение Use local computer counters) или за удаленным (положение Select counters from computer). В последнем случае необходимо будет в раскрывающемся списке, расположенном непосредственно ниже рассмотренного переключателя, выбрать имя интересующего компьютера. В раскрывающемся списке Performance object необходимо указать объект, за счетчиками которого предполагается наблюдать. Именно в этом списке будет приведен перечень объектов, представленных в табл. 15.1. В зависимости от того, какой объект выбран в списке, будет меняться содержимое списка в левом
Часть III. Администрирование
728
нижнем углу, где перечисляется список созданных для объекта счетчиков. Можно добавить либо единственный счетчик (положение переключателя Select counters from list), либо сразу все доступные для объекта счетчики (положение переключателя All counters). Помимо выбора объекта и счетчика, необходимо также задать и экземпляр объекта, за которым будет вестись наблюдение. Выбор экземпляра осуществляется с помощью списка, расположенного в правой нижней части окна. Можно добавить либо счетчики сразу для всех экземпляров объекта, установив переключатель в положение All instances, либо лишь для конкретного экземпляра (положение переключателя Select instances from list). На рис. 15.2 приведен вид окна Add Counters при выбранном объекте SQL Server:Databases. Если указать сразу все счетчики (All counters) для всех экземпляров объекта (All instances), то будет добавлено несколько сотен счетчиков. На рис. 15.3 приведен вид окна утилиты Performance после осуществления указанной операции.
Consoe l Wn jdow he jp l : Action Ve iw Favorites Tree 1 Favorites I __] Consoe l Root £*j System Montior Щ Performance Logs and Alerts P j Counter Logs Щ Trace Logs И ] Alerts
m JJ 4-IXIQI J i l ^ M J
о
too 90
Ш:
0,000 Average |
0,000
•
"
1
шшишштшшшшшш/шшшл
- • • .
0,000 Maximum
Minimum |
:
0,000
Duration Color I Scale | Counter 0,00... 0,01... 0,00... 0,01... 0,00... 0,01... 0,01...
Shrink Data Mov.., Log Flushes/sec Log Bytes Flush... Log Flush Waits/... Log Flush Wait T... Log Truncations Log Growths
Parent | Object master master master master master master master
SQLServer:Databases SQLServer databases SQLServenDatabases SQLServer: Databases SQLServer; Databases SQLServer: Databases SQLServer: Databases SQLServer :Databas
1:40 Computer \\STORA_*J \\STORA ; \\STORA \\STOR.A \\STORA USTORA WSTORA
Рис. 15.3. Объект SQL Server:Databases — все счетчики для всех экземпляров объектов
Контроль за таким набором счетчиков весьма затруднен. Поэтому рекомендуется наблюдать за количеством счетчиков, не превышающим одного-двух десятков. Список счетчиков приводится в нижней части окна. Как видно, для каж-
Глава 15. Мониторинг и аудит
729
дого указывается цвет, масштаб отображения, название счетчика, имя экземпляра объекта, имя самого объекта и т. д. Можно просмотреть свойства любого счетчика, выбрав в его контекстном меню команду Properties. Значения счетчиков указываются в графическом виде в центральной части окна. Каждому счетчику соответствует отдельная кривая. При таком количестве счетчиков, какое мы добавили, трудно будет понять, что же происходит. Поэтому удалим все добавленные счетчики и добавим такое их количество, которое можно без труда контролировать. Для удаления одного счетчика достаточно выбрать его в списке и нажать клавишу . Для удаления же всех счетчиков достаточно нажать на панели инструментов кнопку New Counter Set. После этого добавим счетчик Percent Log Used объекта SQL Server:Databases для всех экземпляров объекта. На рис. 15.4 приведен вид окна утилиты Performance при контроле значений этих счетчиков. Ш Performance '. (0 Console | Action
Tree
fiew
in -Там
Window Це1р Favorites
) j
1Favorites •
__j Consoe l Root :£*] System Montior Щ] Performance Logs and Alerts ; Щ Counter Logs ; P j Trace Logs : |*1 Alerts
Oj Qj Г*JJ ШШМ .+1хЫ
Ш оЬ
100 90 80 70 60 50 40 30 20 10 0 Last ["
52,000 Average ;
52,000 Minimum j
52,000 Maximum | Duration i
Color 1 5cale j Counter 1,000 1,000 1,000 1,000 1,000 1,000 1,000
Percent Log Used Percent Log Used Percent Log Used Percent Log Used Percent Log Used Percent Log Used Percent Log Used
Instance
Parent | Object
Administrator D... MyDistrib Bonus msdb Northwind distribution pubs
— — — — — — —
SQLServer SQLServer SQLServer SQLServer SQLServer SQLServer SQLServer
52,000 1:40 Computer
Databases Databases Databases Databases Databases Databases Databases
\\5TORA U5TORA USTORA \\5TORA \\5TORA—' WSTORA \\STORA -
Рис. 15.4. Объект SQL Server:Databases — счетчик Percent Log Used для всех экземпляров объектов
До сих пор мы рассматривали вывод значений счетчиков в виде кривой. Подобный подход позволяет анализировать изменения счетчиков с течением времени. Однако помимо указанного режима отображения данные также можно просматривать в виде гистограмм. Для просмотра значений счетчиков в этом режиме
730
Часть III. Администрирование
необходимо нажать кнопку View Histogram. После этого окно утилиты примет вид, подобный приведенному на рис. 15.5.
If Console Wn i dow Help
О Й Й : | и
Action Ve i w Favorites j j
Ц]
Tree | Favorites |
gf
[j?
J • ] F\9J
) Console Root •zli System Monitor Щ] Performance Logs and Alerts : Щ Counter Logs • Щ Trace Logs • № Alerts
j j
+1x1 Q|
62,000 Average I Color | Scale ! — 1,000 — 1,000 1,000 1,000 1,000 1,000
1 Counter
Qi•
62,000 Minimum
Instance
| Parent | Object
| Computer
Percent Loa Used
tempdb
Pe c e n t Log U s e d
A d m i n i s t r a t o r D..
SQLServe d a t a b a s e s
\\STORA~
Pe c e n t Log U s e d
MyDistrib
SQLServe :Databases
\\STORA
Pe c e n t Log U s e d
Bonus
SQLServe d a t a b a s e s
\\STORA
Pe c e n t Log U s e d
msdb
SQLServe : Databases
\\STORA
Pe c e n t L o g U s e d
Northwind
SQLServe [Databases
WSTORA—^
1 ППП
Pe c e n t L o g U s e d
distribution
SQLServe [Databases
\\STORA
1,000
Pe c e n t L o g U s e d
pubs
SQLServe [Databases
USTOIWWJ
Рис. 15.5. Объект SQL Server:Databases — режим гистограмм GUI' Performance £onsole Wndow Help i Action
Sew
& У
Ш : -\в\
+ 1 SD|i0 1 Ш i \S
Eavorites ; j Ф"
Tree j Favorites j i 4 Console Root •Ju! System Monitor В @ Performance Logs and Alerts : p j Counter Logs ; Щ Trace Logs ; у ] Alerts
;
:
Dj QlJ I't* 91 Q J Q J S + ! x |
Ij Щт\ш\ ©J»|[5j
\\STORAGE SQLServer:Databases Percent Log Used
Administrator Database 88,000
Total 63,000
<\ 1 Рис. 15.6. Объект SQL Server:Databases — режим отчетов
Bonus 37,000
dtstrib t
Глава 15. Мониторинг и аудит
731
Помимо двух описанных режимов просмотра, также имеется возможность отобразить значения счетчиков в текстовом виде. Для этого достаточно нажать кнопку View Report. Окно утилиты после этого будет иметь вид, подобный приведенному на рис. 15.6. Помимо указанных возможностей просмотра, можно сохранить текущее состояние утилиты в качестве HTML-страницы. Для этого необходимо в центральной части окна щелкнуть правой кнопкой мыши и в контекстном меню выбрать команду Save As, а затем в открывшемся диалоговом окне указать каталог и имя, под которым следует сохранить файл. Впоследствии файл может быть открыт в любое время. Более того, файл можно выложить на Web-сервер и просматривать его с любой точки земного шара. Откроем созданный файл в браузере Internet Explorer. Результат приведен на рис. 15.7. f|E:\WORK\SQL2000\report.htm - Microsoft Internet Енркнчег»
j File Edit Ve j w Favorites Iools Hep l | -фвЕй.'- «* •• (£^ f$j ^3 : ^Search ^Favorites ^History Щ i Address IS E:\WORK\SQL200u\report.htm
у | ^Go j I Links ** _l
_ j j Q l _ i _ J I Q QJJlJ 100
i L I f f
2Q-; 0' Last:
63,000 Average!
63,000 Mn im i um I
63,000 Maximum; Duration I
63,000 1:40
\3ii My Computer
_l
Рис. 15.7. Просмотр содержимого сгенерированной HTML-страницы
Самое интересное, что при открытии страницы имеется возможность переключаться между режимами просмотра. Все кнопки, доступные в отображаемой на странице панели инструментов утилиты Performance, приводят к тому же результату, что и при непосредственной работе с утилитой Performance. Например, на рис. 15.8 приведен вид страницы после нажатия кнопки View Histogram.
Часть ill. Администрирование
732 Ц E:\WORK\SQL2000\report.htm - Microsoft Internet Explorer - { File
Edit
»s;
View
Favorites
lools
Help
•* • ^ ) _ f ] £2 • ^ S e a r c h
. ШFavorites
^History
€
i Address # ] E:\WORK\SQL2000\report.htm
i Links
100 BO 60. 40 20
Last!
37,000 Average
37,000 Minimum |
37,000 Maximum! ' Duration f
37,000 1:40
J
f My Computer Рис. 15.8. Просмотр содержимого сгенерированной HTML-страницы — режим гистограмм
Утилита Task Manager Рассмотренная в предыдущем разделе утилита Performance хотя и предназначена для сбора общей информации о работе SQL Server 2000, все же она в некоторых случаях является довольно избыточной. Иногда необходимо просто определить количество оперативной памяти, занимаемой SQL Server 2000. Для этого можно использовать утилиту Task Manager, которая всегда под рукой. Для ее вызова достаточно нажать комбинацию клавиш +<Shift>+<Esc>. Сразу же после этого откроется окно утилиты, подобное приведенному на рис. 15.9. Как видно из рисунка, окно утилиты представлено тремя вкладками. На первой из них, имеющей название Applications, приведен список приложений, запущенных в настоящее время в операционной системе. В этот список включены не только те приложения, что отображены на панели задач (taskbar), но и которые запущены в фоновом режиме. Для каждого приложения отображается его статус. При нормальной работе приложение имеет статус Running. Если же приложение "повисло" и не отвечает на запросы операционной системы, то для такого приложения указывается статус Not Responding. С помощью утилиты можно "снять" такое приложение, т. е. завершить его работу, принудительно выгрузив из памяти. Для этого достаточно нажать кнопку End Task.
Глава 15. Мониторинг и аудит
733
Ш Windows Task Manager
File Options View Windows |Help Applications | Processes | Performance | Task Status ^Microsoft Word - -chapO17 Ш Running ^Microsoft Excel - Account5 Running Щ Adobe Photoshop Running £'E:\WORK\5QL2000\report.htm - Microsoft In... Running Ц {E:\WORK\_BOOK55J - Far Running [Ж SQL Server Books Online Running ^JSQL Query Analyzer Running OJUntitled - Notepad Running
End Task processes: 40
(CPU Usage: 3%
| Switch To
j
New Task.,.
|Mem Usage: 172984K / 217216K
Рис. 15.9. Окно утилиты Task Manager, вкладка Applications
Ц Windows Task Manager Fjle Options View Help Applications Processes j Performance Image Name inetinfo.exe excel.exe Explorer.exe OSA.EXE internat.exe sqlrnangr.exe svchost.exe iexplore.exe notepad.exe sqlservr.exe sqlservr.exe ntvdm.exe Far.exe Photoshp.exe sqlagent.exe rndm.exe sqlagent.exe •ldistrib.exe' Jtaskmgr.exe
PID j CPLJ | 00 828 963 00 1004 00 1048 00 1072 00 1080 00 1116 00 1128 00 1220 00 1252 00 1276 00 1348 00 00 1372 1463 00 1532 00 1564 00 1636 00 1772 00 1816 02
CPU Time 1 Mern Usage * | 0:00:01 1 352 К 2 808 К 0:00:02 0:00:26 4 304 К 1084 К 0:00:00 0:00:00 1 468 К 3 092 К 0:00:01 2 896 К 0:00:00 5 268 К 0:00:08 1252 К 0:00:00 0:01:23 11 024 К 5 992 К 0:00:37 1272 К 0:00:02 2 108 К 0:00:06 19 140 К 0:00:50 2 364 К 0:00:00 2 120 К 0:00:00 3 136 К 0:00:00 2 300 К Ш 0:00:00 2 220 К 2L 0:00:36 End Process
^Processes: 41
(CPU Usage; 3%
1
iMem Usage: 172772К/217216К ;
Рис. 15.10. Окно утилиты Task Manager, вкладка Processes
Часть III. Администрирование
734
Как видно, на вкладке Applications нет никакого намека на SQL Server 2000. Это связано с тем, что SQL Server 2000 выполняется как часть операционной системы в виде службы. Тем не менее, информация о SQL Server 2000 может быть получена как о процессе операционной системы. Для этого необходимо перейти на вкладку Processes (рис. 15.10), где перечислены все процессы, запущенные в операционной системе. Список объектов на этой вкладке заметно больше, чем на вкладке Applications. Для каждого процесса указывается количество используемого процессорного времени, объем используемой оперативной памяти, идентификатор процесса и другая информация. Именно с помощью этой вкладки можно судить о том, сколько памяти расходует SQL Server 2000, точнее службы MSSQLServer и SQLServerAgent в отдельности. Замечание Служба MSSQLServer представлена процессом sqlservr.exe, а служба SQLServerAgent — sqlagent.exe. Как видно, в окне указаны два процесса sqlservr.exe. Это связано с тем, что на компьютере установлено две инсталляции. Ш Windows Task Manager File Options View Help Applications j Processes; [Performance rCPU Usage - -> • CPU Usage History
MEM Usage
•Memory Usage History
Totals Handles Threads Processes Commit Charge (K) Total .imit Peak ^Processes: 40
10986 383 40
г Physical Memory (K, j Total j Available i System Cache
172928 217216 182144
; Kernel Memory (K) j Total 1 Paged i Nonpaged
:CPU Usage; 7 %
130548 7256 25024
32068 24104 7964
[Mem Usage: 172928K / 217216K
Рис. 15.11. Окно утилиты Task Manager, вкладка Performance
Информацию об общей загрузке системы и использовании ресурсов можно получить с помощью вкладки Performance (рис. 15.11). На этой вкладке отображается информация о загрузке процессора и оперативной памяти, а также выводится статистическая информация о созданных в операционной системе процессах, нитях, описателях, использовании ядра и т. д.
Глава 15. Мониторинг и аудит
735
Утилита Event Viewer Описанная в предыдущем разделе утилита Task Manager позволяет контролировать текущее состояние системы, точнее загрузку операционной системы. Более детальную информацию предоставляет утилита Performance, которая также позволяет длительное время наблюдать за показаниями счетчиков, сохраняя их в файл для последующего анализа. Однако помимо рассмотренных методов наблюдения за системой нельзя не учитывать, что в SQL Server 2000 также могут возникать и нештатные ситуации, определить которые по показаниям счетчиков вряд ли удастся. Для получения информации о нештатных ситуациях как в SQL Server 2000, так и в операционной системе, используется утилита Event Viewer. Она предоставляет доступ к журналом (logs) операционной системы, в которых и хранится информация о тех или иных событиях. В операционной системе имеется несколько типов журналов: • Security Log. Используется для хранения информации, связанной с системой безопасности — регистрации пользователей в системе, выполнении ими тех или иных операций, доступу к файлам и т. д. • System Log. В этом журнале записывается информация о работе операционной системы и различных ее подсистем. • Application Log. Данный журнал используется для записи в него информации, генерируемой различными дополнительными приложениями — SQL Server 2000, Exchange Server, BizTalk Server и другими.
S Event Viewer
^nlJSl
Action Ve iw •> ' (ID РЕ Й? 0 Щ Й1 Tree I I System Log 167event(s) Date 1 Time Ji|] Event Viewer (LoccType
! Щ Application Log vp Information 04.12.2000 19:53:09 S щ Security Log фInformation 04.12.2000 19:53:09 fcP) System Log ^Information 04.12.2000 19:23:28 (K Warning 04.12.2001 18:23:59 .{^Warning 04.12.2001 13:23:59 Ж Warning 04,12.2001 18:23:59 (pInformation 04.12.2000 18:21:01 фInformation 04.12.2000 18:21:01 (^Information 04.12.2000 16:50:06 (^Information 04.12.2000 15:15:46 (^Information 04.12.2000 15:15:45 /^Warning 04.12.2000 14:27:42 /^Warning 04.12.2000 14:27:42
«I
IИ
Source eventlog eventlog eventlog Srv Srv Srv eventlog eventlog eventlog Browser Tcpip Srv Srv
'i''"" •"'• Category None None None None None None None None None None None None None
''"i " ' "•' """"""""j Event User 1 Computer ж 6005 N/A STORAGE-J 6009 N/A STORAGE 6006 N/A STORAGE 2013 N/A STORAGE 2013 N/A STORAGE 2013 N/A STORAGE 6005 N/A STORAGE 6009 N/A STORAGE 6006 N/A STORAGE 8033 N/A STORAGE 4202 N/A STORAGE 2013 N/A STORAGE 2013 N/A STORAGE •* 1
1 ±Г
Рис. 15.12. Окно утилиты Event Viewer
Таким образом, информацию о работе SQL Server 2000 следует искать в журнале Application Log. Запуск утилиты Event Viewer можно выполнить из меню Pro-
736
Часть III. Администрирование
grams (Программы) с помощью категории Administrative Tools или набрать команду eventvwr.exe. Окно утилиты Event Viewer в режиме просмотра журнала Application Log приведено на рис. 15.12. В левой части окна приведен список доступных журналов, тогда как в правой части отображается перечень событий, содержащийся в выбранном журнале. Каждое событие описывается набором атрибутов. Для получения более подробной информации следует дважды щелкнуть на событии. В ответ откроется окно Event Properties (рис. 15.13), в котором и будет приведена подробная информация о событии. Не выходя из этого окна, можно переходить к следующему или предыдущему событию. Event Properties Event Date: 05.12.2000 Time: 20:14 Type: Warning User: N/A Computer: STORAGE
JLl2<J Source: Srv Category: None Event ID: 2013
*
%
|
[Description: The G: disk is at or near capacity.You may need to delete some files.
Data: (• Bytes С 0008: 08 00 0008: 08 00 0010: 00 00 0018: 00 00 0020: 00 00
Words on 00 on nn 08
00 00 00 00 00
02 dd 00 00 00
00 07 00 00 00
OK
48 00 00 00 00
00 88 08 08 08
H. Ъ..Ъ ........ |
Cancel
Рис. 15.13. Окно свойств события Event Properties
В поле Description указывается краткое описание события, по которому и можно определить источник проблемы. Помимо этого, в верхней части окна приводится информация о номере события, дате, компьютере, типе и т. д.
Утилита SQL Server Profiler Представленные ранее инструменты позволяют в основном контролировать лишь количественные характеристики работы SQL Server 2000 и предупреждать администратора, если система находится в критическом состоянии. Однако для детального мониторинга работы SQL Server 2000 и поиска конкретной причины неудовлетворительной работы сервера этих инструментов явно недостаточно.
Глава 15. Мониторинг и аудит
737
С помощью утилиты Performance вы можете лишь определить подсистему, неэффективная работа которой тормозит работу всей системы. Предположим, вы выяснили, что причина периодических зависаний сервера кроется в одной из хранимых процедур. Однако с помощью рассмотренных ранее средств вы не сможете определить, какая именно процедура написана некорректно. Для проведения качественного анализа работы запросов и хранимых процедур необходимо использовать инструменты мониторинга, предоставляемые самим SQL Server 2000. Один из них — утилита SQL Server Profiler. Утилита SQL Server Profiler — это графический инструмент, с помощью которого администратор может наблюдать за теми или иными аспектами работы SQL Server 2000. В основе работы этой утилиты лежит тот же принцип, что и в основе работы утилиты Performance. При выполнении пользовательских запросов, хранимых процедур, команд Transact-SQL, подключении к серверу и отключении от него, а также множестве других операций ядро SQL Server 2000 сохраняет в системных таблицах массу различной информации о ходе выполнения операций. Эта информация может быть получена с помощью специальных хранимых процедур. Утилита SQL Server Profiler использует эти хранимые процедуры для получения необходимой информации. Полученные данные затем представляются в удобном виде с помощью графического интерфейса. Однако пользователи способны получать информацию о процессах SQL Server 2000, обращаясь напрямую к хранимым процедурам. В принципе, на основе этих хранимых процедур можно даже написать свое собственное приложение, которое будет отображать информацию о работе SQL Server 2000 в нужной.форме.
Основы мониторинга Мониторинг работы SQL Server 2000 основывается на наблюдении за событиями (events). Событие генерируется ядром SQL Server 2000 и является минимальным объемом работы, который можно контролировать. Каждое событие принадлежит к какому-то классу событий (event classes), который описывает его параметры и смысл той или иной информации. Для лучшего понимания разницы между событием и классами событий SQL Server Profiler проведем аналогию с объектами и экземплярами объектов Performance Monitor. Класс событий SQL Server Profiler, как и объект Performance Monitor, представляет собой абстрактное описание. Тогда как само событие (экземпляр объекта) — информацию о работе того или иного объекта. Количество классов событий SQL Server довольно велико. Для облегчения работы с ними они были разбиты на двенадцать категорий (category). В табл. 15.2 приведен список категорий и их краткое описание. Таблица 15.2. Список категорий классов событий SQL Server 2000 Имя категории
Описание
Sessions
События, связанные с установлением и закрытием соединения клиента с сервером
738
Часть III. Администрирование
Таблица 15.2 (окончание) Имя категории
Описание
Objects
События, генерируемые в случае создания, открытия, закрытия и удаления объектов базы данных
Scans
События, связанные с просмотром объектов базы данных, таких как таблицы и индексы
TSQL
События, связанные с выполнением команд Transact-SQL
Cursors
События, связанные с использованием курсоров
Stored Procedures
События, связанные с выполнением хранимых процедур
Error and Warning
События, связанные с ошибками и сообщениями SQL Server 2000
Transactions
События, связанные с транзакциями, выполненными SQL Server или MSDTC, а также связанные с работой журнала транзакций
Locks
События, связанные с установкой блокировок в базах данных
Databases
События, происходящие при увеличении или уменьшении размера файлов данных или журнала транзакций
Performance
События, связанные с работой команд манипуляции данными — подготовка и компиляция плана исполнения запроса, использование статистики и т. д.
Server
События, описывающие использование сервером оперативной памяти и запуск, останов и приостанов службы MSSQLServer
Security Audit
События, связанные с отслеживанием различных аспектов действий пользователей
User Configurable
События, определенные пользователями
Как было сказано ранее, информация о событиях хранится в специальных таблицах системной базы данных Master. Каждое событие описывается отдельной строкой. Для описания событий предназначен фиксированный набор колонок данных (Data Column). Однако конкретное назначение колонок зависит от того, к какому классу принадлежит событие. Кроме того, при описании некоторых классов событий могут применяться не все колонки. В этом случае в незадействованной колонке хранится пустое значение (Null). Для простоты в дальнейшем будем называть колонки данных свойствами событий. В табл. 15.3 приведен полный список свойств, используемых для описания всех событий SQL Server. Часть этих свойств используется для всех событий. Эти свойства отмечены символом * во второй колонке таблицы. Замечание По сравнению с SQL Server 7.0 количество колонок данных, имеющихся в распоряжении пользователя, заметно расширилось. Если в SQL Server 7.0 их было всего 25, то в SQL Server 2000 количество колонок возросло до 43. При этом стало гораздо удобнее анализировать информацию, т. к. теперь указываются не только идентифи-
Глава 15. Мониторинг и аудит
739
кационные номера объектов, но и их имя, а также владелец и права доступа пользователя к этим объектам.
Таблица 15.3. Колонки данных, используемые для описания событий SQL Server 2000 Свойство
Описание
Application Name
Имя приложения, установившего соединение с SQL Server. Указывается имя, предоставленное самим приложением, а не физическое имя файла программы
BinaryData
Двоичные данные. Конкретное назначение данных зависит от класса события
ClientProcessID
Идентификационный номер процесса на клиентском компьютере, в контексте которого установлено соединение
Column Permission
Свидетельствует, были ли установлены права доступа к объекту на уровне столбцов
CPU
Количество процессорного времени (в миллисекундах), выделенное контролируемому событию
Database ID*
Идентификационный номер базы данных, с которой работал процесс, вызвавший наступление события
Database Name*
Имя базы данных, с которой работал процесс, вызвавший наступление события
Duration*
Длительность события в миллисекундах
End Time*
Время, в которое было завершено событие
Error
Номер ошибки, с которой был завершен запрос
Event Class*
Класс события
EventSubClass
Подкласс события
FileName
Имя файла базы данных, к которому имеет отношение отображаемая информация
Handle
Специальный дескриптор, представляющий собой целое число. Этот описатель используется технологиями ODBC, OLE DB и DB-Library для координации действий с сервером
Host Name
Имя компьютера, являющегося инициатором соединения, в контексте которого произошло событие
Index ID
Идентификационный номер индекса объекта, на который повлиял процесс, вызвавший событие
Integer Data
Целочисленные данные: Конкретное назначение данных зависит от класса события
LoginName
Имя учетной записи, с правами которой был выполнен запрос. Указывается либо учетная запись SQL Server, либо учетная запись Windows NT
Часть III. Администрирование
740
Таблица 15.3 (продолжение) Свойство
Описание
LoginSID
Имя учетной записи, с правами которой был выполнен запрос. Указывается либо учетная запись SQL Server, либо учетная запись Windows NT
Mode
Целочисленное значение, описывающее свойства события
NestLevel
Уровень вложенности на момент выдачи информации. Соответствует значению, возвращаемому функцией @@NESTLEVEL
NT Domain Name
Имя домена Windows NT, к которому принадлежит пользователь, вызвавший генерацию события
NT Domain Name
Имя домена Windows NT, содержащего сведения о зарегистрированном пользователе, с правами которого установлено соединение
NT User Name
Имя учетной записи Windows NT пользователя, деятельность которого вызвала генерирование события
Object ID
Идентификационный номер объекта, присвоенный ему системой
Object Name
Имя объекта, о котором предоставляется информация
Object Type
Тип объекта, о котором предоставляется информация
OwnerName
Имя владельца объекта, о котором предоставляется информация
Permissions
Целочисленное значение, описывающее права доступа пользователя к объекту: 1 — выборка всех столбцов (SELECT ALL) 2 — обновление всех столбцов (UPDATE ALL) 4 — ссылаться на любой столбец (REFERENCES ALL) 8 — добавлять новые строки (INSERT) 16 — удалять строки (DELETE) 32 — выполнять хранимую процедуру (EXECUTE) 4096 — выбирать хотя бы из одного столбца (SELECT ANY) 8192 — изменять хотя бы один столбец (UPDATE ANY) 16384 — ссылаться хотя бы на один столбец (REFERENCES ANY)
Reads
Количество операций логического чтения, осуществленных за время выполнения события
RoleName
Имя роли активного приложения, в контексте которого выполнялся запрос
Server Name
Имя сервера SQL Server, который подвергается мониторингу
Severity
Уровень серьезности ошибки
Глава 15. Мониторинг и аудит
741 Таблица 15.3 (окончание)
Свойство
Описание
SPID
Идентификационный номер процесса сервера (SPID), ассоциированный сервером с клиентским соединением, вызвавшим возникновение события
SQL User Name
Имя пользователя базы данных, под которым работает клиентское соединение
S t a r t Time
Время, в которое зафиксировано наступление события
State
Код состояния ошибки
Success
Значение 1 свидетельствует об успешности выполнения операции, тогда как значение 0 — о неудаче
TargetLoginName
Имя учетной записи, над которой была произведена какаялибо операция (например, создание)
TargetLoginsID
Идентификатор безопасности учетной записи, над которой была произведена какая-либо операция (например, создание)
TargetUserName
Имя пользователя базы данных, над которым была произведена какая-либо операция (например, создание)
TextData
Символьные данные. Конкретное назначение данных зависит от класса события
Transaction ID
Идентификационный номер транзакции, присвоенный ей системой
Writes
Количество физических операций записи на диск, произведенных за время выполнения события
Некоторые типы событий могут генерировать огромное количество информации. Кроме того, при активной работе пользователей с сервером объем информации увеличивается прямо пропорционально росту запросов пользователей. Анализ большого объема информации, в свою очередь, требует значительных системных ресурсов. Это ведет к тому, что анализ становится весьма затруднительным. Выходом из подобной ситуации является применение фильтров (filters). С помощью фильтров на события можно наложить условия, лишь при соблюдении которых информация о событии будет использована для анализа. Если же условие не выполняется, то информация теряется и не анализируется. Для объектов SQL Server 2000 поддерживается несколько типов фильтров: • Фильтр Like. Выполняет сравнение значения по указанному шаблону. Если значение колонки совпадает с указанным шаблоном, то соответствующая информация включается в отчет Profiler. • Фильтр Not Like. Этот фильтр также выполняет сравнение значения по указанному шаблону, однако информация включается в отчет только в случае несовпадения значения колонки с указанным шаблоном. П Фильтр Equals. Информация включается только в случае полного совпадения.
742
Часть III. Администрирование
П Фильтр Not Equal to. Информация включается только в случае несовпадения. • Фильтр Greater that or equal. Если значение колонки выше или равно указанному значению, то информация будет включена в отчет. П Фильтр Less that or equal. Если значение колонки меньше или равно указанному значению, то информация будет включена в отчет. Замечание Наглядным примером использования фильтров Like/Not Like является ограничение списка контролируемых приложений при выполнении мониторинга с помощью утилиты SQL Server Profiler. Если не применять фильтрацию, то утилита SQL Server Profiler будет отображать информацию об использовании ресурсов сервера, которые необходимы ей для проведения мониторинга. Однако эта информация только мешала бы осуществлять анализ. По умолчанию события, генерируемые утилитой SQL Server Profiler, в мониторинг не включаются.
При использовании фильтра во время работы с утилитой SQL Server Profiler тип фильтра, устанавливаемый для того или иного свойства, контролируется автоматически. Более подробно работа с утилитой SQL Server Profiler, в том числе и установка фильтров, будет рассмотрена в одном из следующих разделов этой главы. Сейчас же рассмотрим, какие классы событий включены в каждую из двенадцати категорий. Каждая из категорий будет рассмотрена в отдельном разделе. В каждом из разделов будет приведена таблица, в которой перечислены все классы событий, принадлежащие категории. В первой колонке указывается имя события, а во второй — его описание. В третьей же колонке представлены свойства, назначение которых зависит от конкретного класса события. К таким свойствам, В Первую очередь, ОТНОСЯТСЯ свойства BinaryData, I n t e g e r Data И Text Data, а также некоторые другие,
Категория Sessions Категория Sessions позволяет контролировать установление и разрыв соедине-' ний клиентов с сервером. С помощью событий этой категории администратор может получить информацию о том, кто, когда и с какого компьютера подключался к серверу, а также о том, сколько времени он проработал и когда отключился от сервера. Данная информация может быть использована как дополнение к системе безопасности SQL Server 2000. В случае повреждения данных или их несанкционированного копирования вы можете определить, какой именно пользователь выполнил операцию. В табл. 15.4 приведен список классов событий категории Sessions. Таблица 15.4. Классы событий категории Sessions Имя класса
Описание
Свойства
Connect
Подключение, еделанное после начала мониторинга
B i n a r y D a t a — значения свойств соединения, устанавливаемые командой SET . Каждый бит соответствует определенной опции
Глава 15. Мониторинг и аудит
743 Таблица 15.4 (окончание)
Имя класса
Описание
Свойства
Disconnect
Отключение от сервера
CPU — процессорное время, затраченное на соединение D u r a t i o n — время, в течении которого существовало соединение
ExistingConnect
BinaryData
Подключение, существовавшее к моменту начала мониторинга
CPU Duration
Замечание Помимо свойств, приведенных в третьей колонке, для объектов категории Sessions поддерживаются все общие свойства, которые могут использоваться для контроля различных аспектов работы пользователей.
Категория Objects События этой категории позволяют контролировать различные операции, производимые в базе данных и над ее объектами. Администратор может контролировать создание, открытие, закрытие и удаление любых объектов базы данных, таких как таблицы, индексы, хранимые процедуры и т. д., а также добавление, удаление и выборку данных с помощью команд Transact-SQL SELECT, INSERT И DELETE. Подобный контроль может быть применен для получения статистической информации об активности использования тех или иных объектов базы данных. Кроме того, события категории Objects могут служить для выполнения аудита деятельности пользователей. С ПОМОЩЬЮ СВОЙСТВ NT User Name, SQL User Name И Host Name можно весьма успешно контролировать действия пользователей. В табл. 15.5 приведен список событий категории Objects с их кратким описанием и указанием свойств, специфичных для конкретного события. Таблица 15.5. Классы событий категории Objects Имя класса
Описание
Свойства
Object: Created
Создание объекта базы данных, например командой
EventSubClass — тип создаваемого объекта
CREATE TABLE Object.Opened
Событие использования объекта, например командами
I N S E R T ,
DELETE ИЛИ SELECT
O b j e c t I D — идентификатор, присвоенный объекту
EventSubClass — тип открываемого объекта O b j e c t ID — идентификатор, присвоенный объекту при создании
744
Часть III. Администрирование
Таблица 15.5 (окончание) Имя класса
Описание
Свойства
Object: Closed
Событие завершения использования объекта командами INSERT, DELETE ИЛИ SELECT
E v e n t S u b C l a s s — тип открытого объекта
Object: Deleted
Удаление объекта базы данных, например, с помощью команды DROP INDEX
O b j e c t ID — идентификатор объекта
E v e n t S u b C l a s s — тип удаляемого объекта Ob j e c t ID — идентификатор удаляемого объекта
Категория Scans При выполнении запросов ядро SQL Server выполняет сканирование таблиц и индексов с целью выборки данных, которые соответствуют критериям запроса. Сам по себе процесс сканирования не влечет изменения или чтения данных. Оно лишь выбирает те строки, которые соответствуют условиям выборки, заданным, например, с помощью конструкции WHERE. Мониторинг аспектов процесса сканирования позволяет определить, какое время необходимо для выполнения тех или иных запросов пользователей. Если процесс сканирования длится слишком долго, то, возможно, необходимо создать дополнительные индексы. Сканирование таблиц и индексов может осуществляться различными способами, т. е. в разных режимах. Режим сканирования указывается в свойстве EventSubClass. В табл. 15.6 приведены различные режимы сканирования с их кратким описанием. Таблица 15.6. Режимы сканирования для объектов категории Scans Значение
Описание
Значение
Описание
1
Нормальное (Normal)
32
Зарезервировано (Reserved)
2
Быстрое (First)
64
Блокирующее (Exlatch)
4
Обратное (Back)
128
Для поддержки индексов (Index supplied)
8
Неупорядоченное (Unordered)
128
16
Нет данных (No data)
256
Маркирующее (Marker)
Замечание Номера режимов сканирования, приведенные в табл. 15.6, представляют собой битовые маски. Номер каждого из режимов соответствует одному биту байта. Режим сканирования может определяться единственным битом или их комбинацией. В последнем случае необходимо сложить номера режимов, которые используются при
Глава 15. Мониторинг и аудит
745
сканировании. Например, если сканирование выполняется с помощью быстрого, неупорядоченного и маркирующего режимов, то итоговый режим будет равен 266 (2+8+256).
В табл. 15.7 приведен список классов событий категории Scans с их кратким описанием и указанием назначения специфичных свойств. Таблица 15.7. Классы событий категории Scans Имя класса
Описание
Свойства
Scan: Started
Время начала сканирования таблицы или индекса
EventSubClass — режим сканирования I n d e x ID — ID сканируемого индекса O b j e c t ID — ID сканируемого объекта
Scan: Stopped
Время окончания сканирования таблицы или индекса
EventSubClass — режим сканирования I n d e x ID — ID сканируемого индекса O b j e c t ID —ID сканируемого объекта
Категория TSQL В эту категорию включены события, используемые для мониторинга вызова удаленных процедур (RPC), пакетов и команд Transact-SQL. События категории TSQL часто служат для анализа производительности выполнения запросов. С ПОМОЩЬЮ СВОЙСТВ S t a r t
Time, End
Time И D u r a t i o n МОЖНО определить,
как
долго выполняется запрос. Внося коррективы в код запроса, можно найти наилучшее решение. С ПОМОЩЬЮ СВОЙСТВ NT User Name и SQL User Name МОЖНО контролировать пользователей, которые осуществляют запросы. Список классов событий, включенных в категорию TSQL, приведен в табл. 15.8. Таблица 15.8. Классы событий категории TSQL Имя класса
Описание
Свойства
R PC: Starting
Вызов удаленной процедуры
T e x t D a t a — текст RPC, которая должна быть выполнена
RPC.Completed
Завершение работы удаленной процедуры
T e x t D a t a — текст завершенной RPC
SQLBatchStarting
Запуск пакета команд Transact-SQL
T e x t D a t a — текст пакета команд, который должен быть выполнен
SQLBatchCompleted
Завершение выполнения пакета команд Transact-SQL
T e x t D a t a — текст пакета команд, который был выполнен
SQLStmtStarting
Запуск команды TransactSQL
T e x t D a t a — текст команды, которая должна быть выполнена
746
Часть III. Администрирование Таблица 15.8 (окончание)
Имя класса
Описание
Свойства
SQLStmtCompleted
Завершение команды Transact-SQL
i n t e g e r Data — количество строк, обработанных командой T e x t D a t a — текст команды, которая была выполнена
Категория Cursors События этой категории позволяют наблюдать за операциями, выполняемыми над курсорами: создание, открытие, закрытие, удаление, преобразование и т. д. В SQL Server 2000 поддерживается несколько типов курсоров. Их перечень с кратким описанием приведен в табл. 15.9 Таблица 15.9. Типы курсоров SQL Server 2000 Значение
Название
Описание
1
Keyset (ключевой)
Строки, включенные в курсор, отмечаются с помощью ключей (индекса)
2
Dynamic (динамический)
Каждый раз при выборке строк курсор обращается к исходным данным и перечитывает их. Это позволяет отображать в курсоре все изменения, сделанные в таблице после открытия курсора
4
Forward only (однонаправленный)
При работе с 'этим типом курсоров разрешается только последовательная выборка. Нельзя выбрать предыдущие строки
8
Static (статический)
Курсор этого типа представляет собой копию данных таблицы. В отличие от динамического курсора, статический курсор не отображает изменения, сделанные в таблице после открытия курсора
16
Fast Forward (быстрый однонаправленный)
Курсор, оптимизированный для быстрого последовательного просмотра. Обладает той же функциональностью, что и обычный однонаправленный курсор (Forward-only), но отличается более высокой производительностью работы
Список классов табл. 15.10.
событий,
включенных
в категорию Cursors,
приведен
в
Таблица 15.10. Классы событий категории Cursors Имя класса
Описание
Свойства
CursorPrepare
Подготовка курсора к использованию (создание)
E v e n t S u b C l a s s —дескриптор подготавливаемого курсора
Глава 15. Мониторинг и аудит
747 Таблица 15.10 (окончание)
Имя класса
Описание
Свойства
CursorOpen
Открытие курсора
E v e n t S u b C l a s s —дескриптор открываемого курсора I n t e g e r Data — тип курсора
CursorExecute
Выполнение курсора (чтение или изменение)
E v e n t S u b C l a s s —дескриптор выполняемого курсора I n t e g e r Data — тип курсора B i n a r y D a t a — дескриптор подготовленного курсора
CursorlmplicitConversion
CursorRecompile CursorClose CursorUnprepare
Неявное преобразование курсора из одного типа в другой
I n t e g e r Data — требуемый тип курсора B i n a r y D a t a — возвращенный тип курсора
Повторная компиляция открытого курсора
Специфичных свойств нет. Доступны только общие свойства
Закрытие курсора
E v e n t S u b C l a s s —дескриптор закрываемого курсора
Удаление курсора
E v e n t S u b C l a s s —дескриптор закрываемого курсора
Категория Stored Procedures События категории Stored Procedures позволяют контролировать различные аспекты выполнения хранимых процедур. С помощью событий SP:CacheHit и SP: Cache Miss можно получить информацию, как часто хранимая процедура выполняется из кэша. Если событие SP:CacheMiss происходит слишком часто, то необходимо увеличить объем оперативной памяти, доступной SQL Server 2000. Это позволит увеличить объем кэш-памяти, доступной для хранимых процедур SQL Server 2000. Выполняя мониторинг события SP:CacheHit с указанием идентификатора хранимой процедуры (фильтр для свойства object ID) МОЖНО определить, как часто конкретная хранимая процедура выполняется из кэша. В табл. 15.11 приведен список событий категории Stored Procedures с кратким описанием и списком специфичных свойств. Таблица 15.11. Классы событий категории Stored Procedures Имя класса
Описание
Свойства
SP:CacheHit
Процедура найдена в кэше
E v e n t S u b C l a s s — уровень вложенности процедуры O b j e c t ID — идентификатор хранимой процедуры
748
Часть III. Администрирование Таблица 15.11 (окончание)
Имя класса
Описание
Свойства
SP:Cachelnsert
Добавление объекта в процедурный кэш
EventSubClass
SP:CacheMiss
Процедура не найдена в кэше
EventSubClass
SP:CacheRemove
Удаление объекта из процедурного кэша
SP:Completed
Завершение выполнения хранимой процедуры
Object ID Object ID EventSubClass Object ID EventSubClass Object ID
TextData — текст процедуры SP:ExecContextHit
SP:Recompile
SP:Starting
Исполнение версии хранимой процедуры, найденной в кэше
EventSubClass
Перекомпиляция хранимой процедуры
EventSubClass
Запуск хранимой процедуры
EventSubClass
Object ID
Object ID Object ID TextData
SP:StmtCompleted
Команда внутри хранимой процедуры завершена
EventSubClass I n t e g e r Data — количество строк, обработанных командой Object ID T e x t D a t a — текст команды TSQL
SP:StmtStarting
Запуск команды TransactSQL из процедуры
EventSubClass Object ID TextData
Категория Error and Warning Категория Error and Warning содержит классы событий, с помощью которых можно контролировать возникновение ошибок и предупреждений, генерируемых ядром SQL Server 2000 и его компонентами (например, OLE DB). Кроме того, события этой категории могут быть использованы для анализа хода выполнения запросов с целью их оптимизации. Например, событие Missing Column Statistics возникает в том случае, если колонка, участвующая в запросе, имеет поврежденную статистику. Использование статистики позволяет построить более эффектив-
Глава 15. Мониторинг и аудит
749
ный план выполнения запроса и, как следствие, добиться более высокой производительности. Если статистика отсутствует или повреждена, то оптимизатор запросов построит неоптимальный план выполнения запроса, что отрицательно скажется на производительности выполнения этого запроса. С помощью событий Execution Warning можно получить информацию о том, как долго система ожидала освобождения ресурсов, прежде чем начать выполнение запроса. Слишком долгое ожидание ресурсов свидетельствует о том, что обрабатываются неоптимизированные запросы. Для более детального анализа блокировок следует использовать события категории Locks. В табл. 15.12 приведен список событий категории Error and Warnings с кратким описанием и списком специфичных свойств. Таблица 15.12. Классы событий категории Error and
Warning
Имя класса
Описание
Свойства
ErrorLog
Ошибка, которая отображается в журнал ошибок SQL Server
S e v e r i t y — уровень серьезности E v e n t S u b C l a s s — номер ошибки T e x t D a t a — текст ошибки
EventLog
Ошибка, которая отображается в журнал ошибок Windows NT
B i n a r y D a t a — двоичные данные S e v e r i t y — уровень серьезности E v e n t S u b C l a s s — номер ошибки T e x t D a t a — текст ошибки
Exception
Исключение SQL Server
I n t e g e r Data — номер ошибки S e v e r i t y — уровень серьезности
EventSubClass — состояние сервера Execution Warnings
Hash Warning
Любые сообщения, генерируемые SQL Server в ходе выполнения команд и хранимых процедур
E v e n t S u b C l a s s — если 1, то ожидание выполнения запроса, если 2 — запрос time-out
Операция хэширования, которая может привести к возникновению проблем
E v e n t S u b C l a s s — тип операции хэширования
Integer Data — время в секундах
Integer Object
Data — уровень рекурсии ID — ID хэш-узла
Missing Column Statistics
Статистика колонки, необходимая для оптимизации, не доступна
T e x t D a t a — список колонок, не имеющих статистику
Missing Join Predicate
Запрос выполняется без
Нет специфичных свойств
предиката
J O I N
750
Часть III. Администрирование
Таблица 15.12 (окончание) Имя класса
Описание
Свойства
OLEDB Errors
Ошибка, сгенерированная OLE DB
T e x t D a t a — текст ошибки
Sort Warnings
Операции сортировки не хватает памяти
EventSubClass —если 1 —одиночный проход, 2 — множественный проход
Категория Transactions Как следует из названия, события этой категории используются для наблюдения за ходом выполнения транзакций. Можно контролировать как обычные, локальные, так и распределенные транзакции, выполняемые координатором распределенных транзакций (MSDTC, Microsoft Distributed Transactional Coordinator). События категории Transactions позволяют контролировать начало, откат, фиксирование и создание точки сохранения (Save point) транзакции. Мониторинг событий рассматриваемой категории часто применяется для отладки приложений, особенно использующих распределенные транзакции. Например, вы можете получить информацию о начале транзакции и ее завершении. С помощью этой информации можно определить, как долго длилась транзакция. Внося различные изменения в хранимые процедуры или запросы, можно найти наиболее оптимальное решение. Кроме того, события категории Transactions могут послужить для получения информации об использовании журнала транзакций. В табл. 15.13 приведен список событий категории Transactions с описанием специфичных свойств. Таблица 15.13. Классы событий категории Transactions Имя класса
Описание
Свойства
DTCTransaction
Отслеживает выполнение распределенных транзакций между двумя и более БД
B i n a r y D a t a — GUID (шестнадцатеричное значение) транзакции E v e n t S u b C l a s s — состояние MSDTC T e x t D a t a — GUID (текстовый) транзакции
SQLTransaction
TransactionLog
Отслеживает команды
E v e n t S u b C l a s s — тип команды TSQL
BEGIN,COMMIT, SAVE И ROLLBACK TRANSACTION
T e x t D a t a — имя транзакции или u s e r t r a n s a c t i o n , если имя не указано
Происходит при записи информации в журнал транзакций
E v e n t S u b C l a s s — тип события журнала транзакций
Глава 15. Мониторинг и аудит
751
Категория Locks С помощью событий категории Locks можно контролировать работу системы блокирования SQL Server 2000. То есть можно получить информацию обо всех блокировках, выполняемых на сервере. Например, с помощью событий Lock:Acquired и Lock: Released можно определить, как долго выполнялась блокировка, и какой тип она имела. Слишком долго удерживаемые блокировки должны быть изучены более детально, т. к. они могут существенно снизить производительность системы и даже привести к возникновению мертвых блокировок (deadlock).
Замечание СВ SQL Server 2000 существуют специальные механизмы решения конфликтов мертвых блокировок. Сервер периодически проверяет, какие блокировки установлены в системе. Если какая-то блокировка удерживается слишком долго, то сервер запускает процесс отслеживания мертвых блокировок. Если обнаруживается, что длительное удержание блокировки вызвано образованием мертвой блокировки, то сервер автоматически решает конфликт. При этом одна из блокировок, образующих мертвую, принудительно снимается, и установившая ее транзакция откатывается. После этого соединение, инициировавшее отмененную блокировку, получает сообщение об ошибке 1205.
Для наблюдения за мертвыми блокировками можно применять события Lock:Deadlock, Lock: Deadlock Chain и Lock:Timeout. С их помощью можно получить информацию о том, когда произошла мёртвая блокировка, как долго она удерживалась, и какие объекты были блокированы. Эта информация может быть использована для поиска причин возникновения подобных блокировок и поиска объектов, на которые налагается мертвая блокировка. Проанализировав полученную информацию можно переписать некоторые участки приложения с целью уменьшения вероятности возникновения мертвых блокировок. В табл. 15.14 приведен список событий категории Locks с кратким описанием и указанием специфичных свойств. Таблица 15.14. Классы событий категории Locks Имя класса
Описание
Свойства
Lock:Acquired
Генерируется при установке блокировки
BinaryData — ID ресурса D u r a t i o n — время, прошедшее между запросом на блокировку и ее установкой
Object ID — ID блокируемого объекта EventSubClass — режим блокировки Lock:Cancel
Происходит при насильственном прерывании блокировки
BinaryData — ID ресурса D u r a t i o n — время, прошедшее между запросом на блокировку и прерыванием запроса
Obj ect ID — ID блокируемого объекта EventSubClass — режим блокировки 25 Зак. 83
Часть III. Администрирование
752
Таблица 15.14 (окончание) Имя класса
Описание
Свойства
Lock:Deadlock
Свидетельствует о возникновении мертвой блокировки
BinaryData — ID ресурса D u r a t i o n — время, прошедшее между установлением блокировки и созданием мертвой блокировки I n t e g e r Data — номер мертвой блокировки Object
ID — ID блокированного объекта
E v e n t S u b C l a s s — режим блокировки Lock:Deadlock Chain
Описывает отдельные блокировки, из которых состоит мертвая блокировка
B i n a r y D a t a — ID ресурса I n t e g e r Data — номер мертвой блокировки Object
ID — ID блокированного объекта
E v e n t S u b C l a s s — режим блокировки Lock: Escalation
Детальная блокировка была преобразована в более общую блокировку
O b j e c t I D — ID объекта, для которого произошла эскалация блокировки
Lock: Released
Блокировка была снята
BinaryData — ID ресурса D u r a t i o n — время, прошедшее между установлением блокировки и ее снятием Object
ID — ID блокированного объекта
E v e n t S u b C l a s s — режим блокировки Lock:Timeout
Запрос на установку блокировки отменен по time-out из-за захвата ресурса другой блокировкой
BinaryData — ID ресурса D u r a t i o n — время, прошедшее между запросом на блокировку и снятием запроса Object
ID — ID блокированного объекта
E v e n t S u b C l a s s — режим блокировки
Категория Databases В категорию Databases включены события, связанные с увеличением и уменьшением размера файлов базы данных. При этом отдельно рассматриваются файлы данных и файлы журнала транзакций. В табл. 15.15 приведен список событий категории Databases. Таблица 15.15. Классы событий категории Databases Имя класса
Описание
Свойства
Data File Auto
Генерируется при автоматическом увеличении
Grow
размера файла данных. Не вызывается при увеличении размера драила командой A L T E R D A T A B A S E
Integer Data — новый размер файла
Глава 15. Мониторинг и аудит
753 Таблица 15.15 (окончание)
Имя класса
Описание
Свойства
Log File Auto Grow
Генерируется при автоматическом увеличении размера файла журнала транзакций. Не вызывается при увеличении размера файла командой ALTER DATABASE
I n t e g e r Data — новый размер файла
Data File Auto Shrink
Свидетельствует о выполнении уменьшения размера файла данных
I n t e g e r Data — новый размер файла
Log File Auto Shrink
Свидетельствует о выполнении уменьшения размера файла журнала транзакций
I n t e g e r Data — новый размер файла
Категория Performance События этой категории позволяют наблюдать за выполнением команд языка манипуляции данных ( D M L , Data Manipulation Language). К этим командам относятся КОМаНДЫ INSERT, UPDATE, SELECT И DELETE, С ПОМОЩЬЮ КОТОрЫХ, СООТВвТСТвенно, выполняется добавление, обновление, выбор и удаление данных. В частности, события рассматриваемой категории (табл. 15.16) позволяют просмотреть план исполнения запроса после обработки его оптимизатором запросов. Таблица 15.16. Классы событий категории Performance Имя класса
Описание
Свойства
Degree of Parallelism
Генерируется при выполнении команд SELECT, INSERT, UPDATE И DELETE. Описывает степень распараллеливания запроса
E v e n t S u b C l a s s — отражает тип команды: 1 — SELECT 2 — INSERT 4 — UPDATE 8 - DELETE B i n a r y D a t a —двоичная маска, описывающая используемые для запроса процессоры I n t e g e r Data — количество страниц памяти, участвующих для хранения плана запроса
Execution Plan
Показывает стандартное дерево плана исполнения команды Transact-SQL
T e x t D a t a — содержит план исполнения запроса
Show Plan All
Показывает детальное дерево плана исполнения команды Transact-SQL
T e x t D a t a — содержит план исполнения запроса
754
Часть III. Администрирование Таблица 15.16
(окончание)
Имя класса
Описание
Свойства
Show Plan Statistics
Показывает детальное дерево плана исполнения команды с указанием количества строк, обработанных на каждом этапе
T e x t Data — содержит план исполнения запроса
Show Plan Text
Показывает стандартное дерево плана исполнения запроса
T e x t D a t a — содержит план исполнения запроса
Категория Server В этой категории содержится всего два события, которые позволяют наблюдать за использованием сервером оперативной памяти и основными моментами работы службы MSSQLServer. В табл. 15.17 приведены названия событий с указанием специфичных свойств. Таблица 15.17. Классы событий категории Server Имя класса
Описание
Свойства
Server Memory Change
Генерируется при изменении объема оперативной памяти, используемой SQL Server 2000, точнее службой MSSQLServer
E v e n t S u b C l a s s — свидетельствует о направлении изменения объема памяти: 1 — увеличение памяти 2 — уменьшение памяти I n t e g e r Data — новый объем памяти, используемый процессором
Service Control
Происходит при изменении состояния службы MSSQLServer
EventSubClass —обозначает: 0 — выход (Exit) 1 — запуск (Start) 2 — приостанов (Pause) 3 — возобновление работы (Continue) 4 — останов (Stop)
Категория Security Audit Это самая большая категория событий. В предыдущих версиях SQL Server ничего подобного не было. События категории Security Audit позволяют отслеживать действия пользователей, которые они выполняют в системе. При работе с SQL Server 7.0 администратор мог отслеживать только попытки регистрации пользователей. В SQL Server 2000 возможности наблюдения за пользователями существенно расширены. Подробное описание всех свойств событий категории Security Audit займет довольно много места. Поэтому мы не будем приводить при описании событий свойства, значения которых и без того понятны. Например, многие
Глава 15. Мониторинг и аудит
755
события имеют свойства LoginSiD и LoginName, которые отображают идентификатор безопасности и имя учетной записи, в контексте которых произошло зарегистрированное событие. Назначение указанных и других подобных свойств (Database Name, Database ID, RoleName, SQL User Name, Permissions, OwnerName, Object Name, Object ID, Column Permissions И Т. Д.) были приведены В табл. 15.3. Специфичные же для событий категории свойства (такие как Event c l a s s , Eventsubciass и т. д.) будут рассмотрены в табл. 15.18, где и приведен список событий. Отметим, что свойство Event c l a s s определяет код события. Это свойство имеет одинаковое назначение для всех событий категории. Поэтому для каждого из них мы будем только указывать значение свойства, идентифицирующее данное свойство. Если аудит сохраняется в таблице, то по свойству Event c l a s s впоследствии можно будет легко идентифицировать события. Таблица 15.18. Классы событий категории Security Audit Имя класса
Описание
Свойства
Audit Login Event
Регистрирует попытки установления и закрытия соединения
Event Class = 101 EventSubClass — класс события: 1 — установление (Login) 2 — отсоединение (Logout), а также LoginSiD, LoginName
Audit Statement GDR Event
Регистрирует работу команд GRANT, DENY И REVOKE
(GDR) для управления правами пользователей на выполнение команд создания объектов базы данных
Event Class = 102 EventSubClass — класс события: 1 — разрешение (GRANT) 2 — отклонение (REVOKE) 3 — запрещение (DENY) Permissions — права доступа: 1 — CREATE DATABASE 2 — CREATE TABLE 4 —CREATE PROCEDURE 8 — CREATE VIEW 16 —CREATE RULE 32 — CREATE DEFAULT 64 — BACKUP DATABASE 128 —BACKUP LOG 512 —CREATE FUNCTION, а также LoginSiD, LoginName, Database ID, Database Name, SQL User Name и TextData
Часть III. Администрирование
756
Таблица 15.18 (продолжение) Имя класса
Описание
Свойства
Audit Object GDR Event
Регистрирует выполнение команд GDR управления правами доступа пользователей к объектам
Event Class = 103 EventSubClass — класс события: 1 — разрешение (GRANT) 2 - отклонение (REVOKE) 3 — запрещение (DENY) P e r m i s s i o n s — права доступа: 1 — SELECT ALL 2 - UPDATE ALL 4 - REFERENCES ALL 8 — INSERT 16 — DELETE 32 - EXECUTE 4096 - SELECT ANY 8192-UPDATE ANY 16384 —REFERENCES ANY, а также LoginSlD, LoginName, Database ID, Database Name, SQL User Name, OwnerName, Object Name, Column Permission и TextData
Audit Addlogin Event
Регистрирует добавление и удаление учетных записей SQL Server (процедуры sp_addloginи sp_droplogin)
Event Class = 104 EventSubClass — класс события: 1 — добавление (Add) 2 — удаление (Drop), а также LoginSlD, LoginName, TargetLoginSID, TargetLoginName и TextData
Audit Login GDR Event
Регистрирует выполнение команд GDR для предоставления, отклонения и запрещения доступа к серверу учетных записей Windows NT (процедуры sp_grantlogin, sp_revokelogin и sp_denylogin)
Event Class = 105 EventSubClass — класс события: 1 — разрешение (GRANT) 2 - отклонение (REVOKE) 3 — запрещение (DENY), а также LoginSlD, LoginName, TargetLoginSID, TargetLoginName и TextData
Глава 15. Мониторинг и аудит
757 Таблица 15.18 (продолжение)
Имя класса
Описание
Свойства
Audit Login Change Property Event
Регистрирует изменение для учетной записи значений по умолчанию — базы данных и языка (процедуры sp_defaultdbи sp defaultlanguage)
Event Class = 106 EventSubClass — класс события: 1 — база данных по умолчанию 2 — язык по умолчанию а также Logins ID, LoginName, TargetLoginSID, TargetLoginName и TextData
Audit Login Change Password Event
Регистрирует факт изменения пароля учетной записи (без отображения самого пароля)
Event Class = 107 EventSubClass — класс события: 1 — пользователь сам изменил свой пароль 2 — пароль пользователя был изменен администратором, а также LoginSID, LoginName, TargetLoginSID И TargetLoginName
Audit Add Login to Server Role Event
Регистрирует факт добавления или удаления учетной записи из фиксированной роли сервера (процедуры sp_addsrvrolemember и sp dropsrvrolemember)
Event Class = 108 EventSubClass — класс события: 1 — добавление (Add) 2 — удаление (Drop), а такжеLoginSID, LoginName, TargetLoginSID, TargetLoginName И RoleName
Audit Add DB User Event
Регистрирует добавление и удаление пользователя базы данных (как учетных записей SQL Server, так и учетных записей Windows NT)
Event Class = 109 EventSubClass — класс события: 1 — sp_adduser 2 — sp_dropuser 3 — sp_grantdbaccess 4 — sp_revokedbaccess, а также LoginSID, LoginName, Database ID, Database Name, SQL User Name, TargetLoginSID, TargetLoginName и RoleName
Audit Add Member to DB Role Event
Регистрирует факт добавления или удаления пользователя базы данных из роли базы данных (процедуры sp_addrolemember и sp_droprolemember)
Event Class = 110 EventSubClass — класс события: 1 — добавление (Add) 2 — удаление (Drop),
758
Часть III. Администрирование Таблица 15.18 (продолжение)
Имя класса
Описание
Свойства а также LoginSID, LoginName, D a t a b a s e I D , D a t a b a s e Name, SQL User Name, T a r g e t User Name и RoleName
Audit Add Role Event
Регистрирует создание и удаление в базе данных пользовательских ролей (процедуры s p _ a d d r o l e и sp_droprole)
Event Class = 111 Event Sub Class — класс события: 1 — добавление (Add) 2 — удаление (Drop), а также LoginSID, LoginName, Database ID, Database Name, SQL User Name и RoleName
Audit App Role Change Password Event
Фиксирует факт изменения пароля для роли приложения
Event Class = 112 Event Sub Class всегда равно 1, а также LoginSID, LoginName, Database ID, Database Name, SQL User Name и RoleName
Audit Statement Permission Event
Регистрирует выполнение команд с учетом предоставленных прав
Event Class = 113 EventSubClass всегда равно 1 Permissions — права доступа: 1 — CREATE DATABASE 2 — CREATE TABLE 4 — CREATE PROCEDURE 8 — CREATE VIEW 16 —CREATE RULE 32 — CREATE DEFAULT 64 —BACKUP DATABASE 128 —BACKUP LOG 512 —CREATE FUNCTION, а также LoginSID, LoginName, Database ID, Database Name, SQL User Name и TextData
Audit Object Permission Event
Фиксирует доступ к объекту с учетом предоставленных прав
Event Class = 114 EventSubClass всегда равно 1 Permissions — права доступа: 1 — SELECT ALL
Глава 15. Мониторинг и аудит
759
Таблица 15.18 (продолжение) Имя класса
Описание
Свойства 2 — UPDATE ALL 4 — REFERENCES ALL 8 — INSERT 16 — DELETE 32 —EXECUTE, а также LoginSID, LoginName, Database ID, Database Name, SQL User Name, OwnerName, Object Name, Column Permission и TextData
Audit Backup/Restore Event
Фиксирует выполнение команд работы с резервными копиями(BACKUP И
Event Class = 115
RESTORE)
1 — архивирование (Backup)
Event Sub Class — класс события:
2 — восстановление (Restore), а также LoginSID, LoginName, Database ID, Database Name, SQL User Name и TextData Audit DBCC Event
Фиксирует факт выполнения команд проверки целостности базы данных DBCC
Event Class = 116 EventSubClass всегда равно 1, а также LoginSID, LoginName, Database ID, Database Name, SQL User Name и RoleName
Audit Change Audit Event
Фиксирует изменения параметров аудита
Event Class = 117 EventSubClass — класс события: 1 — начат новый аудит 2 — останов аудита, а также LoginSID, LoginName и TextData
Audit Server/Stop/Pa use Event
Фиксирует факты останова, запуска и приостанова служб
Event Class = 118 Event Sub Class — класс события: 1 — останов (Shutdown) 2 — запуск (Start) 3 — приостанов (Pause) 4 — продолжение (Continue), а также LoginSID и LoginName
760
Часть III. Администрирование
Категория User Configurable В этой категории отображаются события, определяемые пользователями. Такие события предназначены для генерации событий на уровне приложений и применяются для мониторинга работы приложений. Категория содержит 10 событий, нумерующихся с UserConfigurable:0 и до UserConfigurable:9. Пользовательские события должны генерироваться принудительно путем выполнения специальной хранимой процедуры. Этой процедурой является специальная системная хранимая sp_trace_generateevent, имеющая следующий синтаксис:
процедура
sp_trace_generateevent [ @eventid = ] event_id [ , [ Ouserinfo = ] 'user_info' ] [ , [ @userdata = ] userdata ]
Замечание При работе с предыдущими версиями вместо хранимой процедуры sp_trace_generateevent использовалась системная хранимая процедура x p _ t r a c e _ g e n e r a t e _ _ e v e n t , которая имела более сложный синтаксис.
Рассмотрим назначение параметров этой хранимой процедуры: О
[ @eventid = ] event_id
Параметр имеет тип данных i n t и представляет идентификационный номер события, которое предполагается сгенерировать. Пользовательским событиям соответствуют номера 82—91, которые соответственно связаны с событиями UserConfigurable:0— UserConfigurable:9. Попытка указать иной идентификационный номер приведет к ошибке. О
[ @userinfo = ]
'user_info'
Данный параметр, имеющий тип данных nvarchar (128), используется для указания символьной строки, которая в обычном случае представляет текст сообщения. Значение, указанное с помощью этого параметра, отображается в колонке трассировки Text Data. Если параметр опускается, то колонка TextData будет иметь значение NULL. Замечание Необходимо отметить, что параметр @ u s e r i n f o требует указания строки в стандарте Unicode. Поэтому перед строкой следует указать символ N. Например, Suserinfo = N'No more data for t r a n s l a t e ' . О
[ @userdata = ] user_data
Параметр предназначен для отображения в трассировке любых данных и имеет тип данных varbinary (80.00), т. е. данные должны сохраняться в двоичном виде. Указанное посредством рассматриваемого параметра значение ОТОбражаеТСЯ В КОЛОНКе ТрасСИрОВКИ B i n a r y D a t a .
Глава 15. Мониторинг и аудит
761
Замечание Двоичные данные должны указываться в шестнадцатеричном виде. Запись числа в этой форме требует указания символов Ох непосредственно перед самим числом. Например, чтобы отобразить в колонке B i n a r y D a t a шестнадцатеричное значение 17FA, необходимо указать @userdata = 0 x l 7 F A .
В качестве примера рассмотрим генерирование пользовательского события UserConflglirable:5. В КОЛОНКе TextData укажем значение "Фатальный лизм! ! ! ' , ТОГДа Как В столбце BinaryData — значение 0x28305FC3B:
катак-
EXEC sp_trace_generateevent Qeventid = 87, Quserinfo = N'Фатальный к а т а к л и з м ! ! ! ' , Suserdata = 0x28305FC3B
Помимо колонок TextData и BinaryData для пользовательских событий предназначены следующие колонки, значения которым присваиваются автоматически: П
Application Name;
П
LoginSID;
•
Database ID;
•
NT Domain Name;
•
Host Name;
•
NT User Name;
CJ LoginName;
CD Server Name.
Осуществление мониторинга В предыдущих разделах были подробно рассмотрены события и объекты SQL Server 2000, которые можно подвергнуть мониторингу с помощью утилиты SQL Server Profiler. В этом разделе будут рассмотрены практические стороны мониторинга — выбор объектов мониторинга, установка фильтров, сохранение и анализ полученных данных и т. д. (
Замечание
^
Для запуска SQL Profiler можно использовать различные пути, например, выбрав соответствующий значок в меню Programs (Программы) в категории Microsoft SQL Server или выбрав команду SQL Server Profiler в меню Tools утилиты Enterprise Manager. Кроме того, утилиту Profiler можно запустить из командной строки, набрав команду s q l t r a c e . е х е .
Первое, что необходимо сделать при мониторинге — это выбрать события для анализа. Список событий, подвергающийся мониторингу в одно и то же время, называется профилем трассировки (trace profile). Утилита SQL Server Profiler работает с профилями трассировки, а не с определенными событиями. Кроме того, профиль трассировки можно сохранить как файл и затем использовать снова. В профиле трассировки указываются не только сами события, подвергающиеся мониторингу, но также и фильтры, примененные к этим событиям, и свойства событий, которые необходимо отображать.
Часть III. Администрирование
762
Замечание Утилита SQL Server Profiler позволяет использовать созданный ранее профиль. Однако не стоит путать описание параметров мониторинга — профиля (Trace Definition) с данными, полученными в результате мониторинга — файлом (Trace File) или таблицей (Trace Table). Прежде чем приступить к созданию мониторинга, необходимо сначала запустить утилиту SQL Server Profiler. Непосредственно после запуска окно утилиты пусто (рис. 15.14). До тех пор, пока не будет определен хотя бы один профиль трассировки, утилита не станет отслеживать никаких событий. Надо заметить, что утилита Profiler может одновременно работать с множеством профилей, отслеживая события параллельно. Ш SQL Profiler File Edit View Replay Tools Wind
[Connections: 0
Рис. 15.14. Пустое окно утилиты SQL Server Profiler
Для создания нового профиля необходимо в меню File выбрать команду New, а затем команду Trace или нажать комбинацию клавиш +. В ответ откроется диалоговое окно Connect to SQL Server (рис. 15.15), где следует выбрать подлежащий трассировке сервер и учетную запись, с правами которой будет установлено соединение с выбранным сервером. Connect to SQL Server
Г" Start SQL Server if it is stopped
Connect using: (* Wn idows NT authentication О' SflL Server authentication
OK
Cancel
Help
Рис. 15.15. Окно Connect to SQL Server
Глава 15. Мониторинг и аудит
763
После того, как работа с окном Connect to SQL Server будет завершена, откроется окно Trace Properties (рис. 15.16), с помощью которого и определяется профиль. Как видно из рисунка, это окно имеет четыре вкладки. Trace Properties General | Events | Data Cou l mns I Filters | да. ;ff*^'l
: • T r a c e name:
•
IS ample Tracej ! JSTORAGE
T r a c e S Q L Server:
ill
U s e the following trace template: Template name:
j S Q LS er verProf ilerS tandard
Template file name:
I s\S Q L Prof ileAS Q LS erverProf iler S tandard. tdf
P
S_avetofile:
jngsSAdministrator\MiiDocuments\Trace1.trc
f ? Set maximum file s e e (MB):
M
5
Г" Enable file rollover Г" Server processes SQL Server trace data P Save to table:
JSTORAGE.[master]..[TraceJ]
M l f
Г" Set maximum rows (in thousands):
Г" Enable trace stop time:
111.11-2000
Run
JJ|17:09 Cancel
i Help
Рис. 15.16. Окно Trace Properties, вкладка General
На вкладке General имеется ряд элементов управления, с помощью которых задаются общие свойства профиля: П Trace name — имя профиля трассировки. П Trace SQL Server — имя сервера, события которого будут отслеживаться. П Template name. В этом раскрывающемся списке можно указать один из имеющихся шаблонов. Шаблон представляет собой описание событий и их свойств, которые будут включены в профиль, а также фильтры. Выбор шаблона изменяет значения, заданные на трех остальных вкладках окна Trace Properties. Однако после выбора шаблона можно внести любые изменения в создаваемый профиль трассировки. Использование шаблонов призвано облегчить создание профиля, ориентированного на отслеживание специфических событий — выполнение хранимых процедур, команд Transact-SQL и т. д. Пользователь может организовывать свои собственные шаблоны.
764
Часть III. Администрирование
• Template file name. Данное текстовое поле содержит путь и имя файла, в котором сохранен шаблон, выбранный в раскрывающемся списке Template name. Утилита SQL Server Profiler поставляется с набором стандартных шаблонов, которые располагаются в каталоге \Program Files\Microsoft SQL Server\80\Tools\Templates\SQL Profiler. Можно располагать свои собственные шаблоны либо в этом же каталоге, либо в любом другом. Однако в последнем случае необходимо будет явно указать каталог и имя файла, из которого следует получить шаблон. Это можно сделать с помощью кнопки, расположенной справа от рассматриваемого поля. Все имеющиеся в выбранном каталоге шаблоны будут перечислены в списке Template name. • Save to file. Установка этого флажка предписывает сохранять собранную информацию в файл. Впоследствии можно будет в любой момент просмотреть все события, произошедшие за все время сбора данных. Нажав кнопку в правой части окна, необходимо будет указать имя файла, в котором станет сохраняться информация. При установке рассматриваемого флажка также становятся доступными несколько дополнительных флажков: •
Set maximum file size (MB) — если необходимо ограничить объем информации, сохраняемой в файле, то следует установить данный флажок. При этом в поле нужно будет указать максимальный размер файла в мегабайтах;
•
Enable file rollover — этот флажок используется совместно с предыдущим, и его установка предписывает создать новый файл, как только размер текущего файла достигнет указанного ограничения. Новому файлу присваивается то же имя, что было указано в поле слева от флажка Save to file, но к нему добавляется порядковый номер файла. Например, если для сохранения информации был указан файл SampleTrace.trc, то при достижении указанного размера будет создан новый файл SampleTrace_l.trc, затем SampleTrace_2.trc и т. д.
•
Server processes SQL Server trace data — когда этот флажок установлен, трассируемый сервер обязан передавать всю информацию о трассировке, даже при чрезмерной его загрузке. Если отслеживается большое количество событий, это может значительно снизить производительность сервера в критические моменты. Однако подобный подход гарантирует, что будет сохранена вся информация о происходящих событиях. Если же флажок сброшен, то часть событий, произошедших в моменты критической загрузки сервера, могут быть потеряны.
• Save to table. При установке этого флажка данные о трассировке будут сохраняться в специальной таблице. Для выбора таблицы достаточно нажать кнопку в правой части окна. Можно сохранять информацию как в таблице локального сервера, так и удаленного. Можно указать имя таблицы, которой еще не существует. В этом случае она будет автоматически создана после нажатия кнопки Run. Ее структура будет полностью соответствовать параметрам созданной трассировки. При установке флажка Save to table становится доступным флажок Set maximum rows (in thousands), выбирая который, мож-
Глава 15. Мониторинг и аудит
765
но ограничить количество строк, записывающихся в указанной таблице. Устаревшие строки будут удаляться, и вместо них будет записываться новая информация. Максимальное количество строк в тысячах устанавливается в поле, расположенном в правой части окна. • Enable trace stop time. Устанавливая этот флажок, можно указать момент времени, до которого будет осуществляться трассировка. Эта возможность бывает полезна, когда необходимо завершить сбор информации, например, через несколько часов, а возможности находиться за сервером в это время нет. На этом работа с вкладкой General заканчивается. Следующая вкладка Events (рис. 15.17) используется для выбора классов событий, которые необходимо контролировать. Trace Properties General Events | Data Cou l mns | Filters | —гЛ
Select the SQL Server event classes you want to trace. Selected event classes:
Available event classes: Database Eriors and Warnings Locks Objects 3 Performance Б Scans ±] Security Audit Server Stored Procedures Transactions
Add»
<< Remove
E Security Audit j Audit Login Audit Logout H Sessions ; : ExistingConnection Ei Stoied Procedures i : R PC: Starting | SP:Completed I SP:Starting : SP:StrntStarting
Й TSQL
'Cursors ——. — -Collection of events produced when cursors are created, used and deleted.
Run
Cancel
Help
Рис. 15.17. Окно Trace Properties, вкладка Events
Окно разделено на два списка. В левом из них (Available event classes) приведен список категорий со всеми входящими в них классами событий. В правом списке (Selected event classes) приведены события, выбранные для мониторинга. События в правом списке также группируются по категориям. Для включения или исключение события из мониторинга служат кнопки Add и Remove. В ниж-
Часть III. Администрирование
766
ней части окна отображается краткая информация о назначении выбранного события. После того, как все события, которые предполагается контролировать, перенесены в список Selected event classes, можно переходить к следующей вкладке. Вкладка Data Columns (рис. 15.18) предназначена для управления списком свойств, которые будут отображаться при мониторинге.
Trace Properties General] Events Data Cou lmns j Filters | Select the data cou l mns you want to capture Selected data:
iJnselected data:
ClientProcessID ColumnPermissions CPU DatabaseName Duration EndTime Error
Groups Columns !• EventClass : E ventS ubClass i- TextData DatabaselD : • ObjectlD : ServerName • ;• BinaryData
Add»
FileName
Handle HostName IndexlD IntegerData
Down
UE
r EventClass — — 1 Type of event class captured.
Run
Cancel
Help
Рис. 15.18. Окно Trace Properties, вкладка Data Columns
Работа с вкладкой Data Columns аналогична работе с вкладкой Events. Список Unselected data содержит перечень всех доступных свойств. Набор свойств, которые будут отображаться пользователю, приводится в списке Selected data. С помощью кнопок Up и Down можно контролировать порядок отображения колонок. Последнее, что остается после выбора колонок, которые станут отображаться при мониторинге — это установка фильтров на контролируемые события. Однако эта операция не обязательна и с успехом может быть пропущена. К тому же, если требуется установка фильтра, то необходимо воспользоваться вкладкой Filters (рис. 15.19). На вкладке Filters приведен список свойств событий, выбранных для мониторинга. В зависимости от того, какой тип свойства задан, надо использовать один из
Глава 15. Мониторинг и аудит
767
трех типов доступных фильтров. Типы фильтров и их использование были подробно рассмотрены в разд. "Утилита SQL Server Profiler"'этой главы. 2<J
Trace Properties General] Events j Data Cou l mns Filters J ^Jpj Specify the criteria for determining which events to capture. Trace event criteria: ® Like В Not like : SQL Server Profiler^ ClientProcessID Щ-Equals 53 Not equal to Й Greater than or equal 1+] Less than or equal
•,
Г* Exclude system IDs rApplicationName--
- -
I Name of the client application that created the connection to SQL Seiver. This column | is populated with the values passed by the application rather than the displayed name ! of the program.
Run
Cancel
Help
Рис. 15.19. Окно Trace Properties, вкладка Filters
На этом процесс создания профиля трассировки заканчивается. После нажатия кнопки ОК профиль будет сохранен, и утилита SQL Server Profiler сразу же приступит к контролю событий.
Анализ полученной информации После того, как профиль будет создан, утилита SQL Server Profiler приступает к мониторингу сервера. Как уже было сказано, с помощью данной утилиты можно одновременно работать более чем с одним профилем трассировки и собирать различные данные. Рабочее окно утилиты разделено на две части (рис. 15.20). В верхней части отображается информация о событиях, которые были включены в профиль и удовлетворяют условиям сортировки (если они установлены). Каждое событие отображается в виде отдельной строки. Слева у строки имеется знак [+J, который позволяет раскрыть строку для вывода детальной информации. Кроме того, детальная информация может быть отображена в нижней час-
Часть III. Администрирование
768
ти окна при установке указателя в верхней части на нужную строку. Это примерно та же информация, что выводится после раскрытия строки с помощью знака L+J. Однако ее просмотр в нижней области позволяет вывести в верхней части большее количество событий. По мере того, как происходят новые события, они добавляются в верхний список утилиты SQL Server Profiler. i* SQL Server Profiler - [Sample, Trace (STORAGE)! J,l File Edit Ve iw Repa l yToos l Wnidow Hep l
• ifllx]
' ~ Щ ^ "Ъ Ш • Ф i с» ё Й1 *4 is • И * DatabaselD ObjectlD ServerNarne BinaryDatajSPID!Sta|* EventCa lss JEvertSubCalss TextData •• sp_MShelp_replication_status selec... 1 2247... STORAGE 55 200 SQLStrntStartn ig 1 2247... STORAGE 55 200 SQLStmtStartn ig •- sp_MShelp_replication_status if (sel...1 2247... STORAGE 55 200 SQL:StmtStartn ig •• sp_MShelp_replication_status if not...1 2247... STORAGE 55 200 SQLStmtStartn ig •- sp_MShelp_replication_status if @... 1 2247... STORAGE 55 200 SQLrStmtStartn ig •- sp_MShelp_replication_status if @... 1 2247... STORAGE . 55 200 SQLStmtStartn ig - sp_MShelp_teplication_status if @... 1 2247... STORAGE 55 200 SQLStmtStartn ig •• sp._MShelp_teplication_status sele... 1 2247... STORAGE 55 200 SQL:StmtStartn ig .iStmtStartn ig Ш 1 2247... STORAGE 55 200 SQLStrntStartn ig 1 2247... S T O R A G E 55 SQLStmtStartn ig 200 •- sp_MShelp_replication_status sele... 1 2247... STORAGE 55 200 SQLStmtStartn ig -- sp_MShelp_ieplication_status retur... 1 2247... STORAGE 55 200__ SQLStrntStartn ig sp_MShelp_teplication_status@agen... 1 2247... STORAGE 55 200 * SP: Compelted «1 ±r see l ct @max_m ti estamp ~ mestamp] axftri from tempdb dbo MSreplication_agent_status N i OLOCK? where [@ j agent_type•1 arid agent_type : 5) o> @agent_type - 0, ч
;:
agent_type 8 @anonymous_bit_when_hide0
— Trace is runnn ig
i Ln 20,Col 1 | Rows: 25 Connections: 2 ,;
Рис. 15.20. Утилита SQL Server Profiler
Помимо описанного режима просмотра событий, утилита SQL Server Profiler может отображать информацию, сохраненную в файл или в таблицу. Это позволяет анализировать работу сервера, не имитируя каждый раз одну и ту же ситуацию. Достаточно один раз привести систему в нужное состояние и сохранить все события в файл или таблицу. После этого можно многократно анализировать сведения. Кроме того, если вы не сильны в анализе работы сервера, полученный файл может быть отправлен эксперту. Кроме того, что вы можете просматривать полученную из файла или таблицы информацию о ходе возникновения различных событий, вы также можете выполнить операции, которые вызвали генерацию событий. Для воспроизведения (replay) событий служит меню Replay. Однако элементы в этом меню доступны только в том случае, если информация о событиях загружена из файла или таблицы. Если список событий получен из профиля трассировки, то воспроизведение событий будет невозможно. Однако последовательность событий может
Глава 15. Мониторинг и аудит
769
быть сохранена в файл или таблицу и уже оттуда воспроизведена. Для сохранения информации из профиля в файл или таблицу необходимо воспользоваться в меню File командой Save as. Для начала воспроизведения событий следует выбрать в меню Replay либо пункт Start, либо пункт Step. В ответ откроется окно Connect to SQL Server (см. рис. 15.15), где нужно будет выбрать сервер, который должен аутентифицировать пользователя. Это может быть не тот сервер, чья трассировка выполнялась. После завершения работы с окном Connect to SQL Server будет открыто окно Replay SQL Server (рис. 15.21), с помощью которого требуется сконфигурировать свойства воспроизведения событий. Replay SQL Server —yJ Select the destination server and replay options Replay SflL Server:
(STORAGE
J
flutput file name: • Replay Options
:
— ——
- ;
(*fieplayevents in the order they were traced. This option enables debugging. p Replay events using jnjultiple threads. This option optimizes performance and disables debugging. Start
Cancel
Help
Рис. 1 5 . 2 1 . Диалоговое окно Replay SQL Server
В поле Replay SQL Server указывается сервер, в контексте которого будут воспроизводиться события. По умолчанию предлагается использовать тот же сервер, который выполнял аутентификацию. Однако можно выбрать любой другой, нажав для этого кнопку в правой части окна. В поле Output file name можно указать имя файла, в который будет сохраняться информация, возвращаемая сервером в результате воспроизведения собранных событий. С помощью переключателя Replay Options определяется метод воспроизведения событий: П Replay events in the order they were traced. This option enables debugging. События начнут воспроизводиться в том же порядке, в каком они происходили в реальности. То есть будет осуществляться полная синхронизация событий. Все события станут выполняться в той же последовательности, в которой они происходили в оригинале. Каждое следующее событие будет выполнено только после того, как завершится работа предыдущего. О Replay events using multiple threads. This option optimizes performance and diasbles debugging. В этом случае осуществляется частичная синхронизация событий. События, выполняемые внутри одного соединения, происходят в той же последовательности, в какой они выполнялись при мониторинге. Однако ее-
770
Часть III. Администрирование ли воспроизводятся события, выполненные в нескольких соединениях, то синхронизация между соединениями не осуществлется. То есть событие, которое по времени было выполнено позже других событий, может при воспроизведении быть выполнено раньше этих событий, если оно принадлежит другому соединению. Для обработки событий разных соединений могут использоваться свои собственные потоки.
На этом настройка параметров воспроизведения заканчивается. Для запуска воспроизведения остается только выбрать команду Start в меню Replay. После этого SQL Server Profiler начнет выполнение событий.
Использование Transact-SQL Как уже говорилось ранее, управление мониторингом работы SQL Server 2000 можно осуществлять с помощью хранимых процедур. В SQL Server 7.0 для осуществления мониторинга и управления им пользователям предлагалось более полусотни специальных расширенных хранимых процедур — SQL Server Profiler Extended Procedures. Использование такого большого количества процедур, конечно же, вызывало немалые затруднения. Поэтому в SQL Server 2000 это множество процедур было заменено несколькими системными процедурами и функциями, с помощью которых теперь и осуществляется мониторинг. Хранимые процедуры SQL Server Profiler охватывают все аспекты управления мониторингом работы сервера и могут с успехом заменить применение утилиты SQL Server Profiler. Однако анализ полученных данных будет требовать дополнительных усилий. При использовании утилиты SQL Server Profiler результаты мониторинга представляются в удобной форме с помощью графического интерфейса, что значительно облегчает их анализ. При выполнении мониторинга с помощью хранимых процедур информация, полученная в результате мониторинга, представляет собой всего-навсего набор строк таблиц. Преимуществом использования для мониторинга хранимых процедур являются меньшие требования к системным ресурсам по сравнению с утилитой SQL Server Profiler. Кроме того, с помощью хранимых процедур можно организовать более надежный мониторинг работы сервера. В SQL Server 2000 имеется возможность автоматического выполнения хранимых процедур каждый раз при запуске службы MSSQLServer. Это позволит вести непрерывный мониторинг работы сервера.
Замечание Помимо хранимых процедур, в SQL Server 2000 имеется ряд команд DBCC, С ПОМО-
ЩЬЮ которых можно контролировать различные аспекты работы внутренних механизмов сервера. Мы не будем рассматривать мониторинг средствами хранимых процедур, т. к. подобный способ управления мониторингом достаточно сложен и используется редко. Возможностей, предоставляемых утилитой SQL Server Profiler, вполне достаточно для решения значительной части задач мониторинга.
Глава 16
Создание отказоустойчивой системы Если на сервере баз данных хранится информация, с которой работают несколько сотнен пользователей организации, и она больше нигде не дублируется, то потеря этой информации будет настоящей катастрофой для предприятия. Никогда нельзя исключать выход из строя аппаратной части компьютера, на котором функционирует сервер баз данных. Поэтому одной из основных задач администратора является обеспечение возможности восстановления данных в случае выхода сервера из строя. Эта задача может решаться различными методами. В главе 13 была рассмотрена подсистема резервного копирования, с помощью которой можно обезопасить себя от полной потери информации, хранящейся на сервере. У вас всегда будет иметься копия данных, восстановление которой является только вопросом времени. Помимо использования для создания копии данных такого специализированного механизма, как резервное копирование, можно также применять и другие средства, предоставляемые SQL Server 2000. Например, с помощью подсистемы репликации, рассмотренной в главе 14, можно в режиме реального времени копировать важные данные на удаленный сервер. В случае выхода из строя основного сервера останется возможность работы с данными, расположенными на одном из серверов сети. Также можно применять и возможности служб трансформации данных (DTS, Data Transformation Services), рассмотренных в главе 11. Варианты использования технологии DTS весьма разнообразны. Можно периодически сохранять определенные данные в сетевом каталоге в обычном текстовом файле или отправлять их по электронной почте на другой конец планеты. Можно также и закачивать данные на соседний сервер SQL Server 2000, который может быть использован в случае выхода из строя исходного сервера. Описанные варианты создания копий данных не исчерпывают все возможные варианты. Тем не менее, вернемся к резервному копированию, являющемуся основной технологией создания резервных копий баз данных. Имея резервную копию данных, всегда можно восстановить функционирование системы даже в случае физического повреждения аппаратной части компьютера и системных баз данных. Однако на восстановление системы необходимо значительное время, в течение которого пользователи не смогут работать с данными. Это может повлечь серьезные убытки для организации. Если в ходе восстановления сервера возникнут проблемы, то ситуация еще более ухудшится.
772
Часть III. Администрирование
Многие организации работают по схеме 24x7. Это означает, что сервер баз данных должен быть доступен 24 часа в сутки 7 дней в неделю, т. е. пользователи должны иметь возможность работы с данными в любое время суток в любой день недели. Простои в работе должны быть исключены с максимальной вероятностью. Для достижения этой цели возможностей одного только резервного копирования явно маловато. В SQL Server 2000 имеется несколько технологий, позволяющих обеспечить работоспособность системы в случае выхода из строя жесткого диска или даже всего сервера: П Резервный сервер. Эта технология подразумевает наличие в сети дополнительного сервера, на котором дублируется информация и который может использоваться в случае выхода из строя основного сервера. П Кластер. С помощью данной технологии создается виртуальный сервер SQL Server 2000, к которому обращаются пользователи. На самом деле этот виртуальный сервер состоит из нескольких компьютеров (от 2 до 4). При выходе из строя одного компьютера остальные смогут принимать пользовательские запросы и обрабатывать их. • Технология RAID предоставляет механизм, позволяющий избежать краха системы в случае выхода из строя одного из жестких дисков. В следующих разделах будет подробно рассмотрена каждая из указанных технологий.
Резервный сервер Резервный сервер (standby server), или как его еще называют горячая резервная копия (warm backup), представляет собой специальный выделенный сервер, который дублирует функци основного сервера. В случае выхода из строя основного сервера резервный переключается в нормальный режим, и пользователи могут работать с ним, как с обычным сервером. Резервный сервер работает отдельно от основного сервера, имеет свое собственное сетевое имя и сетевой адрес. Замечание Если основной сервер выходит из строя, то пользователи должны вручную переключиться на использование резервного. При этом должны быть заново запущены все задачи, которые выполнялись на основном компьютере. Автоматический перенос задач между основным и резервным сервером не выполняется. Резервный сервер содержит те же базы данных, что и основной. При нормально работающем основном сервере резервный сервер поддерживает свои базы данных в том же состоянии, что и основной. Для этого с основного сервера периодически копируются все изменения, которые пользователи сделали на нем. Эти изменения в виде транзакций применяются на резервном сервере. В итоге резервный сервер находится в том же состоянии, что и основной. Пользователи
Глава 16. Создание отказоустойчивой системы
773
могут работать как с основным, так и с резервным сервером. Однако данные на резервном сервере доступны в режиме только для чтения (read only mode). В случае выхода из строя основного сервера на резервном выполняется специальная операция восстановления, что дает пользователям возможность работать с резервным сервером в обычном режиме, т. е. не только читать данные, но и изменять их. После того как работоспособность основного сервера будет восстановлена, администратор должен вручную скопировать на основной сервер все изменения, выполненные на резервном сервере. Если основной сервер восстанавливается без применения сделанных на резервном сервере изменений, то эти изменения будут потеряны. Работу с резервным сервером можно разделить на три фазы: П Синхронизация серверов. Это первая операция, выполняемая при установке резервного сервера. Если вы хотите обеспечить поддержку только пользовательских баз данных, то достаточно синхронизировать только необходимые пользовательские базы данных. Однако, если требуется полностью дублировать основной сервер, то нужно скопировать и системные базы данных. На основном сервере администратор обязан создать полную резервную копию выбранных баз данных. Полученный архив затем будет восстановлен на резервном сервере.
(~
Замечание
^
При синхронизации системных баз данных следует учесть, что для базы данных Master невозможно выполнить синхронизацию серверов с помощью резервной копии журнала транзакций. Взамен администратор должен использовать полную резервную копию. •
Установка и синхронизация резервного сервера. После того как администратор создаст резервные копии баз данных, они должны быть восстановлены на резервном сервере в резервном режиме (standby mode). Для восстановления базы данных в этом режиме необходимо выполнить восстановление резервной копии с помощью команды RESTORE С указанием опции STANDBY. Восстановленная база данных будет доступна пользователям в режиме только для чтения (read only mode). Естественно, необходимо гарантировать, что база данных находится в целостном состоянии. Для этого должны быть откачены все незавершенные транзакции и восстановлены все изменения, сделанные данными незавершенными транзакциями. При этом необходимо сохранить все изменения, которые были выполнены незавершенными транзакциями, для последующего применения восстановленной копии журнала транзакций, полученной с основного сервера. Для достижения этой цели все страницы, которые были изменены незавершенными транзакциями, сохраняются в специальном файле отката (undo file). Имя этого файла указывается вместе с опцией STANDBY при восстановлении архива. Для каждой базы данных резервного сервера создается единственный файл отката. Размер этого файла не ограничивается. Периодически администратор должен выполнять на основном сервере создание резервных копий журнала транзакций и применять
774
Часть III. Администрирование
его на резервном сервере. Частота выполнения этой операции зависит от объема изменений, которые пользователи выполняют на основном сервере. Чем больше изменений осуществляется на основном сервере, тем чаще должен создаваться архив журнала транзакций. Так можно минимизировать потери в случае выхода из строя основного сервера. Восстановление журнала транзакций должно выполняться с указанием опции STANDBY И тем же файлом отката, что был использован ранее. П Установка резервного сервера в нормальный режим. В ходе этой операции базы данных резервного сервера переводятся в нормальный режим. После этого пользователи могут подключаться к резервному серверу и работать с ним так же, как они работали с основным сервером. Для перевода базы данных в нормальный режим необходимо выполнить команду RESTORE С опцией RECOVERY BMeCTO ОПЦИИ STANDBY.
В качестве иллюстрации процесса установки и использования резервного сервера приведем примерную последовательность команд Transact-SQL, с помощью которой реализуются все три рассмотренные фазы. USE master GO RESTORE DATABASE MyNwind FROM MyNwind_l WITH STANDBY = 'c:\undo.ldf GO — Применение первого архива журнала транзакций. RESTORE LOG MyNwind FROM MyNwind_logl WITH STANDBY = 'c:\undo.ldf GO — Применение второго архива журнала транзакций. RESTORE LOG MyNwind FROM MyNwind_log2 WITH STANDBY = 'c:\undo.ldf GO — Эта операция повторяется для каждого архива — журнала транзакций, созданного на основном сервере. — Произошел сбой основного сервера. Создается резервная — копия журнала транзакций на основном сервере: BACKUP LOG MyNwind ТО MyNwind_log3 WITH NO_TRUNCATE GO — Применение последнего созданного архива журнала транзакций — на резервном сервере. Все созданные ранее архивы — журнала транзакций должны быть применены. RESTORE LOG MyNwind FROM MyNwind_log3 WITH STANDBY = 'c:\undo.ldf GO
Глава 16. Создание отказоустойчивой системы
775
— Реконструкция (восстановление) баз данных резервного сервера, — после чего они будут доступны для обычной работы. RESTORE DATABASE MyNwind WITH RECOVERY GO
Технология кластеризации Рассмотренная в предыдущем разделе технология использования резервного сервера позволяет очень быстро восстановить нормальную работу пользователей в случае повреждения базы данных или самого сервера. Однако описанная технология имеет существенные недостатки: • администратор должен вручную синхронизировать основной и резервный серверы. Чтобы свести к минимуму ущерб от выхода из строя первичного сервера, необходимо выполнять архивирование журнала транзакций очень часто, что не всегда возможно; • при выходе из строя основного сервера нужно переключить клиентов на использование резервного сервера и запустить заново все задания. Хотя целью технологии резервного сервера является обеспечение максимально быстрого восстановления работы пользователей, все же на переключение резервного сервера в стандартный режим понадобится некоторое время. И пусть это время не слишком велико, все же в некоторых случаях и небольшие простои могут привести к серьезным убыткам. Решением описанных проблем может быть применение кластерных систем (failover support). В основе технологии кластеризации лежит идея о полном дублировании сетевого сервера. Дублирование сервера обеспечивается на уровне операционной системы. Поддержка кластера реализована только в редакции Enterprise Edition операционной системы Windows NT Server, которую и надо использовать для создания кластера серверов баз данных на основе SQL Server 2000. В операционных системах семейства Windows 2000 поддержка кластера имеется только в Windows 2000 Advanced Server и Windows 2000 DNA. Помимо операционной системы, ограничение на создание кластера выдвигает и сам SQL Server 2000. Только редакция Enterprise Edition поддерживает работу в кластере. (
Замечание
^
При создании кластера должны использоваться компьютеры с одинаковыми характеристиками — объемом оперативной памяти, типов процессоров и т. д.
При создании кластера в SQL Server 7.0 можно было использовать только два сервера. В SQL Server 2000 количество серверов, которые допустимо включать в кластер, увеличилось до четырех. Тем не менее, для простоты изложения мы будем рассматривать кластер, состоящий из двух узлов. Серверы, из которых состоит кластер, объединяются в один виртуальный сервер (virtual server). Серверы кластера называются узлами (nodes). Контроль узлов кластера осуществляет-
776
Часть III. Администрирование
ся с помощью службы операционной системы Clustering Service. Пользователи видят только виртуальный сервер и не видят отдельные серверы, входящие в его состав. Типичная структура кластерной системы приведена на рис. 16.1. (
Замечание
^
Создание виртуального сервера на уровне SQL Server 2000 осуществляется с использованием мастера установки.
Вторичный сервер
Рис. 16.1. Общая структура кластерных систем
Служба поддержки кластера производит мониторинг работы узлов и при выходе из строя одного из них переносит нагрузку на оставшийся сервер. В нормальном режиме задачи обрабатываются обоими серверами. Однако этот процесс отличается от распараллеливания задач при работе SQL Server 2000 на многопроцессорных системах. В кластере задачи не делятся, а дублируются. Замечание В кластере могут использоваться многопроцессорные системы. Необходимо, чтобы на узлах работало одинаковое количество процессоров идентичных марок. Общее количество процессоров в кластере может достигать 64.
Хотя задачи дублируются и выполняются на обоих узлах, эти узлы используют общий диск. Один из серверов, называемый основным сервером (primary server), принимает все запросы пользователей, выполняет их и осуществляет всю работу с общим диском. Служба Clustering Services отображает процессы, выполняемые на основном сервере, на другой сервер кластера, который называется вторичным сервером (secondary server). В момент выхода из строя основного сервера на вторичном имеется вся информация о процессах, выполняемых на основном сервере. Служба поддержки кластера отключает основной сервер и переносит все запросы пользователей на дополнительный, тем самым делая его основным сервером. Если же из строя выходит дополнительный сервер, то обработку запросов продолжает основной.
Глава 16. Создание отказоустойчивой системы
777
Благодаря такому подходу пользователи могут не обращать внимание на крах сервера и продолжать работу в обычном режиме. Никаких дополнительных действий предпринимать не нужно. Пользователи вообще могут не подозревать, что их задачи выполняет другой сервер. Чтобы добиться подобной функциональности, серверы должны иметь одинаковые сетевые имена и адреса. В нормальном режиме такая ситуация невозможна. Решение этой задачи ложится на службу кластеризации, которая реагирует на единственное сетевое имя и сетевой адрес. Затем служба кластеризации передает полученную информацию на основной сервер и дублирует ее на дополнительном сервере. Узким местом кластера является общий диск. Если при выходе из строя любой аппаратной части компьютера (кроме диска) можно переложить нагрузку на второй сервер, то выход из строя диска приведет к останову всего кластера. Поэтому рекомендуется в качестве общего диска использовать RAID-массивы. Например, применение технологии дублирования или зеркального отображения гарантирует, что при выходе из строя одного из дисков работа будет продолжена.
Типы конфигурации кластеров Для кластеров поддерживается два типа конфигурации: • Конфигурация "активный-пассивный" (active/passive failover configuration). При работе кластера по этой схеме (рис. 16.2) на основе двух узлов создается один виртуальный сервер, использующий единственный общий диск. Недостатком этого типа кластера является простой дополнительного сервера, который не используется до тех пор, пока основной сервер не выйдет из строя.
Вторичный сервер Windows NT Server ЕЕ
Windows NT erver ЕЕ
Рис. 16,2. Конфигурация "активный-пассивный"
П Конфигурация "активный-активный" (active/active failover configuration). Этот тип конфигурации (рис. 16.3) обеспечивает поддержку двух виртуальных серверов, созданных с использованием двух узлов. Каждый из узлов является основным сервером одного из виртуальных серверов и в то же время дополнительным для другого виртуального сервера. В итоге получаются два вирту-
Часть III. Администрирование
778
альных сервера. При этом для каждого из виртуальных серверов используется отдельный дисковый накопитель. Преимущество этого типа конфигурации в том, что каждый из узлов кластера загружен работой. Однако в случае выхода из строя одного из серверов на оставшийся сервер ложится двойная нагрузка. Поэтому узлы в кластерах "активный-активный" должны иметь достаточный запас производительности, чтобы выдержать нагрузку и не выйти из строя. Клиент Клиент
\\VirtualServer2
Главный сервер \\VirtualServer2 Вторичный сервер \\VirtualServer! Windov4S NT Server ЕЕ ^\^\ JT
Главный сервер \\VirtualServerl Вторичный сервер \\VirtualServer2 Windows NT Server ЕЕ
Рис. 16.3. Конфигурация "активный-активный"
Отдельно стоит сказать о дополнительном программном обеспечении, используемом клиентами. Если для решения некоторых задач пользователей необходимо установить дополнительные приложения, то они должны быть установлены на обоих узлах. В противном случае часть задач, решение которых возложено на дополнительные программы, придется отложить до восстановления основного сервера.
Технология RAID При описании создания базы данных в одной из следующих глав будет рассмотрено влияние расположения файлов базы данных на разных физических дисках на производительность работы сервера. В этом же разделе будет рассмотрено применение технологии RAID (Redundant Array of Independent Disks) для повышения производительности и отказоустойчивости. Операционная система Windows NT 4.0 позволяет работать с файловыми системами FAT16 и NTFS 4.0. При установке SQL Server 2000 поверх Windows 2000 (Windows NT 5.0) дополнительно поддерживается работа с файловыми системами FAT32 и NTFS 5.O. Если установлена файловая система NTFS, операционная система Windows NT (как версии 4.0, так и версии 5.0) позволяет использовать технологию RAID для организации сложных дисковых массивов. В настоящее
Глава 16. Создание отказоустойчивой системы
779
время существует шесть видов дисковых массивов, в соответствии с которыми определены шесть основных уровней массивов RAID: • RAID 0 — чередующийся набор дисков (Striping Set). • RAID 1 — зеркальный набор дисков (Mirror Set). • RAID 2 — набор дисков, в котором применяется чередование данных с информацией четности, которая может быть использована для восстановления поврежденных данных. Информация для восстановления получается применением операции XOR ДЛЯ всех соответствующих блоков. Недостатком системы является низкая производительность при записи и чтении больших блоков данных. • RAID 3 — этот уровень отличается от RAID 2 тем, что используемая для восстановления служебная информация всегда хранится на отдельном диске. Этот диск иногда называется "диском четности". Уровень RAID 3 дает некоторое повышение производительности по сравнению с RAID 2. • RAID 4 — принципы работы дисковых массивов этого уровня такие же, как и для RAID 3. Единственное отличие в том, что увеличен минимальный размер блока, который считывается за одну операцию ввода/вывода. • RAID 5 — чередующийся набор дисков с контролем четности (Striping Set with Parity). Производительность дисковых массивов RAID 2, RAID 3 и RAID 4 не высока. Поэтому в Windows NT эти уровни не применяются. Обычно используются уровни RAID О, RAID 1 и RAID 5. Они обеспечивают в той или иной мере высокую производительность в сочетании с большой надежностью систем. Массивы дисков RAID могут быть реализованы двумя способами: • Аппаратная реализация. В этом случае массив RAID изготавливается в виде специального комплекса, в котором имеется набор дисков. Комплекс обладает специальным реализованным "в железе" контроллером, который выполняет всю обработку данных: вычисление данных контроля четности и распределение информации на множество дисков. Кроме того, контроллер выполняет и автоматическое восстановление данных в случае повреждения одного из жестких дисков массива. При подключении к компьютеру такой комплекс воспринимается как единственный носитель информации, и операционная система записывает на него данные так же, как и на обычный винчестер. Преимуществом аппаратных массивов RAID является снижение нагрузки на операционную систему. • Программная реализация. В этом случае организацией самого массива RAID занимается операционная система. К компьютеру подключается множество самостоятельных жестких дисков, а операционная система уже выполняет все необходимые операции. Преимуществом такого подхода является низкая стоимость конечной системы и возможность более гибко управлять конфигурацией массива.
780
Часть III. Администрирование
Замечание Мы не будем рассматривать создание дисковых массивов RAID при использовании программной реализации, т. к. эта операция не относится непосредственно к SQL Server 2000. Для получения информации по созданию массивов RAID следует обратиться к документации операционной системы. При использовании RAID-массивов для хранения файлов SQL Server 2000 вся работа по поддержанию файлов ложится на операционную систему. Система хранения SQL Server 2000 обращается к файлам, хранящимся в массивах RAID, точно так же, как, например, к файлам, хранящимся на отдельном диске с файловой системой FAT. Планируя размещение файлов на логических дисках, построенных с использованием RAID, необходимо четко представлять принципы работы того или иного уровня. Области применения различных уровней RAID могут существенно различаться. Рассмотрим более подробно достоинства и недостатки каждого из уровней RAID.
Зеркальное отображение и дублирование дисков Некоторые данные настолько важны, что их потеря может привести к самым тяжелым последствиям. Кроме того, иногда необходимо обеспечить максимальную надежность работы операционной системы. Система должна остаться работоспособной даже в случае физического повреждения жесткого диска. Для удовлетворения подобных требований и был разработан уровень RAID 1, который может быть реализован в двух вариантах: П зеркальное отображение дисков; П дублирование дисков. Для создания зеркального набора дисков необходимо иметь два жестких диска, возможно, разных размеров. Они оба должны быть подключены к одному контроллеру. На одном из дисков создается раздел, где будет записываться информация. Этот диск называется основным или оригинальным (original disk). Затем выполняется связывание второго диска с первым. При этом на нем создается точная копия раздела первого диска. Полученный диск называется теневым (shadow disk). Впоследствии, когда будет осуществляться изменение данных на оригинальном диске, все изменения будут в точности отображаться на теневом диске. То есть в каждый момент времени будут иметься две идентичных копии данных. В случае выхода из строя любого из дисков можно будет продолжить работу с оставшимся. Недостаток зеркального набора заключается в том, что при выходе из строя контроллера оба диска окажутся недоступными. Кроме того, подключение обоих дисков к одному контроллеру снижает скорость записи, но при этом повышается скорость чтения данных. Последнее связано с тем, что считывание может производиться с двух дисков одновременно.
Глава 16. Создание отказоустойчивой системы
781
Более надежным является дублирование дисков. Для реализации такого подхода также необходимы два диска, но подключены они должны быть к разным контроллерам. При выходе из строя одного из контроллеров или дисков эксплуатация системы все равно может быть продолжена. Кроме того, при дублировании дисков исключаются потери в скорости записи. Массивы RAID 1 позволяют производить замену вышедших из строя дисков. При этом процесс поддержания двух копий прерывается. После замены поврежденного диска необходимо вручную возобновить работу массива, т. к. Windows NT не делает этого автоматически. Массивы RAID 1 обеспечивают наиболее высокую степень защиты данных среди всех уровней RAID. Но за это приходится платить двойным расходом дискового пространства. Но иногда лучше вложить дополнительные средства и полностью обезопасить себя от неприятностей, чем потом пытаться восстановить данные по крупицам. Стоимость информации в некоторых случаях во много раз превосходит стоимость дисковых систем, на которых она хранится.
Чередование дисков Уровни RAID 0 и RAID 5 позволяют создать чередующийся набор дисков (striping disk set). Набор с чередованием представляет собой совокупность множества физических дисков, объединенных в единый виртуальный том. Для создания чередующегося набора могут быть использованы диски различных моделей и размеров, подключенные к разным дисковым контроллерам. Но на всех физических дисках всегда используется одинаковое количество пространства. Максимально возможный размер чередующегося набора равен размеру самого маленького диска, умноженному на количество дисков в наборе. Пространство физического диска, используемое для построения чередующегося набора, называется слоем. Каждый из слоев разбивается на блоки размером 64 Кбайт. Блоки нумеруются последовательно от начала слоя. Эти блоки объединяются в полосы. Каждая полоса содержит по одному блоку каждого слоя. Причем номера блоков в полосе совпадают. Полосы нумеруются в соответствии с номерами блоков, входящих в нее. Например, если полоса содержит все блоки с номером 5, то номер полосы также будет равен 5. Данные последовательно записываются на свободные полосы чередующегося набора и поэтому равномерно распределяются между всеми физическими дисками. В результате имеет место значительное повышение производительности, в идеале прямо пропорциональное количеству дисков в массиве. Реальное повышение производительности зависит от скорости работы каждого из физических дисков, а также от способа подключения дисковых контроллеров. Если производительность всех дисков одинакова, и каждый из них подключен к отдельному контроллеру, то повышение скорости чтения и записи будет напрямую зависеть от количества дисков. Мы рассмотрели общую технологию работы чередующихся наборов дисков. Но разница между уровнями RAID 0 и RAID 5 все же значительна.
782
Часть III. Администрирование
Массивы RAID 0 являются "чистыми" чередующимися наборами. Для реализации RAID 0 можно использовать от 2 до 32 дисков. Этот уровень обеспечивает максимальную производительность, но не возможность восстановления данных в случае повреждения. Строго говоря, технология RAID описывает избыточные дисковые системы, устойчивые к частичному или полному повреждению одного из дисков или контроллеров. Массивы RAID 5 являются набором дисков с контролем четности. Для реализации дискового массива этого уровня необходимы минимум три диска. Максимальное же их количество также не может превышать тридцати двух. Массивы RAID 5 помимо самих данных сохраняют информацию, с помощью которой можно восстановить данные в случае полного или частичного повреждения одного из дисков. Один из блоков в полосе используется не для хранения самих данных, а для хранения служебной информации о контроле четности. Причем расположение этого блока циклически меняется. Например, при наличии трех дисков блок четности для первой полосы располагается на первом диске, для второй — на втором, для третьей — на третьем диске, для четвертой полосы — снова на первом и т. д. Независимо от того, сколько дисков составляют массив RAID 5, для хранения информации о контроле четности отводится место, равное размеру одного слоя набора. Поэтому непроизводственные потери дискового пространства обратно пропорциональны увеличению количества дисков в массиве. Например, при подключении трех дисков теряется примерно 33% дискового пространства. Если же использовать десять дисков, то потери составят всего 10%. Информация о контроле четности представляет собой результат выполнения операции "исключающее ИЛИ" (XOR) ДЛЯ всех блоков данных в полосе. При повреждении одного из дисков потерянная информация может быть восстановлена с помощью блока четности. Кроме того, возможна работа с несколькими поврежденными дисками при условии, что каждая полоса будет содержать не более одного поврежденного блока. Уровень RAID 5 наряду с высокой производительностью также обеспечивает высокую степень надежности. Кроме того, при использовании дисков SCSI допускается горячая замена поврежденных кластеров. Это означает, что если операционная система не может правильно записать данные в тот или иной кластер, то он будет автоматически помечен как сбойный, а данные будут записаны в рабочий кластер. Можно с уверенностью сказать, что дисковые массивы RAID 5 являются лучшим решением для обеспечения надежности данных наряду с эффективным использованием дискового пространства и достижением при этом максимальной скорости операций дискового ввода/вывода. Все вышесказанное о преимуществах массивов RAID 5 может быть с успехом применено к SQL Server 2000. Расположение файлов баз данных на виртуальных томах RAID 5 позволяет автоматически использовать все преимущества наборов дисков с контролем четности.
ЧАСТЬ IV. РАЗРАБОТКА И СОПРОВОЖДЕНИЕ БАЗ ДАННЫХ Глава 17. Введение в проектирование баз данных Глава 18. Архитектура баз данных Глава 19. Транзакции и блокировки Глава 20. Работа с базой данных Глава 21. Работа с таблицами Глава 22. Использование представлений Глава 23. Индексы Глава 24. Статистика
26 Зак. 83
Глава 17
Введение в проектирование баз данных Прежде чем можно будет работать с данными, необходимо создать структуры, в которых они будут храниться. Разработка структуры базы данных — это первая задача, которая стоит перед администратором после установки SQL Server 2000. До тех пор, пока не будут созданы таблицы, практической пользы от SQL Server 2000 будет немного. Пользователи не смогут хранить, а следовательно, и обрабатывать данные. Помимо простого создания таблиц необходимо разработать правила взаимоотношений между ними. В современных базах данных редко встречаются таблицы, никак не связанные с другими таблицами. Часто данные, которые, на первый взгляд, можно расположить в одной таблице, нужно "разнести" в несколько более мелких таблиц. Такой подход позволяет более эффективно управлять данными, исключить дублирование информации и уменьшить объем, который она занимает. Эта глава в основном посвящена теоретическим аспектам планирования структур данных, построению эффективных баз данных, позволяющих быстро и легко получить необходимую информацию. Хорошо спланированная структура данных даст возможность пользователям проводить разносторонний анализ информации и выборку данных по различным критериям. Тогда как неудачное проектирование базы данных вызовет массу неудобств в работе, таких как дублирование информации, ограничение критериев поиска и нарушение целостности данных. В этой главе содержатся сведения, которые помогут разработать эффективную структуру ваших данных.
Классификации баз данных Основным назначением компьютеров с самого начала их применения было хранение и обработка данных. За многие годы использования компьютеров было разработано множество методов представления, обработки и хранения данных. По принципам обработки базы данных классифицируются следующим образом: • Централизованная база данных. При использовании этой технологии база данных располагается на одном компьютере, который может даже не иметь поддержки сети и работать автономно. В этом случае работа с базой данных возможна только локально. Если же компьютер работает в сети, то доступ к информации может осуществляться удаленно с других компьютеров сети. Централизованные базы данных с распределенным доступом являются наи-
786
Часть IV. Разработка и сопровождение баз данных
более используемыми в настоящее время. Для этой технологии возможны два способа обработки данных: •
Файл-сервер. Эта архитектура централизованных баз данных с сетевым доступом предполагает назначение одного из компьютеров сети в качестве выделенного сервера, на котором будут храниться файлы централизованной базы данных. В соответствии с запросами пользователей файлы с файл-сервера передаются на рабочие станции пользователей, где и осуществляется основная часть обработки данных. Центральный сервер выполняет в основном только роль хранилища файлов, не участвуя в обработке самих данных. После завершения работы пользователи копируют файлы с обработанными данными обратно на сервер, откуда их смогут взять и обработать другие пользователи. На основе скопированных файлов централизованной базы данных пользователи могут создавать на своих рабочих станциях локальные базы данных. Недостатки такой организации работы очевидны. При одновременном обращении множества пользователей к одним и тем же данным производительность работы резко падает, т. к. необходимо дождаться, пока пользователь, работающий с данными, завершит свою работу. В противном случае возможно затирание исправлений, сделанных одними пользователями, изменениями других пользователей.
•
Клиент-сервер. В основе этой концепции лежит идея о том, что помимо хранения файлов базы данных, центральный сервер должен выполнять и основную часть обработки данных. Пользователи обращаются к центральному серверу с помощью специального языка структурированных запросов (SQL, Structured Query Language), на котором описывается список задач, выполняемых сервером. Запросы пользователей принимаются сервером и порождают на нем процессы обработки данных. В ответ пользователь получает уже обработанный набор данных. Между клиентом и сервером передается не весь набор данных, как это происходит в технологии файлсервер, а только данные, которые действительно необходимы пользователю. Запрос пользователя длиной всего в несколько строк способен породить процесс обработки данных, затрагивающий множество таблиц и миллионы строк. В ответ клиент может получить лишь несколько чисел. Технология клиент-сервер позволяет избежать передачи по сети огромных объемов информации, переложив всю обработку данных на центральный сервер. Кроме того, рассматриваемый подход позволяет избежать конфликтов изменений одних и тех же данных множеством пользователей, которые характерны для технологии файл-сервер. Технология клиентсервер реализует согласованное изменение данных множеством пользователей, обеспечивая автоматическое соблюдение целостности данных. Эти и некоторые другие преимущества сделали технологию клиент-сервер весьма популярной. К недостаткам технологии клиент-сервер можно отнести высокие требования к производительности центрального сервера. Чем больше пользователей обращаются к данным, и чем больше объем обрабатываемых данных, тем более мощным должен быть центральный сервер.
Глава 17. Введение в проектирование баз данных
787
О Распределенная база данных. Базы данных этого типа располагаются на нескольких компьютерах. Информация на этих компьютерах может пересекаться и даже дублироваться. Для управления подобными базами данных предназначена система управления распределенными базами данных (СУРБД). Работа с распределенной базой данных может быть прозрачна для пользователей. Система скрывает от клиентов обращения к данным, расположенным на других компьютерах. Для пользователя все выглядит так, как будто вся информация находится на одном сервере. Распределенные базы данных не получили большого распространения.
С
Замечание
^
Microsoft SQL Server 2000 обеспечивает построение централизованных баз данных с использованием технологии клиент-сервер. Однако с помощью SQL Server 2000 может быть организована и распределенная база данных, расположенная на множестве сетевых серверов. С помощью распределенных запросов (distributed query) пользователи могут в одном запросе обращаться ко множеству источников данных. Причем в качестве таких источников данных могут выступать не только серверы SQL Server 2000, но и любая другая система управления базами данных, источник ODBC и даже текстовый файл.
Структурные элементы базы данных Целью любой информационной системы является хранение и обработка данных о каких-либо объектах. В широком смысле слова база данных — это совокупность сведений о конкретных объектах. При создании базы данных (БД) в основном преследуется цель упорядочить данные по различным признакам, чтобы иметь возможность быстро извлекать нужную информацию. В современной технологии баз данных предполагается, что создание БД, ее поддержка, управление, а также доступ пользователей к самим данным осуществляются с помощью специальных программных продуктов — систем управления базами данных (СУБД). В терминологии баз данных описываемые объекты часто называют сущностями (entity), а сами данные — атрибутами (attribute). Объект (или сущность) — это нечто, существующее в реальном мире и различимое, что имеет название и имеется способ отличать один подобный объект от другого. Сущностью может являться ВУЗ, студент, ручка, аудитория и т. д. Кроме того, помимо физического предмета сущностью могут являться и абстрактные вещи, которые, тем не менее, могут быть описаны: лекция, телевизионная передача, правовые нормы, правила поведения и т. д. Группа всех подобных объектов образует набор объектов. Набором объектов для объекта "сотрудник" будут являться все сотрудники, работающие на предприятии. Атрибут — это некоторый показатель, характеризующий объект и принимающий для каждого конкретного объекта индивидуальное значение (текстовое, числовое и т. п.). Если в качестве объекта рассмотреть сотрудника предприятия, то этот объект будет иметь атрибуты имени, фамилии и отчества, принимающие текстовые значения, числовой атрибут номера подразделения, в котором он работает, атрибут даты рождения, имеющий тип, описывающий дату и время, и
788
Часть IV. Разработка и сопровождение баз данных
многие другие атрибуты. Атрибут может являться также и набором объектов. Например, атрибутом работника является номер подразделения, в котором он работает. С другой стороны, подразделение является экземпляром набора подразделений и описывается набором атрибутов: начальник подразделения, количество сотрудников, адрес, специализация и т. п. В свою очередь, некоторые из атрибутов подразделения сами могут являться экземплярами набора объектов. Помимо понятий сущность и атрибут, при работе с базами данных часто используются понятия поле, запись, таблица. Поле (field) — это минимальная неделимая структура организации данных. Для каждого поля базы данных разработчик должен задать следующие значения: П уникальное в пределах отношения имя (name); •
тип данных, которые будут храниться в поле (числовой, символьный, логический и т. д.);
• максимальная длина (или размер), который могут иметь данные, хранящиеся в поле; • дополнительные характеристики (например, для числовых данных — точность, для символьных — формат, и т. д.). Множество логически связанных полей образуют запись (record). Запись является ничем иным, как строкой таблицы. Экземпляр записи — это отдельная реализация записи, содержащая конкретные значения ее полей. Множество экземпляров записи одной структуры образуют таблицу (table). При описании таблицы указывается последовательность расположения полей и их основные характеристики (имя, длина и точность). Количество записей в таблице может меняться.
Модели данных Мы уже рассмотрели классификацию баз данных по принципам обработки данных. В этом разделе будет приведена классификация данных по используемой модели (или структуре) данных. Модель данных (data model) — это совокупность структур данных и операций их обработки. Модель данных включает в себя структуры данных, операции их обработки и ограничения целостности. С помощью модели данных можно легко изобразить структуру объектов и связи, установленные между ними. За все время использования компьютеров для обработки данных было разработано множество различных моделей данных. Однако обычно говорят лишь о трех основных моделях: • Иерархическая модель данных. Эта модель данных представляет собой совокупность связанных элементов, образующих иерархическую структуру. Связанные объекты образуют перевернутый граф (перевернутое дерево). К основным понятиям иерархической модели данных относятся уровень, элемент (или узел) и связь. Узлом называется совокупность атрибутов данных, описывающих некоторый объект. Каждый узел связан с одним узлом более высокого уровня и с любым количеством (в т. ч. и с нулем) узлов нижнего уровня. Исключением является узел самого высокого уровня, который не связан
Глава 17. Введение в проектирование баз данных
789
ни с одним узлом более высокого уровня. Этот узел называется корнем дерева. Подчиненные узлы располагаются на втором, третьем и т. д. уровнях. Количество деревьев в базе данных определяется количеством корней деревьев. К каждой записи базы данных существует единственный путь от корневой записи. Примером иерархической модели данных может служить адрес. Действительно, на первом уровне (в корне дерева) лежит планета Земля, на втором уровне — страна, на третьем — регион (штат, республика, край, район и т. п.), затем город, улица, дом и квартира. Один и тот же город не может принадлежать двум странам или районам. Другим примером иерархической модели является пространство доменных имен в Интернете — система DNS. О Сетевая модель данных. В основе этой модели лежат те же понятия, что и в основе иерархической модели данных — узел, уровень и связь. Однако существенным отличием сетевой модели данных является то, что узел может быть связан с любым другим узлом, в т. ч. лежащим на уровне, не относящемся непосредственно к уровню исходного узла. Простейшим примером сетевой модели данных может являться база данных, в которой хранится информация о членстве ученых в научных организациях. Каждый из ученых может состоять во множестве организаций. В свою очередь, в одной организации может состоять множество ученых. П Реляционная модель данных. В основе реляционной модели данных лежит идея о том, что любой набор данных можно представить в виде двумерной таблицы. Простейшая реляционная база данных может иметь единственную таблицу, в которой будут храниться все необходимые данные. Однако на практике реляционная база данных обычно построена из множества таблиц, связанных по определенным критериям. Как было сказано выше, перечисленные модели данных не исчерпывают все их многообразие. Однако на практике в большинстве использовались именно три перечисленных типа. Иерархическая и сетевая модели данных обладают определенными недостатками, затрудняющими обработку и доступ к данным. Эти модели данных в настоящее время не применяются. Наибольшее распространение получила реляционная модель данных, характеризующаяся простотой структуры данных, удобным для пользователя табличным представлением и возможностью использования формального аппарата алгебры отношений и реляционного исчисления для обработки данных. Система управления базами данных Microsoft SQL Server 2000, как и большая часть других современных СУБД, предназначена для работы именно с реляционными базами данных. SQL Server 2000 обеспечивает построение централизованных баз данных с помощью технологии клиент-сервер.
Реляционная модель данных Датой рождения реляционной теории баз данных можно считать 6 июня 1970 г., когда сотрудник фирмы IBM, доктор Э. Кодд, опубликовал статью "Реляционная модель данных для больших коллективных банков" ("A relational Model of Data for Large Shared Data Banks"). Именно в этой статье был впервые использован термин
790
Часть IV. Разработка и сопровождение баз данных
"реляционная модель данных". Однако первые работы на эту тему появились еще в конце 60-х годов. В них обсуждалась возможность использования при проектировании баз данных так называемых табличных даталогических моделей, обеспечивающих привычные и естественные способы представления данных. После публикации статьи доктор Э. Кодд продолжил работу по развитию реляционной теории баз данных, подведя под нее мощную математическую базу. Будучи математиком по образованию, Э. Кодд предложил использовать для обработки данных аппарат теории множеств, а конкретно — объединение, пересечение, разность, декартово произведение и др. Он доказал, что любой набор данных может быть представлен в виде простых двумерных таблиц, называемых в математике "отношением". В английском варианте "отношение" пишется как "relation". От этого слова и произошло название "реляционная модель данных". Разработанная Коддом теория реляционных баз данных описывает правила эффективной организации данных и управления ими.
.(
Замечание
j
Отношение является ни чем иным, как обычной таблицей или сущностью. Каждая реляционная таблица представляет собой двумерный массив и обладает следующими свойствами: •
любой элемент таблицы является минимальным элементом данных;
•
элементы в пределах одного столбца имеют одинаковый тип (числовой, символьный и т. д.);
•
все столбцы одной таблицы должны иметь уникальное имя;
•
в таблице отсутствуют совпадающие строки;
•
порядок следования строк и столбцов в таблице может быть произвольным.
(
ЗамёчаТше
^
Описание столбцов, которое составляет разработчик, называется макетом таблицы. Пример реляционной таблицы, содержащей номер личного дела сотрудника, его имя, фамилию, отчество, дату рождения и идентификационный номер подразделения, в котором он работает, приведен в табл. 17.1. Таблица 17.1. Пример реляционной таблицы Дата рожд.
№ подр.
Владимирович
13.08.78
27
Владимирович
22.03.77
42
Павел
Анатольевич
17.11.76
42
Мамаев
Сергей
Владимирович
21.09.80
27
Шкарина
Лилия
Николаевна
07.10.72
34
№ дела
Фамилия
Имя
Отчество
18735
Мамаев
Евгений
18745
Лисицын
Константин
18543
Сипкин
18545 18732
Глава 17. Введение в проектирование баз данных
791
Как видно, каждый из атрибутов расположен в отдельном столбце, а каждая строка содержит набор атрибутов, описывающих конкретный экземпляр объекта. Одним из принципов реляционной теории является требование к минимальности элементов таблицы. Это означает, что каждое поле таблицы должно являться отдельным атомарным значением для конкретной предметной области. Это атомарное значение не должно разделяться на более простые составляющие. Замечание Однако следует отметить, что в некоторых случаях в качестве атомарного значения могут рассматриваться агрегированные объекты. Например, в одной предметной области адрес может являться атомарным значением и не разбиваться на более мелкие составляющие, тогда как в другой предметной области адрес будет представлен набором более конкретных значений: страна, район, город, улица, дом и квартира. Если в первом случае для адреса отводится единственный столбец таблицы, то во втором случае будет отведено шесть столбцов. Как видно, для описания одних и тех же объектов в теории баз данных вообще и в реляционной теории баз данных в частности используются разные термины. Кроме того, при практической работе в SQL Server 2000 часто фигурируют свои понятия. Все это не способствует лучшему пониманию баз данных. В табл. 17.2 приведено соответствие описания объектов в терминах разных областей. Таблица 17.2. Терминология баз данных Теория БД
Реляционные БД
SQL Server 2000
Сущность (Entity)
Отношение (Relation)
Таблица (Table)
Кортеж (Tuple)
Запись (Record)
Строка (Row)
Атрибут (Attribute)
Поле (Field)
Столбец, колонка (Column)
(
Замечание
^
Хотя в каждой из представленных областей имеются свои термины, все же часто при описании объектов одной области используются термины другой области. Например, при описании реляционной модели часто применяются термины "атрибут" и "кортеж". В SQL Server 2000 используются термины, несколько отличающиеся от стандартных терминов теории реляционных баз данных. Однако во многих СУБД, таких как dBase, FoxPro, Access и др., существуют термины таблица, запись и поле. Помимо понятия атрибут, при описании данных используется понятие домена (domain). Домен — это множество атомарных значений одного типа. В общем виде домен определяется заданием набора значений некоторого типа. Все значения атрибутов, входящих в домен, должны входить в заданный набор. По другому можно сказать, что все значения атрибута образуют домен. В табл. 17.1 можно выделить домены имен, фамилий, дат рождения и т. д. Домен фамилий включает 4 значения: Мамаев, Лисицын, Сипкин и Шкарина. Домен дат рождения включает 5 значений.
792
Часть IV. Разработка и сопровождение баз данных
Замечание Помимо того, что домен содержит множество атомарных значений одного типа, эти значения должны быть объединены на логическом уровне. Например, атрибуты имени и фамилии имеют одинаковый тип (символьный) и предназначены для описания человека. Однако вряд ли имеет смысл объединять имена и фамилии в один набор. Смысл доменов состоит в следующем. Если значения двух атрибутов берутся из одного домена, то сравнение этих атрибутов будет иметь смысл. Если же значения атрибутов берутся из разных доменов, то их сравнение, по всей видимости, смысла не имеет. Например, если атрибуты берутся из домена дат рождения, то можно легко сравнить их и определить, кто старше. Но если значение одного атрибута берется из домена дат рождения, а другого — из домена фамилий, то сравнение этих атрибутов бессмысленно.
Замечание Часто совместно с термином атрибут (а иногда и вместо него) применяется сочетание "домен атрибута". Домен атрибута — это множество значений данного атрибута. Примером домена атрибута "Город" при описании адреса является множество всех возможных городов. В самой же таблице не всегда упоминаются все значения атрибута домена.
Замечание В большинстве современных систем управления реляционными базами данных, в т. ч. и в Microsoft SQL Server 2000, понятие домена не реализовано. Доступ к конкретному элементу отношения может быть получен с указанием адреса этого элемента в формате А [ i , j ] , где А — элемент данных, i — строка отношения, j — номер атрибута отношения. Количество атрибутов в отношении определяет порядок (или степень) этого отношения. Отношение степени один называют унарным, степени два — бинарным, степени три — тернарным, а степени п — n-арным. Порядок отношения, приведенного в табл. 17.1, равен 6. Множество всех значений A [ i , j ] при постоянном i и всех возможных j образует кортеж, или попросту строку таблицы. Множество всех кортежей отношения образует тело отношения. Количество кортежей отношения задает его мощность (или кардинальное число). Количество кортежей в теле отношения может со временем меняться, а следовательно, будет изменяться и мощность отношения.
Замечание Поскольку отношения реляционной теории являются специальными математическими двумерными таблицами, в которых по определению не существует двух одинаковых строк, то в отношении в любой момент времени не может существовать двух идентичных кортежей. Как уже говорилось, реляционные таблицы связываются друг с другом. Чтобы иметь возможность связать таблицы, необходимо иметь какой-то идентифика-
Глава 17. Введение в проектирование баз данных
793
тор, который позволял бы уникально идентифицировать любую строку таблицы. Таким идентификатором является ключ (key). Ключом называется множество атрибутов, задание значений которых позволяет однозначно определить значения остальных атрибутов таблицы. В качестве ключа для отношения, приведенного в табл. 17.1, может выступать атрибут "№ дела" или набор атрибутов "Фамилия", "Имя" и "Отчество". В первом случае в качестве ключа выступает единственный атрибут — "№ дела". Во втором случае ключ является сложным и состоит из трех атрибутов. Замечание Можно с уверенностью сказать, что для любых двух людей не будет личных дел с одинаковыми номерами. Если в качестве ключа выбрать только фамилию, то возможна ситуация, когда по одной фамилии нельзя будет однозначно идентифицировать человека — это бывает в случае, когда на предприятии работают однофамильцы. Чтобы добиться уникальности, в ключ входит еще имя и отчество. Но и в этом случае не всегда можно гарантировать, что ключ будет уникален. Поэтому рекомендуется в качестве ключа выбирать заведомо неповторяющиеся атрибуты, например номер паспорта. Множество атрибутов отношения является возможным ключом отношения тогда и только тогда, когда выполняется два независимых от времени условия: • Уникальность. В любой момент времени никакие два кортежа не имеют одинаковых значений для всех атрибутов, входящих в возможный ключ. Остальные атрибуты могут иметь произвольные значения. Например, если в качестве возможного ключа выбран номер личного дела, то необходимо гарантировать, что в отношении никогда не появится двух личных дел с одинаковыми номерами. О Минимальность. Ни один из атрибутов не может быть исключен из ключа без нарушения уникальности возможного ключа. Это означает, что в ключ разрешается вносить только минимальный набор атрибутов, который позволяет идентифицировать каждую строку отношения. То есть нет необходимости помещать в ключ и номер личного дела, и номер паспорта. По любому из этих атрибутов можно однозначно идентифицировать каждую строку таблицы. При создании возможного ключа на основе атрибутов "Фамилия", "Имя" и "Отчество" исключение любого из атрибутов резко снижает уникальность ключа. Кроме того, не стоит вносить в возможный ключ повторяющийся атрибут, не увеличивающий уникальности ключа. То есть нельзя включать дополнительно к номеру личного дела еще и фамилию служащего. Номер личного дела и так обеспечивает уникальность, а фамилия лишь увеличивает размер ключа и снижает производительность. Замечание При создании ключа в SQL Server 2000 требование уникальности должно соблюдаться всегда и обеспечивается самой системой. Соблюдение требования минимальности' лежит на пользователе. SQL Server 2000 не выполняет никаких проверок на то, что атрибуты, входящие в ключ, являются минимальным набором. То есть
794
Часть IV. Разработка и сопровождение баз данных пользователь может создавать ключи на основе любого набора атрибутов, нарушая требование минимальности. Замечание Любое отношение имеет по крайней мере один возможный ключ, состоящий из всех его атрибутов. Это следует из определения отношения, в котором говорится, что в любой момент времени в нем не может быть двух одинаковых кортежей.
Один из возможных ключей отношения может быть выбран в качестве первичного ключа. Остальные возможные ключи, если они есть, принимаются за альтернативные. Если в отношении, приведенном в табл. 17.1, выбрать в качестве первичного ключа номер личного дела, то комбинация атрибутов "Фамилия", "Имя" и "Отчество" будет являться возможным ключом. Мы рассмотрели лишь основные понятия и принципы реляционной теории баз данных. На самом деле эта темы является довольно обширной и достойной отдельной книги. Для более подробного знакомства с теорией реляционных баз данных следует обратиться к специализированной литературе. Теоретические аспекты, разработанные доктором Коддом, легли в основу построения многих современных систем управления базами данных, разработки сопутствующих программных и языковых средств, обладающих высокой производительностью и удобностью в использовании. К настоящему времени реляционная модель баз данных является практически монополистом на рынке баз данных, вытеснив все другие модели. Это произошло благодаря удобству, наглядности и эффективности реляционных баз данных. Поэтому нет ничего удивительного, что Microsoft SQL Server 2000 разрабатывался именно как система управления реляционными базами данных. Конечно, немалая часть соблюдения требований реляционной теории баз данных лежит на разработчике. Например, как уже говорилось ранее, соблюдение требования минимальности ключа лежит на разработчике.
Проектирование реляционных баз данных В предыдущем разделе были рассмотрены основы реляционной теории баз данных. В этом же разделе внимание будет уделено практическому проектированию баз данных, в частности — выбор оптимального количества таблиц для хранения данных, полей, которые должны войти в ту или иную таблицу, а также планирование отношений между таблицами. Большинство организаций в своей работе использует огромное количество разнообразной информации, которую практически невозможно расположить в единственной базе данных. Часто создается множество баз данных, в которых хранится специализированная информация. Только небольшие организации могут расположить все свои данные в одной базе данных. При проектировании баз данных могут применяться различные подходы. Основная цель проектирования баз данных — это сокращение избыточности хра-
Глава 17. Введение в проектирование баз данных
795
нимых данных, а следовательно, экономия используемых ресурсов (оперативной и дисковой памяти), уменьшение затрат на обновление избыточных копий данных, а также снижение вероятности нарушений целостности данных.
Основы реляционных баз данных Реляционная база данных — это совокупность отношений, в которых хранится вся информация баз данных. Для пользователя такая база данных представляется набором двумерных таблиц, что облегчает понимание структуры данных и управление ими. Таблицы реляционной базы данных связаны между собой отношениями. Замечание Не нужно путать отношения (relationship) между таблицами, определяющие правила связывания данных, с термином отношение (relation), обозначающим таблицу. Если последний используется в теории реляционных баз данных при описании сущности, то первый — при практическом проектировании баз данных. Оба термина (relationship и relation) переводятся с английского одинаково — отношение. Отсюда и пошла путаница. В комплекте с SQL Server 2000 поставляются две базы данных — Pubs и Northwind. Они создаются автоматически во время установки SQL Server 2000, и на их примере можно рассмотреть структуру обычной реляционной базы данных. В SQL Server 2000 имеется удобное средство просмотра структуры таблиц и отношений между ними — диаграмма (Diagram). Вы можете включить в диаграмму любое количество таблиц и работать только с теми, которые вам необходимы. Для работы с диаграммами необходимо в Enterprise Manager открыть нужную базу данных и в ее структуре выбрать папку Diagram. В правой части Enterprise Manager отобразиться список уже созданных диаграмм. С помощью диаграмм вы можете изменять структуру таблиц, устанавливать отношения между ними, определять индексы и ограничения целостности, а также просматривать и изменять данные в таблице. Требования к проектированию реляционных баз данных в самом общем виде можно свести к нескольким правилам. Рассмотрим их. •
Каждая таблица в базе данных имеет уникальное имя в пределах этой базы данных. Это позволяет уникально идентифицировать данные в таблице.
П Все строки в таблице однотипны, т. е. количество, набор и последовательность полей в каждой строке одной таблицы одинаковы. Кроме того, количество значений в строке также фиксировано. Иначе говоря, в каждой позиции таблицы на пересечении любых строки и столбца имеется только одно значение (в т. ч. и пустое). Множественные поля и группы недопустимы. П Строки таблицы обязательно отличаются друг от друга хотя бы единственным значением. То есть в любой момент времени в таблице не присутствует двух одинаковых строк, что позволяет однозначно идентифицировать каждую из них.
Часть IV. Разработка и сопровождение баз данных
796
П Каждому столбцу таблицы присваивается уникальное в пределах таблицы имя. Любой из столбцов служит для хранения данных строго определенного типа (даты, числового, символьного, денежного и т. п.). Кроме этого столбец несет еще и смысловую нагрузку. Предположим, что имеется столбец, в котором указывается фамилия сотрудника. Хотя она и используется для хранения символьных данных, все же нельзя хранить в этом столбце имя или отчество. •
При обращении к данным можно свободно обращаться к любой строке или столбцу таблицы. Сами данные не налагают никаких ограничений на последовательность обращений к ним. Кроме того, ни одна строка таблицы не зависит от значений, хранимых в другой строке.
П Полное информационное содержание базы данных зависит только от значений самих данных и такое представление является единственным. То есть не существует никаких дополнительных конструкций, которые бы определяли связь между таблицами или значение данных.
Замечание При работе с базами данных SQL Server 2000 приведенные требования являются скорее рекомендациями к построению таблиц, чем обязательными требованиями. В SQL Server 2000 нет механизмов определения, соответствует ли база данных требованиям реляционной теории баз данных. Хотя в основу функционирования SQL Server 2000 и положена реляционная теория баз данных, пользователи могут создавать таблицы, вовсе не соответствующие требованиям этой теории. Часть перечисленных требований является необязательной, однако другая их часть реализована на уровне ядра системы. В частности, можно легко создать таблицу с идентичными строками, но система не даст создать в одной базе данных двух таблиц с одинаковыми именами или организовать в одной таблице несколько одноименных столбцов. Как было сказано ранее, описание столбцов таблицы называется макетом таблицы. Простейшее представление макета является ничем иным, как обычной двумерной таблицей, в которой каждая строка соответствует столбцу описываемой таблицы, а в каждой из колонок макета указываются характеристики описываемой таблицы. В табл. 17.3 представлен макет сущности, приведенной в табл. 17.1. Таблица 17.3. Пример макета таблицы Имя столбца
Тип данных
Размер
Точность
Key
Null
Default
№ дела Фамилия
Int
8
8
Yes
Nvarchar
30
No
No No
Имя
Nvarchar
30
No
Yes
Отчество
Nvarchar
30
No
Yes
Дата рожд.
Datetime
8
No
Yes
01-01-1900
№ подр.
Int
8
No
No
42
Глава 17. Введение в проектирование баз данных
797
Замечание Набор колонок в макете таблицы зависит от конкретной системы, в которой создается таблица. Кроме того, даже в пределах одной системы не всегда необходимо указывать все параметры. Например, в SQL Server 2000 не обязательно определять значение по умолчанию или возможность хранения в столбце значений N u l l . При составлении макета таблицы эти параметры можно опускать. Приведенный макет таблицы создан для SQL Server 2000. Макет таблицы позволяет наглядно представить, какое количество столбцов имеется в таблице и какие данные должны храниться в каждом столбце. При создании таблиц в SQL Server 2000 с помощью Enterprise Manager их структура представляется также в виде макета. Это позволяет легко и наглядно изменять структуру таблицы. Более подробно создание таблиц будет рассмотрено в главе 3.
Нормализация данных Как уже было сказано, основная цель проектирования баз данных — это сокращение избыточности хранимых данных. Грамотно спланированная база данных обеспечивает оптимальное использование оперативной и дисковой памяти, предоставляет удобный механизм изменения данных и обеспечивает высокую их целостность. В неудачно спланированной базе данных может иметь место дублирование данных. Пользователи должны следить за всеми копиями данных, т. е. при изменении одной копии необходимо исправить и другие копии. В противном случае целостность данных нарушается. Например, если сотрудники предприятия учитываются в профсоюзе, отделе кадров и в отделе, где они работают, то необходимо следить, чтобы изменения отображались во всех местах. Если сотрудница выходит замуж и меняет фамилию, а информация изменяется лишь в одном месте, то получится, что в организации работает два разных человека. Эту и многие другие проблемы при проектировании базы данных можно решить с помощью нормализации. Нормализация — это процесс приведения структур данных в состояние, обеспечивающее лучшие условия выборки, включения, изменения и удаления данных. Это достигается разбиением одной большой таблицы на две более мелкие таблицы. Конечной целью нормализации является получение такого проекта базы данных, в котором каждый факт появляется лишь в одном месте, т. е. исключена избыточность информации. Это делается не столько с целью экономии памяти, сколько для исключения возможной противоречивости хранимых данных. Теория нормализации отношений описывает формальный аппарат ограничений на формирование отношений (таблиц), который позволяет устранить дублирование, обеспечить непротиворечивость данных и уменьшить трудозатраты на ведение базы данных. Прежде чем приступить к описанию нормализации, нужно сказать об универсальном отношении. Таблица, в которую включены все интересующие атрибуты, называется универсальным отношением. При использовании универсального отношения база данных будет состоять из единственной таблицы, в которой станет располагаться вся информация. Количество атрибутов в таком отноше-
Часть IV. Разработка и сопровождение баз данных
798
нии может быть очень большим. В табл. 17.4 приведен пример универсального отношения, содержащего информацию о посещении студентами факультативных занятий. Таблица 17.4. Универсальное отношение Факультатив
Преподаватель Кол-во часов
Макс, студентов
Студент
нит нит нит
Шкарина
36
10
Лисицын К. В. 15
5
Шкарина
36
10
Салихов Т. Г
27-2
3
Шкарина
36
10
Гольцов В. Г.
18
2
НИТ в науке
Швец
44
8
Лисицын К. В. 15
5
Комп. Англ.
Еремина
38
8
Салихов Т. Г. 27-2
3
Комп, Англ.
Еремина
38
8
Удодов Д. В.
3
Группа
27-2
Курс
Начинающий разработчик может использовать универсальное отношение, приведенное в табл. 17.4, в качестве завершенной БД. Действительно, зачем разбивать таблицу на несколько мелких, если и в одной таблице можно с успехом хранить всю необходимую информацию. Однако применение универсального отношения связано с рядом проблем: •
Избыточность. Информация во многих столбцах многократно повторяется. Чем больше данных будет храниться в базе данных, тем больше информации дублируется и тем выше непроизводительные затраты.
• Потенциальная противоречивость (аномалии обновления). Вследствие наличия множества копий одних и тех же данных возможна ситуация, когда одна часть избыточных копий данных будет изменена, а другая — нет. Например, если на одном из факультативов меняется преподаватель, то необходимо изменить информацию во всех строках, относящихся к этому факультативу. Иначе дело будет выглядеть так, что один факультатив ведут два преподавателя. • Аномалии включения. В базу данных нельзя включить студента, если он не посещает ни один факультатив. Однако часто бывает, что необходимо учесть все данные, которые могут потенциально использоваться. • Аномалии удаления. При удалении факультатива будет потеряна информация о преподавателе и студентах. Однако эти данные могут понадобиться в будущем, из-за чего потребуется их повторный ввод. Большая часть проблем исчезнет, если данные из универсального отношения разнести в несколько мелких таблиц. Именно эту задачу и решает нормализация. При первом знакомстве нормализация кажется довольно простым занятием, однако в ходе этого процесса могут возникнуть определенные трудности, например, часто приходится изменять состав столбцов в таблицах, чтобы иметь возможность связывать их. Процесс нормализации разбивается на несколько этапов. На каждом из этапов структура данных должна удовлетворять определенным требованиям. Таблица считается нормализованной на определенном уровне,
Глава 17. Введение в проектирование баз данных
799
если она удовлетворяет требованиям, выдвигаемым соответствующей формой нормализации (нормальной формы). При описании нормальных форм существуют несколько понятий: •
Функциональной зависимостью между полями А Й В называется зависимость, при которой каждому значению А В любой момент времени соответствует единственное значение в из всех возможных. Примером функциональной зависимости может служить связь города и страны, т. к. любой город находится в единственной стране и с течением времени эта связь не меняется.
•
Полной функциональной зависимостью между составным полем А И полем в называется зависимость, при которой поле в зависит функционально от поля А и не зависит функционально от любого подмножества поля А.
•
Многозначная функциональная зависимость. Поле А однозначно определяет поле в, если для каждого значения поля А существует хорошо определенное множество соответствующих значений поля в. Например, если рассматривать таблицу с описанием сотрудников и поле "Образование", то это поле имеет хорошо определенное множество допустимых значений (высшее, среднее, незаконченное среднее и т. д.).
•
Транзитивная функциональная зависимость между полями А и с наблюдается в том случае, если поле в функционально зависит от поля А И поле с функционально зависит от поля в. В то же время не существует функциональной зависимости поля А ОТ ПОЛЯ В.
•
Несколько полей взаимно независимы, если ни одно из них не является функционально зависимым от другого поля.
•
Неключевым полем таблицы называется каждое поле, не входящее в состав первичного ключа.
Нормализация представляет собой последовательное изменение структуры данных и таблиц в соответствии с требованиями нормальных форм. Всего существует шесть нормальных форм: П Первая нормальная форма ( I N F , First Normal Form). Считается, что таблица находится в первой нормальной форме, если ни одно поле строки не содержит более одного значения и любое ключевое поле не пусто. То есть ни один элемент таблицы не является, в свою очередь, таблицей и не содержит сложных данных. Не трудно заметить, что это требование перекликается с определением отношения, в котором говорится, что любой столбец состоит из атомарных значений, которые не могут быть разложены на более мелкие составляющие. То есть любая таблица в реляционной базе данных автоматически находится в первой нормальной форме. П Вторая нормальная форма (2NF, Second Normal Form). Таблица находится во второй нормальной форме тогда и только тогда, когда она удовлетворяет требованиям первой нормальной формы и все ее поля, не входящие в первичный ключ, связаны полной функциональной зависимостью с первичным ключом. То есть необходимо, чтобы только первичный ключ однозначно идентифицировал значения в любом столбце и в то же время значения в
800
Часть IV. Разработка и сопровождение баз данных
столбцах не зависели ни от какой части составного ключа. Если первичный ключ состоит из одного столбца, то это требование удовлетворяется автоматически. Если же первичный ключ состоит из двух и более столбцов, то таблица необязательно будет находиться во второй нормальной форме. В этом случае таблица должна быть разбита на две или более таблиц таким образом, чтобы первичный ключ однозначно идентифицировал значение в любом столбце. Бывают ситуации, когда в таблице имеется поле, не зависящее от первичного ключа. В этом случае необходимо добавить в первичный ключ дополнительный столбец. Если таких столбцов нет, то в таблицу вставляется новый столбец. Замечание Обычно в реляционных таблицах имеется отдельный столбец, который служит первичным ключом. В этом столбце хранится идентификационный номер строки в таблице. С его помощью можно связывать данные в разных таблицах. В SQL Server 2000 имеются средства, обеспечивающие автоматическое генерирование значений для столбцов, используемых в качестве первичного ключа. Для этого необходимо для столбца с целочисленным типом данных установить ограничение целостности IDENTITY.
О Третья нормальная форма (3NF, Third Normal Form). Таблица находится в третьей нормальной форме тогда и только тогда, когда она удовлетворяет требованиям второй нормальной формы и ни одно из ее неключевых полей не зависит функционально от любого неключевого поля. Любое неключевое поле должно зависеть только от значения первичного ключа и не зависеть от любого другого неключевого атрибута. То есть каждое неключевое поле нетранзитивно зависит от первичного ключа. Для устранения транзитивной зависимости между неключевыми полями выполняется расщепление исходной таблицы. В результате часть полей удаляется из исходной таблицы и включается в состав других (возможно вновь созданных) таблиц. G Нормальная форма Бойса-Кодца (BCNF, Brice-Codd Normal Form). Таблица находится в нормальной форме Бойса-Кодда тогда и только тогда, когда она находится в третьей нормальной форме и любая функциональная зависимость между ее полями сводится к полной функциональной зависимости от возможного ключа. (
Замечание
)
Нормальная форма Бойса-Кодда была предложена теоретиками реляционных систем Бойсом и Коддом как более строгое определение для третьей нормальной формы и учитывающее, что в таблице может быть несколько возможных ключей.
П Четвертая нормальная форма (4NF, Fourth Normal Form). Четвертая нормальная форма является частным случаем пятой нормальной формы, когда полная декомпозиция должна быть соединением двух проекций. Для понимания определения необходимо объяснить, что такое полная декомпозиция. Полной декомпозицией называют такую совокупность произвольного числа
Глава 17. Введение в проектирование баз данных
801
ее проекций, соединение которых абсолютно совпадает с содержимым таблицы. Напомним, что проекция таблицы — это неполный набор ее столбцов. Другими словами, проекция таблицы — это ее копия, не включающая один или более столбцов. Замечание Весьма трудно найти таблицу, которая находилась бы в четвертой нормальной форме и не находилась бы в пятой нормальной форме. •
Пятая нормальная форма или нормальная форма проекции-соединения (5NF, Fifth Normal Form или PJ/NF). Таблица находится в пятой нормальной форме, если в каждой ее полной декомпозиции все проекции содержат возможный ключ. Если в таблице не имеется ни одной полной декомпозиции, то она также находится в пятой нормальной форме.
После приведения таблицы к, пятой форме, она считается полностью нормализованной. На практике чаще всего применяются только три первых формы. В некоторых литературных источниках даже говорится, что существует всего три нормальных формы. Использование только первых трех форм связано с тем, что они обеспечивают достаточный уровень детализации и в то же время легко реализуемы на практике. Применение последних трех форм связано с определенными трудностями и это оправдано только в том случае, когда количество столбцов в таблице составляет несколько десятков. В частности, может сложиться такая ситуация, когда для хранения данных в пятой нормальной форме потребуется больше места, чем при хранении этих же данных в третьей нормальной форме.
Связывание таблиц После нормализации таблиц может быть получен набор из множества таблиц. Данные, принадлежащие единственной логической записи, могут находиться в нескольких таблицах. Когда данные хранились в универсальном отношении, то можно было легко сразу получить всю необходимую информацию. После проведения нормализации доступ к данным несколько усложнился. Чтобы выбрать ту или иную информацию, необходимо просмотреть данные в нескольких таблицах. При этом в качестве механизма, обеспечивающего связывание данных в разных таблицах, выступают ключи.
Первичный и внешний ключи Связывание строк таблиц реляционной базы данных выполняется с помощью первичного (primary) и внешнего (foreign) ключей. Разработчик базы данных должен определить правила связывания данных в разных таблицах, выделив в них одну или более колонок в качестве первичного или внешнего ключа. Напомним, что первичный ключ позволяет однозначно идентифицировать любую строку таблицы. При выборе столбцов, которые будут входить в состав первичного ключа, необходимо следовать требованиям уникальности и минимальности,
802
Часть IV. Разработка и сопровождение баз данных
описанным ранее в этой главе. В принципе, при создании первичного ключа в SQL Server 2000 пользователь может выбрать любой набор столбцов. Единственное ограничение — совокупность значений выбранных столбцов должна быть уникальна для каждой строки. Замечание Однако при выборе столбцов следует учитывать, что в первичный ключ не могут входить столбцы, для которых разрешено хранение пустых значений ( N u l l ) .
В качестве первичного ключа могут быть использованы как уже имеющиеся столбцы таблицы, так и новые столбцы, специально созданные для этих целей. Хотя в качестве первичного ключа можно выбрать один или более атрибутов описываемого в таблице объекта, все же на практике часто создают специально выделенный новый столбец. Использование существующих атрибутов связано с определенными сложностями. Например, на первый взгляд кажется, что номер паспорта— хороший пример первичного ключа. Однако при связывании строк в разных таблицах необходимо будет каждый раз указывать этот номер. При этом длина ключа может быть сравнительно большой. Кроме того, человек может поменять паспорт, и тогда необходимо будет изменить данные во всех связанных таблицах. Использование специальных столбцов снимает эти проблемы. (~
Замечание
^
Как уже говорилось, SQL Server 2000 может автоматически обеспечивать уникальные значения для первичного ключа в новых строках таблицы. Для этого в столбце, имеющем целочисленный тип данных, устанавливается ограничение целостности I D E N T I T Y . Такой столбец может с успехом выступать в качестве первичного ключа.
Создание первичного ключа — лишь половина дела. Следующий шаг в связывании таблиц — определение внешнего ключа. Внешний ключ создается в таблице, поля которой ссылаются на строки главной таблицы. Для каждой строки зависимой таблицы необходимо, чтобы значению внешнего ключа было сопоставлено значение первичного ключа. То есть нельзя вставлять в зависимую таблицу строки со значением внешнего ключа, не определенного в главной таблице. Однако допускается, что значение внешнего ключа в зависимой таблице будет не определено, т. е. внешний ключ будет хранить значение Null. Впоследствии это значение может быть изменено на корректное значение, соответствующее значению внешнего ключа в главной таблице. В отличие от первичного ключа, внешний ключ не должен быть уникальным. То есть в зависимой таблице может существовать множество строк, имеющих одинаковые значения для полей, сконфигурированных в качестве внешнего ключа. Хотя разрешается устанавливать дополнительные ограничения целостности на поля, включенные во внешний ключ. Пользователь может установить ограничение целостности UNIQUE И тем самым гарантировать уникальность значений внешнего ключа.
Глава 17. Введение в проектирование баз данных
803
Замечание В S Q L Server 2 0 0 0 в н е ш н и й к л ю ч ( F O R E I G N
K E Y ) я в л я е т с я просто о г р а н и ч е н и е м
целостности, автоматически определяющим возможные значения в поле подчиненной таблицы в зависимости от значений соответствующего первичного ключа главной таблицы. Внешний ключ может связываться как со столбцом, для которого установлено ограничение целостности UNIQUE ИЛИ PRIMARY KEY, так и с любым другим
столбцом того же типа данных.
После того, как первичный и внешний ключи будут связаны, на данные в зависимой таблице будут наложены ограничения на значения полей, определенных в качестве внешнего ключа. При этом возникает необходимость как-то согласовывать изменения ключевых полей, осуществляемые в главной таблице, со значениями в зависимой таблице. Если не выполнять никаких дополнительных действий, то возможно нарушение целостности данных. Например, если в качестве первичного ключа был выбран номер паспорта, и с ним было связано несколько внешних ключей разных таблиц, то при изменении у человека номера паспорта только в главной таблице связь станет нарушенной. Строки в зависимых таблицах окажутся потерянными, т. е. для них не будет сопоставлена ни одна строка главной таблицы. Это и есть нарушение целостности данных. Во избежание подобных проблем в SQL Server 2000 реализованы специальные механизмы, обеспечивающие автоматическую поддержку целостности данных. При попытке изменения (командой UPDATE) значения первичного ключа в главной таблице ядро SQL Server 2000 может вести себя следующим образом: •
Установление (Relation). Когда значение первичного ключа главной таблицы изменяется, то SQL Server 2000 автоматически устанавливает значения внешних ключей во всех связанных строках в неопределенное значение (NULL). При этом теряется информация о том, с какой строкой главной таблицы были связаны строки зависимой таблицы. При изменении в главной таблице более одной строки в зависимых таблицах может образоваться несколько наборов строк с неопределенным значением внешнего ключа. Определить, какая строка зависимой таблицы с какой строкой главной таблицы была связана, станет невозможно.
•
Ограничение (Restrict). В этом режиме SQL Server 2000 будет отвергать попытки изменения значения первичного ключа, если в зависимой таблице имеется хоть одна строка, связанная с изменяемой строкой главной таблицы. Изменение разрешается только в том случае, если ни в одной зависимой таблице не имеется ни одной строки, значение внешнего ключа которой совпадает со значением изменяемого первичного ключа. В общем случае, чтобы изменить значение первичного ключа, пользователь должен сам позаботиться о предварительном изменении значений связанных внешних ключей, например, установив их в неопределенное значение (NULL).
•
Каскадирование (Cascading). Это самый удобный и гибкий режим, обеспечивающий автоматическое соблюдение целостности данных. При изменении значения первичного ключа в главной таблице SQL Server 2000 будет автоматически изменять значения всех связанных внешних ключей во всех строках
804
Часть IV. Разработка и сопровождение баз данных
зависимых таблиц. Эти изменения окажутся незаметны для пользователей. Все имеющиеся связи будут автоматически сохранены. Мы рассмотрели различные варианты поведения системы при попытке изменения значений первичного ключа. Однако необходимо также рассмотреть возможность удаления строк главной таблицы. Если в зависимых таблицах с первичным ключом удаляемой строки не была связана ни одна строка, то проблем нет. Если же такие строки в зависимых таблицах существуют, то необходимо выполнить удаление таким образом, чтобы обеспечить целостность данных. Возможны следующие варианты поведения SQL Server 2000 при удалении строк из главной таблицы: • Установление (Relation). При удалении первичного ключа SQL Server 2000 будет автоматически устанавливать для всех связанных внешних ключей неопределенное значение (NULL). Впоследствии такие строки могут быть удалены вручную или связаны с другим первичным ключом. •
Ограничение (Restrict). Перед тем, как станет возможным удаление строки в главной таблице, ни в одной зависимой таблице не должно быть строки, имеющей то же значение внешнего ключа, что и первичный ключ удаляемой строки. Пользователь обязан либо удалить такие строки из зависимой таблицы, либо установить для них значение внешнего ключа в неопределенное значение (NULL), либо связать его с любым другим первичным ключом главной таблицы.
•
Каскадирование (Cascading). В этом режиме система станет автоматически удалять все связанные строки из зависимых таблиц. Этот метод требует от пользователя минимального количества усилий.
Замечание Следует осторожно использовать режим Cascading, т. к. случайное удаление строки главной таблицы может повлечь за собой удаление цепочки строк в зависимых таблицах. Более безопасным методом удаления является использование режима Relation — по крайней мере, сами данные останутся. При необходимости можно будет удалить несвязанные строки вручную.
Типы связей между таблицами При связывании строк главной и зависимой таблицы возможны самые разные сочетания. Тип связи определяет количественные правила сопоставления строк главной и зависимой таблицы. Существуют следующие виды связей: П Один-к-одному (One-to-one). При установке отношения "один-к-одному" (1:1) каждой строке главной таблицы соответствует единственная (или ни одной) строка зависимой таблицы. С другой стороны, каждая строка зависимой таблицы должна быть связана только с одной строкой главной таблицы. В качестве примера такой связи можно привести связь человека и его родителей. Каждый человек может иметь единственного отца и единственную мать. Другой пример — связь человека и национальности.
Глава 17. Введение в проектирование баз данных
805
П Один-ко-многим (One-to-many). При использовании связи "один-ко-многим" (1:п) каждой строке главной таблицы соответствует ноль, одна или более строк зависимой таблицы. С другой стороны, каждая строка зависимой таблицы должна быть связана только с одной строкой главной таблицы. Примером такой связи может являться связь человека с его детьми. Частным случаем связи "один-ко-многим" является связь "один-к-одному". • Много-ко-многим (Many-to-many). Этот тип связи предполагает, что любой строке главной таблицы может соответствовать ноль, одна или множество строк зависимой таблицы. При этом каждая строка зависимой таблицы может быть связана с одной или более строк главной таблицы. Примером такой связи может являться использование файлов сотрудниками. Каждый файл может использоваться множеством сотрудников, в то же время каждый сотрудник может работать со множеством файлов.
Замечание Мы не упомянули еще один тип связи "многие-к-одному", предусматривающей связь множества строк главной таблицы с единственной строкой зависимой таблицы. Однако смысла в создании такой связи нет. При необходимости задача может быть легко решена с применением связи "один-ко-многим". Описанные типы связей скорее относятся к области теории, чем непосредственно к SQL Server 2000. Ядро SQL Server 2000 поддерживает только отношения "один-ко-многим". Реализация остальных двух типов отношения лежит на пользователе. Создать связь "один-к-одному" достаточно просто. Для этого достаточно установить в зависимой таблице на столбец с внешним ключом ограничение целостности UNIQUE. После этого система не даст создать в зависимой таблице двух строк с одинаковым значением внешнего ключа. Встроенная связь "один-к-одному" в SQL Server 2000 не реализована. Организация же между таблицами связи "многие-ко-многим" связана с некоторыми трудностями. Для ее реализации необходимо будет создать дополнительную таблицу. При этом в зависимой таблице надо будет создать дополнительное поле, которое станет использоваться в качестве первичного ключа. Дополнительная таблица будет содержать всего два поля. Первое из полей дополнительной таблицы устанавливается в качестве внешнего ключа главной таблицы, тогда как второе поле связывается с новым полем зависимой таблицы, сконфигурированным как первичный ключ. Таким образом, будет получена неявная связь "много-ко-многим". При небольших затратах можно легко создать программные механизмы, эффективно использующие созданную связь.
Замечание Примером связи "много-ко-многим" является связь между таблицами authors и t i t l e s базы данных Pubs, которая реализуется с помощью вспомогательной таблицы t i t l e a u t h o r .
Глава 18
Архитектура базданных Структурой хранения данных в SQL Server 2000 является база данных (database). Вся работа SQL Server 2000 сводится к управлению базами данных (БД). Даже системные данные сервера, отвечающие за его функционирование, также хранятся в базах данных. Базу данных SQL Server 2000 можно рассматривать с двух сторон: физической и логической. При работе с любой базой данных SQL Server 2000 — пользовательской или системной — действуют одни и те же механизмы. Физически база данных представляет собой набор файлов, расположенных на диске. С этими файлами можно выполнять любые операции, разрешенные для обычных файлов: копирование, переименование, удаление и т. д. Конечно, делать этого не стоит, но все же выполнение перечисленных операций в случае необходимости возможно. Физическая структура базы данных описывает количество файлов данных и журнала транзакций, из которых состоит база данных, их первоначальный и текущий размер, положение на диске, имя, расширение, шаг приращения и некоторые другие параметры. Эти параметры необходимы только для правильного восприятия SQL Server 2000 базы данных. Для пользователей, работающих с базой данных, в подавляющем большинстве случаев ее физическая структура не имеет значения. Гораздо больший интерес для пользователей вызывает логическая структура базы данных, описывающая все ее объекты, их поведение и взаимодействие друг с другом. Логическая архитектура базы данных включает системные и пользовательские таблицы, представления, хранимые процедуры, пользователей и роли, умолчания, ограничения целостности и другие объекты. SQL Server 2000 может одновременно поддерживать множество баз данных, с которыми могут работать тысячи пользователей. Каждая база данных способна содержать сотни таблиц, в которых могут располагаться миллионы строк данных. Размер каждой строки может колебаться в пределах от нескольких байт до сотен мегабайт. Планируя информационное пространство предприятия, необходимо решить, будут ли все данные располагаться в одной базе данных, или их стоит распределить между множеством специализированных баз данных. В последнем случае встает вопрос, как расположить все базы данных — на одном сервере или на нескольких. При выборе конкретного подхода надо, прежде всего, исходить из структуры, потребностей и возможностей предприятия. Если предприятие является транснациональной корпорацией, имеющей филиалы во многих странах мира, то модель с одним сервером баз данных будет явно
Глава 18. Архитектура баз данных
807
неудовлетворительна. Более приемлемым вариантом является установка серверов баз данных в каждом филиале. В этом случае необходимо решить вопрос о построении баз данных. Если предполагается использование одной базы данных, то следует отображать ее состояние на все серверы филиалов. Для решения данной задачи можно воспользоваться подсистемой репликации данных SQL Server 2000, которая была описана в главе 14.
Физическая архитектура базы данных Физическая архитектура баз данных SQL Server 2000 полностью соответствует физической архитектуре баз данных SQL Server 7.0, которая была существенно переработана по сравнению с более ранними версиями. В SQL Server 7.0 не используются устройства (devices), в которых хранились базы данных в SQL Server 6.x. Устройство представляло собой специальный файл, в котором выделялось место для баз данных, поэтому размер базы данных был ограничен размером устройства. Если нужно было увеличить размер базы данных, то администратор обязан был указать, из какого устройства следует добавить место в базу данных. Одно устройство могло принадлежать множеству баз данных — так же, как одна база данных могла использовать множество устройств. База данных SQL Server 2000 хранится в самостоятельном, уникальном для каждой БД, наборе файлов. Кроме того, теперь журнал транзакций и сами данные обязательно хранятся отдельно. Это повышает отказоустойчивость базы данных в случае сбоев системы. Рассмотрим физическую структуру базы данных более подробно.
Файлы и группы файлов Для хранения базы данных предназначен набор файлов, персональный для любой базы данных. Каждый файл может принадлежать только одной базе данных. В SQL Server 2000 существуют два типа файлов базы данных: D Файлы данных (data file). Предназначены для хранения информации, находящейся в таблицах базы данных. Кроме того, в этих файлах также размещены процедуры, ограничения, триггеры, индексы и другая информация. О Файлы журнала транзакций (transaction log file). В файлы этого типа SQL Server 2000 записывает информацию о ходе выполнения транзакций. В них размещается информация о состоянии данных перед началом транзакции, о выполняемых изменениях, блокированных ресурсах и другая сопутствующая информация. Любая база данных должна содержать как минимум один файл данных и один файл журнала транзакций. То есть минимальное количество файлов, составляющих базу данных, равно 2. При необходимости администратор может добавлять в БД новые файлы данных или файлы журнала транзакций. Кроме того, можно также удалить некоторые из файлов. Управление конфигурацией файлов базы данных допускается в ходе ее эксплуатации, а не только во время ее создания.
808
Часть IV. Разработка и сопровождение баз данных
Рекомендуется данные, требующие много памяти для хранения ("тяжелые" данные), размещать в отдельных файлах. Операции чтения и записи такой информации занимают довольно много времени. Если необходимо часто обращаться к ней, то для повышения производительности можно приписать данные группе, файлы которой располагаются на отдельных физических дисках. Файлы базы данных могут располагаться на томах с любой файловой системой, поддерживаемой операционной системой. Но при использовании файловой системы NTFS следует учесть, что SQL Server 2000 не может работать со сжатыми файлами. Если компьютер, на котором установлен SQL Server 2000, имеет множество физических дисков, то для повышения производительности настоятельно рекомендуется для каждой базы данных создать как минимум один файл на каждом физическом диске. Кроме того, по возможности следует располагать файлы данных и журнала транзакций на отдельных физических дисках. Это благоприятно скажется на производительности. Файлы данных бывают двух типов: • Primary File (основной или главный файл). Каждая база данных имеет один и только один главный файл. Если база данных включает только один файл данных, то этот файл будет основным. Основной файл предназначен для хранения всех системных таблиц, присутствующих в любой базе данных. В основном файле хранится информация о структуре базы данных, созданных в ней объектах, параметрах дополнительных файлов и файлов журнала транзакций. В системной базе данных Master содержится ссылка только на первичный файл, а описание остальных файлов размещается в основном файле самой базы данных. Помимо системной информации, в основном файле также могут храниться и пользовательские данные. По умолчанию основному файлу базы данных присваивается расширение mdf (Master Data File). • Secondary File (вторичный или дополнительный файл). В отличие от основного файла, база данных может содержать множество дополнительных файлов или не содержать их вовсе. В дополнительных файлах может храниться только пользовательская информация. Хранение любой системной информации не допускается. В ходе эксплуатации базы данных администратор может добавлять новые или удалять уже существующие дополнительные файлы. Часто в базе данных создается несколько таких файлов с целью распределения данных среди множества физических дисков. По умолчанию для дополнительных файлов базы данных устанавливается разрешение NDF (secoNdary Data File). Файлы журнала транзакций бывают только одного типа — Transaction Log File (файл журнала транзакций), служащего для хранения журнала транзакций. В базе данных должен быть как минимум один файл журнала транзакций. Для ускорения обработки транзакций можно использовать несколько журналов транзакций, расположенных на разных физических дисках. SQL Server 2000 организует работу с ними таким образом, что обработка транзакций распределяется между различными физическими дисками, что приводит к повышению про-
Глава 18. Архитектура баз данных
809
изводительности. По умолчанию файлы журнала транзакций имеют расширение ldf (Log Data File). Внутренняя структура файлов журнала транзакций и файлов данных существенно различается. Расширения mdf, ndf и ldf, назначаемые файлам базы данных, не являются обязательными. Пользователь может присвоить файлам любые имена и расширения. Однако не следует злоупотреблять этой возможностью, т. к. впоследствии будет непросто отличить их друг от друга. Если нет особой необходимости, то следует использовать значения по умолчанию. Любой файл базы данных идентифицируется по двум именам: П OS File Name (физическое имя) — имя файла на диске. Это имя необходимо, чтобы SQL Server 2000 мог вызывать функции Windows NT для работы с файлом. • Logical File Name (логическое имя) — имя, которое будет применяться в SQL Server 2000 для ссылки на соответствующий файл. Это имя можно рассматривать как псевдоним. Имена обоих типов могут совпадать, но могут быть и различными. По умолчанию SQL Server 2000 предлагает совпадающие имена. Во избежание путаницы лучше не изменять эти значения. Файлы базы данных в SQL Server 2000 объединяются в группы. Это делается в основном с целью сохранения данных целых таблиц или даже отдельных столбцов таблиц в определенных файлах. По умолчанию в базе данных создается единственная группа. И все данные располагаются в этой группе.
Замечание Каждый файл базы данных может принадлежать только одной группе файлов.
Грамотное использование файлов баз данных может заметно упростить администрирование. Кроме того, правильное планирование состава файлов в группах на основе их физического расположения может также повысить и производительность. Планируя группы файлов, следует оценить, какие данные будут храниться в каждой из них, какова будет интенсивность обращения к ним, как часто данные станут обновляться и т. д.
Замечание Следует отдельно сказать, что создание групп файлов поддерживается только для файлов данных. Группировка файлов журнала транзакций не имеет смысла и поэтому не поддерживается. Создание пользовательских групп файлов необязательно.
Группы файлов бывают следующих типов: • Primary File Group — основная группа файлов. Основной отличительной особенностью этой группы является то, что она содержит основной файл базы данных (primary file) и, как следствие, включает все системные данные. Поскольку в базе данных имеется лишь один основной файл, то и основная труп-
810
Часть IV. Разработка и сопровождение баз данных
па файлов может быть только одна. Другой особенностью основной группы файлов является то, что в нее автоматически включаются все файлы, не приписанные явно ни к какой иной группе. Основная группа может состоять только из одного файла (primary file) и всегда существует в базе данных. • User File Group — пользовательская группа файлов. Для объединения дополнительных файлов базы данных администратор может создать одну или более пользовательских групп. Состав файлов той или иной группы зависит от ее назначения. В принципе, в базе данных может не быть ни одной пользовательской группы файлов. • Default File Group — группа файлов по умолчанию. Это маркер, присваиваемый одной из созданных в базе данных групп. Основным назначением группы файлов по умолчанию является хранение данных, не приписанных явно ни к какой группе файлов. Создавая в базе данных новый объект, пользователь может явно указать, в какой группе файлов он должен храниться. Если же эта информация не указывается, то объект размещается в группе по умолчанию. Допускается конфигурирование только одной группы по умолчанию. Сразу же после создания базы данных в качестве группы по умолчанию назначается основная группа файлов. Впоследствии администратор может установить в качестве группы по умолчанию любую другую группу. Для некоторой группы файлов, включая основную, может быть установлен режим "только для чтения" (read only). В этом режиме не допускается внесение никаких изменений в данные. Естественно, надобность в ведении журнала транзакций отпадает. Это позволяет SQL Server 2000 ускорить операции обращения к данным "только для чтения". Обычно данный режим устанавливается для архивных данных. Например, внесение изменений в финансовый отчет трехлетней давности вряд ли необходимо. Помимо повышения производительности установка группы файлов в режим "только для чтения" может послужить надежной защитой от несанкционированного изменения данных. Если установить в режим "только для чтения" основную группу файлов, то это запретит внесение любых изменений в состав и структуру объектов базы данных. Как уже говорилось, все объекты базы данных описываются в системных таблицах, которые, в свою очередь, размещаются в основном файле (primary file). Запретив вносить изменения в основную группу файлов, вы тем самым запретите внесение изменений в любые системные таблицы. В итоге станет невозможно изменить структуру таблиц, свойства пользователей, состав ролей, умолчания и т. д. Установка в режим "только для чтения" всей базы данных позволяет вообще избежать использования журнала транзакций при работе с этой базой данных и безболезненно восстанавливать резервные копии базы данных на множестве серверов. Установив базу данных в режим "только для чтения" и записав ее на компакт-диск, можно разослать ее в филиалы. Пользователи в филиалах просто восстановят резервную копию и получат возможность просматривать данные. SQL Server 2000 позволяет выполнять архивирование базы данных, а также групп файлов и даже отдельных файлов, что было описано в главе 13. Отдельные файлы могут быть восстановлены отдельно от базы данных. Резервные ко-
Глава 18. Архитектура баз данных
811
пии групп файлов, установленных в режим "только для чтения", могут быть восстановлены без восстановления журнала транзакций. Для восстановления остальных файлов необходимо дополнительно восстановить журнал транзакций. (
Замечание
^
Выполнять резервное копирование отдельных файлов и групп файлов могут только члены фиксированной роли сервера s y s a d m i n или фиксированной роли базы данных db_owner. Члены фиксированной роли базы данных d b _ b a c k u p o p e r a t o r могут выполнять резервное копирование всей базы данных.
Следует отдельно отметить поведение SQL Server 2000 при хранении данных в группе файлов. SQL Server 2000 равномерно распределяет данные между всеми файлами в группе. То есть вместо того, чтобы заполнить сначала первый файл, потом второй и т. д., SQL Server 2000 по возможности записывает данные сразу во все файлы параллельно. Объем информации, сохраняемой в каждом файле группы, напрямую зависит от размера файла. Система хранения SQL Server 2000 действует таким образом, чтобы заполнение всех файлов в группе было примерно одинаковым. Предположим, что группа базы данных состоит их трех файлов: 10 Мбайт, 20 Мбайт и 30 Мбайт. Пользователь вставляет 180 строк в таблицу, которая хранится в описанной группе. Система хранения распределит строки следующим образом: в первый файл (размером 10 Мбайт) будет записано 30 строк, во второй файл — 60 строк, в третий — 90 строк. Описанный метод хранения данных обеспечивает в некоторых случаях весьма значительное повышение производительности операций ввода/вывода при использовании групп файлов. Это один из нескольких методов повышения скорости выполнения дисковых операций. SQL Server 2000 также позволяет использовать для повышения производительности все преимущества наборов томов с контролем четности и без него.
Страницы и группы страниц Мы уже знаем, что база данных хранится в виде обычного файла на диске, представляющего собой двоичный набор данных. Ядро SQL Server 2000 открывает этот файл и интерпретирует данные в понятную ему форму. Структуры файлов данных и журнала транзакций существенно различаются. Файл данных имеет более сложную структуру. Объемы данных, которые могут храниться в каждом файле данных, весьма значительны. При этом один файл может содержать данные, принадлежащие десяткам или сотням разных объектов. Для построения надежной логической структуры используются различные служебные объекты. В итоге получается довольно сложная структура. Файл журнала транзакций представляет собой просто последовательный набор записей, содержащих информацию о транзакциях, выполняемых в базе данных. Таким образом, в этом разделе будет рассмотрена физическая структура файлов данных.
812
Часть IV. Разработка и сопровождение баз данных
Основой работы ядра SQL Server 2000 с файлом базы данных является страница (page). В виртуальной системе хранения страница представляет собой минимальный блок, с которым может работать SQL Server 2000. При выполнении операций ввода/вывода система хранения SQL Server 2000 работает со страницами, а не со строками. Даже если пользователь обращается к единственной строке таблицы, то все равно будет считана целая страница. Каждый файл данных базы данных разбит на множество страниц. Размер страницы в SQL Server 2000 составляет 8 Кбайт. Такой же размер имела страница и в SQL Server 7.0. Однако в SQL Server 6.x размер страницы составлял всего 2 Кбайта. Размер страницы определяет максимальный размер некоторых типов данных. Дело в том, что в общем случае данные одного столбца не могут распределяться между несколькими страницами. Поэтому размер столбцов типов данных char, nchar, varchar, nvarchar и binary ограничен 8000 байтами. Однако для символьных типов данных, поддерживающих стандарт Unicode, максимальное количество символов равно 4000. Это связано с тем, что один символ описывается 2 байтами. На основе сказанного нетрудно сделать вывод, что размер столбца в SQL Server 6.x ограничивался размером 2000 байт. Замечание Заметим, что 8 Кбайт составляет 8192 байта. Однако для указанных типов данных используется всего 8000 байт. Встает законный вопрос, а куда же девается остальное? Ответ прост — остаток используется для хранения служебной информации. Хотя и сказано, что максимальный размер любого столбца составляет 8000 байт, тем не менее, максимальный размер одной строки составляет 8060 байт. Таким образом, сумма длин всех столбцов таблицы не должна превышать 8060 байт. Вся информация в файле данных хранится в страницах. Большинство страниц служит для записи данных, хранящихся в таблицах (как системных, так и пользовательских). Однако, помимо данных таблиц, страницы могут использоваться для хранения различной служебной информации. Поэтому страницы бывают разных типов: • Data. Страницы этого типа используются для хранения собственно данных пользовательских и системных таблиц. Однако страницы типа Data не предназначена для хранения информации тяжелых столбцов — типов данных image, t e x t И ntext. G Index. Этот тип страниц применяется для хранения индексов таблиц и представлений. Такая информация включает значения индексируемых столбцов, для каждого из которых также указывается ссылка на исходную строку таблицы. • Text/Image. В страницах этого типа сохраняются данные столбцов таблиц, имеющих тип данных image, t e x t или ntext. Особенностью хранения данных указанного типа является то, что они могут занимать более одной страницы. Таким образом, в общем случае для хранения значения столбца одного из указанных типов данных должно быть выделено более одной страницы, что невозможно при использовании страниц Data. Для хранения одного значения столбца image, t e x t или ntext выделяется сразу целая страница. Последующее пространство также выделяется страницами.
Глава 18. Архитектура баз данных
813
Замечание В SQL Server 2000 имеется возможность размещать небольшие значения типов i m age, t e x t или n t e x t в страницах Data, что позволяет экономить пространство в базе данных.
П Global Allocation Map (GAM). Этот и последующие типы страниц являются чисто служебными. Страницы рассматриваемого типа содержат информацию об использовании групп страниц (экстентов), речь о которых пойдет далее. П Page Free Space (PFS). Страницы же данного типа содержат информацию о наличии свободного пространства на страницах файла. П Index Allocation Map (IAM). Страницы этого типа хранят информацию об экстентах, используемых таблицами или индексами. Строка данных 1 Строка данных 2 Строка данных 3 Свободное пространство
Страницы разного типа имеют разную структуру. Далее в этом разделе будет рассмотрена структура страниц GAM, IAM и PFS. Сейчас же выясним, что представляет из себя страница типа Data. На рис. 18.1 схематично изображена страница, содержащая три строки.
Рис. 18.1. Архитектура страницы типа Data
Как видно, в начале каждой страницы располагается заголовок, в котором содержится системная информация — тип страницы, объем свободного пространства на странице, идентификационный номер объекта, которому принадлежит страница, и т. д. Размер заголовка равен 96 байтам, что составляет ровно половину объема, резервируемого на каждой страницы для системных нужд (8192— —8000= 192=96x2). Указанный заголовок имеют страницы всех типов. Непосредственно после заголовка располагаются данные столбцов таблицы. Каждая страница применяется для хранения строк только одной таблицы, для чего она разбивается на один или более блоков (слотов), каждый из которых используется для хранения отдельной строки. Размер слота, а следовательно и их количество на странице, зависят от размера соответствующей строки. При этом следует учитывать, что размер слота для одной и той же таблицы может быть и непостоянным. Подобная ситуация складывается при использовании типов данных переменной длины (varchar, nvarchar и varbinary). Конечно, скорость работы с такими строками снижается, но зато на странице выделяется ровно столько пространства, сколько занимают сами данные. Замечание Хотя на рис. 18.1 изображено, что строки располагаются на странице друг за другом, и между ними нет пустых слотов, тем не менее, слоты могут быть заполнены не подряд, а произвольным образом. Даже если первоначально все слоты были запол-
814
Часть IV. Разработка и сопровождение баз данных нены и строки в них размещались упорядоченно, с течением времени некоторые строки могут быть удалены, вместо них вставлены новые и т. д. В итоге на странице могут появиться пустые слоты, а строки будут храниться в произвольном порядке (если конечно для таблицы не определен кластерный индекс).
При поиске на странице нужной строки сервер должен учитывать, что строки могут иметь разную длину. Если бы размер строки был бы постоянен, то начало строки на странице было бы легко вычислить — достаточно отнять от номера строки единицу, умножить полученное число на размер строки и добавить размер заголовка (96 байт). Однако при работе со строками переменной длины поиск начала строки усложняется. Без использования дополнительных механизмов необходимо было бы последовательно считывать со страницы все строки, пока бы не добрались до нужной. Подобный метод нельзя назвать эффективным. Поэтому каждая страница содержит таблицу смещения строк (row offsets). Эта таблица располагается в конце страницы и содержит номер байта (от начала страницы, а не от начала области данных — конца заголовка), с которого начинается соответствующая строка. Порядок перечисления строк в таблице смещения зеркален их порядку на странице. То есть самая последняя запись соответствует самой первой строке, предпоследняя — второй и т. д. Подобный подход позволяет решить проблему с размером таблицы смещения — она может увеличиваться до тех пор, пока не столкнется с областью данных. Работать персонально с каждой страницей было бы неразумно с точки зрения производительности, особенно с учетом тех громадных объемов информации, которые может хранить SQL Server 2000. Поэтому для облегчения работы со страницами были созданы так называемые экстенты (extent), которые представляют собой группу из 8 страниц. Таким образом, общий объем экстента составляет 64 Кбайта. Экстент является минимальным элементом, который выделяется на уровне файла для хранения данных. Даже если необходимо сохранить всего одну страницу, то будет выделен новый экстент (если конечно страницу нельзя сохранить в одном из имеющихся экстентов). Каждая страница имеет своего владельца, в качестве которого может выступать таблица, индекс или другой объект. Таким образом экстент может содержать страницы, принадлежащие либо одному объекту, либо разным. От этого зависит тип экстента: П Uniform. Экстенты (рис. 18.2, внизу) этого типа содержат только страницы, принадлежащие одному владельцу. Если для таблицы, представления и т. д. было выделено 8 страниц, то имеет смысл расположить их рядом, чтобы повысить скорость поиска, считывания и записи данных как на физическом, так и на логическом уровне. Для этого они размещаются в одном экстенте. Подобный подход позволяет снизить фрагментацию страниц в файле, т. к. страницы одного экстента располагаются рядом. • Mixed. В экстентах данного типа (рис. 18.2, вверху) могут содержаться страницы, принадлежащие разным владельцам. Это позволяет снизить непроизводительные расходы пространства в файлах базы данных. Если бы существовали только экстенты типа Uniform, то сервер стал бы выделять место в
Глава 18. Архитектура баз данных
815
файле блоками по 64 Кбайта (8 страниц), даже если в таблице имелись всего две-три строки, занимающие четверть страницы. Более того, если таблица имела бы большой размер, но количество выделенных для нее страниц не было кратно 8, то для хранения хвостов также выделялись бы блоки данных по 64 Кбайта. Подобные траты пространства были бы чрезмерно большими. Поэтому реализована возможность хранения в экстенте страниц, принадлежащих разным объектам. Экстент Mixed
table 2
index 1
index 2
table 2
table 3
index 3
table 2
table 3
table 1
table 1
table 1
table 1
table 1
table 1
Экстент Uniform
table 1
table 1
Рис. 18.2. Экстенты SQL Server 2000
Мы рассмотрели, из каких компонентов состоит файл данных. Однако ничего не было сказано о том, как сервер находит свободные страницы и восстанавливает цепочку страниц, используемых для хранения данных конкретного объекта. При этом необходимо учитывать, что страницы одного и того же владельца могут располагаться более чем в одном файле, что еще более усложняет восстановление цепочки. Начнем с рассмотрения принципов поиска свободных страниц. При описании типов страниц мы упомянули, что страницы Global Allocation Map (GAM) содержат информацию об использовании экстентов. Однако не понятно, что стоит за этой фразой. Сейчас пришло время сказать, что страницы GAM хранят информацию о том, какие экстенты содержат свободные страницы, куда можно сохранить данные. Страница GAM представляет собой битовое поле, каждый бит которого соответствует одному экстенту. Так как размер страницы равен 8 Кбайт, то одна страница GAM может описать 64 000 экстентов — размер области пользовательских данных страницы (8000) умножить на количество бит (8). Говоря об объеме данных, можно сказать, что одна страница GAM охватывает область немногим менее 4 Гбайт — 64 000 экстентов х 8 страниц х размер страницы 8192 байта. Необходимо отметить, что страница GAM способна хранить два типа битовых полей, которые применяются совместно и дополняют друг друга: П Global Allocation Map (GAM). Поле этого типа собственно и содержит информацию об использовании экстентов. Если бит равен 1, то соответствующий экстент пуст и может быть использован для записи данных. Если бит установлен в 0, то экстент содержит какие-то данные. 27 Зак. 83
816
Часть IV. Разработка и сопровождение баз данных
• Shared Global Allocation Map (SGAM). Этот тип полей предназначен для хранения информации о типе экстента. Если описывающий экстент бит установлен в 1, то этот экстент имеет тип Mixed, и на нем имеется как минимум одна свободная страница. Когда же бит установлен в 0, то это означает, что либо экстент имеет тип Uniform (а значит полностью заполнен), либо тип Mixed, но не содержит пустых страниц. Таким образом, для пустого экстента как в поле GAM, так и в поле SGAM соответствующий бит будет установлен в 1. Рассмотрим, что же происходит при записи данных. Возможны две ситуации: П Сохраняется 8 страниц, принадлежащих одному владельцу. В этом случае разумнее всего сохранить все данные в одном экстенте Uniform. To есть необходимо найти в файле полностью свободный экстент. Для этого достаточно найти в поле GAM бит, равный 1. Соответствующий этому биту экстент будет свободным. После записи данных остается только установить соответствующие биты полей GAM и SGAM в 0. П Сохраняется менее 8 страниц, принадлежащих одному или разным владельцам. В этом случае можно либо использовать один из экстентов Mixed, имеющий свободные страницы, либо создать новый экстент Mixed. В последнем случае опять же в поле GAM ищется бит, равный 1. После чего в соответствующий экстент записываются данные. Остается установить соответствующий бит поля GAM в 0, оставив при этом бит в поле SGAM без изменения (равным 1). Если же данные сохраняются в существующий экстент Mixed, то в случае полного заполнения экстента потребуется установить в 0 соответствующий бит поля SGAM. Итак, примерно на каждые 4 Гбайта (точнее на 3,95 Гбайта) данных необходимо выделить в файле данных две страницы типа GAM, общий размер которых составит всего 16 Кбайт. Такая спрессованность информации позволяет хранить в оперативной памяти информацию использования экстентов, что позволяет быстро находить свободное пространство для записи данных. Мы неоднократно говорили, что страницы GAM применяются только при поиске свободного пространства для записи страниц. Однако этих страниц для полноценной работы с данными явно недостаточно. Действительно, при сохранении одной-двух строк нет смысла выделять для них новую страницу, если на уже выделенных для соответствующего объекта страницах достаточно свободного пространства. Таким образом, встает задача найти страницы, принадлежащие объекту и определить количество свободного пространства на них. Информация о степени заполнения страниц (не экстентов) хранится в страницах типа Page Free Space (PFS). Каждая такая страница хранит информацию о количестве свободного пространства на 8000 страниц типа Data, Text/Image и Index. Таким образом, каждая страница описывается 1 байтом. Степень заполнения каждой страницы выражается в процентах. Однако приводится не конкретное количество свободного пространства, а примерное. Информация указывается с помощью битов, каждому из которых соответствует определенное состояние страницы. Одновременно может быть установлен всего один бит. Рассмотрим, какие состояния могут быть описаны:
Глава 18. Архитектура баз данных
817
П страница полностью пуста (заполнение 0%); •
страница заполнена от 1% до 50%;
•
страница заполнена от 51% до 80%;
•
страница заполнена от 81% до 95%;
•
страница заполнена от 96% до 100%.
Страницы PFS предназначены для быстрого поиска страниц, имеющих достаточно свободного пространства для хранения данных. Конечно, определить количество свободного пространства на странице можно простым ее просканированием. Однако прежде необходимо будет найти ее в файле и считать с диска. Если же места будет недостаточно, то нужно будет считать следующую страницу, снова проверить объем свободного пространства и т. д. Использование же страниц PFS позволяет значительным образом оптимизировать поиск страниц с необходимым объемом свободного пространства, не прибегая к сканированию самих страниц. Однако, страницы PFS не содержат данных о том, кто именно является владельцем той или иной страницы. Очевидно, что эта же информация необходима для принятия решения о том, в какой именно странице файла следует сохранить данные. Информация о владельце страницы хранится в страницах типа Index Allocation Map (IAM). Каждая страница 1АМ описывает экстенты, принадлежащие одному объекту. Таким образом, каждому объекту (таблице или индексу) должна быть сопоставлена как минимум одна страница IAM. Страница IAM представляет собой битовое поле наподобие GAM. Если бит поля установлен в 1, то в экстенте содержатся страницы, принадлежащие соответствующему объекту. Когда же поле IAM содержит 0, то экстент принадлежит другому объекту либо вообще пуст. Таким образом, одна страница IAM охватывает блок данных объемом немногим менее 4 Гбайт (3,95 Гбайта), что соответствует 64 000 экстентам. Если же не все страницы объекта располагаются в этом интервале, то необходимо создать дополнительную страницу IAM. При этом в первой странице указывается номер второй страницы IAM. Таким образом можно охватить весь файл базы данных. На рис. 18.3 схематично изображено использование страниц IAM для отслеживания принадлежащих одному владельцу таблиц.
1 экстент • 8 страниц
Таолица 2
Рис. 18.3. Использование страниц IAM
8
1
8
Ч
а
с
т
ь
IV. Разработка и сопровождение баз данных
Замечание Необходимо отметить, что страницы IAM создаются в файле в произвольном месте. При этом нет гарантии, что страницы IAM одного владельца покроют весь файл. Однако этого и не нужно. Встает законный вопрос, а как же узнать номер первой страницы IAM? Номер страницы первого поля IAM хранится в столбце FirstIAM системной таблицы sysindexes. Зная номер первой страницы IAM, всегда можно восстановить всю цепочку страниц IAM и получить список всех экстентов, содержащих принадлежащие конкретному объекту данные. В других столбцах таблицы sysindexes указываются объекты, которым принадлежит первый IAM. Таким объектом может быть индекс (кластерный или некластерный), таблица или отдельный столбец таблицы, имеющий ТИП данных t e x t , ntext ИЛИ image. (
Замечание
J
В таблице sysindexes хранится много другой интересной информации. В частности, в столбце s t a t b l o b хранится информация о статистике, в столбце xmaxlen — максимально возможный размер строки, а в столбце m i n l e n — минимально возможный размер, в столбце keycnt — количество ключевых полей и т. д.
Замечание Напомним, что в SQL Server 2000 данные столбцов типов t e x t , n t e x t или image способны храниться в страницах Data, т. е. могут быть включены непосредственно в строку, а не размещаться отдельно. Ранее мы уже упоминали, что страницы объекта могут располагаться более чем в одном файле. Это нисколько не затрудняет восстановление цепочки экстентов, содержащих страницы объекта. Дело в том, что при указании номера следующей (или первой) страницы IAM приводится также и идентификационный номер файла, в котором расположена нужная страница. Это и позволяет распределять данные одного индекса, таблицы или столбца таблицы между множеством файлов базы данных. На рис. 18.4 приведена схема распределения данных между двумя файлами. Как видно из схемы, сначала считывается номер (в том числе и номер файла) первой страницы IAM. Та же содержит ссылку на вторую страницу, которая, в свою очередь, ссылается на третью и т. д.
Замечание Страницы IAM объекта создаются не во всех файлах, а только в тех, которые содержат хотя бы один экстент со страницами объекта. Как видно из рис. 18.4, не всегда экстенты со страницами объекта располагаются оптимальным образом. Налицо существование в файлах данных фрагментации экстентов. Эту проблему можно сравнить с проблемой хранения обычных файлов операционной системы на диске — они также подвержены фрагментации. Особенно актуальна эта проблема в файловой системе FAT. Однако при
Глава 18. Архитектура баз данных
819
работе с файлами операционной системы в распоряжении пользователя имеются специальные утилиты, позволяющие выполнить дефрагментацию диска. После выполнения дефрагментации кластеры, принадлежащие одному файлу, располагаются на диске последовательно друг за другом. Это позволяет повысить скорость операций чтения и записи данных. Таблица sysindexes Table!
столбец FirstlAM
Первый IAM _j Первый файл IAM Второй файл
• ~ •"' i
i
1
IAM
IAM
Рис. 18.4. Распределение данных объекта среди множества файлов
В SQL Server 2000 также имеются средства управления фрагментацией страниц. В первую очередь, необходимо оценить степень фрагментации страниц объекта. Для этого может использоваться команда DBCC SHOWCONTIG. ДЛЯ выполнения дефрагментации применяются команды DBCC
DBREINDEX И DBCC
INDEXDEFRAG.
Мы не будем сейчас рассматривать использование этих команд, оставив это до главы 25.
Замечание Помимо фрагментации страниц на уровне файла базы данных, на производительность также отрицательно сказывается и фрагментация самого файла базы данных. Не стоит пренебрегать выполнением дефрагментации дисков, на которых располагаются файлы базы данных. Теперь же рассмотрим, как распределяются в файле страницы разных типов. На рис. 18.5 приведено начало типичного файла данных. Как видно из рисунка, нумерация страниц в файле начинается с нуля. При этом используется сквозная нумерация. То есть нет различия между страницами разных типов. Тип страницы определяется по ее заголовку. Первые четыре страницы являются стандартными для любого файла данных. Напомним, что страницы PFS содержат информацию об объеме свободного пространства на каждой странице данных. Страницы же GAM и SGAM хранят информацию об использовании экстентов и их типе. Тип же следующих страниц может быть любым. В данном случае это страницы Data. Обязательно в файле должны присутствовать страницы IAM.
DATA
стр ф J Рис. 18.5. Пример файла данных
820
Часть IV. Разработка и сопровождение баз данных
Итак, мы рассмотрели физическую архитектуру файлов базы данных, применение страниц и экстентов, а также их типы.
Логическая архитектура базы данных В предыдущих разделах была рассмотрена физическая архитектура базы данных, в частности страницы и группы страниц, а также предложены некоторые рекомендации по использованию файлов и групп файлов. В этом же разделе будет представлена логическая архитектура базы данных. Если на физическом уровне рассматриваются структуры, используемые для хранения различной информации, то на логическом уровне необходимо рассматривать объекты, которые можно создавать в базе данных, а также различные свойства, которые влияют на работу сервера с базой данных. Под объектами здесь понимается не только собственно объект, каковым является таблица, представление, хранимая процедура и т. д., но также и пользователи, роли, полнотекстовые каталоги. К логическому уровню относятся и права доступа пользователей и ролей базы данных к созданным в ней объектам. Приведем список собственно объектов базы данных, которые служат для хранения и обработки информации: • Таблицы (tables). Это единственный объект базы данных, предназначенный для хранения пользовательских данных. Работа с таблицами будет подробно описана в главе 21, тогда как управление хранящимися в них данными будет приводиться в главах 28 и 29. • Представления (views). Являются виртуальными таблицами (virtual tables), которые отображают данные, хранящиеся в других таблицах. Для пользователя же представления во многом напоминают таблицы. Использование представлений будет подробно описано в главе 22. • Индексы (indexes). Объекты этого типа предназначены для повышения производительности работы сервера при поиске нужных данных в таблицах и представлениях, что достигается путем хранения в упорядоченном состоянии данных одного или более столбцов таблицы или представления. Таким образом, индексы не могут существовать сами по себе. Подробно работа с индексами будет рассмотрена в главе 23. • Ключи (keys). Являются одним из типов ограничения целостности. Однако они играют достаточно важную роль в базе данных и поэтому рассматриваются как отдельные объекты. Тем не менее, реализуются они так же, как и другие ограничения целостности, которые связываются с таблицами. • Умолчания (defaults). Этот тип объектов описывает значения, которые присваиваются столбцам таблицы, если при добавлении строки явно не было указано значение для соответствующего столбца. Работа с умолчаниями будет рассмотрена в соответствующем разделе далее в этой главе.
Глава 18. Архитектура баз данных
821
•
Правила (rules). Являются логическим условием, ограничивающим диапазон возможных значений для столбца таблицы или определяемого пользователем типа данных. Подробно правила будут рассмотрены далее в этой главе.
•
Ограничения целостности (constraints). Специальные управляющие конструкции, ограничивающие диапазон возможных значений в столбце таблицы. Таким образом, ограничения целостности оказываются неразрывными с таблицами. Поэтому они будут рассмотрены при описании работы с таблицами в главе 21.
П Хранимые процедуры (stored procedures). Представляют собой набор команд Transact-SQL, сохраненных специальным образом. Каждая процедура имеет свое имя. По этому имени пользователи могут вызывать процедуру, запуская тем самым на выполнение весь набор команд, представляющих тело процедуры. Рассмотрению работы с процедурами, а также использования их посвящена глава 30. П Триггеры (triggers). Это специальный тип хранимых процедур, автоматически запускаемых сервером при выполнении удаления, вставки или изменения данных в конкретной таблице. То есть триггеры связываются с определенной таблицей и не могут существовать сами по себе. Работа с триггерами будет рассмотрена в главе 32. П Определяемые пользователем типы данных (user-defined data types, UDDT). Эти объекты представляют собой типы данных, создаваемые пользователями. Подробно работа с ними будет представлена в одном из следующих разделов этой главы. •
Определяемые пользователем функции (user-defined function). Объекты этого типа представляют собой набор команд Transact-SQL, сохраненных пользователем в виде функции. Как системные (встроенные) функции SQL Server 2000, так и определяемые пользователем функции будут рассмотрены в главе 27.
Необходимо отметить, что большинство приведенных в списке объектов базы данных SQL Server 2000 являются довольно сложными. Поэтому рассмотрение работы с ними вынесено в отдельные главы. Тем не менее, в базе данных также имеется ряд объектов, работа с которыми не представляет особых затруднений. Поэтому эти объекты будут рассмотрены в следующих разделах данной главы. Однако, прежде чем приступать к рассмотрению объектов базы данных, следует рассмотреть, как происходит именование объектов и какие отношения существуют между пользователями и объектами. Этому и будут посвящены два следующих раздела.
Именование объектов Чтобы иметь возможность работать с объектом, необходимо как-то ссылаться на него. Наиболее простой способ обеспечить уникальную идентификацию объекта — присвоить ему имя. Хотя, конечно, это не единственный способ. Например, можно обращаться к конкретному объекту, зная его адрес в памяти, на диске или в файле базы данных (в случае SQL Server 2000). На самом деле имя
822
Часть IV. Разработка и сопровождение баз данных
объекта является своего рода ссылкой, за которой кроется физический адрес объекта. Однако пользователю гораздо удобнее работать с символьными именами объектов, чем с набором чисел, представляющих адрес объекта. В SQL Server 2000 для обращения к объектам используются имена (идентификаторы). Каждый объект должен иметь имя, уникальное в пределах базы данных. В противном случае система не сможет определить, с каким именно объектом хочет работать пользователь. Обеспечение уникальности имен объектов лежит на SQL Server 2000. Сервер не даст создать пользователю двух объектов с одинаковыми именами. Замечание Даже если вы создаете объекты разных типов, но пытаетесь присвоить им одинаковые имена, то сервер не даст этого сделать. При создании второго объекта будет выдано сообщение о ошибке, говорящее о существовании в базе данных объекта с аналогичным именем. Однако допускается создание роли или пользователя, имена которых совпадают с именами объектов базы данных. Например, в базе данных не может существовать таблицы и правила с одинаковыми именами, но допускается существование одноименных роли и таблицы. При создании объектов выдвигается ряд требований к их именам. Рассмотрим эти требования. •
Максимально допустимая длина имени объекта равна 128 символам. Для хранения имени объекта отводится 256 байт, т. к. имена объектов хранятся в стандарте Unicode. Длина имени временных таблиц ограничена 116 символами. Остальные 12 символов используются SQL Server 2000 для служебных целей.
•
При выборе имени объекта следует удостовериться, что оно не является зарезервированным словом, используемым самим SQL Server 2000. Например, нельзя создать таблицу с именем SELECT ИЛИ CASE, Т. К. ЭТИ слова являются зарезервированными. Кроме того, необходимо проверить, не существует ли уже в базе данных объекта с аналогичным именем.
•
В качестве первого символа имени объекта допускается применение только символов национального или латинского алфавитов, а также символа _ (подчеркивание). То есть имя объекта не может начинаться с цифры, символов !, $ и т. д. Это же правило касается и имен временных таблиц. Хотя один или два первых символа имени временной таблицы могут быть #, тем не менее, следующий за ним символ должен удовлетворять описанному правилу.
•
Второй и любой из следующих символов имени объекта может включать любые символы, определенные стандартом Unicode Standard 2.0 — символы национальных алфавитов, десятичные цифры и символы @, #, $ и .
•
Не допускается использование в любом месте имени объекта пробелов, круглых, квадратных и фигурных скобок, а также символов !, %, л , &, ~, -, . (точка), , (запятая), \, ' и ' .
Глава 18. Архитектура баз данных
823
Замечание При работе с сопоставлением (collate), не чувствительным к регистру, следует учитывать, что SQL Server 2000 не будет различать регистра, в котором набрано имя объекта. Однако если при установке SQL Server 2000 было выбрано сопоставление, чувствительное к регистру, то одинаковые имена, набранные в разных регистрах, будут считаться различными. Имена объектов, соответствующие описанным выше правилам, называются стандартными идентификаторами (Regular Identifiers). Примеры таких идентификаторов легко увидеть в базе данных pubs. Список созданных в базе данных объектов хранится в системной таблице sysobjects, в столбце Name которой указываются собственно имена объектов. С помощью приведенного ниже кода можно получить список десяти имен объектов базы данных pubs: USE pubs SELECT TOP 10 Name FROM sysobjects
После выполнения команды будет получен примерно следующий результат: Name authors byroyalty CHECK_CONSTRAINTS CK authors_au_id 08EA5793 CK authors zip 0AD2A005 CK jobs max_lvl 25869641 CK jobs min Ivl 24927208 CK publisher pub_i 0DAF0CB0 CK_emp_id COLUMN_DOMAIN_USAGE (10 row(s) affected)
Помимо стандартных идентификаторов в SQL Server 2000 существуют еще и так называемые ограниченные идентификаторы (Delimited Identifiers). Ограниченные идентификаторы позволяют обходить некоторые из описанных выше правил именования объектов. Большинство требований к именам объектов продиктовано тем, что SQL Server 2000 должен легко определять, что встреченная последовательность символов является именем объекта, а не служебными конструкциями, константами и т. д. Однако пользователь может явно указать, что конкретная последовательность символов является именем объекта, а ни чем-то иным. Для этого в SQL Server 2000 предназначены специальные ограничители — либо квадратные скобки, либо двойные кавычки. Имена объектов, заключенные в квадратные скобки или двойные кавычки, и называются ограниченными идентификаторами. Когда имя объекта заключается в ограничители, в нем могут использоваться любые символы, включая скобки, пробелы, специальные символы, а также зарезервированные слова. Кроме того, первым символом имени объекта может быть любой символ. Однако остаются требования к уникальности имени объекта.
824
Часть IV. Разработка и сопровождение баз данных
Приведем пример команды, выполняющей создание таблицы, имя которой, как и имена ее столбцов, не соответствуют требованиям именования объектов и должны быть заключены в ограничители: CREATE TABLE [3 кв. 2001 - отчет] ([01-09] int, [10-39] int, [Сумма] money)
При использовании в качестве ограничителей двойных кавычек этот же код будет выглядеть следующим образом: CREATE TABLE "3 кв. 2000 - отчет" ("01-09" int, "10-39" int, "Сумма" money)
Замечание Допускается комбинирование в одной команде ограничителей различных типов. Однако для ограничения имени одного объекта можно использовать только один тип ограничителя. Например, если начало имени объекта указывается с помощью квадратных скобок, то и конец имени также должен быть определен с помощью закрывающей квадратной скобки. Приведенный пример демонстрирует использование квадратных скобок для указания имен объектов, не соответствующих стандартным правилам именования. Как уже было сказано ранее, в качестве ограничителей могут быть также использованы и двойные кавычки (double quotation marks). Однако применение двойных кавычек в SQL Server 2000 возможно двумя способами. Дело в том, что предыдущие версии SQL Server и некоторые другие программы по разному используют двойные кавычки. В одних системах двойные кавычки рассматриваются как эквивалент одинарных кавычек (single quotation marks). To есть символы, заключенные в двойные кавычки, рассматриваются как обычный текст. В других же системах символы, заключенные в двойные кавычки, воспринимаются как имена объектов. Для обеспечения совместимости с обоими типами систем в SQL Server 2000 разрешается произвольное использование двойных кавычек. При необходимости пользователь может переключать режимы использования двойных кавычек по своему усмотрению. На уровне соединения для этого применяется следующая команда: SET QUOTED_IDENTIFIER {ON | OFF}
При выполнении команды с параметром ON двойные кавычки будут интерпретироваться как квадратные скобки. Если же используется аргумент OFF, TO заключенные в двойные кавычки символы станут восприниматься как обычная строка символов, а двойные кавычки будут интерпретироваться как одинарные кавычки. Рассмотрим указание двойных кавычек на примере. SET QUOTED_IDENTIFIER ON SELECT au_fname FROM authors, titleauthor WHERE authors.au id=titleauthor.au id AND au lname="title id"
Глава 18. Архитектура баз данных
825
В этом случае будет выведен список имен всех авторов из таблицы authors, у которых фамилия (столбец auiname) совпадает со значением в столбце t i t i e _ i d . SET QUOTED_IDENTIFIER OFF SELECT au__fname FROM authors, titleauthor WHERE authors.au_id=titleauthor.au_id AND au_lname="title_id"
В этом случае будет выведен список имен всех авторов из таблицы authors, у которых значение в столбце auiname равно строке t i t l e _ i d . В первом случае значение t i t i e _ i d рассматривалось как имя столбца, тогда как во втором случае — как обычная текстовая строка.
Замечание Логики в сравнении фамилии автора (au_lname) с идентификатором книги ( t i t l e _ i d ) конечно же нет. Приведенные команды на примере стандартной базы данных pubs иллюстрируют использование двойных кавычек. Многие хранимые процедуры и некоторые команды Transact-SQL требуют указания в качестве параметра имен объектов. При этом имена объектов передаются как параметр хранимой процедуры в виде обычной строки. Если имя объекта является ограниченным, то при выполнении хранимой процедуры или команды Transact-SQL его необходимо заключить в ограничители. Например, для получения информации о разрешениях, выданных для таблицы [3 кв. 2000 - отчет], вызов процедуры s p _ t a b l e _ p r i v i l e g e s необходимо записать следующим образом: sp_table_privileges @table_name_pattern = '[3 кв. 2000 - отчет]'
Доступ к объектам Каждый объект базы данных SQL Server 2000 должен иметь своего владельца (owner). Владелец объекта имеет полный контроль (full control) над своим объектом. Он может изменять его структуру, добавлять и удалять строки (если это таблица или представление), предоставлять другим пользователям различные права доступа к объекту, а также может удалить сам объект. Владельцем объекта обычно является пользователь базы данных, который создал этот объект. Однако права владения объектом могут быть переданы и любому другому пользователю базы данных. Для передачи прав владения существует следующая хранимая процедура: sp_changeobjectowner [@objname =] ' o b j e c t ' ,
[@newowner =] 'owner'
Имя объекта, владельца которого необходимо изменить, указывается с помощью аргумента [@objname =] ' o b j e c t ' . Аргумент [Gnewowner =] 'owner 1 задает имя нового владельца объекта.
Замечание Сам владелец объекта не может передать права владения объектом другому пользователю. Это может сделать только пользователь, являющийся членом фиксиро-
826
Часть IV. Разработка и сопровождение баз данных ванной роли базы данных db_owner, db_dlladmin или db_securityadmin. Тем не менее, права на выполнение этой хранимой процедуры могут быть даны любому пользователю. Замечание Члены фиксированной роли db_owner способны создавать объекты, владельцем которых является произвольный пользователь базы данных. Для этого при создании объекта достаточно указать помимо собственно имени объекта имя пользователя, которому должен принадлежать объект. Это позволяет не прибегать к использованию хранимой процедуры sp_changeobjectowner.
Помимо того, что объект принадлежит конкретному пользователю, он еще и находится в определенной базе данных. База данных, в свою очередь, размещается на каком-то сервере. На основе этих отношений складывается полное имя (complete name) или, как его еще называют, полностью определенное имя (full qualified name) объекта. Полное имя объекта записывается в виде: [[[server.][database].][owner_name].]object_name
Во главе дерева объектов находится сервер. Следующий уровень иерархии — это база данных. Затем указывается пользователь, которому принадлежит объект, а уже затем имя самого объекта. Когда мы говорим об уникальности имени объекта, то имеется в виду, что должно быть уникальным только полное имя. Это означает, что один и тот же пользователь одной и той же базы данных не может создать двух одноименных объектов. В то же время допускается создание в базе данных множества объектов с одинаковыми именами, но принадлежащих разным пользователям. При ссылке на объект необходимо как минимум указать имя объекта. Если остальные параметры опущены (имя сервера, базы данных и владельца), то будет производиться поиск объекта, расположенного на текущем сервере в текущей базе данных и принадлежащего либо владельцу базы данных (пользователь dbo), либо текущему пользователю. Замечание Когда пользователь обращается к объекту только по его имени, сервер сначала ищет объект, принадлежащий текущему пользователю. Если такой объект не находится, то сервер пытается найти объект, принадлежащий пользователю dbo. Если и такой объект не найден, то выдается сообщение об ошибке. Если же необходимо обратиться к объекту, принадлежащему не текущему пользователю и не пользователю dbo, то следует обязательно указать имя владельца, т. к. сервер не перебирает имен всех владельцев. Итак, при необходимости любой из элементов в иерархии полного имени объекта может быть указан явно. В этом случае достаточно задать только имя самого объекта и нужную часть имени: server.database.owner_name.obj ect_name server.database..object_name
Глава 18. Архитектура баз данных
827
server..owner_name.obj ect_name server...object_name database.owner_name.obj ect_name database..object_name owner_name.obj ect_name object_name
Замечание При обращении к объектам связанного сервера (linked server) или удаленного сервера (remote server) не разрешается опускать часть имени. То есть необходимо всегда указывать полное имя объекта в формате server .database. owner_name. object_name. Работа со связанными и удаленными серверами была рассмотрена в главе 10. Приведенный формат доступа к объектам базы данных касается всех объектов — таблиц, представлений, правил, умолчаний, индексов, ограничений целостности и т. д. Однако при работе с таблицами и представлениями бывает необходимо указывать еще и имя столбца. Для этого к имени объекта добавляется пятый элемент: [[[server.][database].][owner_name].]object_name.column_name
Такая форма записи может быть с успехом использована, например, при выборке данных с помощью команды SELECT ИЛИ при выполнении обновления данных с помощью команды UPDATE. Если часть полного имени объекта не соответствует стандартным правилам именования объекта (например, содержит пробелы), то она должна быть заключена в ограничители: SQLSrvl.[KHSU Databases]..[RIAC People List]
Умолчания Как уже было сказано, умолчания (defaults) являются объектами базы данных, предназначенными для автоматического присвоения значения столбцу таблицы при вставке новой строки, если для этого столбца явно не было указано конкретное значение. Помимо этого, умолчание может быть связано и с пользовательским типом данных, который, в свою очередь, может быть использован для переменной или столбца таблица. Отметим, что умолчание никак не проявляет себя при использовании пользовательских типов данных с определенным для них умолчанием для переменных. Тем не менее, во время применения пользовательского типа данных для столбца таблицы умолчание ведет себя так же, как если бы оно было непосредственно связано со столбцом. Необходимо отметить, что по заявлениям самой компании Microsoft умолчания являются морально устаревшими объектами, и, начиная с SQL Server 7.0, вместо них предлагается использовать ограничение целостности Default, которое указывается на уровне столбца и включается непосредственно в структуру таблицы.
828
Часть IV. Разработка и сопровождение баз данных
Таким образом, в SQL Server 2000 значение по умолчанию может быть определено двумя методами. Выбор того или иного метода зависит от пользователя. Несмотря на предложение Microsoft отказаться от определения умолчаний как объектов базы данных, работа с ними имеет свои преимущества. Рассмотрим, какие же недостатки и достоинства имеет каждый из типов умолчаний. При работе с умолчаниями, реализованными на уровне столбца, как ограничения целостности, необходимо будет указывать отдельно соответствующее значение для каждого столбца, для которого следует определить значение по умолчанию. При этом увеличивается вероятность внесения ошибки. Если же потребуется изменить собственно значение, которое должно присваиваться по умолчанию, то понадобится изменять структуру каждой таблицы. Тем не менее, если предполагается применять умолчание всего для одного столбца, то гораздо быстрее будет указать значение по умолчанию на уровне столбца. Однако нужно отметить, что умолчание, реализованное как объект базы данных, может быть связано с пользовательским типом данных, что недопустимо для умолчаний, реализованных в виде ограничения целостности. Связывание умолчания с пользовательским типом данных позволяет автоматически устанавливать для столбца значение по умолчанию при определении для него соответствующего пользовательского типа данных. Умолчания, реализованные как самостоятельные объекты базы данных, позволяют централизованно контролировать собственно значение, которое будет присваиваться столбцу таблицы. При этом одно и то же умолчание может быть связано с множеством столбцов различных (или одной и той же) таблиц. Однако явным недостатком определения умолчаний как самостоятельных объектов базы данных является значительно большее количество усилий, которое понадобится затратить администратору для получения конечного результата. Во-первых, необходимо будет сначала создать новый объект базы данных, а во-вторых, связать его с нужным столбцом таблицы. Если сравнить это с затратами на конфигурирование значения по умолчанию, как части описания столбца при создании таблицы, то предпочтение явно будет отдано умолчанию, реализованному в виде ограничений целостности. Тем не менее, все же рассмотрим создание и применение умолчаний, реализованных в качестве самостоятельных объектов базы данных. Принятие же решения об их использовании (или не использовании) остается за читателем. Итак, прежде всего, необходимо создать умолчание. Для этого служит команда CREATE DEFAULT, имеющая синтаксис: CREATE DEFAULT default AS constant_expression
Команда имеет всего два обязательных параметра. С помощью первого указывается имя, которое будет присвоено умолчанию. С помощью второго аргумента задается собственне значение, которое будет присваиваться столбцу. Это значение может быть создано не только на основе констант, но и на основе функций. Необходимо заметить, что при создании умолчания никаким образом не определяется, какой тип данных имеет указываемое значение. Поэтому следует быть внимательным при вводе выражения. Например, если предполагается использо-
Глава 18. Архитектура баз данных
829
вать значение по умолчанию для символьных типов данных, то следует заключать его в одинарные кавычки. В противном случае сервер может по иному интерпретировать значение. Например, если в качестве значения по умолчанию указывается строка 20-11-2000, то сервер будет воспринимать ее как формулу и вычислять. Хотя подобное умолчание и можно будет связать со столбцом, имеющим символьный тип данных, при добавлении строки в столбец будет вставлено значение -1991, а не 20-11-2000, как и требовалось. Решением проблемы будет 1 заключение значения по умолчанию в кавычки — '20-И-2000 .
Замечание При выборе имени умолчания нужно следовать стандартным правилам формирования имен объектов, описанных в разд. "Именование объектов" ранее в этой главе. При необходимости можно использовать ограничители. Например, в качестве значения по умолчанию можно указать функцию GETDATEO и связать умолчание со столбцом OrderDate таблицы orders базы данных Northwind, в котором хранится дата ввода заказа. В итоге пользователи смогут опускать значение для столбца OrderDate при добавлении новых заказов. Сервер будет автоматически помещать в столбец OrderDate добавляемой строки текущую дату. Конечно, при необходимости пользователи могут указать любую нужную им дату.
Замечание Надо заметить, что при создании умолчаний нельзя ссылаться на объекты базы данных и переменные, а также использовать определяемые пользователем функции. Однако при работе с умолчаниями, реализованными как ограничения целостности, разрешается применять пользовательские функции. Рассмотрим, как же на практике осуществить приведенный пример. Сначала необходимо создать умолчание. Для этого выполним следующие команды: USE Northwind CREATE DEFAULT def_GETDATE AS GETDATEO
Затем остается только связать созданное умолчание со столбцом OrderDate таблицы orders. Однако мы еще на рассматривал и,, как осуществляется связывание созданного умолчания со столбцом таблицы или с пользовательским типом данных. Для выполнения этой операции предназначена хранимая процедура: sp_bindefault [ Sdefname = ] 'default', [ @objname = ] ' obj ect__name' [ , [ gfutureonly = ] 'futureonly_flag' ]
С
Замечание
Связывать умолчание с таблицей могут только члены фиксированной роли сервера sysadmin, члены фиксированных ролей базы данных db_owner и db_ddladmin, a также владелец таблицы.
Часть IV. Разработка и сопровождение баз данных
830 Рассмотрим параметры процедуры: П
[ @defname = ]
'default'
С помощью этого параметра указывается имя умолчания, которое предполагается связать со столбцом таблицы или пользовательским типом данных. О
[ @objname = ] 'object_name'
Этот же параметр служит для указания имени объекта, с которым связывается умолчание. Если имя указывается в формате tabie_name.column_name, то станет выполняться связывание умолчания со столбцом таблицы. В противном случае будет предполагаться, что связывание необходимо выполнить с пользовательским типом данных. В имени объекта допускается указание ограничителей (квадратных скобок или двойных кавычек).
(
Замечание
Умолчание не может быть связано со столбцом таблицы, имеющим тип данных timestamp, со столбцом-счетчиком (с установленным свойством IDENTITY). Кроме того, не разрешается связывать умолчание со столбцом, для которого было определено значение по умолчанию как ограничение целостности. Когда же связывание осуществляется со столбцом или пользовательским типом данных, с которыми уже связано умолчание (объект базы данных), то происходит автоматическое отвязывание старого умолчания и привязывание нового. О
[ @futureonly = ]
'futureonly_flag'
Этот необязательный параметр может иметь значение ' f u t u r e o n l y ' или NULL. Указание значения ' f u t u r e o n l y ' допускается только при связывании умолчания с пользовательским типом данных. Использование указанного значения позволяет не выполнять изменения в столбцах таблицы, имеющие пользовательский тип данных, с которым связывается новое значение по умолчанию. То есть для столбцов будет применяться старое значение по умолчанию. Однако при создании новых столбцов, имеющих пользовательский тип данных, для них будет использоваться новое значение по умолчанию. Если же параметр @futureonly опускается или имеет значение NULL (которое и указывается для параметра по умолчанию), то будет выполнено обновление значений по умолчанию для всех столбцов, с которыми связан пользовательский тип данных.
Замечание Сервер не выполняет проверки на соответствие типа данных связываемого умолчания с типом данных объекта. Поэтому пользователь обязан сам выполнять необходимые проверки. Несоответствие типов обнаруживается только в момент вставки строки. Кроме этого, следует учитывать и наложенные на столбец таблицы правила и ограничения целостности. Значение по умолчанию не должно конфликтовать с ними, иначе вставка строки завершится неудачей. Мы рассмотрели назначение параметров процедуры sp_bindefauit. Теперь МОЖНО СВЯЗатЬ Созданное умолчание СО СТОЛбцОМ OrderDate Таблицы Orders. Для этого достаточно выполнить следующую команду: EXEC sp_bindefault
'def_GETDATE',
'Orders.OrderDate'
Глава 18. Архитектура баз данных
831
Приведем также пример связывания умолчания defGETDATE с пользовательским типом данных My data type: EXEC sp_bindefault 'def_GETDATE', '[My data type]'
Для полноты картины необходимо рассмотреть, как же осуществляется отвязывание умолчания от столбца таблицы или пользовательского типа данных, а также как удалить умолчание из базы данных. Выполнение первой операции осуществляется с помощью системной хранимой процедуры s p u n b i n d e f a u l t , имеющей следующий синтаксис: sp_unbindefault [ Sobjname = ] 'object_name' [, [ @futureonly = ] 'futureonly_flag']
Рассмотрим параметры процедуры: П
[ @objname = ]
'object_name'
С помощью этого параметра указывается имя объекта, от которого следует отвязать умолчание. Его использование ничем не отличается от работы с одноименным параметром процедуры s p b i n d e f a u i t , рассмотренным выше. О
[ Sfutureonly = ] 'futureonly_flag' Этот необязательный параметр может иметь значение ' f u t u r e o n l y ' или NULL. Указание значения ' f u t u r e o n l y ' допускается только для пользовательских типов данных. Его указание предписывает не изменять значение по умолчанию для столбцов, имеющих пользовательский тип данных, от которого отвязывается умолчание. При задании любого иного значения, а также когда параметр @futureonly опускается или имеет значение NULL (которое и используется для параметра по умолчанию), то будет выполнено обновление значений по умолчанию для всех столбцов, с которыми связан пользовательский тип данных.
Н а п р и м е р , ДЛЯ ОТВЯЗЫВанИЯ уМОЛЧанИЯ ОТ СТОЛбца O r d e r D a t e ТаблИЦЫ O r d e r s
достаточно выполнить следующую команду: EXEC sp_unbindefault 'Orders.OrderDate'
Удаление же умолчаний выполняется с помощью команды DROP имеющей синтаксис: DROP D E F A U L T { d e f a u l t
DEFAULT,
} [ ,...n ]
Единственный параметр этой команды определяет имя умолчания, которое необходимо удалить. Как видно из синтаксиса, с помощью одной команды DROP DEFAULT можно удалить множество умолчаний. Для этого достаточно перечислить их имена через запятую. Следует заметить, что нельзя удалить умолчание, связанное со столбцом таблицы или пользовательским типом данных. Дело в том, что сервер не выполняет автоматического отвязывания умолчания, поэтому пользователь должен вручную отвязать умолчание от всех объектов, а уже после этого удалять его. Например, для удаления умолчания defGETDATE достаточно выполнить команду: DROP DEFAULT def GETDATE
832
Часть IV. Разработка и сопровождение баз данных
Помимо рассмотренных операций работы с умолчаниями, иногда возникает необходимость изменения существующего умолчания, что подразумевает модификацию собственно значения, которое будет присваиваться столбцу таблицы. Мы не рассмотрели команду, с помощью которой можно выполнять изменение умолчания. Дело в том, что такой команды нет. То есть в SQL Server 2000 не реализована возможность изменения умолчания. Таким образом, внесение изменений в умолчание может быть произведено только путем удаления его и повторным созданием с новыми параметрами. В некоторой степени помочь подобному изменению умолчания может хранимая процедура sp_heiptext, позволяющая получить код команды CREATE DEFAULT, С помощью которой было создано умолчание. Например, для просмотра кода умолчания def_GETDATE можно выполнить следующую команду: sp_helptext
'def_GETDATE'
В ответ будет получен примерно такой результат: Text CREATE DEFAULT def_GETDATE AS GETDATE()
Мы рассмотрели работу с умолчаниями средствами Transact-SQL. Однако в SQL Server 2000 имеется возможность работы с умолчаниями и средствами графического интерфейса Enterprise Manager. В каждой базе данных существует папка Defaults (рис. 18.6), в которой перечислены все умолчания, созданные в базе данных. Именно с помощью этой папки и выполняется создание и удаление умолчаний, а также связывание их с пользовательскими типами данных или столбцами таблицы. Как видно, для каждого умолчания указывается его имя, имя владельца и дата создания. Для образования нового умолчания необходимо в пустой области правой части окна щелкнуть правой кнопкой мыши и в открывшемся контекстном меню выбрать команду New Default. В ответ появится окно Default Properties (рис. 18.7). В поле Name окна Default Properties указывается имя, которое будет иметь умолчание, тогда как в поле Value задается собственно значение, которое станет содержать умолчание. При работе с этими полями следует придерживаться тех же правил, что и при работе с командами Transact-SQL. В момент создания умолчания нельзя выполнить его связывание с пользовательскими типами данных или столбцами таблицы. Это видно из рис. 18.7, на котором недоступны кнопки Bind UDTs и Bind Columns, позволяющие, соответственно, выполнять связывание с пользовательскими типами данных и столбцами таблиц. Активны указанные кнопки будут только при открытии окна свойств созданного умолчания. После нажатия кнопки Bind UDTs появится окно Bind Default to User-defined Data Types (рис. 18.8). В столбце Name указано имя пользовательского типа данных. Системный тип данных, на основе которого создан тот или иной пользовательский тип данных, указывается в столбце Data Type. Установленный флажок в столбце Bind свиде-
Глава 18. Архитектура баз данных
833
тельствует о связывании умолчания с соответствующим типом данных. Установка флажка в столбце Future Only позволяет не отображать на столбцах таблиц, уже имеющих соответствующий пользовательский тип данных, изменения, выполняемые с типом данных. Окно Bind Default to User-defined Data Types может использоваться не только для связывания умолчания с пользовательским типом данных, но и для отвязывания его. щ, SQL Server Enterprise Manager- [Console RootXMirrosoJl SQL Serve'£] Console Window Help j Action
View
Tools
, О <* ; &M
Tree I
.
1
Gj Console Root •*• - *"~j Microsoft SQL Servers В " _*»» STORAGE (Windows MT/2000) : ; El CJ Databases ] ^ y Administrator Database
;
! ; I
i
!
;
;
, f Щ Щ> \$ Defaults
STQMO5*
-]- vS | ^ Q Щ
6 Items
Name ' I3def2 3def3 3def_GETDATE E3Defj3ETDATE() G3Multi_Default ISQuality default
Owner dbo dbo dbo dbo dbo dbo
Create Date 14.11.2000 13:39:50 14.11.2000 13:40:21 14.11.2000 15:57:05 14,11.2000 14:31:53 14.11,2000 14:34:45 14.11.2000 13:44:33
3-fl distribution i j master ] Q model }••• {J msdb ]• Q MyDistrib Й t ^ j Northwind i ! =E§ Diagrams ; j ; -Щ Tables . : oV Views i i^ Stored Procedures ! ' |- в Users _ :
:
:
LJ Rules L 3 Defaults Oj User Defined Data' : CJjj User Defined Functi ; ; Si C j Publications Щ Full-Text Catalogs ffl 0 pubs
Рис. 18.6. Папка Defaults
Default Properties - STORAGE General Name:
Value:
Def_GETDATE()
JGETDATEQ
OK
Cancel
Help
Рис. 18.7. Окно Default Properties
834
Часть IV. Разработка и сопровождение баз данных
Bind Default to User-defined Data Types General Default:
Def_GETDATE()
Name El [My type] jBTypeVarchar(IOO)
j Data Type bigint varchar
OK
Cancel
iBind Future Only t •• -jf Ш
Apply
Help
Рис. 18.8. Окно Bind Default to User-defined Data Types Bind Default to Columns - Def_GETDATEQ General Default: Table:
Def_GETDATE() |[dbo].[Orderi
Unbound columns: Name Data l ' OiderlD int SH CustomeilD nchar is! EmployeelD int ^pRequiredDate Ш ShippedDate
Eound columns: Name
i ±
Data Type
Add»
datetime <
Ш ShipVia
int
H=| Freight
money
Ш ShipName
nvatcha
ЦЦ ShipAddress
nvarcha
Ш ShipCity
nvatcha
[US ShipRegion
nvarcha . ,'.•',. i, -.3.. OK
Cancel
Рис. 18.9. Окно Bind Default to Columns
Apply
Help
Глава 18. Архитектура баз данных
835
Вернемся же к окну свойств умолчания. Нажав в нем кнопку Bind Columns, можно открыть окно Bind Default to Columns (рис. 18.9), с помощью которого выполняется связывание умолчания со столбцами таблиц базы данных. В раскрывающемся списке Table выбирается имя таблицы, со столбцом которой необходимо связать умолчание. В списке Unbound columns перечислены столбцы таблицы, связанные с конфигурируемым умолчанием. Перенося имена столбцов в список Bound columns, вы тем самым связываете умолчание с соответствующим столбцом выбранной таблицы.
Замечание Необходимо отметить, что когда в Enterprise Manager открывается окно свойств созданного умолчания, то имеется возможность изменить собственно значение, которое будет присваиваться столбцам таблиц. Однако изменение можно будет выполнить только в том случае, если умолчание не связано ни с одним объектом базы данных. Это происходит из-за того, что изменение умолчания осуществляется путем удаления существующего и последующим созданием нового умолчания. Однако, как уже было сказано, нельзя удалить умолчание, связанное хоть с одним объектом. На этом рассмотрение работы с объектами базы данных типа Defaults можно считать оконченным.
Правила Правила (rules) представляют из себя объекты базы данных, содержащие логические условия, с помощью которых можно выполнить проверку значений на соответствие определенным требованиям. Например, при работе с процентами с помощью правила можно выяснить, что указываемое значение лежит в пределах от 0 до 100. В SQL Server 2000 нет встроенных типов данных, которые обеспечивали бы хранение значений только в диапазоне от 0 до 100. Самый близкий тип данных t i n y i n t позволяет хранить значения в диапазоне от 0 до 255. Поэтому, чтобы быть уверенным, что значение лежит в диапазоне от 0 до 100, необходимо использовать дополнительные механизмы. Одним из таких механизмов и являются правила. Однако правила, как и умолчания, представляют собой устаревший тип объектов. Правила активно использовались в SQL Server 6.x и более ранних версиях, но начиная с SQL Server 7.0, в распоряжении пользователей появился более мощный механизм — ограничение целостности Check. Контроль значений с помощью ограничения целостности Check предоставляет пользователям более широкие возможности. В частности, для одного столбца можно определить множество ограничений целостности Check, тогда как при использовании правил для столбца разрешается указывать всего одно правило. Работа с правилами требует больших трудозатрат по сравнению с применением ограничений целостности, которые являются частью определения столбца, и хранятся непосредственно в структуре таблицы. Когда пользователь пытается добавить в таблицу новую строку или изменить существующую, сервер проверяет, не связано ли со столбцами какое-либо пра-
836
Часть IV. Разработка и сопровождение баз данных
вило. Если таковые имеются, то берется значение столбца и проверяется на соответствие правилу. Сравнение осуществляется путем подстановки значения столбца в логическое условие, на основе которого и определено правило. Если значение столбца соответствует условию, то после вычисления логического выражения возвращается значение TRUE (истина), и операция вставки или изменения строки разрешается. В противном случае возвращается значение FALSE (ложь), и попытка пользователя вставить или изменить строку откатывается с выдачей соответствующего сообщения об ошибке. Если со столбцом связано правило, и определено одно или более ограничений целостности CHECK, TO значение проверяется на соответствие всем им. Только если значения всех столбцов соответствуют всем определенным для них ограничениям целостности CHECK и правилам, будет разрешена вставка или изменение данных. Работа с правилами во многом напоминает работу с умолчаниями. Пользователь должен сначала создать правило как объект базы данных, а затем связать его со столбцом таблицы или пользовательским типом данных. Рассмотрим же, какие команды и хранимые процедуры используются при работе с правилами. (
Замечание
^
Как и при работе с умолчаниями, правила не отражаются на работе с локальными переменными, имеющими пользовательский тип данных. Правило проявляет себя только для столбцов таблицы. Создание правил выполняется с помощью команды CREATE RULE, которая имеет синтаксис: CREATE RULE rule AS condition_expression
С помощью первого аргумента определяется имя, которое будет иметь правило. При выборе имени следует придерживаться стандартных правил именования объектов, рассмотренных ранее в этой главе. При необходимости можно использовать ограничители. Собственно логическое условие, которое будет выступать для проверки значений, указывается с помощью параметра c o n d i t i o n e x p r e s s i o n . В логическом условии можно использовать одну локальную переменную, вместо которой сервер будет подставлять значение столбца. Собственно имя переменной не играет значения. Скажем только, что имена локальных переменных начинаются с символа @. Допускается указание множества логических условий, связываемых в одно целое операторами AND и OR. В качестве примера рассмотрим создание правила, выполняющего проверку значения на принадлежность к интервалу от 0 до 100: CREATE RULE rule0_100 AS @value>=0 AND @value<=100
Отметим, что в правиле никаким образом не задается тип проверяемого значения. Поэтому на вход правила могут подаваться значения любых типов. Ограничения на тип данных накладывают операторы, используемые в логическом условии. Указание переменной в логическом условии требуется обязательно. Однако можно построить выражение таким образом, что собственно проверяемое значение не будет играть никакой роли, а все будет зависеть, например, от значе-
Глава 18. Архитектура баз данных
837
ний, возвращаемых функцией. Следующий пример демонстрирует создание правила, зависящего только от значения, возвращаемого функцией GETDATE (). Если текущее число меньше 15, то правило вернет значение TRUE, И выполнение изменения или вставки строки будет разрешено. CREATE RULE rulel AS DATEPART(dd, GETDATE())<15 AND @a=@a
Можно также создать правило, которое будет разрешать вставку или изменение строк только из соединений, установленных с компьютеров LIT, DM И STORAGE, ИЛИ Соединений, установленных Пользователями MATRIX\Administrator ИЛИ sa: CREATE RULE r u l e 2 A S (HOST_NAME() I N ( ' L I T ' , ' D M ' , ' S T O R A G E ' ) OR 1 SUSER SNAMEO I N ( ' M A T R I X \ A d m i n i s t r a t o r ' , ' s a ) ) AND@a=@a
Замечание В обоих последних приведенных примерах проверяемое значение не играет никакой роли, поэтому правило может быть связано с любым столбцом таблицы. После создания правила можно приступать к связыванию его со столбцом таблицы или пользовательским типом данных. Для выполнения этой операции предназначена системная хранимая процедура s p b i n d r u i e , имеющая синтаксис: sp_bindrule [ Srulename = ] ' r u l e ' , [ @objname = ] 'object_name' t , [ @futureonly = ] 'futureonly_flag'
]
Замечание Связывать правило с таблицей могут только члены фиксированной роли сервера sysadmin, члены фиксированных ролей базы данных db_owner и db_ddladmin, a также владелец таблицы. Назначение параметров этой процедуры, а также работа с ними полностью соответствуют процедуре sp_bindefauit, работа с которой была рассмотрена в предыдущем разделе. В качестве примера рассмотрим связывание правила r u l e l с пользовательским типом данных MyDT: sp_bindrule ' r u l e l ' ,
'MyDT'
Отвязывание правила от объекта s p u n b i n d r u i e , имеющей синтаксис:
выполняется
с
помощью
процедуры
sp_unbindrule [@objname =] 'object_name' [, [@futureonly =] 'futureonly_flag']
Удаление же правила осуществляется с помощью команды: DROP R U L E { r u l e
} [ , . . . n ]
Единственный параметр этой команды предназначен для указания имени правила, которое необходимо удалить. Если надо удалить более одного правила, то достаточно перечислить их имена через запятую.
Часть IV. Разработка и сопровождение баз данных
838
Для получения кода команды CREATE RULE, С ПОМОЩЬЮ которой было создано правило, можно использовать процедуру s p h e i p t e x t . Например, для получения кода правила ruie2 необходимо выполнить команду: spjnelptext
'rule2'
Будет получен примерно следующий результат: Text CREATE RULE rule2 AS (HOST_NAME() IN ('LIT', 'DM', 'STORAGE') OR SUSER_SNAME() IN ('MATRIX\Administrator', 'sa')) AND @a=@a
Управление же правилами средствами Enterprise Manager выполняется с помощью папки Rules (рис. 18.10), имеющейся в каждой базе данных. *2« SQL Server Enterprise Manager - CConsoe l Root\Microsoft SQL S«rvere\MAIRlX S«r*ets '£) Consoe l Wn idow Hep l |j Acton Ve iw '• Toosl 1 j <> •« • ©103 i f 0 Щ> iS • • тгг |> vS0 Ё с | Rules 3 Items Tree : < ~j Consoe l Root *OName Owner Create Date rulel i- Щ ) Microsoft SQL Servers H ( f | MATRIX Servers + [ f j CIT - _J^, STORAGE (Windows NT/2000) :
•
!
:
; :
i
1
•
•
L j rule2 Qrule3
dbo dbo dbo
14.11.2000 17:52:28 14.11.2000 18:14:21 14.11.2000 18:20:37
Й C j Databases ; Ш к У Administrator Database .1+1 ( У Bonus Ш У distribution В у master
: j •fflШ model ! ; Ф'@ m s c l D Si I j MyDistrib Ы t ^ j Northwind г а ^ Diagrams :
'•• \
;
;
!
i
;
j
1 <Щ Stored Procedures
!
!
;
|
Ц Full-Text Catalogs
1'J : ; > ! | ;
J H Tables
! ' i' f- И Users • ; ;'• j ^ Roles : ; гШ Ru|es • i : • О Defaults ! Rj User Defined Data' • • ; ; £jij User Defined Functi : : : • Si Cj Publications '. j+i ( J pubs <\
•»! 1
H
Р и с . 1 8 . 1 0 . Папка Rules
Для создания нового правила достаточно щелкнуть в пустом месте правой части окна правой кнопкой мыши и в открывшемся контекстном меню или непосредственно в контекстном меню папки Rules выбрать пункт New Rule. В результате появится окно Rule Properties (рис. 18.II), с помощью которого собственно и создается правило.
Глава 18. Архитектура баз данных
839
Rule Properties - STORAGE \ Generail Name:
Fiule4
@exp
J±T
Cancel
Help
Рис. 1 8 . 1 1 . Окно Rule Properties
В поле Name вводится имя, которое будет присвоено создаваемому правилу. В поле Text указывается логическое условие, которое будет использоваться для проверки значений столбцов. То есть должен быть приведен тот же текст, что задается для параметра condition_expression команды CREATE RULE. Как и при работе с умолчаниями, в нижней части окна Rule Properties имеются кнопки Bind UDTs и Bind Columns, с помощью которых соответственно осуществляется связывание правила с пользовательскими типами данных и столбцами таблиц. Мы не будем рассматривать выполнение этих операций, т. к. они практически ничем не отличаются от связывания умолчаний, которое было рассмотрено в предыдущем разделе. На этом рассмотрение правил можно считать оконченным.
Определяемые пользователем типы данных В SQL Server 2000 имеется набор встроенных типов данных, которые вполне подходят для решения множества задач. Однако в некоторых случаях возникает необходимость определения дополнительных типов данных. В SQL Server 2000 это реализуется с помощью определяемых пользователем типов данных (UDDT, User Defined Data Type). Пользовательские типы данных создаются на основе встроенных в SQL Server 2000 системных типов данных. Таким образом, нельзя создать тип данных с совершенно новыми свойствами, которые не имеет ни один системный тип данных. Однако пользовательские типы данных могут иметь конкретные свойства. Например, можно создать тип данных phone, который будет иметь длину 9 символов и разрешать хранение значений NULL. С пользовательским типом данных можно связать умолчание и правило. В итоге получается довольно мощный комплект, который работает как одно целое. На основе пользовательского типа
840
Часть IV. Разработка и сопровождение баз данных
данных можно создавать переменные или столбцы таблиц. Однако, при использовании его для переменных правила и умолчания не действуют. Вообще список типов данных, которые могут применяться при работе с той или иной базой данных, находится в системной таблице systypes, имеющейся в каждой базе данных. В этой таблице перечислены как системные, так и пользовательские типы данных. Вообще системные типы при работе с базой данных можно рассматривать как пользовательские типы данных, созданные на основе настоящих системных типов данных и имеющие то же имя, что и исходный системный тип данных. Следствием подобного подхода является возможность изменения имен системных типов данных. Хотя встроенных команд или процедур для выполнения подобных операций нет, все же это можно выполнить непосредственным изменением значений в системной таблице systypes. Например, изменим название встроенного типа данных r e a l на barrakuda: 1
UPDATE systypes SET [name] = 'barrakuda
WHERE [name] = 'real'
Теперь же попытаемся использовать новый тип данных: DECLARE @aa barrakuda SET ёаа = -10.654 SELECT @aa
В ответ будет выдан результат: -10.654 (1 row(s)
affected)
Использовать же тип данных r e a l будет нельзя: DECLARE @aa real
При попытке выполнить указанную команду будет выдано следующее сообщение: Server: Msg 2715, Level 16, State 3, Line 1 Column or parameter #-1: Cannot find data type real. Parameter '@aa' has an invalid data type.
Данное сообщение говорит о невозможности создания переменной @аа с типом данных r e a l , т. к. такой тип данных найти не удалось. Заметим, однако, что выполненное изменение касается только одной базы данных. Следует быть осторожным с изменением встроенных типов данных, т. к. это может привести к неожиданным последствиям. Для создания нового пользовательского типа данных существует системная хранимая процедура sp_addtype, имеющая синтаксис: sp_addtype [ Qtypename = ] type, [ @phystype = ] system_data_type [ , [ Snulltype = ] 'null_type' ] [ , [ Sowner = ] 'owner name' ]
Глава 18. Архитектура баз данных
841
Рассмотрим назначение параметров этой процедуры: П
[ @typename = ] type
С помощью этого параметра указывается имя, которое будет иметь создаваемый пользовательский тип данных. При выборе имени следует придерживаться стандартных правил именования объектов. Допускается использование ограничителей (квадратных скобок или двойных кавычек), если имя типа данных включает недопустимые символы. О
[ Sphystype = ] system_data_type
Посредством этого параметра определяется системный тип данных, на основе которого будет создан пользовательский тип данных. При попытке указать в качестве исходного типа данных пользовательский тип данных будет выдано сообщение об ошибке, гласящее о невозможности найти указанный тип данных. Указанный системный тип данных ищется в таблице systypes той базы данных, в которой создается пользовательский тип данных. Поэтому, если имена системных типов данных были изменены, то следует указывать измененное имя. Для создания пользовательских типов данных разрешается применять не все системные типы данных. В частности, не разрешено использовать ТИПЫ данных cursor, t a b l e , time stamp. В табл. 18.1 приведен список системных типов данных, которые могут быть использованы при создании пользовательского типа данных. Таблица 18.1. Список доступных системных типов данных 'binary(n)' bit 'char(n)' Datetime Decimal : 'decimal[(p [, s ] ) ] ' float j 'float(n)' ! sql_variant
Smalldatetime Image Int Smallint 'nchar(n)' Text Ntext Tinyint Uniqueidentifier Numeric 'numeric[(p[ , s ])]' 'varbinary(n)' 'nvarchar (n) ' 'varchar(n)' Bigint Real
•
Замечание Подробно работа с системными типами данных будет рассмотрена в главе 29. [ @nulltype = ] 'null_type' ]
Данный параметр позволяет контролировать, будет ли разрешаться в столбце, имеющем создаваемый пользовательский тип данных, хранение значений NULL. Параметр может иметь всего три значения: •
'NULL 1 — хранение значений NULL разрешено;
•
' NOT NULL ' — хранение значений NULL не разрешается;
•
' NONULL ' — хранение значений NULL не разрешается.
842
Часть IV. Разработка и сопровождение баз данных Если параметр @nuiitype опускается, то возможность хранения значений NULL определяется значением свойств соединения SET A N S I N U L L D F L T O N И SET
ANSI NULL DFLT OFF.
Замечание Возможность хранения значений NULL В столбце таблицы помимо пользовательского типа данных также может быть определена и на уровне столбца. П
[ @owner = ] 'owner_name'
С помощью этого параметра можно указать имя владельца, которому должен принадлежать создаваемый пользовательский тип данных. Отметим, что указание произвольных пользователей разрешается Только членам фиксированной роли базы данных dbowner. Остальные же пользователи могут указать только свое имя. Если параметр опускается, то владельцем объекта будет являться пользователь, выполняющий процедуру sp_addtype. Мы рассмотрели синтаксис процедуры sp_addtype, а теперь приведем несколько примеров ее применения. Предсталенный ниже пример создает пользовательский тип phone на основе системного типа данных char. Размер пользовательского типа данных будет 8 символов. При этом разрешается хранение значений NULL В столбце таблицы, с которым будет связан пользовательский тип данных: sp_addtype 'phone', 'char(8)', 'NULL'
Этот тип данных может использоваться как при создании столбцов, так и при определении переменных. Попробуем создать переменную на основе нового типа данных: DECLARE @aa phone SET @aa='295469283758923' SELECT @aa
В ответ будет получен результат: 29546928 (1 row(s)
affected)
Как видно из выше приведенного примера, сервер выполнил усечение строки до 8 символов, как того требует тип данных phone. Мы рассмотрели создание пользовательских типов данных. Удаление же пользовательского типа данных выполняется с процедурой: sp_droptype [ Stypename = ] 'type'
С помощью единственного параметра этой процедуры следует указать имя пользовательского типа данных, который следует удалить. Управление пользовательскими типами данных средствами Enterprise Manager выполняется с помощью папки User Defined Data Type (рис. 18.12).
Глава 18. Архитектура баз данных
843
"Ja SQL Server Enterprsi e Manager - [Consoe l Roat\MciN>soft: SQL« : i '£) Consoel Wnidow bep l I! fiction View
Ipols
:
: <J=> «> : L?D Щ : :*? Ш Щи Ё? П
Tree
| User Defined Data Type
:""'! Console Root • Name •' ^ i phone - Щ Microsoft SQL Servers -л 0 MATRIX Servers SLSSS : * p c u J2]tpl ; 3 Щ STORAGE (Windows NT/2000) 2 ] type 1 ; В CJ Databases GaTypeVarcharflOO) i ; : it: ^ y Administrator Database • ^ : S i § j Bonus ' Ж Э distribution ; i r+ Q master ' ; * ,ij model i ' 1 Й § msdb ; • U MyDistrib ; F: ~$ Northwind
ЯШМ»ВДИИ
L> 0 С 5 Item Owner dbo dbo dbo dbo dbo
Base Type char bigint int int varchar
Length | Ao lw Nusl | Defautl Ruel 8 1 8 0 dboD . ef_GETDATE() dbo.rue l3 4 1 4 1 100 1
:'••]'••• 3 ^ Diagrams • I | ] ; Щ Tables ; • • ' ', oV Views ' I ! ^ Stored Procedures ! • '•• { Л Users __ i : ! • g j Roles : : '• '•• : [_j Rules i ; ; ; : 3 Defaults ! i • \' '. R j User Defined Data" ; C £ User Defined Functi ! 31 ZJ Publications •••• Щ Full-Text Catalogs i • ! ;S--@ pubs д |
Рис.
_|р|х| -Ifll :-i:
iH
1 8 . 1 2 . Папка User Defined Data Type
User-Defined Data Type Properties General
Name:
fiatatype:
DataType5
bigint
Length: Allow NLLLLs Rule:
Idbo.rule2
Default:
jdbaDef_GETDATE()
OK
Cancel
Help
Рис.
1 8 . 1 3 . Окно User-Defined
Data Type Properties
Информация о пользовательских типах данных отображается в следующих столбцах: П Name — имя пользовательского типа данных;
844
Часть IV. Разработка и сопровождение баз данных
П Owner — владелец пользовательского типа данных; П Base Type — системный тип данных, на основе которого был создан соответствующий определяемый пользователем тип данных; •
Length — максимальное количество символов или байт, которое отведено для пользовательского типа данных;
П Allow Nulls — если в столбце указывается 1, то тип данных разрешает хранение значений NULL, при задании 0 хранение этих значений не разрешено; П Default — имя умолчания, которое было связано с типом данных; G Rule — имя правила, которое было связано с типом данных. Для создания нового пользовательского типа данных используется окно UserDefined Data Type Properties (рис. 18.13), открыть которое можно, выбрав в контекстном меню папки User Defined Data Type пункт New User Defined Data Type. Рассмотрим назначение элементов управления, имеющихся в окне User-Defined Data Type Properties: •
Name. В этом текстовом поле приводится имя, которое будет иметь создаваемый пользовательский тип данных. При выборе имени необходимо следовать стандартным правилам именования объектов.
•
Data type. С помощью этого раскрывающегося списка необходимо выбрать один из системных типов данных, на основе которого и будет создан новый пользовательский тип данных.
•
Length. В этом поле указывается размер (в символах, десятичных цифрах либо байтах в зависимости от системного типа данных), который должен иметь создаваемый пользовательский тип данных. Отметим, что не для всех типов данных разрешается управление размером. Например, для целочисленных, денежных, типов даты и времени и некоторых других эта возможность не поддерживается, и поле Length будет неактивно, хотя в нем и выводится размер выбранного типа данных.
•
Allow NULLs. Установка этого флажка разрешает хранение значений NULL В столбцах таблицы, которые будут использовать создаваемый тип данных.
П Rule. В раскрывающемся списке перечислены имена всех созданных в базе данных правил. Выбирая имя того или иного правила, вы тем самым выполняете связывание этого правила с создаваемым типом данных. П Default. Посредством этого раскрывающегося списка можно связать с пользовательским типом данных одно из умолчаний, созданных в базе данных. С помощью кнопки Where Used можно открыть окно, где будут перечислены имена столбцов таблиц, при создании которых использовался соответствующий пользовательский тип данных. Отметим, что кнопка Where Used доступна только при открытии окна свойств уже созданного пользовательского типа данных. В момент создания эта кнопка неактивна. На этом рассмотрение работы с определяемыми пользователем типами данных можно считать оконченным.
Глава 19
Транзакции и блокировки Если с базой данных работает несколько человек, то неизменно возникает проблема совместного использования данных. Простейшим примером этой проблемы является одновременная попытка изменения одной и той же информации несколькими пользователями. Система управления базами данных должна каким-то образом решать, изменения какого из пользователей должны быть выполнены. Приведенный пример — это лишь простейший случай. Рассмотрим более сложную ситуацию. Предположим, что для подготовки отчета необходимо трижды провести сканирование нескольких таблиц по определенным критериям. Во время между второй и третьей выборкой один из пользователей добавляет или удаляет строки в таблицах таким образом, что изменяется набор строк, которые рассматриваются при генерировании отчета. То есть в третьей выборке будут анализироваться уже другие данные, чем при первых двух выборках. Естественно, данные в отчете окажутся некорректными. Если с базой данных работает всего один пользователь, то описанные проблемы решаются автоматически. То есть никто, кроме самого пользователя не может изменить данных. Как было сказано ранее, при работе с данными более одного пользователя в СУБД должны быть реализованы механизмы, обеспечивающие нормальную работу множества пользователей. В качестве таких механизмов выступают транзакции и блокировки. Эта глава будет посвящена подробному рассмотрению различных проблем, возникающих при коллективной работе с данными множества пользователей, применении транзакций и блокировок в SQL Server 2000.
Основы транзакций Для решения вышеописанных проблем в SQL Server 2000 используются транзакции и блокировки. Транзакция (transaction) представляет собой набор из одной или более команд, обрабатываемых как единое целое. То есть будет выполнен либо весь набор команд, либо не выполнена ни одна из них. Одна транзакция может изменять как отдельную строку таблицы, так и миллионы строк в различных таблицах. Кроме того, с помощью распределенных транзакций (distributed transaction) можно изменять строки в разных базах данных. SQL Server 2000 гарантирует, что данные, к которым обращается транзакция, останутся неизменными на всем протяжении существования транзакции.
846
Часть IV. Разработка и сопровождение баз данных
По умолчанию каждая команда Transact-SQL рассматривается как отдельная транзакция. В обычном режиме ни одна команда изменения данных не может быть выполнена вне транзакции. Тем самым обеспечивается целостность данных. Не может быть такого, что из тысячи строк, которые должны быть изменены, девяносто процентов будут изменены, а остальные десять — нет. При необходимости пользователь может явно определить начало и конец транзакции, тем самым включив в нее более одной команды. Имеются определенные требования к выполнению транзакций системой управления базами данных. Эти требования, известные как требования ACID (Atomicity, Consistency, Isolation и Durability), описывают то, как должны обрабатываться данные и в каком состоянии они должны находиться после завершения транзакции. Рассмотрим эти требования. П Атомарность (Atomicity). Все изменения данных, выполненные в транзакции, рассматриваются как единый минимальный блок. Не может быть такого, что изменения, внесенные одной командой, будут зафиксированы, а изменения, выполненные остальными командами, будут откачены. Зафиксированными могут оказаться либо все изменения, выполненные в транзакции, либо данные будут восстановлены в состоянии, в котором они были до начала транзакции. П Согласованность (Consistency). После того, как транзакция будет успешно завершена, данные должны удовлетворять всем ограничениям целостности, определенным в базе данных. Кроме того, все связанные с измененными данными индексы должны находиться в корректном состоянии и отображать сделанные изменения. Хотя транзакция рассматривается как атомарный неделимый блок, который может быть выполнен целиком или не выполнен вообще, все же транзакция состоит из отдельных команд, выполняемых последовательно. Каждая команда может производить изменение данных в таблице. В ходе этих изменений могут быть нарушены правила (rules) и ограничения целостности (constraints), наложенные на данные. SQL Server 2000 позволяет контролировать целостность данных двумя способами: целостность данных может проверяться после выполнения каждой команды или только при фиксировании транзакции. В первом случае необходимо гарантировать, что каждая из команд транзакций не нарушает ограничений целостности. В противном случае вся транзакция откатывается (rollback) и система возвращается в состояние, в котором она была до начала транзакции. Во втором случае в ходе выполнения транзакции могут возникать нарушения ограничений целостности и правил. Однако необходимо гарантировать, что к моменту фиксирования транзакции целостность данных не будет нарушена. Последний метод контроля целостности часто используется, когда для выполнения изменений данных надо на время нарушить установленные ограничения целостности и правила. • Изолированность (Isolation). Изменения данных, выполняемые различными транзакциями, должны быть независимыми друг от друга. То есть операции изменения данных, выполняемые одной транзакцией, не должны зависеть от изменений, вносимых другой транзакцией. Транзакция не должна производить изменения, основываясь на данных, изменяемых в другой транзакции.
Глава 19. Транзакции и блокировки
847
Все транзакции должны работать независимо друг от друга, т. е. быть изолированными. В противном случае нельзя будет предсказать, в каком состоянии могут оказаться данные. Если транзакция использует данные, изменяемые некоторой транзакцией, то она будет видеть их в состоянии, в котором они были либо до начала транзакции, либо после ее окончания. Просмотр данных в промежуточном состоянии не разрешен, т. к. нельзя гарантировать, что эти данные верны и соответствуют всем наложенным правилам и ограничениям целостности. Данные в транзакции могут изменяться несколько раз, прежде чем они примут окончательный вид. Кроме того, если транзакция читает несколько раз одни и те же данные, то необходимо, чтобы она видела их каждый раз в одном и том же состоянии. Например, необходимо трижды сканировать данные по определенному условию, чтобы получить три различных коэффициента. Предположим, что после второго сканирования данные изменяются. Тогда третий коэффициент будет получен на основании других данных и не будет соответствовать двум первым коэффициентам. Тем не менее, этого можно не заметить и использовать полученные коэффициенты. Если транзакция выбирает строки по определенному логическому условию, то никакая другая транзакция не должна изменять, добавлять или удалять строки, которые соответствуют указанному логическому условию. Такое поведение известно как "упорядочиваемость" или "сериализуемость" (serializability). П Устойчивость или долговечность (Durability). После того, как транзакция выполнит все необходимые изменения и ее работа будет завершена, система выполняет фиксирование транзакции (commit transaction). После этого система не может быть возвращена в состояние, в котором она была до начала транзакции. Даже если сразу же после фиксирования транзакции произойдет неожиданный крах или останов системы, то при следующем запуске начнется повторное фиксирование транзакции, и данные будут находиться в состоянии, в котором они должны находиться после завершения транзакции. Замечание Хотя нельзя выполнить откат уже зафиксированной транзакции и тем самым вернуть систему в состояние, в котором она была до начала транзакции, тем не менее, в случае необходимости можно восстановить резервную копию базы данных. Выполнение требования ACID по обработке транзакций распространяется на систему управления базами данных. То есть пользователь не должен предпринимать никаких дополнительных усилий, чтобы соблюсти перечисленные требования. SQL Server 2000, как и многие другие системы, автоматически гарантирует выполнение требований ACID, скрывая их от пользователей. Например, чтобы обеспечить соблюдение требования изолированности транзакций, в SQL Server 2000 используются блокировки (locks). Во время выполнения транзакции сервер устанавливает блокировки на данные, к которым обращается транзакция. Существует множество типов блокировок, каждый из которых используется при выполнении транзакцией определенных действий. Например, если транзакция только читает данные, то можно не запрещать другим транзакциям читать эти же данные. Однако изменение данных при этом запрещается. Когда же транзак28 Зак. S3
848
Часть IV. Разработка и сопровождение баз данных
ция выполняет изменение данных, то эти данные не должны быть прочитаны другими транзакциями. Только после завершения транзакции данные смогут быть снова прочитаны. В каждом из описанных случаев устанавливается разный тип блокировок. Более подробно описание и типы блокировок будут рассмотрены далее в этой главе. Как уже было сказано, соблюдение требований ACID берет на себя SQL Server 2000, обеспечивая разработчика надежным механизмом обработки и хранения данных. На программиста ложится реализация бизнес-правил, описывающих методы взаимодействия и обработки данных. При этом должна быть обеспечена логическая целостность данных. Программист должен разработать верные и быстрые алгоритмы, реализующие бизнес-правила. При этом необходимо решить, сколько транзакций будет использоваться и как много команд будет включено в каждую транзакцию. По возможности следует включать в транзакцию как можно меньше команд, чтобы блокировать ресурсы минимальное количество времени. Это позволяет повысить производительность системы в целом. Использование больших транзакций, включающих множество команд, приведет к длительному блокированию ресурсов. В результате другие транзакции будут ожидать завершения начатой транзакции и разблокирования ресурсов. В свою очередь, эти транзакции также могут блокировать еще какие-нибудь ресурсы. Если блокированные второй транзакцией ресурсы необходимы для завершения первой транзакции, но первая транзакция использует ресурсы, разблокирования которых ожидает вторая транзакция, то возникает тупиковая транзакция, или как ее еще называют, мертвая блокировка (deadlock). Выходом из тупиковых транзакций является принудительная отмена одной из участвующих в мертвой блокировке. После отмены одной из транзакций SQL Server 2000 снимает блокировки с ресурсов, которые она использовала, и остальные транзакции могут завершить свою работу. Неправильное написание хранимых процедур может существенно повысить вероятность возникновения мертвых блокировок. Например, если две транзакции обращаются к одним и тем же ресурсам, но в разном порядке, то можно с большой вероятностью ожидать появления мертвой блокировки в случае одновременного вызовы обеих процедур. Одной из задач разработчика является написание процедур, которые бы не только как можно скорее освобождали блокированные ресурсы, но и не приводили к появлению мертвых блокировок.
Основы блокировок Блокировкой (locks) называется временное ограничение, накладываемое системой на использование тех или иных ресурсов. Как уже было сказано выше, блокировки используются для обеспечения изолированности транзакций друг от друга. Пользователи SQL Server 2000 могут выполнять множество разнообразных операций обработки данных. Простейшим способом обеспечения изолированности транзакций явилось бы запрещение на любое обращение к данным, уже используемым в одной из транзакций. Однако в большинстве случаев не требуется столь жестких мер. Часто достаточно просто запретить изменение данных,
Глава 19. Транзакции и блокировки
849
оставив возможность чтения. Тем не менее, в случае, когда транзакция изменяет данные, необходимо полностью блокировать их. Это гарантирует, что другие транзакции не будут использовать промежуточные данные. В SQL Server 2000 имеется масса различных типов блокировок, обеспечивающих максимально эффективную работу множества пользователей с одними и теми же данными. По возможности система старается применить как можно менее жесткий режим блокирования, обеспечивая тем самым доступ к данным пользователей. Управлением наложением и снятием блокировок, а также разрешением конфликтов в SQL Server 2000 занимается менеджер блокировок (Lock Manager). Механизмы подсистемы блокирования в SQL Server 2000 были существенно переработаны по сравнению с предыдущими версиями. Блокировки могут налагаться как на отдельную строку таблицы, так и на всю таблицу целиком. Помимо этих крайних вариантов, блокировки могут возникать на уровне страницы (page) или группы страниц — экстента (extent). Транзакции и блокировки тесно связаны друг с другом. Блокировки являются механизмом, обеспечивающим изолированность транзакций друг от друга. Без использования блокировок несколько транзакций могут одновременно работать с одними и теми же данными. Ничего страшного нет, если данные только читаются. Проблемы начинаются, когда выполняется изменение данных. Трудно сказать, что произойдет с данными, если их одновременно начнут изменять несколько транзакций. Рассмотрим подробнее проблемы, возникающие в системах управления базами данных, не имеющих механизмов изоляции транзакций. П Проблема последнего изменения (The lost update problem). При одновременной попытке нескольких транзакций изменить одни и те же данные часть их будет неизменно утеряна. Основываясь на первоначальном состоянии данных, несколько транзакций могут начать изменение данных. Однако, т. к. транзакции выполняются независимо друг от друга, то каждая из них не знает об изменениях, которые делают другие транзакции. В процессе сохранения изменений транзакции последовательно сохраняют новые данные. При этом изменения, сделанные ранее закончившимися транзакциями, будут затерты. В итоге останутся изменения, выполненные последней завершившейся транзакцией. При этом транзакции не будут знать о том, что их изменения были потеряны. Если следующие команды транзакций зависят от проделанных изменений, то, вероятно, что конечный результат работы транзакции будет неверным. Возможно, с точки зрения СУБД все будет выглядеть нормально, т. G. не будут нарушены никакие ограничения целостности и правила. Однако логическая целостность данных может быть нарушена. • Проблема "грязного" чтения (The uncommitted dependency problem). Эта проблема возникает, когда транзакция пытается считать данные, обрабатываемые другой транзакцией, и находящиеся в стадии обработки. При этом данные могут нарушать ограничения целостности и правила, тем самым нарушая общую целостность данных. Конечно, к моменту завершения транзакции данные должны соответствовать всем предъвляемым ограничениям
850
Часть IV. Разработка и сопровождение баз данных
целостности и правилам. Тем не менее, другая транзакция может прочитать промежуточные данные и применить их для каких-либо операций. Естественно, результат, полученный при использовании неверных данных, также будет неверен. П Проблема неповторяемого чтения (The inconsistent analysis problem). Эта проблема связана с многократным чтением транзакцией одних и тех же данных. Между операциями чтения некоторая транзакция может изменить данные, так что при следующем сканировании первая транзакция будет оперировать уже другими данными. Предположим, что для сложных статистических вычислений необходимо двукратное сканирование таблицы. При первом проходе вычисляется среднее арифметическое по одной из колонок таблиц и на основе полученного значения получается коэффициент коррекции. При повторном сканировании данные корректируются в зависимости от полученного коэффициента. Однако после первого сканирования данные изменяются какой-то транзакцией, и полученный коэффициент становится бесполезным. Тем не менее, первая транзакция ничего об том не знает и выполняет изменение строк таблицы. В итоге в таблице будет содержаться искаженная информация, которая, в свою очередь, может использоваться для других расчетов. В процессе чего получаются неверные результаты. О Проблема чтения фантомов (The phantom read problem). Эта проблема возникает, когда во время выполнения транзакции в таблицу вставляются новые строки, которые могут быть обработаны транзакцией. Предположим, что транзакция осуществляет несколько раз выборку данных из таблицы на основе одного и того же логического условия. Перед началом очередной выборки в таблицу добавляются (или удаляются) строки, удовлетворяющие логическому условию. В результате при сканировании будет обработан иной набор данных, чем при предыдущих сканированиях. Использование различных наборов строк может привести к непредсказуемым последствиям. Перечисленные проблемы характерны для любых систем управления базами данных, в которых не реализованы механизмы изоляции транзакций друг от друга. Однако в большинстве современных СУБД в той или иной мере механизмы блокирования все же реализованы. Американским национальным институтом стандартов (ANSI, American National Standard Institute) были разработаны правила на реализацию механизмов блокирования. В частности, был разработан специальный стандарт, определяющий четыре различных уровня блокирования. Каждый последующий уровень включает в себя все требования предыдущего уровня и выдвигает дополнительные требования к режиму блокирования. Рассмотрим подробно эти уровни: • Level 0 — No trashing of data (запрещение "загрязнения" данных). На этом уровне решается проблема последнего изменения, т. е. обеспечивается изолированность изменений данных транзакциями. Одни и те же данные в каждый момент времени может изменять только одна транзакция. Если какая-то другая транзакция пытается изменить эти же данные, то она должна ожидать завершения работы первой транзакции. Только после этого разрешается изменять данные.
Глава 19. Транзакции и блокировки
851
П Level 1 — No dirty read (запрещение "грязного" чтения). На этом уровне решается проблема "грязного" чтения. Когда транзакция начинает изменение данных, СУБД должна блокировать ресурсы, чтобы ни одна другая транзакция не смогла прочитать изменяемые данные. До тех пор, пока транзакция не будет зафиксирована или отменена, данные нельзя будет прочитать. Транзакции, подавшие запрос на чтение данных, должны будут ожидать разблокирования ресурсов. • Level 2 — No nonrepeatable read (запрещение неповторяемого чтения). На этом уровне решается проблема неповторяемого чтения. Когда транзакция обращается к каким-то данным, СУБД должна организовывать блокировку таким образом, чтобы ни одна другая транзакция не могла изменить эти данные. При этом также должно обеспечиваться соблюдение требований двух предыдущих уровней. Если транзакция только читает данные, то достаточно запретить только изменение данных. Если же транзакция изменяет данные, то необходимо полностью блокировать ресурсы, запретив и чтение данных. • Level 3 — No phantom (запрещение фантомов). На этом уровне обеспечивается решение проблемы появления фантомов. Если транзакция производит выборку данных по логическому условию, то никакая другая транзакция не должна вставлять в таблицу или удалять из нее строки, удовлетворяющие этому логическому условию. Система управления базами данных, удовлетворяющая последнему уровню блокирования, является самой надежной. В принципе, СУБД может поддерживать только начальные уровни блокирования. В некоторых недорогих СУБД реализован только нулевой или первый уровень блокирования, а в некоторых бесплатных простых СУБД и вовсе отсутствует понятие блокирования и даже транзакций. Microsoft SQL Server 2000 поддерживает все уровни блокирования, предоставляя пользователям мощный и надежный механизм управления данными.
Использование транзакций В SQL Server 2000 все операции обработки данных выполняются как транзакции. По умолчанию каждая команда обрабатывается как отдельная транзакция. Однако при необходимости пользователь может включить в транзакцию множество команд. При использовании различных механизмов доступа к данным (например, ODBC) для определения транзакций необходимо применять иные методы, чем при непосредственной работе с Transact-SQL. Транзакции могут использоваться как на уровне клиента (соединения), так и на уровне сервера. В первом случае момент начала и конца транзакций определяет сам пользователь. Все команды, выполненные со времени начала транзакции и до ее завершения, будут считаться телом одной транзакции. Время выполнения такой транзакции будет зависеть от пользователя. В принципе, транзакция может длиться как доли секунды, так и несколько часов. При использовании транзакций в хранимых процедурах контроль начала транзакции и ее завершения организует сервер.
852
Часть IV. Разработка и сопровождение баз данных
Замечание В обычном режиме пользователь никак не может избежать выполнения его команд вне транзакции. Однако все же имеется возможность отменить использование транзакций и блокировок. Для этого необходимо перевести базу данных в однопользовательский режим (single user mode). В этом режиме автоматически исключается появление различных проблем, связанных с использованием данных множеством пользователей. В SQL Server 2000 имеется несколько различных методов определения транзакций: автоматический, явный и подразумеваемый. Кроме того, транзакции также классифицируются по масштабу воздействия. Если транзакция обращается только к данным одной базы данных, то такая транзакция является стандартной. Если же в одной транзакции производится обращение к данным, расположенным в различных базах данных, то такая транзакция называется распределенной (distributed).
Замечание Строго говоря, в SQL Server 2000 имеется всего два типа определения начала транзакции: автоматический и неявный. Режим явного определения начала транзакции является своего рода надстройкой над этими двумя режимами. Рассмотрим более подробно использование каждого типа транзакций.
Автоматическое определение транзакции При работе в этом режиме пользователь не должен явно указывать начало и конец транзакции. Он вообще может не подозревать, что для выполнения его команд применяются транзакции. SQL Server 2000 автоматически начинает выполнение транзакции для каждой новой команды. В случае успешного завершения команды происходит фиксирование транзакции, если же команда закончилась с ошибкой, то происходит откат транзакции, и все проделанные ею изменения отменяются. Система восстанавливается в состояние, в котором она была до выполнения команды. Таким образом, каждая команда обрабатывается как отдельная транзакция. (
Замечание
^
Если требуется определить транзакцию, содержащую более одной команды, то необходимо использовать явное определение транзакции, которое будет рассмотрено в следующем разделе. По умолчанию SQL Server 2000 работает именно в режиме автоматического начала транзакции (Autocommit transaction). Если SQL Server 2000 находится в ином режиме, то для переключения его в режим автоматического определения транзакции необходимо использовать следующую команду: SET IMPLICIT TRANSACTION OFF
Глава 19. Транзакции и блокировки
853
Явное определение транзакции При использовании явных транзакций (Explicit transaction) пользователь должен четко указывать как начало, так и конец транзакции. С помощью явных транзакций можно объединять в одной транзакции множество команд. Но лишь в случае успешного выполнения всех команд SQL Server 2000 будет осуществлять фиксирование транзакции. Если же хоть одна команда завершится неудачно, то вся транзакция будет отменена. Помимо того, что транзакцией может управлять SQL Server 2000, пользователь также имеет в своем распоряжении команды Transact-SQL, с помощью которых он способен воздействовать на поведение транзакций. Рассмотрим эти команды: •
BEGIN TRAN. Эта команда предназначена для обозначения начала транзакции. В журнале транзакций фиксируется факт начала транзакции и выполняются все необходимые операции. Полный синтаксис этой команды таков: BEGIN TRAN [ SACTION ] [ transaction_name I @tran_name_variable [ WITH MARK [ 'description1 ] ] ]
С помощью аргумента transaction_name определяется имя транзакции, которое будет использоваться для обращения к ней. При выборе имени транзакции необходимо руководствоваться стандартными правилами именования объектов SQL Server 2000. Однако следует учесть, что длина имени транзакции не может превышать 32 символов. Имя транзакции также можно задать с помощью переменной, для чего существует аргумент @tran_name_variabie. Для задания имени транзакции могут ИСПОЛЬЗОВатьсЯ переменные С ТИПОМ данных char, varchar, nchar ИЛИ nvar-
char. В принципе, транзакция может и не иметь имени. В этом случае работа с транзакциями осуществляется по уровням вложенности. Сначала необходимо завершить работу с транзакциями нижнего уровня, а уже затем перейти к транзакциям более высокого уровня. В SQL Server 2000 появилась возможность маркировать транзакции (mark transaction). Эта операция представляет собой выделение специальным образом в журнале транзакции помечаемой транзакции. Такая маркировка применяется при восстановлении резервной копии журнала транзакций. Система резервного копирования SQL Server 2000 позволяет восстанавливать резервную копию журнала транзакций не только до конкретной точки времени, но и до конкретной транзакции. В последнем случае пользователь может указать любую из маркированных транзакций. Чтобы маркировать транзакцию достаточно при ее объявлении указать ключевое слово WITH MARK. Дополнительно посредством параметра 'description' можно указать краткое описание транзакции. Это описание поможет выбрать нужную транзакцию при последующем восстановлении резервной копии журнала транзакций. •
SAVE TRAN. Эта команда служит для создания точки сохранения (save point). Внутри транзакции можно определить одно или более состояний данных, к которым при необходимости можно будет вернуться. Точки сохранения являются мощным механизмом, расширяющим возможности пользователей по
854
Часть IV. Разработка и сопровождение баз данных
управлению транзакциями. Без применения точек сохранения необходимо было бы использовать вложенные транзакции. Однако вложенная транзакция может быть отменена всего один раз, тогда как система может быть возвращена в состояние, описанное с помощью точки сохранения, несколько раз. Для восстановления транзакции в состояние, в котором она была в момент создания точки сохранения, используется команда ROLLBACK TRAN. Рассмотрим полный синтаксис команды SAVE TRAN: SAVE TRANSACTION] {savepoint_name
I @savepoint_variable}
• С помощью аргумента savepoint_name задается имя точки сохранения. В отличие от команды BEGIN TRAN, которая разрешает не указывать имени транзакции, команда SAVE TRAN требует обязательного задания имени точки сохранения. При выборе имени следует руководствоваться стандартными правилами именования объектов. Длина имени может достигать 32 символов. Имя точки сохранения также можно указывать с помощью переменной типа char, varchar, nchar или nvarchar, которая назначается с помощью аргумента @savepoint_variable. П ROLLBACK TRAN. С помощью данной команды выполняется откат транзакции. Данные, которые изменялись в ходе выполнения транзакции, восстанавливаются в состояние, в котором они были до начала транзакции. Кроме того, с помощью этой команды можно выполнить восстановление точки сохранения. SQL Server 2000 контролирует работу транзакций на низком уровне, проверяя лишь соответствие данных наложенным ограничениям целостности и правилам. При нарушении целостности данных на этом уровне, система автоматически выполняет откат транзакции. Пользователь не должен предпринимать никаких дополнительных усилий. Однако иногда бывает необходимо отменить транзакцию, основываясь на соблюдении какого-либо логического условия. В этом случае нужно явно указать, что необходимо выполнить откат транзакции. Полный синтаксис команды следующий: ROLLBACK [WORK] ИЛИ ROLLBACK [TRANSACTION]
[transaction_name | @tran_name_variable
I save-
point_name I @savepoint_variable]] Команда ROLLBACK WORK имеет то же действие, что и команда ROLLBACK TRAN
(т. е. без указания параметров). Назначение и использование аргументов аналогично одноименным аргументам, описанным в предыдущих командах. •
COMMIT TRAN. Эта команда выполняет фиксирование транзакции. Если все команды внутри транзакции выполнены успешно, то SQL Server 2000 автоматически фиксирует изменения данных, осуществления транзакцией. Однако иногда бывает необходимо зафиксировать транзакцию до того, как будут выполнены все команды транзакции. Пользователь может решить, что все необходимые изменения сделаны и нет нужды организовывать дополнительные
Глава 19. Транзакции и блокировки
855
модификации данных. В этом случае он может зафиксировать транзакцию с помощью команды COMMIT TRAN, которая имеет синтаксис: COMMIT [TRAN[SACTION] [transaction_name | @tran_name_variable] ] Если при создании транзакции было указано ее имя, то с помощью аргументов transaction_name И @tran_name_variable МОЖНО ЯВНО указать, какую транзакцию следует зафиксировать. Если команда COMMIT выполняется без указания имени транзакции, то происходит фиксирование последней инициированной транзакции. Если транзакции создаются друг из друга, то происходит образование вложенных транзакций. Пользователь может производить поочередно фиксирование как каждой транзакции в отдельности, так и выполнить сразу фиксирование транзакции высокого уровня. В последнем случае обязательно указание имени транзакции. При использовании команд управления транзакциями следует учитывать, что различные технологии доступа к данным могут автоматически начинать транзакции незаметно от пользователя. При написании конечных приложений необходимо учитывать эти особенности. Например, драйвер ODBC автоматически начинает запуск транзакций. Если пользователь выполнит команду ROLLBACK TRAN ИЛИ COMMIT TRAN, то транзакция будет завершена. Однако драйвер ODBC не воспримет это и в свою очередь также попытается завершить транзакцию. В лучшем случае будет выдано сообщение об ошибке, а в худшем, при работе с вложенными транзакциями, может произойти фиксирование транзакции не того уровня.
Замечание При работе с технологией ODBC пользователь не имеет возможности явно определить начало транзакции, т. к. эта технология поддерживает только неявное и автоматическое определение транзакции. При использовании технологий OLE DB и ADO явное определение транзакции разрешено.
Неявное определение транзакции При работе SQL Server 2000 в режиме неявного или, как его еще называют, подразумевающегося начала транзакций (Implicit transaction) система автоматически начинает новую транзакцию после того, как будет завершена предыдущая транзакция. Пользователь не должен явно указывать начало транзакции с помощью команды BEGIN TRAN, т. к. это за него делает SQL Server 2000. Если же начало транзакции будет указано явно, то станет использоваться режим явного определения транзакций, описанный в предыдущем разделе. При открытии нового соединения также создается новая транзакция. В отличие от режима автоматического определения транзакций, после выполнения очередной команды не происходит автоматического фиксирования транзакции. Пользователь должен явно выполнить фиксирование или откат транзакции с помощью команд COMMIT TRAN ИЛИ ROLLBACK TRAN. В итоге получается транзакция,
состоящая из последовательно запускаемых в соединении команд, своего рода цепь непрерывных изменений данных.
856
Часть IV. Разработка и сопровождение баз данных
Замечание Если пользователь не знает, что SQL Server 2000 работает в режиме неявного определения транзакций и выполняет множество команд, то он может блокировать большое количество ресурсов, тем самым не давая работать другим пользователям. При работе в режиме неявного определения начала транзакции не следует создавать слишком длинные последовательности изменений. Для этого необходимо периодически осуществлять фиксирование или откат транзакции. Кроме того, система автоматически выполняет фиксирование транзакции, если пользователь пытается выполнить одно из следующих действий: •
изменение таблицы (ALTER TABLE);
•
создание в базе данных нового объекта (CREATE);
•
удаление данных из таблицы (DELETE);
П удаление объекта базы данных (DROP); •
выборка данных из курсора (FETCH);
•
предоставление пользователям доступа к объектам базы данных (GRANT);
•
вставка в таблицу новых строк (INSERT);
•
открытие курсора (OPEN);
•
неявное отклонение доступа пользователей к объектам базы данных (REVOKE);
•
выборка данных (SELECT);
П выполнение усечения таблицы (TRUNCATE TABLE); •
изменение данных в таблице (UPDATE).
Замечание При работе в режиме явного определения транзакции указанные выше команды не приводят к фиксированию транзакции. Все описанные действия могут быть как зафиксированы, так и откачены. Например, можно создать в транзакции таблицу, но выполнить откат. При этом таблица будет автоматически удалена. Для переключения SQL Server 2000 в режим неявного начала транзакции существует команда: SET IMPLICIT_TRANSACTION ON
Команды, запрещенные в транзакциях В SQL Server 2000 имеется набор команд, использование которых внутри транзакций запрещено. Такие команды затрагивают важные аспекты работы сервера или баз данных и не могут быть отменены или зафиксированы как часть транзакции. Эти команды должны выполняться отдельно от других команд. Например, внутри транзакции нельзя восстановить резервную копию базы данных, а позже выполнить откат транзакции и тем самым восстановить базу данных в
Глава 19. Транзакции и блокировки
857
первоначальное состояние. В SQL Server 2000 не реализован откат подобных операций.
Замечание Для отката сложных операций, таких как модификация структуры объектов базы данных, изменение параметров базы данных или сервера, можно использовать архивирование. Перед выполнением операции создается резервная копия базы данных, в которой производятся изменения. Если необходимо осуществить откат операции, то достаточно просто восстановить базу данных из архива. При изменении параметров конфигурации сервера необходимо выполнять архивирование системной базы данных Master. Рассмотрим, какие команды нельзя использовать в транзакциях: О ALTER DATABASE — изменение физических характеристик базы данных; •
BACKUP LOG — создание резервной копии журнала транзакций;
•
CREATE DATABASE — создание новой базы данных;
•
DISK INIT — выполнение инициализации диска (используется только для обеспечения обратной совместимости с предыдущими версиями);
•
DROP DATABASE — уничтожение базы данных;
П DUMP TRANSACTION — подготовка журнала транзакций к выполнению операций резервного копирования (используется только для обеспечения обратной совместимости с предыдущими версиями); •
LOAD DATABASE — восстановление базы данных из резервной копии. Эта команда унаследована от предыдущих версий SQL Server. В SQL Server 2000 используется команда RESTORE, поведение которой идентично команде LOAD DATABASE. В следующих версиях SQL Server команда LOAD DATABASE, ПО всей видимости, поддерживаться не будет;
•
LOAD TRANSACTION — восстановление журнала транзакций из резервной копии. К этой команде относится все, что сказано выше при описании команды LOAD DATABASE;
П RECONFIGURE — применение изменений конфигурации сервера, выполненных с помощью хранимой процедуры s p c o n f i g u r e и не требующих перезапуска служб SQL Server 2000; •
RESTORE DATABASE — восстановление базы данных из резервной копии;
П RESTORE LOG — восстановление журнала транзакций из резервной копии; •
UPDATE STATISTICS — обновление статистики.
(~
Замечание
Помимо указанных выше команд в транзакциях также не разрешено использование хранимых процедур sp_dboption и sp_conf igure, а также любых других хранимых процедур, выполняющих модификации в системной базе данных Master. Такие хранимые процедуры должны выполняться отдельно.
858
Часть IV. Разработка и сопровождение баз данных
Распределенные транзакции При работе с информацией, находящейся в одной базе данных, SQL Server 2000 использует локальные транзакции, которые являются стандартными. Локальные транзакции позволяют блокировать любые таблицы и индексы, находящиеся в пределах этой базы данных. Большая часть работы пользователей выполняется именно с применением локальных транзакций. Однако иногда пользователи выполняют запросы, которые обращаются к информации различных баз данных, возможно расположенных на разных серверах сети. В этом случае SQL Server 2000 автоматически использует распределенные запросы. Распределенные запросы (distributed query) позволяют в одном запросе обращаться к различным базам данных. Как уже говорилось, все операции в SQL Server 2000 выполняются с помощью транзакций. Не являются исключением и распределенные запросы. Однако их работа связана с определенными трудностями. В частности, стандартная транзакция SQL Server 2000 может обращаться только к данным базы данных, в контексте которой она создана. Так как распределенные запросы обращаются к различным базам данных, то необходим какой-то механизм, позволяющий работать в теле одной транзакции с различными базами данных. Таким механизмом являются распределенные транзакции. Распределенные транзакции (distributed transaction) представляют собой совокупность двух или более локальных транзакций, выполняемых одновременно в различных базах данных. Можно сказать, что распределенные транзакции являются своего рода надстройкой над локальными транзакциями. Однако каждая из локальных транзакций выполняется самостоятельно и не подозревает о существовании других транзакций и о том, что она является частью распределенной транзакции. Необходимо каким-то образом синхронизировать все действия, выполняемые в каждой из локальных транзакций, и производить централизованную обработку всех данных, полученных из локальных транзакций. В качестве такого центрального менеджера в SQL Server 2000 используется компонент MSDTC. Координатор распределенных транзакций (MSDTC, Microsoft Distributed Transaction Coordinator) контролирует всю работу по инициализации, откату и фиксирование локальных транзакций. Выполнение распределенных транзакций является довольно сложным процессом, работу которого обеспечивает множество различных модулей. Сам координатор распределенных транзакций реализован в виде службы операционной системы и может запускаться отдельно от SQL Server 2000. Возможности MSDTC могут использоваться не только SQL Server 2000, но и другими приложениями, в том числе и написанными пользователями. Например, с помощью языка программирования Microsoft Visual C++ 6.0 можно легко создавать приложения, применяющие возможности MSDTC. В терминологии распределенных транзакций источник данных, к которому происходит обращение, называется менеджером ресурсов (Resource Manager). To есть распределенная транзакция обращается непосредственно не к данным, а лишь передает запрос на выборку этих данных менеджеру ресурсов. Последний, в свою очередь, должен обеспечивать возможность создания, фиксирования и
Глава 19. Транзакции и блокировки
859
отката транзакций, а также позволять управлять ходом работы полученного запроса с целью синхронизации действий множества менеджеров ресурсов, задействованных в распределенной транзакции. Эти требования выполняются с помощью специального модуля менеджера ресурсов, называемого обработчиком распределенных запросов. Обработчик распределенных запросов (Distributed Transaction Processing) принимает от MSDTC запросы на запуск локальных транзакций, которые являются частью распределенный транзакции. При этом всеми действиями, осуществляемыми в локальной транзакции, управляет MSDTC. Он принимает от обработчиков распределенных транзакций результат выполнения локальных транзакций. На основе полученной информации MSDTC принимает решение о том, какие команды должны быть выполнены следующими в каждой локальной транзакции. Возможно, что для исполнения локальной транзакции будут применены данные, полученные при выполнении других локальных транзакций. Таким образом, распределенная транзакция может обращаться к любым ресурсам, которые управляются с помощью менеджеров ресурсов, соответствующих описанным требованиям. То есть область доступа распределенной транзакции не ограничивается только SQL Server 2000. При необходимости практически для любой СУБД может быть написан менеджер ресурсов, позволяющий обращаться к его данным из распределенных транзакций. Это раскрывает широкие возможности для пользователей SQL Server 2000.
Замечание Чтобы менеджер ресурсов мог быть использован для распределенных транзакций SQL Server 2000, его обработчик распределенных транзакций должен соответствовать спецификации X/OPEN ХА.
Завершение распределенных транзакций Как и при работе с обычными транзакциями, работа с распределенными транзакциями состоит из двух фаз: начало транзакции и ее завершение. Начало распределенной транзакции не вызывает особых трудностей — как только будут инициированы все локальные транзакции, MSDTC может начать выполнение распределенной транзакции. Завершение транзакции возможно двумя способами — откат и фиксирование. С откатом транзакции также проблем нет. Каждая из локальных транзакций получает команду на откат транзакции и рано или поздно она будет откачена. Сложности начинаются, если необходимо выполнить фиксирование распределенной транзакции и сохранить все изменения, проделанные в каждой из локальных транзакций. При использовании стандартных механизмов фиксирования транзакций возможна ситуация, когда часть локальных транзакций окажется принятой, а фиксирование другой части по каким-либо причинам будет невозможно. В этом случае необходимо будет выполнить откат всех локальных транзакций, исполь-
860
Часть IV. Разработка и сопровождение баз данных
зованных для выполнения распределенной транзакции. Однако требование устойчивости (Durability) ACID говорит о том, что система не может вернуться в состояние, в котором она была до начала транзакции, после того, как последняя была зафиксирована. То есть требование атомарности (Atomicity) ACID будет нарушено, что недопустимо. Поэтому необходим какой-то механизм, позволяющий синхронизировать фиксирование всех локальных транзакций. В качестве такого механизма выступает двухфазный протокол фиксирования транзакции. Двухфазный протокол фиксирования (2РС, Two Phase Commit protocol) транзакции специально предназначен для фиксирования распределенных транзакций, который разбивает операцию фиксирования на две фазы — фазу подготовки и собственно фазу фиксирования. Рассмотрим более подробно каждую из фаз: П Фаза подготовки (Prepare Phase). На этом этапе каждому из локальных менеджеров ресурсов посылается сообщение о подготовке к фиксированию транзакции. Менеджеры ресурсов должны выполнить проверку ограничений целостности и соответствие данных наложенным правилам, т. е. гарантировать целостность данных. Кроме того, на этом этапе выполняется физическая запись данных из буферов на диск и другие операции. Однако в журнале транзакций не отмечается, что транзакция завершена, и блокировки не снимаются. • Фаза фиксирования (Commit Phase). Информация об успешном (или неуспешном) выполнении фазы подготовки от локальных менеджеров ресурсов поступает координатору распределенных транзакций, который переходит к фазе фиксирования после прохождения фазы подготовки. Если все локальные менеджеры ресурсов успешно выполнили фазу подготовки, то MSDTC посылает им команду с требованием выполнить окончательное фиксирование транзакции. После это считается, что распределенная транзакция успешно зафиксирована. Может получиться ситуация, когда один или более локальных менеджеров ресурсов по каким-то причинам не смогут зафиксировать локальную транзакцию. В этом случае MSDTC посылает всем менеджерам ресурсов, участвующим в распределенной транзакции, команду с требованием отката локальных транзакций. Таким образом, выполняется откат распределенной транзакции. Пользователь при этом получает соответствующее сообщение об ошибке.
Создание распределенных транзакций Для конечного пользователя работа с распределенной транзакцией практически ничем не отличается от работы с обычными локальными транзакциями. Пользователю не нужно предпринимать никаких дополнительных действий по управлению работой локальных менеджеров ресурсов. Все необходимые действия выполняет MSDTC. Распределенная транзакция может быть начата несколькими способами. • Технологии доступа к данным ODBC и OLE DB имеют специальные функции для начала распределенной транзакции. С помощью этих функций пользователи могут инициировать выполнение распределенной транзакции.
Глава 19. Транзакции и блокировки
861
•
Локальная транзакция может быть автоматически расширена до распределенной транзакции, если в ней выполняются запросы, обращающиеся к таблицам иных баз данных, чем база данных, в контексте которой была начата локальная транзакция. Действия SQL Server 2000 по созданию распределенной транзакции незаметны для пользователя.
•
При выполнении удаленных хранимых процедур из локальных транзакций SQL Server 2000 будет автоматически создавать распределенную транзакцию, если параметр REMOTE_PROC_TRANSACTION установлен в ON.
•
Пользователь может явно инициировать выполнение распределенной транзакции с помощью команды BEGIN DISTRIBUTED TRANSACTION, имеющей следующий синтаксис: BEGIN DISTRIBUTED TRAN[SACTION] [ t r a n s a c t i o n name | @tran name v a r i a b l e ] Замечание Откат или фиксирование распределенной транзакции, инициированной с помощью команды м о щ ь ю
B E G I N
D I S T R I B U T E D
команд R O L L B A C K
T R A N
T R A N S A C T I O N , и C O M M I T
T R A N ,
выполняется, приведенных
соответственно, ранее в этой
с п о -
главе.
Одна из ситуаций, когда происходит инициирование распределенной транзакции — это выполнение удаленных хранимых процедур из локальных транзакций. Однако, чтобы это стало возможным, необходимо установить параметр REMOTE_PROC_TRANSACTION. Значение этого параметра можно определять на уровне сервера, как значение по умолчанию для всех вновь создаваемых соединений, или на уровне конкретного соединения. Для управления значением на уровне сервера предназначена хранимая процедура: EXEC sp_configure 'remote proc t r a n s ' , {0 | 1} Если пользователя не устраивают значения по умолчанию, или необходимо гарантировать, что приложение будет всегда работать с одними и теми же установками, то нужно указать параметр REMOTE_PROC_TRANSACTION на уровне соединения. Для этого используется следующая команда: SET REMOTE PROC TRANS, {ON | OFF}
Замечание Настройки конфигурации, определенные на уровне базы данных, перекрывают значения, установленные на уровне сервера. В то же время настройки, определенные на уровне соединения, перекрывают как настройки на уровне сервера, так и настройки на уровне базы данных.
Вложенные транзакции В предыдущих разделах предполагалось, что транзакция содержит только наборы команд Transact-SQL и вызовы хранимых процедур. Однако в транзакциях могут содержаться и другие транзакции. Транзакции, которые создаются в ходе
862
Часть IV. Разработка и сопровождение баз данных
работы некоторой транзакции, называются вложенными транзакциями (nested transaction). Использование вложенных транзакций повышает наглядность кода и позволяет более эффективно реализовать логику обработки данных. В принципе, применение вложенных транзакций можно заменить применением точек сохранения (save point). Однако их использование не всегда удобно и связано с определенными трудностями. Эффективность от точек сохранения существенно падает с увеличением уровня вложенности блоков обработки данных. При использовании вложенных транзакций пользователь может легко и естественно реализовывать алгоритмы обработки данных с большим уровнем вложенности. Кроме того, в некоторых случаях применение точек сохранения невозможно. Лучшим примером является работа с хранимыми процедурами. При написании хранимой процедуры необходимо обеспечить ее универсальность, обеспечив возможность ее нормального выполнения как из тела транзакции, так и при непосредственном вызове. Независимо от места вызова хранимой процедуры, система должна обеспечить выполнение требований ACID применительно к этой хранимой процедуре. То есть необходимо гарантировать, что хранимая процедура либо выполнит все действия, либо не выполнит их вообще. Не должно быть такого, что часть действий будет успешно завершена, а другая, из-за ошибки, — нет.
Замечание SQL Server 2000 не обеспечивает автоматического соблюдения требований ACID при выполнении хранимой процедуры. То есть если одна из команд хранимой процедуры закончится неудачно, то это не приведет к откату всей хранимой процедуры и восстановлению системы в первоначальное состояние. Реализация требований ACID полностью ложится на разработчика. При использовании внутри хранимой процедуры транзакций можно легко и естественно обеспечить соблюдение требований ACID. Достаточно выполнить команду BEGIN TRAN первой в хранимой процедуре, а последней командой сделать COMMIT TRAN. Однако без поддержки SQL Server 2000 вложенных транзакций обеспечение требований ACID для хранимых процедур представляло бы определенные проблемы. (
Замечание
j
Вложенность транзакций в SQL Server 2000 ограничена. Допускается создание вложенной транзакции не более чем 32-го уровня. Создание вложенной транзакции производится автоматически, если пользователь выполняет команду BEGIN TRAN ДО ТОГО, как будет завершена предыдущая транзакция. Не трудно прийти к выводу, что создание вложенной транзакции возможно только при использовании режима явного определения транзакции. В режиме автоматического начала транзакции каждая команда выполняется как отдельная транзакция, которая завершается сразу же после выполнения коман-
Глава 19. Транзакции и блокировки
863
ды. Таким образом, образование вложенной транзакции просто невозможно. При работе в режиме неявного определения транзакции пользователь использует только команды ROLLBACK TRAN И COMMIT TRAN, тогда как команда BEGIN TRAN выполняется системой автоматически. Замечание Строго говоря, как только пользователь явно укажет начало транзакции с помощью команды B E G I N T R A N , то система переходит в режим явного определения начала
транзакции. Таким образом, создание вложенных транзакций не представляет никаких проблем. Отдельно необходимо рассмотреть поведение вложенных транзакций в случае отката или фиксирования транзакций нижнего уровня. При использовании вложенных процедур каждая процедура нижнего уровня рассматривается как единственная команда, которая может завершиться либо удачно, либо нет. При удачном завершении транзакции нижнего уровня выполняется следующая команда текущей транзакции. Если же одна из вложенных транзакций любого уровня закончится неудачно (будет откачена), то это приведет к откату всей вложенной транзакции. При этом, согласно требованиям ACID, происходит откат всех транзакций, которые были инициированы во время выполнения вложенной транзакции, в том числе и успешно завершенных. (
Замечание
^
Технология вложенных транзакций позволяет нарушать требование устойчивости (Durability) ACID. При фиксировании транзакции нижнего уровня должна обеспечиваться невозможность восстановления системы в первоначальное состояние. Тем не менее, это условие действует только в пределах вложенной транзакции. То есть, внутри вложенной транзакции нельзя восстановить данные в первоначальное состояние. Однако, можно выполнить откат всей вложенной транзакции и тем самым откатить изменения, сделанные транзакцией нижнего уровня. Откат всех изменений, выполненных внутри вложенной транзакции, производится в соответствии с требованиями ACID. При фиксировании транзакции следует учитывать, что команда COMMIT TRAN всегда работает с самой последней созданной транзакцией, т. е. с транзакцией самого нижнего уровня. Если при вызове этой команды явно указывается имя транзакции, то оно игнорируется, и все равно выполняется фиксирование последней начатой транзакции. Для фиксирования вложенной транзакции необходимо последовательно зафиксировать все транзакции нижних уровней. Рассмотрим поведение SQL Server 2000 при откате транзакций нижних уровней. При использовании команды ROLLBACK TRAN без указания имени транзакции или применении команды ROLLBACK WORK происходит последовательный откат всех транзакций нижних уровней вплоть до отката всей вложенной транзакции. Допускается указание имени транзакции при выполнении команды ROLLBACK TRAN. Однако разрешается указание имени транзакции самого высокого уровня. Использование имен вложенных транзакций недопустимо и вызовет ошибку.
864
Часть IV. Разработка и сопровождение баз данных
При указании имени самой верхней транзакции также происходит откат всей вложенной транзакции. То есть любой вызов команды ROLLBACK TRAN приведет к откату всей вложенной транзакции. В SQL Server 2000 имеется функция @@TRANCOUNT, С ПОМОЩЬЮ которой можно определить текущий уровень вложенности транзакций. До начала транзакции уровень вложенности равен 0. При каждом выполнении команды BEGIN TRAN происходит последовательное увеличение на единицу значения, возвращаемого функцией @@TRANCOUNT. Выполнение команды ROLLBACK TRAN имеет обратный эффект — после каждого завершения этой команды происходит уменьшение возвращаемого значения на соответствующее число. Команда COMMIT TRAN уменьшает значение функции @@TRANCOUNT строго на единицу. Рассмотрим использование функции @@TRANCOUNT: BEGIN TRAN trl PRINT 'Текущий уровень вложенности: BEGIN TRAN tr2 PRINT 'Текущий уровень вложенности: BEGIN TRAN tr3 PRINT 'Текущий уровень вложенности: BEGIN TRAN tr4 PRINT 'Текущий уровень вложенности: BEGIN TRANSACTION tr5 SAVE TRANSACTION aaa PRINT 'Текущий уровень вложенности: ROLLBACK TRANSACTION aaa PRINT 'Текущий уровень вложенности: COMMIT TRAN tr5 PRINT 'Текущий уровень вложенности: COMMIT TRAN tr4 PRINT 'Текущий уровень вложенности: ROLLBACK TRAN PRINT 'Текущий уровень вложенности:
'+CAST(@@TRANCOUNT AS char (2)) '+CAST(@@TRANCOUNT AS char(2)) '+CAST(@@TRANCOUNT AS char(2)) '+CAST(@@TRANCOUNT AS char(2))
'+CAST(@@TRANCOUNT AS char(2)) '+CAST(@@TRANCOUNT AS char(2)) '+CAST(@@TRANCOUNT AS char(2)) '+CAST(@@TRANCOUNT AS char(2)} '+CAST(@@TRANCOUNT AS char(2))
В результате выполнения указанного кода будет получен следующий результат: Текущий Текущий Текущий Текущий Текущий Текущий Текущий Текущий Текущий
уровень уровень уровень уровень уровень уровень уровень уровень уровень
вложенности: вложенности: вложенности: вложенности: вложенности: вложенности: вложенности: вложенности: вложенности:
1 2 3 4 5 5 4 3 О
Использование блокировок Как уже говорилось ранее в этой главе, блокировки являются важным механизмом, с помощью которого обеспечивается реализация требований ACID. Использование того или иного уровня блокирования позволяет управлять поведе-
Глава 19. Транзакции и блокировки
865
нием сервера по обработке блокировок. Основное назначение блокировок — обеспечение нормальной работы множества пользователей с одними и теми же данными. Система блокирования должна обеспечить пользователям устойчивую среду для выполнения модификации данных. Действия системы, которые обеспечивают параллельную работу множества пользователей, называются управлением конкуренцией или управлением параллелизмом (Concurrency Control). Операции установки, снятия и управления блокировками требуют определенного количества системных ресурсов, таких как процессорное время и оперативная память. При ограниченных ресурсах можно лимитировать количество блокировок, которое разрешено устанавливать в системе. Для этого можно использовать следующую системную хранимую процедуру: sp_configure 'locks', num_locks
Аргумент numiocks определяет максимальное количество блокировок, которое может быть установлено на сервере для всех баз данных. По умолчанию установлено значение 0, что соответствует динамическому управлению максимальным количеством блокировок. Значение numiocks может колебаться в пределах от 5000 до 2 147 483 647. Замечание На одну блокировку отводится 96 байт оперативной памяти. Первоначально для системы блокирования отводится около 2% памяти, используемой для работы SQL Server 2000. Количество памяти, необходимой для хранения блокировок, может динамически изменяться. Максимальное количество памяти, которое может быть выделено для хранения информации о блокировках, составляет 40%. Для снижения общих затрат сервера на поддержание блокировок могут быть использованы различные методы управления блокированием ресурсов. Теория управления конкуренцией (Concurrency control theory) предусматривает два метода обеспечения работы пользователей: •
Оптимистическая конкуренция (Optimistic Concurrency Control). При работе в этом режиме при выполнении операций чтения из транзакции не происходит блокирования используемых ресурсов. При выполнении операции повторного чтения из той же транзакции система проверяет, не были ли изменены данные со времени последнего чтения. Если это произошло, то транзакция откатывается и ее необходимо начать заново. То есть происходит нарушение условия изолированности (isolation) набора требований ACID. Наградой за снижение изолированности транзакций является повышение производительности как выполнения отдельной транзакции, так и работы системы в целом. Использование этого режима поведения системы блокирования оправдано в базах данных, мало подверженных изменениям, и в которых невелика вероятность того, что произойдет откат транзакции из-за изменения данных. Если цена отката транзакции и повторного ее выполнения значительно ниже, чем цена на установку блокировок при чтении данных, то рекомендуется использовать оптимистическую конкуренцию.
866
Часть IV. Разработка и сопровождение баз данных
П Пессимистическая конкуренция (Pessimistic Concurrency Control). В этом режиме система блокирования строго следует требованиям ACID. При любом обращении к ресурсам происходит их блокирование. Таким образом, до тех пор, пока транзакция не окажется завершенной, ни одна другая транзакция не сможет блокировать те же ресурсы, и тем самым создать конфликт с уже существующей блокировкой. В случае конфликта блокировок наложение второй транзакции откладывается до снятия ранее запущенной транзакции. Таким образом обеспечивается полная изолированность транзакций. Пессимистический контроль конкуренции используется в базах данных, подверженных частым изменениям данных. В таких базах данных откат транзакции происходит слишком часто, и общая стоимость откатов и повторного выполнения транзакций будет значительно превышать стоимость наложения блокировок при чтении данных. В SQL Server 2000 поддерживаются оба режима контроля конкуренции. Система сама принимает решение, какой режим контроля лучше всего использовать в конкретном случае. Однако пользователь может сам установить конкретный режим контроля как на уровне соединения, так и на уровне конкретного запроса. Кроме того, для отдельного курсора также может быть создан персональный режим контроля конкуренции. Замечание Интерфейсы доступа к данным (OLE DB, ADO, ODBC и т. д.) также позволяют устанавливать любой режим контроля конкуренции. Хотя блокировки являются важной и неотъемлемой частью работы сервера, без которых не обходится выполнение ни одного запроса к данным, тем не менее, пользователь может не предпринимать никаких действий по управлению ими. SQL Server 2000 спроектирован таким образом, что система сама выбирает наиболее оптимальный режим блокирования, который обеспечивает не только выполнение требований ACID, но и по возможности позволяет другим транзакциям работать с данными. Тем не менее, в распоряжении пользователя имеются средства, позволяющие при выполнении запроса использовать конкретный режим блокирования. Установкой, снятием и разрешением конфликтов блокировок в SQL Server 2000 занимается специальный модуль — менеджер блокировок (Lock Manager). Когда пользователь хочет выполнить команду, то менеджер транзакций сначала пытается установить блокировку на ресурсы, к которым обращается команда. Менеджер блокировок принимает запрос на установку блокировки и проверяет, не блокированы ли уже запрашиваемые ресурсы. Если ресурсы блокированы транзакцией, отличной от той, которая подала заявку на установление блокировки, и тип устанавливаемой блокировки конфликтует с типом уже наложенной блокировки, то выполнение блокирования откладывается до того времени, когда требуемые ресурсы будут разблокированы. Осуществление транзакции при этом также приостанавливается. Как только требуемый ресурс будет разблокирован, менеджер блокировок обрабатывает запрос на блокирование ресурса и отправ-
Глава 19. Транзакции и блокировки
867
ляет менеджеру транзакций сообщение об успешном наложении блокировки. После этого менеджер транзакций может выполнить команду пользователя. Менеджер транзакций может очень долго ожидать удовлетворения его запроса на установку блокировки. Выполнение команд пользователя откладывается до тех пор, пока запрос не будет удовлетворен. SQL Server 2000 разрешает пользователю управлять максимальным периодом ожидания установки блокировки. По умолчанию максимальный период ожидания не определен и транзакция может бесконечно долго ожидать установки блокировки. Однако в некоторых случаях все же бывает необходимо определить длительность ожидания установки блокировки. По истечении интервала ожидания менеджер блокировок посылает менеджеру транзакций сообщение, уведомляющее об окончании периода ожидания. Со своей стороны, менеджер транзакций прерывает выполнение команды пользователя и посылает ему соответствующее сообщение об ошибке. Для установки максимального периода ожидания блокировки предназначена команда: SET LOCKJTIMEOUT timeout_period
Аргумент timeout_period задает время в миллисекундах, которое менеджер блокировок будет ожидать разблокирования требуемого ресурса. Если значение этого аргумента равно 0, то запрос на установление блокировки будет сразу же прерываться, если обнаружится, что требуемый ресурс уже блокирован. Бесконечному периоду ожидания соответствует значение —1, которое установлено по умолчанию.
Замечание К о м а н д а S E T L O C K J T I M E O U T д е й с т в у е т т о л ь к о на у р о в н е конкретного с о е д и н е н и я .
Если требуется выполнить изменение периода ожидания для нескольких соединений, то необходимо запускать эту команду для каждого соединения. Кроме того, после закрытия соединения нужно заново выполнять команду при повторном установлении соединения.
^Замечание Текущее значение периода ожидания может быть получено с помощью функции @@LOCK TIMEOUT.
Уровни блокирования Операции работы с данными, выполняемые пользователями в базе данных, могут весьма отличаться по масштабам. Отдельная транзакция может работать как с несколькими строками одной таблицы, так и со всеми строками каждой таблицы базы данных. Чтобы обеспечить одновременную работу с данными множества пользователей, во время выполнения транзакции необходимо блокировать как можно меньше ресурсов. Менеджер блокировок SQL Server 2000 поддерживает самые различные уровни блокировок: начиная с отдельной строки таблицы и заканчивая блокированием
Часть IV. Разработка и сопровождение баз данных
868
целой базы данных. Диапазон ресурсов, которые охватываются в блокировке, определяет уровень блокирования. В SQL Server 2000 имеются следующие уровни блокирования: •
RID — блокировка отдельной строки таблицы.
П Key — блокировка диапазона индекса. Используется в транзакциях для решения проблемы чтения фантомов (The phantom read problem). Блокировка налагается не только на сами данные, но и на вставку или удаление строк, удовлетворяющих логическому условию, используемому в операциях обработки данных. П Page — блокировка отдельной страницы данных. Страница представляет собой минимальную единицу хранения данных в файле базы данных. Страница может содержать одну и более строк. П Extent — блокировка группы страниц (экстента). Для удобства управления страницы объединяются в группы, называемые экстентами. Каждый экстент содержит 8 страниц. П Table — блокировка всех данных таблицы, включая связанные с ними индексы. •
DB — блокировка всех таблиц базы данных.
Замечание В SQL Server 6.x минимальным уровнем блокирования являлась страница, которая имела размер 2 Кбайта. В SQL Server 2000 минимальным уровнем блокирования является строка. При выполнении запроса менеджер блокировок принимает решение, какой уровень детализации блокировки должен использоваться. При этом он обязан выбрать "золотую середину" между скоростью исполнения запроса и обеспечения работы множества пользователей. Чем меньше детализация блокировки, тем меньше затрат на установку, поддержку и снятие блокировок и тем быстрее будет выполнен запрос. Но при этом не всегда блокируются только те ресурсы, к которым обращается транзакция. Другие пользователи должны будут ожидать завершения выполнения запроса и разблокирования ресурсов. Конечно, в идеале нужно было бы блокировать только конкретные строки, к которым обращается транзакция. Если же использовать максимальную детализацию и устанавливать блокировки на уровне отдельных строк таблиц, то это обеспечит максимальный параллелизм, т. е. нормальную работу множества пользователей. Транзакции пользователей при этом будут тратить минимальное время на ожидание разблокирования ресурсов. Однако следует учитывать затраты системы на установку, снятие и поддержание блокировок. Поддержание каждой блокировки требует определенного объема системных ресурсов. Поэтому иногда необходимо жертвовать степенью детализации блокирования для увеличения производительности работы системы в целом. Со временем детальность блокирования ресурсов может меняться. При выполнении больших транзакций, включающих множество команд, транзакция может
Глава 19. Транзакции и блокировки
869
постепенно расширять круг блокированных ресурсов. Менеджер блокировок может принять решение об уменьшении уровня детализации блокирования для повышения скорости исполнения запроса.
Замечание В одном и том же запросе могут устанавливаться различные степени детализации для самих данных и для индексов. Например, для данных может быть использована блокировка на уровне строк, тогда как для индексов может использоваться блокировка на уровне страниц. Предположим, что транзакция состоит из 20 команд, каждая из которых обращается к различным строкам таблицы. При выполнении первой команды менеджер блокировок обнаруживает, что строки находятся в разных экстентах, и принимает решение об использовании блокировок на уровне строк. Перед выполнением одной из следующих команд менеджер блокировок обнаруживает, что на одной из страниц уже блокировано около 70% строк, и необходимо блокировать еще несколько строк. Он принимает решение о замене множества блокировок отдельных строк на одну блокировку страницы. С течением времени детальность блокирования может быть уменьшена еще для нескольких страниц. Потом блокировки отдельных страниц могут быть заменены одной блокировкой экстента. При дальнейшем уменьшении детализации возможно блокирование всей таблицы.
(
Замечание
J
Процесс уменьшения уровня блокирования называется эскалацией блокировок (lock escalation). Момент определения необходимости эскалации блокировок определяется динамически и не требует конфигурирования.
Уровни изолированности транзакций При рассмотрении теории блокировок в начале этой главы были описаны четыре проблемы, которые возникают в многопользовательских системах. Для решения этих проблем институтом ANSI был разработан стандарт на уровни блокирования, которые также были описаны ранее в этой главе. В SQL Server 2000 реализованы все четыре уровня блокирования, определяемых стандартом ANSI SQL-92. Уровень блокирования определяет степень изолированности транзакций друг от друга. Чем выше степень изолированности, тем в большей мере обеспечивается надежность работы системы и ее соответствие требованию изолированности (isolation) набора требований ACID. Однако платой за это является повышение требований к объему системных ресурсов, необходимых для выполнения транзакций. Для управления уровнями изолированности в SQL Server 2000 существует команда: SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE }
870
Часть IV. Разработка и сопровождение баз данных
Рассмотрим поведение SQL Server 2000 при установке того или иного уровня изолированности: П
READ UNCOMMITED
Этот уровень обеспечивает решение проблемы последнего изменения (The lost update problem) и соответствует уровню блокирования 0 стандарта ANSI SQL-92. Это минимальный уровень изоляции SQL Server 2000. При его использовании накладывается только блокировка, запрещающая изменение одних и тех же данных разными транзакциями. Однако данные, измененные транзакцией, могут быть прочитаны другой транзакцией. То есть не решается проблема грязного (dirty) и неповторяемого (unrepeatable) чтения. Кроме того, в наборе данных, используемых транзакцией, возможно удаление и появление новых строк — проблема чтения фантомов. П
READ COMMITTED
Помимо решения ^проблемы последнего изменения на этом уровне решается проблема грязного чтения (The uncommitted dependency problem), что соответствует уровню блокирования 1 стандарта ANSI SQL-92. На изменяемые данные налагается блокировка, запрещающая не только модификацию, но и чтение данных другой транзакцией. Тем не менее, если транзакция не изменяет, а только читает данные, может сложиться ситуация, когда при повторном чтении она будет работать с иными данными, чем при предыдущем чтении. Это так называемая проблема неповторяемого чтения. Также не решается и проблема чтения фантомов. Уровень изоляции READ COMMITTED используется в SQL Server 2000 по умолчанию. •
REPEATABLE READ
При использовании этого уровня устанавливается режим изоляции, соответствующий уровню блокирования 2 стандарта ANSI SQL-92. Это обеспечивает решение проблемы неповторяемого чтения (The inconsistent analysis problem). To есть гарантируется, что с момента первого обращения транзакции к данным и до самого ее завершения никакая другая транзакция не сможет изменить данные, к которым обращалась первая транзакция. •
SERIALIZABLE
Это высший уровень изоляции, обеспечивающий полную независимость транзакций друг от друга. На этом уровне решается проблема чтения фантомов (The phantom read problem). Отличительной особенностью реализации данного уровня изоляции является то, что на нем используется блокировка индекса. Это гарантирует, что в таблицу не могут быть вставлены или удалены из нее строки, которые соответствуют логическому условию, используемому для выборки данных.
Управление блокировками на уровне команд После открытия нового соединения устанавливается уровень изоляции READ COMMITED. При необходимости пользователь может задать любой другой уровень. Кроме того, можно управлять уровнем изоляции не только на уровне соедине-
Глава 19. Транзакции и блокировки
871
ния, но и на уровне отдельного запроса. Для этого в SQL Server 2000 существуют специальные ключевые слова — хинты (hint), которые указываются при выполнении запроса. В предыдущих версиях SQL Server применение хинтов допускалось только при выборке данных с помощью команды SELECT. В SQL Server 2000 разрешается использовать хинты также и для команд UPDATE, INSERT И DELETE.
При выполнении команд работы с данными хинты указываются с помощью ключевого слова WITH, после которого в круглых скобках пишется название хинта. Например, приведенная ниже команда производит выборку из таблицы t i t l e s всех названий книг, цена которых выше 15 условных единиц. При этом устанавливается блокировка на уровне строк. SELECT title FROM titles WITH (ROWLOCK) WHERE price>15
Рассмотрим хинты, которые используются в SQL Server 2000 для управления уровнем блокирования на уровне запроса: П ROWLOCK. Блокировка устанавливается на уровне конкретной строки таблицы. Рекомендуется указывать в случаях, когда необходимо блокировать всего несколько строк. •
PAGLOCK. При использовании этого хинта взамен установки блокировки на уровне таблицы будет осуществляться блокировка на уровне страницы.
•
TABLOCK. Блокировка устанавливается целиком на таблицу и удерживается только до конца выполнения команды. Тем не менее, если хинт TABLOCK применяется совместно с хинтом HOLDLOCK, TO блокировка будет удерживаться до завершения всей транзакции. Если хинт TABLOCK используется в команде SELECT, то другие транзакции могут читать блокированные данные.
•
TABLOCKX. Указание этого хинта позволяет блокировать таблицу полностью таким образом, что другие транзакции не смогут работать с данными до завершения команды или транзакции. В отличие от хинта TABLOCK происходит полное блокирование таблицы, запрещающее даже чтение данных.
•
HOLDLOCK. Этот хинт позволяет блокировать строку, страницу или таблицу целиком до конца транзакции, а не разблокировать их после завершения команды. Использование хинта HOLDLOCK позволяет применять в транзакции уровень изолированности SERIALIZABLE, даже если в соединении установлен другой уровень изолированности.
П UPDLOCK. При помощи этого хинта на ресурсы можно устанавливать так называемые блокировки обновления (update locks) взамен использования коллективных блокировок (shared locks). При этом блокировка сохраняется до конца команды или транзакции. Особенностью блокировок обновления является то, что они позволяют другим транзакциям читать данные, но запрещают изменять их. Когда необходимо выполнить изменение данных, блокировка обновления повышается до монопольной блокировки. После этого другие транзакции уже не смогут читать данные.
872
Часть IV. Разработка и сопровождение баз данных Замечание Типы блокировок и поведение сервера при использовании конкретного типа будет рассмотрено в следующем разделе.
П NOLOCK. При указании этого хинта во время выполнения команды не устанавливается никакая блокировка. Это соответствует низшему (нулевому) уровню изоляции. Таким образом, другие транзакции могут изменять данные, которые читаются с помощью команды, использующей хинт NOLOCK. TO есть присутствуют проблемы грязного чтения, неповторяемого чтения и чтения фантомов. Разрешается использовать только для команды SELECT. П READUNCOMMITTED. Использование этого хинта имеет тот же эффект, что и использование хинта NOLOCK. ДЛЯ команды устанавливается уровень изоляции READ UNCOMMITTED. •
READCOMMITTED. При указании данного хинта для конкретной команды или транзакции устанавливается уровень изоляции READ COMMITTED. ПО умолчанию в SQL Server 2000 все команды выполняются с этим уровнем изоляции.
•
REPEATABLEREAD. При указании этого хинта для конкретной команды или транзакции устанавливается уровень изоляции REPEATABLE READ.
•
SERIALIZABLE. В данном случае система ведет себя так же, как и при использовании хинта HOLDLOCK. Для конкретной команды или транзакции устанавливается уровень изоляции SERIALIZABLE.
•
READPAST. Когда в команде указывается этот хинт, то при выборке данных система будет пропускать строки, блокированные другими транзакциями, а не ожидать их завершения и разблокирования ресурсов. Использование этого хинта допускается только для команды SELECT. Кроме того, в соединении должен быть установлен уровень изоляции READ COMMITTED.
Типы блокировок Все действия пользователей по работе с данными можно разбить на две категории: чтения и изменения. К последним относится не только изменение собственно данных, но и изменение таблиц и баз данных в целом — в том числе удаление и вставка строк в таблицы. Как уже говорилось ранее в этой главе, в SQL Server 2000 имеется несколько различных типов блокировок, которые позволяют наиболее эффективно организовать работу с одними и теми же данными множеству пользователей. Тип блокировки либо выбирается сервером автоматически в зависимости от выполняемых действий, либо самим пользователем при выполнении конкретной команды с помощью хинтов.
Основные типы блокировок В SQL Server 2000 существуют четыре основных типа блокировок: •
Коллективная блокировка (S, Shared). Коллективные блокировки являются наименее жестким типом блокировок SQL Server 2000. Обычно этот тип бло-
Глава 19. Транзакции и блокировки
873
кировок используется при выполнении операций чтения (read only operation) данных. Типичным примером таких операций является команда SELECT. Основное достоинство коллективной блокировки в том, что она позволяет множеству транзакций читать одни и те же данные. При этом система гарантирует, что если транзакция установила коллективную блокировку, то ни одна другая транзакция не сможет изменить эти данные. Тем самым решается проблема неповторяемого чтения. •
Блокировка обновления (U, Update). Этот тип блокировок, как следует из названия, используется при изменении данных. Блокировка обновления может быть установлена непосредственно или коллективная блокировка может быть повышена до блокировки обновления. Блокировка обновления рассматривается как подготовительный этап к собственно изменению данных. Чтобы изменить данные, необходимо сначала установить монопольную блокировку. Однако для непосредственной установки монопольной блокировки требуется, чтобы ни одна другая транзакция не читала данных. То есть монопольная блокировка несовместима с коллективными блокировками. Чтобы установить монопольную блокировку, транзакция должна поймать момент снятия всех блокировок со всех необходимых ресурсов. Однако это не всегда удается, особенно при работе с большим количеством данных. Для решения этой проблемы предназначена блокировка обновления. Когда транзакция хочет изменить данные, она сначала устанавливает блокировку обновления. После этого запрещается наложение другими транзакциями коллективных блокировок. Кроме того, также нельзя выполнять наложение блокировок обновления. То есть на одни и те же данные в любой момент времени может быть наложена только одна блокировка обновления. При установке блокировки данного типа уже установленные коллективные блокировки не снимаются, а лишь ожидается их снятие. Когда все коллективные блокировки будут сняты, блокировка обновления может быть повышена до монопольной блокировки.
•
Монопольная блокировка (Е, Exclusive). Этот тип блокировок применяется при изменении данных. Установка этого типа блокировок возможна только в том случае, если на необходимые ресурсы не установлена никакая другая блокировка. Монопольная блокировка может быть установлена как непосредственно, так и после повышения блокировки обновления. Если на ресурс установлена монопольная блокировка, то ни одна другая транзакция не сможет никаким образом обратиться к данным. Это решает проблему грязного чтения.
О Блокировка массивного обновления (BU, Bulk Update). Данный тип блокировок используется при выполнении операций массивной вставки данных в таблицу с указанием хинта TABLOCK. Кроме того, блокировка массивного обновления может устанавливаться автоматически, если для таблицы с помощью хранимой процедуры sp_tabieoption установлен параметр t a b l e lock on bulk load. Блокировка массивного обновления запрещает обращение к таблице любым процессам, не участвующим в операциях массивной вставки данных. Однако система не запрещает вставку новых строк в одну и ту же таблицу различным процессам массивного копирования.
874
Часть IV. Разработка и сопровождение баз данных
Замечание К операциям массивного копирования относится выполнение утилиты bcp.exe, команды B U L K I N S E R T и вставка данных с помощью механизмов DTS.
Замечание Не всегда тип устанавливаемой блокировки может соответствовать типу выполняемых операций. Например, при чтении данных командой SELECT пользователь может установить не только коллективную блокировку или блокировку обновления, но и монопольную блокировку. С другой стороны, при изменении данных пользователь может вообще не устанавливать никакой блокировки. Для этого достаточно использовать соответствующие хинты или установить нужный уровень изоляции.
Специальные типы блокировок В предыдущем разделе были рассмотрены четыре основных типа блокировок, используемых не только в SQL Server 2000, но и во многих других системах управления базами данных. Описанные блокировки обеспечивают базовую функциональность СУБД. Однако в SQL Server 2000 помимо уже перечисленных типов блокировок имеются три специальных типа блокировок: •
блокировка намерений (Intent Lock);
•
блокировка диапазона ключа (Key Lock);
П блокировка схемы (Schema Lock). Блокировка намерений обеспечивает пользователей дополнительными возможностями для управления ресурсами. Она предназначена для блокирования ресурсов вниз по иерархии объекта. Например, если предполагается, что хранимая процедура будет сканировать большую часть таблицы, то для снижения затрат на захват ресурсов и снижения времени ожидания снятия ранее наложенных блокировок в начале хранимой процедуры можно установить коллективную блокировку намерений на уровне таблицы. Любая другая транзакция сможет читать данные в таблице, но не сможет установить монопольную блокировку. При этом хранимая процедура способна беспрепятственно обращаться к любым строкам таблицы. Установка блокировок на конкретные строки или страницы не требуется, т. к. блокировка относится ко всей таблице. Блокировки намерений позволяют значительно снизить затраты на установку, снятие и проверку блокировок. Например, вместо проверки сотен страниц на возможность установки транзакцией того или иного типа блокировки, при использовании блокировок намерений достаточно выполнить лишь одну проверку на уровне таблицы и оценить, можно или нет устанавливать новую блокировку. При попытке установки новой блокировки менеджер блокировок в первую очередь проверяет, не установлена ли блокировка намерений на уровне таблицы. Если такая блокировка установлена, и она конфликтует с типом запрашиваемой блокировки, то установка новой блокировки запрещается. Если блокировка намерений не установлена или ее тип не конфликтует с типом запрашиваемой блокировки, то менеджер блокировок проверяет, не существует ли конфлик-
Глава 19. Транзакции и блокировки
875
тующая блокировка на уровне группы страниц, отдельной страницы или строки. Такой конфликтующей блокировкой может быть как одна из основных блокировок, так и блокировка намерений. Замечание Хотя использование блокировок намерений обеспечивает увеличение производительности работы с блокировками в целом, платой за это является снижение возможности коллективной работы множества пользователей. В SQL Server 2000 существует три типа блокировок намерений: • Коллективная блокировка намерений (IS, Intend Shared). Этот тип блокировки намерений применяется в случае, когда предполагается читать данные вниз по иерархии объекта. Вместо установки множества коллективных блокировок на уровне страницы или строки непосредственно в момент выполнения команды чтения данных, можно установить коллективную блокировку намерений на уровне таблицы в начале транзакций и тем самым избежать ожидания разблокирования используемых другими транзакциями ресурсов. С другой стороны, при попытке некоторой транзакции установить монопольную блокировку на множество ресурсов, достаточно выполнить лишь одну проверку на наличие блокировки намерений на уровне таблицы, чтобы увидеть, что в настоящий момент наложение такой блокировки невозможно и необходимо ожидать снятия блокировки намерения. • Монопольная блокировка намерений (IE, Intent Exclusive). Данный тип блокировок намерений предназначен для блокирования объектов, в которых предполагается выполнить множество изменений. На объект в целом устанавливается монопольная блокировка, так что никакая другая транзакция никак не сможет обратиться к данным блокированного объекта. Например, если предполагается изменить более 70% строк в таблице в середине длинной транзакции и необходимо свести к минимуму период ожидания установки монопольной блокировки на все необходимые ресурсы, то в начале транзакции можно указать монопольную блокировку намерений, и менеджер блокировок не установит ни одной блокировки на запрашиваемые ресурсы. • Коллективно-монопольная блокировка намерений (SIX, Shared with Intent Exclusive). Этот тип блокировок намерений используется, когда транзакция выполняет чтение большей части данных и частично изменяет их. Основное отличие данного типа блокировок от монопольной блокировки намерений в том, что первая изменяет лишь небольшую часть данных. При этом обеспечивается возможность чтения неизменяемых данных другими транзакциями. Например, транзакция устанавливает коллективно-монопольную блокировку намерений на уровне таблицы. На каком-то этапе транзакция начинает изменение данных. При этом менеджер блокировок устанавливает монопольную блокировку намерений на уровне группы страниц или конкретной страницы и выполняет изменение данных. В то же время другие транзакции могут использовать для таблицы коллективные блокировки намерений на уровне таблицы и читать любые данные, для которых не используется моно-
876
Часть IV. Разработка и сопровождение баз данных
польная блокировка (Е или IE). Также разрешается наличие обычных коллективных блокировок на ресурсы, на которые не установлена монопольная блокировка. Тем не менее, ни одна транзакция не может применить блокировку обновления (U) или монопольную блокировку (Е), если ранее к таблице была применена коллективно-монопольная блокировка намерений. Кроме того, в любой момент времени для объекта может быть использована только одна коллективно-монопольная блокировка. При этом также не допускается установка коллективно-монопольной блокировки и на любые объекты, лежащие ниже по иерархии. Приведенные ранее типы блокировок, несмотря на их разнообразие, все же можно рассматривать как один тип блокировок — блокировка данных. Однако в SQL Server 2000 имеется возможность блокирования не только конкретного набора страниц, строк, таблиц или группы страниц, но и захвата ресурсов на основе логического условия. Блокировки на основе логического условия называются блокировками ключа (Key Locks). Этот тип блокировок решает проблемы чтения фантомов (The phantom read problem) и обеспечивает реализацию высшего уровня изолированности — сериализуемости транзакций (Serializable). Проблема чтения фантомов сводится к тому, что за время выполнения транзакции в таблицу могут быть добавлены новые строки или удалены существующие, которые соответствуют логическому условию, используемому для выборки данных. Предположим, что для получения конечного результата необходимо выполнить многократное сканирование одного и того же набора строк. При этом надо гарантировать, что при каждом сканировании транзакция будет работать всегда с одним и тем же набором данных. Если удаление используемых строк можно решить, проверяя наличие блокировок, то запретить вставку строк, которые могут использоваться в транзакции, не так-то просто. Именно для этого и применяется блокировка диапазона ключа. Менеджер блокировок запоминает логическое условие, которое указывается в запросе с помощью конструкции WHERE и используется для выборки определенного набора данных. При попытке вставки или удаления строк из таблицы менеджер блокировок проверяет, соответствуют ли эти строки указанному логическому условию. Если обнаруживается, что строки соответствуют логическому условию, что выполнение операции удаления или вставки откладывается до снятия блокировки. Таким образом транзакция может быть уверена, что она всегда будет работать с одним и тем же набором данных. Замечание Операции обработки блокировок диапазона ключа являются довольно ресуроемкими, хотя удаление и вставка строк в таблицу выполняются нечасто. Тем не менее, блокировка диапазона ключа осуществляется только в том случае, если установлен у р о в е н ь
и з о л я ц и и
S E R I A L I Z A B L E .
Последний тип блокировок — это блокировка схемы (Shm, Schema Locks). Этот тип блокировок используется при выполнении команд языка модификации объектов баз данных (DDL, Data Definition Language). Типичным примером таких команд является команда ALTER. Блокировка схемы — это новый тип блокиро-
Глава 19. Транзакции и блокировки
877
вок, который не существовал в предыдущих версиях SQL Server, т. к. только SQL Server 2000 позволяет выполнять изменение структуры объектов базы данных, таких, например, как таблицы и представления. Блокировка схемы предназначена для захвата метаданных объектов базы данных. Все объекты, созданные в базе данных, описываются в системных таблицах этой базы данных. Например, информация о пользовательских таблицах хранится в системной таблице s y s t a b l e s , т. е. данные таблицы s y s t a b l e s являются метаданными, содержащими сведения о структуре пользовательских таблиц. Любые другие объекты базы данных, такие как роли, пользователи, ограничения целостности, индексы, правила, умолчания и т. д. также описываются с помощью метаданных в системных таблицах. В SQL Server 2000 реализовано два типа блокировок схемы: • Блокировка стабильности схемы (Sch-S, Stability Lock). Этот тип блокировок служит для обеспечения неизменности метаданных объектов на время выполнения транзакции. Система должна гарантировать, что во время работы транзакции объекты не будут изменены. Например, нельзя допустить, что за время выполнения транзакции один из пользователей изменит структуру таблицы таким образом, что она не будет содержать столбцов, которые читала транзакция, или что вследствие изменения структуры таблицы в ней будут содержаться иные данные, чем в начале транзакции. Блокировка стабильности схемы автоматически устанавливается менеджером блокировок, как только некоторая транзакция устанавливает любой тип блокировки на данные таблицы. Когда все блокировки в таблице снимаются, автоматически анулируется и блокировка стабильности схемы. Только после этого разрешается изменение структуры таблицы. • Блокировка изменения схемы (Sch-M, Modification Lock). Блокировки этого типа применяются непосредственно при изменении объекта базы данных. При этом запрещается установка любых других блокировок как на сам объект, так и на все объекты, расположенные по нисходящей иерархии. Тем самым обеспечивается возможность безболезненного изменения структуры объектов. В противном случае, если во время изменения структуры таблицы транзакция попытается прочитать данные, то нет никакой гарантии, что для транзакции будет гарантировано выполнение всех требований ACID. Установка блокировки изменения схемы и собственно модификация структуры объекта возможна только в том случае, если на объект не наложена ни одна другая блокировка.
Конфликты блокировок В предыдущих разделах были рассмотрены типы блокировок, используемых в SQL Server 2000 для выполнения требований ACID и реализации различных уровней изолированности. В зависимости от типа блокировки, уже установленной транзакцией на ресурс, запрещается или разрешается создание новых блокировок другими транзакциями. Например, если к странице применена коллективная блокировка, то допускается установка только дополнительной коллективной блокировки или блокировки обновления. Образование монопольной
878
Часть IV. Разработка и сопровождение баз данных
блокировки не разрешается. В табл. 19.1 приведена сводная информация о совместимости различных типов блокировок SQL Server 2000. Таблица 19.1. Совместимость блокировок
Тип запрашиваемой блокировки
Тип наложенной блокировки S
Коллективная блокировка (S)
*
Блокировка изменений (U)
*
и * *
X
* *
*
IS
IX
*
*
SIX
*
Монопольная блокировка (X) Коллективная блокировка намерений (IS)
*
Монопольная блокировка намерений (IX)
*
Коллективно-монопольная блокировка намерений (SIX)
*
Замечание Хотя монопольная блокировка не совместима ни с одним типом блокировок, включая саму себя, тем не менее, монопольная блокировка намерений совместима сама с собой и с коллективной блокировкой намерений. Это связано с тем, что блокировка намерений говорит о том, что транзакция собирается изменить лишь часть блокируемых данных, но не все. Если в момент установки монопольной блокировки намерений на уровне таблицы уже существовала монопольная или коллективная блокировка намерений на уровне страницы или строки, то создание этой блокировки разрешается. Замечание Как уже говорилось ранее, блокировка стабильности схемы совместима со всеми типами блокировок, исключая блокировку модификации схемы. В свою очередь, блокировка модификации схемы несовместима ни с одним типом блокировки, включая саму себя. Блокировка массивного обновления совместима только с другими блокировками массивного обновления и с блокировкой стабильности схемы.
Мертвые блокировки При одновременной работе с данными множества пользователей возможна ситуация, когда две или более транзакций обращаются к одному и тому же набору данных. Если последовательность обращения к ресурсам у всех транзакций одинакова, то особых проблем не возникает — транзакция, обратившаяся к ресурсу позднее других транзакций, должна будет просто дождаться разблокирования нужных ресурсов. После этого она сможет нормально продолжить работу. Теперь предположим, что имеются две транзакции (назовем их А и в), обращающиеся к двум ресурсам (1 и 2). При запуске транзакция А обращается сначала к ресурсу 1, а транзакция в — к ресурсу 2. При этом каждая из транзакций уста-
Глава 19. Транзакции и блокировки
879
навливает блокировку на используемый ресурс. На следующем этапе транзакция А обращается к ресурсу 2. Однако ресурс 2 уже блокирован транзакцией в. Таким образом, транзакция А приостанавливается и ожидает снятия блокировки. В свою очередь транзакция в обращается к ресурсу 1, который блокирован транзакцией А. Это приводит к тому, что транзакция в станет ожидать снятия блокировки с ресурса 1. Таким образом, каждая из транзакций ожидает разблокирования ресурсов, используемых противоположной транзакцией. Однако ни одна из транзакций не может быть продолжена, т. к. для ее завершения необходимо разблокирование ресурсов, используемых другой транзакцией. Описанная ситуация является типичным примером мертвой, или, как ее еще называют, тупиковой блокировки. (
Замечание
^
Возникновение мертвой блокировки невозможно при выполнении операций чтения данных, т. к. допускается установка на один и тот же ресурс более одной коллективной блокировки. Обычно мертвые блокировки возникают при попытке изменения одних и тех же данных несколькими транзакциями. Мертвая блокировка (deadlock) возникает, когда две или более транзакций пытаются обратиться к ресурсам, блокированным ранее другими транзакциями — участницами мертвой блокировки. Описанный выше пример является простейшим вариантом мертвой блокировки, в которую вовлечены всего две транзакции и два ресурса. Однако на практике возможно образование мертвых блокировок, в которые втянуто множество транзакций, блокирующих десятки и сотни ресурсов. Мертвая блокировка не может разрешиться сама собой. Если не предпринимать никаких дополнительных действий, мертвая блокировка способна существовать бесконечно долго. В системе управления базами данных должны быть предусмотрены механизмы, позволяющие решать конфликты мертвых блокировок. Одним из таких механизмов является ограничение времени ожидания транзакцией установки блокировки. Например, если транзакция пытается обратиться к блокированным ресурсам, то можно установить максимальный период ожидания, в течение которого менеджер блокировок станет ожидать разблокирования требуемых ресурсов. После истечения времени ожидания транзакция получит соответствующее сообщение об ошибке. Однако установки мертвой блокировки при этом не произойдет. Для установки времени ожидания разблокирования ресурсов используется следующая команда: SET LOCKJTIMEOUT timeout_period
Время ожидания задается с помощью аргумента timeout_period в миллисекундах. Период ожидания разблокирования ресурсов задается на уровне соединения. По умолчанию в соединении устанавливается период ожидания, равный — 1, что соответствует бесконечному ожиданию разблокирования ресурса. Задание максимального значения для срока ожидания установки блокировки — это лишь механизм, позволяющий на уровне соединения избежать возникновения мертвых блокировок. Тем не менее, на уровне сервера остается высокая 29 Зак. 83
880
Часть IV. Разработка и сопровождение баз данных
вероятность возникновения мертвых блокировок, т. к. нет гарантии, что для всех соединений будет назначен период ожидания разблокирования ресурса. Для снятия уже установленных мертвых блокировок в SQL Server 2000 реализован специальный механизм, позволяющий находить мертвые блокировки и снимать их. Периодически менеджер блокировок сканирует системные таблицы, в которых содержится информация обо всех возникших на сервере блокировках. При этом для каждой из блокировок устанавливается специальный флаг. Если во время сканирования обнаруживается, что для одной из блокировок установлен этот флаг, то это означает, что блокировка существует достаточно долго. Данная ситуация приводит к запуску специального алгоритма, который анализирует причину долгого существования блокировки. Для этого проверяется вся цепочка зависимостей блокировок, образованных различными транзакциями. Если обнаруживается, что для продолжения одной из транзакций цепочки необходимо разблокирование ресурсов, используемых в самой первой транзакции цепочки, то это означает, что в системе установлена мертвая блокировка. Если же такой зависимости нет, то менеджер блокировок продолжает сканирование блокировок. После обнаружения существования в системе мертвой блокировки менеджер блокировок должен разрешить конфликт. Единственный способ разрешения конфликта мертвой блокировки — это принудительное снятие одной из блокировок. При этом происходит автоматический откат транзакции, блокировка которой была снята. Соединение, инициировавшее транзакцию, получает сообщение об ошибке 1205 (откат транзакции вследствие возникновения мертвой блокировки). При выборе транзакции, которая будет отменена, менеджер блокировок руководствуется ценой (или стоимостью) транзакции. Чем меньше цена транзакции, тем больше у нее шансов быть откаченной при возникновении мертвой блокировки. Цена транзакции задается ;да уровне соединения, хранимой процедуры или транзакции с помощью команды: SET DEADLOCK_PRIORITY
{LOW | NORMAL | @deadlock_var}
Использование аргумента LOW необходимо в тех ситуациях, когда транзакцией можно пожертвовать в случае возникновения мертвой блокировки. Аргумент NORMAL определяет стандартную цену транзакции. С помощью аргумента @deadlock_var можно указать цену транзакции с помощью переменной. Значение 3 соответствует использованию аргумента LOW, а значение 6 — аргументу NORMAL. Замечание Установка цены транзакции возможна только на уровне соединения. То есть нельзя определить стоимость соединения по умолчанию на уровне сервера или базы данных, которые будут автоматически возникать для всех вновь устанавливаемых соединений.
Никогда нельзя быть до конца уверенным, что конкретная транзакция не будет отменена из-за возникновения мертвой блокировки. Поэтому при написании клиентских приложений необходимо учитывать возможность отката транзакций. В приложении должны быть реализованы механизмы отслеживания отката транзакции, а при необходимости, и повторного ее запуска.
Глава 20
Работа с базой данных База данных является базовым элементом SQL Server 2000 и своего рода контейнером, в котором располагаются объекты и данные. Любой объект должен принадлежать базе данных. Каждая база данных имеет свою систему безопасности, связанную с системой безопасности SQL Server 2000. Любой пользователь при обращении к серверу работает в контексте какой-то базы данных. Каждой базе данных сопоставлен пользователь, который является ее владельцем (database owner). Этот пользователь имеет имя dbo и ему предоставлены максимальные права в базе данных. В главе 18 была рассмотрена физическая и логическая архитектура баз данных SQL Server 2000. В этой же главе основное внимание будет отдано рассмотрению практической работы с базой данных: •
планирование конфигурации базы данных;
•
создание базы данных;
• управление свойствами базы данных; •
отсоединение и присоединение базы данных;
•
внесение изменений в базу данных;
П удаление базы данных. Будет обсуждаться выполнение указанных задач с использованием всех стандартных средств, имеющихся в распоряжении пользователей — Transact-SQL, Enterprise Manager и мастера.
Планирование конфигурации базы данных Прежде чем приступить к непосредственному созданию базы данных, необходимо решить, какую конфигурацию будет иметь база данных. Для этого необходимо иметь информацию, какие свойства имеет база данных и к какому результату приведет установка того или иного значения. В следующих нескольких разделах и будет рассмотрено планирование конфигурации базы данных.
Планирование размещения файлов Возможность хранения информации базы данных в разных файлах открывает администратору большие возможности по управлению производительностью
882
Часть IV. Разработка и сопровождение баз данных
операций ввода/вывода. Основная задача планирования использования файлов сводится к оценке "тяжести" тех или иных данных, интенсивности обращения к ним, частоте обновления и изменения. Файлы, принадлежащие одной базе данных, могут располагаться на разных логических дисках. В некоторых случаях это позволяет повысить производительность сервера при обработке пользовательских запросов. (
Замечание
^
Выбирая диск, на котором будут располагаться файлы базы данных, следует обратить внимание на количество свободного пространства на диске. Необходимо учесть возможность увеличения в будущем файлов базы данных. Кроме того, для достижения максимальной производительности следует размещать файлы базы данных на логических дисках, принадлежащих разным физическим дискам. Дополнительное повышение производительности возможно за счет подключения дисков к разным контроллерам. Например, если в таблице имеется столбец типа t e x t , ntext или image, то хранение столбцов этого типа в отдельном файле может существенно повысить производительность. Поля типа t e x t , ntext и image занимают много места, и хранение их вместе с основными данными может заметно снизить производительность операций выборки и сканирования данных. По возможности следует выносить столбцы типа t e x t , ntext и image на отдельные физические диски. Также следует внимательно отнестись к индексам, созданным в базе данных. Если индексы сложные и требуют частого перестроения, то также по возможности следует приписать их отдельному файлу или даже группе. Индексы можно хранить на отдельном жестком диске, на котором нет данных, но можно хранить их и вместе с данными. В последнем случае нужно лишь располагать индексы и индексируемые данные на разных жестких дисках. Это позволит повысить производительность обновления данных. Кроме того, персональное внимание необходимо уделить журналу транзакций. В идеале следует замерить частоту выполнения транзакций, объем строк, обрабатываемых в транзакциях, их длительность и другие параметры. Если нагрузка на журнал транзакций значительна, то его следует располагать на отдельном физическом диске, а не вместе с данными. Если и после этого производительность подсистемы обработки транзакций неудовлетворительна, то журнал транзакций можно хранить в нескольких файлах, размещенных на отдельных дисках. Если на компьютере с SQL Server 2000 установлено множество жестких дисков, то следует расположить на каждом из них как минимум по одному файлу базы данных. В сложных базах данных на каждом физическом диске можно размещать несколько файлов. Для получения максимальной производительности следует выделить группы операций работы с данными. Для каждой группы операций следует проанализировать, к каким данным выполняются обращения, какие индексы используются, какова интенсивность чтения и изменения данных. На основе полученной информации следует разместить данные таким образом, чтобы при выполнении каждой группы операций можно было добиться максимальной производительности.
Глава 20. Работа с базой данных
883
При работе на одном компьютере с SQL Server 2000 со множеством баз данных можно использовать для расположения файлов каждой из них отдельные диски или размещать файлы баз данных на всех доступных дисках. Выбор той или иной стратегии зависит от конкретной ситуации.
Использование групп файлов Строго говоря, SQL Server 2000 позволяет приписывать данные только к группе файлов. Для того чтобы сохранить данные таблицы или отдельной колонки в конкретном файле, необходимо создать новую группу, содержащую только этот файл. Как ясно из вышесказанного, группы файлов создаются для повышения производительности операций ввода/вывода и облегчения управления размещением данных. Хранение данных в конкретных файлах было бы связано с определенными трудностями, поэтому эта возможность в SQL Server 2000 не реализована. Предположим, что на компьютер с SQL Server 2000 был добавлен новый жесткий диск и на нем был создан дополнительный файл данных. Данные таблиц были приписаны к конкретным файлам. Чтобы разрешить сохранение данных в новом файле, следует изменить свойства всех таблиц, данные из которых желательно хранить в новом файле. Если количество таблиц невелико, то такой подход вполне допустим. Если же таблиц в базе данных несколько сотен, то изменение места хранения данных может занять довольно много времени. Если данные приписываются не к конкретному файлу, а к группе файлов, то задача значительно упрощается. Достаточно добавить новый файл к группе файлов, и данные таблиц будут автоматически располагаться в новом файле. Планирование групп файлов напрямую связано с планированием файлов. Группы файлов, создаваемые в базе данных, обычно разделяются по их назначению. В одной группе находятся данные, которые обычно не используются вместе. Например, если в одной группе расположить сами данные и их индексы, то при внесении изменений в данные необходимо обновить как данные, так и их индексы. При этом длительность процесса изменения увеличивается. Конечно, если обновляется всего несколько строк, то ничего страшного в этом нет, но если необходимо обновить несколько сотен тысяч записей, то потери времени становятся весьма заметными. Поэтому рекомендуется располагать данные, к которым обращается SQL Server 2000 при выполнении тех или иных операций, в отдельных группах. В этом случае файлы разных групп не должны находиться на одном физическом диске. (
Замечание
^
Итак, группы файлов можно использовать для облегчения управления местом хранения данных или для повышения производительности операций дискового ввода/вывода. Можно решать только одну из этих задач или обе вместе.
884
Часть IV. Разработка и сопровождение баз данных
Возможность автоматического роста файлов Количество информации в базах данных имеет тенденцию со временем увеличиваться. При работе с SQL Server 6.x администратор должен был постоянно следить за размером баз данных. Если свободное пространство в базе данных кончалось, то администратор должен был вручную увеличивать размер базы данных за счет устройств, сконфигурированных на сервере. Если свободное пространство на устройствах заканчивалось, то необходимо было предварительно увеличить размер устройств. Как видим, увеличение размера базы данных было довольно хлопотным занятием. Начиная с версии 7.0, в SQL Server реализована возможность автоматического увеличения размера базы данных. При создании базы для каждого ее файла (данных и журнала транзакций) необходимо указать первоначальный размер файла и шаг приращения. Шаг приращения можно указывать как в абсолютных единицах, так и в процентах от первоначального размера. Дополнительно для каждого файла можно задать максимальный размер, до которого он будет увеличиваться. При достижении этого размера автоматический рост файла останавливается. Если для хранения данных понадобится дополнительное пространство, то сервер выдаст предупреждающее сообщение о том, что необходимо увеличить размер файла. Если максимальный размер файла не указывается, то файл будет расти до тех пор, пока не заполнит весь диск. Администратор может очень гибко настраивать автоматический рост базы данных. Устанавливая индивидуальные параметры для каждого файла базы данных, можно оптимальным образом контролировать количество свободного пространства на диске. Перед тем как выбрать первоначальный размер и шаг прироста файла, необходимо оценить, какое количество данных будет добавляться. Если данные практически не добавляются, то можно установить небольшой шаг прироста. Если же ожидается постоянное добавление большого количества данных, то лучше установить шаг прироста побольше. Увеличение размера файла занимает довольно много времени и не стоит выполнять его слишком часто. Как уже говорилось, данные записываются в файлы группы таким образом, чтобы заполнение каждого из них было приблизительно одинаковым. Это приведет к тому, что свободное пространство во всех файлах будет исчерпано одновременно, и операция автоматического увеличения файлов станет выполняться для каждого файла группы, причем не для всех сразу, а последовательно. Предположим, что группа состоит из трех файлов. Группа была заполнена, и осуществляется автоматическое увеличение файлов. Сначала SQL Server 2000 увеличивает размер первого файла в группе. Когда добавленное пространство будет исчерпано, увеличится размер второго файла, затем — третьего. Когда и третий файл будет заполнен, то весь процесс повторится. Будет увеличен первый файл в группе, затем второй и т. д. Планируя шаг прироста каждого файла, следует учитывать эту особенность. Поочередное, а не одновременное увеличение размера файлов группы позволяет более эффективно расходовать дисковое пространство. Если на одном диске рас-
Глава 20. Работа с базой данных
885
положены несколько групп файлов, то одновременное увеличение всех файлов одной группы может лишить файлы других групп возможности расти. Вышесказанное относится только к файлам данных. Напомним, что для файлов журнала транзакций создание групп файлов не поддерживается. Однако файлы журнала транзакций также могут автоматически увеличиваться при полном их заполнении.
Использование неформатированных разделов До сих пор мы рассматривали файлы базы данных, физически реализованные как обычные файлы операционной системы. Однако помимо таких файлов в SQL Server 2000 можно использовать так называемые сырые разделы (raw partition), которые представляют собой логические диски, созданные утилитой конфигурирования диска (fdisk.exe для Windows 98, Disk Administrator для Windows NT 4.0 или Computer Management для Windows 2000), но не отформатированные. Таким образом, сырой раздел не имеет никакой файловой системы и на нем нельзя размещать обычные файлы операционной системы. Чтобы использовать такой раздел в операционной системе, его необходимо предварительно отформатировать. SQL Server 2000 может использовать сырой раздел в качестве одного из файлов операционной системы. При этом для файла отводится полностью все доступное пространство в разделе и для него нельзя конфигурировать автоматическое увеличение размера. Использование неформатированных разделов позволяет повысить безопасность информации, хранящейся в базе данных, т. к. доступ к неформатированному разделу не может быть получен стандартными средствами операционной системы, которая продолжает рассматривать раздел как неформатированный, а следовательно не имеющий никаких данных. При работе с обычными файлами пользователь имеет возможность скопировать файлы на другой компьютер и присоединить (attach) их в качестве базы данных. Скопировать же сырой раздел не удастся, т. к. доступ к нему может быть получен только средствами ядра SQL Server 2000. Однако это же является и недостатком. Администратор не может выполнять резервное копирование базы данных путем копирования файлов базы данных.
Выбор сопоставления При работе с базами данных SQL Server 2000 администратор должен помимо всего прочего выбрать сопоставление (collation), которое будет использовать база данных. При работе с более ранними версиями SQL Server, в т. ч. и с SQL Server 7.0, сопоставление (точнее его аналоги) определялось на уровне сервера, и его действие распространялось на все аспекты работы сервера, в т. ч. базы данных, индексы, таблицы и их столбцы. Таким образом, не было возможности использовать различные сопоставления в пределах одного сервера.
(
Замечание
^
Напомним, что сопоставление определяет правила хранения, сравнения и сортировки символьных данных. Подробно сопоставления рассматривались в главе 4.
886
Часть IV. Разработка и сопровождение баз данных
В SQL Server 2000 такая возможность появилась. Теперь сопоставление, конфигурируемое на уровне сервера, рассматривается как сопоставление по умолчанию, которое автоматически используется в тех случаях, когда при создании базы данных явно не указывается какое-либо сопоставление. Определяемое на уровне сервера сопоставление также применяется для всех баз данных, создаваемых в процессе инсталляции SQL Server 2000 — системных баз данных, а также баз данных pubs И Northwind. Сопоставление, указываемое на уровне базы данных при ее создании, используется для всех системных таблиц. Это напрямую отражается на правилах именования объектов базы данных и выборе имен пользователей. Например, при выборе сопоставления, нечувствительного к регистру (case insensitive), сервер не будет делать различия между символами, набранными в верхнем и нижнем регистре. То есть имена AUTHORS и Authors будут считаться именем одного и того же объекта. Так же нельзя будет создавать в таблицах столбцы с одинаковыми именами, но набранными в разных регистрах. Если же для базы данных существует сопоставление, чувствительное к регистру (case insensitive), то сервер будет проверять уникальность имен объектов с учетом регистра. Необходимо отметить, что при выполнении запросов к объектам различных баз данных чувствительность к регистру имен этих объектов определяется той базой данных, в которой расположены эти объекты, а не базой данных, в контексте которой обрабатывается запрос. Таким образом, в одном запросе можно использовать имена как чувствительные к регистру, так и не чувствительные. Установленное на уровне базы данных сопоставление не является обязательным для таблиц, создаваемых в базе данных, а также столбцов этих таблиц. Пользователь может при создании таблицы явно определить сопоставление, которое должно использоваться для этой таблицы. Более того, SQL Server 2000 позволяет указывать сопоставление и на уровне отдельного столбца таблицы.
Замечание При определении локальных переменных, меток перехода (для команды GOTO), временных хранимых процедур и временных таблиц применяется сопоставление, определенное на уровне сервера. Это позволяет обеспечить однотипное поведение указанных объектов при переключении между различными базами данных. В противном случае нельзя гарантировать верного выполнения запросов. Например, если пользователь создает две переменные с одинаковыми именами, но набранными в разных регистрах, то необходимо гарантировать, что они будут различаться независимо от того, в контексте какой базы данных будут использоваться.
Отдельно стоит вопрос о том, как же станут обрабатываться данные, имеющие различные сопоставления. Например, в одном столбце таблицы хранятся данные, чувствительные к регистру, а в другом — нет. Приведенный ниже код демонстрирует создание такой таблицы: CREATE TABLE tbll ( Coll nvarchar(lO) COLLATE Latinl_General_CI_AS, Col2 nvarchar(lO) COLLATE Latinl_General_CS_AS
Глава 20. Работа с базой данных
887
С помощью данного кода организуется таблица t b i l , имеющая два столбца — Coll и со12. Первый из них имеет сопоставление, чувствительное к регистру, а второй — нет. Теперь вставим в таблицу новую строку: 1
INSERT INTO tbll VALUES (N'Aaa , N'AAa')
Как видно, для столбцов были выбраны значения, отличающиеся только регистром второго символа. Однако даже такие небольшие различия приводят к конфликту сопоставлений. Убедимся в этом: SELECT * FROM tbll WHERE Coll=Col2
В ответ будет выдано следующее сообщение об ошибке: Server: Msg 446, Level 16, State 9, Line 1 Cannot resolve collation conflict for equal to operation.
Данное сообщение свидетельствует о наличии конфликта сопоставлений. То есть сервер не знает, по каким правилам должно выполняться сравнение значений. Разрешить конфликт достаточно легко. Для этого нужно явно указать, какое сопоставление, а соответственно и правила сравнения символов, должны использоваться при выполнении запроса. Для этого после выражения необходимо указать ключевое слово COLLATE, после которого и приводится имя сопоставления. Попробуем выполнить тот же запрос с указанием сопоставления, чувствительного к регистру: SELECT * FROM tbll WHERE Coll=Col2 COLLATE Latinl_General_CS_AS
В ответ будет получен результат: Coll
Col2
(О row(s) affected)
Как видно, не было возвращено ни одной строки. Действительно, значения в столбцах различны, если учитывать регистр. Теперь же попытаемся выполнить запрос без учета регистра: SELECT * FROM tbll WHERE Coll=Col2 COLLATE Latinl_General_CI_AS
В ответ будет получен следующий результат: Coll
Col2
Ааа
ААа
(1 row(s) affected)
Таким образом, использование параметра COLLATE позволяет решать конфликты сопоставлений. Данный параметр может применяться не только в запросах SELECT, но и в любых других выражениях, обрабатывающих символьные данные. Пришло время поговорить о сопоставлениях, имеющихся в распоряжении пользователей при работе с SQL Server 2000, а также о свойствах этих сопоставле-
888
Часть IV. Разработка и сопровождение баз данных
ний. Список сопоставлений, имеющихся в SQL Server 2000, можно получить с помощью функции fn_helpcoliations, выполнив следующий запрос: SELECT * FROM : : f n _ h e l p c o l l a t i o n s ( )
В ответ сервер возвратит более семисот строк, каждая из которых описывает отдельное сопоставление. Однако это довольно значительный объем. Сопоставления можно систематизировать, что позволит легко различать их. Выведем только список сопоставлений, относящихся к кириллице: SELECT name FROM ::fn_helpcollations() WHERE name LIKE 'Cyrillic%'
Будет получен результат: name Cyrillic_General_BIN Cyrillic_General_CI_AI Cyrillic_General_CI_AI_WS Cyrillic_General_CI_AI_KS Cyrillic_General_CI_AI_KS_WS Cyrillic_General_CI_AS Cyriilic_General_CI_AS_WS Cyrillic_General_CI_AS_KS Cyrillic_General_CI_AS_KS_WS Cyrillic_General_CS_AI Cyrillic_General_CS_AI_WS Cyrillic_General_CS_AI_KS Cyrillic_General_CS_AI_KS_WS Cyrillic_General_CS_AS Cyrillic_General_CS_AS_WS Cyrillic_General_CS_AS_KS Cyrillic_General_CS_AS_KS_WS (17 row(s) affected)
В общем виде имя сопоставления представляет собой описание свойств, которое оно имеет. Типичным примером названия сопоставления является имя Cyriiiic_Generai_cs_AS. Первая часть имени описывает национальный набор символов, с которым работает сопоставление. В данном случае это кириллица. Дополнительно может указываться подвид национальных символов (например, Danish_Norwegian_cs_Ai). Эта возможность используется для национальных алфавитов, имеющих несколько вариантов. Значение General соответствует наиболее распространенному варианту. В принципе, данный вариант может быть вообще единственным. Далее в имени представления следует набор сокращений, описывающих конкретные свойства сопоставления в отношении сравнения символов. Первая буква сокращения означает контролируемое свойство, тогда как вторая — поведение сервера в отношении соответствующего свойства. Рассмотрим, какое же значение имеет первая буква сопоставления: П с — чувствительность к регистру; • А — чувствительность к акценту;
Глава 20. Работа с базой данных
889
•
w — чувствительность к ширине символа. Определяет, будет ли сервер различать один и тот же символ, представленный одним (не Unicode) и двумя байтами (Unicode);
•
к — определяет, будет ли сервер делать различие между двумя наборами японских символов — Hiragana и Katakana.
С
Замечание
J
На первый взгляд непонятно, какое отношение к кириллице имеют японские символы. Дело в том, что выражение может включать не только значения кириллицы, но и японские значения. При этом пользователь может явно указать, будут ли различаться символы Hiragana и Katakana. Теперь же рассмотрим назначение второго символа: •
s — сервер будет чувствителен к соответствующему свойству;
•
i — сервер будет нечувствителен к соответствующему свойству.
Замечание Естественно, сервер может быть либо чувствителен к свойству, либо не чувствителен. То есть одновременно в имени сопоставления не могут присутствовать значения CS И CI, AS И A I , WS И WI, KS И KI. Помимо рассмотренных двухбуквенных сокращений, в именах сопоставлений также встречается значение BIN, ЧТО свидетельствует о том, что сравнение символов будет производиться на основе их порядкового номера в наборе символов (characters set), известного также как кодовая страница (code page). Такой тип сравнения символов известен как бинарная сортировка (binary sort order). Естественно, для этого типа сортировок не допускается указание двухбуквенных сокращений.
Замечание Достоинством бинарной сортировки является высокая скорость сравнения символов, т. к. не требуется выполнять дополнительных операций работы с данными. Иногда бывает полезно узнать, какой набор символов использует то или иное сопоставление или какому сопоставлению Windows соответствует то или иное сопоставление. Для получения этой информации используется функция COLLATIONPROPERTY, имеющая следующий синтаксис: COLLATIONPROPERTY
(collation_name, property)
Первый параметр функции задает имя сопоставления, о котором необходимо получить информацию, тогда как второй параметр — собственно свойство. Параметр property может принимать следующие значения: П
'CodePage' — номер кодовой страницы данных не Unicode, соответствующей указанному сопоставлению.
890
Часть IV. Разработка и сопровождение баз данных
CU ' L C I D ' — возвращает идентификационный номер локализации операционной системы (LCID, locale ID), соответствующей указанному сопоставлению. Если указано сопоставление SQL Server, то будет возвращено значение NULL. •
'Comparisonstyle 1 — возвращает, какой стиль сравнения Windows соответствует указанному сопоставлению.
В качестве примера рассмотрим получение информации о всех трех свойствах ДЛЯ сопоставления Cyrillic_General_CS_Ai: SELECT COLLATIONPROPERTY('Cyrillic_General_CS_AI', SELECT COLLATIONPROPERTY('Cyrillic_General_CS_AI•, SELECT COLLATIONPROPERTY('Cyrillic_General_CS_AI',
'CodePage') 1 'LCID ) 'ComparisonStyle')
Будет возвращен следующий результат: 1251 (1 row(s) affected) 1049 (1 row(s) affected) 196610 (1 row(s) affected)
Ранее в этом разделе был приведен список всех сопоставлений, соответствующих кириллице. Однако довольно часто вместо кириллицы используется одно из сопоставлений Latinl_General. Хотя это сопоставление соответствует кодовой странице 1252, однако оно с успехом может быть использовано и при работе с русским текстом. Выберем список всех сопоставлений L a t i n i G e n e r a i : SELECT name FROM ::fn_helpcollations() WHERE name LIKE 'Latinl_General%'
Будет возвращен результат: name Latinl_General_BIN Latinl_General_CI_AI Latinl_General_CI_AI_WS Latinl_General_CI_AI_KS Latinl_General_CI_AI_KS_WS Latinl_General_CI_AS Latinl_General_CI_AS_WS Latinl_General_CI_AS_KS Latinl_General_CI_AS_KS_WS Latinl_General_CS_AI Latinl_General_CS_AI_WS Latinl_General_CS_AI_KS Lat inl_General_CS_AI_KS_WS Latinl General CS AS
Глава 20. Работа с базой данных
891
Latinl_General_CS_AS_WS Latinl_General_CS_AS_KS Latinl_General_CS_AS_KS_WS (17 row(s) affected)
Создание базы данных В предыдущих разделах была рассмотрена подготовка к созданию базы данных. Сейчас пришло время обсудить собственно создание базы данных средствами Transact-SQL, с помощью Enterprise Manager и мастера создания базы данных Create Database Wizard. Начнем рассмотрение создания базы данных с самого сложного метода — Transact-SQL. Перечислим все тонкости этого процесса, а затем перейдем к более простым методам — Enterprise Manager и мастеру Create Database Wizard.
Замечание Каждая инсталляция SQL Server 2000 поддерживает работу с 32 767 базами данных. Прежде чем приступить непосредственно к описанию создания баз данных, стоит немного рассказать, что же представляет собой этот процесс. На уровне операционной системы будет создан набор файлов, который и станет представлять базу данных. Напомним, что каждая база данных как минимум состоит из двух файлов — один для данных и один для журнала транзакций. Помимо этих двух файлов могут быть созданы дополнительные файлы данных и журнала транзакций. Один из файлов данных является первичным (primary) и содержит все системные таблицы базы данных. Помимо этого, в системной таблице sysdatabases системной базы данных Mast e r создается новая строка, которая описывает новую базу данных. В столбце filename этой строки содержится полный путь и имя первичного файла базы данных. Всю остальную информацию о параметрах базы данных, в т. ч. и о количестве и размещении файлов данных и журнала транзакций, сервер получает из системных таблиц базы данных, размещенных в первичном файле. Помимо имени первичного файла, таблица sysdatabases содержит также идентификационный номер базы данных (столбец dbid), идентификатор безопасности владельца базы данных (столбец sid), дату создания (столбец crdate), уровень совместимости (столбец cmptievei) и другую информацию.
(
Замечание
^
Мы рассмотрим явное создание базы данных. Однако существует несколько методов неявного создания баз данных. К ним относится присоединение базы данных и восстановление резервной копии. Последнее было рассмотрено в главе 13, тогда как присоединение базы данных будет рассмотрено в одном из разделов этой главы. Может показаться, что только что созданная база данных не содержит никаких объектов. Однако это не совсем так. Она не содержит пользовательских объектов,
892
Часть IV. Разработка и сопровождение баз данных
но в ней имеется набор системных объектов, необходимых для функционирования базы данных. Например, в каждой базе данных существует набор системных таблиц, которые содержат информацию обо всех объектах базы данных, а также о самой базе данных. Кроме того, в только что созданной базе данных образуются два представления, набор фиксированных ролей и пользователь dbo. Однако в SQL Server 2000 имеется возможность создавать базы данных, содержащие дополнительные объекты. Дело в том, что сервер не выполняет генерирования создаваемой базы данных с нуля, а использует в качестве шаблона базу данных Model. Она состоит всего из двух файлов — одного файла данных и одного файла журнала транзакций. При создании новой базы данных сервер копирует эти файлы и присваивает им указанное имя. Если нужно, то размер файлов изменяется, а также создаются дополнительные файлы. Замечание Описанный алгоритм создания базы данных используется всегда, независимо от того, какой инструмент применялся для создания базы данных. Таким образом, новая база данных содержит все объекты, которые имеются в базе данных Model. Следовательно, если создать в базе данных Model какие-то объекты или закачать данные в предварительно созданные таблицы, то новая база данных будет содержать все эти объекты и данные. Используя эту возможность, довольно легко реализовывать корпоративные стандарты на типы данных, таблицы-справочники, функции, хранимые процедуры и т. д. Изменяя размер файлов базы данных, можно управлять размером по умолчанию, который будут иметь файлы базы данных, а следовательно и сама база данных. Необходимо отметить, что для базы данных Model, как и для базы данных Master, не разрешается определять дополнительные файлы (данных или журнала транзакций). По умолчанию размер файла данных базы данных Model равен 768 Кбайт, а размер файла журнала транзакций — 512 Кбайт.
Использование Transact-SQL Создание базы данных средствами Transact-SQL предоставляет администратору максимальные возможности. Конечно, Enterprise Manager также предоставляет довольно широкие возможности по созданию баз данных, тем не менее, с помощью этого инструмента нельзя выполнить присоединение базы данных как разновидность создания новой базы данных. Тем не менее, Enterprise Manager все же позволяет осуществлять присоединение базы данных. Выполнение присоединения и отсоединения базы данных будет рассмотрено далее в этой главе. Для создания базы данных существует следующая команда Transact-SQL: CREATE DATABASE database_name [ON [ [,...n]] [, [,...n]]] [LOG ON { [ ,...n ]}] [COLLATE collation_name] [FOR LOAD | FOR ATTACH]
Глава 20. Работа с базой данных
893
Замечание Правом создания баз данных, точнее выполнением команды CREATE DATABASE, ПО умолчанию обладают только члены фиксированных ролей сервера sysadmin и dbcreator. Тем не менее, право создания базы данных может быть предоставлено не только включением учетной записи в одну из указанных ролей сервера, но и путем предоставления учетной записи права CREATE D A T A B A S E . Отметим, что это право не выдается при выполнении для учетной записи команды GRANT A L L . Предоставить учетной записи право CREATE D A T A B A S E могут только члены фиксированной роли сервера s y s a d m i n или s e c u r i t y a d m i n . Подробно система безопасности, а в частности и права, были рассмотрены в главе 9.
Рассмотрим назначение параметров команды: П database_name Этот параметр определяет имя, которое будет присвоено базе данных. Имя базы данных указывается в формате Unicode и может быть длиной до 128 символов. Это единственный обязательный параметр команды CREATE DATABASE. Однако для создания базы данных необходимо определить имена файлов данных и журнала транзакций, из которых будет состоять база данных. Когда же команда CREATE DATABASE выполняется только с указанием параметра databasename, то сервер создаст один файл данных и один файл журнала транзакций. Генерирование имен этих файлов будет выполняться на основе имени базы данных, к которому будет добавлен суффикс Data для файла данных и суффикс Log для файла журнала транзакций. Так как длина имен файлов также ограничивается 128 символами, то длина имени базы данных в случае указания только параметра database_name (точнее, не указания имен файлов) ограничивается 123 символами. П ON
Присутствие этого ключевого слова свидетельствует о том, что далее следует определение файлов данных, а также групп файлов, из которых будет состоять база данных. Если параметр ON опускается, то для базы данных будет создан единственный файл данных. По умолчанию размер этого файла равен 768 Кбайт (0,75 Мбайт). Однако этот размер может быть изменен путем внесения соответствующих изменений в базу данных Model. •
LOG ON
После этого ключевого слова указывается набор файлов, из которых будет состоять журнал транзакций базы данных. Если приводится более одного файла, то они должны быть разделены запятой. Как видно из синтаксиса, параметр LOG ON может не указываться. В этом случае журнал транзакций будет состоять из единственного файла, размер которого будет составлять 25% от общего объема всех файлов данных, но не менее 512 Кбайт, и иметь имя, генерируемое на основе имени базы данных, к которому добавляется суффикс Log.
С
Замечание
Описание как файлов данных, так и файлов журнала транзакций выполняется одинаково и будет рассмотрено в одном из следующих разделов. Также в отдельном разделе будет приведено определение групп файлов.
894
Часть IV. Разработка и сопровождение баз данных
П COLLATE collation__name
С помощью этого параметра указывается сопоставление, которое будет иметь база данных. Подробно выбор сопоставления был рассмотрено в разд. "Выбор сопоставления" ранее в этой главе. Если параметр опускается, то будет использоваться сопоставление, определенное на уровне сервера при установке SQL Server 2000. •
FOR LOAD
Этот параметр используется для совместимости с предыдущими версиями SQL Server (до SQL Server 7.0). Параметр FOR LOAD применялся для создания базы данных в состоянии, необходимом для восстановления резервной копии базы данных. При этом создание базы данных заканчивалось выделением для нее дискового пространства (в специальных устройствах) и внесением соответствующей записи в таблицу sysdatabases. Набор же объектов, пользователи и т. д. создавались в результате восстановления резервной копии. Такой подход являлся следствием особенностей работы подсистемы резервного копирования, требующей предварительного создания каркаса базы данных. Начиная с SQL Server 7.0, база данных может быть создана непосредственно в ходе восстановления резервной копии (с помощью команды RESTORE DATABASE), поэтому использование параметра FOR LOAD не требуется. Тем не менее, база данных при указании параметра FOR LOAD переводится в состояние Loading и доступ к ней разрешается только владельцу базы данных (режим dbo use only). •
FOR ATTACH
Параметр FOR ATTACH позволяет не создавать новой базы данных в полном смысле, а выполнить присоединение существующей базы данных. Подробно присоединение и отсоединение баз данных будут рассмотрены в следующих разделах этой главы. Сейчас же скажем, что применение параметра FOR ATTACH требует наличия файлов данных и журнала транзакций, полный путь к которым, а также их имя и необходимо указать. Результатом выполнения команды CREATE DATABASE с использованием параметра будет лишь создание в таблице sysdatabases новой строки со ссылкой на первичный файл присоединяемой базы данных. Собственно же создание файлов выполняться не будет. В двух следующих разделах будет рассмотрено описание файлов базы данных, а также групп файлов.
Описание файлов В соответствии с названием в этом разделе рассмотрим, каким образом описываются файлы базы данных. Как уже было сказано, и файлы данных, и файлы журнала транзакций определяются одинаково — с помощью конструкции
Глава 20. Работа с базой данных
895
Конструкция : : = [ PRIMARY ] ( [NAME = l o g i c a l _ f i l e _ n a m e , ] FILENAME = ' o s _ f i l e _ n a m e ' [, SIZE = s i z e ] [, MAXSIZE = { max_size | UNLIMITED}] [, FILEGROWTH = g r o w t h _ i n c r e m e n t ] ) [ , . . . n ]
Рассмотрим назначение и использование приведенных параметров: •
PRIMARY
С помощью данного параметра указывается файл, который будет первичным. В первичном файле располагаются все системные объекты, а следовательно и описание структуры все базы данных. Напомним, что первичный файл существует только для файлов данных, поэтому указание параметра PRIMARY при описании файлов журнала транзакций не разрешается. Наличие в группе файлов первичного файла определяет группу файлов как первичную. Только один файл может быть указан как первичный. Если параметр PRIMARY не указан ни для одного файла, то первичным файлом будет являться самый первый файл в списке, т. е. указанный непосредственно после ключевого слова ON. П
NAME = logical_file_name Посредством данного параметра указывается логическое имя файла базы данных. Именно с помощью этого имени пользователи будут ссылаться на описываемый файл базы данных. Логическое имя можно рассматривать как своего рода псевдоним, позволяющий избавиться от физических имен, которые обычно довольно длинные. При выборе логического имени следует придерживаться стандартных правил именования объектов. При необходимости разрешается заключать имена в ограничители. Логическое имя файла должно быть уникальным в пределах базы данных.
П
FILENAME = ' o s _ f i l e _ n a m e '
Этот параметр предназначен для определения физического имени файла. Если логическое имя используется при работе с файлом на уровне SQL Server 2000, то физическое имя предназначено для работы на уровне операционной системы и представляет собой совокупность собственно имени файла и полного пути к нему. Разрешается размещение файла в любом каталоге любого локального диска. Однако не допускается размещение файлов на сетевых ресурсах и сжатых (compressed) дисках. Если предполагается использовать для создания файла сырой раздел, то нужно привести только букву соответствующего диска. При этом для файла не разрешается указание начального (параметр SIZE) И максимального размера файла (параметр MAXSIZE), а также шага прироста (параметр FILEGROWTH). Замечание Сжатые диски, а также каталоги или отдельные файлы создаются посредством установки атрибута Compressed в файловой системе NTFS (для операционных систем Windows NT 4.0 или Windows 2000) или с помощью специальных про-
896
Часть IV. Разработка и сопровождение баз данных граммных средств, таких как, например dblspace или drvspace (в операционной системе Windows 95/98).
Замечание Напомним, что по умолчанию первичному файлу данных присваивается расширение mdf, вторичному — ndf, а файлам журнала транзакций — расширение Idf. Тем не менее, разрешается указание любых других расширений. Однако не стоит злоупотреблять этим, т. к. это может затруднить работу с файлами. •
SIZE = s i z e Данный параметр позволяет указывать размер, который будет иметь описываемый файл базы данных сразу же после создания. Если данный параметр опускается, то при создании вторичного файла (secondary file) данных он будет иметь размер 1 Мбайт. Для первичного файла данных по умолчанию используется тот же размер, который имеет первичный файл системной базы данных Model. Минимальный размер, который может иметь файл базы данных (как данных, так и журнала транзакций), составляет 512 Кбайт. Размер файла может задаваться как целое число. Тем не менее, допускается использование различных суффиксов, означающих различную величину — кв для килобайт, мв для мегабайт, GB ДЛЯ гигабайт и тв для терабайт. Таким образом, вместо указания значения 0,5 мв необходимо указывать 512 кв. Если никакой суффикс не указан, то по умолчанию используется мв.
•
MAXSIZE = { max_size | UNLIMITED } Если с помощью предьщущего параметра указывается первоначальный размер файла, то рассматриваемый параметр предназначен для определения максимального размера, до которого будет разрешено автоматическое увеличение файла. Конечно, данная опция имеет смысл только в том случае, если вообще разрешено автоматическое увеличение размера файла. Если параметр MAXSIZE опускается, то файл будет увеличиваться до тех пор, пока не заполнит все доступное пространство на диске. К аналогичному результату приведет указание значения UNLIMITED. ДЛЯ указания максимального размера файла (параметр max_size) используется тот же синтаксис, что и для параметра SIZE.
Замечание Автоматическое увеличение размера файла не выполняется, если оценочный размер файла после увеличения будет превышать максимальный размер. FILEGROWTH = g r o w t h _ i n c r e m e n t • Используя данный параметр, можно указать шаг приращения (growth increment), в соответствии с которым сервер будет автоматически увеличивать размер файла. Шаг приращения может быть задан либо как абсолютное, либо как относительное значение. Разрешается применение суффиксов кв, мв, GB, тв и %. Указание любого из первых четырех суффиксов рассматривается как указание абсолютного шага приращения, тогда как суффикса % — как
Глава 20. Работа с базой данных
897
относительное. Если шаг приращения приводится без суффикса, то автоматически используется суффикс мв. Шаг приращения может указываться только как целое число. При конфигурировании относительного шага приращения следует учитывать, что собственно шаг приращения (в абсолютном выражении) вычисляется относительно первоначального размера файла (указанного с помощью параметра SIZE), а не относительно текущего размера файла, но округляется в ближайшую сторону до 64 Кбайт. Это же значение является минимальным при работе с абсолютным шагом приращения. При выборе шага приращения следует учитывать, что размер файла после первого увеличения размера не должен превышать значения, указанного с помощью параметра MAXSIZE. В противном случае размер файла не будет увеличен. О•[ , . . . п ] Наличие в синтаксисе данного параметра говорит 6 том, что конструкция < f i i e s p e o может представлять собой описание более одного файла. Если описывается более одного файла, то они должны разделяться запятой. Мы полностью рассмотрели синтаксис конструкции < f i i e s p e o . Теперь же приведем пример практического использования этой конструкции. Опишем три файла базы данных: PRIMARY (NAME=PriDataFile, FILENAMESC:\SQL2000\primary' , SIZE=100 M B ) , (NAME=SecFilel, FILENAME^'C:\SQL2000\secl1, SIZE=100 MB, MAXSIZE=300, FILEGROWTH=25%) (NAME=SecFile2, FILENAME^C:\SQL2000\sec2 1 , SIZE=30MB, FILEGROWTH=5 MB)
Как нетрудно заметить, в приведенном примере описывается набор файлов данных. То есть указанный текст должен быть помещен в команде CREATE DATABASE после ключевого слова ON. ПО аналогии с приведенным примером можно описать и файл журнала транзакций.
Описание группы файлов Предыдущий раздел был посвящен рассмотрению описания файлов, из которых будет состоять база данных. В этом же разделе, в соответствии с его названием, будет рассмотрено описание групп файлов. Напомним, что группы файлов можно создавать только для файлов данных. Объединение в группы файлов журнала транзакций не разрешается. Итак, группы файлов описываются с помощью конструкции имеющей синтаксис:
,
::= FILEGROUP filegroup_name [ ,...n ]
Таким образом, группа файлов определяется путем указания ключевого слова FILEGROUP, после которого следует имя группы. Далее же указывается набор файлов, которые будут входить в соответствующую группу файлов. Как видно,
898
Часть IV. Разработка и сопровождение баз данных
входящие в группу файлы описываются с помощью той же самой конструкции
Замечание В представленной группе файлов содержится первичный файл, что автоматически делает созданную группу файлов первичной группой.
Пример создания базы данных В предыдущих разделах были приведены практически все сведения, необходимые для создания базы данных. Однако чтобы облегчить восприятие предложенного материала, рассмотрим несколько примеров создания баз данных. С помощью представленной ниже команды можно создать на сервере базу данных Northwind, которая будет состоять из одного файла данных и одного файла журнала транзакций: CREATE DATABASE [Northwind] ON (NAME=N'Northwind', FILENAME= N'G:\Program Files\Microsoft SQL Server\MSSQL$TRELON\data\northwnd.mdf', SIZE=4, FILEGROWTH=10%) L O G O N (NAME=N'Northwind_log', FILENAME= N'G:\Program Files\Microsoft SQL Server\MSSQL$TRELON\data\northwnd.ldf , SIZE=1, FILEGROWTH=10%) COLLATE Cyrillic_General_CI_AS
Приведенный код получен путем генерирования сценария для базы данных Northwind, которая автоматически создается при установке SQL Server 2000. Скорее всего, при попытке выполнения данного кода сервер выдаст сообщение об ошибке, гласящее о невозможности создать базу данных вследствие существования в системе одноименной базы данных. Хотя рассмотренный вариант команды CREATE DATABASE сравнительно небольшой, все же существует возможность еще больше уменьшить размер кода команд, приняв для всех параметров, кроме имени базы данных, значение по умолчанию: CREATE DATABASE mydatabase
Глава 20. Работа с базой данных
899
Теперь же приведем пример, в котором будет создана база данных FirewaiiLog, состоящая их трех файлов данных и двух файлов журнала транзакций: CREATE DATABASE FirewaiiLog ON PRIMARY (NAME=FirewallPrimary, FILENAME='c:\Firewall\Firewalldatal.mdf' , SIZE=120 MB, MAXSIZE=300, FILEGROWTH=15%), (NAME=FirewallSecl, FILENAME^c:\Firewall\Firewalldata2.ndf', SIZE=150 MB, FILEGROWTH=25 M B ) , ( NAME=FirewallSec2, FILENAME='c:\Firewall\Firewalldata3.ndf, SIZE=150 MB, MAXSIZE=300, FILEGROWTH=25%) LOG ON (NAME=Firewalllogl, FILENAME='c:\Firewall\Firewalllogl.ldf', SIZE=10 MB, MAXSIZE=50 MB, FILEGROWTH=5), (NAME=Firewalllog2, FILENAME='c:\Firewall\Firewalllog2.ldf, SIZE=10, MAXSIZE=50, FILEGROWTH=50%)
В завершение представим еще один пример, демонстрирующий использование групп файлов. Будет создана база данных stdDB, включающая три группы файлов, каждая из которых будет состоять из трех файлов. Журнал же транзакций будет состоять из двух файлов, размещенных на разных дисках: CREATE DATABASE StdDB FILEGROUP PrimGroup PRIMARY (NAME=StdDB_prm, FILENAME='c:\SQL2000\DataBase\StdDB_Primary.mdf', SIZE=75, MAXSIZE=150, FILEGROWTH=15), (NAME=StdDB_secl, FILENAME='d:\SQL2000\DataBase\StdDB_Secondaryl.ndf', SIZE=20, MAXSIZE=50, FILEGROWTH=20%), (NAME=StdDB_sec2, FILENAME='d:\SQL2000\DataBase\StdDB_Secondary2.ndf', SIZE=20, MAXSIZE=50, FILEGROWTH=20%), FILEGROUP Groupl (NAME=StdDB_sec3, FILENAME='с:\SQL2000\DataBase\StdDB_Secondary3.ndf', SIZE=30, MAXSIZE=150, FILEGROWTH=20%), (NAME=StdDB_sec4, FILENAME='d:\SQL2000\DataBase\StdDB_Secondary4.ndf', SIZE=20, MAXSIZE=150, FILEGROWTH=20%), (NAME=StdDB_sec5, FILENAME='e:\SQL2000\DataBase\StdDB_Secondary5.ndf', SIZE=20, MAXSIZE=150, FILEGROWTH=20%), FILEGROUP Group2 (NAME=StdDB_seсб, FILENAME='с:\SQL2000\DataBase\StdDB_Secondary6.ndf' , SIZE=30, MAXSIZE=50, FILEGROWTH=25%), (NAME=StdDB_sec7, FILENAME^'d:\SQL2000\DataBase\StdDB_Secondary7.ndf', SIZE=30, MAXSIZE=50, FILEGROWTH=25%), (NAME=StdDB_sec8, FILENAME='e:\SQL2000\DataBase\StdDB_Secondary8.ndf', SIZE=30, MAXSIZE=50, FILEGROWTH=25%),
900
Часть IV. Разработка и сопровождение баз данных
LOG ON (NAME=StdDB_Logl, FILENAME='с:\SQL2000\DBLog\StdDB_Logl.ldf, SIZE=25 MB, MAXSIZE=75 MB, FILEGROWTH=5 MB) (NAME=StdDB_Log2, FILENAME='d:\SQL2000\DBLog\StdDB_Log2.ldf, SIZE=25 MB, MAXSIZE=75 MB, FILEGROWTH=5 MB)
Использование Enterprise Manager В предыдущих разделах было рассмотрено создание базы данных средствами Transact-SQL. Хотя описанный метод и не является чересчур сложным, все же для некоторых пользователей он может представлять затруднение. В этом случае создание базы данных можно осуществить средствами графического интерфейса Enterprise Manager. С помощью этого инструмента можно не только создавать базы данных, но и управлять ими, а также удалять их. В общем случае использование Enterprise Manager по сравнению с непосредственным использованием команд Transact-SQL может заметно сократить время, необходимое на создание баз данных. Работа с Enterprise Manager не требует знания синтаксиса команды CREATE DATABASE, что является неоспоримым достоинством. •щ SQL Server Enterprise Manager [Console RootyMicrosoft SQL 5ervers\MATR
т jfictionVe iw Toos l j i <=> —• | © [Ё * 1 Щ ! Й ; T f ! ^ ^ ' 0 ' 8 l Q ; Databases 11 Items Tree :'.l.1 Consoe l Root _^j - *~Jj Mc irosoft SQL Servers § J а ш - ^3 MATRX I Servers Chari Cone fe rnc Dekanat DocExch &) f) CIT ; ЕйЩ) STORAGE (Windows NT) C.onso e
: :
Window
(Help
H ' j p STORAGE\TRELON (Windows N •'• В "S3 Databases ! ffl- ffi Chair ]• l i Conferenc h i
Dekanat
•j-Q DocExch i-§
:
: • : | : ;
*
master
1-Й MATRIX f У model • Г ] У msdb 3 - й Northwind и У pubs ь~ У tempdb S - Й Data Transformation Servic ' !+] C3 Management S-£3 Replication ffi • £ ] Security ffl Q j Support Services S Q l Me ta Data Services M ^3 C'ther Servers ,
HCi-.ШШ ИРП гдНпп Mnnil-nr f;mnn «1
, 1
Рис. 2 0 . 1 . Папка Databases
,^J •!
|si, M ATR XI ш Q 11 etm pdb
— ,|i£.l 1Щ ' -. rtwnid иmodelшmsdbиNoh
pubs
Глава 20. Работа с базой данных
901
Для управления базами данных SQL Server 2000 используется папка Databases (рис. 20.1), имеющаяся в каждой инсталляции. Непосредственно в этой папке перечисляется набор баз данных, созданных на сервере. Как видно из рисунка, в папке перечислены не только пользовательские базы данных, но и системные. Однако если не предполагается работать с системными базами данных, а также с системными объектами пользовательских баз данных, и наличие их в панели Enterprise Manager только мешает работе, то можно запретить отображение этих объектов. Для этого достаточно открыть окно регистрации сервера Registered SQL Server Properties (рис. 20.2) и сбросить флажок Show system databases and system objects. Для открытия окна свойств сервера достаточно в контекстном меню сервера выбрать команду Edit SQL Server Registration Properties.
General I dfca
.
'•Щ AJ Server: Connection С Use SQL Server authentication Login Name: Password: Г
-:.-;.,
0 ptions
Server Group:
ompMc login i . •
|
Sb I*' .Display SQL Server state in console P7 Show system databases and system objects f? Automaticaly start SQL Server when connecting OK
Cancel
Help
Рис. 2 0 . 2 . Папка Registered SQL Server Properties
Создание новой базы данных выполняется с помощью окна Database Properties (рис. 20.3). Открыть это окно можно разными способами: П выбрав в контекстном меню папки Databases команду New Database; П щелкнув правой кнопкой мыши на пустом пространстве правой части и выбрав в открывшемся контекстном меню команду New Database; П нажав в панели инструментов Enterprise Manager кнопку New Database; • выбрав в меню Action команду New Database. Как видно, Enterprise Manager позволяет выполнить одно и то же действие различными способами. В дальнейшем, при описании создания объектов базы данных, мы не будем упоминать все доступные способы открытия окна для созда-
Часть IV. Разработка и сопровождение баз данных
902
ния объекта. Однако в большинстве случаев в распоряжении пользователя будут все указанные способы вызова окон создания объектов. Database Properties - Chair General I Data Files | Transaction Log | Harne:
Chari
Database Status: Owner: Date created: Size: Space available: Number of users: Backup Last database backup: Last transaction log backup: Maintenance : Maintenance plan: Collation name:
(Unknown) (Unknown) (Unknown) (Unknown) (Unknown) (Unknown) None None None Cyri ic_Genaal General C Cj irililc CII_AA SS KS Cyrilc_Geneial_CI_AS_KS_WS Cyrilic General CI AS WS OK
Cancel
Help
Рис. 20.3. Окно Database Properties базы данных C h a i r
Как видно из рисунка, окно Database Properties имеет три вкладки. Рассмотрим поочередно работу с каждой из них. Первая вкладка имеет имя General (см. рис. 20.3) и предназначена для указания имени базы данных и сопоставления, которое будет использоваться для базы данных. Проводя аналогию с командой CREATE DATABASE, с помощью вкладки General устанавливаются значения для параметров database_name И COLLATE collation_name. Остальные элементы управления вкладки General предназначены для предоставления пользователю различной информации о базе данных. На момент создания базы данных этой информации еще не существует, и поэтому указываются значения (Unknown) (неизвестно) и None (нет). Подробно назначение элементов группы Database и Backup будет рассмотрено позже в этой главе. При выборе имени базы данных, которое должно быть введено в поле Name, следует придерживаться тех же правил, которые используются при непосредственной работе с командой CREATE DATABASE. Сопоставление, которое будет иметь база данных, выбирается с помощью раскрывающегося списка Collation name. По умолчанию список содержит значение (Server default), что предписы-
Глава 20. Работа с базой данных
903
вает применять для базы данных то же сопоставление, что было указано на уровне сервера при установке SQL Server 2000. Однако можно выбрать и любое другое сопоставление. Подробно выбор сопоставления был рассмотрен ранее в этой главе в разд. "Выбор сопоставления".
С
Замечание
Если открыть окно свойств созданной базы данных, то можно увидеть, что вместо раскрывающегося списка Collation name появится текстовое поле, в котором будет указано выбранное при создании базы данных сопоставление. Таким образом, изменить сопоставление после создания базы данных не удастся. Поэтому следует внимательно отнестись к его выбору. Перейдем же к рассмотрению вкладки Data Files (рис. 20.4), предназначенной для определения файлов данных, из которых будет состоять создаваемая база данных. Database Properties- Chair General Data Files.]Transaction Log | Database files File Name Chair Data Chait_Sec1 Chart Sec2
j Location Initial size (MB) ?|ON\data\Chari Data.MDF| 25 G:\Program Files\Micros... 10 „, G:\ProgramFilesSMicros... 10
File properties -
•
j Filegroup PRIMARY Secondary Secondary
Delete г-Р7 Automatically grow file File growth
Maximum file size
С |n megabytes:
(* JJnrestricted file growth
(* йу percent:
С
Restrict file growth (MB):
OK
Cancel
Help
Рис. 20.4. Окно Database Properties, вкладка Data Files
В верхней части вкладки Data Files расположена таблица Database files, с помощью которой собственно и определяются файлы базы данных. В столбце File Name указывается логическое имя файла, которое соответствует параметру NAME=iogicai f i l e name, используемому при описании файлов в команде
904
Часть IV. Разработка и сопровождение баз данных
CREATE DATABASE. В столбце же Location задается полный путь и имя файла операционной СИСТеМЫ, ЧТО Соответствует Параметру FILENAME='os_file_name' . Отметим, что указанный в столбце Location файл не должен существовать на момент создания базы данных. Путь и имя файла могут быть введены вручную или выбраны с помощью окна Locate Database File, открыть которое можно с помощью кнопки, расположенной в левой части столбца Location. В столбце Initial size (MB) находится первоначальный размер, который файл будет иметь непосредственно после создания базы данных. Если отсутствует какой-либо суффикс, то подразумевается, что значение указано в мегабайтах. Однако разрешается и явное задание единиц размера файла — кв (килобайт), мв (мегабайт), GB (гигабайт) или тв (терабайт). С помощью столбца Filegroup можно определить группу файлов, к которой должен принадлежать файл. По умолчанию все файлы размещаются в группе файлов PRIMARY. Элемент столбца Filegroup представляет собой раскрывающийся список, содержащий перечень доступных групп файлов. Тем не менее, помимо выбора существующего значения также разрешается ввод имени новой группы, которое автоматически вносится в список. (
Замечание
^
Первый файл, указанный в таблице Database files, всегда рассматривается как первичный файл (primary file). Поэтому он может быть размещен только в первичной группе файлов ( P R I M A R Y ) . Указать в качестве первичного файла иной файл средствами Enterprise Manager нельзя.
По умолчанию Enterprise Manager предлагает создать для базы данных единственный файл данных, о чем свидетельствует наличие одной строки в таблице Database files. Если необходимо внести дополнительные файлы, достаточно описать их в этой таблице. Если какой-то файл был указан ошибочно, то для его удаления достаточно нажать кнопку Delete. (
Замечание
^
Заметим, что описание файла в таблице Database files не приводит сразу же к его созданию. Файлы будут образованы только после нажатия кнопки ОК.
Помимо сведений, указываемых в таблице Database files, файлы базы данных имеют дополнительные свойства, такие как максимальный размер и шаг прироста. Управление этими свойствами осуществляется с помощью группы элементов управления File properties, расположенной в нижней части вкладки Data Files. Управление свойствами осуществляется персонально для каждого файла. Центральную роль при конфигурировании дополнительных свойств файла играет флажок Automatically grow file. Установка этого флажка конфигурирует файл для разрешения автоматического увеличения размера. Если же флажок сброшен, то все остальные элементы управления группы File properties будут недоступны. С помощью переключателя File growth контролируется величина, на которую будет увеличиваться размер файла:
Глава 20. Работа с базой данных
905
П In megabytes — в этом случае указывается конкретное количество мегабайт, на которое будет увеличиваться файл; D By percent — этот вариант позволяет задавать шаг приращения в виде процента от первоначального размера файла. По умолчанию переключатель стоит именно в этом положении и предлагается шаг приращения, равный 10%. В правой же части вкладки расположен переключатель Maximum file size, с помощью которого можно определить, будет ли ограничиваться максимальный размер файла или нет: • Unrestricted file growth. При установке переключателя в это положение, также используемое по умолчанию, максимальный размер файла не ограничивается. Он может увеличиваться до тех пор, пока не займет все свободное пространство на диске. • Restricted file growth (MB). В этом случае необходимо указать максимальное количество мегабайт, до которого будет выполняться увеличение размера файла. На этом работа со вкладкой Data Files заканчивается. Перейдем к рассмотрению работы со вкладкой Transaction Log (рис. 20.5), которая предназначена для управления файлами журнала транзакций. Database Properties - Chair General | Data Files Transaction Log ^Transaction log files — File Name Chair_Log
—1 Location Nnitiaisize(MB) ...; G:\Program Files\Microsoft S.. 5
Fe li propee rtis HFf Automactia yll go rw fe li i r- Fe li growh t ! p |n megabye ts: С fiy percent:
•••••• Deele t
1 г Maximum file size ( i ] **" Unrestricted file growth —I \ \f
Restrict file growth (MB):
OK
Cancel
Help
Рис. 2 0 . 5 . Окно Database Properties, вкладка Transaction Log
906
Часть IV. Разработка и сопровождение баз данных
Как видно из рисунка, вкладка Transaction Log в значительной степени напоминает вкладку Data Files. Единственное различие между ними состоит в том, что при определении файлов журнала транзакций нельзя работать с группами файлов. После того, как все файлы базы данных будут определены, а также указано имя базы данных и сопоставление, остается только нажать кнопку ОК. После этого Enterprise Manager приступит к непосредственному созданию базы данных. Для этого он сгенерирует код команды CREATE DATABASE на основе введенных пользователем значений и выполнит его. На этом рассмотрение создания базы данных средствами Enterprise Manager можно считать оконченным.
Использование мастера Create Database Wizard К настоящему моменту мы рассмотрели создание базы данных двумя методами из трех — с помощью средств Transact-SQL и с использованием Enterprise Manager. Данный же раздел будет посвящен рассмотрению самого простого метода создания базы данных, который могут использовать даже те пользователи, которые имеют минимум знаний. Этот метод подразумевает использование мастера Create Database Wizard. Запуск мастера можно выполнить с помощью окна Select Wizard, открыть которое можно с помощью кнопки Run a Wizard, имеющейся в панели инструментов Enterprise Manager. Окно содержит список практически всех мастеров, имеющихся в распоряжении пользователя. Нужный нам мастер находится в папке Database. Первое окно мастера содержит перечень данных, которые необходимо ввести в окнах мастера. Никаких элементов управления, имеющих непосредственное отношение к созданию базы данных, в первом окне мастера нет. Поэтому можно смело переходить к следующему окну. Второе окно мастера имеет название Name the Database and Specify its Location (рис. 20.6) и содержит следующие элементы управления: П Database name. В этом поле необходимо указать имя, которое будет иметь база данных. П Database file location. С помощью этого текстового поля необходимо указать каталог, в котором будут размещены файлы данных, определяемые в одном из следующих окон мастера. Отметим, что в указанном каталоге будут расположены все файлы данных. Каталог может быть указан как вручную, так и выбран визуально с помощью окна Select a directory for the files, открыть которое можно с помощью кнопки ЦЦ, расположенной непосредственно справа от поля. • Transaction log file location. Это поле предназначено для указания каталога, в котором будут размещены все файлы журнала транзакций. В принципе, для размещения файлов журнала транзакций может быть указан тот каталог, что
Глава 20. Работа с базой данных
907
и для размещения файлов данных. То есть значения в этом и предыдущем поле могут совпадать. Create Database Wizard - STQRAGEVTRttON Name the Database and Specify its Location Specify a name for the database, following the rules for identifiers. Type or select a location for the database.
Database name: Administrator Database Database file location: GAProgram Files\Microsoft SQL ServeAMSSQL$TRELON\data\ Transaction log file location: IG:\Progfam Files\Microsoft SQL Server\MSSQL$TRELON\data\
< Back
Next>
Cancel
Рис. 20.6. Окно Name the Database and Specify its Location мастера Create Database Wizard
Замечание По умолчанию предлагается разместить файлы данных и журнала транзакций в каталогах, указанных на вкладке Database Settings (см. рис. 8.9) окна свойств сервера, соответственно, в полях Default data directory и Default log directory.
После того, как будет указано имя создаваемой базы данных, а также размещение файлов данных и журнала транзакций, можно переходить к очередному окну мастера, которое называется Name the Database Files (рис. 20.7). С помощью этого окна определяется список файлов данных. Набор файлов формируется с помощью таблицы Database files, которая имеет всего два столбца — File Name и Initial Size (MB), с помощью которых соответственно определяется имя файла и его начальный размер. Указанное в столбце File Name значение станет использоваться и в качестве логического, и в качестве физического имени файла базы данных. Все файлы данных будут расположены в одном и том же каталоге, который был указан в поле Database file location предыдущего окна мастера. Как видно, в окне Name the Database Files формируется только список файлов. Однако в этом окне не указывается ни возможность автоматического увеличения файла, на максимальный размер, ни шар прироста. Эти параметры конфи-
Часть IV. Разработка и сопровождение баз данных
908
гурируются с помощью следующего окна мастера, имеющего имя Define the Database File Growth (рис. 20.8).
2<J Create Database Wizard - STORAGET \R£LON Name the Database Files Specfiy the name of one or more files in whci h the database is contained. Specfiy the initial file size for each of the files. Database files: File Name Admn i si trator Database_Data Admn i si trator Database Sec
i Initial Szi e (MB)
< Даек
Next >
Cance
Рис. 20.7. ОКНО Name the Database Files мастера Create Database Wizard Create Database Wizard - STORAGEVTREiON
ill
Define the Database File Growth Specify whether the database files should grow automatically, 01 grow only when you enlarge them. *"* До not automatically grow the database files
С Grow the files in megabytes (MB): (* Grow the files by percent:
10
1
I Maximum file size I
(* Unrestricted file growth С Restrict file growth to MB:
< Back
Next >
Cancel
Рис. 20.8. ОКНО Define the Database File Growth мастера Create Database Wizard
Глава 20. Работа с базой данных
909
Замечание Мастер не позволяет определить принадлежность файлов данных к той или иной группе файлов, как, впрочем, и определять собственно группы файлов. Все файлы данных будут включены в первичную группу файлов (primary file group). В верхней части окна находится переключатель, с помощью которого контролируется сама возможность автоматического увеличения размера файлов сервером. Этот переключатель может быть установлен в одно из положений: П Do not automatically grow the database files — автоматическое увеличение размера файла запрещено; D Automatically grow the database files — в этом случае сервер будет самостоятельно осуществлять увеличение размера файлов базы данных. ЗаП\лечание Отметим, что мастер не позволяет контролировать возможность роста каждого файла в отдельности, как и управлять параметрами увеличения индивидуально каждого файла данных. Взамен мастер предлагает указать параметры, которые будут использоваться для всех файлов. При установке переключателя в последнее положение становятся доступными несколько дополнительных элементов управления: •
Grow the files in megabytes (MB). Прирост файлов будет задан как абсолютное значение в мегабайтах. Указанное значение станет использоваться для всех файлов.
•
Grow the files by percent. Величина, на которую будет увеличиваться размер каждого из файлов, задается как процент от его первоначального размера.
О Maximum file size. С помощью этого переключателя указывается, будет ли ограничиваться максимальный размер файла: •
Unrestricted file growth — размер файла не ограничивается;
•
Restrict the file growth to MB — указывается количество мегабайт, до которого будет разрешено увеличение любого файла данных.
Замечание Следует быть внимательным при конфигурировании значений в окне Define the Database File Growth. Дело в том, что указываемые значения относятся ко всем файлам. Например, определяя максимальный размер файлов, следует следить за тем, чтобы он не был меньше размера какого-нибудь файла, а также позволял выполнять увеличение размера файла. После того, как параметры автоматического увеличения файлов данных будут определены, можно переходить к следующему окну мастера, называющемуся Name the Transaction Log Files (рис. 20.9).
Часть IV. Разработка и сопровождение баз данных
910
Create Database Wizard - STORAGE\TRELON Name the Transaction Log Files Specify the name of one or more files in which the transaction log is contained. Q Specify the initial file size for each of the files. Jransaction log files: File Name Adrninistratof Database Log
t
Initial Size (MB)
< Back i
Next >
Cancel
Рис. 20.9. Окно Name the Transaction Log Files мастера Create Database Wizard Create Database Wizard - STORAGE\TREL0N Define the Transaction Log File Growth Specify whether the transaction log files should grow automatically, or grow only when you explicitly enlarge them. С Ер no
„.
>n log files!
~(* Automatically grow the transaction log files
-
(* Grow the files in megabytes (MB): f
Grow the files by eercent:
r Maximum file size -1 |
<"* Unrestricted file growth
!
<• Restrict file growth to MB:
< Back
Next >
Cancel
Рис. 20.10. Окно Define the Transaction Log File Growth мастера Create Database Wizard
Как видно из рисунка, окно мастера Name the Transaction Log Files весьма напоминает окно Name the Database Files (см. рис. 20.7), рассмотренное ранее. Однако если последнее использовалось для определения файлов данных, то ок-
Глава 20. Работа с базой данных
911
но Name the Transaction Log Files предназначено для определения файлов журнала транзакций. Мы уже рассматривали работу с элементами управления, имеющимися в окне, поэтому перейдем к следующему окну мастера. Окно Define the Transaction Log File Growth (рис. 20.10) позволяет конфигурировать автоматическое увеличение размера файлов журнала транзакций. Работа с этим окном практически не отличается от работы с окном Define the Database File Growth, описанным ранее. На этом конфигурирование базы данных заканчивается. Следующее же окно мастера будет последним. В нем приведена информация о свойствах создаваемой базы данных. Например, при вводе в окна мастера указанных на рисунках значений в последнем окне будет приведена следующая информация: The name of the database is Administrator Database. The database files will be placed in the directory G:\Program Files\Microsoft SQL Server\MSSQL$TRELON\data. The transaction log files will be placed in the directory G:\Program Files\Microsoft SQL Server\MSSQL$TRELON\data. The database files are: Administrator Database_Data, size 10 Administrator Database_Sec, size 5 The database files will automatically grow by 10 percent. The database files' growth is unrestricted. The transaction log files are: Administrator Database_Log, size 10 The transaction log files will automatically grow by 5 Mb. The transaction log files' growth is restricted to 50 Mb.
После нажатия кнопки Finish мастер сгенерирует на основе введенной в окнах информации код команды C R E A T E D A T A B A S E И попытается выполнить его. В случае успешного его выполнения будет создана новая база данных.
Управление свойствами базы данных Предыдущие несколько разделов были посвящены описанию различных методов создания базы данных. Когда же база данных успешно создана, можно организовывать в ней различные объекты, пользователей, роли, закачивать данные и выполнять множество других операций. Одной из этих операций является управление свойствами базы данных. Каждая база данных характеризуется множеством свойств, установка которых в то или иное состояние может значительно изменить поведение сервера при разе Зак. 83
912
Часть IV. Разработка и сопровождение баз данных
боте с этой базой данных. Этот раздел будет посвящен подробному рассмотрению управления различными свойствами базы данных, многие из которых бывают весьма полезны. Непосредственно после создания база данных конфигурируется таким образом, что с ней сразу же можно начинать работать. Управление базой данных можно осуществлять как средствами Transact-SQL, так и с помощью Enterprise Manager. К сожалению, в составе SQL Server 2000 нет мастера конфигурирования базы данных, однако и использование Enterprise Manager не представляет больших сложностей. Мы рассмотрим отдельно оба указанных метода управления базой данных. Transact-SQL Хотя создание базы данных и выполняется достаточно просто, тем не менее, база данных является довольно сложным компонентом, поэтому и управление ею осуществляется с различных сторон. В следующих разделах будет рассмотрено использование различных средств, предоставляемых Transact-SQL для управления базами данных.
Процедура sp_dboption В общем случае управление свойствами базы данных предлагается выполнять с помощью системной хранимой процедуры sp_dboption. Она позволяет просматривать и изменять основные свойства базы данных. Рассмотрим синтаксис указанной хранимой процедуры: sp_dboption [ [ Sdbname = ] 'database' ] [, [ @optname = ] 'option_name'] [, [ @optvalue = ] 'value']
Замечание Использовать все возможности процедуры (т. е. изменять параметры базы данных) могут только члены фиксированных ролей сервера s y s a d m i n и d b c r e a t o r , а также члены фиксированной роли базы данных db_owner (членом которой всегда является пользователь dbo). Просматривать же состояние тех или иных свойств базы данных может любой пользователь базы данных.
Как видно, процедура sp_dboption имеет всего три параметра, и все они не являются обязательными. При вызове процедуры без параметров будет выведен список всех опций конфигурации баз данных SQL Server 2000: EXEC sp_dboption
Возвращается следующий результат: Settable database options: ANSI ANSI ANSI ANSI
null default nulls padding warnings
Глава 20. Работа с базой данных
913
arithabort auto create statistics auto update statistics autoclose autoshrink concat null yields null cursor close on commit dbo use only default to local cursor merge publish numeric roundabort offline published quoted identifier read only recursive triggers select into/bulkcopy single user subscribed torn page detection trunc. log on chkpt.
Однако мы рассматриваем хранимую процедуру sp_dboption как средство управления опциями конфигурации базы данных, что требует знания назначения параметров процедуры. Рассмотрим же их: О
[Sdbname =] 'database'
С помощью этого параметра указывается имя базы данных, о которой необходимо получить информацию. О
[@optname =] 'option_name'
Данный параметр предназначен для указания имени опции базы данных, состояние которой необходимо просмотреть или изменить. Список всех возможных значений этого параметра как раз и выводится при запуске процедуры sp_dboption без указания параметров. Назначение же каждого из параметров приведено в табл. 20.1. О
[Soptvalue = ]
'value'
Параметр применяется при изменении состояния той или иной опции. Каждая опция конфигурации базы данных может быть либо установлена, либо сброшена. В соответствии с этим параметр goptvalue может принимать либо значения TRUE ИЛИ ON, ЧТО соответствует установленной опции, либо значения FALSE или OFF, что приведет к сбросу опции. Таблица 20.1. Опции конфигурации
базы данных
Параметр
Описание
ANSI n u l l d e f a u l t
Установка опции предписывает серверу во время создания таблицы при принятии решения о поддержке столбцом возможности хранения значений N U L L следовать правилам, определенным стандартом ANSI SQL-92
914
Часть IV. Разработка и сопровождение баз данных
Таблица 20.1 (продолжение) Параметр
Описание
ANSI nulls
При установленной опции если логическое условие содержит значение NULL, то всегда будет возвращаться значение UNKNOWN, а не T R U E ИЛИ F A L S E . При сброшенной опции T R U E
будет возвращено в случае, когда оба сравниваемых выражения равны NULL. В противном случае возвращается FALSE
ANSI padding
Определяет поведение сервера при вставке в столбец значения, не полностью заполняющего его. При установленной опции сервер дополняет столбец конечными нулями или пробелами, а при сброшенной опции, наоборот, осуществляет удаление конечных нулей и пробелов
ANSI warnings
Управляет выдачей сообщений при возникновении ошибок, таких, например, как деление на ноль. Когда деление на ноль происходит при установленной опции, сервер будет выдавать сообщение об ошибке. При сброшенной же опции сообщение об ошибке появляться не будет
arithabort
Управляет прерыванием запросов или транзакций при возникновении ошибок, таких как деление на ноль или переполнение. При установленной опции в случае возникновения ошибки производится откат транзакции. Когда же опция сброшена, возвращается значение NULL и выполнение запроса или транзакции продолжается. Используя совместно с предыдущей опцией, можно контролировать выдачу сообщений об ошибке
auto create statistics
Установка опции разрешает серверу автоматическое создание статистики для таблиц базы данных. Статистика используется оптимизатором запросов для построения наиболее оптимальных планов исполнения запросов, пакетов, хранимых процедур и т. д.
auto update statistics
Установка опции разрешает серверу автоматическое обновление статистики для таблиц базы данных. Автоматическое обновление статистики позволяет оптимизатору запросов генерировать более эффективные планы исполнения, но требует определенных затрат процессорного времени на анализ информации
autoclose
При установленной опции сервер будет выгружать базу данных из памяти в случае завершения работы всех пользователей, работавших с этой базой данных. Это позволяет экономить оперативную память, но при повторном обращении к базе данных потребуется некоторое время на ее загрузку в память
autoshrink
При установленной опции сервер будет периодически выполнять автоматическое уменьшение размера файлов данных, возвращая в операционную систему неиспользуемое пространство
Глава 20. Работа с базой данных
915
Таблица 20.1 (продолжение) Параметр
Описание
concat null yields null
При установленной опции в случае конкатенации (объединения) строки со значением NULL будет возвращено значение NULL. При сброшенной же опции значение NULL будет рассматриваться как пустая строка
cursor close on commit
Установка опции предписывает серверу автоматически закрывать открытые курсоры в случае завершения транзакции (как фиксирования, так и отката). Когда же опция сброшена, в случае отката транзакции будет осуществляться закрытие курсора (кроме курсоров STATIC И I N S E N S I T I V E )
dbo use only
Установка этой опции переводит базу данных в режим использования ее только владельцем базы данных. Этот режим используется для выполнения некоторых административных задач, требующих монопольного использования базы данных
default to local cursor
При установленной опции если явно не указан тип курсора, то он будет локальным (LOCAL). При сброшенной опции будет с о з д а в а т ь с я глобальный к у р с о р ( G L O B A L )
merge publish
Установка опции разрешает использовать базу данных в репликации сведением
numeric roundabort
Определяет поведение сервера при попытке задать переменной или столбцу значение с более высокой точностью, чем допускает тип данных. Установка опции предписывает генерировать сообщение об ошибке, тогда как при сброшенной опции выполняется округление, и ошибка не выдается. Прерывание же запроса при установленной опции зависит от состояния опции a r i t h a b o r t
offline
При установленной опции база данных недоступна для работы
published
Установка опции разрешает работу с ней подсистеме репликации
quoted identifier
Определяет поведение двойных кавычек. При установленной опции двойные кавычки рассматриваются как ограничители имени объекта, т. е. ведут себя как квадратные скобки. При сброшенной опции двойные кавычки воспринимаются как ограничители обычных строк, т. е. ведут себя как одинарные кавычки
read only
Устанавливая опцию, можно перевести базу данных в режим "только для чтения". В этом режиме разрешается только чтение данных, что позволяет не использовать подсистему блокирования, что положительно сказывается на выполнении пользовательских запросов
recursive triggers
Контролирует возможность вызова триггера самим собой (прямая рекурсия) или из другого триггера (косвенная рекурсия). Установленная опция разрешает такую возможность, тогда как сброшенная — нет
916
Часть IV. Разработка и сопровождение баз данных
Таблица 20.1 (окончание) Параметр
Описание
select into/bulkcopy
В случае установки опции разрешается выполнение запроса SELECT...INTO и операция массированной закачки данных в базы данных. По умолчанию опция сброшена, т. к. указанные операции являются непротоколируемыми, т. е. информация о них не отображается в журнале транзакций
single user
При установленной опции база данных переводится в режим работы с ней только одного пользователя. Этот режим характеризуется отсутствием блокировок, но в отличие от режима "только для чтения" разрешает выполнение изменений данных
subscribed
Установка опции разрешает базе данных выступать в качестве подписчика для подсистемы репликации
torn page detection
Контролирует оперативное обнаружение поврежденных страниц. Установленная опция предписывает серверу обнаруживать поврежденные страницы
trunc. log on chkpt.
Путем установки данной опции можно разрешить автоматическое усечение (truncate) журнала транзакций при выполнении в базе данных контрольной точки (checkpoint). Это позволяет оперативно удалять неактивную часть журнала транзакций, но при этом становится невозможным создание резервной копии журнала транзакций
Некоторые опции, приведенные в табл. 20.1, могут контролироваться не только на уровне базы данных, но и на уровне сервера и соединения. При этом значение, установленное на уровне сервера, перекрывается значением, установленным на уровне базы данных, которое, в свою очередь, может быть перекрыто значением, определенным на уровне соединения, хранимой процедуры, пакета команд, триггера или функции. Примером такой опции может являться опция quoted identifier.
Замечание Конфигурирование значений на уровне сервера осуществляется с помощью системной хранимой процедуры s p _ c o n f i g u r e , тогда как управление опциями на уровне соединения, хранимой процедуры и т. д. — с помощью команды S E T .
Мы рассмотрели возможные значения параметра @ opt name хранимой процедуры sp_dboption. Теперь же рассмотрим варианты использования самой процедуры. Мы уже привели пример вызова процедуры без параметров, что позволяет получить список всех доступных опций. Теперь же попробуем выполнить процедуру с указанием только имени базы данных: EXEC sp_dboption
'pubs'
В ответ будет получен список опций, которые были установлены для указанной базы данных:
Глава 20. Работа с базой данных
917
The following options are set: trunc. log on chkpt. torn page detection default to local cursor auto create statistics auto update statistics
Помимо получения списка всех установленных опций можно проверить, установлена или нет конкретная опция. Для этого помимо имени базы данных необходимо задать имя интересующей опции: EXEC sp_dboption 'pubs',
'default
to local
cursor'
Будет получен следующий результат: OptionName
CurrentSetting
default to local cursor
ON
Ну и наконец, рассмотрим использование процедуры s p d b o p t i o n для изменения значения опции конфигурации базы данных. Это требует указания всех трех параметров процедуры: EXEC sp_dboption 'pubs',
'default
to local cursor',
'on'
В ответ будет выдано только сообщение об успешности или неуспешности (в случае отсутствия необходимых прав) выполнения процедуры. Например, при удачном выполнении выдается сообщение: sp_dboption command
succeeded.
Изменение имени базы данных Хотя в большинстве случаев имя базы данных после ее создания не изменяется, тем не менее, иногда такая необходимость возникает. Казалось бы, что для изменения имени базы данных достаточно исправить значение в столбце Name системной таблицы sysdatabases, расположенной в системной базе данных Master. Например, для изменения имени базы данных pubs на имя superPubs можно было бы выполнить следующий запрос: UPDATE master..sysdatabases
SET Name='SuperPubs' WHERE Name='pubs'
Замечание Чтобы иметь возможность модифицировать данные в системных таблицах, необходимо разрешить прямой доступ к ним. Для этого предназначена хранимая процедура s p _ c o n f i g u r e С параметром ' a l l o w u p d a t e s ' .
Однако подобное изменение не затронет саму базу данных. Хотя при просмотре списка баз данных вы будете видеть новое имя, но при попытке работать в контексте переименованной базы данных сервер будет воспринимать старое имя. Это связано с тем, что имя базы данных указывается и в системных таблицах
918
Часть IV. Разработка и сопровождение баз данных
самой базы данных. Лучше не экспериментировать с непосредственным изменением значений в системных таблицах, а воспользоваться специальными средствами. Лучшим решением будет вызов системной хранимой процедуры sp_renamedb, специально предназначенной для изменения имен баз данных: sp_renamedb [ Sdbname = ] 'old_name', [ Qnewname = ] 'new_name'
С помощью первого параметра процедуры указывается имя базы данных, которую предполагается переименовать. Имя же, которое должна иметь база данных после переименования, указывается с помощью второго параметра. В качестве примера рассмотрим переименование базы данных pubs в superPubs: EXEC sp_renamedb 'pubs', 'SuperPubs'
Заметим, что хранимая процедура sp_renamedb выполняет переименование базы данных не путем изменения данных в системных таблицах, а путем вызова команды ALTER DATABASE с параметром MODIFY NAME. Таким образом, универсаль-
ным средством изменения имени базы данных является команда ALTER DATABASE. Рассмотрим, каким же образом осуществляется переименование базы данных с помощью этой команды. Мы не будет приводить весь синтаксис команды ALTER DATABASE, а ограничимся только той частью, которая связана с изменением имени базы данных: ALTER DATABASE database MODIFY NAME = new_dbname
Как нетрудно догадаться, вместо параметра database должно быть подставлено текущее имя базы данных, тогда как новое имя указывается с помощью параметра newdbname. Приведем пример использования команды: ALTER DATABASE pubs MODIFY NAME = SuperPubs
Передача прав владения базой данных Ранее уже говорилось, что каждая база данных имеет своего владельца. Обычно владельцем базы данных является пользователь, который создал ее. В базе данных ее владелец представлен пользователем dbo (database owner), который имеется в каждой базе данных. Этот пользователь, как и любой другой пользователь базы данных (кроме пользователя guest), связан с определенной учетной записью. При создании базы данных происходит автоматическое связывание пользователя базы данных dbo с учетной записью пользователя, создавшего базу данных. Владелец базы данных имеет максимальные права в базе данных и может выполнять практически любые действия. Если вдруг понадобилось изменить владельца базы данных (например, при увольнении сотрудника, создавшего базу данных), то для этого необходимо использовать специальную хранимую процедуру. Нельзя удалить пользователя dbo, а затем заново создать его, связав при этом с другой учетной записью. Это связано с тем, что пользователь dbo должен всегда существовать в базе данных.
Глава 20. Работа с базой данных
919
Итак, изменение владельца, или передача прав владения базой данных, осуществляется с помощью хранимой процедуры spchangedbowner, имеющей синтаксис: sp_changedbowner [ Qloginame = ] ' l o g i n ' [ , [ @map = ] remap_alias_flag ]
Замечание Изменять владельца базы данных могут только члены фиксированной роли сервера sysadmin или пользователь, являющийся текущим владельцем базы данных или членом роли db_owner. Данная хранимая процедура должна выполняться в контексте той базы данных, владельца которой необходимо изменить. С помощью параметра oioginame указывается имя учетной записи, связанной с пользователем dbo и которой, таким образом, будут переданы права владения базой данных. Отметим, что нельзя указывать учетную запись, уже отображаемую в одного из пользователей базы данных. При необходимости нужно предварительно удалить из базы данных соответствующего пользователя. С помощью параметра @тар можно управлять отвязыванием от пользователя dbo учетной записи старого владельца базы данных. Если для параметра указывается значение True, то связь не нарушается и таким образом база данных будет иметь двух владельцев, представленных одним и тем же пользователем. Если же для параметра @тар указывается значение False, то связь старой учетной записи с пользователем dbo будет удалена. В качестве примера рассмотрим передачу прав владения базой данных pubs учетной записи sa: USE p u b s EXEC s p _ c h a n g e d b o w n e r
'sa',
'True'
Просмотреть полученный результат можно с помощью хранимой процедуры s p h e l p l o g i n s , выводящей информацию об отображении учетной записи в пользователей базы данных, а также о том, членом каких ролей базы данных является учетная запись: EXEC s p _ h e l p l o g i n s
'sa'
Будет получен следующий результат: LoginName SID
DefDBName
DefLangName
AUser ARemote
sa
master
us english
yes
0x01
(1 row(s) affected) LoginName DBName
UserName
UserOrAlias
sa sa
db owner
dbo
MemberOf User
master master
YES
920
Часть IV. Разработка и сопровождение баз данных
sa sa sa sa sa sa sa sa sa sa
model model msdb msdb Northwind Northwind pubs pubs tempdb tempdb
(12 row(s)
db_owner
dbo
db owner
dbo db owner
dbo db owner
dbo db owner
dbo
MemberOf User MemberOf User MemberOf User MemberOf User MemberOf User
affected)
Получение информации о базе данных При работе с базой данных средствами Transact-SQL часто бывает необходимо получить о ней различную информацию. Для этого можно использовать хранимую процедуру sp_heipdb, имеющую синтаксис: spjnelpdb
[ [ @dbname= ] 'name'
]
С помощью единственного параметра процедуры указывается имя базы данных, о которой необходимо получить информацию. Однако этот параметр не является обязательным и может быть с успехом опущен. При этом будет выведена информация не о конкретной базе данных, а обо всех базах данных, имеющихся на сервере. Информация о базах данных выводится в следующих столбцах: •
name — имя базы данных;
• d b s i z e — текущий размер базы данных, вычисляющийся как сумма размеров всех файлов (в т. ч. и журнала транзакций), входящих в базу данных; П owner — имя учетной записи, являющейся владельцем базы данных; • dbid — идентификационный номер базы данных. Это же значение возвращается функцией DB_ID (dbname) ; П created — дата создания базы данных; •
s t a t u s — текущий статус базы данных, записанный в текстовом виде и формирующийся на основе опций конфигурации базы данных, устанавливаемых с помощью хранимой процедуры s p d b o p t i o n , описанной ранее;
•
compatibiiity_levei
— уровень совместимости базы данных.
При использовании хранимой процедуры s p h e i p d b для получения сведений о конкретной базе данных помимо указанной информации выводится также информация и о файлах базы данных. Эта информация отображается в следующих столбцах: •
name — логическое имя файла;
D f i l e i d — идентификационный номер файла, уникальный в пределах базы данных;
Глава 20. Работа с базой данных • •
921
filename — физическое имя файла, включающее собственно имя файла в операционной системе, а также полный путь к нему; f ilegroup — имя группы файлов, к которой принадлежит файл;
П s i z e — текущий размер файла; • maxsize — максимальный размер файла или unlimited, если для файла не было установлено ограничения на максимальный размер; •
growth — шаг прироста. Может указываться как в абсолютном, так и в относительном выражении;
•
usage — указывается тип файла. Значение data only соответствует файлу данных, тогда как значение log only — файл журнала транзакций.
Помимо получения информации обо всех файлах базы данных, также можно получить информацию только об отдельном файле. Это можно выполнить с помощью хранимой процедуры s p j n e i p f i l e , имеющей следующий синтаксис: sp_helpfile
[ [ ^filename = ] 'name' ]
Процедура s p h e i p f i l e возвращает информацию о файлах текущей базы данных. Если процедура вызывается без параметров, то будет возвращена информация обо всех файлах, из которых состоит база данных. Если же необходимо получить сведения лишь об одном файле, то надо указать его имя с помощью параметра @fiiename. Набор столбцов, в которых выводится информация о файлах, а также их назначение полностью соответствуют столбцам, возвращаемым процедурой spjneipdb и рассмотренным выше. Помимо получения информации о файлах иногда бывает необходимо выяснить информацию и о группах файлов, определенных в базе данных. Для этого можно использовать следующую хранимую процедуру: sp_helpfilegroup
[ [ @filegroupname = ] 'name' ]
Если процедура вызывается без параметров, то будет возвращена информация обо всех группах файлов, определенных в текущей базе данных. Тем не менее, можно заставить процедуру возвращать информацию лишь о конкретной группе файлов. Для этого достаточно указать ее имя с помощью параметра @f ilegroupname. При получении сведений обо всех группах информация выдается в следующих столбцах: •
groupname — ИМЯ Группы;
•
groupid — идентификационный номер группы;
•
filecount — количество файлов, входящих в группу.
Когда же информация предоставляется о конкретной группе файлов, то дополнительно выводится второй набор данных, имеющий следующие столбцы: П f i l e i n g r o u p — логическое имя файла, входящего в группу; П f i l e i d — идентификационный номер файла, уникальный в пределах базы данных;
922
Часть IV. Разработка и сопровождение баз данных
П filename — физическое имя файла, включающее собственно имя файла в операционной системе, а также полный путь к нему; •
s i z e — текущий размер файла;
•
maxsize — максимальный размер файла или unlimited, если для файла не было установлено ограничения на максимальный размер;
•
growth — шаг прироста. Может указываться как в абсолютном, так и в относительном выражении.
В качестве примера рассмотрим получение информации о первичной группе файлов базы данных pubs: USE pubs EXEC s p _ h e l p f i l e g r o u p 'PRIMARY' Будет получен следующий результат: groupname
groupid filecount
PRIMARY
1
file_in_group pubs
1
fileid filename 1
...\data\pubs.mdf
size
maxsize
growth
1792 KB
Unlimited
10%
Замечание К сожалению, полностью значение поля filename указать не удалось вследствие ограничения ширины страницы книги. Однако при реальной работе будет указан полный путь и имя файла. В одном из предыдущих разделов была рассмотрена системная хранимая процедура sp_dboption, с помощью которой можно получить информацию о состоянии опций конфигурации базы данных. Однако эта хранимая процедура возвращает данные в виде набора строк, поэтому ее использование в коде несколько затруднительно. Например, если необходимо проверить состояние опции, то придется вставить возвращаемые процедурой значения в таблицу и анализировать значения таблицы.
Замечание Подробно способы возвращения данных из хранимых процедур, в т. ч. и в виде набора строк, будут рассмотрены в главе 30. В данном случае гораздо удобнее использовать для получения опций конфигурации базы данных функцию DATABASEPROPERTY (), которая помимо опций, поддерживаемых хранимой процедурой s p d b o p t i o n , возвращает дополнительную информацию. Однако сразу же отметим, что функция DATABASEPROPERTY о является устаревшей. В SQL Server 2000 вместо нее предлагается применять функцию DATABASEPROPERTYEX (), имеющую синтаксис: DATABASEPROPERTYEX(database, property)
923
Глава 20. Работа с базой данных
С помощью первого параметра указывается имя базы данных, о свойстве которой необходимо получить информацию. Для указания же имени самого свойства используется второй параметр. Все возможные варианты второго параметра, а также краткое пояснение к ним приведены в табл. 20.2. Таблица 20.2. Опции конфигурации
базы данных
Имя опции
Назначение
Collation
Имя сопоставления, выбранное для базы данных при ее создании
IsAnsiNullDefault
Аналог опции ANSI n u l l default процедуры sp_dboption
IsAnsiNullsEnabled
Аналог опции ANSI nulls процедуры sp_dboption
IsAnsiPaddingEnabled
Аналог опции ANSI padding процедуры sp_dboption
IsAnsiWarningsEnabled
Аналог опции ANSI warning процедуры sp_dboption
IsArithmeticAbortEnabled
Аналог опции arithabort процедуры sp_dboption
IsAutoClose
Аналог опции autoclose процедуры sp_dboption
IsAutoShrink
Аналог опции autoshrink процедуры sp_dboption
IsAutoCreateStatistics
Аналог опции auto create statistics процедуры sp_dboption
IsAutoUpdateStatisties
Аналог опции auto update statistics процедуры sp_dboption
IsMergePublished
Аналог опции merge publish процедуры sp_dboption
IsQuotedldentifiersEnabled
Аналог опции quoted identifier процедуры sp_dboption
IsCloseCursorOnCommitEnabled
Аналог опции cursor close on commit процедуры sp_dboption
IsSubscribed
Аналог опции subscribed процедуры sp_dboption
IsTornPageDetectionEnabled
Аналог опции torn page detection процедуры sp_dboption
SQLSortOrder
Идентификационный номер сортировки, соответствующий предыдущей версии SQL Server
Status
Статус базы данных: ONLINE, OFFLINE, RESTORING, RECOVERING, SUSPECT
924
Часть IV. Разработка и сопровождение баз данных Таблица 20.2
Имя опции Updateability
(окончание)
Назначение В о з м о ж н о с т ь обновления базы д а н н ы х :
READ__ONLY
ИЛИ READ_WRITE
UserAccess
Режим доступа пользователей: SINGLE USER — однопользовательский режим, RESTRICTEDJJSER — только члены ролей db_owner, d b c r e a t o r , sysadmin, MULTI_USER— любые пользователи
Recovery
Модель восстановления базы данных
IsInStandby
База данных работает в режиме "только для чтения"
IsLocalCursorsDefault
Аналог опции default t o l o c a l процедуры sp_dboption
IsNullConcat
Аналог опции concat n u l l y i e l d s процедуры sp_dboption
IsRecursiveTriggersEnabled
Аналог опции 'recursive triggers' процедуры sp_dboption
IsFulltextEnabled
В базе данных создан полнотекстовый каталог
IsInStandBy
База данных находится в состоянии Standby, характеризующемся режимом "только для чтения" и возможностью применения резервной копии журнала транзакции
Version
Внутренний номер версии сервера SQL Server, на котором была создана база данных
cursor null
В качестве примера рассмотрим получение информации о режиме доступа пользователей к базе данных pubs: SELECT DATABASEPROPERTYEX('pubs' , 'UserAccess')
Будет возвращен следующий результат: MULTI_USER (1 row(s) affected)
Для получения информации об использовании пространства в базе данных можно вызвать системную хранимую процедуру s p s p a c e u s e d , имеющую синтаксис: sp_spaceused [ [ @objname = ] 'objname' ] [ , [Qupdateusage = ] 'updateusage' ]
При вызове процедуры без параметров будет возвращена информация в целом о базе данных: EXEC sp spaceused
Глава 20. Работа с базой данных
925
Результат будет таким: database name
database size
unallocated space
pubs
2.50 MB
0.52 MB
reserved
data
index size
unused
1264 KB
456 KB
680 KB
128 KB
Однако помимо получения сведений в целом о базе данных, также можно получить информацию и о конкретной таблице базы данных. Для этого имя интересующей таблицы должно быть указано с помощью параметра @objname. Попробуем получить информацию о таблице authors: EXEC sp_spaceused ' a u t h o r s '
Будет возвращен следующий результат: name
rows
reserved
data
index size
unused
authors
23
40 KB
8 KB
32 KB
0 KB
С помощью второго параметра процедуры sp_spaceused можно предписать выполнить обновление статистики об использовании пространства. Для этого достаточно указать значение TRUE. ПО умолчанию же подразумевается значение FALSE, что свидетельствует о ненужности обновления информации. Помимо перечисленных команд и хранимых процедур, в Transact-SQL также имеется команда, с помощью которой можно получить информацию о применении базами данных журнала транзакций: DBCC SQLPERF (LOGSРАСЕ)
Эта команда не имеет никаких параметров и должна выполняться в точно таком виде, в котором приведена. После ее завершения может быть возвращен следующий результат: Database Name
Log Size (MB)
Log Space Used (%)
Status
master tempdb model msdb pubs Northwind MATRIX Chair Dekanat Conferenc DocExch
1.2421875 0.4921875 0.4921875 2.2421875 0.7421875 0.9921875 0.9921875 0.9921875 0.9921875 0.9921875 0.9921875
41.194969 46.674648 75.496033 31.293554 50.526318 44.980316 33.169292 37.15551 33.169292 33.169292 38.533466
0 0 0 0 0 0 0 0 0 0 0
(11 row(s) affected) DBCC execution completed. If DBCC printed error messages, contact your system administrator.
926
Часть IV. Разработка и сопровождение баз данных
В столбце Database Name указывается имя базы данных. В столбце Log Size (мв) выводится общий объем журнала транзакций соответствующей базы данных. Процент же использования журнала транзакций отображается в столбце Log Space used (%). Последний столбец всегда содержит значение 0.
Уменьшение размера базы данных Как уже не раз было сказано, база данных может автоматически увеличиваться при добавлении в нее данных. Однако иногда бывает необходимо выполнить и обратную операцию — уменьшение базы данных (shrinking database). Чаще всего это требуется после удаления значительной части информации из базы данных. Уменьшение размера базы данных выполняется за счет уменьшения размера отдельных файлов, из которых она состоит. При этом уменьшение размера может происходить не только за счет файлов данных, но и за счет файлов журнала транзакций. Однако, прежде чем станет возможным уменьшение размера файлов журнала транзакций, необходимо удалить из них информацию обо всех неактивных транзакциях. Эту операцию можно сравнить с удалением ненужных данных из таблиц. Удаление из журнала транзакций информации о неактивных транзакциях называется усечением журнала транзакций (truncate transaction log).
(
Замечание
}
После выполнения усечения журнала транзакций становится невозможным создание резервной копии журнала транзакций, т. к. цепочка транзакций становится разорванной. Отметим, что усечение журнала транзакций осуществляется автоматически при создании резервной копии журнала транзакций. Подробно резервное копирование было рассмотрено в главе 13. Усечение журнала транзакций выполняется с помощью команды BACKUP LOG, которая имеет синтаксис: BACKUP LOG { database_name | @database_name_var } { [ WITH { NO_LOG I TRUNCATEJDNLY } ] }
С помощью параметра databasename указывается имя базы данных, усечение журнала транзакций которой необходимо выполнить. Помимо непосредственного указания имени базы данных разрешается использование локальной переменной, которая будет содержать имя базы данных. Имя этой переменной ДОЛЖНО быть указано С ПОМОЩЬЮ параметра @database_name_var. После имени базы данных (или переменной, содержащей это имя) приводится ключевое слово WITH, С ПОМОЩЬЮ которого задается действие, необходимое для выполнения. Слова NO_LOG И TRUNCATE_ONLY ЯВЛЯЮТСЯ синонимами и предписывают выполнить усечение журнала транзакций. Описанный способ усечения журнала транзакций требует участия администратора. Однако в SQL Server 2000 имеется возможность и автоматического выполнения усечения журнала транзакций. Для этого достаточно установить для базы данных опцию ' t r u n c . log on c h k p t . ' , выполнив для этого следующую команду: EXEC sp_dboption 'database 1 , ' t r u n c . log on c h k p t . ' , 'TRUE'
Глава 20. Работа с базой данных
927
Вместо значение database необходимо подставить имя конкретной базы данных. После установки опции сервер будет выполнять усечение журнала транзакций после каждой операции контрольной точки (checkpoint), которая периодически выполняется сервером, и целью которой является сброс на диск всех данных, измененных с момента последней операции контрольной точки. Отметим, что в случае разрешения автоматического усечения журнала транзакций нельзя создавать резервные копии журнала транзакций, т. к. информация о зафиксированных транзакциях постоянно удаляется. Операция усечения журнала транзакций выполняет только удаление информации о неактивных транзакциях. Однако при этом не производится уменьшение размера собственно файлов журнала транзакций. Эта операция должна быть выполнена отдельно. Рассмотрим же, как осуществляется собственно уменьшение физического размера файлов. Эта операция может выполняться на двух уровнях: П на уровне базы данных с помощью команды DBCC SHRINKDATABASE; • на уровне отдельного файла с помощью команды DBCC SHRINKFILE. (
Замечание
^
Указанные команды могут быть использованы как для файлов данных, так и для файлов журнала транзакций.
Для начала рассмотрим уменьшение размера отдельного файла базы данных. Применяемая для этого команда имеет следующий синтаксис: DBCC SHRINKFILE ( { file_name | file_id } { [ , target_size ] [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ] } )
Рассмотрим назначение параметров команды: О
file_name
Логическое имя файла базы данных, размер которого предполагается уменьшить. Заметим, что команда DBCC SHRINKFILE работает только с текущей базой данных. Поэтому, прежде чем выполнять усечение размера базы данных, необходимо переключиться в нужную базу данных (например, с помощью команды USE database). •
file_id
Этот параметр, как и предыдущий, предназначен для указания файла, размер которого необходимо уменьшить. Однако в данном случае файл указывается не по имени, а по идентификационному номеру, который можно получить с помощью функции F I L E _ I D ( ' f i l e name')• Идентификационные номера файлов также выводятся при просмотре информации о базе данных, что было описано в предыдущем разделе. Замечание Напомним, что список файлов базы данных хранится в системной таблице sys f i l e s , имеющейся в каждой базе данных. В этой таблице указываются физические и логические имена файлов, их размер, шаг прироста и идентификационные номера.
928
Часть IV. Разработка и сопровождение баз данных
О target_size
Данный параметр определяет величину, до которой желательно уменьшить размер файла. Если объем информации, хранящейся в файле, меньше указанного объема, то файл будет уменьшен до указанного размера. В противном случае новый размер файла будет соответствовать объему хранящейся в нем информации. Отметим, что размер должен задаваться как целое число. Допускается использование суффиксов. Если параметр t a r g e t s i z e опускается, то сервер будет пытаться уменьшить размер файла до первоначального размера. Не разрешается уменьшение размера файла меньше первоначального. При необходимости часть данных, расположенная в удаляемой части (в конце файла), будет перенесена в свободное пространство оставляемой части файла (в начале). •
EMPTYFILE
При указании этого параметра сервер выполняет полное освобождение файла путем переноса хранящихся в нем данных в другие файлы базы данных. Такая операция является обязательной, если требуется удалить файл, т. к. сервер не разрешает удаление файлов, содержащих данные. После выполнения для файла команды DBCC SHRINKDATABASE С параметром EMPTYFILE сервер не
будет добавлять в файл данных, и он в любой момент может быть удален с помощью команды ALTER DATABASE
REMOVE FILE. Указание параметра t a r -
g e t s i z e в этом случае не допускается. •
NOTRUNCATE
При задании этой опции сервер выполнит перенесение данных в начало файла в соответствии со значением t a r g e t s i z e , но не будет осуществлять физического уменьшения размера файла. Таким образом, данные смещаются к началу файла. Впоследствии пустая часть файла может быть возвращена операционной системе. •
TRUNCATEONLY -
При указании этого параметра сервер выполняет возвращение системе всего пространства файла, находящегося за последней использованной страницей файла. Однако при этом не производится никакого переноса данных, и значение параметра t a r g e t s i z e игнорируется. Рекомендуется предварительно освободить конец файла с применением предыдущего параметра.
Замечание Последовательное выполнение команды DBCC
SHRINKDATABASE
С параметрами
N O T R U N C A T E и T R U N C A T E O N L Y равнозначно указанию только параметра t a r g e t _ s i z e .
В качестве примера рассмотрим уменьшение размера файла базы данных pubs до размера 1 Мбайт. Сначала необходимо узнать, какие же файлы имеются в базе данных. Для этого обратимся к таблице sysf i l e s : USE pubs SELECT fileid, name FROM sysfiles
Глава 20. Работа с базой данных
929
Будет возвращен следующий результат: fileid name 1
pubs
2
pubs_log
(2 row(s) affected)
Попытаемся уменьшить файл pubslog: DBCC SHRINKFILE (2, 1)
Будет выдан результат: Cannot shrink file '2' in database 'pubs' to 128 pages as it only contains 96 pages. DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Данное сообщение говорит о невозможности уменьшить размер файла, т. к. его размер в настоящее время составляет 96 страниц (768 Кбайт), тогда как мы пытаемся изменить размер до 1 Мбайта (128 страниц). Попробуем уменьшить размер файла pubs: DBCC SHRINKFILE (1, 1)
Будет выдан следующий результат: Dbld
F i l e i d C u r r e n t S i z e MinimumSize UsedPages
EstimatedPages
5
1
160
(1 row(s)
168
80
160
affected)
DBCC e x e c u t i o n completed. I f DBCC p r i n t e d e r r o r messages, c o n t a c t your s y s tem a d m i n i s t r a t o r .
Команда была успешно выполнена. При этом была выдана статистическая информация о состоянии файла в следующих столбцах: •
Dbid — идентификационный номер базы данных;
•
F i l e i d — идентификационный номер файла;
•
CurrentSize — текущий размер файла в страницах;
• MinimumSize — минимально допустимый размер файла в страницах, определяемый первоначальным размером файла; • UsedPages — количество страниц, занимаемых в настоящее время данными; •
EstimatedPages — рекомендуемое сервером минимальное количество страниц, до которого следует уменьшать размер файла.
Мы рассмотрели уменьшение размера отдельного файла с помощью команды DBCC SHRINKFILE. Теперь же обратимся к команде DBCC SHRINKDATABASE. Она
930
Часть IV. Разработка и сопровождение баз данных
позволяет уменьшать суммарный размер файлов базы данных. Команда имеет синтаксис: DBCC SHRINKDATABASE ( database_name [ , target_percent ] [ , { NOTRUNCATE | TRUNCATEONLY } ] )
Рассмотрим назначение и использование параметров команды: L"J database_name Имя базы данных, размер которой предполагается уменьшить. СЗ target_percent Посредством данного параметра определяется процент свободного пространства, который необходимо оставить в базе данных после выполнения команды. Например, если начальный размер всех файлов составляет 100 Мбайт, но только 60 Мбайт из них заполнены данными, то для уменьшения объема неиспользуемого пространства с 40 Мбайт до 20 Мбайт необходимо указать значение 25. Для вычисления размера, до которого необходимо уменьшить файлы, сервер делит используемое пространство на 100 и умножает на (100+target_percent). Отметим, что для параметра t a r g e t _ p e r c e n t нельзя указывать значение, превышающее текущий процент свободного пространства (для данного примера это 40). Уменьшение размера базы данных выполняется путем уменьшения размера всех файлов данных, входящих в базу данных. Таким образом, команду DBCC SHRINKDATABASE
МОЖНО рассматривать
как серию команд DBCC SHRINKFILE, параметры которых вычисляются автоматически сервером. •
NOTRUNCATE
Указание этого параметра предписывает серверу не производить физического уменьшение размера файлов базы данных, однако данные все же смещаются к началу файлов. О TRUNCATEONLY
Удаляются все данные, расположенные в файле за последней выделенной страницей (точнее экстентом). Никакой оптимизации размещения данных при этом не предпринимается. Значение параметра target_percent игнорируется. В качестве примера рассмотрим уменьшение объема неиспользуемого пространства В базе Данных Northwind ДО 20%: DBCC (Northwind, 20)
Будет возвращен следующий результат: DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Данное сообщение свидетельствует о том, что в ходе выполнения команды не произошло никаких ошибок. Однако, когда размер файлов уменьшается, сервер выдает статистическую информацию об использовании страниц. То, что такой информации не было выдано, свидетельствует о том, что объем свободного про-
Глава 20. Работа с базой данных
931
странства в базе данных меньше указанного значения. Попытаемся же уменьшить объем свободного пространства до 1%: DBCC SHRINKDATABASE (Northwind, 1)
Будет возвращен результат: Dbld
F i l e l d C u r r e n t S i z e MinimumSize UsedPages
EstimatedPages
6
1
352
(1 row(s)
360
80
352
affected)
DBCC e x e c u t i o n completed. If DBCC p r i n t e d e r r o r messages, c o n t a c t your tem a d m i n i s t r a t o r .
sys-
Замечание В столбце UsedPages указывается количество страниц, занимаемое данными. Таким образом, объем файлов данных (значение в столбце C u r r e n t S i z e ) должен быть равен usedPagesx1,01. В данном случае это составило бы 355,52 (352x1,01). Однако в столбце C u r r e n t S i z e указано значение 360. Это связано с тем, что пространство в базе данных выделяется экстентами (группами из 8 страниц).
Enterprise
M a n a g e r
Последние несколько разделов были посвящены обсуждению управления различными свойствами базы данных с помощью средств Transact-SQL. В данном же разделе будет также рассмотрено управление базой данных, но уже средствами Enterprise Manager. Управление базовыми свойствами базы данных осуществляется с помощью окна свойств базы данных. Для открытия этого окна достаточно в контекстном меню нужной базы данных выбрать команду Properties. На рис. 20.11 приведен типичный пример окна свойств базы данных. Как видно, это окно имеет шесть вкладок, три из которых были доступны в момент создания базы данных. Первая из вкладок (рис. 20.11) традиционно имеет имя General и содержит общую информацию о базе данных. В большей части на вкладке приводятся сведения, возвращаемые системной хранимой процедурой sp_helpdb. Рассмотрим же, какая информация отображается на вкладке: • Name — имя базы данных, о которой выводится информация; •
Status — текущий статус базы данных. Возможны значения Normal, Offline, Restoring, Recovering, Suspect, Read Only, Dbo Use Only, Single User Mode;
• Owner — имя учетной записи пользователя, являющегося владельцем базы данных; • Data created — дата создания базы данных; •
Size — текущий размер базы данных, являющийся суммой размеров всех файлов базы данных, в т. ч. и файлов журнала транзакций;
Часть IV. Разработка и сопровождение баз данных
932
• Space available — объем свободного пространства в базе данных; • Number of users — количество пользователей, созданных в базе данных; • Last database backup — дата последнего создания полной или разностной резервной копии базы данных; П Last transaction log backup — дата последнего создания резервной копии журнала транзакций; G Maintenance plan — имя плана сопровождения, обслуживающего базу данных. План сопровождения создается с помощью мастера Database Maintenance Plan Wizard и может обслуживать одну или более баз данных. Подробно создание плана сопровождения было рассмотрено в главе 12; П Collation name — имя сопоставления, указанного при создании базы данных. Northwind Properties General Data Files] Transaction Log] Filegroupsj Options) Perrnissk Name:
Northwind
D atabase — —: Status: Owner Date created: Size: Space available: Number of users: Par-lnn oduvup Last database backup: Last transaction log backup: Maintenance ~~ Maintenance plan: Collation name:
Normal sa 18.04.2000 2:03:19 5,13 MB 1,64 MB 2 None None None Cyrilic_General CI_AS
OK
Cancel
Help
Рис. 2 0 . 1 1 . Окно свойств базы данных, вкладка General
Как видно из рисунка, вкладка General носит чисто информационный характер, предоставляя пользователю различные сведения о базе данных. Никаких действий (например, передачу прав владения базой данных) с помощью этой вкладки выполнить нельзя. Вторая вкладка окна свойств базы данных носит имя Data Files (рис. 20.12). Эта вкладка доступна и в момент создания базы данных. Работа с вкладкой Data Files
Глава 20. Работа с базой данных
933
была рассмотрена при описании создания базы данных. Сейчас же отметим, что, открывая окно свойств созданной базы данных, можно выполнить удаление или добавление файлов данных. При попытке удалить файл, содержащий данные, будет выдано сообщение об ошибке. Прежде чем произвести удаление файлов, необходимо переместить всю имеющуюся в них информацию в другие файлы базы данных. Однако выполнить эту операцию средствами Enterprise Manager нельзя. Поэтому придется обратиться к средствам Transact-SQL. Перенос информации из файла в другие файлы базы данных был рассмотрен в предыдущем разделе. Northwind Properties General Data Files | Transaction Log | Filegroups | Options | Permissions Database files File Name Northwind aaaa
; Location Space allocated (MB) \ Filegroup G:\Prograrn FilesVMicro.. PRM I ARY G:\Program Files\Micro.. bbbb
Delete File properties гЧ7 Automatically jjrow file I г File growth
-
i | f* [n megabytes:
—|
И*" ЙУ percent:
"I
- i г Maximum file size
:
**" Unrestricted file growth p
Restrict file growth (MB):
OK
Cancel
Help
Рис. 2 0 . 1 2 . Окно свойств базы данных, вкладка Data Files
Следующая вкладка называется Transaction Log (рис. 20.13) и предназначена для управления файлами журнала транзакций. Как и предыдущая, эта вкладка доступна в момент создания базы данных. Работа с указанной вкладкой также была представлена и повторно рассматриваться не будет. Четвертая вкладка окна свойств базы данных называется Filegroups (рис. 20.14). Эта вкладка предназначена для управления группами файлов базы данных. Основную часть вкладки занимает таблица Filegroups, каждая строка которой соответствует отдельной группе файлов. В столбце Name таблицы указывается имя группы файлов. Количество же файлов в группе приводится в столбце Files. В столбцах Read-Only и Default находятся флажки. Устанавливая флажок в первом из столбцов, можно перевести соответствующую группу в режим "только для
Часть IV. Разработка и сопровождение баз данных
934
чтения". При этом данные, расположенные во входящих в группу файлах, можно будет только прочитать, но не изменить. Флажок же в столбце Default может быть установлен только для одной группы из всех имеющихся. Выбор этого флажка предписывает сконфигурировать определенную группу в качестве группы файлов по умолчанию. Напомним, что в такой группе размещаются все данные, для которых явно не указано, в какой группе они должны располагаться. ill
Northwind Properties General) Data Files Transaction Log jFilegroups) Options) Permissions] ^Transaction log files File Name Northwind_log
— Location Space allocated (MB) "*|§ G:\Program FilesSMicrosoft... 1
Delete
File properties — r P" Automatically grow file I rFile growth I \ C" jn megabytes: I : (* By percent:
-] г Maximum file size —-! |- I <*" Unrestricted file growth и * Restrict file growth (MB):
OK
Cancel
Help
Рис. 20.13. Окно свойств базы данных, вкладка Transaction Log
Предпоследняя, пятая вкладка имеет имя Options (рис. 20.15) и позволяет управлять опциями конфигурации базы данных. Вкладку Options можно рассматривать как графический интерфейс хранимой процедуры s p d b o p t i o n . Перечислим, какие элементы управления доступны на вкладке: • Restrict access. Установка этого флажка предписывает ограничить доступ пользователей к базе данных. При этом необходимо выбрать режим доступа: • Members of db_owner, dbcreator, or sysadmin — установка переключателя в это положение соответствует переводу базы данных в состояние dbo use only. В этом режиме к базе данных разрешается доступ только членам фиксированных ролей db__owner, dbcreator ИЛИ sysadmin. •
Single user — в этом случае с базой данных сможет работать только один пользователь, и организация блокировок не требуется.
Глава 20. Работа с базой данных
935
INorthwind Properties General ] Data Files | Transacto i n Log Fe li groups | Opto i ns | Permsiso i ns j Fe li gtoups — | Files I Read-Only i Default N ame ЬЬЬЬ PRIMARY
Delete
OK
Cancel
Help
Рис. 20.14. Окно свойств базы данных, вкладка Filegroups North wind Properties General | Data Files j Transaction Log j Filegroups Options j Permissions Access
Г
r~
Single у
Г" fiead-only Recovery
—
(Simple
Model: Settings Г
•
— Г" Auto close
ANSI NULL default
Г" Recursive triggers
F~ Auto shrink
f7 Auto update statistics
17 Auto create statistics
p
Г" Use guoted identifiers
Torn gage detection
Compatibility — Level:
— Database compatibility level 80
OK
Cancel
Help
Рис. 20.15. Окно свойств базы данных, вкладка Options
936
Часть IV. Разработка и сопровождение баз данных
П Read-only. Установка этого флажка предписывает сконфигурировать базу данных в режим "только для чтения". В этом режиме не требуется создание блокировок и транзакций, что позволяет повысить производительность работы пользователей с данными. Часто режим "только для чтения" устанавливается для баз данных систем поддержки принятия решений, характеризующихся отсутствием изменений данных. П Model — с помощью этого раскрывающегося списка можно выбрать модель восстановления, которая будет поддерживаться для базы данных. В распоряжении пользователя имеются следующие модели: •
Simple — простейшая модель, разрешающая восстановление только полной или разностной резервной копии. В этом случае база данных может быть восстановлена только в том состоянии, в котором она была в момент создания последней резервной копии;
•
Full — в этом случае помимо полной и разностной резервной копии также разрешается восстановление резервной копии журнала транзакций, что позволяет восстанавливать базу данных в состоянии, в котором она была непосредственно перед сбоем;
•
Bulk-Logged — данная модель дополнительно к возможностям предыдущей модели позволяет регистрировать действия, которые в предыдущих версиях SQL Server были непротоколируемыми, и их выполнение в базе данных делало невозможным последующее восстановление журнала транзакций. К таким действиям относится выполнение команд SELECT INTO, BULK INSERT, CREATE INDEX, WRITETEXT, UPDATETEXT и выполнение утилиты bcp.exe.
• ANSI NULL default. Контролирует в соответствии со стандартом ANSI SQL92 поддержку столбцом хранения значений NULL В случаях, когда при создании столбца явно не указано, разрешено ему или нет хранение NULL. • Recursive triggers. Разрешает (или запрещает) рекурсивный вызов триггеров. • Auto update statistics. Контролирует возможность автоматического обновления статистики для таблиц базы данных. П Torn page detection. Установка флажка предписывает серверу выполнять автоматическое обнаружение поврежденных страниц. П Auto close. При установленном флажке сервер будет автоматически выгружать из оперативной памяти базу данных, как только с ней заканчивает работу последний пользователь. П Auto shrink. В случае установки флажка периодически будет осуществляться автоматическое уменьшение размера базы данных за счет уменьшения размера отдельных ее файлов. П Auto create statistics. Разрешает автоматическое создание статистики для таблиц базы данных. d Use quoted identifiers. Контролирует поведение двойных кавычек. Если флажок установлен, то двойные кавычки рассматриваются как ограничитель имен объектов, т. е. ведут себя аналогично квадратным скобкам. При сброшенном же флажке заключенные в двойные кавычки значения рассматрива-
Глава 20. Работа с базой данных
937
ются как обычные текстовые строки, т. е. двойные кавычки ведут себя аналогично одинарным кавычкам. • Level — с помощью этого раскрывающегося списка можно изменить уровень совместимости, используемый для базы данных. Уровень совместимости (compatibility level) определяет, поведение какой версии SQL Server будет эмулироваться. На этом рассмотрение вкладки Options можно закончить и перейти к следующей вкладке. Последняя вкладка окна свойств базы данных называется Permissions (рис. 20.16) и позволяет управлять правами пользователей и членов пользовательских ролей базы данных. Как видно из рисунка, всю вкладку занимает таблица, с помощью которой и осуществляется управление правами пользователей и ролей. Каждая строка таблицы соответствует отдельному пользователю или роли базы данных, тогда как каждый столбец описывает одно из прав. Устанавливая флажок в том или ином столбце (зеленая галочка), вы тем самым предоставляете пользователю или роли соответствующее право. Помимо предоставления права, можно также явно запретить пользователю выполнять те или иные действия. Для этого требуется установить в нужном столбце красный крестик. Это гарантирует, что отдельный пользователь или все члены роли не смогут никаким образом выполнить указанное действие.
Northwind Properties General | Data Files | Transacto i n Log | Filegioups | Opto i ns Permsiso i ns Jser/Roe l I Create Tabe l [Create Ve i w ; Create SPI Create Default; Create Rule! Create Functicj
±i
OK
Cancel
Hep l
Рис. 20.16. Окно свойств базы данных, вкладка Permissions
938
Часть IV. Разработка и сопровождение баз данных
Рассмотрим, какими же правами можно управлять с помощью вкладки Permissions: • Create Table — создавать таблицы; П Create View — создавать представления; П Create SP — создавать хранимые процедуры; • Create Default — создавать умолчания; П Create Rule — создавать правила; П Create Function — создавать определяемые пользователем функции; П Backup DB — создавать полную или разностную резервную копию базы данных; • Backup Log — создавать резервную копию журнала транзакций. На этом работу с вкладкой Permissions, да и со всем окном свойств базы данных, можно считать рассмотренной.
Внесение изменений в базу данных Предыдущие разделы были посвящены рассмотрению управления различными свойствами базы данных, а также получению информации о ней. В этом же разделе будет обсуждаться внесение изменений в структуру базы данных. При этом внимание будет уделено только средствам Transact-SQL. Изменение же базы данных средствами Enterprise Manager было рассмотрено в предыдущем разделе. Для изменения базы данных средствами Transact-SQL применяется команда ALTER DATABASE, имеющая синтаксис: ALTER DATABASE database { ADD FILE [ , . . . n ] [TO FILEGROUP filegroup_name] I ADD LOG FILE [ , . . . n ] | REMOVE FILE logical_file_name I ADD FILEGROUP filegroup_name I REMOVE FILEGROUP filegroup_name I MODIFY FILE I MODIFY NAME = new_dbname I MODIFY FILEGROUP filegroup_name {filegroup_property I NAME = new_filegroup_name} I SET [ , . . . n ] [WITH ] I COLLATE } Рассмотрим назначение и использование параметров команды: СП database Имя базы данных, в которую необходимо внести изменения. П ADD FILE С помощью этого параметра можно выполнить добавление в базу данных нового файла данных. Добавляемый файл должен быть описан с помощью конструкции , синтаксис которой был рассмотрен в разд. "Создание базы данных" ранее в этой главе. Дополнительно с помощью параметра то FILEGROUP f i l e g r o u p n a m e МОЖНО указать Группу, В КОТОРОЙ ДОЛЖеН быть расположен добавляемый файл. Если имя группы файлов не указывается, то
Глава 20. Работа с базой данных
939
файл окажется расположенным в группе файлов по умолчанию (default file group). С помощью одной команды ALTER DATABASE МОЖНО добавить в базу данных более одного файла. Для этого достаточно перечислить описание файлов через запятую. •
ADD LOG FILE
Параметр позволяет выполнять добавление в базу данных нового файла журнала транзакций. Как и файл данных, файл журнала транзакций должен быть описан с помощью конструкции . Можно указать множество файлов. •
REMOVE FILE logical_file_name Выполнение команды ALTER DATABASE С рассматриваемым параметром предписывает удалить из базы данных один из файлов, логическое имя которого указывается с помощью параметра l o g i c a l f i l e n a m e . При этом выполняется и физическое удаление файла с жесткого диска. Однако файл нельзя удалить до тех пор, пока он не будет освобожден от всех данных. Выполнение этой операции было рассмотрено в разд. "Уменьшение размера базы данных" ранее в этой главе.
•
ADD FILEGROUP filegroup_name Данный параметр позволяет добавить в базу данных новую группу файлов. Напомним, что список групп файлов хранится в системной таблице sysfiiegroups. Таким образом, использование параметра ADD FILEGROUP приведет к вставке в указанную таблицу новой строки, описывающей группу файлов, указанную с помощью параметра filegroupname. После этого можно будет размещать в группе файлы данных.
•
REMOVE FILEGROUP filegroup_name Действие этого параметра обратно предыдущему — он используется для удаления из базы данных группы файлов, имя которой указано с помощью параметра filegroupname. Заметим, что при удалении группы файлов выполняется и удаление всех включенных в нее файлов. Однако удаление файлов разрешается только в том случае, если они не содержат никаких данных.
d
MODIFY FILE
С помощью этого параметра можно внести изменения в описание файла базы данных. Для описания новых параметров файла применяется конструкция , имеющая синтаксис: ( NAME=logical_file_name [ , NEWNAME=new_logical_name ] [ , FILENAME='os_file_name' ] [ , SIZE=size ] [ , MAXSIZE={ max_size | UNLIMITED } ] [ , FILEGROWTH=growth_increment ] )
Рассмотрим назначение параметров конструкции: •
NAME=logical_file_name — логическое имя файла, который необходимо изменить;
940
Часть IV. Разработка и сопровождение баз данных
•
NEWNAME=new_logical_name — используется для изменения логического имени файла;
•
FiLENAME='os_file_name' — используется для изменения физического имени файла. Отметим, что данная возможность поддерживается только для файлов системной базы данных Tempdb. Однако изменение отобразится только при очередном старте SQL Server;
•
siZE=size — позволяет изменить первоначальный размер файла;
•
MAXSiZE={max_size | UNLIMITED} — предназначен для изменения максимального размера файла. Указание ключевого слова UNLIMITED разрешает снять ограничение на максимальный размер файла;
•
FiLEGROWTH=growth_increment — позволяет изменять шаг прироста файла.
П1 MODIFY NAME = n e w _ d b n a m e
Данный параметр позволяет изменять имя базы данных. Новое имя должно быть указано с помощью параметра newdbname. П
MODIFY FILEGROUP filegroup_name Используя рассматриваемый параметр, можно вносить изменения в группу файлов. Имя изменяемой группы файлов должно быть указано с помощью параметра fiiegroup_name. Можно изменить либо имя группы файлов, воспользовавшись параметром NAME=new_filegroup_name, либо изменить СВОЙства группы файлов. В последнем случае необходимо указать новое свойство базы данных с помощью параметра f i l e g r o u p p r o p e r t y , который может принимать следующие значения: •
READONLY — группа файлов переводится в режим "только для чтения";
•
READWRITE — группа файлов переводится в режим "чтения-записи" (обычно применяется к группам файлов, установленных в режим только для чтения);
•
DEFAULT — группа файлов конфигурируется в качестве группы файлов по умолчанию. В такой группе файлов будут размещаться все вновь создаваемые файлы или данные таблиц, для которых явно не указана группа, в которой они должна располагаться.
П COLLATE
При помощи данного параметра с помощью команды ALTER DATABASE МОЖНО изменить сопоставление, которое будет использоваться по умолчанию для всех создаваемых таблиц. Однако такое изменение не затрагивает уже созданных объектов, в т. ч. и системных таблиц. •
SET [,...n] [WITH ] Данный параметр служит для изменения опций конфигурации базы данных. Опции базы данных уже были рассмотрены в одном из предыдущих разделов этой главы, поэтому здесь мы приведем лишь структуру конструкций и , которые, соответственно, используются для указания изменяемой опции и определения метода применения изменения:
Глава 20. Работа с базой данных
941
::= <state_option> | <cursor_option> I I <sql_option> | <state_option> ::= {SINGLE_USER | RESTRICTED_USER | MULTI_USER} I {OFFLINE | ONLINE} | {READ_ONLY | READ_WRITE} <cursor_option> ::= CURSOR_CLOSE_ON_COMMIT {ON | OFF} I CURSOR_DEFAULT {LOCAL | GLOBAL} ::= AUTO_CLOSE {ON | OFF} I AUTO_CREATE_STATISTICS {ON | OFF} | AUTO_SHRINK {ON | OFF} I AUTO_UPDATE_STATISTICS {ON | OFF} <sql_option> ::= ANSI_NULL_DEFAULT {ON | OFF} I ANSI_NULLS {ON | OFF} | ANSI_PADDING {ON | OFF} I ANSI_WARNINGS {ON | OFF} | ARITHABORT {ON | OFF} I CONCAT_NULL_YIELDS_NULL {ON | OFF} I NUMERIC_ROUNDABORT {ON | OFF} I QUOTED_IDENTIFIER {ON | OFF} I RECURSIVEJTRIGGERS {ON | OFF} ::= RECOVERY {FULL | BULK_LOGGED | SIMPLE} I TORN_PAGE_DETECTION {ON I OFF}
Конструкция , указываемая после ключевого слова WITH, предназначена для указания метода прерывания пользовательских транзакций. Это необходимо при внесении изменений в свойства базы данных. Конструкция имеет следующий синтаксис: ::= ROLLBACK AFTER integer [SECONDS] | ROLLBACK IMMEDIATE | NO_WAIT
Рассмотрим назначение параметров этой конструкции: •
ROLLBACK
AFTER
integer
[SECONDS] —
ПреДПИСЫВаеТ ВЫПОЛНИТЬ ОТКаТ
пользовательских транзакций через указанное количество секунд. Соответственно, выполнение собственно изменений опций конфигурации базы данных также откладывается на указанное количество секунд; •
ROLLBACK IMMEDIATE — в этом случае все активные транзакции будут откачены незамедлительно после выполнения администратором команды ALTER DATABASE;
•
NO_WAIT — в данном случае отката транзакций не выполняется, но если на момент выполнения команды ALTER DATABASE будет иметься хоть одна активная транзакция, то выполнение изменений опций конфигурации отменяется.
Мы рассмотрели теоретическую часть изменения базы данных. Для иллюстрации сказанного рассмотрим несколько примеров, демонстрирующих использование КОМаНДЫ ALTER DATABASES. ДЛЯ Начала Добавим В базу ДаННЫХ Northwind группу файлов MyGroup, после чего создадим два файла данных, разместив их в созданной группе: ALTER DATABASE Northwind ADD FILEGROUP MyGroup
Мы создали группу файлов. Теперь же создадим два файла данных: ALTER DATABASE Northwind ADD FILE (NAME=SecFilel, FILENAME='C:\SQL2000\secl',
942
Часть IV. Разработка и сопровождение баз данных
SIZE=10 MB, MAXSIZE=25, FILEGROWTH=25%), (NAME=SecFile2, FILENAME='C:\SQL2000\sec2' , SIZE=10 MB, FILEGR0WTH=5 MB) TO FILEGROUP MyGroup
Теперь же внесем изменения в добавленный файл secFiie2, установив для него максимальный размер, равный 50 Мбайт, шаг приращения 10%, а также задав ДЛЯ НеГО НОВОе ЛОГИЧеСКОе ИМЯ — T x t l m g D a t a . ALTER DATABASE N o r t h w i n d MODIFY
FILE
( NAME=SecFile2, NEWNAME=TxtImgData, MAXSIZE=50 MB, FILEGROWTH=10%)
В завершение переведем базу данных в режим доступа только одного пользователя, разрешим рекурсивный вызов триггеров, а также изменим модель восстановления базы данных На Bulk-Logged: ALTER DATABASE Northwind SET SINGLE_USER, RECURSIVE_TRIGGERS ON, RECOVERY BULK_LOGGED WITH ROLLBACK AFTER 15 SECONDS
Отсоединение и присоединение базы данных При работе с SQL Server 2000 разрешается выполнять отсоединение базы данных. Отсоединение (detach) является операцией, в результате которой из таблицы sysdatabases системной базы данных Master удаляется информация о некоторой базе данных. В итоге сервер перестает воспринимать базу данных. Эту операцию можно сравнить с удалением базы данных с тем различием, что при отсоединении базы данных не выполняется удаление ее файлов. Отсоединенная база данных впоследствии может быть присоединена (attach) к серверу. Файлы отсоединенной базы данных могут копироваться как обычные файлы операционной системы. Их можно заархивировать, записать на компакт-диски и разослать в филиалы. Подобным образом можно также создавать резервные копии базы данных. В обычной ситуации файлы базы данных блокируются сервером и к ним нельзя получить доступ обычными средствами. С файлами же отсоединенной базы данных можно выполнять любые операции, поддерживаемые для обычных файлов. Для отсоединения базы данных существует системная хранимая процедура: sp_detach_db
[Sdbname =] 'dbname' [, [Sskipchecks =]
'skipchecks']
С помощью первого параметра процедуры указывается имя базы данных, которую необходимо отсоединить. С помощью второго параметра можно предписать серверу выполнить обновление статистики для отсоединяемой базы данных. Для этого достаточно указать для параметра значение TRUE. Обновление статистики может быть полезным при копировании базы данных на носитель, доступный только для чтения (например, компакт-диск), т. к. впоследствии этого выпол-
943
Глава 20. Работа с базой данных
нить не удастся. В этом случае предварительно можно перевести базу данных в режим "только для чтения" (read only).
Замечание Нельзя отсоединить базу данных, если с ней работает хоть один пользователь. Также нельзя отсоединять базу данных, сконфигурированную для репликации. База данных также может быть отсоединена средствами Enterprise Manager. Для этого необходимо в контекстном меню базы данных выбрать команду All Tasks, а затем команду Detach Database. В ответ откроется окно Detach Database (рис. 20.17), с помощью которого можно разрешить обновление статистики для базы данных, для чего достаточно установить флажок Update statistics prior to detach. Также в окне отображается количество пользователей, работающих с базой данных, и статус участия базы данных в репликации. 2<J Detach Database - pubs Detach the database from the server so that the database files can be copied. A detached database cannot be used until it is attached again. - P atabase status 0 Connections using this database: No Database being replicated: STATUS: The database is ready to be detached. • Detach options W Update jjtati
>
II >г о detacH
Cancel
Help
Рис. 20.17. Окно Detach Database
В качестве примера рассмотрим отсоединение базы данных pubs с выполнением обновления статистики: EXEC sp_detach_db 'pubs', 'TRUE'
Как уже было сказано, отсоединенная база данных может быть впоследствии присоединена, что подразумевает собой создание в таблице sysdatabases базы данных Master строки с описанием присоединяемой базы данных. При этом не выполняется создание файлов базы данных, а используются существующие файлы. Присоединение базы данных производится с помощью следующей хранимой процедуры: sp_attach_db
[Sdbname =] 'dbname', [gfilenamel =] 'filename__n' [,...16]
Первый параметр указывает имя, которое будет присвоено присоединяемой базе данных. Это имя может отличаться от первоначального названия базы данных, но быть уникальным в пределах сервера. С помощью следующего параметра 31 Зак. 83
944
Часть IV. Разработка и сопровождение баз данных
указывается имя первичного файла базы данных. Полный путь к остальным файлам содержится в таблице s y s f i i e s , находящейся в первичном файле базы данных. Однако вполне может сложиться ситуация, когда файлы базы данных были перемещены с их начального места. В этом случае необходимо будет явно указать путь и имена всех файлов базы данных, перечислив их через запятую. Однако следует учитывать ограничение процедуры sp_attach_db — она позволяет указывать не более 16 файлов. Если же требуется задать большее количество файлов, то следует использовать команду CREATE DATABASE С параметром FOR ATTACH.
Замечание Можно не указывать файлы журнала транзакций. В этом случае сервер автоматически создаст для базы данных новый журнал транзакций, состоящий из одного файла и имеющий имя, основанное на имени базы данных, к которому будет добавлен суффикс _Log. В качестве примера рассмотрим присоединение отсоединенной в предыдущем примере базы данных pubs: EXEC sp_attach_db 'pubs' , 'G:\Program Files\Microsoft SQL Server\MSSQL$TRELON\Data\pubs.mdf'
В данном примере мы указали только имя первичного файла базы данных, т. к. местоположение файлов не менялось. В принципе, при желании можно явно определить и местоположение других файлов, но этого не требуется. Для полноты картины рассмотрим выполнение той же операции средствами команды CREATE DATABASE с использованием параметра FOR ATTACH: CREATE DATABASE pubs ON PRIMARY (FILENAME = 'G:\Program Files\Microsoft SQL Server\MSSQL$TRELON\Data\pubs.mdf) FOR ATTACH
Хранимая процедура sp_attach_db в основном предназначена для присоединения баз данных, состоящих из множества файлов. Если же база данных представлена единственным файлом данных, то для ее присоединения можно использовать следующую хранимую процедуру: sp_attach_single_file_db
[Sdbname =] 'dbname',
[@physname =] 'physical_name'
С помощью первого параметра процедуры указывается имя, которое будет присвоено присоединяемой базе данных. С помощью второго же параметра задается путь и имя файлу данных, который и представляет базу данных. В ходе выполнения процедуры автоматически будет создан журнал транзакций, представленный единственным файлом. Присоединение базы данных средствами Enterprise Manager выполняется с помощью окна Attach Database (рис. 20.18), открыть которое можно с помощью контекстного меню папки Databases, выбрав в нем команду All Tasks, а затем команду Attach Database.
945
Глава 20. Работа с базой данных
Attach Database - STORAGE\TRELQN MDF file of databasetoattach: IGAPiogram Files\Microsoft SQL Server\MSSQL\.Data\MyDisti Original File Name(s)
MyDistrib.MDF MyDistrib.LDF
Attach as: Specify database owner:
Verify
I Current File(s) Location 0 G:\Program Files\Microsoft SQL Server^MSS @ GAProgram Files\Microsoft SQL ServeAMSS jMyDistn ZJ
OK
Cancel
Help
Рис. 20.18. Окно Attach Database
Удаление базы данных Предыдущие разделы были посвящены рассмотрению различных операций при работе с базой данных. Логическим же завершением манипуляций с базой данных является ее удаление. Для выполнения этой операции используется следующая команда: DROP DATABASE database_name
[ ,...n ]
С помощью единственного параметра команды указывается имя базы данных, которую необходимо удалить. Однако за одну операцию можно удалить множество баз данных, просто перечислив их имена через запятую. При удалении базы данных происходит удаление строки таблицы sysdatabases, описывающей соответствующую базу данных. Также производится и физическое удаление всех файлов, из которых состояла база данных. Тем не менее, имея резервную копию базы данных, впоследствии можно восстановить ее снова.
С
Замечание
Команда D R O P D A T A B A S E д о л ж н а выполняться в контексте б а з ы д а н н ы х Нельзя удалить системные базы данных Model, Tempdb, Msdb и M a s t e r .
Master.
Глава 21
Работа с таблицами В любой системе управления базами данных таблицы играют огромную роль. Таблицы используются для хранения всей информации, которую пользователи внесли в базу данных. С точки зрения пользователя таблица представляет собой двумерный массив, каждая строка которого является экземпляром описываемого в таблице типа объекта. Столбцы массива представляют собой атрибуты объекта. На пересечении конкретной строки и конкретного столбца находится атрибут конкретного объекта. Рассмотрим это более подробно. На рис. 21.1 приведена таблица authors базы данных pubs, открытая с помощью Enterprise Manager. Замечание База данных pubs поставляется фирмой Microsoft в составе инсталляционного комплекта SQL Server 2000 и устанавливается автоматически. Эта база данных специально предназначена для проведения всяческих экспериментов. |*2и SQL Server Enterprise Manager- [2:Data in Table 'authors' in "pt.
,|n|xj
!; °*jj] Console
-Iff I x l
6?
Jt
Window
I 32. Ш 121 au id 172-32-1176 213-46-8915 238-95-7766 267-41-2394 274-80-9391 341-22-1782 409-56-7008 427-17-2319 472-27-2349 486-29-1786 527-72-3246 648-92-1872 672-71-3249 712-45-1867 722-51-5454 724-08-9931 724-80-9391 756-30-7391 807-91-6654 846-92-7186 893-72-1158 899-46-2035 998-72-3567 1
Help
• & M .4* л |au Iname White Green Carson O'Leary Straight Smith Bennet Dull Gringlesby Locksley Greene Blotchet-Halls Yoko j moto del Castilo DeFrance Stringer MacFeather Karsen Panteley Hunter McBadden Ringer Ringer
«»!/ | И : .; | v 1И * A• au fname Johnson Marjorie Cheryl Michael Dean Meander Abraham Ann Burt Charlene Morningstar Reginald Akiko Innes Michel Dirk Stearns Livia Sylvia Sheryl Heather Anne Albert
I phone 408 496-7223 415 986-7020 415 548-7723 408 286-2428 415834-2919 913 843-0462 415 658-9932 415 836-7128 707 938-6445 415 585-4620 615 297-2723 503 745-6402 415 935-4228 615 996-8275 219 547-9982 415 843-2991 415 354-7128 415 534-9219 301 946-8853 415 836-7128 707 448-4982 801 826-0752 801 826-0752
dJJ
Рис. 2 1 . 1 . Таблица a u t h o r s базы данных pubs
city address 10932 Bigge Rd. Menlo Park 309 63rd St, #411 Oakland 589 Darwin Ln. Berkeley 22 Cleveland Av. * San Jose 5420 College Av. Oakland 10 Mississippi Dr. Lawrence 6223 Bateman St. Berkeley 3410 Blonde St. Palo Alto PO Box 792 Covelo 18 Broadway Av. San Francisco 22 Graybar House 1 Nashville 55 Hillsdale Bl. Corvallis 3 Silver Ct. Walnut Creek 2286 Cram PI. #86 Ann Arbor 3 Balding PI. Gary 5420 Telegraph Av Oakland 44 Upland Hts, Oakland 5720McAuleySt. Oakland 1956 Arlington PI. Rockville 3410 Blonde St. Palo Alto 301 Putnam Vacaville 67 Seventh Av. Salt Lake City 67 Seventh Av. Salt Lake City
I state 1 sip CA 94025 CA 94618 CA 94705 CA 95128 CA 94609 66044 KS CA 94705 CA 94301 CA 95428 CA 94130 TN 37215 97330 OR CA 94595 MI 48105 IN 46403 CA 94609 CA 94612 CA 94609 MD 20853 CA 94301 CA 95688 UT 84152 UT 84152
contract 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1
Jj
Глава 21. Работа с таблицами
947
Проектирование таблиц Прежде чем вы сможете работать с таблицами, их необходимо создать. Во время этой операции пользователь определяет имя таблицы, имена столбцов, тип хранимых в них данных, значения по умолчанию, возможность хранения неопределенных значений, первичный и внешний ключи и некоторые другие свойства. Создание таблиц в SQL Server 2000 возможно либо с помощью графического интерфейса Enterprise Manager, либо с помощью команд Transact-SQL. К сожалению, мастера создания таблиц в SQL Server 2000 нет. Прежде чем приступить к непосредственному созданию таблицы, необходимо решить, какие столбцы должны быть определены в таблице, как она сама будет связана с другими таблицами, какие данные предполагается хранить в столбцах таблицы и т. д. То есть сначала нужно разработать логическую модель таблицы, которая бы органично вписывалась в общую логическую модель базы данных. Точнее, сначала должна быть разработана общая логическая модель базы данных, а уже потом конкретные таблицы. Основные требования и рекомендации по созданию таблиц были рассмотрены в главе 17. Предполагается, что пользователь имеет хорошо спланированную логическую модель таблицы, и осталось только реализовать ее физически. Именно этому и посвящена данная глава.
Ограничения целостности При создании таблиц пользователь может для столбцов помимо задания базовых свойств, таких как имя, тип данных, размер и точность, указать ограничения целостности. Ограничения целостности (constraints) — это механизм контроля значений, которые могут храниться в полях строки. В SQL Server 2000 поддерживаются следующие ограничения целостности: •
Check — с помощью логических условий налагает ограничение на значения, которые могут храниться в столбце;
• Null — задает возможность хранения неопределенных значений; • Default — определяет значение по умолчанию; П Unique — гарантирует уникальность значений в столбце; П Primary Key — определяет первичный ключ; П Foreign Key — определяет внешний ключ; • No Action — предписывает не выполнять в зависимой таблице никаких действий при удалении или обновлении строк в главной таблице. Это поведение соответствует поведению SQL Server 7.0; П Cascade — в данном случае будет осуществляться каскадное изменение значений в зависимой таблице при внесении изменений в главную таблицу.
/
948
Часть IV. Разработка и сопровождение баз данных
Замечание Последние два ограничения целостности являются нововведением в SQL Server 2000.
Рассмотрим более подробно использование каждого из вышеперечисленных ограничений целостности.
Ограничение целостности Check Ограничение целостности Check предназначено для создания ограничений на значения, которые могут храниться в поле строки. Ограничение устанавливается в виде логического условия, лишь при выполнении которого разрешается вставка значения. Если условие не выполняется, то попытка вставки или изменения строки отклоняется. При определении логического условия можно использовать любые команды, функции и переменные, доступные в SQL Server 2000. Например, если в столбце cost хранятся числовые значения и необходимо гарантировать, что они не будут превышать 100 и будут не менее 15, то условие будет выглядеть следующим образом: cost>=15 AND cost<=100 ИЛИ c o s t BETWEEN 15 and
100
В приведенном примере логическое условие было определено с помощью констант. Однако в условии могут использоваться и другие столбцы таблицы. Например, если в таблице имеется три числовых столбца и значение одного из них зависит от значений двух других, то с помощью ограничения целостности Check можно произвести проверку выполнения установленных правил. Предположим, что в поле mincost хранится себестоимость товара, в поле maxcost — максимально разрешенная цена товара, а в поле cost — цена товара, установленная менеджером для конкретного покупателя. Необходимо ввести ограничение, которое бы автоматически контролировало значение в поле cost в пределах между mincost и maxcost. Логическое условие будет выглядеть следующим образом: cost>=mincost AND
cost<=maxcost
Ограничения целостности Check были введены в SQL Server 7.0. В более ранних версиях для контроля значений в столбцах использовались правила (rules). В SQL Server 2000 правила были оставлены для обеспечения совместимости с предыдущими версиями. Однако правила должны определяться как отдельные объекты и затем привязываться к столбцам таблицы. При этом с каждым столбцом можно было связать лишь одно правило. Подробно использование правил было рассмотрено в разд. "Правила" главы 18. Ограничения целостности определяются на уровне столбца и не могут быть отделены от него. (
Замечание
Компания Microsoft настоятельно рекомендует применять ограничения целостности Check и не прибегать к использованию правил. Весьма вероятно, что в будущих
Глава 21. Работа с таблицами
949
версиях SQL Server правила поддерживаться не станут. При создании новых таблиц и баз данных следует работать с ограничениями целостности. Для одного столбца может быть определено множество ограничений целостности Check. Присваиваемые определенному полю значения будут автоматически проверяться ядром SQL Server 2000 на выполнение установленных ограничений. Последовательность проверок соответствует порядку, в котором были созданы ограничения целостности Check.
Ограничение целостности Null В полях таблицы SQL Server 2000 можно хранить не только конкретные ния, но и неопределенные значения. Неопределенное значение это не самое, что пустое значение для текстовых строк или 0 — для числовых ний. Если в поле хранится неопределенное значение, можно считать, что не хранится ничего. Неопределенное значение обозначается как NULL.
значето же значев поле
Если при вставке в таблицу новой строки не указываются значения для некоторых полей, то вставка строки будет возможна только в том случае, если для опущенных полей разрешено хранение значений NULL ИЛИ определены значения по умолчанию. При создании столбцов таблицы пользователь может явно указать, будут ли в них храниться значения NULL. Однако задание возможности хранения неопределенного значения необязательно. В этом случае при создании таблицы будут учитываться свойства соединения, в котором организуется таблица. Можно явно указать, будут ли столбцы вновь создаваемых таблиц, для которых явно не указана возможность хранения значений NULL, хранить такие значения или нет. Для этого предназначены следующие команды: •
SET
ANSI_NULL_DFLT_ON
{ON
|
OFF} —
ПОСЛе ВЫПОЛНеНИЯ ЭТОЙ КОМЭНДЫ С
параметром ON все вновь создаваемые столбцы, для которых явно не разрешено (или запрещено) хранение неопределенных значений, будут иметь возможность хранения таких значений; •
SET
ANSI_NULL_DFLT_OFF
{ON
|
OFF} —
ПОСЛе ВЫПОЛНеНИЯ ЭТОЙ КОМаНДЫ
для всех создаваемых столбцов хранение значений NULL будет запрещено.
Замечание ОПЦИИ ANSI_NULL_DFLT_ON И ANSI_NULL_DFLT_OFF КОМЭНДЫ SET ЯВЛЯЮТСЯ ВЗЭИ-
моисключающими. При установке любой из опций в значение ON, другая автоматически устанавливается в значение OFF. МОЖНО установить оба параметра в значение OFF и тем самым убрать значение по умолчанию. При создании столбца пользователь должен явно определить, будут ли в столбце храниться (NULL) ИЛИ нет ( N O T N U L L ) н е о п р е д е л е н н ы е з н а ч е н и я .
Замечание Приведенные выше команды используются для управления свойствами по умолчанию на уровне соединения, хранимой процедуры или пакета. Для установки этих
950
Часть IV. Разработка и сопровождение баз данных свойств на уровне сервера необходимо вызывать хранимую процедуру sp_configure 'user o p t i o n ' . Аналогичных результатов можно добиться с помощью Enterprise Manager. Для этого следует открыть окно свойств службы MSSQLServer нужного сервера и на вкладке Connections в списке Default connections options настроить параметры по умолчанию. Также указанные свойства можно контролировать и на уровне базы данных, например, с помощью хранимой процедуры sp_dboption. Управление свойствами базы данных было подробно рассмотрено в предыдущей главе.
Ограничение целостности Default Некоторые таблицы имеют множество столбцов, и явное указание значений для всех полей строки при вставке ее в таблицу бывает не нужно. Например, пусть в таблице Address имеется поле c i t y i o , где указывается город, в котором проживает сотрудник. Во многих организациях большинство сотрудников живут в том же городе, в котором находится организация. Поставив в поле c i t y i D значение по умолчанию (defaults), соответствующее идентификационному номеру нужного города, можно избавить пользователей от многократного указания одних и тех же значений. Только при добавлении сведений о сотруднике, проживающем в другом городе, нужно будет указать явно другое значение. Это лишь один из примеров использования значений по умолчанию. Значения по умолчанию позволяют автоматически заполнять поля не только значениями констант, определенными при создании столбца, но и результатом вычисления различных выражений и функций. Иногда в таблицу добавляется столбец, в котором хранится идентификационный номер системы безопасности (SID, Security ID) пользователя, который вставил строку. Это позволяет отследить, какой конкретно человек какие данные внес в таблицу. Для такого поля определяется значение по умолчанию как результат выполнения функции S U S E R S I D O . При вставке строки SQL Server 2000 будет автоматически добавлять идентификационный номер пользователя. При определении в таблице столбца ROWGUIDCOL сервер автоматически использует для него ограничение по умолчанию, являющееся функцией NEWIDO. Эта функция генерирует новое значение глобального уникального идентификатора (GUID, Global Unique Identifier) и подставляет его в добавляемую строку. Это позволяет однозначно идентифицировать каждую строку таблицы. При чем идентификатор строки будет уникальным в пределах планеты. Столбцы ROWGUIDCOL применяются в качестве служебных в репликации сведением для идентификации строк. Это необходимо, т. к. одна и та же строка может быть тиражирована на множество серверов.
Замечание При определении значения по умолчанию нельзя использовать ссылки на другие столбцы. Если необходимо ЁЫЧИСЛЯТЬ значение столбца в зависимости от значений других столбцов, то можно создать вычисляемый (computed) столбец. Для определения значений по умолчанию разрешено применение констант, системных переменных и функций, а также любых выражений, построенных на их основе.
Глава 21. Работа с таблицами
951
Ограничение целостности Default было введено только в SQL Server 7.0. В более ранних версиях пользователи должны были задавать значения по умолчанию как объекты базы данных, а затем связывать их с нужными столбцами таблиц. Достоинством подобного подхода является централизованное управление собственно значением, присваиваемым столбцам таблицы. Однако трудозатраты на определение значений по умолчанию подобным способом заметно больше, чем при работе с умолчаниями, определенными как ограничения целостности. Подробно создание и использование значений по умолчанию как объектов базы данных было рассмотрено в разд. "Умолчания" главы 18. Тем не менее, в SQL Server 2000 можно использовать оба типа умолчаний. Выбор того или иного из них полностью зависит от пользователя. Однако Microsoft не рекомендует использовать значения по умолчанию, определяемые как объекты базы данных, т. к. возможно в следующих версиях они поддерживаться не будут. Однако то же самое говорилось и в отношении SQL Server 7.0. Тем не менее, в SQL Server 2000 можно определять значения по умолчанию (а также правила) как объекты базы данных.
Ограничение целостности Unique Иногда бывает необходимо обеспечить уникальность значений, которые могут храниться в столбце таблицы. Часто это делается не только для того, чтобы обеспечить уникальность идентификационных номеров, но и для гарантии, что в таблицу не было введено несколько одинаковых значений. Например, в таблице стран необходимо гарантировать уникальность названия стран. Иначе для ссылки на одно и то же государство могут быть использованы два разных идентификационных номера. Ограничение целостности Unique обеспечивает уникальность значений в столбце таблицы. Кроме того, уникальность может контролироваться на основе значений более чем одного столбца. Например, контроль уникальности сотрудников только на основе фамилии может оказаться невозможным, если в организации работает несколько человек с одинаковой фамилией. Однако контроль уникальности на основе полей с фамилией, именем и отчеством гарантирует достаточно высокий уровень уверенности в том, что ограничение целостности Unique не станет конфликтовать с реальными данными о сотрудниках.
Замечание Хотя при установлении для столбца таблицы ограничения целостности Unique запрещается наличие двух строк с одинаковым значением в соответствующем поле, тем не менее, в этих полях не запрещается хранение неопределенных значений (NULL). Однако в столбце таблицы с ограничением целостности Unique может существовать только одна строка с неопределенным значением поля. Ограничение целостности Unique может быть наложено на любой столбец таблицы или любую их комбинацию. То есть в одной таблице может существовать множество правил контроля уникальности данных.
952
Часть IV. Разработка и сопровождение баз данных
Ограничение целостности Primary Key В реляционных базах данных не обойтись без связывания таблиц. В теории реляционных баз данных говорится, что связывание таблиц выполняется с помощью ключей. Напомним, что ключом называется множество атрибутов, задание значений которых позволяет однозначно определить значения остальных атрибутов таблицы.
Замечание Подробно типы ключей и их использование было рассмотрено в главе 17. В одной таблице может существовать множество ключей. Один из таких возможных ключей может быть выбран в качестве первичного ключа (Primary Key). Применительно к SQL Server 2000 первичный ключ является ничем иным, как рядовым ограничением целостности. Однако оно играет очень важную роль в обеспечении целостности данных. В основе ограничения целостности Primary Key лежит применение уникального индекса (Unique Index), который, как и ограничение целостности Unique, обеспечивает уникальность хранящихся в столбце (или столбцах) данных. Использование уникального индекса, а не ограничения целостности Unique позволяет повысить скорость доступа к данным первичного ключа. Таким образом, для столбца или столбцов, выбранных в качестве первичного ключа, SQL Server 2000 автоматически обеспечивает уникальность значений. Однако одним из требований к первичному ключу является запрещение хранения неопределенных значений (NULL). В этом и есть основное отличие ограничений целостности Unique и Primary Key. Кроме того, в таблице можно определить лишь один первичный ключ, но можно задать множество ограничений целостности Unique. Последнее должно использоваться, если необходимо гарантировать уникальность значений, но первичный ключ уже определен.
Замечание Запретив хранение в столбце значений NULL, И установив для него ограничение целостности Unique, можно добиться того же эффекта, что и при использовании ограничения целостности Primary Key. SQL Server 2000 позволяет связывать внешний ключ таблицы не только с первичным ключом, но и с полем, имеющим ограничения целостности Unique. Обычно в качестве первичного ключа выбираются столбцы небольшого размера, занимающие всего несколько байтов. Чаще всего используются столбцы с целочисленными типами данных — t i n y i n t , s m a i i i n t , i n t и b i g i n t . Тем не менее, разрешается создание первичного ключа и на основе столбцов любых других типов данных. Например, в таблице authors базы данных pubs в качестве первичного ключа используется столбец au_id, который имеет определяемый пользователем тип данных id, созданный на основе типа данных varchar (11).
Глава 21. Работа с таблицами
953
Ограничение целостности Foreign Key Когда выполняется связывание таблиц, пользователь должен определить первичный ключ в главной (или родительской) таблице и назначить внешний ключ в зависимой (или дочерней) таблице. Для создания внешнего ключа в таблице SQL Server 2000 используется ограничение целостности Foreign Key. Таким образом обеспечивается ссылочная целостность данных. При определении одного из столбцов таблицы в качестве внешнего ключа SQL Server 2000 будет автоматически контролировать правильность вводимых значений. При попытке вставки нового или изменении существующего поля строки, для которого определено ограничение целостности Foreign Key, система будет проверять, имеется ли новое значение в столбце первичного ключа главной таблицы. Если новое значение найдено в первичном ключе, то операция разрешается. В противном случае происходит откат операции и SQL Server 2000 выдает соответствующее сообщение об ошибке.
Замечание Хотя обычно внешний ключ связывается с первичным ключом, в SQL Server 2000 разрешено использование в качестве первичного ключа столбца (или столбцов) с ограничением целостности Unique и. запрещенной возможностью хранения неопределенных значений. В отличие от первичного ключа, в столбцах внешнего ключа разрешается хранение неопределенных значений (NULL). Такая возможность может быть использована для временного разрыва связи между строками главной и зависимой таблицы. Позже строки зависимой таблицы могут быть снова привязаны к той же или другой строке главной таблицы, или даже нескольким разным строкам. При определении внешнего ключа в таблице, в которой имеются данные, необходимо убедиться, что для каждой строки зависимой таблицы в главной таблице имеется соответствующее значение первичного ключа. Во всех строках зависимой таблицы, не имеющих соответствующего значения первичного ключа, необходимо предварительно установить столбцы внешнего ключа в неопределенное значение, удалить их или изменить строки таблиц таким образом, чтобы ссылочная целостность соблюдалась.
Замечание Свойства связываемых столбцов главной и зависимой таблицы, такие как тип хранимых данных, сопоставление (для символьных данных), размер и точность, должны совпадать. Совпадение имен столбцов, значений по умолчанию и других свойств не обязательно.
Ограничение целостности No Action и Cascade Перечисленные ограничения целостности были доступны и в SQL Server 7.0. Однако в SQL Server 2000 появилось два дополнительных ограничения целостности, позволяющих контролировать удаление или изменение данных в табли-
954
Часть IV. Разработка и сопровождение баз данных
це, с которой посредством внешнего ключа связана другая таблица. В предыдущих версиях, если в главной таблице удалялась строка, с которой была связана строка в зависимой таблице, требовалось предварительное удаление связанных строк во всех зависимых таблицах. В противном случае удаление строки в главной таблице было невозможно. Аналогичная ситуация была и при изменении значения первичного ключа. В SQL Server 2000 реализованы механизмы, позволяющие переложить на сервер выполнение сопутствующих действий — удаление (или обновление) строк во всех зависимых таблицах. Этими механизмами как раз и являются ограничения целостности No Action и Cascade. Однако следует учитывать, что эти ограничения целостности определяются не в главной, а в зависимой таблице. При этом они указываются для конкретного ограничения целостности Foreign Key. Ограничение целостности No Action предписывает не выполнять никаких действий в зависимой таблице при изменении данных в главной таблице. Таким образом, вся работа по предварительной подготовке таблиц к изменениям ложится на пользователя. Например, при удалении строки главной таблицы, с которой связано пять строк в зависимой таблице с ограничением целостности No Action, пользователь должен будет предварительно удалить соответствующие пять строк зависимой таблицы, и только после этого удалить строку главной таблицы. Подобное поведение было единственным в предыдущих версиях SQL Server. В распоряжении пользователей, работающих с SQL Server 2000, имеется возможность переложить выполнение дополнительных операций на сервер. Для этого достаточно для зависимой таблицы определить ограничение целостности Cascade. В этом случае сервер будет выполнять в отношении значений внешнего ключа те же действия, которые должны быть выполнены в отношении первичного ключа. Например, при удалении из главной таблицы строки, с которой связаны строки зависимой таблицы, будет выполнено удаление из зависимой таблицы этих строк. При изменении значения первичного ключа сервер выполнит соответствующие изменения и в зависимой таблице.
(
Замечание
J
Для главной таблицы, с которой связано множество зависимых таблиц, может сложиться ситуация, когда часть таблиц имеет ограничение целостности No Action, a другая — Cascade. В этом случае сервер не выполнит никаких изменений, т. к. транзакция, в контексте которой станут осуществляться эти изменения, будет откачена, как то предписывает ограничение целостности No Action. Откат изменений будет произведен и в том случае, если в зависимой таблице с ограничением целостности Cascade в свою очередь связана другая таблица, но для нее используется ограничение целостности No Action.
Выбор сопоставления Как уже говорилось ранее, в SQL Server 2000 появилась возможность выбора сопоставления не только на уровне сервера при его инсталляции, но и на уровне базы данных, ее отдельной таблицы или даже столбца таблицы. Таким обра-
Глава 21. Работа с таблицами
955
зом, при создании таблицы следует решить, какое сопоставление будет использоваться для таблицы. По умолчанию для таблицы применяется то же сопоставление, что определено на уровне базы данных. Однако с помощью параметра COLLATE при создании таблицы можно указать, какое сопоставление будет выбрано для столбцов таблицы. Подробно выбор сопоставления рассматривался в разд. "Выбор сопоставления" предыдущей главы, поэтому мы не будем лишний раз останавливаться на этом.
Выбор типа данных Одной из основополагающих характеристик столбца является тип данных (data type). Тип данных определяет диапазон значений, которые можно будет хранить в столбце. Подробно типы данных, поддерживаемые SQL Server 2000, будут рассмотрены в главе 26. Здесь же скажем, что для столбцов могут применяться не все типы данных, поддерживаемые Transact-SQL. В частности, для таблиц не могут быть выбраны типы данных cursor и t a b l e . Они служат только для работы с локальными переменными, функциями, процедурами и т. д. В свою очередь, для локальных переменных нельзя использовать некоторые типы данных, успешно поддерживаемые столбцами таблиц. К этим типам данных относятся t i m e s t a m p , t e x t , n t e x t И image. ПОЛНЫЙ СПИСОК ТИПОВ ДЭННЫХ, Применимых
для столбцов, приведен в табл. 21.1. Таблица 21.1. Список ТИПОВ данных, используемых для столбцов
Тип данных
Краткое описание
bigint
Целочисленный тип данных, занимающий 8 байт
float
Нецелочисленный тип данных приблизительной точности
ntext
Текстовые данные Unicode длиной до 1 Гбайта
int
Целочисленный тип данных, занимающий 4 байта
real
Нецелочисленный тип данных приблизительной точности
binary
Двоичные данные фиксированной длины до 8000 байт
smallint
Целочисленный тип данных, занимающий 2 байта
datetime
Дата и время высокой точности (8-байтовый)
varbinary
Двоичные данные переменной длины до 8000 байт
tinyint
Целочисленный тип данных, занимающий 1 байт
smalldatetime
Дата и время низкой точности (4-байтовый)
image
Двоичные данные длиной до 2 Гбайт
bit
Один бит, принимает значение либо 0, либо 1
char
Символьные данные не Unicode фиксированной длины до 8000 символов
decimal
Нецелочисленный тип данных фиксированной точности
956
Часть IV. Разработка и сопровождение баз данных
Таблица 21.1 (окончание) Тип данных varchar
Краткое описание Символьные данные не Unicode переменной длины до 8000 символов
timestamp
Временной штамп или версия строки
numeric
Нецелочисленный тип данных фиксированной точности
text
Текстовые данные не Unicode длиной до 2 Гбайт
sqlvariant
Тип данных, позволяющий хранить значения других типов данных
money
Денежный тип данных высокой точности (8-байтовый)
nchar
Символьные данные Unicode фиксированной длины до 4000 символов
smallmoney
Денежный тип данных низкой точности (4-байтовый)
nvarchar uniqueidentif ier
Символьные данные Unicode переменной длины до 4000 символов Тип данных, предназначенный для хранения глобальных уникальных идентификаторов
Использование автонумерации Часто набор полей таблицы является неудобным для использования его в качестве первичного ключа. Например, в таблице с описанием человека в качестве первичного ключа можно выбрать столбец с номером паспорта и его серией. Однако иногда по тем или иным причинам человек меняет паспорт. В этом случае необходимо исправить значения не только в главной таблице, но и в зависимых таблицах. Кроме того, следует учесть ошибки при вводе данных оператором или неверное указание их самим человеком. Эти и некоторые другие причины заставляют многих разработчиков создавать в таблице дополнительный столбец, единственное назначение которого — служить идентификационным номером строки в таблице. Такой подход, помимо сведения практически к нулю изменений первичного ключа, обеспечивает и более высокую производительность. Это происходит за счет того, что размер идентификационного номера обычно не превышает 4 байт (тип данных i n t ) или 8 байт (тип данных bigint), тогда как для первичного ключа на основе номера и серии паспорта могло бы понадобиться более 10 байт. Если бы первичный ключ определялся на основе столбцов с фамилией, именем и отчеством сотрудника, то размер первичного ключа мог бы составить несколько десятков байт. При большом количестве строк в таблицах увеличение производительности при использовании специального столбца становится весьма заметными. Все сказанное выше было приведено для того, чтобы дать понять, насколько полезным может быть использование специальных столбцов в качестве первичного ключа. Однако в этом случае встает проблема с обеспечением уникальности значений в новом столбце. Возлагать решение этой проблемы на пользователя (или
Глава 21. Работа с таблицами
957
программу) и требовать от него ввода уникальных значений для каждой строки было бы нерационально. Поэтому в SQL Server 2000 была реализована возможность автоматического обеспечения уникальности значений по умолчанию в столбцах таблицы. Для этого предназначена автоматическая нумерация. Чтобы разрешить поле таблицы для автоматической нумерации, для него необходимо установить свойство IDENTITY (ID entity, идентификационный номер сущности). При этом пользователь должен задать начальное значение и шаг приращения. Первая вставляемая в таблицу строка будет иметь значение, указанное как начальное. При вставке каждой следующей строки значение в поле со свойством IDENTITY станет монотонно увеличиваться на шаг приращения. Каждая вновь вставляемая строка будет иметь уникальное в пределах таблицы значение. Даже если вы удалите десять последних вставленных строк, новая строка будет иметь уникальное значение, не пересекающееся со значением ни одной удаленной строки. Таким образом обеспечивается уникальность значений в таблице.
ЗамечаНие В каждой таблице только для одного столбца может быть установлено свойство IDENTITY.
Значение в поле I D E N T I T Y уникально только в пределах т а б л и ц ы . Если
необходимо обеспечить уникальность значений в пределах базы данных, то следует установить для поля тип данных t i m e stamp. Если же необходимо обеспечить полную уникальность значений, то нужно использовать глобальные уникальные идентификаторы (GUID, Global Unique Identification). Для хранения значений G U I D В SQL Server 2000 служит специальный тип данных— s n i q u e i d e n t i f i e r . Создав в таблице поле с типом данных u n i q u e i d e n t i f i e r , можно установить для него в качестве значения по умолчанию функцию N E W I D ( ) , которая возвращает значение, с большой вероятностью уникальное в пределах планеты.
При нормальной работе сервер не разрешает пользователю явно указывать значения для столбца-счетчика при добавлении в таблицу новой строки. Однако в некоторых случаях все же бывает нужно явно указать значения для столбца счетчика. Например, это может быть необходимо при закачке в таблицу строк, выкачанных ранее в текстовый файл или скопированных во временную таблицу для выполнения промежуточных операций и т. д. Для разрешения вставки значений в столбец-счетчик применяется команда: SET IDENTITY_INSERT
[ database. [ owner. ] ] { table } { ON | OFF }
Как видно из синтаксиса, пользователь может разрешить вставку данных для любой таблицы, размещенной в любой базе данных текущего сервера. Однако необходимо отметить, что в каждый момент времени пользователь может осуществлять вставку значений в столбец-счетчик только для одной таблицы. То есть если была разрешена вставка значений в одну таблицу, то прежде чем разрешить вставку в другую таблицу, надо запретить вставку значений в первую таблицу. Вставка в столбец-счетчик явных значений может быть разрешена только на уровне соединения (хранимой процедуры, пакета команд, транзакции, функции и т. д.). На уровне базы данных (с помощью процедуры sp_dboption) или сервера (с помощью процедуры s p c o n f igure) определить эту возможность нельзя.
958
Часть IV. Разработка и сопровождение баз данных
Управление таблицами средствами Transact-SQL К настоящему моменту читатель должен иметь представление практически обо всех возможностях SQL Server 2000 в отношении таблиц. В предыдущих разделах этой главы были рассмотрены различные свойства таблиц, обеспечивающие пользователя дополнительными удобствами. В этом же разделе будет рассмотрено создание, изменение, удаление и просмотр свойств таблиц. Мы рассмотрим выполнение этих операций как средствами Transact-SQL, так и средствами Enterprise Manager. Для начала рассмотрим создание таблиц средствами Transact-SQL. Этот метод предлагает максимальные функциональные возможности, однако создание таблиц средствами Transact-SQL требует определенных знаний. В SQL Server 7.0 некоторые действия по работе с таблицей могли быть выполнены только средствами Transact-SQL. Например, с помощью Enterprise Manager нельзя было создать вычисляемых столбцов (computed columns), управлять правами доступа пользователей на уровне столбцов, а также выполнять некоторые другие действия. Хотя возможности Enterprise Manager по управлению таблицами были расширены, тем не менее, этот инструмент является всего-навсего графическим интерфейсом, и его работа сводится к формированию на основе введенных пользователем значений команд Transact-SQL, которые и будут осуществлять все необходимые действия.
Создание таблиц Создание таблиц можно разбить на два этапа: планирование логической модели и физическое создание таблицы. Материал, приведенный в предыдущих разделах этой главы, а также в 18 и 20 главах должен помочь вам создать эффективную логическую модель базы данных и таблиц в частности. Вы должны решить, сколько столбцов будет создано в таблице, какие имена и типы данных они будут иметь, какой столбец или столбцы станут использоваться в качестве первичного и внешних ключей, будут ли установлены значения по умолчанию и возможность хранения неопределенных значений, какие дополнительные ограничения целостности должны быть установлены и т. д. В этом разделе обсудим физическое создание таблицы. Создание таблиц в SQL Server 2000 производится с помощью команды CREATE TABLE. Рассмотрим подробно синтаксис и использование этой команды. CREATE TABLE [database_name.[owner] | owner] table_name ({ I column_name AS computed_column_expression I } [,...n]) [ON { f i l e g r o u p I DEFAULT}] [TEXTIMAGE ON {filegroup | DEFAULT}]
Глава 21. Работа с таблицами
959
Рассмотрим назначение и использование каждого из параметров команды. П database_name
Имя базы данных, в которой будет создана таблица. Указанная база данных должна существовать. Если ее имя не задается, то таблица будет создана в текущей базе данных. Необходимо убедиться, что учетная запись пользователя имеет доступ к базе данных, в которой должна быть создана таблица, и что этот пользователь имеет права на создание таблиц. П owner Имя пользователя базы данных, который будет считаться владельцем создаваемой таблицы. Владелец таблицы может выполнять любые действия с ней, в т. ч. разрешать доступ к этой таблице другим пользователям. Если имя пользователя не указывается, то владельцем таблицы является пользователь, который создал ее. Только члены фиксированной роли сервера sysadmin или члены фиксированных ролей базы данных dbowner и db_ddiadmin могут создавать таблицы, принадлежащие произвольному пользователю базы данных. Остальные пользователи, не являющиеся членами перечисленных ролей, могут создавать таблицы, принадлежащие только им самим. При создании таблицы членами ролей sysadmin и db_owner таблица принадлежит пользователю dbo. О table_name
Имя, которое будет присвоено таблице. Для хранения имени таблицы отводится 256 байт, однако, т. к. имя указывается в формате Unicode, то оно не должно превышать 128 символов. Комбинация имени таблицы и имени ее владельца должна быть уникальна в пределах базы данных. То есть один пользователь не может создать две таблицы с одинаковым именем, но разным пользователям разрешено создавать одноименные таблицы. Для доступа к таким таблицам необходимо будет указывать помимо имени самой таблицы еще и имя ее владельца.
(
Замечание
Если создается локальная временная таблица, то ее имя не должно превышать 116 символов вместе с префиксом #. Подобное ограничение связано с некоторыми особенностями хранения имен временных таблиц. Временные таблицы всегда создаются в системной базе данных Tempdb. Если при создании временной таблицы указывается имя любой другой базы данных, то оно игнорируется, а таблица все равно создается в базе данных Tempdb.
Эта конструкция определяет свойства столбца. Синтаксис этой конструкции и ее использование будет рассмотрено в отдельном разделе данной главы. column_name AS computed_column_expression С помощью этого аргумента можно создать вычисляемые (computed) столбцы. Значения таких столбцов вычисляются каждый раз заново при обращении к ним. Например, если в таблице имеется строка, в которой существуют столбцы с ценой товара (price) и его количество (count), то столбец с общей це-
960
Часть IV. Разработка и сопровождение баз данных
ной товара (cost) может быть вычислен автоматически. Для этого при создании таблицы необходимо использовать следующую конструкцию: cost AS count * cost В структуре таблицы хранится только формула, по которой происходит вычисление значений, тогда как сами значения не хранятся. Поэтому невозможна вставка или изменение значений в вычисляемых полях. При создании вычисляемого столбца необходимо указать его имя (аргумент coiumnname) и после ключевого слова AS выражение (аргумент computed_column_expression), по которому будет вычисляться значение поля.
Замечание Если при создании вычисляемого поля приводятся параметры или функции, которые зависят от времени или других условий, то при каждой выборке значения в вычисляемом поле могут меняться. Помимо того, что вычисляемые поля не разрешено изменять, для них нельзя устанавливать ограничения целостности Unique, Primary Key, Foreign Key и Default.
Замечание В SQL Server 2000 стало возможным индексирование вычисляемых столбцов, что нельзя было осуществлять в более ранних версиях SQL Server. d
С помощью этой конструкции определяются ограничения целостности уровня таблицы. Подробно синтаксис и применение рассматриваемой конструкции будут приведены в одном из следующих разделов этой главы.
П
[,...п] Данная конструкция говорит о том, что через запятую может быть указано множество определений столбцов или ограничений целостности. Все столбцы и ограничения целостности должны быть описаны до того, как будут определяться ГруППЫ фаЙЛОВ ДЛЯ Хранения таблицы И столбцов image, t e x t И ntext.
•
ON { f i l e g r o u p I DEFAULT} С помощью этого аргумента можно явно определить группу файлов (filegroup), в которой необходимо создать таблицу. Группа файлов должна существовать в базе данных. Если этот аргумент опускается или указывается DEFAULT, то таблица будет создана в группе файлов, определенной как группа файлов по умолчанию.
•
TEXTIMAGE_ON {filegroup | DEFAULT} Если в таблице определены текстовые столбцы с типом данных t e x t и ntext или столбцы с типом данных image, то данные столбцы можно хранить в отдельной группе файлов. Это делается для повышения производительности операций обработки данных. Обработка данных в столбцах с перечисленны-
Глава 21. Работа с таблицами
961
ми типами данных требует много ресурсов системы. Тем не менее, в большинстве операций эти данные не обрабатываются. Совместное хранение обычных и перечисленных данных снижало бы производительность системы. Поэтому рекомендуется "тяжелые" данные и индексы располагать в отдельных группах файлов, которые, в свою очередь, размещаются на отдельных жестких дисках. Если аргумент TEXTIMAGE_ON опускается или указывается значение DEFAULT, TO столбцы с типом данных image, t e x t и ntext будут размещены в группе файлов по умолчанию.
Определение столбцов Как уже было сказано, обычные, не вычисляемые столбцы определяются с помощью конструкции , имеющей синтаксис: < column_definition > : := {column__name data_type} [COLLATE ] [[ DEFAULT constant_expression] I [IDENTITY [( seed , increment ) [NOT FOR REPLICATION]]] [ROWGUIDCOL] [< column_constraint >] [ ...n]
Рассмотрим подробно назначение и использование каждого из аргументов: О
column_name
Имя, которое будет иметь столбец. Имя должно быть уникальным в пределах таблицы. Так как для хранения имен объектов в SQL Server 2000 используется тип данных с поддержкой Unicode, то в имени столбца допускается указание русских символов. Если в имени столбца применяются запрещенные символы, такие как пробел, %, * и т. д., или имя столбца совпадает с зарезервированными словами, то имя столбца при создании должно быть заключено в квадратные скобки. Указание имени столбца обязательно с одним исключением. Если создаваемый столбец будет иметь тип данных timestamp, то разрешается не приводить имя столбца. В этом случае ему будет присвоено ИМЯ timestamp. О
data_type
После имени столбца через пробел указывается тип данных, который будут иметь хранимые в столбце значения. Разрешается применение как стандартных типов данных SQL Server 2000, так и пользовательских типов данных (UDDT, User Defined Data Type). При указании пользовательских типов данных следует учитывать, что возможность хранения значений NULL, определенная на уровне типа данных при его создании, может быть изменена на уровне таблицы. П COLLATE
Данный параметр позволяет указать сопоставление, которое будет использоваться для столбца. Подробно указание сопоставления было рассмотрено в разд. "Выбор сопоставления" в предыдущей главе. Здесь же скажем, что в слу-
962
Часть IV. Разработка и сопровождение баз данных чае неуказания рассматриваемого параметра для столбца будет использоваться сопоставление, определенное на уровне базы данных.
О DEFAULT constant_expression С помощью этого аргумента можно определить значение по умолчанию, которое будет присваиваться соответствующему полю строки, если при ее вставке пользователь явно не указал конкретное значение. Значение по умолчанию не может быть применено к столбцам с типом данных time stamp или с установленным свойством IDENTITY. В качестве значений по умолчанию могут применяться константы, системные переменные и функции, а также любые выражения, построенные на их основе. Использование ссылок на другие столбцы запрещено. •
IDENTITY [(seed,
increment)]
Указание этого аргумента предписывает создать столбец с поддержкой автоматической нумерации. При вставке новой строки в таблицу SQL Server 2000 автоматически обеспечивает вставку в поле IDENTITY уникального значения, монотонно увеличивающегося при вставке каждой новой строки. Свойство IDENTITY может быть установлено только для столбцов с типом данных i n t , smallint, t i n y i n t , decimal (p, 0) И numeric (p, 0). В пределах ОДНОЙ таблицы можно создать только один столбец с установленным свойством IDENTITY. Естественно, определение значения по умолчанию для столбца с установленным свойством IDENTITY невозможно. По умолчанию нумерация строк в таблице начинается с 1 и при вставке каждой новой строки это значение увеличивается на 1. Однако можно указать иное первоначальное значение и шаг приращения. Первоначально значение указывается с помощью аргумента seed, а шаг приращения — с помощью аргумента increment. •
NOT FOR REPLICATION
По умолчанию явная вставка значений в столбец с установленным свойством IDENTITY не разрешена. SQL Server 2000 будет генерировать значения для этого столбца автоматически. Однако при использовании репликации необходимо обеспечить идентичность данных как на издателе, так и на подписчиках. При репликации данных между таблицами с установленным свойством IDENTITY при вставке строк с таблицу на издателе в столбце IDENTITY ИМ могут быть присвоены значения, отличные от аналогичных значений на издателе. Чтобы избежать этого и гарантировать идентичность данных на всех участниках репликации, при создании столбца IDENTITY указывается опция NOT FOR REPLICATION. Это разрешает явную вставку значений в столбцы IDENTITY процессами репликации. •
ROWGUIDCOL
Если при определении столбца указывается аргумент ROWGUIDCOL, TO ЭТОТ столбец воспринимается SQL Server 2000 как столбец глобального уникального идентификатора строки (row global unique identifier column). Такие столбцы предназначены для выполнения специальных операций, например, при репликации сведением (merge replication). Свойство ROWGUIDCOL может быть уста-
Глава 21. Работа с таблицами
963
новлено только для столбца с типом данных uniqueidentifier. Причем это свойство может быть определено только для одного столбца таблицы.
Замечание Н а л и ч и е свойства R O W G U I D C O L не гарантирует у н и к а л ь н о с т и з н а ч е н и й в с т о л б ц е и не обеспечивает автоматического заполнения столбца при вставке новой строки. При необходимости пользователь должен вручную установить для столбца ограничение целостности U n i q u e и определить значение по умолчанию как N E W I D ( ) . Функция NEW () генерирует значения глобального идентификатора, которые с высокой вероятностью уникальны в пределах планеты.
О Эта конструкция определяет ограничения целостности на уровне столбца. Синтаксис и использование этой конструкции будет подробно рассмотрено в следующем разделе. •
[ ...п] Данная конструкция говорит о том, что для одного столбца может быть определено множество ограничений целостности, которые должны быть перечислены через пробел.
Ограничения целостности на уровне столбцов Как было сказано в конце предыдущего раздела, ограничения целостности для СТОЛбца Определяются С ПОМОЩЬЮ КОНСТРУКЦИИ . ДЛЯ ОДНОГО столбца может быть определено множество ограничений целостности или не определено ни одного. Конструкция имеет следующий синтаксис: < column_constraint > : : = [CONSTRAINT constraint_name] {[NULL | NOT NULL] | [{PRIMARY KEY | UNIQUE} [CLUSTERED | NONCLUSTERED] [WITH FILLFACTOR = f i l l f a c t o r ] [ON { f i l e g r o u p I DEFAULT}]] | [ [ FOREIGN KEY] REFERENCES r e f _ t a b l e [(ref_column)] [ON DELETE {CASCADE | NO ACTION}] [ ON UPDATE {CASCADE | NO ACTION}] [NOT FOR REPLICATION] ] | CHECK [NOT FOR REPLICATION] (logical_expression) }
Рассмотрим назначение и использование вышеперечисленных аргументов: • CONSTRAINT constraint_name Ключевое слово CONSTRAINT указывает на то, что далее следует описание ограничений целостности. С помощью аргумента constraint_name указывается имя, которое будет присвоено ограничению целостности. Имя ограничения целостности должно быть уникально в пределах базы данных. Указание конструкции CONSTRAINT c o n s t r a i n t name не обязательно. Оно обычно исполь-
964
Часть IV. Разработка и сопровождение баз данных
зуется лишь тогда, когда ограничению необходимо присвоить определенное имя. П
NULL
| NOT NULL
С помощью этих опций определяется, будет ли возможным хранение в столбце неопределенных значений или нет. Для одного столбца допускается применение только одного из аргументов. При указании NULL хранение неопределенных значений разрешено, тогда как при указании NOT NULL запрещается. Если при создании столбца не было явно указано, будет она хранить значения NULL ИЛИ нет, то для ограничения целостности берется значение по умолчанию, определяемое с помощью команд ANSI_NULL_DFLT_ON И ANSI_NULL_DFLT_OFF. •
PRIMARY KEY
При создании столбца с этим параметром будет создан первичный ключ. В таблице разрешается создавать только один первичный ключ, в который может быть включено более одного столбца. •
UNIQUE Это ключевое слово обеспечивает создание для столбца ограничения целостности Unique, обеспечивающего уникальность значений. Ограничение целостности Unique может быть определено на основе более чем одного столбца.
Замечание Для одного и того же столбца не могут быть одновременно установлены ограничения целостности Primary Key и Unique. •
CLUSTERED |
NONCLUSTERED
С помощью этих ключевых слов определяется, какой тип индекса будет создан для ограничений целостности Primary Key и Unique. При указании ключевого слова CLUSTERED для соответствующего ограничения целостности будет создан кластерный индекс. При указании NONCLUSTERED будет создан некластерный индекс. В таблице может быть только один кластерный индекс. По умолчанию для ограничения целостности Primary Key создается кластерный индекс, а для Unique — некластерный. Если же при создании таблицы для ограничения целостности Unique был создан кластерный индекс, то для первичного ключа по умолчанию будет создан некластерный индекс. (
Замечание^
^
При создании кластерного индекса происходит физическое изменение порядка расположения строк в таблице. Вставка каждой новой строки будет производиться таким образом, чтобы физический порядок строк соответствовал кластерному индексу. •
WITH FILLFACTOR = fillfactor Этот аргумент задает фактор заполнения (fill factor) страниц для создаваемых кластерных или некластерных индексов. Значение фактора заполнения мо-
Глава 21. Работа с таблицами
965
жет колебаться в пределах от 1% до 100%. Чем ниже значение фактора заполнения, тем больше места остается на страницах для вставки новых значений и тем выше производительность в целом операций вставки. Однако при установке слишком низкого значения фактора заполнения для хранения индексных данных потребуется достаточно много места. По умолчанию присвоено значение 0, что соответствует 100% заполнению страниц с обеспечением дополнительных резервов для расщепления страниц. П
ON { f i l e g r o u p
| DEFAULT}
С помощью этого аргумента можно явно определить группу файлов (filegroup), в которой должны располагаться страницы индекса создаваемого ограничения целостности. Группа файлов должна существовать в базе данных. Если этот аргумент опускается или указывается DEFAULT, TO индекс будет организован в группе файлов, определенной как группа файлов по умолчанию. •
FOREIGN KEY...REFERENCES ref_table [(ref_column)] С помощью этой конструкции определяется внешний ключ таблицы. Ключевые слова FOREIGN KEY могут не использоваться. После ключевого слова REFERENCES указывается имя таблицы, со столбцом которой будет связываться ограничение целостности Foreign Key. Это ограничение целостности связывается с одним столбцом главной таблицы. Для столбца главной таблицы, с которым связывается ограничение целостности Foreign Key, должно быть установлено ограничение целостности Primary Key или Unique. Имя таблицы, с которой связывается внешний ключ, указывается с помощью аргумента ref table. По умолчанию внешний ключ связывается с первичным ключом. Но можно связать внешний ключ с любым другим столбцом. Для этого с помощью аргумента ref column указывается имя нужного столбца.
•
ON DELETE {CASCADE | NO ACTION} Предписывает использовать для соответствующего внешнего ключа ограничение целостности Cascade или No Action на удаление строк в главной таблице. Таким образом, удаление строк в главной таблице будет приводить к удалению соответствующих строк (при указании CASCADE) В создаваемой таблице или отмене операции удаления строки главной таблицы (при указании NO ACTION).
•
ON UPDATE {CASCADE | NO ACTION} Предписывает использовать для соответствующего внешнего ключа ограничение целостности Cascade или No Action на изменение строк в главной таблице. Таким образом, изменение первичного ключа в главной таблице будет приводить к модификации соответствующих строк (при указании CASCADE) В создаваемой таблице или отмене операции изменения строки главной таблицы (при указании NO ACTION).
•
NOT FOR REPLICATION
Если ожидается, что в таблицу с установленным ограничением целостности Foreign Key будут реплицированы строки из другой базы данных, но при
966
Часть IV. Разработка и сопровождение баз данных этом не станут реплицироваться строки главной таблицы, то это вызовет нарушение ограничения целостности. Чтобы избежать этого, при создании внешнего ключа необходимо указать NOT FOR REPLICATION. ЭТО запрещает использование ограничения целостности при выполнении операций репликации. Аналогичный результат вызовет использование NOT FOR REPLICATION и для ограничения целостности Check — при выполнении операций вставки или изменения данных системой репликации проверка значений выполняться не будет.
Замечание Обычно пользователю не нужно указывать NOT FOR REPLICATION, Т. К. все необходимые изменения вносятся автоматически подсистемой репликации. CHECK (logical_expression) Ключевое слово CHECK говорит о том, что далее в скобках будет указано проверочное ограничение целостности, которое задается в виде логического выражения. Логическое выражение задается с помощью аргумента iogicai_expression. Если логическое выражение возвращает значение TRUE, то операция вставки или изменения значений в соответствующем столбце разрешается. Если же возвращается значение FALSE, TO выдается соответствующее сообщение об ошибке и операция отменяется.
Замечание Как следует из синтаксиса конструкции определения столбца, для одного и того же столбца одновременно может быть установлено множество ограничений целостности. Однако некоторые ограничения целостности являются взаимоисключающими или используются только один раз. Только ограничение целостности Check может быть использовано многократно.
Ограничения целостности на уровне таблицы В предыдущем разделе были описаны ограничения целостности на уровне отдельного столбца. Однако иногда бывает необходимо определить некоторые ограничения целостности на уровне таблицы. Например, при определении ограничений целостности Primary Key или Unique на уровне столбца можно использовать только один столбец. Однако иногда бывает необходимо определить ограничение целостности на основе нескольких столбцов. Для этого нужно реализовать эти ограничения целостности на уровне таблицы. Для определения ограничений целостности на уровне таблицы существует конструкция < t a b i e _ c o n s t r a i n t > , имеющая синтаксис: < table_constraint > ::= [CONSTRAINT constraint_name] { [ {PRIMARY KEY | UNIQUE} [CLUSTERED | NONCLUSTERED] { (column [ASC I DESC] [ ,...n]) } [WITH FILLFACTOR = fillfactor]
Глава 21. Работа с таблицами
967
[ON { filegroup I DEFAULT }] ] I FOREIGN KEY [(column [ ,...n])] REFERENCES ref_table [(ref_column [ ,...n])] [ON DELETE {CASCADE | NO ACTION}] [ON UPDATE {CASCADE | NO ACTION}] [NOT FOR REPLICATION] | CHECK [ NOT FOR REPLICATION] (search_conditions) }
Рассмотрим назначение и использование параметров команды, специфичных для ограничений целостности на уровне таблиц. Мы не будем перечислять параметры, представленные в предыдущих разделах: •
CONSTRAINT constraint_name Ключевое слово CONSTRAINT указывает на то, что далее следует описание ограничений целостности. С помощью аргумента const ra int_name указывается имя, которое будет присвоено ограничению целостности. Имя ограничения целостности должно быть уникально в пределах базы данных. Указание конструкции CONSTRAINT c o n s t r a i n t n a m e He обязательно. Оно обЫЧНО ПрИМеняется лишь тогда, когда ограничению необходимо присвоить определенное имя.
П
PRIMARY KEY, UNIQUE, CLUSTERED, NONCLUSTERED Назначение этих аргументов аналогично назначению одноименных аргументов, используемых при описании ограничений целостности на уровне столбца. Более подробно назначение перечисленных аргументов было рассмотрено в предыдущем разделе.
•
(column
[ASC
I DESC]
[,...n])
С помощью этой конструкции определяется список столбцов, на которые будет налагаться описываемое ограничение целостности. Указание ключевых слов ASC (по возрастанию) и DESC (ПО убыванию) позволяет явно задать, как должен быть отсортирован индекс (если он создается).
Примеры создания таблиц В качестве иллюстрации описанной выше команды CREATE TABLE рассмотрим практические примеры применения этой команды. Необходимо создать таблицу Employees, содержащую шесть столбцов. Первый из столбцов имеет имя EmpiD и должен быть использован в качестве первичного ключа таблицы. Для этого столбца нужно определить автонумерацию с 1000 и с шагом 1. Два следующих столбца — PassNum и PassSer — используются для хранения, соответственно, номера и серии паспорта сотрудника. Требуется обеспечить уникальность комбинации этих двух столбцов. Последние три столбца (Lname, Fname и Sname) служат для хранения фамилии, имени и отчества сотрудника. Для столбца с фамилией следует запретить хранение значений NULL, тогда как для столбцов с именем и отчеством, напротив — разрешить. Описанная таблица может быть создана с помощью следующего кода:
968
Часть IV. Разработка и сопровождение баз данных
CREATE TABLE Employees (EmpID int IDENTITY (1000,1) PRIMARY KEY, PassNum nvarchar(6) NOT NULL, PassSer nvarchar(lO) NOT NULL, Lname nvarchar(30) NOT NULL, Fname nvarchar(30) NULL, Sname nvarchar(30) NULL, UNIQUE (PassNum, PassSer))
В следующем примере приведен код для создания таблиц jobs, employee и publ i s h e r s базы данных pubs. Приведенный пример использует практически все ограничения целостности. — Код создания таблицы jobs CREATE TABLE jobs (job_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, job_desc varchar(50) NOT NULL DEFAULT 'New Position - title not formalized yet', min_lvl tinyint NOT NULL CHECK (min_lvl>=10), max_lvl tinyint NOT NULL CHECK (max_lvl<=250)) — Код создания таблицы employee CREATE TABLE employee (emp_id empid CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or emp_id LIKE • [A-Z]-[A-Z] [1-9] [0-9] [0-9] [0-9] [0-9] [FM] ' ) , /* Каждый идентификатор служащего содержит три символа, представляющие инициалы служащего, потом пять десятичных цифр в диапазоне от 10000 до 99999 и затем пол служащего (М - для мужчины, W - для женщины). Для буквы отчества, если она неизвестна, разрешено использовать дефис. */ fname varchar(20) NOT NULL, minit char(l) NULL, lname varchar(30) NOT NULL, job_id smallint NOT NULL DEFAULT 1 REFERENCES jobs(job_id), job_lvl tinyint DEFAULT 10, pub_id char(4) NOT NULL DEFAULT ('9952') REFERENCES publishers(pub_id), hire_date datetime NOT NULL DEFAULT (getdate())) — Код создания таблицы publishers CREATE TABLE publishers (pub_id char(4) NOT NULL CONSTRAINT UPKCL_j>ubind PRIMARY KEY CLUSTERED CHECK (pub_id IN ('1389', '0736', '0877 1 , 4622', '1756') OR pub_id LIKE '99[0-9] [0-9] ' ) , pub_name varchar(40) NULL, city varchar(20) NULL, state char(2) NULL, country varchar(30) NULL DEFAULT('USA'))
Изменение таблиц Сразу же после того, как таблица будет создана, можно приступить к ее использованию. Можно вносить в нее данные, создавать индексы, дополнительные ограничения целостности, изменять и удалять данные и т. д. Однако иногда бывает необходимо изменить структуру уже существующих таблиц. В версиях SQL
Глава 21. Работа с таблицами
969
Server ранее 7.0 пользователи были весьма ограничены в возможностях изменения таблиц. Точнее, таблицы вообще нельзя было изменять. Пользователь должен был создать новую таблицу с нужной структурой, перенести в нее данные из старой таблицы, уничтожить ее и переименовать новую таблицу, присвоив ей имя старой таблицы. Изменение таблиц было занятием весьма утомительным. Начиная с SQL Server 7.0, была введена возможность изменения структуры таблиц. Строго говоря, изменение таблиц происходит тем же способом, что и в предыдущих версиях. То есть создается новая таблица, в нее копируются данные .из таблицы, затем старая таблица удаляется, и новой таблице присваивается ее имя. При этом сохраняются все права доступа, выданные пользователям базы данных к таблице и отдельным ее столбцам. Однако теперь вся эта работа лежит на ядре SQL Server 2000, а не на пользователе. От пользователя требуется лишь указать, что нужно изменить. На этом его участие заканчивается. Такое изменение в SQL Server весьма приятно. Теперь вы в любой момент можете добавить новые столбцы или удалить ненужные, не опасаясь головной боли и различных проблем. Однако следует отметить, что изменение столбцов таблицы разрешено только для баз данных SQL Server 2000. Если база данных была перенесена с SQL Server 6.x или имеет уровень совместимости (compatibility level) 65 или 60, то изменение столбцов не разрешается. Кроме того, и при выполнении изменений столбцов в базах данных с уровнем совместимости 70 и 80 существует ряд ограничений, запрещающих изменение следующих столбцов: •
столбцов С ТИПОМ данных text, ntext И image;
•
вычисляемых (computed) столбцов или столбцов, на которые ссылаются вычисляемые столбцы;
•
столбцов, скопированных в результате репликации или публикуемых столбцов;
•
индексированных столбцов. Исключение составляют столбцы с типом данных varchar или varbinary, если их тип данных не изменяется и новый размер столбца равен или больше первоначального значения;
•
столбцов, для которых с помощью команды CREATE STATISTICS пользователем определена статистика. Для изменения таких столбцов необходимо предварительно уничтожить сгенерированную для них статистику, и только после этого изменять столбец;
•
столбцов, используемых в первичном или внешнем ключе;
•
столбцов, для которых определено ограничение целостности Unique или Check. Однако разрешены изменения размера столбца с типом данных переменной ДЛИНЫ (varchar, nvarchar И varbinary);
П столбцов, для которых определено значение по умолчанию. Однако для таких столбцов разрешается изменение длины, размера и точности с условием, что тип данных не изменяется или если между новым и старым типом данных поддерживается неявное преобразование; G столбца с установленным свойством ROWGUIDCOL.
970
Часть IV. Разработка и сопровождение баз данных
Замечание Все указанные ограничения распространяются на изменение столбцов. Однако некоторые из них не относятся к операции удаления столбца (например, три последних ограничения).
Изменение таблиц может выполняться как с помощью графического интерфейса Enterprise Manager, так и с помощью команды Transact-SQL. Сейчас мы рассмотрим изменение таблиц средствами Transact-SQL. Использование же возможностей Enterprise Manager для изменения таблиц будет рассмотрено отдельно в одном из следующих разделов. Для изменения таблиц с помощью Transact-SQL используется команда ALTER TABLE, имеющая следующий синтаксис: ALTER TABLE table { [ALTER COLUMN columnjname {new_data_type [(precision[, scale])] [COLLATE ] [NULL | NOT NULL ] | {ADD | DROP} ROWGUIDCOL } ] I ADD {[] I column_name AS computed_column_expression} [,...n] I [WITH CHECK | WITH NOCHECK] ADD {} [,...n] I DROP {[CONSTRAINT] constraint_name I COLUMN column} [,...n] I {CHECK | NOCHECK} CONSTRAINT {ALL | constraint_name [,...n]} I {ENABLE | DISABLE} TRIGGER {ALL | trigger_name [,...n]} }
Рассмотрим подробно использование каждого из аргументов: •
table Имя таблицы, которая будет изменяться. При необходимости может быть дополнительно указано имя владельца таблицы (owner) и имя базы данных (database), в которой находится таблица. Имя владельца необходимо указывать в том случае, если таблица принадлежит не текущему пользователю и не dbo. Указание имени базы данных требуется только в том случае, если таблица находится не в текущей базе данных.
•
ALTER COLUMN column_name
Ключевые слова ALTER COLUMN показывают, что далее следует описание изменений столбца. Аргумент соiumn_name указывает имя столбца, который необходимо изменить, добавить или удалить. Имя столбца может быть опущено, если создаваемый столбец будет иметь тип данных timestamp. В этом случае ему автоматически присваивается имя timestamp. О
new_data_type [(precision[, scale])]
Аргумент new_data_type определяет тип данных, который должен иметь столбец после изменения. Если используется нецелочисленный тип данных, то дополнительно можно указать, какое количество десятичных цифр будет храниться (аргумент precision) и сколько цифр их них будет после запятой (аргумент scale).
Глава 21. Работа с таблицами
971
Замечание При изменении тапа данных в столбце необходимо следить за тем, чтобы значения из старого типа данных могли быть конвертированы в новый тип данных. Если же это невозможно, то придется удалить все строки из таблицы или установить во всех строках значение N U L L В изменяемом столбце. Кроме того, запрещается изменение типа данных уже созданного столбца на тип данных t i m e s t a m p . При изменении типа данных в столбце с установленным ограничением целостности I D E N T I T Y необходимо, чтобы новый тип данных также поддерживал автонумерацию. COLLATE
С помощью данного параметра указывается имя сопоставления, которое должно в дальнейшем использоваться для столбца. Подробно сопоставления рассматривались в разд. "Выбор сопоставления" главы 20. NULL
| NOT NULL
С помощью этих опций определяется, возможно ли будет хранение в измененном столбце неопределенных значений (NULL). При указании NULL хранение неопределенных значений разрешено, тогда как при указании NOT NULL запрещается. Если при изменении столбца не было явно указано, будет ли он хранить значения NULL ИЛИ нет, то остается старое значение. Если при изменении таблицы в нее предполагается добавить новый столбец, то необходимо будет либо разрешить хранение в нем неопределенных значений, либо задать для него значения по умолчанию. Если для столбца разрешено хранение значений NULL И не определено значение по умолчанию, то в столбец будет вставлено значение NULL. Когда определено значение по умолчанию и не разрешено хранение значений NULL, TO при добавлении столбца в него будет автоматически вставлено значение по умолчанию. Если же определено значение по умолчанию и разрешено хранение NULL, TO значение по умолчанию можно занести в столбец с помощью конструкции WITH VALUES. Иначе столбец будет содержать NULL. (~
Замечание
~")
Нельзя разрешить хранение N U L L ДЛЯ столбцов, входящих в первичный ключ. Также нельзя запретить хранение N U L L Д Л Я столбца, в котором присутствует хоть одно значение N U L L . Прежде необходимо изменить строки таблицы таким образом, чтобы в изменяемом столбце не было N U L L . •
{ADD | DROP} ROWGUIDCOL
Эта конструкция определяет, было ли добавлено или удалено свойство ROWGUIDCOL из изменяемого столбца. Конструкция может использоваться ТОЛЬКО ДЛЯ столбцов С ТИПОМ д а н н ы х u n i q u e i d e n t i f i e r . ТОЛЬКО ДЛЯ ОДНОГО
столбца в таблице может быть установлено свойство ROWGUIDCOL. • ADD Это ключевое слово указывает, что в таблицу необходимо добавить столбец (в т. ч. и вычисляемый) или ограничение целостности.
972
Часть IV. Разработка и сопровождение баз данных
О
Эта конструкция определяет свойства столбца. Ее синтаксис и использование были рассмотрены в разд. "Определение столбцов" ранее в этой главе. О
column_name AS computed_column_expression С помощью этого аргумента можно создать вычисляемые (computed) столбцы. Значения таких столбцов вычисляются каждый раз заново при обращении к ним. Более подробно описание и работа с вычисляемыми столбцами были рассмотрены ранее в этой главе в разд. "Создание таблиц" при описании аналогичного параметра.
П
[,...п]
Конструкция указывает, что с помощью одной команды ALTER TABLE может быть добавлено множество столбов. Для этого их определения должны быть перечислены через запятую. П
[WITH CHECK
| WITH NOCHECK] ADD
С помощью этой конструкции сообщается, что необходимо добавить ограничение целостности на уровне таблицы. Наличие WITH CHECK при добавлении ограничения целостности обеспечивает проверку существующих данных столбца (или столбцов), для которого создается ограничение целостности, на соответствие требованиям ограничения. При использовании WITH NOCHECK подобной проверки выполняться не будет. Однако вновь вставляемые строки все-таки станут подвергаться проверке ограничением целостности. П
Эта конструкция описывает ограничения целостности на уровне таблицы, которые необходимо добавить. Синтаксис и использование этой конструкции были подробно рассмотрены в разд. "Ограничения целостности на уровне таблицы" ранее в этой главе. П
DROP {[CONSTRAINT] constraint_name Г COLUMN column_name} Эта конструкция применяется для удаления из таблицы ограничений целостности или столбцов. При удалении ограничения целостности с помощью аргумента c o n s t r a i n t n a m e указывается его имя и дополнительно ключевое слово CONSTRAINT. При удалении столбца необходимо обязательно использовать ключевое слово COLUMN, после которого указывается имя удаляемого столбца (column_name). Нельзя удалить: •
реплицированные столбцы;
•
индексированные столбцы;
•
столбцы, для которых определены ограничения целостности Check, Unique, Primary Key или Foreign Key;
•
столбцы, для которых определено значение по умолчанию (default) или которые связаны с объектами по умолчанию;
•
столбцы, для которых определены правила (rule).
Глава 21. Работа с таблицами
973
Замечание Запрещение на удаление перечисленных выше столбцов связано с тем, что все ограничения целостности, значения по умолчанию, индексы и правила хранятся в виде отдельных объектов базы данных и связываются со столбцом таблицы. При удалении столбца связь оказалась бы потерянной. Поэтому необходимо сначала уничтожить все связанные со столбцом объекты, а уже после этого удалять сам столбец.
•
{CHECK | NOCHECK} CONSTRAINT Эта конструкция предназначена для включения или отключения ограничения целостности. При использовании CHECK происходит активизация ограничения целостности. Все вставляемые строки будут проверяться на соответствие требованиям указанного ограничения целостности. При наличии NOCHECK ограничение целостности отключается, после чего проверка на соответствие требованиям не выполняется. Только ограничения целостности CHECK И FOREIGN KEY могут быть активизированы или отключены.
П ALL |
constraint_name[,...n]
Эта конструкция используется для описания ограничений целостности, которые должны быть активизированы или отключены. При указании ключевого слова ALL будут изменены все ограничения целостности, определенные в таблице. Отдельные же ограничения целостности могут быть указаны с помощью аргументы c o n s t r a i n t n a m e . При необходимости можно указать множество ограничений, перечислив их через запятую. П
{ENABLE | DISABLE} TRIGGER С помощью этой конструкции можно разрешить (ENABLE) ИЛИ запретить (DISABLE) использование в таблице указанного триггера. При запрещении использования триггера он не удаляется и все еще остается определенным для таблицы. Тем не менее, при выполнении команд INSERT, UPDATE ИЛИ DELETE триггер выполняться не будет. Для физического удаления триггера необходимо применить команду DROP TRIGGER. Запрещенный триггер может быть позже снова разрешен для использования.
•
ALL | trigger__name [, . . . n]
С помощью этой конструкции указываются триггеры, использование которых необходимо разрешить или запретить. При указании ключевого слова ALL действие будет выполняться над всеми триггерами таблицы. Отдельные триггеры могут быть указаны через запятую.
Получение информации о таблице Нередко бывает, что необходимо получить информацию о структуре таблицы, определенных в ней ограничениях целостности и триггерах, а также узнать, какие таблицы являются зависимыми от рассматриваемой таблицы, и от каких таблиц зависит она сама. С помощью графического интерфейса Enterprise Manager получить эту информацию довольно легко. Однако мы рассматриваем только использование возможностей Transact-SQL и хранимых процедур.
974
Часть IV. Разработка и сопровождение баз данных
Для получения информации о таблицах и других объектах базы данных применяются системные хранимые процедуры. Наиболее часто используется хранимая процедура s p h e l p , специально предназначенная для получения информации о различных объектах базы данных. Она имеет следующий синтаксис: sp_help [[@objname =] name]
Единственный аргумент этой хранимой процедуры (name) предназначен для указания имени объекта, о котором необходимо получить информацию. Например, для получения информации о таблице authors базы данных pubs следует выполнить команду: USE pubs sp help 'authors'
Замечание Одной из особенностей работы хранимой процедуры sp_help является то, что она работает только с объектами, находящимися в текущей базе данных. Нельзя указать имя объекта, расположенного в другой базе данных. При попытке указать в имени объекта имя базы данных, отличное от имени текущей базы данных, будет выдано сообщение об ошибке. В результате выполнения указанной выше команды будет выведен набор строк, содержащий информацию о таблице. Эта информация разделена на блоки. Для каждого типа объекта набор блоков и их содержание может меняться. Для таблиц выводятся следующие блоки информации: • Информация о таблице. Выводится единственная строка со следующими столбцами: •
Name — имя таблицы, о которой предоставляется информация;
•
Owner — имя владельца таблицы;
•
Туре — тип объекта. Для пользовательских таблиц указывается значение user table;
•
Created_datetime — дата создания таблицы.
П Список столбцов. В этом блоке содержится множество колонок, каждая из которых отвечает за определенное свойство столбца. Каждая строка блока соответствует одному из столбцов таблицы. Порядок вывода информации о столбцах соответствует их порядку в таблице. Рассмотрим список колонок блока и их назначение: •
Coiumn_name — имя столбца таблицы. Тип данных этой колонки — nvarchar (128), т . к . имя столбца таблицы может иметь длину до 128 символов в стандарте Unicode.
•
туре — тип данных, который имеет столбец таблицы. При выводе информации о типе данных столбца не указывается количество символов, размер и точность данных. Эта информация содержится в других колонках. ТИП Данных СаМОЙ КОЛОНКИ n v a r c h a r (128 ) .
Глава 21. Работа с таблицами
975
•
Computed — в этом столбце может быть либо значение yes, либо значение по. Если указано первое значение, то рассматриваемый столбец таблицы является вычисляемым (computed), в противном случае столбец стандартный. ТИП ДанНЫХ КОЛОНКИ varchar (35) .
•
Length — количество байт, отводимых для хранения данных столбца. Тип данных этой колонки i n t .
•
Prec — используется только для числовых типов данных. Указывается максимальное количество десятичных цифр (в т. ч. и после запятой), которое будет храниться в столбце. Тип данных колонки char (5).
•
Scale — предназначен только для числовых типов данных. Указывается количество десятичных цифр после запятой, которое будет храниться в столбце. Для целочисленных типов данных приводится значение 0. Тип Д а н Н Ы Х КОЛОНКИ c h a r ( 5 ) .
•
Nuilabie — в этом столбце может быть либо значение yes, либо значение по. Если указано первое значение, то рассматриваемый столбец таблицы позволяет хранить неопределенные значения (NULL). В противном случае хранение таких значений запрещено. Тип данных колонки varchar (35).
•
TrimTraiiingsBianks — указывает, удаляются ли в столбце конечные пробелы. Если указано yes, то конечные пробелы автоматически удаляются. Если же указано по, то пробелы остаются. Удаление пробелов поддерживается только для символьных типов данных. Если столбец имеет иной тип данных, то в этой колонке будет указано значение (n/а). Тип ДанНЫХ КОЛОНКИ%-агспаг ( 35 ) .
•
FixedLenNuiiinSource — эта колонка в версии SQL Server 2000, как и в SQL Server 7.0, не используется и оставлена только для обеспечения обратной совместимости с предыдущими версиями. Тип данных колонки varchar(35).
•
C o l l a t i o n — имя сопоставления, которое имеет соответствующий столбец таблицы.
О Столбец i d e n t i t y . В этом блоке выводится информация о столбце с установленным свойством IDENTITY. Информация выводится в следующих колонках: •
i d e n t i t y — имя столбца, для которого установлено свойство IDENTITY. Тип данных этой колонки nvarchar (128). Если в таблице нет столбца с установленным свойством IDENTITY, ТО В ЭТОЙ колонке будет выведена строка No identity column defined.
•
Seed — начальное значение, с которого начинается нумерация строк в таблице. Тип данных колонки numeric, однако может быть указано только целочисленное значение.
•
increment — шаг приращения. На указанное число будет каждый раз при вставке новой строки увеличиваться значение в столбце IDENTITY. ТИП данных колонки numeric, однако может быть указано только целочисленное значение.
32 Зак. 83
976
Часть IV. Разработка и сопровождение баз данных •
Not For Replication — колонка имеет тип данных i n t , однако в ней может быть указано всего два значения — 0 и 1. Если указана 1, то свойство IDENTITY будет игнорироваться при вставке строк подсистемой репликации. В этом случае в столбец IDENTITY станут помещаться значения, полученные при репликации данных. Если же указывается 0, то автонумерация будет использоваться и при вставке строк системой репликации.
П Столбец ROWGUIDCOL. В этом блоке выводится информация о столбце, для которого установлено свойство ROWGUIDCOL. Информация выводится в единственной колонке с именем RowGuidCol, имеющей тип данных sysname. В ней приводится имя столбца таблицы, для которого установлено свойство ROWGUIDCOL. Если такого столбца в таблице нет, то будет выведена строка No rowguidcol column defined.
П Группа файлов таблицы. В этом блоке указывается имя группы файлов, в которой размещены обычные данные таблицы. Столбцы с типом данных t e x t , ntext и image могут быть размещены в другой группе файлов. Имя группы фаЙЛОВ ВЫВОДИТСЯ В КОЛОНКе D a t a _ l o c a t e d _ o n _ f i l e g r o u p , Имеющей ТИП
данных nvarchar (128 ) . •
•
Описание индексов. Этот блок содержит имена и описания индексов, созданных для столбцов таблицы. Информация об индексах выводится в колонках: •
index_name — имя, присвоенное индексу при создании. Колонка имеет ТИП данных sysname.
•
index_description — описание индекса, куда входит информация о типе индекса (кластерный или нет, уникальный или нет, первичный ключ и т. д.) и группе файлов, в которой он размещается. Тип данных этой колонки varchar(210) .
•
index_keys — в этом столбце содержится список столбцов таблицы, которые включены в описываемый индекс. Если индекс создан более чем для одного столбца, то столбцы перечисляются через запятую. Колонка Имеет ТИП данных nvarchar (2078) .
Ограничения целостности — в этом блоке описываются ограничения целостности, определенные для столбцов таблицы. Информация выводится в следующих колонках: •
constraint_type — тип ограничения целостности. Вместе с типом ограничения может указываться имя столбца, для которого оно определено. Например, для ограничения целостности Check для столбца a u i d может быть у к а з а н о CHECK on c o l u m n a u _ i d . Т и п д а н н ы х ЭТОЙ КОЛОНКИ n v a r c h a r (14 6) .
•
c o n s t r a i n t n a m e — имя, присвоенное ограничению целостности при создании. Если при создании ограничения имя было не указано явно, то SQL Server 2000 генерирует его автоматически (что-то вроде C K _ a u t h o r s _ a u _ i d _ 0 8 E A 5 7 93). КоЛОНКЭ и м е е т ТИП д а н н ы х n v a r c h a r ( 1 2 8 ) .
•
D e i e t e a c t i o n — имеет смысл только для ограничения целостности внешнего ключа и указывает действие, которое будет предприниматься при удалении строки в главной таблице. Возможны значения Cascade и No Action.
Глава 21. Работа с таблицами
977
•
u p d a t e a c t i o n — как и предыдущий столбец, используется только для ограничения целостности внешнего ключа и указывает действие, которое будет предприниматься при изменении значений в первичном ключе главной Таблицы. ВОЗМОЖНЫ значения Cascade И No Action.
•
s t a t u s e n a b i e d — в этой колонке приводится, активно ли ограничение целостности. В SQL Server 2000 можно отключить ограничения целостности Check и Foreign Key. Если ограничение целостности неактивно, то в колонке будет Значение Disabled. ДЛЯ акТИВНЫХ Ограничений ВЫВОДИТСЯ Enabled. Для ограничений целостности других типов, не поддерживающих отключение, ВЫВОДИТСЯ (п/а) . Колонка имеет ТИП Данных varchar (8) .
•
s t a t u s _ f o r _ r e p l i c a t i o n — в этой колонке указывается, существует ли ограничение целостности при репликации. Можно запретить применение ограничений целостности Check и Foreign Key, чтобы они не использовались при работе подсистемы репликации. Если ограничение целостности применяется при репликации, то в колонке указывается is_For_Replication. В противном случае колонка будет содержать значение Not_For_Repiication. Для ограничений целостности помимо Check и Foreign Key также иногда выводится значение (п/а). Колонка имеет тип Данных varchar (19).
•
C o n s t r a i n t k e y s — в этой колонке указывается текст, описывающий ограничения целостности. Для ограничения целостности Check выводится логическое условие, для первичного ключа — имена столбцов, для ограничения целостности Default — значение по умолчанию и т. д. Колонка имеет ТИП данных nvarchar (2078) .
• Зависимые таблицы. В этом блоке указываются таблицы, в которых определено ограничение целостности Foreign Key, ссылающееся на столбец рассматриваемой таблицы. Каждая зависимая таблица выводится в отдельной строке. Через двоеточие приводится имя ограничения целостности, связывающее строки таблицы. Информация выводится в единственной колонке Table i s referenced by, имеющей ТИП данных nvarchar (516) .
Зависимые объекты Часто при работе с базами данных бывает необходимо узнать, какие объекты базы данных ссылаются на определенную таблицу, и на какие объекты ссылается сама таблица. Хранимая процедура sp_heip, описанная в предыдущем разделе, выводит информацию о свойствах таблицы, в т. ч. и список таблиц, связанных внешним ключом с рассматриваемой таблицей. Однако этой информации иногда бывает недостаточно. От таблицы могут зависеть не только другие таблицы, но и хранимые процедуры, представления и некоторые другие объекты. Кроме того, собственно таблица, в свою очередь, может зависеть от другой таблицы. Информация о связях между объектами может понадобиться, когда необходимо изменить, переименовать или удалить таблицу и нужно убедиться, что эти действия не нарушат целостность базы данных и работоспособность приложений.
Часть IV. Разработка и сопровождение баз данных
978
Для получения информации об объектах, зависящих от конкретной таблицы, применяется хранимая процедура spdepends, имеющая синтаксис: sp_depends [@objname =] ' o b j e c t ' Единственный аргумент процедуры ( ' o b j e c t ' ) обозначает имя объекта базы данных, для которого будет выведена информация о зависимостях. Объект должен находиться в текущей базе данных. Информация о связанных объектах, находящихся в других базах данных, не выводится.
Замечание Строго говоря, хранимая процедура sp_depends используется для получения списка зависимых объектов не только для таблиц, но и для других объектов базы данных — хранимых процедур и представлений. Рассмотрим пример вызова хранимой процедуры sp__depends для получения информации об объектах, связанных с системной таблицей sysiogins системной базы данных Master: USE Master EXEC sp_depends 'sysiogins' В результате будет выведена следующая информация: In the current database, the specified object references the following: name type updated selected column dbo.sysxlogins dbo.sysxlogins dbo.sysxlogins dbo.sysxlogins dbo.sysxlogins dbo.sysxlogins dbo.sysxlogins dbo.sysxlogins dbo.sysxlogins
system. system. system. system. system. system. system. system. system.
table table table table table table table table table
no no no no no no no no no
no no no no no no no no no
password dbid language xdatel xdate2 name srvid sid xstatus
In the current database, the specified object is referenced by the following: name type dbo.MS_sqlctrs_users dbo.sp_adddistributor dbo.sp_addlinkedsrvlogin dbo.sp_addlogin dbo.sp_addremotelogin dbo.sp_addsrvrolemember dbo.sp_adduser dbo.sp_change_users_login
.
stored stored stored stored stored stored stored stored
procedure procedure procedure procedure procedure procedure procedure procedure
Замечание На самом деле список объектов несколько больше приведенного, который приведен с целью экономии места в книге.
Глава 21. Работа с таблицами
979
В первом блоке выводится информация об объектах, на которые ссылается рассматриваемая таблица. Во втором блоке — список объектов, которые ссылаются на рассматриваемую таблицу. В представленном примере таблица s y s i o g i n s используется только хранимыми процедурами. Однако на другие таблицы могут ссылаться представления, хранимые процедуры и таблицы.
Связь через ключи Хранимая процедура s p h e l p возвращает список таблиц, связанных ограничением целостности Foreign Key с рассматриваемой таблицей. Однако иногда этой информации бывает недостаточно. Бывают ситуации, когда необходимо получить более подробную информацию о связях между таблицами. В SQL Server 2000 существует системная хранимая процедура s p f k e y s , предназначенная для получения информации о связях между таблицами посредством первичных и внешних ключей. Синтаксис этой хранимой процедуры таков: sp_fkeys [@pktable_name [,[@pktable_owner =] [,[@pktable_qualifier {, [@fktable_name =] [,[@fktable_owner =] [,[@fktable_qualifier
=] 'pktable_name' 'pktable_owner'] =] 'pktable_qualifier'] 'fktable_name'} 'fktable_owner'] =] 'fktable_qualifier']
Рассмотрим подробно назначение и использование параметров этой хранимой процедуры: П
[@pktable_name =] 'pktable_name' С помощью этого аргумента определяется имя таблицы, имеющей первичный ключ, для которой будет выводиться информация.
П [@pktable_owner =]
'pktable_owner']
Этот аргумент определяет имя владельца таблицы, указанной с помощью предыдущего аргумента. Если параметр опущен, тогда подразумевается, что таблица принадлежит текущему пользователю или владельцу базы данных (dbo, database owner). О
[@pktable_qualifier =] 'pktable_qualifier'] С помощью этого аргумента определяется имя базы данных, в котором находится таблица, указанная с помощью первого аргумента. Если параметр опущен, то предполагается, что таблица находится в текущей базе данных.
П
[@fktable_name =] 'fktable_name' Этот аргумент определяет имя таблицы с внешним ключом, для которой необходимо вывести информацию о зависимостях. Дополнительно, с помощью аргумента [@fktable_owner =] ' f k t a b l e o w n e r ' ] может быть указано имя владельца таблицы. Кроме того, также можно задать имя базы данных (аргумент [@fktable_qualifier =] 'fktable_qualifier']).
980
Часть IV. Разработка и сопровождение баз данных (
Замечание
^)
Хранимая процедура sp_f keys может быть использована для получения информации о зависимостях как для таблиц с первичным ключом, так и для таблиц с внешним ключом. Кроме того, одновременно можно указать оба типа таблиц.
Удаление таблиц Последняя операция по управлению таблицами, которую мы рассматриваем, — это их удаление. Для удаления таблиц предназначена команда DROP TABLE, имеющая синтаксис: DROP TABLE table_name
Имя таблицы, которую необходимо удалить, указывается с помощью аргумента t a b l e name. Вместе с именем таблицы может быть приведено имя владельца таблицы. Кроме того, допускается использование имени базы данных. Таким образом, можно удалять таблицы, расположенные в различных базах данных. Существуют определенные ограничения на удаление таблиц. Нельзя удалить таблицу, если на нее с помощью ограничения целостности Foreign Key ссылается одна или более таблиц. Необходимо сначала удалить ограничения целостности (или связанные таблицы), и только после этого удалять таблицу. При удалении таблицы уничтожаются все ограничения целостности (constraints) и триггеры (triggers), которые были определены для нее. Однако уничтожения правил (rules) и умолчаний (defaults) не происходит. Их необходимо удалять вручную. Если удаление таблицы было ошибкой, можно будет связать оставшиеся после удаления умолчания и. правила с вновь созданной таблицей. Ограничения целостности и триггеры придется создавать заново «с нуля». Чтобы избежать подобных трудностей, рекомендуется создавать резервную копию базы данных перед удалением из нее объектов. Впоследствии при необходимости вы сможете восстановить необходимые объекты из резервной копии. При удалении таблицы происходит также и удаление всех данных, хранимых в таблице. SQL Server 2000 не требует, чтобы сначала из таблицы были удалены все строки. Перед удалением таблицы следует убедиться, что в ней не содержится нужных данных. При удалении всех строк из таблицы удаление самой таблицы не происходит. Также не происходит удаления таблиц и при их усечении (truncate) с помощью КОМаНДЫ TRUNCATE TABLE,
Управление таблицами средствами Enterprise Manager Последние несколько разделов были посвящены рассмотрению работы с таблицами средствами Transact-SQL. Этот метод, хотя и предлагает пользователям широкие возможности, требует знания синтаксиса команд и хранимых проце-
Глава 21. Работа с таблицами
981
дур, а также сравнительно больших затрат времени на выполнение тех или иных действий. Более удобным для выполнения большинства действий является использование инструмента Enterprise Manager, который предлагает пользователям удобный графический интерфейс для выполнения различных действий по управлению таблицами. Данный раздел, а точнее его подразделы, будут посвящены рассмотрению работы с таблицами. Каждая база данных имеет свой собственный набор таблиц, просмотреть который средствами Enterprise Manager можно с помощью папки Tables (рис. 21.2), имеющейся в каждой базе данных. Для каждой таблицы указывается ее имя (столбец Name), владелец (столбец Owner), тип (столбец Туре) — пользовательский (User) или системный (System), а также дата создания таблицы (столбец Create Date).
С
Замечание
Как
видно, на рисунке приведены системные таблицы. Если они вам мешают, то
можно предписать Enterprise Manager не отображать системные объекты. Для этого следует в окне свойств регистрации сервера сбросить флажок Show system databases and objects.
Jo SQL Server Enterprise Manager [Console Root\Microsoft SQl Servers\MATRK Server*
_ j g | x[
j ^ д Console
-]gj
1 Act on
Window
View
Tools
Help 1 j Ф 3 •• | [ t ] 110
Tree
Ш Щ*> L^ Tables
-. \ !•
! i 1 I
!
i ^ i I ' j 1
1 I
•
i i :
I : | • j ! j
;
;
; H ! ; ! ; ; ! ;. ; 1 M 1 !
j :
1 j ; ; f: ; :
Рис. 2 1 . 2 . Папка Tables
••*>
BU - 0
( f iЙ t
1
i
34 Items
Name ; ~'1 authors .~1 discounts • ; employee 2U Я jobs ~1 pub Jnf о ~1 publishers ,Z1roysched F 1 sales Rules '• Ш И stores ; Г З Defaults PJtitleauthor ; R j User Defined Data' ZJ titles ;fL-User Defined Functi 2 | dtproperties Я Full-Text Catalogs l^j MSreplication_subscriptions Q pubs jH3 MSsubscription_agents | ~ a j Diagrams ~1 MSsubscription_properties г |?3 Tables i2*3 syscolurnns ; oV Views s t o r e d Procedures i?fl syscomments f"W : | Л Users ffl'1 sysdepends : ||Гр Roles 14 sysf ilegroups I Ш Rules Я sysf iles : 13 Defaults ZJsysfilesl User i~"ft Defined Data' 1*11 sysf oreignkeys :--|js User Defined Functi ^ j sysfulltextcatalogs : CJ P I J II Subscriptions ~'1 sysfulltextnotify I j l Full-Text Catalogs ^»J ~ 1 svsindexes
• f+i- у model _^J !' ф~В rnsdb S @ Northwind ; ; - a § Diagrams • : : "-fP| Tables : ; - o V Views ! ; ••••jffl Stored Procedures ; ; 1- |jR Users | j :• Я Roles
:
-г
Owner dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo
Type ' j Create Date * User 18.04,2000 1:56:34 User 18.04,2000 1:56:35 User 18.04.2000 1:56:35 User 18.04.2000 1:56:35 User 18.04.2000 1:56:35 User 18.04.2000 1:56:34 User 18.04.2000 1:56:35 User 18.04.2000 1:56:34 U se err 1 Us 18 8..0 04 4..2 20 00 00 01 1::5 56 6::3 34 4 User 18.04.2000 1:56:34 System 24.11.2000 12:39:52 System 26.10.2000 16:23:34 System 26.10.2000 16:23:34 System 26.10.2000 16:23:34 System 18.04.2000 1:51:58 System 18.04,2000 1:51:58 1 System 18.04.2000 1:51:58 System 18.04.2000 1:51:58 System 18,04.2000 1:51:58 System 18.04.2000 1:51:58 System 18,04.2000 1:51:58 System 18,04.2000 1:51:58 System 18,04,2000 1:51:58 System 18,04.2000 1:51:58 zl
Часть IV. Разработка и сопровождение баз данных
982
Создание таблицы Первая операция, которую выполняет пользователь в отношении таблицы (если конечно не считать этапа разработки), — это ее создание. Создание таблицы средствами Enterprise Manager выполняется с помощью окна New Table (рис. 21.3), для открытия которого достаточно в контекстном меню папки Tables выбрать команду New Table.
г
Замечание
На рис. 21.3 приведено уже заполненное окно New Table. Однако в только что открытом окне нет никакой информации, и все строки будут пусты. Pjlj SQL Server Enterprise Manager - [2:lffcw Table in'! _ j[aliil •^p Consoe l Wn i dow Hep l tu ? °^ 4f Ш Cou lmn Name Data Type Length | Alow Nuls Щ GD I bight 8 LName nvarchar 30 FName nvarchar 30 V SName nvarchar 30 V Birth smaldatetime 4 • Sex bit 1 NationID int 4 MarritallD int 4 i/ — Cou lmns Description Identity Identity Seed Identity Increment Formua l
Идентификационный ноиер человека
Yes 1000
I
Рис. 21.3. Окно создания новой таблицы New Table
Окно New Table разделено на две части. С помощью верхней части формируется набор столбцов, из которых будет состоять таблица, а также указываются их основополагающие свойства. Самая верхняя строка соответствует первому столбцу таблицы, вторая строка — второму столбцу и т. д. Порядок перечисления столбцов очень важен. При вставке и выборке данных без указания столбов сервер будет обрабатывать значения именно в той последовательности, в которой они
Глава 21. Работа с таблицами
983
были перечислены при создании таблицы. Рассмотрим назначение колонок, с помощью которых указываются базовые характеристики столбцов: •
Column Name. В этой колонке задается имя, которое будет иметь столбец. При выборе имени следует придерживаться стандартных правил именования объектов базы данных. Разрешается применение ограничителей. Имя столбца должно быть уникально в пределах таблицы. Однако если при организации базы данных, в которой создается таблица, было использовано сопоставление, чувствительное к регистру, то допускается создание одноименных столбцов, но использующих символы в разных регистрах. Например, в этом случае можно будет создать столбцы ааа и Ааа.
•
Data Type. Элемент этой колонки представляет собой раскрывающийся список, с помощью которого необходимо выбрать тип данных, назначаемый столбцу.
О Length. Указывается размер типа данных, выбранного для столбца. Некоторые типы данных (такие как char, nvarchar, binary и другие) позволяют изменять значение в этой колонке, тем самым предоставляя возможность управлять количеством памяти, выделяемой для столбца. Другие же типы данных Всегда имеют ОДИН И ТОТ же размер (например, i n t , datetime, money и т. д.) и для них изменять значения в колонке Length нельзя. •
Allow Nulls. Установка флажка в этой колонке разрешает для соответствующего столбца хранение значений NULL. Отметим, однако, что если столбец входит в первичный ключ или имеет тип данных timestamp, то хранение значений NULL ДЛЯ него разрешить нельзя.
С помощью верхней части можно также определить первичный ключ таблицы. Для этого достаточно выделить один или более столбцов, из которых должен состоять первичный ключ, щелкнуть правой кнопкой мыши и в открывшемся контекстном меню выбрать команду Set Primary Key. После этого слева от имени столбца, включенного в первичный ключ, будет отображаться символ ключа. На рис. 21.3 первичным ключом является столбец GID. Мы рассмотрели работу с верхней частью окна New Table. Теперь же обратимся к нижней части, содержимое которой зависит от того, какой столбец выбран в верхней части. В нижней части окна выполняется управление дополнительными свойствами столбца. Рассмотрим элементы управления, находящиеся в распоряжении пользователя: П Description. Это текстовое поле предназначено для ввода краткого описания столбца, которое не используется системой. •
Default Value. Значение, которое будет присваиваться столбцу по умолчанию.
П Precision. В этом поле указывается максимальное количество цифр (в т. ч. и после запятой), которое можно хранить в столбце. Доступно только для нецелочисленных типов данных с фиксированной точностью, также называемых десятичными (decimal). К ЭТИМ ТИПаМ Данных ОТНОСЯТСЯ numeric И decimal. Для нецелочисленных (или приблизительных) типов данных с фиксированной точностью, также называемых приблизительными (approximately), таких как
984
Часть IV. Разработка и сопровождение баз данных
r e a l и f l o a t , значение в этом поле (24 и 53 соответственно) доступно только для чтения. Аналогичная ситуация и с целочисленными типами данных (tinyint, smallint, int И bigint).
•
Scale. Используется совместно с предыдущим полем и предназначено для указания количества цифр после запятой, которое будет хранить десятичный тип данных. Значение в этом поле не может превышать величины, указанной в предыдущем поле.
• Identity. Если в данном раскрывающемся списке выбрано значение Yes, то соответствующий столбец будет сконфигурирован как столбец-счетчик. Тогда становятся доступными два следующих поля. П Identity Seed. В этом поле указывается начальное значение, которое будет использовано для автоматического генерирования значений для столбцасчетчика. • Identity Increment. С помощью этого поля можно указать величину, на которую станет увеличиваться значение в столбце-счетчике при вставке новой строки. • Is RowGuid. Этот раскрывающийся список, доступный только для типа данных u n i q u e i d e n t i f i e r , содержит всего два значения — Yes и No. При выборе первого из них столбец конфигурируется в качестве уникального глобального идентификатора строки, что соответствует указанию ключевого слова ROWGUIDCOL при описании столбца в команде CREATE TABLE. Автоматически в
поле Default Value подставляется значение newid(). Таким образом, при добавлении в таблицу новой строки в соответствующий столбец будет автоматически помещаться уникальное значение. Напомним, что только один столбец в таблице может быть сконфигурирован как уникальный глобальный идентификатор строки. Тем не менее, можно создавать множество столбцов с ТИПОМ ДанНЫХ u n i q u e i d e n t i f i e r И Значением ПО умОЛЧанИЮ newid () .
G Formula. В данном поле можно ввести формулу, с помощью которой будет формироваться значение столбца. Таким образом, соответствующий столбец будет являться вычисляемым столбцом (computed columns). Формула может включать ссылки на столбцы, функции, а также константы, которые связываются в одно выражение с помощью различных операторов. Для вычисляемых столбцов помимо формулы разрешается указывать только имя столбца. Все остальные параметры, такие как тип данных, значение по умолчанию, возможность хранения значений NULL, описание и т. д. блокируются. • Collation. Поле доступно только для типов данных, предназначенных для хранения символьных и текстовых данных, т. к. с помощью него указывается сопоставление, которое будет использоваться для столбца. По умолчанию предлагается применять то же сопоставление, что было выбрано для базы данных, в которой создается таблица (значение ). Для выбора иного сопоставления следует нажать кнопку —J, расположенную непосредственно справа от поля Collation. После нажатия кнопки откроется окно выбора сопоставления, подобное приведенному на рис. 21.4.
Глава 21. Работа с таблицами
985 После того, как будут сконфигурированы параметры всех столбцов, необходимо сохранить сконфигурированную таблицу. Для этого достаточно нажать кнопку Save, расположенную в панели инструментов. При этом будет выведено окно Choose Name, с помощью которого следует ввести имя, которое будет присвоено сконфигурированной таблице. Затем можно закрыть окно создания таблицы. В принципе, Enterprise Manager автоматически предложит сохранить таблицу, открыв при этом окно Choose Name.
dbo.Tablel.Tezis Please specify a collation: С SQL Collation (• Windows Collation
Cyrilic General Г Binary Sort (* Dictionary Sort Г" Case Sensitive W Accent Sensitive Г" Капа Sensitive Г" Width Sensitive
На этом работу по созданию таблицы можно закончить. Однако мы ничего не сказали про определение внешнего клюHelp OK Cancel ча, выбор группы файлов, в которой будут располагаться данные таблицы, определение индексов, а также про ограРис. 21.4. Окно выбора сопоставления ничение целостности Check. Конфигурирование этих параметров осуществляется с помощью окна Properties, работа с которым будет рассмотрена в следующих разделах. Restore Default
Общие свойства таблицы Если в предыдущем разделе рассматривалось в основном определение отдельных столбцов таблицы, то этот и несколько следующих разделов будут посвящены рассмотрению работы со свойствами самой таблицы. Для управления свойствами таблицы существует окно Properties (рис. 21.5), открыть которое можно с помощью кнопки Table and Index Properties, расположенной на панели инструментов. Замечание Окно Properties используется не только при создании таблицы, но и при работе с диаграммами. Этим объясняется наличие в нем элементов управления, на первый взгляд ненужных. Примером является раскрывающийся список Selected table, позволяющий выбрать таблицу, свойства которой необходимо редактировать. В момент создания таблицы указанный список содержит только один элемент, тогда как при работе с диаграммами в списке будет находиться множество значений.
Как видно из рисунка, окно Properties имеет четыре вкладки. Первая из этих вкладок (см. рис. 21.5) имеет название Tables и предназначена для управления базовыми свойствами таблицы. Рассмотрим элементы управления, доступные на этой вкладке: П Selected table. Теоретически этот раскрывающийся список предназначен для выбора таблицы, со свойствами которой предполагается работать. Однако на момент создания в этом списке доступно только имя формируемой таблицы.
Часть IV. Разработка и сопровождение баз данных
986
_J Tables j Relationships | IndeKes/Keys ] Check Constraints Selected table:
Human
d
Owner:
^dbo
d
Table name:
Human
Table [dentity Column: GID
d
Table ROWGUD I ColumnГ :
d
Text Filegroup.: description:
PR M I ARY PR M I ARY
LL
Table Filegroup: •
d
Таблица, содержащая список: людей
d
й
Close
Help
Рис. 21.5. Окно Properties, вкладка Tables
П Owner. С помощью этого раскрывающегося списка можно выбрать пользователя (или роль) базы данных, которому будет принадлежать создаваемая таблица. Напомним, что рядовой пользователь может в качестве владельца создаваемой таблицы указать только себя. • Table name. Если в списке Selected table указывается текущее имя таблицы, то с помощью рассматриваемого поля можно задать новое имя, которое будет присвоено таблице. П Table Identity Column. С помощью данного раскрывающегося списка можно выбрать столбец, который будет сконфигурирован в качестве столбца-счетчика. По умолчанию в этом элементе управления указывается имя столбца, сконфигурированного в качестве столбца-счетчика при определении списка столбцов. Тем не менее, можно выбрать любой из столбцов, имеющих целочисленный тип данных. • Table ROWGUID Column. В этом раскрывающемся списке перечислены все столбцы, имеющие ТИП даННЫХ u n i q u e i d e n t i f i e r . Выбирая ТОТ ИЛИ ИНОЙ столбец в списке, можно тем самым сконфигурировать его в качестве уникального глобального идентификатора строки. П Table Filegroup. Данный раскрывающийся список содержит перечень всех групп файлов, определенных в базе данных. Выбирая ту или иную группу,
Глава 21. Работа с таблицами
987
вы тем самым предписывается размещать обычные данные (помимо данных типа text, ntext и image) в указанной группе файлов. По умолчанию предлагается располагать в группе файлов по умолчанию (в данном случае PRIMARY).
• Text Filegroup. С помощью этого списка можно выбрать группу файлов, в которой будут располагаться данные столбцов с типом данных text, ntext и image.
• Description. Текстовое поле предназначено для указания краткого комментария к создаваемой таблице. Его содержимое на работу сервера и работу с таблицей никакого влияния не оказывает. На этом работа с вкладкой Tables заканчивается. Перейдем же к рассмотрению следующей вкладки.
Определение внешнего ключа Вторая вкладка окна свойств таблицы имеет название Relationships (рис. 21.6), что можно перевести как отношение. В соответствии с названием вкладка Relationships позволяет определить связь (или отношение) между создаваемой таблицей, рассматриваемой при этом в качестве зависимой, и любой другой таблицей той же базы данных, которая будет являться главной. -J Т ables Relationships j Indexes/Keys j Check Constraints ] Table name:
! Human
Selected relationship:
со FK_Human_Marrital New
Relationship name:
jFK_Hurnan_Marrital
Primary key table
Foreign key table
I Marrital
i Human
MarritallD
Delete
MarritallD
P Check existing data on creation P Enforce relationship for replication P Enforce relationship for INSERTS and UPDATES P Cascade Update Related Fields
Close
Help
Рис. 21.6. Окно Properties, вкладка Relationships
988
Часть IV. Разработка и сопровождение баз данных
Рассмотрим элементы управления, доступные на вкладке: • Table name. В этом поле указывается имя таблицы, свойства которой редактируются. • New. Нажав эту кнопку, можно создать новый внешний ключ, который в дальнейшем будем называть отношением. П Delete. С помощью этой кнопки можно удалить отношение, выбранное в списке Selected relationship. П Selected relationship. В данном раскрывающемся списке выводится перечень всех отношений, созданных в таблице. Все следующие элементы управления, имеющиеся на вкладке, отображают свойства выбранного ключа. О Relationship name. Это текстовое поле содержит имя, присвоенное отношению при создании. Меняя значение в этом текстовом поле, можно переименовать отношение. П Primary key table. В данном поле указывается имя таблицы, которая в выбранном отношении рассматривается в качестве главной. При редактировании созданного отношения имя таблицы изменять запрещается. Однако в момент создания отношения пользователь может выбрать любую несистемную таблицу. • Foreign key table. В данном же поле указывается имя таблицы, которая в отношении рассматривается в качестве зависимой. Предполагается, что в качестве зависимой будет указано имя таблицы, свойства которой редактируются. Однако допускается указание в качестве зависимой таблицы любой другой таблицы базы данных. В этом случае в предыдущем поле должно быть приведено имя редактируемой таблицы. В области, расположенной в центральной части вкладки, отображается список столбцов главной и зависимой таблицы, между которыми будет устанавливаться связь. Каждый элемент таблицы представляет собой раскрывающийся список, в котором выводится перечень столбцов главной и зависимой таблицы. Продолжим рассмотрение элементов, доступных на вкладке: П Check existing data on creation. Установка этого флажка предписывает выполнить проверку данных, имеющихся в таблице, на соответствие устанавливаемому ограничению целостности. При сброшенном флажке такая проверка осуществляться не станет, и вполне возможна ситуация, что в таблице будут иметься данные, не соответствующие наложенным ограничениям целостности. • Enforce relationship for replication. Сброс этого флажка эквивалентен указанию ключевого слова NOT FOR REPLICATION при создании таблицы с помощью команды CREATE TABLE. Напомним, что в этом случае система не будет применять ограничение целостности для данных, вставляемых или изменяемых подсистемой репликации. П Enforce relationship for INSERTS and UPDATES. Установка данного флажка предписывает выполнять проверку при удалении или изменении данных в
Глава 21. Работа с таблицами
989
главной таблице на наличие связи между этими данными и данными в зависимой таблице. При этом становятся доступными два флажка: •
Cascade Update Related Fields — в случае установки этого флажка сервер будет отображать изменения первичного ключа главной таблицы на связанные значения внешнего ключа зависимой таблицы. Если же флажок сброшен, то сервер будет отменять выполнение изменений первичного ключа, требуя предварительного изменения данных в зависимой таблице.
•
Cascade Delete Related Records — установка этого же флажка предписывает при удалении строки главной таблицы выполнять удаление связанных строк в зависимой таблице. При сброшенном флажке сервер будет отменять выполнение удаления строки в главной таблице.
На этом рассмотрение работы с вкладкой Relationships можно считать оконченным.
Управление индексами Следующей вкладкой окна свойств Properties, которую мы рассмотрим, будет вкладка Indexes/Keys (рис. 21.7), предназначенная для управления индексами, определенными для таблицы. С помощью этой вкладки также можно управлять некоторыми свойствами первичного ключа таблицы. Properties
H i -Ш-'.W
:
- ; • ""Kt;
Tables] Relationships Indexes/Keys 1 Check Constraints j Table name:
Human
Selected index:
PKJHuman
Type:
Primary key
Index name:
PKJHuman
zl |
Column name GID
New
Delete
I Order Ascending
|_*J r.l
zl zl Fill f ьгНпг-
r - F i sati Ц?-.; , I ! £" Constfaii •
1 Г index
Г
Ignore dupiica:
J V
Pad I n d e v
F Create as CLUSTERED! Г
Donotaut
tficali:
•
Close
Help
Рис. 21.7. Окно Properties, вкладка Indexes/Keys
990
Часть IV. Разработка и сопровождение баз данных
В верхней части вкладки, как и для предыдущих вкладок, в поле Table name выводится имя таблицы, свойствами которой осуществляется управление. Ниже расположен раскрывающийся список Selected index, в котором перечислены все индексы, определенные для таблицы, а также ограничения целостности Unique и Primary Key. Содержимое нижней части вкладки отображает свойства выбранного объекта. Для создания нового индекса или ограничения целостности Unique достаточно нажать кнопку New. Отметим, что создать первичный ключ средствами вкладки Indexes/Keys нельзя. Тем не менее, с помощью кнопки Delete можно удалить из таблицы первичный ключ, а также индекс или ограничение целостности Unique. В поле Туре указывается тип объекта, выбранного в списке Selected index. Допускаются следующие значения: П Index — индекс; • Primary key — первичный ключ; П Unique — ограничение целостности Unique, обеспечивающее уникальность данных. Для изменения имени индекса (ограничения целостности) можно воспользоваться полем Index name. Это же поле позволяет указать имя создаваемого объекта. В центральной части вкладки имеется таблица, с помощью которой необходимо выбрать столбцы, предполагаемые к включению в индекс или ограничение целостности Unique или Primary Key. Как видно, таблица имеет две колонки — Column name и Order, элемент каждой из них представляет раскрывающийся список. С помощью первой колонки определяется набор столбцов, которые будут входить в индекс или ограничение целостности. С помощью же второй колонки выбирается используемый для индекса тип сортировки. При помощи раскрывающегося списка Index Filegroup можно указать группу файлов, в которой будут размещаться данные соответствующего индекса. Флажок Create UNIQUE доступен только в момент создания индекса. Его установка свидетельствует о желании обеспечить уникальность данных для выбранных в таблице столбцов. Отметим, что уникальность данных может быть обеспечена одним из двух методов: • Constraint — при установке переключателя в это положение уникальность данных будет обеспечена при помощи ограничения целостности Unique; • Index — в этом случае будет создан уникальный индекс. При создании уникального индекса становится доступным флажок Ignore duplicate key. В случае установки этого флажка при попытке пользователя вставить (или изменить) в таблицу большое количество строк сервер будет отменять вставку только тех строк, которые нарушают уникальность значений. При этом будет выдано соответствующее сообщение об ошибке и список всех повторяющихся строк, но транзакция отменена не будет. Затем пользователь должен будет найти повторяющиеся строки и внести в них необходимые изменения, после чего эти строки могут быть добавлены в таблицу. Когда же флажок сброшен, то сервер будет откатывать вставку всех данных, даже если из тысячи строк всего одна нарушает уникальность данных.
Глава 21. Работа с таблицами
991
В правой части вкладки имеется поле Fill factor, с помощью которого можно указать фактор заполнения, используемый для создаваемого индекса. Ниже находится флажок Pat Index, установка которого предписывает серверу резервировать место во внутренних структурах индекса для добавления новых страниц. Нерассмотренными остались только два флажка в нижней части вкладки: • Create as CLUSTERED. Установка флажка предписывает серверу создать кластерный индекс. Особенностью индексов этого типа является то, что физический порядок строк в таблице перестраивается в соответствии с индексом. В каждой таблице может быть создан только один кластерный индекс. П Do not automatically recompute statistics. Когда этот флажок установлен, то сервер не станет производить автоматического обновления статистики для индекса. На этом рассмотрение вкладки Indexes/Keys можно закончить.
Контроль значений Итак, нерассмотренной осталась только вкладка Check Constraints (рис. 21.8), с помощью которой можно управлять ограничениями целостности Check — создавать их, удалять и изменять.
Tables] Relationships] Indexes/Keys Check Constraints
Table name:
: Human
Selected constraint:|CK_Human
zl New
Delete
Constraint name: C j KJHuman Constraint expression: Birth BETWEEN '1-01-1930' AND '1-01-2000'
zl
W Check exs itn i g data on creato in W Enforce constran it for repc ilato in F Enforce constran it for N ISERTS and UPDATES
Co lse
Hep l
Рис. 21.8. Окно Properties, вкладка Check Constraints
992
Часть IV. Разработка и сопровождение баз данных
Верхняя часть вкладки в большей части повторяет содержимое предыдущих вкладок. Поэтому мы сразу перейдем к рассмотрению центральной и нижней части. Как видно из рисунка, центральную часть вкладки занимает поле Constraint expression. В этом поле указывается логическое условие, которое и будет применяться для проверки значений. Допускается использование имен столбцов, функций, констант, а также различных операторов. В нижней же части вкладки расположены три флажка: G Check existing data on creation. Установка этого флажка предписывает серверу выполнить проверку существующих данных на соответствие накладываемому проверочному условию. • Enforce constraint for replication. При сброшенном флажке созданное ограничение целостности не используется при осуществлении операций, выполняемых подсистемой репликации, что эквивалентно указанию параметра NOT FOR REPLICATION при создании ограничения целостности Check средствами КОМаНДЫ CREATE TABLE.
• Enforce constraint for INSERTS and UPDATES. Сброс этого флажка позволяет временно отключить ограничение целостности, не прибегая к его удалению. По умолчанию флажок установлен и проверка выполняется. На этом рассмотрение работы с ограничениями целостности Check, а также и в общем со свойствами таблицы можно считать оконченным.
Изменение таблицы Изменение таблицы средствами Enterprise Manager мало чем отличается от процесса создания таблицы. Единственно, в силе остаются все ограничения, связанные с модификацией структуры таблиц в одном из предыдущих разделов при описании изменения таблиц средствами Transact-SQL. Для изменения структуры таблицы достаточно в ее контекстном меню выбрать команду Design Table, после чего откроется окно, в целом весьма похожее на окно New Table, работа с которым была рассмотрена в предыдущих разделах. Помимо указанной команды в контекстном меню таблицы имеется команда Properties, выбрав которую, можно открыть окно свойств таблицы. Типичный пример такого окна приведен на рис. 21.9. В этом окне отображается список столбцов таблицы, а также их основные характеристики. Также здесь указывается количество строк, имеющихся в таблице (поле Rows), группа файлов, в которой размещаются данные таблицы (поле Filegroup), а также некоторая другая информация. В окне также имеется кнопка Permissions, с помощью которой можно открыть окно управления правами доступа пользователей к таблице.
Глава 21. Работа с таблицами
993
Table Properties - Human General Human
Name:
Permissions.,
Owner:
dbo
Create date:
25.11.200017:34:22
Regroup:
PRIMARY
Rows:
0
Columns:
Key (ID iName %
Ш
GID LNarne FName SName Birth Sex NationID
;Data Type bigint nvarchar nvarchar nvarchar smalldat... bit int
(Size(Precisio.. | Nulls | j * 8 30 30 er 30 4 ш • 1 D —^ 4 LJ Щ\
1
«I OK
Cancel
Help
Рис. 21.9. Окно свойств таблицы
Удаление таблицы Для удаления таблицы средствами Enterprise Manager достаточно выбрать нужную таблицу и нажать либо клавишу , либо кнопку Delete на панели инструментов. Однако прежде чем производить эту операцию, не будет лишним посмотреть, не ссылаются ли на удаляемую таблицу другие объекты базы данных, такие как представления, функции или процедуры. Для получения этой информации можно воспользоваться окном Dependencies for (рис. 21.10). Открыть это окно можно с помощью контекстного меню интересующей таблицы, выбрав в нем команду All Tasks, а затем команду View Dependencies. В верхней части окна имеется раскрывающийся список Object, позволяющий выбрать объект, о зависимостях которого необходимо получить информацию. По умолчанию в нем будет указана таблица, из контекстного меню которой было открыто окно. Тем не менее, можно выбрать и любой другой объект базы данных, в т. ч. и не являющийся таблицей. Основную же часть окна занимает две таблицы — Objects that depend on 'objectname' и Objects that 'objectname' depends on1. В первой таблице приведен список объектов, которые ссылаются на выбранный объект. Во второй же таб1
Вместо 'objectname' в обеих таблицах, как и в заголовке окна будет указано имя интересующего объекта. — Ред.
994
Часть IV. Разработка и сопровождение баз данных
лице указывается перечень объектов, на которые ссылается сам выбранный объект. Dependencies for titleauthor General l&l
fibject:
j M titleauthor (dbo)
Obe j cts that depend on titleauthor: Obe j ct (owner) oV titleview (dbo] ^ byroyalty (dbo)
(Sequence 1 1
Obe j cts that titleauthor depends on: Obe j ct (owner)
Ш id (dbo) Ш tid (dbo) Ш authors (dbo) Ш] publishers [dbo) Щ titles (dbo)
Sequence 1 1 2 2 3
Г" Show first level dependency onlyl Close
Рис. 21.10. Окно просмотра зависимостей объектов
Help
Глава 22
Использование представлений При работе с таблицами иногда бывает необходимо скрыть от пользователей один или более столбцов с конфиденциальными данными. Например, таблица может содержать данные о фамилии, имени и отчестве служащего, дату его рождения, семейное положение, пол, национальность и размер оклада. Необходимо разрешить всем пользователям просматривать всю информацию о сотрудниках кроме размера оклада. Рассмотрим также другой пример. Предположим, что в организации существует центральная база данных, которая хранит информацию о людях. Каждый из отделов должен видеть только тех людей, которые принадлежат этому отделу. В SQL Server 2000 нет средств контроля прав доступа пользователей к конкретным строкам таблицы. Для решения задачи необходимо использовать какие-то дополнительные механизмы. В качестве такого механизма можно выбрать представления. Представления (views) являются виртуальными таблицами, содержимое которых генерируется динамически на основе результата выполнения запроса. Для пользователей работа с представлением мало отличается от работы с таблицами, хотя имеются определенные отличия, которые будут рассмотрены далее в этой главе. При создании запроса указывается запрос SELECT, который будет формировать содержимое представления. В этом запросе могут применяться все разделы команды SELECT. To есть пользователь может выполнять объединение (join) и слияние (union) данных, различные выражения, группировку, агрегирование и логические условия. Если в представление, созданное на основе одной таблицы, не включается один или более столбцов исходной таблицы, то говорят, что на таблицу наложен вертикальный фильтр. Если же в запросе, на основе которого формируется представление, используется логическое условие, накладывающее ограничение на диапазон включаемых в представление строк, то говорят, что на таблицу наложен горизонтальный фильтр. Одновременно в представлении могут присутствовать как вертикальный, так и горизонтальный фильтры. В простейшем случае представление является полной копией данных одной таблицы. В этом случае запрос, на основе которого создается представление, выглядит как SELECT * FROM . Более сложные представления создаются на основе множества таблиц. Так как запрос SELECT позволяет обращаться к представлениям, то представление также способно строиться на основе других
996
Часть IV. Разработка и сопровождение баз данных
представлений, которые, в свою очередь, могут быть созданы на основе таблиц или других представлений. Максимальная вложенность представлений не должна превышать 32 уровней. Обычно представления содержат данные локальных таблиц базы данных, но в принципе возможно создание представлений, ссылающихся на таблицы других баз данных. Максимальное количество столбцов, возвращаемых представлением, составляет 1024. Представления не могут ссылаться на временные таблицы. Также нельзя создать временное представление. Так как представление является, по сути, всего-навсего поименованным запросом SELECT, для него нельзя определить ограничения целостности, триггеры, правила или умолчания. При необходимости эти объекты должны быть созданы на уровне таблиц, на основе которых формируется само представление, а также другие используемые для его создания представления. Также для представления не допускается создание индексов и статистики.
Создание представления Создание представлений в SQL Server 2000 можно выполнить различными методами: •
с помощью Enterprise Manager;
П с помощью мастера Create View Wizard; •
средствами Transact-SQL.
Большинство пользователей для создания представлений используют графический интерфейс утилиты Enterprise Manager. Это обеспечивает быстрое и наглядное создание представлений любой сложности. Пользователи, не имеющие опыта в создании представлений, могут воспользоваться мастером, что максимально упрощает создание представления за счет разбиения всего процесса создания на несколько шагов, каждый из которых снабжает пользователя подсказками. Однако оба перечисленных метода, в конце концов, обращаются к средствам Transact-SQL, с помощью которых собственно и выполняется создание представления. Ничто не мешает пользователям применять для создания представлений непосредственно команды Transact-SQL, не прибегая к помощи графического интерфейса.
Использование Transact-SQL Для создания представлений с помощью Transact-SQL служит команда CREATE VIEW, имеющая следующий синтаксис: CREATE VIEW [.][.]view_name [(column [,...n])] [WITH [ ,...n ]] AS select statement [WITH CHECK OPTION]
Глава 22. Использование представлений
997
Рассмотрим назначение и использование параметров команды: П
С помощью этого параметра указывается имя базы данных, в которой необходимо создать представление. Если параметр опускается, то представление создается в текущей базе данных. В предыдущих версиях SQL Server, в т. ч. и в SQL Server 7.0, при создании представления не разрешалось указание имени базы данных. Таким образом, представление могло быть создано только в текущей базе данных. П Имя пользователя базы данных, которому будет принадлежать создаваемое представление. Если параметр опускается, то представление будет принадлежать текущему пользователю. П view_name
Этот параметр определяет имя, которое будет присвоено представлению. При выборе имени представления необходимо следовать стандартным правилам именования объектов. Перед созданием представления следует убедиться, что в базе данных нет таблицы или представления с таким же именем. Не разрешается начинать имя представления с символов # или ##, т. к. SQL Server 2000 не поддерживает создание временных представлений. О
(column
[, ... .п] )
С помощью этого параметра указываются имена, которые будут присвоены столбцам представления. Количество элементов параметра (column [, ,-..n]) должно соответствовать количеству столбцов, возвращаемых запросом SELECT, на основе которого строится представление. Явное указание имен для столбцов представления необходимо, если запрос SELECT возвращает столбцы, построенные на основе функций, констант и других выражений, а также когда в результате объединения нескольких таблиц имеется несколько столбцов с одинаковыми именами. Параметр (column [, . . . п ] ) также может быть использован просто для изменения имен столбцов, возвращенных запросом. Если этот параметр не задан, то имена столбцов представления будут соответствовать именам столбцов, возвращенных запросом. Замечание Имена столбцам можно присвоить непосредственно в запросе S E L E C T . В этом случае применение параметра ( c o l u m n [ , - . . . п ] ) не требуется.
Посредством этой конструкции указываются дополнительные атрибуты для создаваемого представления. Конструкция имеет следующий синтаксис: < view_attribute > ::= {ENCRYPTION | SCHEMABINDING | VIEW_METADATA}
Рассмотрим назначение каждого из параметров: •
WITH ENCRYPTION. При использовании этой опции сервер будет выполнять шифрование кода, используемого для создания представления. Этот код
998
Часть IV. Разработка и сопровождение баз данных
хранится в системной таблице syscomments, имеющейся в каждой базе данных. Шифрование обычно требуется, когда необходимо скрыть от пользователя информацию о том, на основе каких таблиц было создано представление. •
SCHEMABINDING. Указание этого параметра предписывает серверу выполнить связывание схемы (или структуры) создаваемого представления со схемами объектов (таблиц и представлений), на основе которых создается представление. Подобная связь позволяет гарантировать, что пользователи не смогут изменить структуру исходных объектов таким образом, что это приведет к нарушению функциональности создаваемого представления. Типичным примером такого изменения является удаление (или переименование) из таблицы столбца, к которому обращается представление. При использовании параметра SCHEMABINDING требуется указывать не только имена объектов, но и имена владельцев.
• VIEW_METADATA. Данный параметр применяется при работе с технологиями DBLIB, ODBC и OLE DB API и предписывает серверу при запросе метаданных возвращать не метаданные об исходных таблицах, на основе которых построено представление, а непосредственно о самом представлении. О AS select_statement
После ключевого слова указывается запрос SELECT, на основе которого собственно и будет формироваться содержимое представления. Пользователь, создающий представление, должен иметь права доступа ко всем объектам, к которым выполняется обращение в запросе. В запросе разрешается обращение более чем к одной таблице или представлению. Для построения столбца могут быть использованы различные выражения, включающие имена столбцов, константы, функции. Однако не допускается применение переменных. Кроме того, имеются еще несколько ограничений:
•
•
строки, возвращаемые запросом, должны быть не отсортированными, т. е. запрещается использование раздела ORDER BY;
•
не допускается указание раздела COMPUTE, С ПОМОЩЬЮ которого вычисляются значения функций агрегирования по столбцу;
•
запрещается использование раздела INTO, С ПОМОЩЬЮ которого на основе результата запроса создается новая таблица;
•
не разрешена ссылка на временные таблицы.
WITH CHECK OPTION
Использование этой опции при создании представления гарантирует, что для строк представления не будет разрешено выполнение изменений, которые могут привести к исчезновению строки из представления. Например, если в запросе SELECT, на основе которого создано представление, в разделе WHERE используется условие price>=20, то сервер будет запрещать выполнение через представление изменений, которые устанавливают для столбца p r i c e значения меньше 20.
Глава 22. Использование представлений
999
Физически процесс создания представления сводится к отображению его существования в системной таблице sysobjects, имеющейся в каждой базе данных. Эта таблица содержит список всех объектов, созданных в базе данных. Код команды, с помощью которой было создано представление, записывается в таблицу syscomments. Как часть этого кода сохраняется и запрос SELECT, С ПОМОЩЬЮ которого формируется содержимое представления. Если при создании представления применяется опция WITH ENCRYPTION, TO сохраняемые в таблице syscomments данные представления будут шифроваться. В таблице syscolumns будет сохранен список всех столбцов, определенных в представлении. Информация о таблицах и представлениях, на основе которых построено представление, сохраняется в таблице sysdepends, что позволяет отслеживать зависимости между объектами базы данных. Приведем пример создания представления с использованием слияния результатов выполнения двух запросов: CREATE VIEW union_view AS SELECT title_id, title=CAST(title as char(30))+ CASE WHEN LEN (title) >30 THEN '...' ELSE !.' END, value=price*ytd_sales, type='psychology' FROM titles_psychology UNION SELECT title_id, title=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE " END, value=price*ytd_sales, type='business' FROM titles_business
Теперь просмотрим, что же будет содержаться в представлении: SELECT * FROM union_view
Будет возвращен следующий результат: title id title
value
type
BU1032 The Busy Executive's Database ... BU1111 Cooking with Computers: Surrep... BU2075 You Can Combat Computer Stress... BU7832 Straight Talk About Computers PS3333 Prolonged Data Deprivation: Fo... PS1372 Computer Phobic AND Non-Phobic... PS2091 Is Anger the Enemy? PS7777 Emotional Security: A New Algo... PS2106 Life Without Fear (9 row(s) affected)
81859.0500 46318.2000 55978.7800 81859.0500 81399.2800 8096.2500 22392.7500 26654.6400 777.0000
business business business business psychology psychology psychology psychology psychology
Использование Enterprise Manager Предыдущий раздел был посвящен рассмотрению создания представления средствами Transact-SQL. В этом же разделе обсудим создание представлений средствами Enterprise Manager.
1000
Часть IV. Разработка и сопровождение баз данных
При работе с Enterprise Manager список представлений, имеющихся в базе данных, находится в папке Views (рис. 22.1). Как видно из рисунка, для каждого представления указывается его имя (столбец Name), владелец (столбец Owner), тип — системный или пользовательский (столбец Туре), а также дата создания (столбец Create Date). ш SQL Server Enterprise Manager - [Console Root \MScros e
°l Action
Wn i dow Help
View
Tools
Tree j
j Ф»
©
[7] Щ Views
\ Owner »•] Name t. oV Alphabetical list of products dbo oVCategory Sales for 1997 dbo 6V Current Product List dbo 6V Customer and Suppliers by City dbo 6V Invoices dbo oV Order Details Extended dbo trtf Order Subtotals dbo oV Orders Qry dbo : °"' ' В dbo : j-jSjl Stored Procedures oV Product Sales for 1997 oV Products Above Average Price dbo | |^R Users : f*w Roles cno" Products by Category dbo \J Rules tn/1 Quarterly Orders dbo : -ПЗ Defaults oV Sales by Category dbo • £lj User Defined Data ' dbo : fife User Defined Functi oVSales Totals by Amount : (ftTSummary of Sales by Quarter dbo Щ) Full-Text Catalogs crV Summary of Sales by Year dbo У pubs cixfsysconstraints dbo • es^ Diagrams [-Щ Tables dncT sysmergeextendedarticlesview dbo oV Views oVsyssegrnents dbo • ^ p Stored Procedures j jJ2 Users
Й- pi DocExch ffl У master Ш Q MATRIX [+]••• У model +: У msdb В Q. Northwind i £f§ Diagrams 1 3 Tables d
i i j : I: :
: -; |
;
19 Items
ш зз 1 Type User User User User User User User User User User User User User User User User System System System
j Create Date 18.04.2000 1:56:51 18.04,2000 1:56:53 18.04.2000 1:56:51 18,04.2000 1:56:51 18.04.2000 1:56:52 18.04,2000 1:56:52 18.04,2000 1:56:53 18,04.2000 1:56:51 18.04.2000 1:56:53 18.04.2000 1:56:51 18.04.2000 1:56:52 18.04,2000 1:56:52 18.04,2000 1:56:53 13.04,2000 1:56:53 18.04,2000 1:56:54 18.04,2000 1:56:54 18.04,2000 1:51:58 10.11,2000 13:54:45 18.04,2000 1:51:58
ЙР Roles ;
|- | Э Defaults
<
., I i\
i
J j
Рис. 2 2 . 1 . Папка Views
Для создания нового представления достаточно выбрать в контекстном меню папки Views команду New View или нажать кнопку New на панели инструментов. В ответ откроется New View (рис. 22.2), с помощью которого и создается представление. Это окно вертикально разделено на четыре части, каждая из которых имеет свое имя: • Diagram Pane. В этой области, расположенной в верхней части окна, указываются все таблицы, представления и функции, которые предполагается использовать для построения представления. Для добавления в область новой таблицы, представления или функции следует нажать кнопку Add table в панели инструментов. После этого откроется окно Add Table, с помощью которого и можно добавить объект в область Diagram Pane. Окно Add Table со-
Глава 22. Использование представлений
1001
держит три вкладки — Tables, Views, Functions, — на которых, соответственно, перечислены все имеющиеся в базе данных таблицы, представления и функции. 2<J
Ш SQl Server Enterprise Manager - [2:New View in "Northwind on Console
G9
Window
Help
H S HL IB
!
<*
s
^
n • I* (All Columns) EinpJoyeero j TerritorylD
j1* (All Cou l mns) iyj Empo l yeeD l z1 • LastName Vj FristName Title zl Cou l mn Alias EmployeelD LastName FirstName TerritorylD TerritoryDescrip ReqionlD
1 fable" Empo l yees Empo l yees Empo l yees Territories Territories Territories
fil
\* (All Cou l mns) VJTerritcrylD YiTemtoryDescription /.iRegionlD
Sort Order Criteria
lor.:.
SELECT TOP 100 PERCENT dbo,Empo l yees.Empo l yeeD l , dbo.Empo l yees.LastName, dbo.Empo l yees.FristName, dbo.Territories.Territoryl•'.D,I dbo .Territories.TerritoryDescription, dbo.Territories.RegionID FROM dbo.Empo l yees N I NER JOIN dbo.EmployeeTerritories ON dbo,Empo l yees,Empo l yeeD l = dbo,EmployeeTerrtiore i s.EmployeelD N I NER JOIN dbo,Territories ON dbo.EmployeeTerritories.TerritorylD — dbo.Territories,TerritorylD ORDER BY dbo,Empo l yees.Empo l yeeD l J J [ LastName FirstName I Territc EmployeelD 06897 Wilton Davolio Nancy 19713 Neward Davolio Nancy •
Fuller Fuller
Fuller Fuller
Andrew Andrew Andrew Andrew inrlrpiM
01581 01730 " 01833 02116
Westboro Bedford Georgetow Boston
П91ЭД
Рис. 22.2. Окно New View
С помощью этой области можно разрешить или запретить включать те или иные столбцы в представление, определить связь между столбцами исходных таблиц, указать порядок сортировки, а также выполнить некоторые другие действия. Каждая таблица или представление отображается в виде самостоятельного объекта, имеющего список столбцов, определенных в соответствующей таблице или представлении. Установка флажка слева от имени столбца приведет к включению этого столбца в создаваемое представление (включение в раздел SELECT). В контекстном меню столбца можно выбрать тип сортировки. Если выбрать пункт Sort Ascending, то результат выборки будет отсортирован по возрастанию, если же в контекстном меню выбрать пункт Sort Descending, то сортировка будет выполняться по убыванию. Определение сортировки по столбцу влечет за собой включение имени соответствующего столбца в раздел ORDER BY создаваемого запроса SELECT, на основе которого и будет создано представление. Помимо всего прочего, можно оп-
1002
Часть IV. Разработка и сопровождение баз данных
ределить отношения между столбцами двух таблиц. Для создания такого отношения следует нажать левую кнопку мыши на имени столбца и, не отпуская кнопки мыши, переместить курсор к имени столбца, с которым необходимо установить отношение. Отношения между таблицами определяются с помощью раздела JOIN запроса SELECT. Изменения, выполняемые в области Diagram Pane, немедленно отображаются в областях Grid Pane и SQL Pane. • Grid Pane. Эта область является второй сверху, расположенной непосредственно ниже области Diagram Pane. Область Grid Pane позволяет выполнять частично те же задачи, что и предыдущая область, только в другой форме. Тем не менее, включить таблицу или представление в создаваемое представление можно только с помощью области Diagram Pane. Для включения столбца в представление при работе с областью Diagram Pane необходимо было установить флажок слева от его имени, тогда как при работе с областью Grid Pane имя нужного столбца должно быть выбрано в колонке Column. Элемент этой колонки представляет собой раскрывающийся список, в котором перечислены имена столбцов всех таблиц, имеющихся в области Diagram Pane. Выбрав имя столбца в этом раскрывающемся списке, вы тем самым включаете его в запрос. Однако при этом еще не ясно, какую роль станет играть столбец — будет просто включен в результат выборки, будет служить критерием сортировки или использоваться для указания условия с целью ограничения диапазона строк, которые включаются в результат выборки. В колонке Alias можно указать псевдоним, который будет использоваться для соответствующего столбца в представлении. Таким образом, с помощью псевдонима можно выполнять изменение имени столбца. В колонке Table указывается имя таблицы (или представления), к которой принадлежит столбец. Хотя при выборе имени столбца в колонке Column имя столбца приводится с указанием имени таблицы, впоследствии в колонке Column выводится только имя собственно столбца, тогда как имя таблицы отображается в колонке Table. В колонке Output имеется флажок, установка которого позволяет включить соответствующий столбец в представление. Это действие аналогично установке флажка слева от имени столбца при работе с областью Diagram Pane. Напомним, что это влечет к включению имени соответствующего столбца в раздел SELECT создаваемого запроса. С помощью колонки Sort Type можно выбрать тип сортировки, если предполагается использовать соответствующий столбец для определения критерия сортировки. В распоряжении пользователя имеется всего два пункта — Ascending (по возрастанию) и Descending (по убыванию). При конфигурировании сортировки, помимо выбора ее типа, необходимо также указать очередность сортировки по столбцу. Очередность сортировки задается в колонке Sort Order. Если конфигурируемый столбец должен использоваться для ограничения количества строк, которые нужно включить в результат выборки, то для этого можно воспользоваться колонкой Criteria, где необходимо указать условие, с которым будет сравниваться значение соответствующего столбца каждой строки. Если это условие выполняется, то строка станет участвовать в дальнейших операциях выборки. В противном случае она исключается и далее нигде не фигурирует. Можно указать более одного условия, воспользовавшись колонками Ог. Од-
Глава 22. Использование представлений
1003
нако следует учитывать, что условия, вводимые в отдельные колонки, объединяются с помощью оператора OR. Таким образом, строка будет отображаться в представлении только в том случае, если выполняется условие хоть в одной колонке. Для создания условий, использующих оператор AND, необходимо использовать единственную колонку и во вводимом в ней значении указывать оператор AND. П SQL Pane. Эта область содержит текст запроса SELECT, созданного с помощью описанных выше областей. Внесение изменений в любую из двух предыдущих областей немедленно отображается на коде, указанном в области SQL Pane. Например, определение порядка сортировки приводит к формированию или изменению раздела ORDER BY, тогда как указание или изменение условий выборки приводит к созданию или модификации раздела WHERE. Помимо использования двух предыдущих разделов, создание запроса можно выполнять и вручную. То есть пользователь может написать текст запроса непосредственно в области SQL Pane. Замечание Подробно написание запроса S E L E C T будет рассмотрено в главе 29.
Results Pane. В этой области можно просмотреть результат выборки, возвращаемый после обработки запроса. Таким образом, с помощью рассматриваемой области пользователь может сразу же увидеть, как те или иные изменения, выполняемые в трех описанные выше областях, отразятся на результате выборки. Данные, отображаемые в области Results Pane, будут входить в представление.
Save this view as: i I NewView
После того как представление окажется сформированным, остается только сохра_ _ нить его. Для этого необходимо нажать _,
кнопку Save на панели инструментов. OK I Cancel В ответ откроется окно Save As (рис. 22.3), с помощью которого нужно указать имя о ^ о А представления. При выборе имени предп п F к Рис. 22.3. Окно Save As _v * ставления необходимо придерживаться стандартных правил именования объектов. После нажатия кнопки ОК представление будет сохранено и появится в папке Views базы данных. Модификацию созданного представления можно осуществлять двумя способами — визуально и на уровне кода Transact-SQL. В первом случае изменение представления практические ничем не будет отличаться от его создания. Для редактирования представления в этом режиме следует открыть папку Views, найти имя нужного представления и в его контекстном меню выбрать команду Design View. В ответ откроется окно, практически ничем не отличающееся от рассмотренного окна New View. Если же требуется изменить представление на уровне команды CREATE VIEW, С помощью которой и было создано представление, то достаточно в контекстном
Часть IV. Разработка и сопровождение баз данных
1004
меню представления выбрать команду Properties или просто щелкнуть на нем. В ответ появится окно свойств представления View Properties (рис. 22.4), в котором и будет приведен код команды CREATE VIEW. ВНОСЯ изменения в приведенный в окне код, можно тем или иным образом изменить представление. Нажав кнопку Check Syntax можно проверить правильность синтаксиса введенного кода. При этом также выполняется- проверка имен объектов, на которые ссылается представление. "• View Properties - NewView
General Name: Owner: Date created:
NewView
Permissions..
dbo 26.11.2000 21:40:06
Text:
С R E AT E VIE W d b о N ewVi ew j AS SELECT TOP 100 PERCENT dbo.Employees EmployeelD, dbo Employees. Lastf dbo. Territories. Territory Description, dbo.Territories Region ID FROM dbo Employees INNER,JOIN dbo EmployeeTerritories ON dbo.Employees EmployeelD • dbo Emplo dbo.Territories ON dbo. EmployeeTerritories.TerritorylD = dbo Territories ORDER BY dbo.Employees EmployeelD
±1
1,10/tD
Check Syntax OK
Cancel
Hep l
Рис. 2 2 . 4 . Окно View Properties
Нажав же в окне View Properties кнопку Permissions можно открыть окно Object Properties (рис. 22.5), с помощью которого легко управлять правами доступа пользователей к представлению. Для просмотра зависимостей между представлением и другими объектами базы данных следует в контекстном меню представления выбрать команду АН Tasks, a затем команду View Dependencies, после чего откроется окно Dependencies for, в котором и будет отображена информация о зависимостях. Помимо всего прочего, с помощью Enterprise Manager можно просмотреть и изменить данные представления. Для этого следует опять воспользоваться контекстным меню представления, выбрав в нем команду Open View, а затем команду Return All Rows.
Глава 22. Использование представлений
1005 ill
Object Properties - Northwind Permissions Щщ
Object:
JoVNewView (dbo)
jrj
(* List allj-isers/uset-defined database roles/public f List only users/user-defined database roles/public with permissions on this object. jUsers/Database Roles/Public SELECT UNSERT (UPDATE Ш 9uesf Public
DELETE
E IXEC |DRI
ШШ J
Columns.
OK
Cancel
Apply
Help
Рис. 22.5. Окно Object Properties
Использование мастера Create View Wizard Итак, к настоящему моменту мы уже обсудили создание представлений средствами Transact-SQL и Enterprise Manager. Осталось рассмотреть использование мастера Create View Wizard. Хотя этот способ создания представления и является самым простым, тем не менее, предоставляемые им возможности весьма ограничены. Мастер может применяться только для построения простых представлений, не использующих сложные конструкции. Недостатком мастера является невозможность построения представления на основе других представлений и пользовательских функций. Более того, мастер не допускает создания отношений между таблицами в графической форме, как это позволяет делать Enterprise Manager. Запустить этот мастер можно с помощью окна Select Wizard, открыть которое можно, нажав в панели инструментов Enterprise Manager кнопку Run a Wizard. Нужный нам мастер находится в папке Databases. Первое окно мастера традиционно содержит перечень действий, которые должен выполнить пользователь для создания представления. Никаких элементов управления, непосредственно связанных с созданием представления, в окне нет. Поэтому можно смело переходить к следующему окну.
1006
Часть IV. Разработка и сопровождение баз данных
Второе окно Мастера называется Select Database (рис. 22.6) и предназначено для выбора базы данных, в контексте которой будет создаваться представление. Выбранная базы данных станет определять список таблиц, на основе которых можно будет создавать представление — мастер работает только с таблицами, расположенными в указанной базе данных. Создаваемое представление будет размещено в выбранной базе данных.
xj
Create View Wizard - STORAGE\TRELQN Select Database Select the database to be referenced by the view.
database name:
Next>
Cancel
Рис. 22.6. ОКНО Select Database мастера Create View Wizard
Следующее окно мастера имеет имя Select Objects (рис. 22.7). В нем из элементов управления содержится только таблица, предназначенная для выбора объектов, на основе которых будет создаваться представление (т. е. формирование раздела FROM запроса SELECT). В колонке Table Name указываются имена всех пользовательских таблиц, имеющихся в базе данных. Имя владельца таблицы приводится в столбце Table Owner. Для включения же таблицы в представление достаточно установить флажок в колонке Include in View. После того, как все объекты будут выбраны, можно переходить к окну мастера Select Columns (рис. 22.8), где указываются столбцы выбранных в предыдущем окне таблиц, которые станут отображаться в представлении. В первой колонке приводится трехчастное имя столбца, включающее помимо имени собственно столбца имя таблицы и ее владельца. В колонке Data Type указывается тип данных, который имеет соответствующий столбец. Установка же флажка в колонке Select Column предписывает включить столбец в представление (в раздел SELECT). Следующее окно, называющееся Define Restriction (рис. 22.9), предназначено для ввода кода, помещаемого в раздел WHERE запроса SELECT, на основе которого будет формироваться представление. Подробно написание запросов SELECT, а также ра-
Глава 22. Использование представлений
1007
бота с разделом WHERE, будут рассмотрена в главе 29. Сейчас же скажем, что с помощью раздела WHERE МОЖНО связать две и более таблиц, а также установить вертикальные фильтры, ограничив диапазон строк, входящих в представление. Create View Wizard - STORAGE\TRELON\HorthwirM|
^J
Select Objects Select one or more objects to be referenced by the view
Table Name Employees E mployeeT erritories Order Details Orders Products Region Shippers Suppliers Tablei Territories
1 Table Owner dbo dbo dbo dbo dbo dbo dbo dbo dbo dbo
11 nclude in View
•»•
0
• • D • L .J и 0
—•
1 ±Г
< fiack Next >
Cancel
Рис. 2 2 . 7 . Окно Select Objects мастера Create View Wizard Create View Wizard - STQRAGE\TRElON\Northwfnd
Ш
*J
Select Columns Select one or more columns for the view to display.
Column Name H dbo.Emplovees EmploveelD dbo.E mploy ees LastN ame dbo. E mployees. FirstN ame dbo. Employees. Title dbo. E mploy ees. T itleO fCourtesy dbo. E mployees. В irthD ate dbo. E mployees. H ireD ate dbo. E mploy ees. Address dbo. Employees. City dbo. E mployees. R egion
(Data Type int nvarchar nvarchar nvarchar nvarchar datetime datetime nvarchar nvarchar nvarchar
< Back
; See l ct Cou lmn *'j ШИН mm i
! 1
Next >
Cancel
Рис. 2 2 . 8 . Окно Select Columns мастера Create View Wizard 33
Зак. 83
Часть IV. Разработка и сопровождение баз данных
1008
Create View Wizard - STORAGE\TRElGN\Nt>rthWirid Define Restriction Optionally, use the Transact-SQL syntax (WHERE clause) to restrict the information the view displays.
2£]
dbo Employees Employee ID = dbo ErnployeeTerritories Employeel D dbo EmployeeTerritories TerritorylD = dbo Territories Territory! D
1L < Back
Next>
Cancel
Рис. 22.9. Окно Define Restriction мастера Create View Wizard
С помощью очередного окна — Name the View — указывается имя, которое будет иметь представление. Мы уже не раз в этой главе обсуждали выбор имени представления. Все сказанное ранее относится и к именованию представления при создании его с помощью мастера. Create View Wizard - STORAGEXTRELONSNOTthwn id Completing the Create View Wizard You have completed the steps required to create the view shown below. Optionally, you can edit the statements in this wn i dow to customize it. JSE [Northwind] O i .REATE VIEW [Employees_VIEW] ArS SELECT [dbo].[Employees][EmployeelD] [dbo] [Ernplo. R0M [dbo] [Employees], [dbo] [EmployeeTerritories] [dbo dbo Empo l yees Empo l y eel D ••• dbo EmployeeTerritories Empo l yeeD l and dbo.EmployeeTerritories TerritorylD * dbo. T erritories. T erritoryl D|
Finish
Рис. 22.10. Последнее окно мастера Create View Wizard
Cancel
Глава 22. Использование представлений
1009
Следующее же окно мастера (рис. 22.10) является последним. В нем выводится код команды CREATE VIEW, сгенерированный мастером на основе данных, указанных пользователем в окнах мастера. Пользователь может внести в приведенный код любые необходимые изменения. После нажатия кнопки Finish мастер запустит приведенный в окне код, в результате выполнения которого и будет создано представление. Дальнейшая работа с представлением может вестись как средствами Enterprise Manager, так и средствами Transact-SQL. Эти методы были рассмотрены в предыдущих разделах.
Модификация данных в представлении Часто представления используются как средство повышения безопасности данных. Администратор не предоставляет пользователям непосредственного доступа ко всем данным таблицы, а создает представление, с помощью которого пользователи могут просматривать данные. Однако часто помимо просмотра пользователям бывает необходимо выполнить и изменения данных. Представления SQL Server 2000 позволяют пользователям не только просматривать, но и модифицировать данные. Изменение данных с помощью представлений выполняется точно так же, как и изменение данных в обычных таблицах. Однако разрешается исправление только тех столбцов представления, которые выбраны непосредственно из таблиц или представлений, а не являются результатом вычисления какого бы ни было выражения. Кроме того, за одну операцию разрешается изменение только столбцов, принадлежащих одной таблице. Если нужно изменить данные во всех столбцах представления, построенного на основании четырех таблиц, то такую операцию нужно будет разбить на четыре этапа. Запрос, на основе которого создано представление, должен обращаться хотя бы к одной таблице. То есть в разделе FROM ДОЛЖНО быть указано как минимум одно имя. Если представление строится только на значениях, возвращаемых функциями и константами, то такое представление нельзя будет обновить. Если представление создано с использованием опции WITH CHECK OPTION И В запросе существует раздел WHERE, TO будет запрещено выполнение любых модификаций, которые приведут к нарушению условия, указанного в разделе WHERE.
Права доступа к представлениям Как и для многих других объектов базы данных, прежде чем пользователь сможет работать с представлением, ему необходимо предоставить соответствующие права доступа. Управление правами доступа пользователей к представлению практически ничем не отличается от управления правами доступа к таблицам. Для предоставления доступа к представлению используется команда GRANT, ДЛЯ запрещения доступа — команда DENY. Чтобы отменить выданные ранее права (неявное отклонение) доступа, применяется команда REVOKE.
1010
Часть IV. Разработка и сопровождение баз данных
Для представлений могут выдаваться следующие права доступа: •
SELECT — пользователю разрешается выборка данных из всего представления или только из определенных столбцов;
D UPDATE — это право разрешает выполнять изменение данных через представление, но не позволяет просматривать данные; •
•
INSERT — пользователю разрешается добавлять в представление новые строки, но запрещается просматривать и изменять данные таблицы, в т. ч. и вставленные им самим; DELETE — разрешается удаление строк представления.
Конкретному пользователю или роли базы данных может быть выдана любая комбинация из перечисленных прав доступа. Предоставление пользователю тех или иных прав доступа к представлению еще не гарантирует, что он сможет их использовать. Если владельцем объектов (таблиц и представлений), на основе которых построено представление, является иной пользователь, чем владелец представления, то пользователи помимо прав доступа к представлению должны иметь соответствующие права доступа и к исходным объектам. Однако если все таблицы, которые применялись для создания представления, принадлежат тому же пользователю, что и само представление, то достаточно предоставить доступ только к самому представлению. Например, если представление построено на пяти таблицах, но только три из них принадлежат пользователю, создавшему представление, то для того, чтобы другие пользователи могли работать с представлением, необходимо предоставить им соответствующие права доступа к двум остальным таблицам. Предложенные правила управления доступом действуют на всех уровнях. Например предположим, что представление создано на основании нескольких представлений, которые, в свою очередь, также созданы на основе представлений, и такая вложенность достигает семи уровней. Представления всех уровней принадлежат одному пользователю, но таблицы, лежащие в основе всех этих представлений, принадлежат другому пользователю. В этом случае помимо предоставления пользователям прав доступа к самим представлениям они должны будут получить еще и права доступа к исходным таблицам.
Переименование представлений Иногда бывает необходимо изменить имя представления. Конечно, можно удалить представление и создать его заново с другим именем, однако при этом будет потеряна информация о правах доступа пользователей к этому представлению. Чтобы избежать этого, рекомендуется использовать системную хранимую процедуру sp_rename, специально предназначенную для изменения имен объектов базы данных. Эта хранимая процедура напрямую обращается к системным таблицам базы данных и исправляет значения в столбцах, описывающих имя объекта. Хранимая процедура sprename имеет следующий синтаксис: sp_rename [Sobjname =] 'object_name', [Snewname =] 'new_name', 'OBJECT'
Глава 22. Использование представлений
1011
Текущее имя представления задается с помощью параметра 'object_name'. Новое имя определяется параметром 'newname'. Параметр 'OBJECT' В ЭТОМ случае задает тип изменяемого объекта и не должен изменяться. В качестве примера рассмотрим переименование представления, созданного в предыдущем примере: sp_rename 'union_view',
'view2', 'OBJECT'
Замечание Прежде чем изменить имя представления, следует убедиться, что оно не используется в хранимых процедурах или других представлениях. В противном случае их работа будет нарушена. Однако можно создать другое представление с таким же именем и набором столбцов. Переименование представлений может быть весьма полезным при разработке сложных представлений, построенных на множестве других представлений. В процессе разработки часто приходится проверять различные варианты кода представлений и выбирать из них лучший. Переименовав представление можно сохранить работающий вариант под другим именем и продолжить эксперименты.
Изменение представлений Вполне возможно, что со временем возникнет необходимость в модификации представления. Обычно такая необходимость вызвана изменениями в коде запроса, на основе которого создано представление. Например, пользователям может понадобиться включить в представление дополнительный столбец или внести изменения в раздел WHERE, чтобы изменить условия фильтрации строк. Для изменения представления предназначена команда ALTER VIEW, имеющая синтаксис: ALTER VIEW [.][.]view_name [ (column [,...n])] [ WITH [,...n]] AS select_statement [WITH CHECK OPTION]
Назначение параметров команды аналогично одноименным параметрам команды CREATE VIEW и было рассмотрено ранее в этой главе. (
Замечание
^
Если в команде ALTER TABLE не указывается опция WITH CHECK OPTION, TO КОД
представления не будет шифроваться, независимо от того, использовалось ли шифрование при создании представления. Соответственно, если при изменении опция W I T H
CHECK
O P T I O N указана, то шифрование
будет
выполнено.
Замечание При внесении изменений в представления следует убедиться, что эти изменения не коснутся других представлений или хранимых процедур. При удалении из представ-
1012
Часть IV. Разработка и сопровождение баз данных ления столбцов или исправлении их имени или типа данных может быть нарушена работа связанных объектов.
Просмотр параметров представления Если в базе данных имеется множество таблиц и представлений, созданных на протяжении нескольких месяцев, а документирование ведется не достаточно хорошо, то пользователи, администраторы и разработчики часто сталкиваются с необходимостью разбираться в том, что за данные возвращает представление. Чтобы упростить эту задачу, в SQL Server 2000 имеются несколько хранимых процедур, с помощью которых можно получить информацию о представлениях. Если вы хотите узнать, какое количество столбцов возвращает представление, а также получить подробную информацию о типе данных и свойствах каждого из столбцов, то необходимо вызвать хранимую процедуру sp_heip, имеющую синтаксис: sp_help [[@objname =] name]
Эта хранимая процедура возвращает информацию о представлении в нескольких блоках, каждый из которых содержит одну или более колонок, в которых и указывается информация о представлении. В табл. 22.1 приведен список колонок, содержащихся в первом блоке. Все перечисленные колонки образуют одну строку, каждая из которых описывает один столбец представления. Таблица 22.1. Общие сведения о представлении Имя колонки
Тип данных
Описание
Column_name
Nvarchar(128)
Имя столбца
Type
Nvarchar(128)
Тип данных, который имеет столбец
Computed
Varchar(35)
Если в этой колонке Yes, то столбец вычисляемый (computes). Значение N0 указывается даже для столбцов, которые формируются на основе вычисления значений выражения
Length Prec
int
Длина столбца в байтах
char(5)
Точность столбца (только для нецелочисленных типов данных). Для целочисленных типов указывает значение О
Scale
char(5)
Количество знаков. Используется только для числовых данных. Указанное значение включает и знаки после запятой
Nullable
varchar(35)
Если указано Yes, то столбец разрешает хранение значений
TrimTrailing Blanks
varchar(35)
N U L L
Если указано Yes, то в столбце выполняется удаление конечных пробелов
Глава 22. Использование представлений
1013 Таблица 22.1 (окончание)
Имя колонки
Тип данных
Описание
FixedLenNull InSource
varchar(35)
Этот столбец присутствует только для обеспечения обратной совместимости
Collation
sysname
Имя сопоставления, которое имеет столбец представления
Второй блок (табл. 22.2) содержит информацию о столбце-счетчике (IDENTITY). Таблица 22.2. Информация о столбце-счетчике Имя колонки
Тип данных
Описание
Identity
n v a r c h a r (128)
Имя столбца представления, для которого установлено СВОЙСТВО IDENTITY
Seed
numeric
Начальное значение счетчика, установленное для столбца при создании таблицы
Increment
numeric
Шаг приращения значений в столбце-счетчике
Not For Replication
int
Если указано Yes, то подсистема репликации может вставлять произвольные значения в столбец IDENTITY, т. е. без использования автонумерации
Следующие блоки данных содержат информацию о столбце RowGuidCol, о группе файлов, в которой размещены данные, индексы, связанные с теми или иными столбцами таблиц, а также список ограничений целостности.
Замечание Системная хранимая процедура s p _ h e l p применяется для получения информации практически по всем типам объектов базы данных. Однако для каждого типа объектов возвращается свой набор блоков и колонок. Но для таблиц и представлений выводятся одинаковые данные. То есть все сказанное о получении информации о свойствах представления относится и к таблицам.
К сожалению, количество информации, возвращаемое хранимой процедурой sp_heip, не позволяет рассмотреть в книге пример использования этой процедуры. Тем не менее, можно легко получить интересующую информацию, выполнив хранимую процедуру в Query Analyzer. Помимо свойств столбцов представления иногда бывает полезно просмотреть код, на основе которого было выполнено создание представления. Как и для всех других объектов баз данных сервер при создании представления автоматически сохраняет в системной таблице syscomments код, необходимый для создания представления. Для получения кода нужного представления можно воспользоваться системной хранимой процедурой sp_helptext или напрямую обратиться к системной таб-
1014
Часть IV. Разработка и сопровождение баз данных
лице syscomments. Ранее уже был рассмотрен синтаксис и вызов хранимой процедуры s p j n e l p t e x t . Интерес представляет получение кода представления напрямую ИЗ таблицы syscomments". SELECT t e x t FROM syscomments where i d = OBJECT_ID('union__view')
Будет возвращен результат: text CREATE VIEW union_view AS SELECT title_id, title = CAST(title as char(30)) + CASE WHEN LEN(title)>30 THEN '...' ELSE M END, value = price*ytd_sales, type = 'psychology' FROM titles_psychology UNION SELECT title_id, title = CAST(title as char(30)) (1 row(s) affected)
Идентичный результат возвращает и хранимая процедура sp_heiptext.
Просмотр зависимостей Как уже ясно, между представлениями могут существовать определенные зависимости, т. е. одно представление может быть построено на основании нескольких других представлений и таблиц. С другой стороны, представление в свою очередь может использоваться для построения других представлений или применяться в хранимых процедурах. Непродуманное удаление представления может нарушить работу множества других представлений и хранимых процедур. Прежде чем удалить или изменить имя представления, следует проанализировать, к каким последствиям это может привести. То есть необходимо получить информацию о зависимостях между объектами базы данных. Конечно, можно просматривать код представлений и хранимых процедур, чтобы отследить все зависимости. Однако вряд ли кто-нибудь решит пойти по этому пути в системе, насчитывающей десятки хранимых процедур, таблиц и представлений. Чтобы облегчить получение информации о зависимостях между объектами базы данных, SQL Server 2000 при создании каждого объекта сохраняет в системной таблице sysdepends информацию о том, на какие объекты ссылается создаваемый объект, т. е. формируется информация о том, от каких объектов зависит конкретный объект базы данных. Для тех объектов, на которые ссылается создаваемый объект, добавляется информация о том, какие объекты созданы на его основе, т. е. формируется информация об объектах, зависимых от конкретного объекта базы данных. (
Замечание
^
В системной таблице sysdepends хранится информация не только о зависимостях между таблицами, представлениями и хранимыми процедурами, но вообще обо
Глава 22. Использование представлений
1015
всех объектах базы данных — индексах, ограничениях целостности, умолчаниях, правилах, типах данных и т. д. Для получения информации о зависимостях между объектами базы данных пользователь может обратиться к таблице sysdepends непосредственно или использовать для этого специальную системную хранимую процедуру s p d e p e n d s , специально предназначенную для этих целей. Непосредственное обращение к таблице sysdepends является довольно утомительным, т. к. в ней хранятся не имена объектов, а их идентификационные номера. Поэтому придется выполнять преобразование этих номеров в имена объектов. Более удобным является вызов хранимой процедуры s p d e p e n d s , имеющей синтаксис: sp_depends
[@objname =]
'object'
Для получения информации как о зависимых, так и о зависящих объектах достаточно указать имя интересующего объекта. Рассмотрим использование процедуры spdepends для получения информации о зависимости объектов базы данных от созданного в первом примере этой главы представления union_view: sp_depends
'union_view'
Будет получен следующий результат: In the current database, the specified object references the following: name type updated selected column dbo.titles dbo.titles dbo.titles dbo.titles dbo.titles dbo.titles dbo.titles dbo.titles
business business business business psychology psychology psychology psychology
user user user user user user user user
table table table table table table table -table
no no no no no no no no
no no no no no no no no
title_id title price ytd sales title_id title price ytd sales
In the current database, the specified object is referenced by the following: name type
Как видно, от представления u n i o n v i e w не зависит ни один объект и его можно удалять, не опасаясь нарушения функционирования других объектов базы данных.
Удаление представления В отношении представления, как и в отношении любых других объектов базы данных, у пользователя может возникнуть непреодолимое желание удалить его. И не важно, чем вызвано это желание.
1016
Часть IV. Разработка и сопровождение баз данных
Для удаления представления предназначена следующая команда Transact-SQL: DROP VIEW {view} [,...n]
С помощью этой команды за один раз можно удалить множество представлений, перечислив их имена через запятую. Помимо собственно имени представления можно указать и имя владельца. Однако задание имени базы данных не разрешается, поэтому с помощью команды DROP VIEW МОЖНО удалить представ-
ления только из текущей базы данных. При удалении представления устраняется только информация о его существовании из системных таблиц базы данных. Однако при этом сами данные никоим образом не изменяются. Право удалить представление имеет только владелец этого представления и члены фиксированной роли базы данных dbo. Если необходимо, чтобы удаление объекта выполнил иной пользователь, следует передать ему права владения объектом. Для этого нужно использовать системную хранимую процедуру sp_changeobjectowner, имеющую следующий синтаксис: sp_changeobjectowner [@objname =] 'object', [@newowner =] 'owner'
Глава 23
Индексы Современные базы данных часто содержат миллионы строк. По умолчанию данные хранятся в порядке их добавления в таблицу, т. е. неупорядоченно. Поиск нужной информации в таком наборе данных занимает много времени. Вообразите себе большую энциклопедию, содержащую десятки тысяч слов, не упорядоченных по алфавиту. Теперь представьте, что вам нужно найти в такой энциклопедии определенное слово. Нельзя даже приблизительно сказать, в каком месте энциклопедии может быть нужное слово. Поэтому придется начинать поиск с самой первой страницы и просматривать поочередно каждую страницу до тех пор, пока нужное слово не будет найдено. Поиск может закончиться как на второй, так и на предпоследней странице. Аналогичная ситуация и при работе со строками таблицы, не упорядоченными по какому-нибудь критерию. Чтобы найти нужные данные, сервер должен будет перебрать все строки таблицы. Такой перебор называется сканированием таблицы. Конечно, компьютер осуществляет перебор данных во много раз быстрее человека, но все же подобное сканирование может потребовать довольно много времени. К тому же, если такие сканирования выполняются часто и многими пользователями, то ситуация еще более усугубляется. Добавим сюда еще и необходимость установки блокировок — и полное сканирование данных вообще становится неприемлемым при создании корпоративных баз данных с миллионами строк и сотнями пользователей, работающих одновременно. Необходимо каким-то образом ускорить поиск нужных данных, сведя к минимуму затраты времени. Продолжая разговор об энциклопедии, можно сказать, что ускорение поиска нужного слова достигается за счет того, что данные упорядочены по алфавиту. Открыв энциклопедию в любом месте, всегда можно сказать, находится ли искомое слово на предыдущих страницах или на следующих. Перелистнув несколько десятков страниц в нужном направлении, можно опять посмотреть, находится ли нужное слово раньше или позже открытой страницы. Продолжая переворачивать страницы, можно за считанное количество таких операций найти нужное слово. Другим примером оптимизации поиска нужных данных является предметный указатель. Часто для облегчения поиска необходимой информации во многих книгах для читателей предусмотрены предметные указатели — вместо того чтобы перелистывать всю книгу, находим в них нужное слово или словосочетание, смотрим, на какой странице о нем идет речь, открываем ее и вы у цели. Аналогичный подход оптимизации поиска данных используется и в базах данных. Повышение производительности достигается за счет того, что данные представляются в упорядоченном виде. Механизмом, увеличивающим скорость
1018
Часть IV. Разработка и сопровождение баз данных
поиска данных и обеспечивающим минимальные затраты времени на анализ таблиц является индексирование. Индексы представляют собой набор ссылок на места физического размещения строк в структуре базы данных, упорядоченный по возрастанию или убыванию. При этом данные в самой таблице могут быть и неупорядоченными. Столбец, по которому была произведена индексация, называется индексированным. Замечание В SQL Server 2000 индекс может создаваться не только на основе значений одного столбца, но также и на комбинации значений двух и более столбцов. Индекс, созданный на основе более чем одного столбца, называется составным индексом (composite index). Важно понять, что индекс представляет собой не сами строки данных, а лишь значения индексированного столбца и указатели на соответствующие строки. В таблице может быть создано более десяти столбцов, но индексированными будут всего один или два столбца. Обычно индекс хранится отдельно от самих данных подобно тому, как предметный указатель в книге хранится отдельно от текста глав. Каждый элемент предметного указателя содержит ключевое слово и номер страницы, на которой расположена нужная информация. По такому же принципу устроен и индекс базы данных. Каждый элемент индекса хранит значение, соответствующее значению индексированного столбца конкретной строки, а также ссылку на исходную строку. Однако стоит обратить внимание, что индекс производит упорядочивание только конкретного столбца, а не всех данных таблицы. Практически все алгоритмы ускорения поиска данных работают только с упорядоченными данными. Индексы позволяют упорядочить данные, даже если физически данные сохранены без всякого порядка. В большинстве систем управления данными индексы применяются автоматически. SQL Server 2000 не является исключением. Если в ходе выполнения запроса происходит обращение к столбцу, для которого был определен индекс, то сервер автоматически производит поиск нужных значений непосредственно не в таблице, а в индексе. Когда в индексе находится искомое значение, сервер обращается к соответствующей строке таблицы и выбирает нужные данные уже из нее. Хотя на самом деле данные в столбце могут быть и неупорядочены, за счет того, что столбец будет иметь индекс, можно реализовать эффективные алгоритмы поиска информации. Это как раз и сделано в SQL Server 2000. Одним из наиболее эффективных методов поиска, реализованных и в SQL Server 2000, является метод "деления пополам", работающий с упорядоченным представлением данных, т. е. с индексами. При поиске конкретного значения в отсортированном по возрастанию наборе в простейшем случае берется значение из середины упорядоченной последовательности и сравнивается с искомым. Если искомое значение больше, то все значения левее выбранного отбрасываются. Тем самым промежуток поиска уменьшается вдвое. Искомое значение сравнивается со значением, расположенным в центре правой области данных.
Глава 23. Индексы
1019
Если значения опять не совпали, то интервал снова уменьшается вдвое и процесс продолжается. Когда значения, наконец, совпадут, поиск прекращается. Этот метод позволяет очень быстро находить требуемые значения и напоминает поиск нужного слова в энциклопедии, алгоритм которого был описан выше. Метод деления пополам можно оптимизировать, если при выборе начальной точки выбирать не просто середину интервала, а применять специальные алгоритмы, использующие статистические методы обработки информации и позволяющие с большей вероятностью предсказать положение нужных данных в последовательности. Если вам нужно найти телефон человека с фамилией Бардин, то вряд ли вы будете открывать телефонный справочник в середине, а тем более в конце.
Использование индексов Конечно же, использование индексов призвано повысить скорость поиска и выборки данных. Однако прежде чем принимать решение о создании какоголибо количества индексов и их типе, необходимо продумать их назначение и учесть интенсивность использования индексируемых данных. Иначе вместо увеличения производительности выполнения запросов можно добиться обратного эффекта. Дело в том, что при изменении данных (в т. ч. вставке и удалении) в таблице помимо обновления самих данных необходимо будет произвести и обновление индексов, на что может уйти столько же времени, сколько и на изменение данных. Для индексирования следует выбирать столбцы, наиболее часто используемые в запросах в качестве критериев поиска или сортировки. Соответственно не стоит индексировать столбцы, которые только выбираются и не применяются в качестве критериев поиска. Например, если у вас есть таблица, имеющая около десяти столбцов и только два из них, содержащих идентификационный номер и дату, используются в разделе WHERE В качестве критериев ограничения диапазона выбираемых строк, то индексировать стоит только эти два столбца. Индексирование других столбцов не может дать увеличения производительности, т. к. эти столбцы не используются для поиска данных. Также не следует индексировать слишком объемные столбцы, длина которых достигает нескольких десятков байт. В крайнем случае можно создать укороченный вариант такого столбца, выбрав из него до десяти первых символов, и индексировать его. Индексирования длинных столбцов следует избегать по той причине, что в индекс входит не только ссылка на строку, но и само содержимое столбца, поэтому, индексируя длинные столбцы, вы неэкономично расходуете пространство базы данных и снижаете производительность операций поиска. Снижение производительности происходит из-за того, что для сравнения длинных выражений требуется больше времени, чем для сравнения коротких. В SQL Server 2000 реализовано несколько типов индексов: •
некластерный индекс (Nonclustered Index);
1020
Часть IV. Разработка и сопровождение баз данных
•
кластерный индекс (Clustered Index);
•
уникальный индекс (Unique Index). Замечание При создании индекса пользователь указывает, будет он кластерным или некластерным. Независимо от этого, он может дополнительно сделать создаваемый индекс и уникальным.
Рассмотрим назначение и условия использования индексов каждого типа.
Некластерный индекс Некластерный индекс является, пожалуй, самым распространенным типом индексов, наиболее ярко отражающим суть индексирования. Некластерный индекс представляет собой самостоятельный объект базы данных, который хранится отдельно от самих данных, но, тем не менее, тесно связан с ними. Некластерный индекс можно сравнить с предметным указателем в книге, который находится отдельно от самой информации. Кроме того, в книге может иметься более одного предметного указателя. Например, в технической литературе может иметься указатель фамилий людей, упоминающихся в книге, другой указатель может содержать список технический терминов, третий — список программных продуктов и т. д. Аналогичная ситуация и с некластерными индексами. В одной таблице может быть определено множество таких индексов. Некластерный индекс представляет собой набор всех значений индексируемого столбца, упорядоченных по возрастанию или убывания, и указатель на исходную строку таблицы. Хотя в общем случае порядок сортировки не играет особой роли, все же в некоторых ситуациях использование конкретной сортировки может увеличить производительность. Одним из нововведений SQL Server 2000 является возможность явного определения порядка сортировки для индексируемых столбцов. В предыдущих версиях, в т. ч. и в SQL Server 7.0, такой возможности не было. Порядок сортировки может быть указан не только для некластерных индексов, но и для индексов любого другого типа. Данные в таблице могут находиться в неотсортированном состоянии в порядке их добавления в таблицу. Указатель на строку (RID, row locator или row identificator) представляет собой информацию о местоположении конкретной строки в базе данных и включает следующую информацию: • Идентификационный номер файла (ID file). Как известно, каждая база данных может включать множество файлов данных. Причем данные одной таблицы могут храниться в любом из этих файлов, принадлежащих одной группе файлов. Поэтому для поиска строки необходимо знать, в каком файле она находится. Все файлы базы данных имеют идентификационные номера, которые и используются для поиска строки. Эти номера можно увидеть в таблице s y s f i i e s , имеющейся в каждой базе данных. • Идентификационный номер страницы (ID page). Каждый из файлов данных, в свою очередь, состоит из множества 8-килобайтных страниц, на которых
Глава 23. Индексы
1021
собственно и хранятся данные. Каждая такая страница имеет идентификационный номер, уникальный в пределах файла. Этот номер и используется для идентификации строки. П Номер слота (slot number) строки на странице. Каждая страница используется для хранения строк только одной таблицы, для чего она разбивается на один или более блоков (слотов), каждый из которых используется для хранения отдельной строки. В принципе, слоты могут быть заполнены не все подряд, а произвольным образом. Пустые слоты могут заполняться при вставке новых данных. Поэтому в указателе приводится не номер строки на странице, а номер слота. При поиске данных с использованием некластерного индекса сервер находит нужные данные в индексированной последовательности, использует указатель для поиска исходной строки и считывает сами данные уже непосредственно из таблицы. Значительное увеличение производительности получается при поиске точных соответствий значений в таблице. Например, если вам необходимо выбрать строки таблицы, когда в указанном столбце находится конкретное значение, то использование некластерных индексов может существенно ускорить этот поиск. Некластерный индекс может быть создан более чем для одного столбца. В этом случае данные в индексе сначала упорядочиваются по первому указанному столбцу, затем по второму и т. д. Максимальное количество индексов на одну таблицу в SQL Server 2000 равно 249. Однако на практике не рекомендуется использовать более 4—5 индексов. Максимальное количество столбцов, которое может участвовать в построении индекса любого типа, составляет 16. При этом суммарная длина всех индексируемых значений не должна превышать 900 байтов. Отметим, что это ограничение относится непосредственно к индексируемым данным, а не к суммарным размерам столбцов. Например, в таблице могут существовать столбцы переменной длины (типы данных, имеющие приставку var), общий объем которых больше 900 байт. Однако если общий объем значений, хранящихся в каждой строке, не превышает 900 байт, то создание индекса будет возможно. Но при этом будет выдано предупреждающее сообщение. Также сервер будет отменять операции вставки и изменения данных, в результате которых суммарный объем значений в столбцах, на основе которых построен индекс, превысит 900 байт. Прежде чем создать некластерный индекс, следует провести анализ, индексирование каких столбцов может дать увеличение производительности. Некластерный индекс рекомендуется создавать в следующих ситуациях: О Столбец содержит большое количество уникальных значений, например, комбинацию имени и отчества. Не следует создавать индексы в столбцах, имеющих ограниченное количество значений, например 0 и 1, т. к. в этом случае придется выполнять дополнительные действия для поиска нужных значений. •
Запрос не должен возвращать большой набор данных, т. е. количество строк, выбираемых с помощью индексов, значительно меньше общего количества строк в таблице.
1022 •
Часть IV. Разработка и сопровождение баз данных
Столбец часто включается в запрос в качестве условия поиска в разделе WHERE или HAVING. Если же столбец используется только в разделе SELECT, TO его индексирование не приведет к повышению производительности.
• Длина столбцов не превышает 10 байт. Не рекомендуется создавать индекс для слишком длинных столбцов. Обычно индексируются столбцы с идентификационными номерами, в качестве которых выступают значения типа Данных i n t ИЛИ big i n t . •
Рекомендуется применять индексы для редко изменяемых столбцов. Если данные в проиндексированном столбце изменяются слишком часто, то сервер также автоматически изменяет и данные индекса. То есть нужно выполнять двойную работу.
Кластерный индекс Как было сказано, некластерный индекс представляет собой объект базы данных, хранящийся отдельно от самих данных и содержащий упорядоченный набор значений индексированного столбца. Однако некластерный индекс не влияет на физическое расположение данных в таблице. Напрашивается вопрос, а не будет ли эффективнее перестроить физический порядок строк в таблице, а не хранить отдельно упорядоченный набор ссылок. Безусловно, это увеличит производительность операций поиска данных, т. к. не нужно будет выполнять поиск нужных строк по указателю (row locator). Эту технологию и используют кластерные индексы. Мы сравнивали некластерный индекс с предметным указателем книги. Для кластерного индекса можно провести аналогию с энциклопедией, в которой данные находятся в упорядоченном состоянии и не нужно обращаться ни к каким дополнительным структурам для поиска нужной информации. При создании кластерного индекса происходит физическое перестроение порядка строк в таблице.
Замечание Еще одним отличием кластерного индекса от некластерного является то, что в каждой таблице может быть создан лишь один кластерный индекс. Это ограничение вытекает из природы кластерного индекса — нельзя физически отсортировать данные по двум критериям. Если в таблице предполагается создать всего один индекс, то лучше всего сделать его кластерным. Это может дать некоторый выигрыш в производительности по сравнению с использованием некластерного индекса. Особенно заметно увеличение производительности при работе с последовательностями данных, т. е. когда в запросах применяются операторы BETWEEN, >, >=, <= и <. Так как данные в кластерном индексе упорядочены, то после нахождения первого элемента, удовлетворяющего условию, можно выбирать все значения подряд, не прибегая к поиску. Выборка продолжается до тех пор, пока очередное значение не выйдет за границы условия поиска.
Глава 23. Индексы
1023
Замечание Некластерные индексы обычно создаются в качестве дополнительных индексов, тогда как в качестве основного используется кластерный индекс. Рекомендуется применять кластерный индекс к данным, которые наиболее часто выступают в качестве критериев поиска. При описании некластерного индекса мы говорили, что в этом индексе присутствует указатель на строку, с помощью которого можно найти нужные данные в таблице. Однако такой подход становится неэффективен при определении в таблице кластерного индекса. Дело в том, что при использовании кластерного индекса данные в таблице располагаются в упорядоченном состоянии и при выполнении изменений данных или вставке новых бывает необходимо изменить последовательность расположения строк в таблице. В частности, могут измениться номера страниц и номера слотов. Если в таблице с кластерным индексом определено множество некластерных индексов и данные часто изменяются, то сервер должен будет постоянно корректировать ссылки некластерных индексов для обеспечения целостности ссылок. Чтобы избежать подобных модификаций указателей при создании в таблице кластерного индекса сервер автоматически перестраивает указатели таким образом, чтобы они ссылались не на физический адрес строки в таблице, а на элемент кластерного индекса. Например, если кластерный индекс был создан для столбца, содержащего идентификационные номера, то в некластерном индексе в качестве указателя будет использоваться идентификационный номер, а не RID. Однако, как и при использовании RID, необходимо гарантировать, что каждая строка может быть уникально идентифицирована. Если значения в столбце с кластерным индексом уникальны, то проблем нет. Но кластерный индекс может быть создан и в столбце с неуникальными значениями. В этом случае сервер добавляет для каждой строки дополнительные значения, которые включаются в кластерный индекс, что обеспечивает уникальность каждого элемента кластерного индекса. Полученный элемент применяется в качестве указателя всеми некластерными индексами таблицы. Если кластерный индекс создается после того, как в таблице уже были созданы некластерные индексы, то сервер автоматически перестраивает элементы некластерных индексов для использования в качестве указателей элементов кластерного индекса. Если позже происходит удаление кластерного индекса, то выполняется обратная операция. Как и при работе с некластерным индексом, перед созданием кластерного индекса следует провести анализ использования данных. Кластерный индекс рекомендуется создавать в следующих ситуациях: •
Столбец содержит большое количество уникальных значений, например, комбинацию имени и отчества. Не следует создавать индексы в столбцах, имеющих ограниченное количество значений, например 0 и I.
•
Запрос возвращает большой набор данных. Если в запросе присутствуют операторы BETWEEN, >, >=, <= или <, то кластерный индекс может заметно увеличить производительность, даже по сравнению в некластерным индексом.
1024
Часть IV. Разработка и сопровождение баз данных
П Столбец часто применяется при группировке (раздел GROUP BY) ИЛИ ДЛЯ слияния (раздел JOIN), особенно в качестве внешнего ключа (FOREIGN KEY). Для выполнения этих операций сервер всегда выполняет сортировку данных. Когда же в таблице определен кластерный индекс, то производить такую сортировку не нужно. •
Когда столбец используется системами оперативной обработки транзакций (OLTP). Эти системы требуют максимально быстрого доступа к данным и обычно активно работают с ключами. Поэтому рекомендуется создавать кластерный индекс для первичных и внешних ключей.
Уникальный индекс Как не трудно догадаться по названию, уникальный индекс (Unique Index) предназначен для обеспечения уникальности значений соответствующего индекса. Прежде чем создать уникальный индекс, необходимо убедиться, что индексируемый столбец не содержит повторяющихся значений. В противном случае при попытке создания индекса сервер выдаст сообщение об ошибке. После того, как уникальный индекс создан, сервер не разрешит изменение данных таблицы, если эти изменения приводят к нарушению уникальности данных. Это касается и операций добавления данных. Уникальный индекс не существует как самостоятельный физический тип индекса. Он является всего-навсего своеобразной надстройкой над кластерными и некластерными индексами. Можно сказать, что уникальный индекс представляет собой ограничения целостности UNIQUE, примененное к данным индекса. То есть нельзя создать просто уникальный индекс — этот индекс всегда будет либо кластерным, либо некластерным. Если уникальный индекс создается более чем для одного столбца, то уникальность будет обеспечиваться для комбинации значений всех столбцов, входящих в индекс. При этом в каждом отдельном столбце могут быть повторяющиеся значения. Например, если в таблице имеются столбцы с фамилией, именем и отчеством, то можно создать уникальный индекс, который будет гарантировать, что в таблице нет двух людей с одинаковым полным именем. Использование уникального индекса оправдано для данных, единственность которых обеспечивается самой их природой. Примером таких данных может служить номер паспорта, неповторимость которого обеспечивается государственными структурами. Однако если уникальность значений применяется как средство поддержания целостности данных, то лучше всего будет использовать не уникальный индекс, а ограничения целостности Unique или Primary Key. Первое из них специально предназначено для обеспечения уникальности данных в одном или более столбцов. При существовании первичного ключа (Primary Key) уникальность данных является одной из его характеристик. Оба перечисленных ограничения целостности автоматически создают уникальный индекс. Трудно провести грань между использованием ограничений целостности и уникальным индексом. В большинстве случаев рекомендуется применять именно ограничение целостности, а не просто уникальный индекс.
Глава 23. Индексы
1025
Фактор заполнения Ранее уже говорилось, что строки таблиц в конечном счете располагаются в файлах базы данных на страницах (page). Такие страницы, содержащие строки таблиц, называются страницами данных (data page). Но и данные индексов также располагаются на аналогичных 8-килобайтовых страницах. Однако страницы, используемые для хранения данных индексов, называются индексными страницами (index page).
Замечашкэ Подробно различные типы страниц, а также физическая архитектура базы данных, были рассмотрены в главе 18.
Каждая индексная страница может содержать данные множества элементов индекса. Вся страница разбивается на отдельные слоты (slot), в которых собственно и располагается информация. Каждый такой слот может быть либо пустым, либо содержать один элемент индекса. Не всегда слоты страницы заполнены последовательно друг за другом. Вполне возможно, что на странице будут чередоваться пустые и заполненные слоты. Каждая индексная страница предназначена для хранения данных только одного индекса. Страницы, содержащие данные одного и того же индекса, связаны друг с другом в виде списка. Первая страница ссылается на вторую страницу, вторая на третью, третья на четвертую и т. д. Такой подход к хранению данных можно сравнить с хранением файлов в файловой системе, когда в таблице размещения файлов (FAT, File Allocation Table) каждый кластер файла (точнее ячейка FAT) содержит указатель на следующий кластер. Слоты на странице также располагаются друг за другом. В итоге получается упорядоченная последовательность элементов индекса. Теперь предположим, что необходимо добавить значительное количество строк в таблицу. При этом также требуется соответствующим образом обновить данные индекса. На индексные страницы должны быть вставлены новые элементы. Причем новые элементы должны быть размещены таким образом, чтобы значения индекса были упорядочены. То есть каждый новый элемент индекса должен быть вставлен строго между двумя другими конкретными элементами. Если на странице имеются пустые слоты, то такая вставка не представляет особой трудности — достаточно "раздвинуть" строки и вставить в нужное место новый элемент. Однако если страница заполнена целиком, но элемент должен быть вставлен именно на этой странице, то необходимо выполнить расщепление (split) страницы. В процессе расщепления страницы происходит выделение для индекса новой страницы и перенос на нее части элементов индекса, расположенных на расщепляемой странице. При этом соответствующим образом исправляются ссылки страниц друг на друга, т. е. в цепочку вставляется новое звено. В итоге вместо одной, полностью заполненной страницы получается две страницы, заполненные наполовину. Теперь новый элемент можно добавить на нужную страницу.
1026
Часть IV. Разработка и сопровождение баз данных
Операции расщепления страниц занимают довольно много времени по сравнению с самой вставкой элементов индекса. При частом изменении в индексированных столбцах сервер должен будет соответствующим образом перестраивать индекс, т. е. удалять элементы индекса с одних страниц и вставлять их на другие страницы. При этом часто приходится выполнять расщепление страниц, что отрицательно сказывается на производительности. Можно снизить количество расщеплений страниц, если зарезервировать на каждой странице достаточно свободных слотов. SQL Server 2000 позволяет контролировать количество пустых слотов с помощью фактора заполнения страницы. Фактор заполнения (fill factor) — это параметр, в процентах определяющий плотность записи данных на странице. Его значение определяет, какая часть индексной страницы будет заполнена. Чем более высокий фактор заполнения был задан при построении индекса, тем меньше свободного места останется на странице, и тем более компактно будет размещена информация об индексе. Фактор заполнения указывается при создании индекса. Например, если размер элемента индекса таков, что на одной индексной странице может быть создано 240 слотов, и при создании индекса был установлен фактор заполнения 70%, то на странице будет заполнено 168 слотов. Оставшиеся 72 слота будут заполняться по мере вставки и изменений данных в таблице. Чем меньший фактор заполнения используется, тем меньше расщеплений страниц будет выполняться. Однако платой за это являются более высокие требования к объему памяти, необходимой для хранения данных индекса. Соответственно, при использовании высокого фактора заполнения память расходуется максимально эффективно, однако операции вставки и изменения данных в целом станут производиться медленнее. При выборе конкретного фактора заполнения следует оценить частоту изменений и добавлений данных в таблицу, а также вид этих изменений. Например, если необходимо создать индекс в системе поддержки принятия решений (DSS, Decision Support System), то оправдано применение фактора заполнения, равного 100%. Дело в том, что данные в системах DSS практически не изменяются, а используются только для чтения. Если же индекс создается в системе оперативной обработки транзакций (OLTP, Online Transaction Processing), то лучше использовать как можно меньший фактор заполнения, т. к. системы OLTP характеризуются большим количеством изменений данных. Однако если индекс создается для столбца первичного ключа, в качестве которого используется столбец-счетчик (IDENTITY), TO МОЖНО установить высокий фактор заполнения, даже если предполагается большое количество добавлений или удалений строк в таблице. Дело в том, что значения в столбце-счетчике монотонно возрастают. Это значит, что новые строки будут добавляться в конец индекса и надобности в расщеплении страниц не будет. Необходимо отдельно обратить внимание, что фактор заполнения определяется в момент создания индекса. В дальнейшем степень заполнения страниц может претерпеть существенные изменения — некоторые страницы будут переполнены
Глава 23. Индексы
/027
и их потребуется расщепить, тогда как степень заполнения других страниц может уменьшиться. В SQL Server 2000 нет встроенных средств поддержания степени заполнения на постоянном уровне, да это и не нужно. Если бы сервер постоянно пытался поддержать фиксированный фактор заполнения, то в целом это потребовало еще больших затрат, чем выполнение расщеплений страниц. Хотя со временем степень заполнения страниц может существенно меняться, SQL Server 2000 позволяет выполнять перестроение индексов (rebuild index), в ходе которого для каждой страницы устанавливается указанный фактор заполнения. В частности, такая реорганизация может производиться периодически вручную или как часть плана сопровождения базы данных (Database Maintenance Plan). Например, можно выполнять реорганизацию индексов каждую ночь, когда активность пользователей минимальна.
Индексирование представлений Одним из важных нововведений в SQL Server 2000 является возможность индексирования представлений и вычисляемых столбцов. Если индексирование последних осуществляется легко — достаточно просто выбрать нужные столбцы при создании индекса, то индексирование представлений имеет некоторые особенности. Данный раздел и будет посвящен рассмотрению индексирования представлений.
Замечание Индексирование представлений поддерживается только редакциями Enterprise Edition и Developer Edition. Подробно создание представлений было рассмотрено в предыдущей главе.
Первый индекс, создаваемый для представления, всегда должен быть кластерным. Только после создания кластерного индекса станет возможным организация дополнительных некластерных индексов. Когда для представления создается кластерный индекс, сервер сохраняет в базе данных информацию, доступную через представление на момент создания индекса. При этом сохраняются не только данные столбцов, входящих в кластерный индекс, но и все остальные данные представления. Эти данные затем и используются для построения некластерных индексов. Таким образом, представление становится своего рода таблицей, содержащей данные. Впоследствии сервер автоматически отслеживает изменения, выполняющиеся в исходных таблицах, и производит изменение кластерного индекса.
(
Замечание
Индексируемое представление не может включать столбцы с типом данных t e x t , n t e x t и image, даже если они и не применяются для создания индекса.
Прежде чем приступить к созданию для представления кластерного индекса, следует проверить соблюдение для представления некоторых требований, обязательных для создания индекса. Рассмотрим эти требования:
1028
Часть IV. Разработка и сопровождение баз данных
•
ОПЦИИ ANSI_NULLS И QUOTED_IDENTIFIER ДОЛЖНЫ быТЬ уСТЭНОВЛеНЫ В ON.
•
Таблицы, на которые ссылается индексируемое представление, должны быть созданы с опцией, установленной в ON.
•
Индексируемое представление должно ссылаться только на таблицы. То есть ссылки на другие представления не разрешаются. Более того, все таблицы, на основе которых строится представление, должны принадлежать тому же владельцу и находиться в той же базе данных, что и представление.
П Представление, а также все используемые в представлении пользовательские функции, должны быть созданы с параметром SCHEMABINDING. О Для ссылки на таблицы или пользовательские функции должны применяться двухчастные имена, включающие не только собственно имя объекта, но и имя владельца. •
Если в представлении указываются пользовательские функции, то они всегда должны возвращать один и тот же результат при одних и тех же входных параметрах. Таким образом, не разрешается задание функций SUSER_SNAME (), HOST_NAME () И Т. Д.
Помимо указанных требований, также существует ряд требований к запросу SELECT, на основе которого строится представление: •
Не разрешается применять ссылки на все столбцы таблицы — символ *. Вместо этого необходимо явно указать имя каждого из столбцов.
•
Любой столбец должен указываться лишь однажды. Однако допускается многократное использование столбца в выражениях, на основе которых строятся другие столбцы представления.
•
Не допускается ссылаться в разделе FROM на таблицы, построенные с помощью подзапроса, а также на функции работы с наборами строк (rowset function).
П Не разрешается использовать ключевые слова ТОР И DISTINCT. •
•
Нельзя применять разделы ORDER BY, COMPUTE И COMPUTE BY.
Нельзя указывать функции для работы с полнотекстовыми каталогами — CONTAINS И FREETEXT.
•
Не разрешается использовать функции агрегирования AVG, MAX, MIN, STDEV, STDEVP, VAR И VARP.
•
При использовании раздела GROUP BY В разделе SELECT должна быть указана функция COUNT_BIG (*), но при этом не разрешается использование ключевых СЛОВ CUBE, ROLLUP И HAVING. Замечание Если в запросе S E L E C T , на основе которого строится представление, существует раздел GROUP BY, TO уникальный кластерный индекс может ссылаться только на
столбцы, указанные в разделе GROUP BY. ССЫЛКИ на столбцы представления, яв-
ляющиеся результатом выполнения функций агрегирования, не разрешаются.
Глава 23. Индексы
1029
После того, как было создано представление в соответствии со всеми указанными требованиями, можно приступать к созданию кластерного индекса, а впоследствии и некластерных индексов. Однако прежде чем приступить к выполнению команды CREATE INDEX, следует установить в OFF параметр NUMERIC_ ROUNDABORT, и указать ON для следующих параметров: •
ANSI_NULLS
П
ANSI_PADDING
П
ANSI_WARNINGS
•
ARITHABORT
•
CONCAT_NULL_YIELDS_NULL
•
QUOTED IDENTIFIERS
Замечание Выполнять индексирование представления может только пользователь, являющийся владельцем представления. На этом рассмотрение особенностей индексирования представлений можно закончить. На основе индексированного представления можно создавать другие представления. Однако эти представления не могут быть индексированы. При удалении индексированного представления автоматически удаляются все индексы, определенные для этого представления. Если же для представления удаляется кластерный индекс, то автоматически удалятся и все некластерные индексы, т. к. при удалении кластерного индекса будет изъята информация о содержимом представления. Некластерные же индексы могут удаляться по отдельности.
Управление индексами SQL Server 2000 предлагает различные механизмы управления индексами, рассчитанные на пользователей с разным уровнем подготовки. Если пользователь не имеет опыта работы с индексами, он может прибегнуть к помощи специальных мастеров. Например, создание индекса можно легко выполнить с помощью мастера Create Index Wizard, вводя информацию в пошаговом режиме в окнах мастера. Для более опытных пользователей предлагается воспользоваться средствами Enterprise Manager. Тем не менее, этот же метод могут использовать и опытные пользователи, желающие быстро и наглядно выполнить необходимые действия. Однако оба упомянутых метода на самом деле всего лишь предоставляют пользователю удобный и понятный графический интерфейс. Но, в конце концов, оба они обращаются к средствам Transact-SQL, с помощью которых собственно и выполняется управление индексами. Но ничто не мешает пользователям обратиться к средствам Transact-SQL напрямую, не прибегая к использованию графических интерфейсов. Более того, в некоторых случаях этого просто не избежать.
1030
Часть IV. Разработка и сопровождение баз данных
В следующих разделах будет обсуждено создание индексов всеми тремя способами, а также рассмотрено управление существующими индексами, их перестроение и удаление.
Создание индексов После того, как был проведен анализ интенсивности использования данных и сделан вывод о том, какие столбцы должны быть проиндексированы, можно приступать к созданию индексов. Создание индекса может быть выполнено непосредственно или как часть другой, более сложной операции. Рассмотрим ситуации, когда происходит создание индекса: П При определении в таблице первичного ключа (ограничений целостности Primary Key). Как уже было сказано, в этом случае сервер автоматически создает уникальный индекс. Этот индекс будет кластерным (CLUSTERED), если в таблице уже не существует кластерного индекса. Однако пользователь может явно указать, что для первичного ключа должен быть создан некластерный индекс (NONCLUSTERED).
• Уникальный индекс также автоматически создается при определении в таблице ограничений целостности UNIQUE. •
Индекс любого типа может быть создан в процессе создания таблицы. В команде CREATE TABLE предусмотрены средства, позволяющие выполнить организацию индекса как часть процесса создания таблицы. При этом разрешается создание индекса как для одного, так и для нескольких столбцов.
П Индекс может быть создан уже после создания таблицы с помощью команды CREATE INDEX, специально предназначенной для этого.
Мы не будем рассматривать три первых ситуации, в которых происходит создание индекса. Определение индекса как части процесса создания таблицы было рассмотрено в главе 21. Создание же индексов при определении ограничений целостности Primary Key и Unique выполняется сервером автоматически и не представляет интереса.
Использование Transact-SQL Начнем рассмотрение методов создания индексов с Transact-SQL. В этом случае необходимо использовать команду CREATE INDEX, имеющую синтаксис: CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name ON {table I view} (column [ASC | DESC] [ ,...n ]) [WITH [ ,...n]] [ON filegroup]
Рассмотрим назначение и применение параметров команды: •
UNIQUE
При указании этого параметра будет создан уникальный индекс, т. е. в индексируемом столбце (или столбцах) будет запрещено появление повторяю-
Глава 23. Индексы
1031
щихся значений. Прежде чем создать индекс, сервер выполняет проверку на уникальность значений. Если индексируемый столбец содержит повторяющиеся значения, то попытка создания индекса закончится неудачей. Сервер не предпринимает никаких действий по устранению повторяющихся значений, поэтому прежде чем создать уникальный индекс, пользователь обязан позаботиться об отсутствии повторов, изменив или удалив соответствующие строки. Все сказанное остается в силе даже при использовании параметра IGNORE_DUP_KEY, описание которого будет рассмотрено далее. Также рекомендуется запретить для индексируемого столбца хранение значений NULL. Дело в том, что значения NULL воспринимаются уникальным индексом как обычные значения, т. е. в индексированном столбце нельзя будет иметь двух строк со значением. Если при вставке строки пользователь не станет указывать явно значение для столбца, то сервер будет добавлять значение NULL, изза чего операция вставки будет отклонена, если в столбце уже имеется значение NULL. Аналогичная ситуация и со значением по умолчанию. После создания уникального индекса сервер будет отклонять все команды INSERT И UPDATE, которые приводят к нарушению уникальности значений в индексированном столбце. •
CLUSTERED
При использовании этого параметра создаваемый индекс будет кластерным, т. е. порядок строк в таблице будет определяться создаваемым индексом. Если при создании кластерного индекса указывается параметр ON filegroup, то таблица окажется перенесенной в указанную группу. Для хранения информации кластерного индекса необходимо пространство, равное примерно 20% от объема таблицы. Если параметр CLUSTERED не указывается, то будет создан некластерный индекс. Поскольку при создании кластерного индекса происходит изменение некластерных индексов, рекомендуется создавать кластерный индекс самым первым в таблице. В каждой таблице может быть создан только один кластерный индекс. •
NONCLUSTERED
Этот параметр предназначен для создания некластерных индексов. В каждой таблице может быть создано до 249 некластерных индексов. Некластерный индекс также создается, если явно не указан тип создаваемого индекса (кластерный или некластерный). d
index_name
С помощью этого параметра задается имя, которое будет присвоено индексу. Это имя в дальнейшем станет использоваться для ссылок на созданный индекс. При выборе имени следует следовать стандартным правилам именования объектов базы данных. При этом разрешается использовать ограничители (двойные кавычки или квадратные скобки), если в имени существуют недопустимые символы (например, пробелы). Имя индекса должно быть уникальным в пределах таблицы, но разные таблицы могут иметь индексы с одинаковыми именами. Максимальная длина имени индекса ограничена 128 символами.
1032
Часть IV. Разработка и сопровождение баз данных
П table
| view
Этот параметр определяет имя таблицы или представления, для которого будет создаваться индекс. Дополнительно можно указать имя владельца и имя базы данных, в которой находится нужный объект. •
(column
[ A S C I DESC]
[,...n])
Этот параметр служит для задания имен столбцов таблицы, для которых будет создаваться индекс. Если указывается более одного столбца, то будет создан составной индекс (composite index), значение которого получается в результате объединения значений входящих в его состав столбцов. Индекс не МОЖет ВКЛЮЧать столбцы С ТИПОМ данных t e x t , ntext, image И b i t . Отметим, что индекс может быть создан на основе вычисляемых (computed) столбцов, что не было возможно в предыдущих версиях SQL Server. Как уже было сказано, общее количество столбцов в составном индексе ограничено 16, причем общая длина значений всех столбцов не должна превышать 900 байтов. С помощью ключевых слов ASC И DESC МОЖНО предписать серверу сортировать данные столбца соответственно по возрастанию и убыванию. Отметим, что эта возможность является нововведением SQL Server 2000. Замечание При создании составных индексов следует сначала указывать имена столбцов, в которых имеется минимальное количество повторов. Это позволит быстрее находить нужные данные. Например, если имеется три столбца, в которых соответственно существует 70%, 20% и 50% одинаковых строк, то следует сначала указать имя второго столбца, затем третьего и, наконец, имя первого столбца. WITH [,...n] Посредством этого параметра можно управлять некоторыми расширенными свойствами индексов. Конструкция имеет следующий синтаксис: :: = { PAD_INDEX | FILLFACTOR • fillfactor | IGNORE_DUP_KEY | DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB }
Рассмотрим назначение приведенных параметров: •
PAD_INDEX
При указании этого параметра при создании индекса будет резервироваться место во внутренних структурах индекса для добавления новых страниц. Обычно этот параметр применяется только совместно с параметром FILLFACTOR, т. к. использует значение фактора заполнения. Если фактор заполнения не указан, то поведение сервера при задании параметра PAD_INDEX будет таким же, как если бы этот параметр не был указан вовсе. •
FILLFACTOR = f i l l f a c t o r
Этот параметр определяет фактор заполнения индексных страниц, т. е. сколько процентов пространства каждой страницы будет заполнено сразу
Глава 23. Индексы
1033
же при создании индекса. Остальное пространство резервируется для последующих операций изменения и вставки данных. Если в результате вычисления количества слотов страницы, которые должны быть заполнены, получается дробное значение, то сервер округляет количество строк в большую сторону. Пользователь может указывать значение параметра f i l i f a c t o r в интервале от 1 до 100. Значение 100 применяется в системах, где не выполняются команды UPDATE И INSERT. ЕСЛИ параметр FILLFACTOR
не указывается, то при создании индекса будет использоваться значение фактора заполнения по умолчанию, определенное на уровне сервера и распространяющееся на все базы данных. Изменить это значение можно с ПОМОЩЬЮ Х р а н и м о й п р о ц е д у р ы
sp_configure
С ОПЦИеЙ
'fill
factor'.
Сразу же после установки SQL Server 2000 значение по умолчанию равно 0, что соответствует 100% заполнению страниц с резервированием достаточного количества страниц для последующих операций расщепления. Следует осторожно применять фактор заполнения при создании кластерного индекса, т. к. в этом случае будут перераспределены сами данные. Если длина строки значительна, и используется низкий фактор заполнения, то для хранения данных таблицы может потребоваться значительно больше места, чем реальный объем данных. •
IGNORE_DUP_KEY
Этот параметр предназначен только для уникальных индексов, т. е. совместно с параметром UNIQUE, И определяет поведение сервера при выполнении операций, приводящих к появлению в индексе повторяющихся значений. Если уникальный индекс был создан с параметром IGNORE_DUP_KEY, то при попытке пользователя вставить (или изменить) в таблицу большое количество строк сервер будет отменять добавление только тех строк, которые нарушают уникальность значений. При этом будет выдано соответствующее сообщение об ошибке и список всех повторяющихся строк, но транзакция откатана не будет. После этого пользователь обязан найти повторяющиеся строки и внести в них необходимые изменения, после чего эти строки могут быть добавлены в таблицу. Когда же параметр IGNOREDUPKEY не указывается, то сервер будет откатывать вставку всех данных, даже если из тысячи строк всего одна нарушает уникальность данных. Действие параметра IGNORE_DUP_KEY начинается после создания индекса. На процесс предварительной проверки уникальности данных перед созданием уникального индекса этот параметр не оказывает никакого влияния. •
DROP_EXISTING
При указании этого параметра сервер будет автоматически выполнять удаление из таблицы индекса, имеющего то же имя, что и создаваемый. Параметр может использоваться как для кластерных, так и некластерных индексов. Однако наибольшую выгоду от применения этого параметра можно получить при повторном создании кластерного индекса в таблице с множеством некластерных индексов. Если выполнить удаление индекса обычным способом, т. е. с помощью команды DROP INDEX, TO сервер дол-
1034
Часть IV. Разработка и сопровождение баз данных жен будет перестроить все некластерные индексы для использования в качестве указателей физического адреса строки. При повторном создании в таблице кластерного индекса необходимо будет произвести обратную операцию — перестроить некластерные индексы на использование в качестве указателей элементов кластерного индекса. Подобное перестроение некластерных индексов может потребовать довольно много времени. Если же повторное создание кластерного индекса в таблице выполняется с помощью параметра DROPEXI STING, TO сервер лишь обновит указатели некластерных индексов.
Замечание В SQL Server 2000 нет встроенной команды изменения индекса, поэтому рекомендуется применять параметр DROP_EXISTING ДЛЯ более быстрого удаления и повторного создания индекса. •
STATISTICS_NORECOMPUTE
Наличие этого параметра запрещает автоматическое обновление устаревшей статистики, что повышает производительность операций вставки и изменения строк. Однако оптимизатор запросов в этом случае не сможет создать оптимальный план исполнения запроса. Позже можно разрешить автоматическое обновление статистики, выполнив команду UPDATE STATISTICS без параметра NORECOMPUTE. •
SORT_IN_TEMPDB
При указании этого параметра сервер будет использовать при построении индекса базу данных Tempdb, располагая в ней промежуточные результаты сортировки. Эта возможность оказывается полезной, когда файлы базы данных Tempdb и базы данных, в которой создается индекс, располагаются на разных физических дисках. Таким образом, можно добиться уменьшения времени, необходимого для создания индекса. Параметр SORTINTEMPDB появился только в SQL Server 2000. СП ON f i l e g r o u p Этот, параметр разрешает создавать индекс в указанной группе файлов, что позволяет отделять сами данные от данных индексов. Как уже было сказано, использование этой опции при создании кластерного индекса приведет к переносу самих данных в указанную группу файлов. В качестве примера приведем код, позволяющий организовать для таблицы Categories базы данных Northwind кластерный индекс PK_Categories на ОСНОве столбца categoryiD. Создаваемый индекс будет расположен в первичной группе файлов. Задание же параметра DROPEXI STING позволяет гарантировать успешность выполнения команды даже в случае существования для таблицы индекса с указанным именем: USE Northwind GO CREATE UNIQUE CLUSTERED
Глава 23. Индексы
1035
INDEX [PK_Categories] ON [dbo].[Categories] WITH DROP_EXISTING ON [PRIMARY]
([CategorylD])
Использование Enterprise Manager В предыдущем разделе мы рассмотрели создание индексов средствами TransactSQL. В этом же разделе внимание будет уделено описанию создания индексов с помощью Enterprise Manager. Этот метод сочетает простоту и наглядность создания индексов с достаточно большой функциональностью. Для управления индексами таблицы или представления используется окно Manage Indexes (рис. 23.1), открыть которое можно с помощью контекстного меню таблицы или представления, выбрав в нем команду All Tasks, а затем команду Manage Indexes. Manage Indexes - 5TORAGE\TREl Select the database and table for which you want to create, edit, or delete indexes. Database: lable/View:
Northwind |ffll[dbo].[Customers] I Include system objects
£xisting indexes: Index PK_Customers City Company Name PostalCode Region
New..
Clustered Yes No No No No
Edit..
Delete
Cou l mns Customer! D City CompanyName PostalCode Region
Close
Help
Рис. 2 3 . 1 . Окно Manage Indexes
Рассмотрим элементы управления, имеющиеся в окне Manage Indexes: • Database. С помощью этого раскрывающегося списка можно выбрать имя одной из баз данных, имеющихся на текущем сервере. Соответственно, в списке Table/view будет выведен набор таблиц и представлений, имеющихся в выбранной базе данных. • Table/view. Этот раскрывающийся список содержит перечень таблиц и представлений, имеющихся в базе данных. Чтобы работать с индексами той или иной таблицы (представления), необходимо выбрать ее имя в списке.
1036
Часть IV. Разработка и сопровождение баз данных
П Include system objects. Установка этого флажка предписывает выводить в списке Table/view имена не только пользовательских, но и системных объектов. П Existing indexes. В этой таблице перечислены все индексы, созданные для таблицы или представления, выбранного в списке Table/view. Рассмотрим, какие же колонки имеет эта таблица: • Index — имя индекса; • Clustered — если отображено значение Yes, то соответствующий индекс кластерный; •
Columns — список столбцов, на основе которых построен индекс.
• New. Эта кнопка служит для создания нового индекса. • Edit. Нажав эту кнопку, можно открыть окно редактирования существующего индекса. П Delete. С помощью этой кнопки можно удалить индекс, выбранный в таблице Existing indexes. Мы рассмотрели назначение элементов управления, имеющихся в окне Manage Indexes. Теперь же рассмотрим собственно создание индекса. Прежде всего, необходимо с помощью списков Database и Table/view выбрать таблицу или представление, для которого надо создать новый индекс. После этого следует нажать кнопку New. В ответ откроется окно Create New Index (рис. 23.2), с помощью которого и создается индекс. Create New Index - STORAGE\TRELON Create a new index on table [dbo]. [Customers] in database [NorthwindJ. Index name:
IMylndex
Column i 1 CustomerlD
Sort Ord...
[j/l
CompanyName
Г]
H ContactName
Data Type i Length NullableiPre... i Scale nchar
5
nvarchar
40
No
nvarchar
30
Yes
[П
ContactTitle
nvarchar
30
Yes
•
Address
nvarchar
60
Yes
•
City
nvarchar
15
Yes
•
Region
nvarchar
15
Yes 1
Up
Change column order: Index options Г" Queered H-rde:-
F
R
Г" Dtop^xisiii
Unique values W Ignore duplicate values
*
No
^
Down
Pad index
P" Fill factor:
Г" Do not recompute statistics (not recommended)
PRIMARY Edit SQL.
OK
Cancel
Help
Рис. 23.2. Окно Create New Index
Глава 23. Индексы
1037
В верхней части окна Create New Index размещено поле Index name, в котором необходимо указать имя создаваемого индекса. Напомним, что имя индекса должно быть уникально в пределах таблицы. При выборе имени следует придерживаться общих правил именования объектов базы данных. В центральной части окна существует таблица, определяющая набор столбцов, на основе которых будет построен индекс. В колонке Column этой таблицы перечислены все столбцы, имеющиеся в выбранной для индексирования таблице или представлении. Установка флажка слева от имени столбца предписывает включить его в индекс. С помощью колонки Sort Order можно определить порядок сортировки, который будет применяться для соответствующего столбца. Установка флажка в этой колонке предписывает использовать для столбца сортировку по убыванию, тогда как при сброшенном флажке назначается сортировка по возрастанию. В остальных же колонках выводится информация о соответствующем столбце: типе данных (Data Type), количестве используемых байт или символов (Length), возможность хранения значений NULL (Nullable), максимально допустимое количество цифр (Precision), а также количество цифр после запятой (Scale). С помощью кнопок Up и Down можно изменять порядок включения значений столбцов в индекс. Этот момент достаточно важен, т. к. порядок перечисления столбцов может весьма заметно сказаться на производительности индекса. Рекомендуется наиболее часто используемые столбцы, в то же время подверженные минимальным изменениям, размещать первыми. Рассмотрим набор флажков, имеющихся в группе Index options: • Clustered index. При установке флажка создаваемый индекс будет кластерным. Флажок доступен только в том случае, если в таблице (или представлении) ранее еще не было создано кластерного индекса. • Unique values. Установка флажка предписывает создать уникальный индекс. При этом станет доступным следующий флажок: •
Ignore duplicate values — в случае установки этого флажка при попытке пользователя вставить (или изменить) большое количество строк сервер будет отменять вставку только тех строк, которые нарушают уникальность значений, а не всего блока данных.
• Pad index. При выборе флажка при создании индекса будет резервироваться место во внутренних структурах индекса для добавления новых страниц. П Drop existing. Когда этот флажок отмечен, сервер будет автоматически выполнять удаление из таблицы индекса, имеющего то же имя, что и создаваемый. О Fill factor. В случае установки флажка можно будет явно указать фактор заполнения, который будет использоваться для страниц создаваемого индекса. G Do not recompute statistics (not recommended). Установив этот флажок, можно запретить автоматическое обновление статистики для создаваемого индекса. О File group. Если необходимо расположить данные индекса в конкретной группе файлов, то следует установить рассматриваемый флажок и выбрать с
1038
Часть IV. Разработка и сопровождение баз данных
помощью раскрывающегося списка имя нужной группы файлов. Если же флажок сброшен, то данные индекса будут располагаться в той же группе файлов, что и данные таблицы. Мы рассмотрели элементы управления, имеющие непосредственно отношение к созданию индекса. В нижней же части окна имеется кнопка Edit SQL, с помощью которой можно открыть окно Edit Transact-SQL Script (рис. 23.3). С помощью этого окна можно просмотреть код команды CREATE INDEX, которая позволяет создавать индекс. Эта команда генерируется на основе сведений, введенных пользователем в окне Create New Index. Помимо просмотра кода команды, можно внести и изменения в него. Для проверки правильности синтаксиса команды следует нажать кнопку Parse. Нажав же кнопку Execute, можно выполнить приведенный код, создав тем самым индекс. Edit Transact-SQL Script - STORAGFЛШОН
2<J
CREATE UNIQUE I N D E X [Mylndex] ON [dbo] [ C u s t o m e r s ] ([CompanyName], [ContactName]: WITH PADJNDEX .FILLFACTOR-80 ,IGNORE_DUP_KEY )N [ P R I M A R Y ]
li Parse
JExecute
Cancel
Help
Рис. 23.3. Окно Edit Transact-SQL Script
В общем же случае создание индекса производится после нажатия кнопки ОК в окне Create New Index. Редактирование же свойств существующего индекса осуществляется с помощью окна Edit Existing Index, открыть которое можно с помощью кнопки Edit в окне Manage Indexes, предварительно выбрав нужный индекс. Работа с окном Edit Existing Index практически ничем не отличается от работы с окном Create New Index и поэтому рассматриваться не будет.
Использование мастера Create Index Wizard Последний метод создания индекса, который необходимо рассмотреть — это использование мастера Create Index Wizard. Запустить данный мастер можно с
Глава 23. Индексы
1039
помощью окна Select Wizard, открыть которое можно с помощью кнопки Run a Wizard, расположенной в панели инструментов Enterprise Manager. Первое окно мастера не содержит никаких элементов управления, имеющих непосредственно отношение к созданию индекса. В нем лишь выводится список действий, которые необходимо выполнить для создания индекса с помощью мастера. Второе окно мастера имеет имя Select Database and Table (рис. 23.4) и предназначено для выбора таблицы, которую необходимо индексировать. Как видно из рисунка, в распоряжении пользователя имеются два раскрывающихся списка — Database name и Object name. С помощью первого из них выбирается база данных, таблицу которой предполагается индексировать. С помощью второго же списка указывается собственно объект, для которого будет создаваться индекс. После того, как объект будет определен, можно переходить к следующему окну.
Create Index Wizard - STORAGE\TRELC3J4\Northwn id Select Database and Table Select the database and table to index. Database name: id I :. North wn Dbe j ct name: Empo l yees
Ш
Jjj jjjj
Next > f Cancei ij
Рис. 23.4. Окно Select Database and Table мастера Create Index Wizard
Третье окно мастера называется Current Index Information (рис. 23.5). В нем выводится список всех индексов, уже созданных для выбранного в предыдущем окне объекта. Каждая строка таблицы, имеющейся в окне, описывает отдельный индекс. Для индекса указывается его имя (колонка Index Name), тип (колонка Clustered), а также список столбцов, входящих в индекс (колонка Columns). Окно Current Index Information выводится для того, чтобы пользователь имел представление об уже существующих индексах. Вполне возможно, что нужные столбцы уже были проиндексированы, и создание нового индекса не требуется. В этом случае остается только нажать кнопку Cancel и тем самым прервать процесс создания индекса. 34 Зак. 83
Часть IV. Разработка и сопровождение баз данных
1040
2SJ
Create Index Wizard - STDRAGE\TREIO14\ Current Index Information View the indexes in the object you selected. Index Name PK_Ernployees LastName PostalCode
I Clustered Yes No No
i Cou l mns Empo l yeeD l LastName PostalCode
Next>
Cancel
Рис. 23.5. Окно Current Index Information мастера Create Index Wizard Create IndeK Wizard - STORAGE\TRELON\Narthwind Select Columns Select one or more columns to include in the index.
Column Name EmployeelD LastName FiistName Title TitleO (Courtesy BirthDate HireDate Address City PostalCode
(Data Type i Length 11nclude in Index iSort Order(DESC) 4 int н п nvatchar 20 0 П nvarchar 10 Й LJ nvatchar 30 Kl Q nvarchar 25 j"l ["] datetime 8 r"pi datetime 8 nvarchar GO nvarchar 15 nvarchar
|*j
10 < Back
Next>
Cancel
Рис. 23.6. Окно Select Columns мастера Create Index Wizard
Если все же пользователь решил создать новый индекс, то следует перейти к окну Select Columns (рис. 23.6), позволяющему выбрать столбцы, которые будут индексироваться. Устанавливая флажок в колонке Include in Index, можно включить соответствующий столбец в индекс. Если же флажок устанавливается в ко-
Глава 23. Индексы
1041
лонке Sort Order(DESC), то данные соответствующего столбца в индексе будут располагаться по убыванию. Следующее окно — Specify Index Options (рис. 23.7) — предназначено для управления параметрами создаваемого индекса. Рассмотрим элементы управления, имеющиеся в этом окне: • Make this a clustered index. Установка этого флажка предписывает создать конфигурируемый индекс как кластерный. Заметим, что флажок доступен только в том случае, если в таблице еще не существует кластерного индекса. • Make this a unique index. Если необходимо, чтобы создаваемый индекс был уникальным, то следует установить этот флажок. • Fill factor. С помощью этого переключателя задется метод определения фактора заполнения индексных страниц: •
Optimal — в этом случае степень заполнения страниц будет выбираться сервером автоматически наиболее оптимальным (по мнению сервера) образом;
• Fixed — при установке переключателя в это положение пользователь имеет возможность указать произвольную степень заполнения индексных страниц. Create Index Wizard - STORAGE\TRELQN\Northwmci Specify Index Options You can make (his index a clustered index (if a clustered index does not exist on this object). You can also specify the fill factor. Properties • Г Mai I
(This object already has a clustered index)
iMake this a unique index]
I Fill factor (* Optimal Г Fixed:
< Даек
Next >
|
Cancel
Рис. 23.7. Окно Specify Index Options мастера Create Index Wizard
Когда все параметры индекса будут сконфигурированы, можно переходить к очередному окну мастера (рис. 23.8), которое является последним. В нем пользователь может с помощью кнопок Move Up и Move Down изменять порядок включения столбцов в индекс. Так же можно указать имя, которое будет иметь
1042
Часть IV. Разработка и сопровождение баз данных
создаваемый индекс. Когда и эти действия будут завершены, остается только нажать кнопку Finish, после чего и будет создан индекс.
Completing the Create Index Wizard The cou l mns included in the nonclustered index on the 'Employees' table in the 'Northwind' database are shown below. Name: Cou l mns included
Finish
Cancel
Рис. 23.8. Последнее окно мастера Create Index Wizard
Перестроение индексов Как уже было сказано, SQL Server 2000 не поддерживает автоматически фактор заполнения индексных страниц на конкретном уровне. Поэтому со временем степень заполнения страниц может существенно измениться по сравнению с первоначальным состоянием. Некоторые страницы могут оказаться заполненными полностью, тогда как другие практически пустыми. Если количество заполненных страниц становится слишком велико, то приходится часто производить расщепление страниц, что отрицательно сказывается на производительности. Чтобы повысить производительность до прежнего уровня, достаточно выполнить перераспределение строк индексных страниц, чтобы установить фактор заполнения на нужный уровень. Такой процесс называется перестроением индекса (rebuild index). Для выполнения перестроения DBREINDEX, имеющая синтаксис:
индексов
предназначена
DBCC DBREINDEX (['database.owner.table_name' [, index name [, fillfactor]]] [WITH NO INFOMSGS]
Рассмотрим назначение параметров команды:
команда
DBCC
Глава 23. Индексы
1043
П1 database.owner.table_name
Этот параметр определяет таблицу, в которой будет выполняться перестроение одного или более индексов. Помимо самого имени таблицы можно указать ее владельца и базу данных, в которой она находится. То есть перестроение индексов можно осуществлять не только в текущей базе данных, но и в любой базе данных текущего сервера. П
index_name С помощью этого параметра указывается имя индекса, который необходимо перестроить. Если имя индекса не указано, или указано как пустое, то будет выполнено перестроение всех индексов, имеющихся в таблице.
П fillfactor
Этот параметр определяет фактор заполнения, который будет установлен для указанного индекса. Если задается значение 0 или параметр f i l l f a c t o r вообще опускается, то для индекса будет использован фактор заполнения, назначенный при создании индекса. О
WITH NO_INFOMSGS
При использовании этого параметра при выполнении перестроения будут подавляться все информационные сообщения с уровнем серьезности с 0 до 10. На время перестроения индексов сервер блокирует данные, так что пользователи не смогут получить к ним доступ до окончания перестроения индекса. Поэтому перестроение индексов следует производить в периоды наименьшей активности пользователей, например, ночью. (
Замечание
^
С помощью одной команды DBCC DBREINDEX МОЖНО перестроить все индексы ука-
занной таблицы.
Переименование индекса Иногда бывает необходимо создать в таблице индекс с определенным именем. При этом требуется, чтобы имя индекса было уникально в пределах таблицы. Если в таблице уже имеется индекс с создаваемым именем, и он должен использоваться еще продолжительное время, то можно переименовать старый индекс и создать новый с нужным именем. Для переименования индексов служит хранимая процедура sp_rename, имеющая синтаксис: sp_rename [Qobjname =] ' o b j e c t _ n a m e ' ,
[@newname =] 'new_name', 'INDEX'
С помощью аргумента o b j e c t n a m e указывается имя индекса, который необходимо переименовать. Новое имя задается с помощью аргумента newname.
1044
Часть IV. Разработка и сопровождение баз данных
Удаление индекса Какого бы увеличения производительности не давали индексы, все же иногда приходится их удалять. Это может быть связано с удалением неверно созданных индексов, удалением индексов вследствие изменения структуры таблицы или создания новых индексов, которые позволяют лучше выполнять запросы. Для удаления индекса используется команда DROP INDEX, имеющая синтаксис: DROP INDEX ' t a b l e . i n d e x
1
[,...n]
Как видно из синтаксиса, с помощью команды DROP INDEX МОЖНО удалить один или несколько индексов только текущей базы данных.
Замечание С п о м о щ ь ю к о м а н д ы D R O P I N D E X нельзя удалить индексы из с и с т е м н ы х таблиц, а также индексы, созданные сервером автоматически при определении ограничений целостности Primary Key и Unique.
При удалении индекса происходит освобождение всех страниц, которые использовались для хранения данных индекса.
Просмотр информации о фрагментации Чтобы взвесить, насколько необходимо выполнение перестроения индексов, нужно иметь какую-то информацию о выполнении запросов. Для получения такой информации используется команда DBCC SHOWCONTIG, имеющая следующий синтаксис: DBCC SHOWCONTIG [({table_name I table_id | view_name I view_id} [, index_name | index_id])] [WITH {ALL_INDEXES | FAST [, ALL_INDEXES] I TABLERESULTS [, {ALL_INDEXES}] [, {FAST | ALL_LEVELS }]} ]
Рассмотрим назначение параметров команды: П
{table_name
I table_id
I view_name
I view_id}
С помощью данного параметра указывается объект текущей базы данных (таблицу или представление), информацию об индексах которого необходимо получить. Как видно, объект может быть указан как по имени, так и с помощью идентификационного номера.
С
Замечание
^)
Идентификационный номер объекта базы данных можно получить с помощью функции O B J E C T _ I D ( ' o b j e c t _ n a m e ' ) . П1 index_name
|
index_id
Этот же параметр предназначен для указания имени или идентификационного номера индекса, о котором необходимо получить информацию. Как
Глава 23. Индексы
1045
видно из синтаксиса, рассматриваемый параметр может быть опущен. В этом случае будет выведена информация обо всех индексах указанного объекта. П ALL_INDEXES
Задавая этот параметр, можно предписать выводить информацию обо всех индексах таблицы или представления, даже если с помощью предыдущего параметра было указано имя конкретного индекса. О FAST
Вызывая команду с этим параметром, будет выдаваться минимальное количество информации. Соответственно, при этом будет анализироваться лишь небольшая часть данных, что позволяет быстро получить статистическую информацию. •
TABLERESULTS
При указании этого параметра результат будет возвращен в виде набора строк (rowset) с выводом дополнительной информации. В обычном режиме информация об индексах передается в виде текстового сообщения, работа с которым из программ весьма затруднительна. Получение же информации в виде набора строк позволяет легко сохранить их в таблице (или переменно типа t a b l e ) и выполнить любой анализ непосредственно из программы. •
ALL_LEVELS
Этот параметр может использоваться только совместно с параметром TABLERESULTS и предписывает выполнить анализ всей информации об индексе. Таким образом, в распоряжении пользователя будет максимально достоверная и полная информация. Команда DBCC SHOWCONTIG ВЫВОДИТ информацию в двух режимах — текстовом и виде набора строк (при указании параметра WITH TABLERESULTS). При этом набор данных, возвращаемых в каждом из режимов, различается. Рассмотрим, какая же информация возвращается в текстовом режиме: П Pages Scanned. Количество страниц в таблице или индексе. П Extents scanned. Количество групп страниц (экстентами, extents) в таблице или индексе. П Extent Switches. Количество переключений между экстентами, которое было выполнено в процессе сканирования данных командой DBCC SHOWCONTIG. Если количество переключений значительно превышает общее количество экстентов, то это означает, что экстенты фрагментированы. • •
Avg. Pages per Extent. Среднее количество страниц на один экстент индекса или таблицы. Scan Density
[Best Count: Actual Count]. ПЛОТНОСТЬ сканирования В про-
центах. Чем выше значение, тем меньше непроизводительных затрат. Дополнительно указываются два значения — идеальное количество экстентов, и текущее количество экстентов. Первое из этих значений показывает, к скольким экстентам бы выполнялось обращение, если бы все данные распо-
1046
Часть IV. Разработка и сопровождение баз данных
лагались упорядоченно, и каждый экстент был бы полностью заполнен. Это значение получается при делении количества страниц на 8 (количество страниц в экстенте). Если значение дробное, то выполняется округление вверх. Текущее значение отражает количество экстентов, к которым было выполнено обращение. Считается каждое повторное обращение к одному и тому же экстенту. Чем больше разница между идеальным и текущим количеством, тем более фрагментированы данные. То есть чем меньше значение параметра Scan Density, тем более фрагментированы данные. При значении 100% данные не фрагментированы. •
Logical Scan Fragmentation. Степень логической фрагментации данных, указывается в процентах. Чем выше значение, тем более фрагментированы данные. В идеале фрагментация данных должна составлять 0%. Логическая фрагментация происходит, когда в цепочке IAM указан номер страницы, иной, чем в цепочке индексов. Хотя влияние логической фрагментации на скорость выполнения запроса не велико, тем не менее, не стоит пренебрегать им.
П Extent Scan Fragmentation. Степень фрагментации экстентов, указывается в процентах. Фрагментация экстентов — это ситуация, когда следующий экстент цепочки индекса или таблицы физически находится не после текущего экстента. Когда экстенты не фрагментированы, то будет выведено значение 0%. П Avg. Bytes free per Pages. Среднее количество свободного пространства на сканированных страницах в байтах. Это значение напрямую связано с фактором заполнения страниц. Если на странице мало свободного пространства, то последующие операции вставки и изменения данных потребуют выполнения расщеплений страниц, что отрицательно сказывается на производительности. Малое количество свободного пространства на странице служит индикатором, что пора выполнить перестроение данных на страницах. Для нормальной работы страница должна иметь достаточно свободного пространства для вставки новых строк. Напомним, что размер страницы составляет 8 Кбайт. • Avg. Page d e n s i t y ( f u l l ) . Это значение говорит о средней плотности данных на странице. Величина значения указывается в процентах и обратно пропорциональна значению предыдущего параметра, — чем больше свободного пространства на странице, тем меньше плотность заполнения страницы. Можно сказать, что это значение является средним фактором заполнения сканированных страниц. Слишком высокое значение свидетельствует о необходимости выполнения перестроения страниц. Рассмотрим пример информации фрагментации таблицы authors базы данных pubs: DBCC SHOWCONTIG (authors)
Будет получен следующий результат: DBCC SHOWCONTIG scanning 'authors' table... Table: 'authors' (1977058079); index ID: 1, database ID: 5 TABLE level scan performed.
Глава 23. Индексы
1047
- Pages Scanned. - Extents Scanned - Extent Switches - Avg. Pages per Extent - Scan Density [Best Count:Actual Count] - Logical Scan Fragmentation - Extent Scan Fragmentation - Avg. Bytes Free per Page - Avg. Page Density (full) DBCC execution completed. If DBCC printed error tem administrator.
:1 :1 :0 : 1.0 : 100.00% [1:1] : 0.00% : 0.00% : 6010.0 : 25.75% messages, contact your sys-
Когда же информация об индексах возвращается в виде набора строк, то помимо указанных данных возвращается и дополнительная информация. Рассмотрим, какие же столбцы добавляются: •
objectName — имя объекта, об индексах которого выводится информация;
Я o b j e c t i d — идентификационный номер объекта базы данных, об индексах которого выводится информация; •
indexName — имя индекса;
•
indexid — идентификационный номер индекса;
•
Level — уровень индекса;
•
Pages — количество страниц, занимаемых проиндексированными данными;
О Rows — количество проиндексированных строк; • MinimumRecordSize — минимальный размер, который могут иметь значения индексированных столбцов; • MaximumRecordSize — максимальный размер, который могут иметь значения индексированных столбцов; • AverageRecordSize — средний размер, который имеют значения индексированных столбцов; •
Extents — количество экстентов, занимаемых проиндексированными данными.
К сожалению, нет возможности привести пример данных, возвращаемых командой DBCC SHOWCONTIG при указании параметра WITH TABLERESULTS, Т. К. объем
этой информации достаточно велик и не поместится на страницу книги по ширине. Тем не менее, эту информацию легко увидеть в Query Analyzer, выполнив в нем, например, следующую команду: USE pubs GO DBCC SHOWCONTIG
(authors) WITH TABLERESULTS,
ALL_LEVELS
Глава 24
Статистика Как было сказано в предыдущей главе, SQL Server 2000 выполняет оптимизацию операций поиска данных в индексе с помощью статистики (statistics). Статистика представляет собой данные о распределении в таблице, упорядоченные с помощью индекса данных. Информация об индексах хранится в системной таблице sysindexes, имеющейся в каждой базе данных. Каждый индекс представлен отдельной строкой. Информация о статистике индекса хранится в столбце statblob, имеющем тип данных image, максимальный размер которого равен 2 Гбайт. Логически статистика представлена в виде интервалов, охватывающих весь диапазон значений индексированного столбца. Для каждого интервала указывается степень насыщенности, что позволяет судить о местоположении искомого элемента. Оптимизатор запросов использует статистику для построения наиболее эффективного плана исполнения запроса. Однако статистика должна отображать реальную ситуацию. Если статистика содержит неверную информацию, то оптимизатор не сможет построить правильный план исполнения запроса. Чтобы поддерживать статистику в "рабочем" состоянии, сервер периодически выполняет автоматическое сканирование индексированных столбцов. Конечно, подобное обновление требует определенных затрат процессорного времени и несколько снижает производительность операций вставки и изменения данных. При необходимости можно запретить обновление статистики и тем самым повысить производительность вставки и изменения данных. Однако скорость выполнения выборки данных может снизиться. Замечание SQL Server 2000 позволяет создавать статистику не только для индексированных столцов, но и для неиндексированных.
Создание статистики Создание статистики выполняется с помощью команды имеющей следующий синтаксис:
CREATE
CREATE STATISTICS s t a t i s t i c s _ n a m e ON { t a b l e I v i e w } (column [ , . . . n ] ) [ WITH [ [ FULLSCAN | SAMPLE number {PERCENT I ROWS}] [,] [ NORECOMPUTE]
]
STATISTICS,
Глава 24. Статистика
1049
Рассмотрим использование и назначение параметров команды: П statistics_name
Имя группы создаваемой статистики, которое должно быть уникальным в пределах таблицы и следовать стандартным правилам именования объектов. О {table | view}
Имя таблицы или представления, для которого создается статистика. Дополнительно можно указать имя владельца и имя базы данных, в которой расположена таблица. О
(column
[,...п])
С помощью этого параметра задается имя одного или более столбцов таблицы, для которых будет создана статистика. Не могут указываться вычисляемые (computed) столбцы И столбцы С Типами данных t e x t , n t e x t И image. •
FULLSCAN
При указании этой опции для создания статистики будет выполняться полное сканирование всей таблицы, т. е. будут обработаны все значения столбца, для которого создается статистика. •
SAMPLE number {PERCENT | ROWS} Использование этой опции позволяет выполнять выборочное сканирование лишь части строк таблицы. Количество сканируемых строк задается либо в процентах с помощью параметра PERCENT, либо в виде абсолютного количества строк с помощью параметра ROWS. Использование SAMPLE 100 PERCENT равнозначно указанию параметра FULLSCAN. ОПЦИИ FULLSCAN И SAMPLE num-
ber не могут применяться совместно. •
NORECOMPUTE
Если при создании статистики задается эта опция, то впоследствии сервер не выполняет автоматического обновления статистики, даже если в таблице происходят существенные изменения. Оптимизатор запросов продолжает использовать устаревшую статистику, из-за чего может генерироваться неверный план исполнения запроса. При необходимости пользователь может осуществить обновление статистики вручную.
Управление статистикой После того, как статистика создана, оптимизатор запросов начинает использовать ее автоматически. Если статистика не обновляется автоматически, то пользователь может сделать это вручную, используя команду UPDATE STATISTICS, имеющую следующий синтаксис: UPDATE STATISTICS {table | view} t index I (statistics_name[,...n]) ] [ WITH [ [FULLSCAN] | SAMPLE number {PERCENT | ROWS}] | RESAMPLE ] [[,] [ALL I COLUMNS | INDEX] [[,] NORECOMPUTE]
Часть IV. Разработка и сопровождение баз данных
/050
Рассмотрим назначение и использование параметров команды: О
{table I view}
Этот параметр указывает имя таблицы или представления, статистику которой необходимо обновить. Дополнительно можно задать имя владельца и имя базы данных. О index
Параметр используется, когда необходимо обновить статистику конкретного индекса. Если имя индекса не указывается, то будет обновлена статистика всех индексов таблицы. О (statistics_name[,...п])
С помощью этого параметра определяется одно или более имен статистик, созданных в таблице. О
FULLSCAN
При указании этой опции во время обновления статистики станет выполняться полное сканирование всей таблицы, т. е. будут обработаны все значения столбца, для которого создается статистика. •
SAMPLE number {PERCENT | ROWS} Использование этой опции позволяет выполнять выборочное сканирование лишь части строк таблицы. Количество сканируемых строк задается с помощью параметра number. Если указывается ключевое слово PERCENT, TO параметр number означает количество процентов строк, которое будет сканироваться, и он не должен превышать 100%. Если же указывается ключевое слово ROWS, TO параметр number задает физическое количество строк. Использование SAMPLE 100 PERCENT равнозначно использованию параметра FULLSCAN. ОПЦИИ FULLSCAN
и SAMPLE number PERCENT не могут применяться совместно. •
RESAMPLE
При задании этого параметра сервер начнет вычислять объем данных для сканирования путем усреднения значений процента выборки, использованных для всех статистик (в том числе и индексных), созданных для указанного представления или таблицы. •
ALL I COLUMNS |
INDEX
Эти опции позволяют выполнить обновление статистики для всех столбцов (COLUMNS), индексов (INDEX) ИЛИ И тех и других сразу (ALL). При использовании
любой из этих опций нет необходимости указывать имя индекса или столбцов. •
NORECOMPUTE
При выполнении обновления статистики с использованием этой опции в дальнейшем запрещается автоматическое обновление статистики для указанных объектов. Если ранее автоматическое обновление статистики было запрещено и обновление выполняется без указания опции NORECOMPUTE, TO В дальнейшем сервер станет автоматически обновлять статистику.
Глава 24. Статистика
1051
Команда UPDATE STATISTICS выполняет обновление статистики только в пределах одной таблицы. Если необходимо обновить несколько десятков таблиц, то команду UPDATE STATISTICS придется выполнять для каждой из них. Однако в SQL Server 2000 имеется системная хранимая процедура sp_updatestats, выполняющая обновления статистики во всех таблицах текущей базы данных: sp_updatestats
[[Qresample =]
'resample']
Как видно, эта хранимая процедура имеет единственный параметр. Указание для этого параметра значения ' resample' эквивалентно использованию параметра RESAMPLE при работе с командой UPDATE STATISTICS. Все остальные зна-
чения параметра процедуры игнорируются. Если вы не хотите выполнять обновление статистики, но необходимо разрешить или запретить автоматическое обновление, то нужно будет использовать не команду UPDATE STATISTICS, а хранимую процедуру s p _ a u t o s t a t s , изменяющую непосредственно значения в системных таблицах базы данных. Эта хранимая процедура имеет следующий синтаксис: sp_autostats [Stblname =] 'table_name' [, [@flagc =] 'stats_flag'] [, [@indname =] 'index_name']
Параметр tabie_name определяет имя таблицы, параметры статистики которой необходимо изменить. С помощью параметра indexname указывается имя индекса, которому принадлежит статистика. Параметры, которые будут установлены для статистики, задаются с помощью параметра s t a t s _ f i a g , который может принимать значения ON ИЛИ OFF, соответственно, разрешающие или запрещающие автоматическое обновление статистики. Если параметр s t a t s f lag не указан, то выводится текущее состояние автоматического обновления статистики. Если не определен параметр index_name, то будет выведено состояние всех статистик указанной таблицы. Например, просмотрим статистику таблицы authors базы данных pubs: USE pubs EXEC sp_autostats
authors
Будет получен такой результат: Global statistics settings for [pubs]: Automatic update statistics: ON Automatic create statistics: ON Settings for table
[authors]
Index Name [UPKCL_auidind] [aunmind] [_WA_Sys_state_07020F21] [_WA_Sys_contract_07020F21] [_WA_Sys_city_07020F21] [_WA_Sys_au_fname_07020F21] (6 row(s) affected)
AUTOSTATS Last Updated ON ON ON ON ON ON
1999-06-03 1999-06-03 1999-04-26 1999-05-06 1999-05-06 1999-06-30
19:20:05.407 19:20:05.557 12:20:54.780 22:29:56.840 22:30:30.327 14:58:11.703
1052
Часть IV. Разработка и сопровождение баз данных
Просмотр статистики Пользователь может просмотреть состояние статистики, чтобы определить, какое повышение производительности дает тот или иной индекс. На основе полученной информации он может принять решение об удалении индекса. Для просмотра состояния статистики предназначена команда: DBCC SHOW_STATISTICS ( t a b l e ,
target)
Параметр t a b l e определяет имя таблицы, которой принадлежит интересующая статистика. Имя объекта (статистики или индекса) указывается с помощью параметра t a r g e t . Команда возвращает информацию в виде следующего набора колонок: D Updated. Дата и время последнего обновления статистики. О Rows. Количество строк в таблице. П Rows sampled. Количество строк таблицы, которые были использованы для создания статистики. Если статистика давно не обновлялась, то значение в этой колонке может превышать значение в колонке Rows. •
steps. Количество интервалов распределения, созданных в статистике.
•
Density. Плотность данных в индексе.
•
Average key length. Средняя длина значения в столбце, для которого создана статистика.
•
All density. Плотность в индексе конкретного столбца.
П1 columns. Имя столбца таблицы, для которого выводится плотность. •
steps. В этой колонке выводятся все шаги диаграммы, созданные для статистики.
Рассмотрим пример получения информации о статистике: DBCC SHOW_STATISTICS ( a u t h o r s ,
[_WA__Sys_au_fname_07020F21])
Будет получен следующий результат: Statistics for collection '_WA_Sys_au_fname_07020F21•. Updated Rows Rows Sampled Steps Density Jun 30 1999 2:58PM (1 row(s) affected)
23
23
All density
Columns
4.3478262E-2 4.3478262E-2 (2 row(s) affected)
au_fname au fname, au id
Steps Abraham Akiko
23
4.3478262E-2
Average key 17.130434
Глава 24. Статистика
1053
Albert Ann Anne Burt Charlene Cheryl Dean Dirk Heather Innes Johnson Livia Marjorie Meander Michael Michel Morningstar Reginald Sheryl Stearns Sylvia (23 row(s) affected)
Удаление статистики Если использование статистики нецелесообразно, то ее можно удалить. Для этого служит команда: DROP STATISTICS table.statistics_name
I view.statistics_name
[ ,...n ]
За один раз можно удалить множество статистик из одной или разных таблиц (представлений) текущей базы данных.
ЧАСТЬ V. ПРОГРАММИРОВАНИЕ Глава 25. Основы Transact-SQL Глава 26. Типы данных SQL Server 2000 Глава 27. Функции SQL Server 2000 Глава 28. Вставка, удаление и изменение данных Глава 29. Выборка данных Глава 30. Хранимые процедуры Глава 31. Использование курсоров Глава 32. Триггеры
Глава 25
Основы Transact-SQL Целью любой системы управления базами данных является предоставление пользователю простых и эффективных механизмов манипулирования данными. Для этого можно использовать самые различные методы управления данными. Одним из таких методов является язык структурированных запросов (SQL, Structured Query Language). Язык SQL является хорошим примером использования технологии клиентсервер. Когда пользователю требуется произвести некоторые операции с данными, он описывает действия, которые необходимо выполнить, с помощью команд языка SQL. Подготовленные команды, называемые запросом (query), отправляются на сервер баз данных. В соответствии с полученными инструкциями сервер осуществляет необходимые действия и отправляет клиенту лишь результат работы. Таким образом, вся работа с данными производится на сервере. Первая версия языка SQL была разработана в 1970 г. фирмой IBM. SQL изначально разрабатывался как язык управления реляционными базами данных. Это была не первая и не последняя попытка создания мощного и удобного механизма управления данными. Однако именно язык SQL стал общепринятым стандартом доступа к данным. Практически все современные системы управления базами данных используют для доступа к данным ту или иную модификацию языка SQL. За тридцать лет существования языка SQL он претерпел существенные изменения, стал более гибким и мощным. Каждый из производителей СУБД старается предложить пользователю более удобный механизм управления данными по сравнению с конкурирующими программами. В итоге за всю историю развития SQL было создано множество модификаций языка, часто трудно совместимых друг с другом. Хотя набор основных команд во всех языках практически одинаков, тем не менее, каждый из них выдвигает свои требования к именованию объектов, типам данных, использованию переменных и т. д. Всё это отрицательно сказывается на совместимости программных продуктов. В 1992 г. американским национальным институтом стандартизации (ANSI, American National Standard Institute) был разработан стандарт на язык SQL, названный ANSI SQL-92. Этот стандарт не только определяет основные правила использования команд, идентификаторов, переменных и т. д., но и регламентирует работу самой системы управления базами данных. В частности, в стандарте ANSI SQL-92 были рассмотрены механизмы работы транзакций и блокировок. Стандарт ANSI SQL-92 был хорошей попыткой зарегистрировать языки доступа к данным, используемые в различных СУБД. Однако со временем каждый из производителей начал улучшать и модернизировать возможности языка, под-
1058
Часть V. Программирование
страивая под конкретную СУБД. С одной стороны, это позволяет более эффективно использовать возможности той или иной СУБД. С другой стороны, опять же привело к потере совместимости продуктов. В настоящее время стандарт ANSI SQL-92 рассматривается скорее как общие рекомендации к построению эффективной системы управления базами данных, чем как конкретный список шагов по построению СУБД. Корпорация Microsoft, как и многие другие производители, разработала свою версию языка SQL, назвав его Transact-SQL. Именно этот язык используется в SQL Server 2000 для доступа к данным. Этот язык удовлетворяет требованиям ANSI SQL-92, но предлагает пользователю еще и ряд дополнительных возможностей, позволяющих более гибко и эффективно работать с данными. Язык Transact-SQL активно используется не только в программных продуктах корпорации Microsoft, но и в пакетах независимых разработчиков. (
Замечание
^
В этой главе читатель научится использовать переменные и временные таблицы. Набор типов данных, имеющихся в распоряжении пользователя при работе с SQL Server 2000, будет представлен в следующей главе. Обзор системных функций будет дан в главе 27. В той же главе будет рассмотрено и создание пользовательских функций. Использование транзакций и блокировок SQL Server 2000 было рассмотрено в главе 19.
Временные таблицы и переменные В SQL Server 2000, как и во многих других СУБД, разрешается создание временных объектов (temporary objects). Такие объекты предназначены для хранения промежуточных значений приложениями, транзакциями, хранимыми процедурами и т. д. Использование временных объектов удобно тем, что пользователь может не заботиться об удалении ненужных объектов, т. к. SQL Server 2000 сделает это автоматически. Это позволяет не "замусоривать" базы данных и оперативную память. В SQL Server 2000 имеются два типа временных объектов, которые могут применяться для хранения данных — переменные и таблицы. Переменной называется поименованная область памяти, к которой можно обращаться по имени. Каждая переменная имеет определенный тип данных и используется для хранения одной величины. Физически каждая переменная представляет один или более байт памяти, расположенные последовательно. Количество байт, которое занимает переменная, зависит от ее типа. Тип переменной также определяет, как сервер станет обрабатывать хранящиеся в ней данные. Например, над числовыми данными можно производить любые арифметические операции, тогда как над символьными — только конкатенацию (склеивание). (
Замечание
^
Помимо временных таблиц и переменных, пользователи могут создавать временные хранимые процедуры (temporary stored procedure), которые также автоматически удаляются сервером.
Глава 25. Основы Transact-SQL
1059
Прежде чем начать использовать переменную, ее необходимо создать — объявить. При объявлении переменной указывается имя и ее тип данных. Для объявления переменной предназначена команда DECLARE, имеющая следующий синтаксис: DECLARE {@local_variable data_type} [,...n] Имя переменной обязательно должно начинаться с символа @. Следующие символы могут быть любыми, исключая специальные символы. Ограничений на второй символ имени не накладывается.
Замечание Типы данных, используемые в Transact-SQL, будут рассмотрены в следующей главе. С помощью одной команды DECLARE МОЖНО объявить множество переменных, перечислив их через запятую: DECLARE @aa int, @@ nvarchar, @1_@ int, @@ger_13 bit
Замечание Как видно из примера, имя @@ является допустимым именем переменной. Второй символ @ рассматривается как часть имени переменной, а не как служебный символ. С комбинации символов @@ начинаются имена глобальных переменных Transact-SQL, значения которых автоматически изменяются сервером. Для присвоения значения переменной можно использовать различные способы. Самый простой из них — применение команды SET. Однако с помощью этой команды можно присвоить значение только одной переменной. Для присвоения значений нескольким переменным необходимо будет выполнить соответствующее количество команд SET: DECLARE @aa int, @@ nvarchar (20) SET @aa=15
SET @@='Символьная строка' Значения переменным также можно присваивать с помощью команды SELECT, позволяющей одновременно работать с множеством переменных: DECLARE @aa int, @@ nvarchar (20) SELECT @aa=15, @@='Символьная строка'
Для вывода значений переменных можно использовать два типа вывода: команду SELECT и команду PRINT. Первая из них выводит данные в стандартный набор строк (recordset), тогда как вторая выводит информацию в качестве служебной. Служебная информация не может быть прочитана стандартными командами чтения набора записей. Примером служебной информации является строка (l row(s) affected), выдающаяся сервером после выполнения команд обработки данных в таблицах. Дополним приведенный выше пример командами вывода значений переменных: DECLARE @aa int, @@ nvarchar (20) SET @aa=15 SET @@='Символьная строка1
,
1060
Часть V. Программирование
PRINT @aa SELECT @@
В результате на экран будет выведена следующая информация: 15
Символьная строка
Замечание При выводе данных с помощью команды S E L E C T над самими данными отображается горизонтальная черта, обозначающая столбец. При выводе данных с помощью команды P R I N T такой черты нет. Более п о д р о б н о использование команды S E L E C T
будет рассмотрено в следующей главе.
Переменные используются для хранения одиночных значений. Для временного хранения больших объемов информации в SQL Server 2000 предназначены временные таблицы. Временные таблицы бывают двух типов: глобальные и локальные. Независимо от типа временной таблицы, они всегда создаются в системной базе данных tempdb и автоматически уничтожаются при завершении работы. Даже если при создании временной таблицы будет явно указано имя базы данных, в которой она должна быть создана, оно проигнорируется, и таблица все равно будет создана в базе данных tempdb.
Замечание В SQL Server 2000 появился новый тип данных— t a b l e . Переменные этого типа могут использоваться для хранения сложных наборов данных наподобие таблиц. Работа с типом данных t a b l e будет рассмотрена в следующей главе.
Доступ к глобальной временной таблице (global temporary table) может быть получен из любого соединения, независимо от того, в каком именно из них она была создана. Это предоставляет удобный интерфейс для обмена данными между различными копиями хранимых процедур. Одна и та же хранимая процедура, запускаемая разными пользователями, может обращаться к глобальной временной таблице для получения информации. Кроме того, глобальные временные таблицы могут быть использованы для обмена данными между различными приложениями. Так как глобальная временная таблица видна из любого соединения, то ее имя должно быть уникально в пределах сервера. При этом не важно, какой пользователь конкретно создал эту временную таблицу и в контексте какой базы данных. Кроме того, образование временной таблицы возможно только на текущем сервере. Использование имени сервера не поддерживается вообще. При попытке указать имя сервера будет выдано сообщение об ошибке. Для того чтобы создать глобальную временную таблицу, достаточно в начале ее имени при создании указать символы ##. Когда сервер встречает эти символы, он обращается к базе данных tempdb для поиска указанной таблицы. При этом игнорируется имя владельца таблицы и имя базы данных. В остальном же рабо-
Глава 25. Основы Transact-SQL
1061
та с временными таблицами ничем не отличается от работы с обычными таблицами. Для создания, изменения и удаления временных таблиц применяются те же команды, что и при работе с обычными таблицами. Глобальная временная таблица существует до тех пор, пока пользователь явно не уничтожит ее с помощью команды DROP TABLE или пока не будет закрыто соединение, в котором она создавалась. Кроме того, как глобальные, так и локальные временные таблицы также уничтожаются при останове сервера. Замечание Хотя глобальная временная таблица существует до закрытия соединения, тем не менее, она может быть удалена или изменена из любых других соединений. Локальные временные таблицы (local temporary table) видны только из того соединения, в котором они были созданы. При закрытии соединения такая таблица автоматически уничтожается. При следующем открытии соединения она должна быть создана заново. Кроме того, если локальная временная таблица была образована в хранимой процедуре, то после выхода из этой процедуры такая таблица также автоматически уничтожается. В разных соединениях могут создаваться временные локальные таблицы с одинаковыми именами. Локальные временные таблицы часто используются в работе хранимых процедур. Создание глобальных временных таблиц или стандартных таблиц не позволит полностью контролировать содержание этих таблиц, т. к. другая копия хранимой процедуры может удалить, изменить или добавить данные в таблицу. При использовании локальных временных таблиц такая проблема решается автоматически. Даже если в пределах одного соединения одна и та же хранимая процедура будет вызвана несколько раз, для каждой копии будет создана отдельная таблица. При этом имена этих таблиц могут быть одинаковыми. Для создания локальной временной таблицы необходимо перед именем таблицы при ее создании указать один символ #. В дальнейшем для ссылки на созданную таблицу также необходимо в ее имени указывать символ #. Приведем пример создания и использования локальной временной таблицы: CREATE TABLE #Tbll_tmp (TID int, TName nvarchar(15) NULL) INSERT INTO #Tbll_tmp (TID, TName) VALUES (1234, 'String values') SELECT * FROM #Tbll_tmp DROP TABLE #Tbll_tmp
В результате выполнения приведенных команд будет создана временная таблица #Tbii_tmp с двумя столбцами — TID и TName. В таблицу будет вставлена одна строка. Затем выведется содержимое таблицы, после чего она уничтожится. При выполнении команд будет выведена следующая информация: (1 row(s)
affected)
TID
TName
1234
S t r i n g values
(1 row(s)
affected)
1062
Часть V. Программирование
Также допускается создание временной таблицы с помощью конструкции INTO команды SELECT:
USE pubs SELECT au_id, au_lname, au_fname INTO ##GlTbl 1 FROM authors WHERE state != 'CA SELECT * FROM ##GlTbl
В результате будет отображена следующая информация: аи id
аи lname
341-22-1782 Smith 527-72-3246 Greene 648-92-1872 Blotchet-Halls 712-45-1867 del C a s t i l l o 722-51-5454 DeFrance 807-91-6654 Panteley 899-46-2035 Ringer 998-72-3567 Ringer
аи fname Meander Morningstar Reginald Innes Michel Sylvia Anne Albert
(8 row(s) affected)
(
Замечание
)
Создание временных таблиц с помощью конструкции I N T O команды S E L E C T предоставляет удобный механизм для обработки данных в хранимых процедурах.
Выражения При непосредственном программировании на Transact-SQL часто приходится использовать сложные комбинации констант, идентификаторов объектов, логических и арифметических операций, функций и т. д. Такой набор в Transact-SQL называется выражением (expression). Выражения широко применяются при выполнении самых различных операций: при присвоении значений переменным, обновлении строк таблиц, выборке данных, в хранимых процедурах и т. д. Выражения автоматически вычисляются при выполнении команд Transact-SQL, и вместо них подставляется конкретное значение. Поэтому выражения могут использоваться в качестве параметров хранимых процедур, команд Transact-SQL или запросов. Выражения Transact-SQL, как и многих других языков, состоят из операндов и операторов. Операнды — это исходные данные, используемые в выражении. Значения этих данных не меняются. Операторами же являются действия, которые необходимо выполнить над операндами для вычисления выражения (например, сложение или умножение). .
Операнды Операнды Transact-SQL бывают следующих типов: • Константы (constants). Это постоянные величины, значения которых задаются на этапе написания кода и не могут быть изменены в ходе выполнения
Глава 25. Основы Transact-SQL
1063
программы. Например, в выражении 3+i2.52*@vari константами являются з И 12.52. Другие Примеры КОНСТаНТ: 'Pavel Sipkin', 0x254629 И NULL. В приведенном ниже примере переменной @vari присваивается результат вычисления суммы чисел 17,83 и —5,62, умноженный на 0,78. Значение переменной затем выводится на экран: DECLARE @Varl decimal (10,2) SET @Varl = {-5.62+17.83)*0.78 SELECT @Varl
Будет выведен следующий результат: 9.52 (1 row(s)
affected)
П Переменные (variables). Сущность переменных была описана в одном из предыдущих разделов этой главы. Если в выражении встречается имя переменной, то для вычисления выражения подставляется значение этой переменной. В приведенном выше примере значение переменной @vari задается с помощью выражения. В свою очередь, переменная @vari может быть использована как часть другого выражения: DECLARE @Varl decimal (10,2), @Var2 decimal SET @Varl = (-5.62+17.83)*0.78 SET @Var2= @Varl*@Varl/1.37 SELECT @Varl, @Var2
(10,2)
Будет выведен следующий результат: 9.52 66.15 (1 row(s) affected)
О Функции (functions). Это небольшие программы, имеющие определенное имя и реализующие часто используемые алгоритмы. Применение функций позволяет избежать частого написания одного и того же кода. В SQL Server 2000 имеется два типа функций: встроенные и определяемые пользователем. Встроенные функции реализованы как часть ядра SQL Server 2000 и не могут быть изменены. Результатом выполнения функции является какое-то значение, которое и используется при вычислении выражения. Функция может возвращать значения любого из типов, разрешенных для переменных. При вызове функции обычно указывается одно или более входных значений, с которыми работает функция. Результат, возвращаемый функцией, зависит от значений входных параметров. Однако некоторые типы функций не требуют никаких входных параметров или позволяют опускать их. Приведенный ниже пример иллюстрирует использование функций GETDATE И SUBSTRING. Первая из них возвращает текущее время и не требует указания никаких входных параметров. Вторая же функция возвращает определенное число символов строки, начиная с указанного символа, т. е. возвращает подстроку строки. SELECT GETDATE(), SUBSTRING('Pavel
Sipkin 1 , 7, 6)+' молодец!'
1064
Часть V. Программирование
В результате выполнения будет выведено следующее сообщение: 2000-05-01 11:15:13.330 (1 row(s) affected)
Sipkin молодец!
Имя столбца (column name). При использовании выражений в командах сканирования (DELETE, UPDATE ИЛИ SELECT) В качестве операндов можно указывать имена столбцов сканируемых таблиц, которые могут задаваться как в конструкции WHERE для ограничения диапазона сканируемых строк, так и в списке выбираемых значений. При сканировании таблицы последовательно вместо имени столбца будет подставляться значение, соответствующее конкретной строке таблицы. Таким образом, с помощью имени столбца можно обратиться к каждой строке сканируемой таблицы. В приведенном ниже примере выполняется сканирование таблицы authors. С помощью команды SELECT выводится 5 первых авторов, живущих в штате Калифорния: USE pubs SELECT TOP 5 au_fname+' живет в Калифорнии в городе FROM authors WHERE state='CA'
'+city
После выполнения команды будет выбеден примерно следующий результат Johnson живет в Калифорнии в городе Menlo Park Marjorie живет в Калифорнии в городе Oakland Cheryl живет в Калифорнии в городе Berkeley Michael живет в Калифорнии в городе San Jose Dean живет в Калифорнии в городе Oakland (5 row(s) affected)
Другой пример иллюстрирует использование имени столбца для присвоения значения переменной. Приведенная ниже команда подсчитывает, на какую сумму было продано книг за год. Для этого она сканирует таблицу t i t l e s , перемножает столбцы p r i c e и ytd_saies и добавляет полученное значение к переменной gvari. DECLARE @Varl money SET @Varl=0 SELECT @Varl=price*ytd_sales SELECT @Varl
FROM titles
В итоге будет выведен следующий результат: 61384.0500 (1 row(s) affected)
П Подзапрос (subquery). Подзапросы служат для динамического формирования набора данных, с которым будет производиться работа. В результате выполнения подзапроса формируется временная таблица, существующая только в пределах выполняемого запроса. Подзапрос может возвращать любое количество строк с любым количеством столбцов. Однако чаще всего подзапросы
Глава 25. Основы Transact-SQL
1065
применяются для возвращения набора строк с одним единственным столбцом. Такие наборы могут использоваться логическими операторами, работа с которыми будет рассмотрена в следующем разделе. В качестве примера приведем запрос, выводящий названия всех книг, авторы которых проживают не в штате Калифорния: SELECT title FROM titles WHERE title_ID IN ( SELECT title_id FROM authors, titleauthor WHERE titleauthor.au_id=authors.au_id AND state != 'CA')
После выполнения запроса будет выведен следующий результат: Title Silicon Valley Gastronomic Treats The Gourmet Microwave Is Anger the Enemy? Life Without Fear Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean Fifty Years in Buckingham Palace Kitchens (6 row(s) affected)
Подзапросы, возвращающие единственное значение, могут применяться в выражениях наравне с обычными переменными и константами: DECLARE SVarl money SET @Varl = 10*(SELECT MAX(price) FROM titles) SELECT @Varl
Будет возвращен следующий результат: Warning: Null value eliminated by aggregate or other set operation.
229.5000 (1 row(s)
affected)
ЗамеЧание Первое предупреждающее сообщение относится к функции агрегирования. П Функции CASE, COALESCE и ISNULL. Эти команды предназначены для динамического определения возвращаемого значения в зависимости от значений начального параметра. По логике действия эти команды можно сравнить с командой ветвления I F , однако рассматриваемые команды сами выполняют проверку условия и возвращают значение в зависимости от соблюдения этого условия. Из всех описанных выше операндов некоторую трудность представляет использование команд CASE, COALESCE и ISNULL, поэтому рассмотрим их подробнее.
1066
Часть V. Программирование
Функция CASE Сначала рассмотрим использование функции CASE, имеющей следующий синтаксис: CASE input_expression WHEN when_expression THEN result_expression [...n] [ELSE else_result_expression] END Аргумент i n p u t e x p r e s s i o n указывает выражение, которое будет определять возвращаемое функцией CASE значение. В выражении могут быть использованы любые из перечисленных операндов и операторов, которые будут рассмотрены в следующем разделе. После ключевого слова WHEN приводится выражение, при совпадении значения которого со значением входного выражения input_expression будет возвращено значение выражения r e s u l t _ e x p r e s s i o n , указываемое за ключевым словом THEN. Конструкция [...п] говорит о том, что может быть указано множество условий совпадения. После ключевого слова ELSE задается выражение (eise_resuit_expression), значение которого должно быть возвращено при несоблюдении ни одного из описанных условий. Замечание В некоторых случаях функция CASE может быть заменена одной или более командами I F . Тем не менее, использование команды I F в запросах неразрешено. В таких случаях применения команды CASE не избежать. Команда CASE служит только для получения конкретного значения в зависимости от значения указанного выражения, тогда как варианты использования команды I F гораздо более широкие.
Приведенный ниже пример иллюстрирует простейший вариант использования функции CASE для вывода на экран текущего дня недели: SELECT WHEN WHEN WHEN WHEN WHEN WHEN WHEN END
GETDATE(), CASE DATEPART(dw, GETDATE()) 1 THEN 'Понедельник1 2 THEN 'Вторник' 3 THEN 'Среда' 4 THEN 'Четверг' 5 THEN 'Пятница' 6 THEN 'Суббота' 7 THEN 'Воскресенье'
В результате будет выведена следующая информация: 2000-11-27 22:56:16.880
Понедельник
(1 row(s) affected)
В приведенном примере не использовалась ни одна переменная. Функция CASE также может быть применена при сканировании таблицы для проверки значения столбца. Приведенный ниже пример сканирует таблицу authors базы данных pubs, выводит фамилию автора и значение 'живет в Юта' если значение в
Глава 25. Основы Transact-SQL
1067
с т о л б ц е s t a t e р а в н о ' U T ' ; з н а ч е н и е ' ж и в е т в К а н з а с е ' ДЛЯ ' K S ' ; ' ж и в е т в И н 1 д и а н е ' ДЛЯ ' I N ' ; з н а ч е н и е ' ж и в е т в М и н е с с о т е ДЛЯ ' M l ' И з н а ч е н и е ' ж и в е т
непонятно где 1 для всех других значений в столбце s t a t e . Кроме того, не выводятся авторы, проживающие в Калифорнии. SELECT a u _ l n a m e + ' живет '+CASE s t a t e WHEN 'UT' THEN ' в Юте' WHEN 'KS' THEN 'в Канзасе' WHEN 'IN' THEN 'в Индиане' WHEN 'MI' THEN 'в Минессоте' ELSE 'непонятно где' END FROM authors WHERE state ! = 'CA'
Результатом выполнения запроса будет следующий вывод: Smith живет в Канзасе Greene, живет непонятно где Blotchet-Halls живет непонятно где del Castillo живет в Минессоте DeFrance живет в Индиане Panteley живет непонятно где Ringer живет в Юте Ringer живет в Юте (8 row(s) affected)
Описанный вариант команды CASE позволяет работать только строго с перечисленными вариантами. Однако часто бывает необходимо получить значение на основе логического условия. Например, на основе количества лет, исполнившихся человеку, следует выдать его статус: младенец, если до 1 года; ребенок до 10 лет, подросток до 15 лет, молодой человек до 27 лет, взрослый человек до 65 лет и старик в остальных случаях. Это разложение сложно сделать с помощью описанного варианта функции CASE. МОЖНО воспользоваться командой I F , однако это потребует указания множества команд. Кроме того, применение команды I F недопустимо в выражениях. Выходом будет использование второго варианта функции CASE, так называемая поисковая функция CASE (search CASE function): CASE WHEN Boolean_expression THEN result_expression [...n] [ELSE e l s e _ r e s u l t _ e x p r e s s i o n ] END
Как видно из синтаксиса, значение, которое будет возвращено функцией CASE, зависит от выполнения логического условия, задаваемого с помощью аргумента Boolean_expression, и указывается после ключевого слова WHEN. После ключевого слова THEN задается выражение (resuit_expression), значение которого будет возвращено при выполнении соответствующего логического условия. Хотя может проверяться множество логических условий, будет возвращено значение, соответствующее первому выполняемому условию. Описанная задача с определением статуса человека может быть теперь легко решена:
1068
Часть V. Программирование
DECLARE @Varl s m a l l d a t e t i m e , @Var2 i n t SET @Varl='13 aug 1978' SET @Var2=DATEDIFF(yy, @Varl, GETDATE())/ 365 SELECT @Var2, CASE WHEN @Var2
В приведенном примере в переменную @vari заносится дата рождения человека, а в переменную @var2 — динамически вычисляемое количество лет, исполнившееся человеку. Хотя в нашем случае дата рождения была указана явно, она также может извлекаться из столбца таблицы. Итогом выполнения будет следующий результат: 21 (1 row(s)
молодой человек affected)
Замечание При описании диапазонов следует располагать интервалы в функции CASE В соответствии с их реальной последовательностью. Если в приведенном примере поменять местами две последние строки (для 27 лет и 65 лет), то в результате будет выведено ' в з р о с л ы й ч е л о в е к ' .
Хотя все приведенные ранее примеры рассматривали использование функции CASE для анализа значения одной переменной, тем не менее, ничто не мешает использовать логические условия, построенные с участием различных операндов и операторов. Приведем такой пример: SELECT [Описание] = Lips, 'Кол-во'=count(Lips) FROM (SELECT [Lips]=CASE WHEN state='CA' THEN 'по штату Калифорния' WHEN au_fname IN ('Meander', 'Morningstar', 'Michel') THEN 'по имени' ELSE 'все остальное' END FROM authors) AS tbll GROUP BY Lips ORDER BY 'Кол-во'
После выполнения команд будет выведен следующий результат: Описание
Кол-во
по имени 3 все остальное 5 по штату Калифорния 15 (3 row(s) affected)
Приведенный пример является довольно сложным запросом, в котором используется динамическое формирование таблицы, группировка и функция агрегирования. Динамическая таблица формируется на основе выборки из таблицы authors
Глава 25. Основы Transact-SQL
1069
с помощью функции CASE, возвращающей три разных результата: 'по штату калифорния 1 если значение столбца s t a t e равно ' С А 1 ; 'ПО имени' если именем автора является 'Meander 1 , ' M o r n i n g s t a r ' ИЛИ ' M i c h e l ' . Значение ' в с е о с т а л ь н о е 1 возвращается для всех строк, для которых не выполняется ни одно из перечисленных условий. Можно выполнить этот запрос для наглядности отдельно: SELECT au_fname, state, CASE WHEN state='CA' THEN 'по штату Калифорния1 WHEN au_fname IN ('Meander', 'Morningstar1, 'Michel ELSE 'все остальное' END FROM authors
THEN 'по имени'
Будет получен следующий результат: аи fname
state
Johnson Marjorie Cheryl Michael Dean Meander Abraham Ann Burt Charlene Morningstar Reginald Akiko Innes Michel Dirk Stearns Livia Sylvia Sheryl Heather Anne Albert (23 row(s-) affected)
CA CA CA CA CA KS CA CA CA CA TN OR CA MI IN CA CA CA MD CA CA UT UT
по штату Калифорния по штату Калифорния по штату Калифорния по штату Калифорния по штату Калифорния по имени по штату Калифорния по штату Калифорния по штату Калифорния по штату Калифорния по имени все остальное по штату Калифорния все остальное по имени по штату Калифорния по штату Калифорния по штату Калифорния все остальное по штату Калифорния по штату Калифорния все остальное все остальное
Функция COALESCE Функция COALESCE предназначена для возвращения значения первого выражения из заданного списка, которое не равно NULL. В анализируемом выражении могут использоваться имена столбцов, переменные, константы, функции и т. д. Синтаксис функции COALESCE таков: COALESCE ( e x p r e s s i o n
[, ...n] )
Аргумент e x p r e s s i o n определяет выражение, которое будет анализироваться. Конструкция [,...п] указывает, что в одной команде COALESCE МОЖНО задавать
1070
Часть V. Программирование
множество выражений. Рассмотрим простейший пример использования команды COALESCE: DECLARE @Varl int, @Var2 int, @Var3 int SET @Var2=1024 SELECT COALESCE (@Varl,@Var2,@Var3) SET @Varl=17 SELECT COALESCE (@Varl,@Var2,@Var3)
После выполнения команд будет выведен следующий результат: 1024 (1 row(s) affected) 17 (1 row(s) affected)
Как не трудно догадаться, функция COALESCE является просто компактным вариантом функции CASE, используемым в узком круге задач. В принципе функция COALESCE может быть легко заменена функцией CASE В следующем виде: CASE WHEN (expressionl IS NOT NULL) THEN expressionl WHEN (expressionN IS NOT NULL) THEN expressionN ELSE NULL END
Функция ISNULL Функция ISNULL предназначена для замены выражения, равного NULL, другим значением. Синтаксис функции ISNULL: ISNULL(check_expression,
replacement_value)
Аргумент check_expression задает выражение, которое проверяется на NULL. Если значение этого выражения равно NULL, TO будет возвращено значение r e p l a c e m e n t v a l u e , в качестве которого может быть указано любое выражение, в том числе и возвращающее NULL. Команда ISNULL часто используется в операциях сканирования таблиц при выполнении операций над значениями столбцов. Если в столбце хранится значение NULL, то результатом выполнения любой операции будет NULL. Чтобы избежать этого, можно использовать команду ISNULL. Приведенный ниже пример демонстрирует поведение сервера при сложении константы со значением NULL: SELECT 1+NULL, 'Foliant'+NULL, 3*NULL
Будет получен следующий результат: NULL
(1 row(s)
NULL
affected)
NULL
Глава 25. Основы Transact-SQL
1071
Замечание При конкатенации строки со значением N U L L ПО умолчанию будет возвращено N U L L . Однако можно настроить свойства соединения таким образом, что значение N U L L будет рассматриваться как пустая строка, и в результате конкатенации станет возвращаться исходная строка. Для управления этим параметром применяется команда SET CONCAT_NULL_YIELDS_NULL {ON | OFF}. По уМОЛЧЭНИЮ установлено значение ON, что приводит к возврату N U L L , если одно из значений — N U L L . При использовании параметра O F F будет возвращаться исходная строка.
Рассмотрим более сложный пример работы функции ISNULL при сканировании таблицы t i t l e s : DECLARE @Varl decimal(10,2) SET @Varl=0 SELECT @Varl=@Varl+price FROM titles SELECT @Varl
Будет получен следующий результат: NULL (1 row(s) affected)
В приведенном примере в переменную @vari заносится сумма по столбцу p r i c e для всех строк таблицы. В некоторых строках содержится значение NULL. Поэтому после сканирования таблицы значение переменной @vari будет равно NULL. Добавим функцию ISNULL для замены значений NULL нулем: DECLARE SVarl decimal(10,2) SET @Varl=0 SELECT @Varl=@Varl+ISNULL(price,0) SELECT @Varl
FROM titles
Будет получен следующий результат: 236.26 (1 row(s)
affected)
Замечание Приведенный пример лишь иллюстрирует использование функции I S N U L L . Однако в реальной ситуации для подсчета суммы по столбцу рекомендуется применять функцию агрегирования SUM, которая автоматически пропускает значения N U L L . Тогда последний приведенный пример можно заменить одной единственной командой
SELECT SUM(price) FROM titles. Как
и функцию COALESCE, функцию ISNULL МОЖНО легко заменить
функции CASE: CASE WHEN check_expression IS NULL THEN ELSE check_expression END 35 Зак. 83
replacement_value
вызовом
1072
Часть V. Программирование
Операторы В предыдущих разделах были рассмотрены операнды, которые могут быть использованы в выражениях. Однако сами по себе операнды не представляют особого интереса. Для получения полноценного выражения над операндами необходимо произвести какие-либо действия. Простейшим примером таких действий могут служить арифметические операции, конкатенация строк, операции сравнения и т. д. Действия, производимые над операндами, задаются с помощью операторов. Операторы Transact-SQL делятся на следующие типы: П простейшие, или унарные (unary); •
присваивания (assignment);
•
арифметические (arithmetic);
•
конкатенации строк (string concatenation);
•
сравнения (comparison);
П битовые (bitwise); П логические (logical). Каждый из перечисленных типов операторов представляет определенный интерес и обладает своей спецификой.
Простейшие операторы Простейшие операторы применяются к единственному выражению любого из числовых типов данных. В качестве выражения может выступать отдельная константа, переменная, функция или любая их комбинация, возвращающая числовое значение. К простейшим относятся следующие операторы: П + (Positive). Возвращает положительное значение числа. Можно рассматривать как умножение операнда на +1. Использование этого оператора в большинстве случаев необязательно, т. к. по умолчанию, если явно не указан знак числа, то подразумевается, что число положительное. Использование оператора + для отрицательных значений не дает никакого результата. П — (Negative). Возвращает отрицательное значение числа. Можно рассматривать как умножение операнда на — 1. П ~ (Bitwise NOT). Возвращает значение, являющееся результатом побитового отрицания. Этот тип оператора также может быть с успехом отнесен к битовым операторам. Приведенный ниже пример демонстрирует работу простейших операторов: SELECT + 1 2 . 3 4 5 ,
-1,
-13.3,
+-3, -+б, -
-2
Глава 25. Основы Transact-SQL
1073
Будет получен следующий результат: 12.345
-8
(1 row(s)
-13.3 -3
-б
2
affected)
Замечание Не нужно путать простейшие операторы с арифметическими операторами. Хотя они и записываются одинаково, все же они различны. Однако, если посмотреть с другой стороны, то простейшие операторы являются облегченным вариантом арифметических (+ и -) или битовых (~) операторов, первый из операндов которых равен 0. Например, выражение -7 можно записать как 0-7.
Оператор присваивания В Transact-SQL существует единственный оператор присваивания — знак =. Этот оператор служит для присваивания значений переменным и для связывания имен столбцов, возвращаемых командой SELECT, С определенным выражением. Мы уже использовали оператор присваивания в предыдущих примерах. Тем не менее, рассмотрим отдельно его применение для присваивания значений переменной: DECLARE @Varl nvarchar(15), @Var2 int SET @Varl='Pavel Sipkin' SET @Var2=(12+5*-27)/4
Следующий пример иллюстрирует использование оператора присваивания при выборке данных для определения имени столбца: SELECT title, 'Value'=price*ytd_sales FROM titles WHERE type='business'
Будет выведен следующий результат: title
Value
The Busy Executive's Database Guide Cooking with Computers: Surreptitious Balance Sheets You Can Combat Computer Stress! Straight Talk About Computers (4 row(s) affected)
81859.0500 4 6318.2000 55978.7800 81859.0500
Как видно из возвращенного результата, был создан новый столбец с именем value, в котором находится итоговая сумма, полученная от реализации каждой книги серии business. В рассмотренном примере новый столбец был создан на основе произведения значений двух других столбцов. Однако допускается использование не только имен столбцов таблицы, но и переменных, констант, функций, подзапросов, команд CASE, ISNULL, COALESCE И Т. Д.
Замечание Знак = может быть также использован как оператор сравнения для проверки двух величин на равенство.
1074
Часть V. Программирование
Арифметические операторы Операторы этого типа предназначены для выполнения стандартных арифметических операций над двумя выражениями числового типа. К арифметическим относятся следующие операторы: •
Сложение (Add) — +. Этот оператор может использоваться не только для числовых ТИПОВ, НО И ДЛЯ данных ТИПа datetime И smalldatetime ДЛЯ Добавления определенного количества дней. Количество дней задается с помощью числового выражения, возможно и нецелочисленного.
•
Вычитание (Subtract) — —. Как и предыдущий оператор, вычитание может также быть применено к типам данных datetime и smalldatetime для вычитания определенного количества дней. Количество дней задается с помощью числового выражения, возможно и нецелочисленного.
П Умножение (Multiply) — *. Этот оператор применяется для любых числовых ТИПОВ данных, ИСКЛЮЧая ТИПЫ даННЫХ d a t e t i m e И s m a l l d a t e t i m e . • Деление (Divide) — /. Этот оператор применяется для любых числовых типов данных, исключая ТИПЫ ДаННЫХ d a t e t i m e И s m a l l d a t e t i m e . •
Остаток от деления (Modulo) — %. Этот оператор применяется для любых ЧИСЛОВЫХ ТИПОВ данных, исключая ТИПЫ данных d a t e t i m e , s m a l l d a t e t i m e , money И smallmoney.
В качестве числовых типов данных арифметические операторы также рассматривают и типы данных money, smallmoney и binary. Приведенный ниже пример иллюстрирует использование оператора сложения для типа данных datetime: DECLARE @Varl datetime, @Var2 datetime SET @Varl=GETDATE() SET @Var2=@Varl+1.125 SELECT 'нач. знач'=@Уаг1, 'конеч. знач'=@Уаг2 Будет получен следующий результат: нач. знач
конеч. знач
2000-05-01 19:38:51.663 (1 row(s) affected)
2000-05-02 22:38:51.663
Рассмотрим работу арифметических операторов для типа данных money: DECLARE @Varl money SET @Varl=$123.25 SELECT @Varl, @Varl*2, @Varl+17.25, @Varl/5 Будет получен следующий результат: 123.2500 246.5000 (1 row(s) affected)
140.5000
24.6500
Арифметические операторы также могут быть использованы для двоичных данных:
Глава 25. Основы Transact-SQL
1075
DECLARE @Varl b i n a r y ( 2 ) SET @Varl=OxlOFl SELECT @Varl, @Varl+O, @Varl%7, @Varl+83,
@Varl*3
Будет получен следующий результат: OxlOFl 4337 4 (1 row{s) affected)
4420
13011
Оператор конкатенации строк Это единственный оператор помимо операторов сравнения и присваивания, который используется для работы с текстовыми строками. Оператор конкатенации строк обозначается символом + аналогично арифметическому оператору сложения и простейшему оператору + (Positive). Рассмотрим пример конкатенации двух строк: DECLARE @Varl nvarchar(15), @Var2 nvarchar(15) SET @Varl='Pavel1 SET @Var2='Sipkin' SELECT @Varl+' '+@Var2+' - правильный'
Будет получен следующий результат: Pavel Sipkin - правильный (1 row(s) affected)
(~
Замечание
J
Все другие операции с текстовыми значениями выполняются с помощью строковых функций. Например, для удаления всех конечных пробелов служит функция R T R I M , а для возвращения подстроки — функция
SUBSTRING.
Операторы сравнения Операторы сравнения существуют для проверки выражения на соответствие определенному условию. Такая проверка используется в командах I F , CASE конструкции WHERE и в некоторых других случаях. В Transact-SQL имеются следующие операторы сравнения: О равнозначны (Equals) — =; •
больше чем (Greater than) — >;
•
меньше чем (Less than) — <;
• больше чем или равно (Greater than or Equal to) — >=; •
меньше чем или равно (Less than or Equal to) — <=;
•
не равно (Not Equal to) — о или ! =;
1076
Часть V.
Программирование
П не меньше чем (Not Less than) — !<; П не больше чем (Not Greater than) — ! >. Операторы сравнения указываются между двумя выражениями и определяют логическое условие, по которому сравниваются эти выражения. Результатом выполнения оператора сравнения является логическая величина, которая может иметь два состояния: TRUE — если условие выполняется, и FALSE — если условие не выполняется. Замечание В некоторых языках программирования имеется специальный тип переменной — логический, который может быть использован для хранения значений TRUE И F A L S E . Эти значения разрешается использовать непосредственно в командах, требующих возвращения логического значения ( I F , CASE, WHERE И Т. Д . ) . Однако в Transact-SQL нет типа данных, обеспечивающего хранение логических значений. Тем не менее, приложив небольшие усилия, для этих целей можно выбрать любой тип данных, например b i t .
В некоторых из предыдущих примеров уже были использованы операторы сравнения. Например, при работе со вторым вариантом команды CASE использование операторов сравнения обязательно. Рассмотрим использование операторов сравнения в команде I F : IF DATEPART(hh, GETDATE())>12 SELECT ELSE SELECT 'Первая половина дня'
'Вторая половина дня'
Операторы сравнения также активно применяются в конструкции WHERE команд сканирования для ограничения диапазона строк. Рассмотрим работу оператора сравнения для выборки данных с помощью команды SELECT: SELECT au_fname, phone, address
FROM authors WHERE contract=0
Будет возвращен следующий результат: au_fname
phone
address
Meander Morningstar Dirk Heather (4 row(s) affected)
913 615 415 707
10 Mississippi Dr. 22 Graybar House Rd. 5420 Telegraph Av. 301 Putnam
843-0462 297-2723 843-2991 448-4982
Другой пример оператора сравнения: SELECT title, type, [Итого сумма]=price * ytd_sales FROM titles WHERE price>=19.99 AND advance!=5000 AND ytd_sales!<4095
Будет возвращен следующий результат: title But Is It User Friendly? Secrets of Silicon Valley (2 row(s) affected)
type
.
Итого сумма
popular_comp 201501.0000 popular_comp 81900.0000
Глава 25. Основы Transact-SQL
1077
Замечание Последние два примера иллюстрируют использование операторов сравнения при выборке данных. Однако они с успехом используются при обновлении (UPDATE) И у д а л е н и и ( D E L E T E ) строк т а б л и ц .
Битовые операторы Этот тип операторов предназначен для проведения побитовых операций над целочисленными значениями. Битовые операторы указываются между двумя целочисленными выражениями. В Transact-SQL могут использоваться приведенные ниже битовые операторы: П Битовое "И" (Bitwise AND) — &. Если каждый из соответствующих битов обоих выражений равен 1, то соответствующий бит возвращаемого значения будет равен 1. Во всех остальных случаях соответствующий бит результата устанавливается в 0. • Битовое "ИЛИ" (Bitwise OR) — |. Если хотя бы один из соответствующих битов любого из выражений равен 1, то в возвращаемом значении соответствующий бит также будет равен 1. Только когда каждый из соответствующих битов будет равен 0, то в итоговом значении бит устанавливается в 0. • Битовое исключающее ИЛИ (Bitwise Exclusive OR, XOR) — л . Если соответствующие биты равны, то в возвращаемом значении соответствующий бит будет установлен в 0. В остальных случаях бит устанавливается в 1. Выражения, участвующие в битовых операциях, могут быть типа данных i n t (4 байта), smallint (2 байта), t i n y i n t (1 байт), binary (ДО 8 КБаЙт), varbinary (до 8 КБайт) и b i t (1 бит). Однако только один из операндов выражения может иметь тип данных binary или varbinary. Возвращаемое значение имеет тип данных, соответствующий наибольшему типу данных. Например, если в выражении присутствуют операнды типа данных i n t и smallint, то возвращаемый результат будет ИМеТЬ ТИП ДаННЫХ i n t ; ДЛЯ ТИПОВ данНЫХ t i n y i n t И s m a l l i n t
будет возвращено значение типа smallint и т. д. При использовании операндов типа binary или varbinary значение все равно будет иметь тип данных i n t , smallint ИЛИ tinyint.
Рассмотрим пример битовых операторов: SELECT 0x7FFFFFFF+0, 0x02435253026534224001+0, 0x02435253026534224001 | 2 SELECT 1 Л 1, 1 Л 2 , 3| (-127), 15 Л 7, 15 Л 22, 15&22, 15122
Будет возвращен следующий результат: 2147483647 874659841 (1 row(s) affected)
874659843
0 3 -125 (1 row(s) affected)
8
25
6
31
1078
Часть V. Программирование
Логические операторы Операторы этого типа, как и операторы сравнения, возвращают значение TRUE или FALSE и могут использоваться в любых командах, работающих с логическими значениями. Некоторые логические операторы могут быть представлены в виде комбинации одного или более операторов сравнения, являясь своего рода надстройкой над ними. Замена множества операторов сравнения одним логическим оператором делает программирование на Transact-SQL более удобным и функциональным. К логическим операторам Transact-SQL относятся следующие операторы: • NOT. Выполняет отрицание логического выражения. То есть, если логическое выражение имело значение TRUE, TO будет возвращено FALSE И наоборот. Оператор NOT может использоваться как составная часть других операторов. Синтаксис оператора NOT таков: [NOT] boolean_expression
Приведем пример работы оператора NOT: IF (1=1) PRINT 'TRUE' ELSE PRINT 'FALSE' IF NOT (1=1) PRINT 'TRUE' ELSE PRINT 'FALSE'
Будет выведен следующий результат: TRUE FALSE
• AND. Оперирует с двумя логическими выражениями. Если оба выражения равны TRUE, то будет возвращено значение TRUE. ВО всех остальных случаях возвращается FALSE.
• OR. Оперирует с двумя логическими выражениями. Если хотя бы одно из выражений равно TRUE, то будет возвращено TRUE. Значение FALSE будет возвращено только в том случае, когда оба выражения равны FALSE. L~J BETWEEN. Этот оператор возвращает TRUE, если проверяемое значение лежит в указанном диапазоне. В противном случае возвращается FALSE. Оператор BETWEEN может быть легко заменен двумя операторами сравнения, объединенными в одно выражение с помощью оператора AND. Синтаксис оператора BETWEEN: test_expression [NOT] BETWEEN begin_expression AND end_expression
Аргумент t e s t e x p r e s s i o n определяет выражение, которое будет проверяться на соответствие диапазону. Начальное значение диапазона задается с помощью аргумента begin_expression, конечное — с помощью аргумента end_expression. При использовании оператора BETWEEN следует учитывать, что если проверяемое выражение совпадает с границами диапазона, то будет возвращено TRUE.
Приведенный ниже пример производит выборку всех названий книг, цена которых находится в диапазоне от 12 до 20: SELECT price, title FROM titles WHERE price BETWEEN 12 AND 20
Глава 25. Основы Transact-SQL
1079
Будет возвращен следующий результат: price 19.9900 19.9900 19.9900 20.0000 19.9900 14.9900 (6 row(s)
title The Busy Executive's Database Guide Straight Talk About Computers Silicon Valley Gastronomic Treats Secrets of Silicon Valley Prolonged Data Deprivation: Four Case Studies Sushi, Anyone? affected)
Аналогичного результата можно добиться при использовании следующего запроса: SELECT price, title FROM titles WHERE price>=12 AND price<=20
О ALL. Сравнивает скалярное значение со всеми значениями в наборе. Если условие выполняется для всех значений набора, то возвращается TRUE. В противном случае возвращается FALSE. ПОЛНЫЙ синтаксис команды ALL: scalar_expression
{ = | о | ! = 1 > I > = 1 ! > 1 < I < = | ! < } ALL ( s u b q u e r y )
Аргумент s c a l a r e x p r e s s i o n задает скалярное выражение, которое будет сравниваться со всеми значениями набора данных (subquery). Набор данных для оператора ALL может задаваться только с помощью подзапроса, возвращающего единственный столбец с типом данных, соответствующим сравниваемому скалярному выражению. Приведенный ниже пример дает ответ на вопрос, есть ли в таблице authors хоть один автор, проживающей в Москве: IF ('Moscow' ! = ALL (SELECT city FROM authors)) PRINT 'Нет автора из Москвы' ELSE PRINT 'Как минимум один автор из Москвы'
^Замечание Некоторые логические операторы являются взаимозаменяемыми. Например, приведенный пример можно легко переделать на использование оператора I N ИЛИ E X I S T S , которые будут рассмотрены далее. Выбор конкретного оператора лежит на разработчике. Тем не менее, оптимизатор запросов SQL Server 2000 может при необходимости выполнить замену некоторого оператора на другой, обеспечивающий более высокую производительность.
П ANY и SOME. Эти два оператора эквивалентны. Можно использовать любой из них. Оператор сравнивает указанное скалярное выражение со всеми значениями набора и возвращает TRUE, если логическое условие выполняется хотя бы для одного значения набора. Если же условие не выполняется ни для одного значения набора, то возвращается FALSE. Как и для команды ALL, набор данных для рассматриваемых операторов может задаваться только с помощью подзапроса. Полный синтаксис операторов следующий: s c a l a r expression
{ =|<>|!=|>I>=|!>I
{SOME | ANY}
(subquery)
1080
Часть V. Программирование
Попробуем решить описанную в предыдущем пункте задачу с помощью оператора ANY: IF ('Moscow' = ANY (SELECT city FROM authors)) PRINT 'Как минимум один автор из Москвы' ELSE PRINT 'Нет автора из Москвы'
•
IN. С помощью этого оператора можно определить, совпадает ли указанное выражение хотя бы с одним значением набора. Оператор IN является своего рода аналогом оператора = ANY, однако обладает некоторыми преимуществами. В частности, в качестве проверяемого значения допускается использовать не только скалярные величины, но и любые выражения. Кроме того, для формирования набора данных может применяться не только подзапрос, но и простое перечисление величин через запятую. Полный синтаксис оператора IN: test_expression
[NOT] IN ( s u b q u e r y
| expression
[,...n])
Приведем пример вызова оператора IN: IF
('Moscow' IN (SELECT c i t y FROM a u t h o r s ) ) PRINT 'Как минимум один автор из Москвы' ELSE PRINT 'Нет автора из Москвы'
Часто оператор IN служит для ограничения диапазона выборки в конструкции WHERE. В приведенном ниже примере выводится список всех книг и их типов, написанных авторами проживающими в штатах Минесота, Канзас и Юта: SELECT title, type FROM titles WHERE title_id IN (SELECT title_id FROM authors, titleauthor WHERE state IN ('IN1, 'UT', 'KS') AND titleauthor.au_id=authors.au_id)
Будет получен следующий результат: title
type
The Gourmet Microwave Is Anger the Enemy? Life Without Fear (3 row(s) affected)
mod_cook psychology psychology
• EXISTS. Этот оператор возвращает TRUE, если подзапрос возвращает хоть одну строку, и FALSE в противном случае. Оператор EXISTS может с успехом заменить оператор ANY, однако он обладает дополнительными преимуществами. Например, с помощью оператора ANY МОЖНО задать только одно логическое условие, тогда как с помощью оператора EXISTS МОЖНО проверить существование данных, удовлетворяющих множеству условий. Синтаксис оператора EXISTS следующий: EXISTS subquery
Глава 25. Основы Transact-SQL
1081
Проверка существования автора, проживающего в Москве, с помощью оператора EXISTS может быть выполнена так: IF EXISTS (SELECT * FROM authors WHERE city='Moscow') 1 PRINT 'Как минимум один автор из Москвы ELSE PRINT 'Нет автора из Москвы' р
Замечание Оператор E X I S T S возвратит TRUE, даже если подзапрос вернет единственную строку, во всех столбцах которой будет N U L L .
LIKE. Этот оператор используется в командах сканирования для поиска значений по заданному шаблону. Если выражение совпадает с шаблоном, то возвращается TRUE, В противном случае возвращается FALSE. Синтаксис оператора LIKE следующий: match_expression [NOT] LIKE pattern [ESCAPE escape_character]
Аргумент m a t c h e x p r e s s i o n задает выражение, которое будет сравниваться с шаблоном. Сам шаблон назначается с помощью аргумента p a t t e r n . В шаблоне могут присутствовать специальные символы: •
Символ %, которому соответствует любое количество любых символов (в т. ч. и ни одного) в сравниваемом выражении. SELECT city FROM authors WHERE city LIKE 'Sa%' Будет выведен следующий результат: city San Jose San Francisco Salt Lake City Salt Lake City
Символ _, вместо которого может быть подставлен один произвольный символ сравниваемого выражения. SELECT city FROM authors WHERE city LIKE '_al%' Будет выведен следующий результат: city Palo Alto Walnut Creek Palo Alto Salt Lake City Salt Lake City
Символы [ ]. Вместо квадратных скобок может подставляться один символ из указанного набора. Набор разрешается задавать как перечислением всех возможных значений (например, [abfhjer]), так и указанием диапа-
1082
Часть V. Программирование
зона (например [a-f]). Допускается комбинирование обоих типов перечисления значений. SELECT city FROM authors WHERE city LIKE '_[aldf]1%[o-sr]' Будет выведен следующий результат: city Palo Alto Palo Alto
Символы [ А ] . В этом случае в сравниваемом выражении допускается наличие любого символа, не входящего в указанный набор. Набор может определяться как перечислением всех символов, так и указанием диапазона. Допускается комбинирование обоих типов перечисления значений. SELECT city FROM authors WHERE city LIKE r _[ A erta]%[ A a-ghj]' Будет выведен результат: city Cove1о Corvallis Ann Arbor .
Как видно, некоторые символы (%,_,[, Л и ]) зарезервированы для применения в качестве служебных. Использование их в качестве обычных символов, участвующих в поиске, возможно только при указании специального управляющего символа (escape character). Этот символ задается с помощью ключевого слова ESCAPE, непосредственно после которого и указывается управляющий символ. По умолчанию управляющий символ не применяется, и его значение не определено. Хотя использование управляющего символа разрешает наличие служебных символов, сам управляющий символ становится служебным. Чтобы задать его в шаблоне, необходимо дважды указать его. В приведенном ниже примере выполняется поиск по шаблону, содержащему символ %, а в качестве управляющего используется символ &: SELECT * FROM order WHERE Discount LIKE 4[2-7]&% max' ESCAPE '&'
Управляющие конструкции и команды Некоторые команды Transact-SQL являются довольно сложными и предназначены для работы с определенными объектами базы данных. Такие команды рассматриваются в соответствующих главах книги. Например, команда SELECT, С ПОМОЩЬЮ которой осуществляется выборка данных, будет рассмотрена в главе 29. Далее будет рассмотрено использование следующих команд: О BEGIN ... END — операторные скобки; •
I F ... ELSE — ветвление алгоритма;
•
WHILE ... CONTINUE —ЦИКЛ;
Глава 25. Основы Transact-SQL •
1083
GOTO — оператор перехода;
П USE — оператор переключения базы данных; •
WAIT FOR — оператор приостанова;
•
GO — оператор конца пакета команд.
BEGIN.
..END
Конструкция BEGIN...END предназначена для объединения двух и более команд в единый блок, воспринимаемый сервером как одно целое. В частности, подобная группировка команд используется при работе с циклами и командами ветвления. Как команды ветвления, так и команды цикла позволяют работать лишь с одной командой. Следующая команда будет восприниматься как команда, не относящаяся к циклу или блоку ветвления. В приведенном ниже примере команда SELECT 10 обрабатывается независимо от того, какое значение имеет переменная @vari. Тогда как команда SELECT 'Первая часть месяца' будет выполнена только в том случае, когда выполняется логическое условие. DECLARE @Varl datetime IF DATEPART(dd,@Varl)<=15 SELECT 'Первая часть месяца' SELECT 10
Чтобы обеспечить выполнение команды SELECT Ю В зависимости от логического условия, необходимо воспользоваться конструкцией BEGIN...END: DECLARE @Varl datetime IF DATEPART(dd,@Varl)<=15 BEGIN SELECT 'Первая часть месяца' SELECT 10 END
Для облегчения визуального восприятия введенного кода служит выделение команд, содержащихся внутри конструкции BEGIN...END, а также собственно конструкции BEGIN...END, пробелами. Такое выделение позволяет достаточно легко читать код. Допускается создание вложенных конструкций BEGIN...END. SQL Server 2000 практически не ограничивает глубину вложенности конструкций. Однако на практике вложенность обычно не превышает 5—7 уровней. В конструкции BEGIN...END могут встречаться команды ветвления, организовываться циклы, создаваться транзакции и т. д. IF...ELSE Посредством конструкции IF...ELSE В Transact-SQL реализуется ветвление алгоритмов. Типичным примером такого ветвления является выполнение набора команд в зависимости от соблюдения какого-то условия. Например, добавлять в таблицу строку с описанием человека скорее всего не имеет смысла, если такая
1084
Часть V. Программирование
информация уже существует. Подобных примеров множество и этот список легко продолжить. Синтаксис конструкции IF...ELSE следующий: IF Boolean_expression { sql_statement I statement_block } [ ELSE { sql_statement I statement_block } ]
С помощью аргумента Boolean_expression определяется логическое выражение, от результата вычисления которого будет зависеть выполняемый набор команд. Если логическое выражение возвращает значение TRUE (истина), то выполнен набор команд, располагающийся непосредственно после логического выражения. Точнее говоря, будет выполнена лишь одна команда. Если требуется выполнить блок команд, то необходимо воспользоваться конструкцией BEGIN...END, как это было описано в предыдущем разделе. После ключевого слова ELSE находится команда, которая будет выполнена в случае возвращения логическим условием значения FALSE (ЛОЖЬ). Указание этой части необязательно. Если необходимо выполнение более одной команды, то также следует воспользоваться конструкцией BEGIN...END. Следует быть внимательным при использовании в логическом условии значения NULL. Дело в том, что сравнение этого значения не всегда возвращает TRUE при вычислении выражения NULL=NULL. Значение TRUE возвращается только в случае установки в OFF параметра ANSI_NULLS: SET ANSI_NULLS OFF
WHILE...CONTINUE
Посредством команды WHILE В Transact-SQL организуется цикл. Сразу отметим, что в SQL Server 2000 имеется всего один тип цикла — с предусловием, который и реализуется с помощью команды WHILE. Заметим, что во многих других языках в распоряжении пользователя имеется до трех типов циклов. Несмотря на это, можно довольно легко реализовывать любые циклы. Рассмотрим синтаксис команды WHILE: WHILE Boolean_expression { sql_statement I statement_block } [ BREAK ] { sql_statement I statement_block } [ CONTINUE ]
С помощью параметра Boolean_expression указывается логическое условие. Цикл будет выполняться до тех пор, пока условие возвращает значение TRUE. Предполагается, что в условии участвуют функции или переменные, значения которых меняются в ходе выполнения цикла. Однако можно организовывать и бесконечные циклы, указав в качестве условия цикла выражение типа 1=1. Выход из такого цикла должен осуществляться принудительно с помощью коман-
Глава 25. Основы Transact-SQL
1085
ды BREAK, которая должна выполниться в теле цикла (обычно опять же в зависимости от логического условия). Команда WHILE работает с единственной командой. Если же необходимо указать большее . количество команд, то потребуется использовать конструкцию BEGIN...END. В этом случае тело цикла будет представлено всеми командами, объединенными с помощью конструкции BEGIN...END. Команда CONTINUE позволяет начать новый виток цикла, не дожидаясь выполнения всех команд цикла. В качестве примера рассмотрим цикл, вычисляющий логарифм значения, хранящегося в переменной @аа (в примере это 5): DECLARE @aa int, gfact bigint SET @aa=5 SET @Fact=l WHILE @aa>0 BEGIN SET @Fact=@Fact*@aa SET @aa=@aa-l END SELECT @Fact
После выполнения этого примера будет возвращен следующий результат: 120 (1 row(s)
affected)
Можно несколько сократить приведенный пример: DECLARE @aa int, @fact bigint SELECT @aa=5, @Fact=l WHILE @aa>0 SELECT @Fact=@Fact*@aa, @aa=@aa-l SELECT @Fact
GOTO Рассматриваемая команда предназначена для выполнения перехода на указанную метку (label). Метки представляют собой символьную строку, удовлетворяющую стандартным правилам именования объектов. После имени метки ставится символ двоеточия, который и свидетельствует о том, что соответствующая строка является меткой. При выполнении оператора GOTO следует указать только имя метки без символа двоеточия. В качестве примера, демонстрирующего использование команды GOTO, рассмотрим организацию цикла с постусловием, выполняющего вычисление факториала: DECLARE @aa int, @fact bigint SELECT @aa=5, @Fact=l cikl:
Часть V. Программирование
1086 SELECT @Fact=@Fact*@aa, @aa=@aa-l I F @аа>1 GOTO c i k l SELECT @Fact
Команда GOTO существует практически во всех языках программирования. Тем не менее, ее использование считается плохим тоном, т. к. это нарушает принципы структурного программирования. Практически во всех ситуациях можно обойтись без использования команды GOTO.
USE Все команды выполняются в контексте какой-то базы данных. Такая база данных называется текущей. При обращении к объектам текущей базы данных не требуется указание ее имени. Например, если текущей является база данных pubs, то обращение к таблице authors этой базы данных можно осуществить следующим образом: SELECT * FROM a u t h o r s
Но когда работа с этой же таблицей ведется в контексте иной базы данных, чем pubs, то нужно явно указать имя базы данных: SELECT * FROM pubs..authors
Замечание
j
Доступ к объектам был подробно рассмотрен в разд. "Доступ к объектам" главы 18. Для переключения текущей базы данных как раз и служит команда USE. Например, для выбора в качестве текущей базы данных pubs необходимо указать: USE
pubs
WAITFOR
Данная команда предназначена для организации паузы. Ее синтаксис таков: WAITFOR { DELAY ' t i m e '
| TIME ' t i m e '
}
При указании ключевого слова TIME выполнение команд будет остановлено до указанного времени (абсолютная точка). Если же требуется приостановить работу лишь на определенный отрезок времени (относительная точка), то необходимо использовать ключевое слово DELAY. С помощью параметра ' t i m e ' указывается интервал времени, на который сервер приостановит выполнение команд в соединении. В качестве примера рассмотрим приостанов на 23 минуты 17 секунд: WAITFOR DELAY
'23:17'
Теперь же остановим выполнение команд до 6 часов вечера: WAITFOR TIME 48:00'
Глава 25. Основы Transact-SQL
1087
GO Клиент отправляет серверу команды на выполнение так называемыми пакетами (batch). После работы всех команд пакета (или в ходе выполнения пакета) сервер возвращает клиенту результат. После этого клиент может отправить следующий пакет. При работе с Query Analyzer в качестве пакета рассматривается набор команд, которые пользователь выделил и запускает на выполнение. Если в окне ничего не выделено, то будут выполнены все команды, имеющиеся в окне. Однако некоторые из них должны запускаться отдельно от других команд. К таким командам можно отнести команды CREATE, С ПОМОЩЬЮ которых выполняется создание объектов базы данных, команды BACKUP И RESTORE, предназначенные, соответственно, для выполнения создания и восстановление резервных копий баз данных, а также некоторые другие команды. При работе с Query Analyzer такие команды просто выполняются отдельно. Тем не менее, можно явно разделить весь набор команд на отдельные пакеты. Для этого просто-напросто с помощью ключевого слова GO необходимо определить конец пакета. Заметим однако, что локальные объекты (переменные, курсоры, таблицы и т. д.) существуют в пределах пакета. Например, следующий код будет работать при выполнении его как одного пакета: DECLARE @aa int SET @aa=10 SELECT @aa
Попробуем же эти команды разделить на два пакета: DECLARE @aa int SET @aa=10 GO SELECT @aa
Будет выдано следующее сообщение об ошибке, свидетельствующее об уничтожении локальной переменной @аа: Server: Msg 137, Level 15, State 2, Line 1 Must declare the variable '@aa'.
Глава 26
Типы данных SQL Server 2000 В предыдущей главе рассматривалось использование переменных. При объявлении переменной с помощью команды DECLARE необходимо указать ее тип данных. Тип данных определяет, какая информация может храниться в переменной, и какие операции могут выполняться над этими данными. В общем, понятие и использование типов данных в Transact-SQL соответствуют большинству современных языков. Типы данных играют большую роль при работе с таблицами. Каждый столбец должен иметь конкретный тип данных. В одной таблице может быть множество столбцов как с одинаковыми, так и с различными типами данных. Наконец, типы данных активно используются при работе с хранимыми процедурами, определяя вид значений, указываемых при вызове. В SQL Server 2000 набор типов данных несколько расширен по сравнению с предыдущей версией SQL Server — добавлены типы данных b i g i n t , t a b l e и sql_variant. В итоге в распоряжении пользователей имеется набор из 27 встроенных типов данных. На основе некоторых из них могут быть созданы новые типы данных, называемые пользовательскими (user-defined). Примером такого ТИПа ДаННЫХ МОЖеТ СЛУЖИТЬ ТИП sysname (осНОВаННЫЙ На nvarchar (128)), активно применяемый в системных таблицах для хранения имен объектов. Типы данных SQL Server 2000 можно разбить на следующие группы: • целочисленные (Integers) — b i g i n t , i n t , smaiiint и tinyint; • нецеЛОЧИСЛенные (Decimal) — decimal, numeric, f l o a t И r e a l ; • Денежные (Money) — money И smallmoney; • дата И Время (Date and Time) — datetime И smalldatetime; О ДВОИЧНые (Binary) — binary, varbinary И image; • Строковые (String) — char, varchar, nchar И nvarchar; • текстовые (Text) — t e x t и ntext; О Специальные (Specials) — timestamp, uniqueidentifier, bit, cursor, table И sql_variant.
Целочисленные типы данных Числовые типы данных предназначены для хранения данных, над которыми ожидается проведение стандартных арифметических операций, а также исполь-
Глава 26. Типы данных SQL Server 2000
1089
зование в различных функциях, работающих с числовыми значениями. В принципе, ничто не мешает хранить числа в виде строки символов. Однако над такой строкой невозможно выполнять арифметические операции, так как для символьных строк допускается только склеивание их друг с другом. Числовые типы данных различаются по возможности хранения чисел со знаком (отрицательных), чисел с цифрами после запятой, по максимально допустимому количеству цифр до и после запятой и точности представления дробных чисел. В этом разделе будут рассмотрены целочисленные типы данных. В SQL Server 2000 поддерживаются следующие целочисленные типы данных: О b i g i n t — это новый тип данных, использующий для хранения данных 8 байт. В предыдущих версиях SQL Server самым большим целочисленным типом данных был i n t , сосотящий из 4 байт для хранения чисел. При работе с типом данных b i g i n t пользователи могут хранить числа в диапазоне от - 9 223 372 036 854 775 808 (-2 6 3 ) до 9 223 372 036 854 775 807 (2 6 3 ~1). •
i n t предназначен для хранения как положительных, так и отрицательных значений. Для хранения чисел в этом типе данных используется 4 байта или 32 бита, что обеспечивает 2 3 2 комбинаций (4 294 967 296). Для хранения собственно числа используется 31 бит, а крайний левый бит предназначен для указания знака числа. Если 32 бит установлен в 1, то число отрицательное. Тем самым обеспечивается хранение чисел в диапазоне от —231 до 2 31 —1, что соответствует интервалу —2 147 483 648 до 2 147 483 647.
•
small i n t , как и предыдущий тип, обеспечивает хранение и положительных, и отрицательных значений. Однако для представления чисел используется 2 байта (16 бит). Таким образом, в распоряжении пользователя имеется 65 536 комбинаций, что с учетом знака обеспечивает хранение чисел в диапазоне от —2 15 до 215—1 или соответствует интервалу от —32 768 до 32 767.
П t i n y i n t — это самый "маленький" из целочисленных типов данных, использующих для хранения чисел всего 1 байт. В отличие от двух предыдущих типов, не разрешает хранение информации о знаке числа. Таким образом, в распоряжении пользователя имеется 256 комбинаций (2 8 ), что соответствует интервалу от 0 до 255.
Нецелочисленные типы данных Типы данных этой группы применяются для хранения чисел с десятичной точкой. В SQL Server 2000 существует два вида нецелочисленных типов данных: П Десятичные (Decimal). Для хранения чисел этого типа они представляются в виде отдельных цифр, каждая из которых хранится отдельно. Для хранения каждой цифры отводится 4 бита. Хотя 4 бита обеспечивают 16 комбинаций, тем не менее, для хранения цифры используется всего 10 комбинаций (от 0 до 9). Кроме того, с помощью 1 байта можно сохранить всего 2 цифры, что обеспечивает представление чисел в диапазоне от 0 до 99. Однако с помощью 1 байта можно описать 256 комбинаций. Очевидно, что десятичные не-
1090
Часть V. Программирование
целочисленные типы данных не лучшим образом используют предоставленные ресурсы. Тем не менее, только такой подход обеспечивает точное представление чисел с десятичной точкой. Общее количество цифр и количество цифр после запятой для десятичных типов строго фиксировано. • Приблизительные (Approximately). Этот вид нецелочисленных типов данных обеспечивает хранение чисел в огромном диапазоне от бесконечно малых до предельно больших. Для этого число представляется в экспоненциальном формате — в виде мантиссы и порядка. Хотя такой подход обеспечивает оптимальное использование предоставляемых ресурсов (в отличие от десятичного вида), тем не менее, точность вычислений оставляет желать лучшего. Низкая точность вычисления связана именно с представлением числа в виде мантиссы и порядка. Мантисса является числом, которое необходимо умножить на 10 в степени, равной значению порядка. Обычно мантисса представляет собой положительное или отрицательное число в пределах от 1 до 9 и с множеством чисел после запятой. Порядок — это степень, в которую необходимо возвести число 10. После этого мантисса умножается на 10 в степени порядка. Полученный результат и является числом, с которым будут производиться расчеты. При записи числа в экспоненциальной форме сначала записывается мантисса, затем символ Е, обозначающий 10, после чего указывается порядок. Например, число —7,23453Е+215 в экспоненциальной форме соответствует обычному десятичному числу —7234530000000000 с общим количеством нулей равным 210. Низкая точность операций с числами в экспоненциальной форме связана с тем, что при несовпадении значений мантиссы приходится жертвовать точностью и округлять число. К десятичным типам данных относятся следующие типы данных: П decimal [ (p[,s] ) ] и numeric [ (p[,s]) ]. Эти два типа данных эквивалентны. При использовании десятичных типов данных необходимо явно указать общее количество цифр (в сумме до и после запятой), а также отдельно количество цифр после запятой. Общее количество цифр указывается с помощью аргумента р, тогда как количество цифр после запятой задается аргументом s. Значение аргумента р может лежать в пределах от 1 до 38. От значения р зависит количество байт, отводимых для хранения чисел, минимум отводится 2 байта, максимум — 17 байт. Аргумент s может достигать значения аргумента р, но не должен превышать его. По умолчанию значение аргумента s устанавливается равным 0, т. е. не поддерживается хранение цифр после запятой. Значение параметра р, если оно не задано явно, может динамически изменяться в зависимости от величины хранимого значения, что и демонстрирует следующий пример: DECLARE @Varl decimal, @Var2 decimal SET @Varl=1122334455667788.224234 SET @Var2=l SELECT @Varl, DATALENGTH(@Varl) . SELECT @Var2, DATALENGTH(@Var2) SET @Var2=1122334455667788.224234 SELECT @Var2, DATALENGTH(@Var2)
Глава 26. Типы данных SQL Server 2000
1091
Функция DATALENGTH возвращает количество байт, используемое для хранения указанного выражения. Будет получен следующий результат: 1122334455667788 (1 row(s) affected)
1 (1 row(s) affected)
1122334455667788 (1 row(s) affected)
9
К приблизительным типам данных относятся перечисленные ниже типы данных: •
f l o a t [ (п) ] . Аргумент п задает количество бит, необходимых для хранения мантиссы. Максимальное значение этого аргумента равно 53. Если значение п находится в диапазоне от 1 до 24, то для хранения числа используется 4 байта. Для диапазона от 25 до 53 отводится 8 байт. В первом случае достигается точность до 7 цифр, тогда как во втором — до 15 цифр. Как видно, особой экономии от применения минимального значения п нет. То есть для хранения, например, числа со значением п не более 9, будет отводиться столько же памяти, как и для хранения числа со значением п до 24. Если нет особых причин, то для обеспечения дополнительной точности лучше использовать крайние значения п — 24 или 53. С другой стороны, повышенная точность требует дополнительных ресурсов процессора при вычислениях. При значении п величина мантиссы может достигать 308, и допускается хранить числа в диапазоне от — 1,79Е+308 до 1,79Е+308. Значение мантиссы может быть как положительным, так и отрицательным. То есть можно хранить не только очень большие числа, но и очень малые.
•
r e a l . Этот тип данных является частным случаем типа float, а конкретнее это компактная запись типа данных float (24) со всеми вытекающими последствиями. Для хранения числа используется 4 байта, обеспечивается точность до 7 цифр. Само число может лежать в диапазоне от —3,40Е+38 до 3,40Е+38.
Денежные типы данных Эта группа типов данных предназначена для хранения чисел, представляющих информацию о деньгах. Денежные типы данных обеспечивают хранение до 4 цифр после десятичной точки. В SQL Server 2000 имеется два денежных типа: • money. Для хранения данных этого типа отводится 8 байт, что обеспечивает представление значений в диапазоне от - 2 6 3 (-922 337 203 685 477,5808) до 2 6 3 (+922 337 203 685 477,5807). Для хранения более точных или больших значений МОЖНО ИСПОЛЬЗОВать ТИП данных decimal ИЛИ numeric.
•
smalimoney. Этот тип данных является компактным вариантом типа данных money. Для данных используется 4 байта, что обеспечивает хранение чисел в диапазоне от - 2 3 1 (-214 748,3648) до 2 3 1 (+214 748,3647).
1092
Часть V. Программирование
Замечание Для денежных типов допускается использование специальных символов, обозначающих валюту, к которой принадлежит число. Например, сумма в 145 долларов и 17 центов может быть записана как $14 5 .17. В SQL Server 2000 имеется поддержка 18 символов национальных валют.
Типы данных "дата и время" Как следует из названия, типы данных этой группы служат для хранения информации о дате и времени. Конечно, для хранения этих данных можно легко использовать символьные строки, однако применение специализированных типов дает определенные преимущества. Например, можно легко сравнивать даты, выделять из них отдельные части (год, месяц, число, день недели, часы и т. д.), вычитать и складывать их и т. д. Поддержка этих операций встроена в TransactSQL. При работе с символьными строками необходимо будет реализовывать дополнительные алгоритмы обработки данных. В SQL Server 2000 имеются следующие типы данных для хранения информации о дате и времени: •
datetime. Для хранения данных применяются два 4-байтовых блока. Первые 4 байта хранят информацию о количестве дней, прошедших после базовой даты — 1 января 1753 года. В этот день были синхронизированы Григорианский и Юлианский календари, до этого отличавшиеся на 11 дней. Разработчики Microsoft посчитали, что хранение информации о более ранних датах нецелесообразно, так как в SQL Server 2000 нет поддержки разных календарей. При необходимости для хранения информации о более ранних датах можно использовать символьные строки или числовые значения. Вторые 4 байта предназначены для хранения информации о количестве миллисекунд, прошедших после полуночи. В итоге тип данных datetime позволяет хранить информацию о датах в интервале от 1 января 1753 года до 31 декабря 9999 года с точностью до 3,33 миллисекунды.
•
smaiidatetime. Этот тип данных использует в общей сложности 4 байта — два блока по 2 байта. Первые два байта отображают количество дней, прошедших после 1 января 1900 года. Два оставшихся байта применяются для хранения количества минут, прошедших после полуночи. Таким образом, тип данных smaiidatetime может использоваться для хранения дат в диапазоне от 1 января 1900 года до 6 июня 2079 года с точностью до 1 минуты.
Хотя данные о времени хранятся в специальном формате, тем не менее, для удобства была обеспечена работа с данными в символьном виде. В обшем виде информация о дате и времени указывается в формате "мм DD YYYY hh:mmAP/PM". Сервер автоматически выполняет преобразование символьной строки в специальный формат. Помимо указанного формата в Transact-SQL допускается применение множества других форматов даты и времени. В табл. 26.1 приведен обзор этих форматов.
Глава 26. Типы данных SQL Server 2000
1093 Таблица 26.1. Форматы указания даты и времени
Формат
Пример
mon dd yyyy hh:miAM/PM
'may
mm/dd/yy
'05/03/2001'
уу.тт.dd
'01.05.03'
dd/mm/yy
'03/05/01'
dd.mm.yy
'03.05.01'
dd-mm-yy
'03-05-01'
dd топ уу
' 0 3 may 0 1 '
топ dd,уу
'may 3 , 2 0 0 1 '
hh:mm:ss
'14:05:32'
mon dd yyyy hh:mi:ss:mmmAM/PM
•may 3 2 0 0 1 2 : 0 5 : 4 3 : 2 3 7 P M
mm-dd-yy
'05-03-01'
yy/mm/dd
'01/05/03'
yymmdd
'010503'
dd mon yyyy hh:mi:ss:mmmAM/PM
' 0 3 may 2 0 0 1 2 : 0 6 : 1 3 : 4 2 3 P M '
hh:mi:ss:mmm(24h)
'14:07:27:423'
yyyy-mm-dd hh:mi:ss(24h)
'2001-05-03
14:07:58'
yyyy-mm-dd hh:mi:ss.mmm(24h)
'2001-05-03
14:07:59.345'
Замечание
3 2001 2:04PM'
1
j
Некоторые форматы ввода даты и времени конфликтуют между собой, например, в форматах "dd-mm-yy" и "mm-dd-yy". Чтобы этого не происходило, в SQL Server 2000 разрешается одновременно использовать только один из конфликтующих форматов. Конкретный тип применяемого формата зависит от того, какой язык установлен в соединении. При использовании локальных языков формат ввода даты может существенно изменяться. Кроме того, при использовании локальных языков имя месяца также должно указываться на локальном языке. Например, английский вариант записи 'may 3 , 2 0 0 1 ' на русском языке будет выглядеть к а к ' 3 май 2 0 0 1 ' .
Двоичные типы данных Двоичные типы данных предназначены для хранения больших блоков двоичных данных. Некоторые данные в SQL Server 2000 хранятся не в виде целых чисел или строк, а непосредственно в виде блока двоичных данных. Примером таких данных может служить идентификатор безопасности (SID, Security ID) домена, для хранения которого может использоваться до 85 байт.
1094
Часть V. Программирование
В SQL Server 2000 поддерживаются следующие двоичные типы данных: П b i n a r y [ ( n ) ] . Этот тип данных позволяет хранить блоки двоичных данных размером от 1 до 8000 байт. Объем, занимаемый выражением типа данных binary, равен п+4. Аргумент п определяет количество байт, которые будут выделены для хранения данных. Для значений типа binary выделяется всегда фиксированное количество байт, независимо от того, какой реальный объем памяти необходим. Например, если столбец таблицы имеет тип данных b i nary (1000) , а пользователь хранит значения размером 100 байт, то в таблице все равно будет выделяться 1004 байта (1000+4) на столбец каждой строки.
Замечание Ограничение максимального размера двоичного блока (8000 байт) связано с размером страницы (8 Кбайт). Для типов данных b i n a r y и varbinary, как и для многих других типов данных, разбиение столбца на множество страниц невозможно. varbinary [ (n) ]. Как и предыдущий, этот тип данных обеспечивает хранение блоков от 1 до 8000 байт. Для хранения значений также используется объем памяти п+4 байт. Особенность же типа varbinary в том, что п определяет максимальное количество байт, которое может быть выделено для хранения значений. Однако, если для хранения выражения требуется меньшее количество байт, то будет выделено ровно столько байт, сколько необходимо. Применительно к рассмотренному примеру использование типа данных v a r b i nary дало бы экономию места 90%. Однако, хотя -использование типа данных varbinary дает экономию ресурсов, тем не менее, операции обработки значений этого типа занимают больше времени.
Замечание Приставка var в названии типа данных является сокращением от английского слова variable, что переводится как переменная (длина). Объекты типов данных с приставкой var занимают столько памяти, сколько реально занимает выражение. •
image. Типы данных binary и varbinary обеспечивают хранение блоков двоичных данных размером до 8000 байт. Во многих случаях этого объема вполне достаточно. Однако существует ряд задач, которые требуют наличия блоков данных большего размера. Например, при использовании SQL Server 2000 для хранения документов необходимо обеспечить возможность хранения данных объемом в несколько мегабайт. Для удовлетворения этих требований был разработан тип данных image, позволяющий хранить до 2 Гбайт данных (2 147 483 647 байт, 231—1). Максимальный размер не задается явно и зависит от реального размера данных. В таблице для значений типа данных image пространство выделяется страницами. То есть, если данные занимают 25 Кбайт, то для их хранения будет выделено 32 Кбайта (4 страницы). Даже если данные реально занимают всего несколько сотен байт, то все рано будет выделено 8 Кбайт. Тип данных image относится к так называемым "тяжелым" типам данных. Вставка, чтение и изменение таких данных ведется несколько иными методами, чем при работе с "нормальными" типами данных.
Глава 26. Типы данных SQL Server
(~
Замечание
2
0
0
0
1
0
9
5
^
Двоичные данные могут быть введены вручную в формате OXFFFF...FF. СИМВОЛЫ ОХ указывают, что далее следует набор двоичных данных в шестнадцатеричной форме. Эти два символа должны указываться всегда. Каждый байт описывается строго двумя символами: о—9 или А—F. Если первый символ байта равен нулю, он все равно должен быть указан. Например, десятичное число 59229 в шестнадцатеричном виде будет записано как 0xE7 5D, ЧТО занимает всего 2 байта.
Строковые типы данных Типы данных этой группы служат для хранения символьных строк. В принципе, текстовая информация может быть сохранена в виде двоичных данных, однако хранение символьных данных в специализированных форматах обладает рядом преимуществ. В частности, при выполнении запросов символьные данные можно просмотреть визуально. При работе с символьными типами данных в распоряжении разработчиков имеются специальные функции, реализующие большинство операций обработки данных. Замечание В Transact-SQL имеется более 20 функций, предназначенных для работы с текстовыми строками. Работа с этими функциями будет рассмотрена в следующей главе.
К строковым типам SQL Server 2000 относятся типы данных: •
c h a r [ ( n ) ] . Этот тип данных позволяет хранить до 8000 знаков в формате ASCII. Этот формат использует 1 байт для представления каждого символа, что обеспечивает поддержку 256 символов. Таким образом, максимальный объем ограничен 8000 байтами, что связано с размером страницы. Для сравнения, в SQL Server 6.x тип данных char позволял хранить строки длиной до 255 символов, хотя размер страницы составлял 2 Кбайта. Аргумент п определяет количество символов, которое разрешается хранить. Независимо от того, какая реальная длина строки, всегда будет резервироваться фиксированное количество памяти. Если в столбце таблицы зарезервировано 4000 символов, а реально хранится всего 50 символов, то неиспользуемое пространство будет заполнено пробелами.
• varchar [ (n) ]. Как и предыдущий, тип данных varchar обеспечивает хранение блоков данных до 8000 символов в стандарте ASCII. Отличие этого типа данных от char в том, что аргумент п определяет не конкретный объем памяти, выделяемый для хранения значений, а максимально возможное количество символов. Реальный же размер памяти, занимаемый значением, соответствует его длине. Например, если столбец имеет тип данных varchar (300), а сохраненное значение имеет длину всего лишь 70 символов, то в таблице будет выделено 70 байт, а не 300, как это было бы для типа данных char (300). П nchar[ (n) ]. В отличие от двух предыдущих типов, тип данных nchar обеспечивает хранение текста в формате Unicode. В стандарте Unicode для представ-
1096
Часть V. Программирование
ления каждого символа используется 2 байта, что обеспечивает поддержку 65 536 символов. Это значительный прогресс по сравнению со стандартом ASCII. Теперь пользователи могут легко хранить тексты на любом национальном ЯЗЫКе. Однако, Как И ДЛЯ ТИПОВ ДаННЫХ char И varchar, ДЛЯ ТИПа nchar может быть выделен максимальный блок размером в 8000 байт. Так как один символ представлен 2 байтами, то максимальная длина текстового блока типа данных nchar составляет 4000 символов. Выделение памяти для объектов типа данных nchar выполняется аналогично типу char. To есть отводится фиксированный размер памяти (пх2 байт), независимо от реального размера данных.
Замечаний Символ п в начале имени типа данных означает, что этот тип данных поддерживает стандарт Unicode. О nvarchar [ (п) ]. Этот тип данных относится к типу nchar так же, как тип varchar относится к типу char. To есть тип данных nvarchar обеспечивает хранение текстовых строк в формате Unicode максимальной длиной до 4000 символов (8000 байт). При этом для объектов этого типа отводится ровно столько памяти, сколько реально занимает значение.
Текстовые типы данных Типы данных этой группы очень близки строковым типам данных. Обе группы типов данных предназначены для хранения текстовых блоков данных. Однако размер строковых типов данных ограничен 8000 байтами. Конечно, для большинства задач этого достаточно, не все же иногда бывает необходимо хранить довольно большие блоки текстовой информации. Например, можно с уверенностью сказать, что сохранить несколько сотен страниц книги в любом строковом типе данных не получится. Решением этой задачи будет использование текстовых типов данных, обеспечивающих хранение очень больших объемов текста. В SQL Server 2000 поддерживаются следующие текстовые типы данных: •
t e x t . Этот тип данных обеспечивает хранение блоков текстовых данных размером до 231—1 символов (2 147 483 647). При этом для представления каждого символа используется 1 байт. Даже во время применения кодовых страниц, использующих двухбайтовое представление символа, данные типа данных t e x t хранятся в однобайтовом представлении.
•
ntext. В отличие от предыдущего типа данных, применение типа данных ntext позволяет работать с двухбайтовым представлением символов. Это дает набор из 65 536 символов, что позволяет хранить текст практически на любом национальном языке. Хотя для типа данных ntext, как и для типа данных t e x t , доступно максимум 2 147 483 647 байт. Тем не менее, максимальное количество символов составляет 230—1 (1 073 741 823).
Работа с текстовыми типами данных отличается от работы с остальными типами данных. Как и тип image, типы данных t e x t и ntext относятся к так называв-
Глава 26. Типы данных SQL Server 2000
1097
мым "тяжелым" типам данных. Для работы с этими тремя типами данных служат специальные функции и команды. Кроме того, не допускается создание переменных, имеющих типы данных next, ntext или image.
Специальные типы данных К специальным относятся типы данных, которые нельзя отнести ни к одному из предыдущих типов данных. Специальные типы данных имеют специфическое назначение, часто узко специализированное. В SQL Server 2000 имеются следующие специальные типы данных: •
timestamp. Этот тип данных переводится как "временной штамп" и предназначен для отслеживания последовательности изменения строк таблиц базы данных. Тип данных timestamp не имеет ничего общего с типами данных datetime И smalldatetime. Кроме ТОГО, пользователь не обладает ВОЗМОЖНОСТЬЮ изменять или явно задавать значения столбцов с типом данных timestamp. В любой таблице может быть создан столбец, имеющий тип данных timestamp. Однако в каждой таблице может быть только один такой столбец. Если его имя не задано явно, то по умолчанию присваивается имя timestamp. Каждый раз при вставке новой или изменении существующей строки в таблице со столбцом timestamp сервер автоматически вставляет в столбец timestamp новое значение. Это значение уникально в пределах базы данных и монотонно возрастает на 1 каждый раз при вставке очередного значения. Уникальность значения timestamp в пределах базы данных гарантирует, что ни в каких любых двух таблицах базы данных не будет двух строк с одинаковым значением в столбце timestamp. Тип данных timestamp активно применяется при репликации транзакций и может быть с успехом использован разработчиками. Текущее значение счетчика timestamp хранится в глобальной переменной @@DBTS. ДЛЯ хранения типа данных timestamp требуется 8 байт.
•
u n i q u e i d e n t i f i e r . Название этого типа данных можно перевести как уникальный идентификатор, тогда как полное название типа глобальный уникальный идентификатор (GUID, Global Unique Identifier). Тип данных timestamp обеспечивает уникальность данных в пределах базы данных, однако иногда такого диапазона уникальности бывает недостаточно. Например, при работе с базами данных, располагающимися на разных серверах, обеспечить уникальность данных с помощью типа данных timestamp невозможно, т. к. каждый из серверов ведет свой счетчик, не синхронизированный с другими серверами. Тип данных u n i q u e i d e n t i f i e r был разработан специально для того, чтобы обеспечить пользователей и разработчиков механизмом уникальной идентификации данных в пределах планеты. Для хранения идентификатора необходимо 16 байт. Сам же идентификатор может быть представлен в формате хххххххх-хххх-хххх-хххх-хххххххххххх, где хх обозначает 1 байт. В SQL Server 2000 имеется функция NEWIDO, которая генерирует новый глобальноуникальный идентификатор. Для генерации идентификатора, в частности, применяются номер сетевой карты и текущее значение времени внутри процессора в миллисекундах. Сетевым картам присваиваются номера, уникаль-
1098
Часть V. Программирование
ные в пределах планеты. В совокупности с количеством миллисекунд это позволяет говорить о том, что вероятность генерации двух одинаковых идентификаторов даже в пределах планеты чрезвычайно низка. Глобальные униг кальные идентификаторы активно используются репликацией сведением. Замечание Уникальность может быть нарушена при применении эмуляторов сетевых карт, модемов, работающих как сетевые карты, или других подобных устройств. •
b i t . Как не трудно догадаться, этот тип данных занимает всего 1 бит и часто служит для хранения значений, которые могут принимать всего два значения. Примером может служить пол (мужской-женский), женат человек или нет и т. д. Также тип данных b i t активно используется для представления значений "Yes/No", "On/off", "True/False" И Т. Д.
•
cursor. Этот тип данных участвует при работе с курсорами в качестве абстрактного указателя, которому позже может быть сопоставлен конкретный набор данных. Часто такой подход используется при работе с хранимыми процедурами. Пользователь создает переменную типа данных cursor и подает ее как параметр на вход хранимой процедуры. Внутри хранимой процедуры создается конкретный курсор, который и сопоставляется внешней переменной. Таким образом, из хранимой процедуры можно передавать наборы данных.
•
t a b l e . Рассматриваемый тип данных, как и следующий, значительно расширяют возможности пользователей при работе с Transact-SQL. Это два принципиально новых типа данных. Ничего подобного в предыдущих версиях не было. Тип данных t a b l e используется только для переменных и позволяет хранить в них сложные наборы данных. Можно сравнить переменную типа данных t a b l e с временной таблицей. Однако переменная t a b l e может использоваться в качестве параметра хранимой процедуры или функции. Работа же с такой переменной осуществляется стандартными средствами, применяемыми при работе с обычными таблицами, т. е. с помощью команд SELECT, UPDATE, INSERT и DELETE. Объявление переменной типа t a b l e имеет
некоторую специфику, т. к. необходимо определить структуру объявляемой переменной. В общем случае объявление переменной t a b l e выполняется точно так же, как и создание таблицы командой CREATE TABLE: DECLARE @tbl table (GID bigint IDENTITY (1000,1), Lname nvarchar(30), Fname nvarchar(30) , Sname nvarchar(30), Birth smalldatetime)
Работа же с созданной переменной ведется точно так же, как с обычной таблицей: INSERT INTO @tbl VALUES ('Степанов', 'Игорь', 'Семенович', SELECT * FROM @tbl
•
'1-01-1955')
s q l _ v a r i a n t . Этот тип данных позволяет хранить значения других типов данных. Тип данных sql_variant можно использовать как для локальных переменных, так и для столбцов таблиц. Таким образом, в столбце с типом данных s q i v a r i a n t можно хранить целочисленные, строковые величины, а
Глава 26. Типы данных SQL Server 2000
1099
также значения с датой и временем. Приведем пример использования типа данных sql_variant: DECLARE @aa s q l _ v a r i a n t , @bb i n t , @cc n v a r c h a r ( 1 0 ) , @dd money SELECT @bb=1010, @ c c = ' S t r i n g ' , @dd=$103.45 SET @aa=@bb SELECT @aa SET @aa=@cc SELECT @aa SET @aa=@dd SELECT @aa
Будет возвращен следующий результат: 1010 (1 row(s)
affected)
String (1 row(s)
affected)
103.4500 (1 row(s)
affected)
Преобразование типов данных Нередко приходится выполнять преобразование данных, хранящихся с использованием одного типа данных, в данные другого типа. Например, номер телефона может храниться в целочисленной переменной, но в таблице номер телефона преобразуется в символьное значение с использованием определенного шаблона. Преобразование типов данных в Transact-SQL выполняется при помощи одной из двух следующих функций: CAST(expression AS data_type) CONVERT (data_type[(length)], expression
[, style])
Возможности, обеспечиваемые обеими функциями, примерно одинаковы. Однако команда CONVERT предлагает более широкие возможности для преобразования значений В ТИПЫ данных smalldatetime И datetime. С помощью параметра expression задается выражение, значение которого должно быть преобразовано в указанный тип данных. Новый тип данных указывается с помощью параметра d a t a t y p e . Параметр s t y l e позволяет определить, какой формат даты имеет выражение expression. Приведенная ниже команда выполняет преобразование значения целочисленной переменной в символьное значение. DECLARE @Varl int SET @Varl=1693 SELECT CASE(@Varl AS nvarchar(10))
Глава 27
Функции SQL Server 2000 В SQL Server 7.0 и более ранних версиях в распоряжении пользователя имелся набор встроенных функций, которые писались программистами Microsoft, и набор которых был фиксирован. Пользователь не мог создавать свои собственные функции. Конечно, в его распоряжении имелись хранимые процедуры, в качестве которых и можно было реализовывать часто используемые алгоритмы. Однако очевидным недостатком хранимых процедур является невозможность их применения в выражениях. При выполнении сложных обновлений или выборки данных, требующих запуска сложных алгоритмов, не реализуемых в пределах запроса, нужно было использовать курсоры или другие механизмы, позволяющие обращаться к хранимым процедурам. Конечно, было бы гораздо удобнее обращаться к нужным алгоритмам непосредственно в теле запроса, как это происходит при работе со встроенными функциями. Например, можно непосредственно в теле запроса выполнить преобразование типов данных, выделить подстроку из строки, возвести число в степень, проверить вхождение подстроки в строку и т. д. В SQL Server 2000 появилась возможность создания определяемых пользователем функций. Таким образом, пользователь может создавать свои собственные функции, на которые можно будет ссылаться непосредственно в теле запроса. Как и хранимые процедуры определяемые пользователем функции могут иметь параметры. Интересным сочетанием является использование в качестве возвращаемого функцией значения величины типа данных table. Это дает возможность применения запросов, обращающихся непосредственно к функции. Например, если имеется функция GetPeople, возвращающая список всех людей с фамилией, указанной с помощью единственного параметра, то просмотр возвращаемого функцией набора данных можно осуществить с помощью следующей команды: SELECT * FROM GetPeople('Иванов')
Данная глава будет посвящена рассмотрению как встроенных функций SQL Server 2000, так и созданию и применению определяемых пользователем функций.
Встроенные функции Для начала рассмотрим, какие же функции предлагает SQL Server 2000. Их количество достаточно велико, и для удобства работы они разбиты на отдельные группы: •
функции просмотра конфигурации;
•
функции для работы с курсорами;
Глава 27. Функции SQL Server 2000
1101
П функции работы с датой и временем; •
математические функции;
•
функции метаданных;
•
функции подсистемы безопасности;
П строковые функции; •
системные функции;
•
статистические функции;
•
ФУНКЦИИ ДЛЯ работы С типами данных image, t e x t И ntext.
Многие системные функции начинаются с символов @@. Полноценная функция должна работать с параметрами, значения которых при ее вызове указываются в скобках после имени функции. В принципе, функция может и не иметь параметров. В этом случае при ее вызове нужно будет указывать пустые скобки. Некоторые же функции Transact-SQL не используют скобки при их вызове. Такие функции скорее можно назвать глобальными переменными. Тем не менее, в документации они все же рассматриваются как функции.
Функции просмотра конфигурации Функции этой группы предназначены для получения различной информации. Большинство из них являются недетерминированными, т. к. могут возвращать различные результаты при каждом новом вызове. Простейшим примером такой функции является @@DBTS, возвращаемое значение которой постоянно меняется с течением времени. Отметим, что функции не изменяют никаких настроек сервера, а лишь позволяют просмотреть их. Для изменения тех или иных параметров следует обратиться к соответствующим системным хранимым процедурам или командам SET, DBCC И Т. Д. СПИСОК функций группы приведен в табл. 27.1. Таблица 27.1. Функции просмотра конфигурации Функция
Описание
@@CONNECTIONS
Возвращает целое число, равное количеству попыток соединения с SQL Server 2000. В это количество входят как успешные, так и неудачные попытки
@@DATEFIRST
Данная функция возвращает целое значение от 1 до 7, которое показывает, какой день недели сервер считает первым днем недели. Для изменения этого значения можно использовать команду S E T D A T E F I R S T
@@DBTS
Возвращает текущее значение счетчика t i m e s t a m p для текущей базы данных
@@LANGID
Возвращает идентификационный номер языка, установленного в текущем соединении
@SLANGUAGE
Возвращает имя языка, установленного в текущем соединении
1102
Часть V. Программирование
Таблица 27.1 (окончание) Функция
Описание
@@LOCK TIMEOUT
Возвращает целое значение, соответствующее количеству миллисекунд, которое сервер будет ожидать выполнения запроса (тайм-аут). Значение 0 соответствует прерыванию запроса, если сервер обнаруживает, что необходимые для выполнения этого запроса ресурсы блокированы другими транзакциями. Значение - 1 соответствует бесконечному времени ожидания. Время ожидания можно контролировать персонально для каждого соединения с помощью команды SET
LOCKJTIMEOUT @@MAX_CONNECTIONS
Позволяет узнать, какое максимальное количество соединений могут одновременно устанавливать пользователи с текущим сервером
@@MAX_PRECISION
Можно узнать, какое максимальное количество знаков поддерживается сервером для типов данных n u m e r i c и d e c i m a l . По умолчанию поддерживается точность до 38 знаков, что является максимальным значением
@@NESTLEVEL
Позволяет узнать текущий уровень вложенности хранимых процедур (функций, триггеров). При каждом вызове хранимой процедуры возвращаемое функцией значение увеличивается на 1, а при завершении процедуры уменьшается на 1. Если не запущено ни одной процедуры, то возвращается значение О
@@OPTIONS
Возвращает информацию о текущих параметрах соединения опциях в виде двухбайтового числа, каждый бит которого соответствует определенной опции
@@REMSERVER
Возвращает имя удаленного (remote) сервера, с которого была запущена хранимая процедура. Таким образом, данную функцию следует использовать только из тела хранимой процедуры
@@SERVERNAME
Данная функция просто возвращает имя локального сервера SQL Server 2000
@@SERVICENAME
Возвращает имя ключа реестра, из которого были получены параметры запуска для текущего сервера. Для инсталляции по умолчанию возвращается значение MSSQLServer, а для именованной инсталляции — имя этой инсталляции
@@SPID
С помощью данной функции можно получить идентификационный номер процесса SQL Server 2000, который был присвоен текущему соединению
@@TEXTSIZE
Позволяет узнать, какое количество байт будет выводить сервер при выполнении запроса SELECT ДЛЯ данных типа image, n t e x t и t e x t . Управлять количеством возвращаемых байтов
@@VERSION
Эта функция возвращает информацию о дате, версии и типе процессора текущей инсталляции SQL Server 2000
м о ж н о с п о м о щ ь ю
команды
S E T
T E X T S I Z E
Глава 27. Функции SQL Server 2000
1103
Функции работы с курсорами Данная группа содержит всего три функции, которые, тем не менее, довольно полезны, а порой и просто незаменимы при работе с курсорами. Подробно работа с курсорами будет рассмотрена в главе 31. Тем не менее, в следующих разделах рассмотрим функции, работающие с курсорами. Список функций группы приведен в табл. 27.2. Таблица 27.2. Функции работы с
курсорами
Функция
Описание
@@CURSOR_ROWS
Возвращает целое число типа i n t , свидетельствующее о количестве строк, содержащихся в курсоре. Если возвращается значение больше нуля, то оно соответствует количеству строк, содержащихся в курсоре. Когда возвращается ноль, то это означает, что курсор не был открыт. Значение - 1 возвращается для динамических курсоров, которые не имеют постоянного набора данных, т. к. их содержимое обновляется при каждом обращении к ним. Если же возвращается значение, меньшее — 1 , то это значит что соответствующий курсор является ключевым и абсолютное значение возвращенного числа соответствует количеству ключей, содержащихся в курсоре
@@FETCH_STATUS
С помощью этой функции можно получить информацию о результате работы последней выполненной команды FETCH. Возвращаемое функцией значение имеет тип данных i n t и может быть одним из следующих: О — команда FETCH была выполнена успешно, т. е. строка была считана; - 1 — была осуществлена попытка выборки строки, выходящей за пределы курсора. Эта ситуация часто случается при последовательном сканировании курсора. При достижении конца курсора после выполнения команды FETCH NEXT И будет возвращено значение — 1 ; - 2 — это значение возвращается в случае попытки выборки строки, которая по тем или иным причинам стала недоступной. Такая ситуация часто встречается во время работы с ключевыми курсорами при изменении в строке ключевых значений. В результате в курсоре имеется ссылка на строку, но по имеющемуся ключу ее уже нельзя идентифицировать
CURSOR_STATUS
36 Зак. 83
Позволяет узнать состояние курсора. Функция CURSOR_STATUS часто используется при работе с курсорами, возвращаемыми с помощью параметров хранимой процедуры. Параметры ' l o c a l ' и ' g l o b a l ' указывают тип курсора, о котором необходимо получить информацию — локальный или глобальный соответственно. Нужно явно указать тип курсора, т. к. SQL Server 2000 позволяет создавать одноименные курсоры разных типов. Собственно имя курсора задается с помощью параметра ' c u r s o r _ n a m e '.
1104
Часть V. Программирование Таблица 27.2 (окончание)
Функция
Описание Если же курсор был объявлен как локальная переменная, то для получения информации о таком курсоре следует определить параметр ' v a r i a b l e ' , а после него через запятую с помощью параметра ' c u r s o r _ v a r i a b l e ' указать имя соответствующей переменной. Рассмотрим, какие значения может возвращать функция, и что они означают: 1 — курсор содержит как минимум одну строку (динамический курсор может не содержать ни одной строки); О — свидетельствует о том, что курсор открыт, но он не содержит ни одной строки; —1 — курсор не был открыт; - 2 — курсор по тем или иным причинам не может использоваться. Часто это значение возвращается для курсоров, объявленных как локальная переменная, и которые должны быть определены в теле хранимой процедуры. Однако при вызове процедуры не было указано ключевое слово
OUTPUT;
—3 — указанный курсор не найден
Функции работы с датой и временем Как следует из названия, функции данной группы предназначены для работы с датой и временем. Напомним, что для хранения информации о дате и времени в SQL Server 2000 предназначены типы данных datetime и smaiidatetime. Нередко возникает необходимость выделить из даты день месяца или год, добавить или отнять несколько дней и т. д. Для выполнения этих, а также многих других операций и существуют функции работы с датой и временем (табл. 27.3). Таблица 27.3. Функции работы с датой и временем Функция
Описание
DATEADD ( d a t e p a r t , number, d a t e )
Данная функция позволяет добавлять к указанной дате определенное количество дней, часов, минут и т. д. С помощью аргумента d a t e p a r t указывается, какую часть даты необходимо увеличить. Величина, на которую следует изменить указанную часть даты, задается с помощью параметра number. Последний же параметр используется для указания даты, которая и будет увеличиваться
DATEDIFF ( d a t e p a r t , startdate, enddate)
Возвращает разницу между указанными частями двух дат
DATENAME ( d a t e p a r t , date)
Выделяет из даты указанную часть и возвращает ее в символьном формате
Глава 27. Функции SQL Server 2000
1105
Таблица 27.3 (окончание) Функция
Описание
DATEPART ( d a t e p a r t , date)
Выделяет из даты указанную часть и возвращает ее в числовом формате
DAY ( d a t e )
С помощью функции DAY можно извлечь номер дня месяца из значения d a t e t i m e или s m a l l d a t e t i m e . Результат имеет тип данных i n t
GETDATEO
С помощью этой функции можно получить информацию о текущем системном времени. Возвращаемое значение имеет тип данных d a t e t i m e
ISDATE ( e x p r e s s i o n )
С помощью этой функции можно проверить, является ли указанное строковое выражение датой или нет. Если указанное выражение является одним из допустимых вариантов записи даты и времени, то возвращается 1, иначе будет возвращено значение О
MONTH ( d a t e )
Эта же функция возвращает месяц из указанной даты. Результат имеет тип данных i n t
YEAR ( d a t e )
По аналогии с двумя предыдущими функциями с помощью функции YEAR можно извлечь из даты год. Возвращаемое значение имеет тип данных i n t
Математические функции Функции этой группы предназначены для выполнения различных математических операций — возведение в степень, вычисление синуса, извлечение корня и т. д. Список математических функций приведен в табл. 27.3. При работе с математическими функциями следует быть внимательным с типами данных. Дело в том, что некоторые функции SQL Server 2000 возвращают значение того же типа, что и исходное выражение. Поясним сказанное на примере использования функции RADIANS ДЛЯ перевода угла 45° в радианы: SELECT RADIANS(45), RADIANS(45.0),
RADIANS(45.00000)
Будет возвращен следующий результат: 0
.785398163397448300
(1 row(s)
.785398163397448300
affected) Таблица 27.3. Математические
функции
Функция
Описание
ABS ( n u m e r i c _ e x p r e s s i o n )
Возвращает абсолютное значение попросту откидывает знак
ACOS ( f l o a t _ e x p r e s s i o n )
Возвращает угол в радианах, косинус которого равен указанному значению (арккосинус)
выражения, т . е .
Часть V. Программирование
1106
Таблица 27.3 (продолжение) Функция
Описание
AS IN(float_expression)
Возвращает угол в радианах, синус которого равен указанному значению (арксинус). Аргумент должен лежать в диапазоне от —1 до 1 включительно
ATAN(float_expression)
Возвращает угол в радианах, тангенс которого равен указанному значению (арктангенс)
ATN2(float_expression, float expression)
Возвращает угол в радианах, тангенс которого равен частному от деления первого аргумента на второй, с учетом квадранта, задаваемого двумя аргументами
CEILING(numeric_ expression)
Возвращает ближайшее целое число, большее или равное значению аргумента, т. е. выполняет округление вверх
COS(float_expression)
Вычисляет косинус угла, указанного в радианах
COT(float_expression)
Возвращает котангенс угла, указанного в радианах
DEGREES(numeric_ expression)
Выполняет преобразование угла n u m e r i c _ e x p r e s s i o n из радиан в градусы
EXP(float_expression)
Возвращает экспоненту значения
FLOOR(numeric_ expression)
Возвращает для указанного значения ближайшее минимальное целое число, т. е. выполняет округление вниз
ISNUMERIC(expression)
Данная функция выполняет проверку на то, является ли указанное символьное выражение числом. Если выражение имеет числовой тип данных, то функция возвращает 1. В противном случае будет возвращен О
LOG(float_expression)
Вычисляет натуральный логарифм
LOG10(float_expression)
Вычисляет десятичный логарифм
PI О
Возвращает значение п
POWER(numeric_ expression, y)
Возводит число n u m e r i c _ e x p r e s s i o n в степень у. Тип возвращаемого значения совпадает с исходным типом
RADIANS(numeric_ expression)
Преобразует значение угла n u m e r i c e x p r e s s i o n , указанное в градусах, в радианы
RAND([seed])
Вычисляет случайное число с плавающей запятой в интервале от 0 до 1, и может использовать в качестве аргумента значения типа t i n y i n t , i n t , или s m a l l i n t в качестве отправной точки для генерации случайного числа. Если аргумент не указан, то начальное значение генерируется на основе системного времени
ROUND(numeric_ expression, length[, function])
Выполняет округление числа с указанной точностью. Можно выполнять округление числа как после десятичной точки ( l e n g t h > 0 ) , так и до нее ( l e n g t h < 0 )
Глава 27. Функции SQL Server 2000
1107 Таблица 27.3 (окончание)
Функция
Описание
SIGN(numeric_expression)
Определяет знак числа. Если значение положительное, то в результате получится 1; если нулевое, результат равен 0; если отрицательное, результат равен —1
SIN(float_expression)
Вычисляет синус угла f l o a t e x p r e s s i o n , указанного в радианах
SQRT(float_expression)
Вычисляет квадратный корень из числа float_expression
SQUARE(float_expression)
Возводит в квадрат число f l o a t _ e x p r e s s i o n
TAN(float_expression)
Возвращает тангенс угла, значение которого указано в радианах
Функции метаданных Функции этой группы предназначены для получения сведений о различных объектах SQL Server 2000 (метаданных). Список функций группы приведен в табл. 27.4. Таблица 27.4. Функции работы с метаданными Функция
Описание
@@PROCID
Возвращает идентификационный номер хранимой процедуры, запущенной в настоящий момент
COL_LENGTH('table', 'column')
Возвращает количество байтов, отведенных в таблице для того или иного столбца
COL_NAME(table_id, column_id)
Возвращает имя столбца по идентификационным номерам таблицы и самого столбца
COLUMNPROPERTY(id, column, property)
Возвращает информацию о свойствах столбца таблицы или параметров хранимой процедуры
DATABASEPROPERTY (database, property)
С помощью этой функции можно получить информацию о свойствах базы данных
DB ID(['database name'])
Возвращает идентификационный номер базы данных по ее имени
DB_NAME(database_id)
Возвращает имя базы данных по его идентификационному номеру
FILEID('filename'
Возвращает идентификационный номер файла текущей базы данных по его имени
FILE_NAME_
Возвращает имя файла текущей базы данных по его идентификационному номеру
FILEGROUP_ID ('filegroup_name'
Возвращает идентификационный номер группы файлов текущей базы данных по ее имени
1108
Часть V.
Программирование
Таблица 27.4 (окончание) Функция
Описание
FILEGROUP_NAME (filegroup_id)
Возвращает имя группы файлов текущей базы данных по ее идентификационному номеру
FILEGROUPPROPERTY (filegroup_name, property)
Возвращает информацию о свойствах группы файлов
FILEPROPERTY(file_name, property)
Возвращает информацию о свойствах файла базы данных
FULLTEXTCATALOGPROPERTY (catalog_name, property)
Возвращает информацию о свойствах полнотекстового каталога
FULLTEXTSERVICEPROPERTY (property)
Возвращает информацию о свойствах службы полнотекстового поиска
INDEX_COL('table' , index_id, key_id)
Возвращает имя индексированной колонки таблицы
INDEXPROPERTY(table_ID, index, property)
Возвращает информацию о свойствах индекса
OBJECT_NAME(object_id)
Возвращает имя объекта базы данных по его идентификационному номеру
OBJECTPROPERTY(id, property)
Возвращает информацию о свойствах объектов базы данных по его идентификационному номеру
TYPEPROPERTY(type, property)
Возвращает информацию о свойствах типа данных
Функции подсистемы безопасности Функции этой группы служат для получения информации, связанной с подсистемой безопасности — пользователях и учетных записях, о членстве их в фиксированных и пользовательских ролях базы данных, фиксированных ролях сервера и другой информации. Список функций группы приведен в табл. 27.5. Таблица 27.5. Функции подсистемы безопасности
Функция
Описание
HAS_DBACCESS ('database name
Возвращает 1, если текущий пользователь имеет доступ к указанной базе данных. В противном случае возвращает О
IS_MEMBER ({'group' | 'role' })
С помощью этой функции можно проверить, является ли текущий пользователь членом группы указанной Windows NT или роли базы данных SQL Server
IS_SRVROLEMEMBER [, ' login'] )
С помощью этой функции можно проверить, является ли текущий пользователь членом указанной фиксированной роли сервера
role '
Глава 27. Функции SQL Server 2000
1109 Таблица 27.5 (окончание)
Функция
Описание
SUSER_SID(['login'
Эта функция возвращает идентификационный номер системы безопасности указанной учетной записи SQL Server или Windows NT
SUSER_SNAME [serveruser sid] )
Возвращает имя учетной записи по ее идентификационному номеру системы безопасности (SID)
USER
Возвращает имя текущего пользователя базы данных
USER I D ( [ ' u s e r ' ]
Возвращает идентификационный номер пользователя или роли базы данных по имени
Строковые функции Функции этой группы предназначены для работы с символьными строками — поиску подстроки в строке, выделению подстроки, удалению лидирующих и конечных пробелов, вычислению длины строки и т. д. Список функций группы приведен в табл. 27.6. Таблица 27.6. Функции работы со строками Функция
Описание
ASCII (character^ expression)
Возвращает ASCII-код указанного символа
CHAR ( i n t e g e r _ e x p r e s s i o n )
Возвращает символ по ASCII-коду
CHARINDEX(expressionl, expression2 [, start_location])
Выполняет поиск подстроки e x p r e s s i o n l в строке e x p r e s s i o n 2 , начиная с символа s t a r t _ l o c a t i o n
DIFFERENCE(character_ expression, character_expression)
Возвращает число в диапазоне 0—4, по которому можно судить о совпадении звучания двух строк
LEFT(character_expression, integer_expression)
Возвращает указанное количество символов, начиная с начала строки
LEN(string_expression)
Возвращает длину строки в символах (не в байтах)
LOWER(character_ expression)
Переводит все символы строки в нижний регистр
LTRIM(character_ expression)
Удаляет из строки лидирующие пробелы
NCHAR(integer_expression)
Возвращает символ Unicode по указанному коду
PATINDEX('%pattern%', expression)
Выполняет в строке поиск подстроки, соответствующей указанному шаблону
QUOTENAME('character_ s t r i n g ' [ , 'quote_ character'1)
Конвертирует строку в формат Unicode
1110
Часть V. Программирование Таблица 27.6 (окончание)
Функция
Описание
REPLACE('string_ expressionl', ' string_expression2 ' string_expression3
Заменяет все вхождения введенной подстроки на указанное значение
REPLICATE(character expression, integer_expression)
Тиражирует строку указанное количество раз
REVERSE(character_ expression)
Возвращает строку, символы которой записаны в обратном порядке по отношению к исходной строке
RIGHT(character_ expression, integer_expression)
Возвращает указанное количество последних символов строки
RTRIM(character_ expression)
Удаляет из строки конечные пробелы
SOUNDEX(character_ expression)
Возвращает четырехзначный код строки для оценки ее звучания
SPACE (integer_expression)
Возвращает указанное количество пробелов
STR(float_expression[, length[, decimal]])
Выполняет преобразование значения числового типа в символьную строку
STUFF(character_ expression, s t a r t , length, character_ expression)
Удаляет определенное количество символов строки, начиная с указанного, и заменяет их новой подстрокой
SUBSTRING(expression, s t a r t , length)
Возвращает часть строки, начиная с указанного символа и указанной длины
UNICODE('ncharacter_ expression')
Возвращает Unicode-код указанного символа
UPPER(character_ expression)
Переводит все символы строки в верхний регистр
Системные функции Функции этой группы предназначены для получения самой разнообразной информации, которая, судя по названию группы, должны быть системной. Однако некоторые из функций группы скорее можно назвать функциями общего пользования, чем системными. Список функций группы приведен в табл. 27.7. Таблица 27.7. Системные функции Функция
Описание
@@ERROR
Возвращает код последней ошибки, произошедшей в текущем соединении
Глава 27. Функции SQL Server 2000
1111 Таблица 27.7 (продолжение)
Функция
Описание
00IDENTITY
Возвращает последнее значение, вставленное столбец-счетчик в текущем соединении
@@ROWCOUNT
Возвращает количество строк, которые были обработаны последней командой
@@TRANCOUNT
Возвращает количество активных транзакций в текущем соединении, т. е. глубину вложенности транзакций
АРР NAME()
Возвращает функцию
COLLATIONPROPERTY(collati on_name, property)
Возвращает информацию сопоставления
CURRENT TIMESTAMP
Возвращает текущее значение даты и времени. Эквивалент функции GETDATE ()
CURRENTJJSER
Возвращает имя текущего функции USER_NAME ()
DATALENGTH(expression)
Возвращает количество байт, необходимых для хранения указанного выражения
FORMATMESSAGE(msg_number, param_value [ ,...n ])
Генерирует сообщение на основе данных о сообщениях об ошибках, хранящихся в таблице sysmessages
GETANSINULL(['database'])
Возвращает значение ANSI NULL, установленное в текущем соединении для определенной базы данных
HOST_ID()
Возвращает идентификационный номер компьютера в сети
HOST NAME{)
Возвращает имя клиентского компьютера, с которого был послан запрос
IDENT_INCR('table_or_ view1 )
Возвращает шаг прироста для столбца-счетчика указанной таблицы или представления
IDENT_SEED('table_or view')
Возвращает первоначальное значение столбцасчетчика указанной таблицы или представления
IDENTITY(data_type[, seed, increment]) AS column name
Используется в запросе SELECT при создании на основе результатов выполнения запроса новой таблицы, содержащей столбец-счетчик. Первый аргумент описывает тип данных. Второй аргумент указывает начальное значение. Шаг пророста указан в третьем аргументе
ISNULL(check_expression, replacement_value)
Проверяет указанное выражение на NULL. Если выражение равно N U L L , то функция возвращает аргумент r e p l a c e m e n t v a l u e . Иначе возвращается значение самого выражения
имя приложения, которое о свойствах
в
выполнило указанного
пользователя.
Аналог
1112
Часть V. Программирование Таблица 27.7
(окончание)
Функция
Описание
NEWIDO
Генерирует уникальный глобальный идентификатор. Возвращает значение типа данных uniqueidentifier
NULLIF(expression, expression)
Возвращает значение NULL, если оба аргумента одинаковы. В противном случае она возвращает первый аргумент
PARSENAME('object_name obj ect_piece)
Выполняет разбор полного имени объекта на составляющие
PERMISSIONS([objectid [, 'column']1)
Возвращает информацию о правах доступа для текущего пользователя
ROWCOUNT BIG()
Аналог функции @@ROWCOUNT, НО возвращает значение типа данных b i g i n t
SERVERPROPERTY (propertyname)
Возвращает информацию о свойствах сервера
SESSION USER
Возвращает имя пользователя, установившего текущее соединение
STATS_DATE(table_id, index_id)
Возвращает дату последнего обновления статистики индекса указанной таблицы
SYSTEM USER
Возвращает имя учетной записи, которая была отражена в текущего пользователя базы данных
Статистические функции Функции этой группы возвращают различную статистическую информацию о работе сервера — об операциях чтения диска, количестве переданной по сети информации, затратах времени и т. д. Список статистических функций приведен в табл. 27.8. Таблица 27.8. Статистические функции Функция
Описание
@@CPUBUSY
Возвращает количество миллисекунд, тральный процессор на старт сервера
@@IDLE
Возвращает количество миллисекунд, прошедшее со времени последнего запуска SQL Server
@@IOBUSY
Возвращает количество миллисекунд, которое SQL Server ожидал выполнения операций ввода/вывода во время последнего старта
@@PACKRECEIVED
Возвращает количество пакетов, принятое SQL Server от клиентов со времени запуска
которое затратил
цен-
Глава 27. Функции SQL Server 2000
1113 Таблица 27.8
(окончание)
Функция
Описание
@@PACK_SENT
Возвращает количество пакетов, которое SQL Server клиентам со времени запуска
@@PACKET_ERRORS
Возвращает количество неправильных SQL Server со времени последнего старта
@@TIMETICKS
Возвращает количество микросекунд в одном такте процессора
@@TOTAL_ERRORS
Возвращает количество ошибок дискового ввода/вывода, произошедших со времени последнего запуска SQL Server
@@TOTAL_READ
Возвращает количество операций физического чтения с диска, которое выполнил SQL Server с момента запуска
@@TOTAL_WRITE
Возвращает количество операций физической записи на диск, которое выполнил SQL Server с момента запуска
было пакетов,
отправлено принятых
Функции, определяемые пользователем Предыдущая часть главы была посвящена рассмотрению встроенных функций SQL Server 2000. При работе с более ранними версиями SQL Server пользователи должны были ограничиваться вызовом только этих функций. При работе же с SQL Server 2000 пользователи могут создавать свои собственные функции. Такие функции называются определяемыми пользователями функциями (User-defined function). Эти функции являются ничем иным, как обычными объектами базы данных, такими же, как и хранимые процедуры, триггеры, представления и т. д. Каждый из пользователей, имеющий соответствующие права доступа, может создать произвольную функцию. Таким образом, определяемая пользователем функция, в отличие от встроенной функции, имеет своего владельца, который может предоставлять другим пользователям право на ее вызов. В SQL Server 2000 имеется несколько типов определяемых пользователем функций: • Scalar. Функции этого типа являются наиболее привычными. Функция Scalar может содержать множество команд, объединяемых конструкцией BEGIN...END в одно целое, и возвращает скалярное значение любого из типов данных, поддерживаемого SQL Server 2000, за исключением timestamp, t e x t , ntext, image, table И cursor.
• Inline. Функции этого типа всегда возвращают значения типа данных t a b l e , представляющие собой сложный набор данных. Кроме того, функция Inline может состоять всего из одной команды SELECT. Функции Inline существуют во многих языках программирования. Их особенностью является то, что код функции при выполнении программы вставляется непосредственно в исполняемый набор команд, т. е. происходит не вызов функции, а встраивание.
1114
Часть V. Программирование
П Multi-Scalar. Как и функции предыдущего типа, функции Multi-Scalar возвращают значение типа данных t a b l e . Однако в отличие от первых, функции рассматриваемого типа могут состоять более чем из одной команды, что дает возможность использовать в теле функции транзакции, курсоры, вызывать хранимые процедуры и т. д. Как и при работе с функциями Scalar при использовании более одной команды следует применять конструкцию BEGIN...END.
Замечание Функции, возвращающие значения типа данных t a b l e (Inline и Multi-Scalar), могут в ы з ы в а т ь с я н е п о с р е д с т в е н н о в р а з д е л е F R O M при р а б о т е с з а п р о с а м и
SELECT,
INSERT, DELETE И UPDATE. Написание определяемых пользователем функций весьма напоминает программирование хранимых процедур: и те, и другие могут использовать или не использовать входные параметры. При этом входные параметры могут иметь любой из поддерживаемых SQL Server 2000 типов данных за исключением image, t e x t , n t e x t , cursor и t a b l e . Входные параметры определяемой пользователем функции, в отличие от параметров хранимой процедуры, нельзя применять для возврата значений, т. е. указание ключевого слова OUTPUT не допускается. Тем не менее, можно определять значения по умолчанию. В отношении пользовательских функций существует множество ограничений. Если от хранимой процедуры не требуется указывать возвращаемое значение (код возврата), то функция должна в обязательном порядке явно вернуть какоето значение. При программировании функций не разрешается использование команд, которые могут вернуть значения непосредственно в соединение, а не как результат вычисления функции. Таким образом, в теле функции не допускается вызов команды PRINT, а также варианта команды SELECT, предназначенного для вывода данных. Не разрешается и использование команды FETCH, возвращающей данные непосредственно в соединение. Однако применение этой команды для помещения данных из курсора в локальные переменные допускается. В функции не разрешается изменений данных в таблицах базы данных, создание, модификация и удаление объектов базы данных. Тем не менее, разрешается использование команд UPDATE, INSERT И DELETE, изменяющих данные в переменной t a b l e , которая является возвращаемым функцией значением. Помимо этого, в теле функции (кроме, конечно, функций Inline) разрешается создавать циклы, использовать команды ветвления, работать с транзакциями, объявлять переменные и курсоры и т. д. Создание определяемых пользователем функций выполняется с помощью команды CREATE FUNCTION. Однако, для создания функций разных типов существует разный синтаксис этой команды. В следующих трех разделах будет подробно рассмотрен синтаксис команды CREATE FUNCTION ДЛЯ создания функций каждого из типов.
Глава 27. Функции SQL Server 2000
1115
Функции Scalar Для создания функций типа Scalar предназначен следующий синтаксис команды CREATE FUNCTION: CREATE FUNCTION [owner_name.]function_name ([{@parameter_name scalar_parameter_data_type [= default ]} [,...n]]) RETURNS scalar_return_data_type [WITH [,...n]] [AS] BEGIN funct i on_body RETURN scalar_expression END -
Рассмотрим назначение и использование параметров команды: •
[owner_name.]function_name Данный параметр предназначен для указания имени (functionname), а при необходимости дополнительно и владельца (ownername) создаваемой функции. Если имя функции или владельца содержит неразрешенные символы, то следует использовать ограничители (двойные кавычки или квадратные скобки). Указание имени базы данных или сервера не разрешается, т. е. функция может быть создана только в текущей базе данных.
П
@parameter_name scalar_parameter_data_type [=default] Посредством этой конструкции определяются входные параметры создаваемой функции. Как и параметры хранимой процедуры, параметры функции должны начинаться с символа @ и быть уникальными в пределах функции. В теле функции параметр может использоваться как обычная переменная. Имя параметра указывается с помощью аргумента @parameter_name. Через пробел после имени необходимо задать тип данных, который будет иметь параметр. Для этого предназначен аргумент scalar_parameter_data__type. Уже из имени аргумента можно сделать вывод, что параметр функции может иметь только скалярный тип данных. То есть, как уже было сказано, не допускается применение типов данных timestamp, text, ntext, image, table и cursor. Дополнительно для параметра функции с помощью аргумента default можно определить значение по умолчанию, которое будет присваиваться параметру в случаях, когда при вызове функции явно не указывается значение соответствующего параметра.
О RETURNS scalar_return_data_type
Ключевое слово RETURNS свидетельствует, что далее следует имя типа данных, значение которого будет возвращать функция. Опять же разрешается использование только скалярных типов данных. •
WITH < f u n c t i o n _ o p t i o n >
[,...n]
Использование данного аргумента необходимо в случаях, когда требуется указать дополнительные опции, с применением которых должна быть создана функция. Собственно опции задаются конструкцией , которая имеет синтаксис: ::= {ENCRYPTION | SCHEMABINDING}
1116
Часть V. Программирование
Указание ключевого слова ENCRYPTION предписывает серверу выполнить шифрование кода команды CREATE FUNCTION, С ПОМОЩЬЮ которой была создана функция. Это позволяет скрыть от пользователей принципы работы функции. Если же указывается ключевое слово SCHEMABINDING, TO сервер выполняет связывание создаваемой функции со всеми объектами, на которые ссылаются команды функции. Это позволяет избежать модификации этих объектов, которая может привести к нарушению работы функции (например, удаление столбца таблицы, из которого осуществлялась выборка данных). Однако в этом случае для обращения к объектам необходимо использовать двухчастные имена (включающие имя владельца). •
AS Это необязательное ключевое слово говорит о том, что далее следует набор команд, которые являются телом функции.
•
BEGIN...END
Назначение этой конструкции традиционно. Она используется для объединения команд, которые будут являться телом функции. Все команды, являющиеся телом функции, должны находиться между ключевыми словами BEGIN И END. П! RETURN s c a l a r _ e x p r e s s i o n
Как и при работе с хранимыми процедурами, когда в теле функции встречается команда RETURN, TO сервер завершает выполнение функции. При этом результатом работы функции будет являться значение, полученное в результате вычисления выражения scalar_expression. Этот результат должен иметь тип данных, указанный после ключевого слова RETURNS. В отличие от хранимых процедур, не требующих обязательного использования команды RETURN, при работе с функцией выход из нее происходит только при выполнении команды RETURN. В принципе, в теле функции может присутствовать более одной команды RETURN, каждая из которых обрабатывается в той или иной ситуации.
Замечание Последняя команда тела функции всегда должна быть RETURN, даже если гарантированно до достижения конца функции будет выполнена другая команда RETURN.
Это проиллюстрировано в приведенном ниже примере. В качестве примера рассмотрим создание функции MyFuncA, которая будет решать квадратное уравнение. Функция имеет четыре параметра. С помощью первых трех параметров указываются коэффициенты квадратного уравнения. Последний же параметр предназначен для задания номера корня, который необходимо возвратить (квадратное уравнение может иметь два корня). Если корней у уравнения нет, то функция возвратит значение NULL. CREATE FUNCTION MyFuncA(@parA int, @ParB int, @parC int, @Num int) RETURNS real AS
Глава 27. Функции SQL Server 2000
1117
BEGIN DECLARE @D int SET @D=@parB*@parB-4*@parA*6parC IF @D<0 RETURN NULL IF @Num=l RETURN ( (-@parB+SQRT(@D))/(2*@parA) ) ELSE RETURN ((-@parB-SQRT(@D))/(2*@parA)) RETURN NULL END
Теперь попробуем использовать эту функцию: SELECT dbo.MyFuncA(l,4,5,l), dbo.MyFuncA(-1,4,5,1), dbo.MyFuncA(-1,4,5,2)
Будет возвращен следующий результат: NULL (1 row(s)
-1.0 affected)
5.0
Функции Inline Для создания функций Inline используется следующий вариант команды CREATE FUNCTION: CREATE FUNCTION [owner_name.]function_name ([{@parameter_name scalar_parameter_data_type RETURNS TABLE [WITH [,...n]] [AS] RETURN [ ( ] s e l e c t _ s t m t [ ) ]
[= default ]} [,...n]])
Как видно из синтаксиса, заголовок функций Inline практически соответствует заголовку функций Scalar, рассмотренных в предыдущем разделе. Единственно, явно указан тип значения, возвращаемого функцией — t a b l e . После ключевого слова AS не допускается указание конструкции BEGIN...END, а разрешается лишь использование запроса SELECT, С ПОМОЩЬЮ которого будет формироваться набор данных, возвращаемый функцией. В этом запросе можно использовать параметры функции. Если подходить строго, то тело функции представлено единственной командой RETURN, после выполнения которой работа функции заканчивается. Однако прежде чем выйти из функции, необходимо вычислить значение, которое будет возвращено функцией как результат работы. Это значение для функций Inline должно являться значением типа данных t a b l e , т. е. представлять собой набор строк и столбцов. Такой набор и формируется с помощью запроса SELECT. В качестве примера рассмотрим создание функции MyFuncB, которая будет возвращать список имен, фамилий и телефонов авторов, фамилия которых начинается с указанной буквы: CREATE FUNCTION MyFuncB(@Char char) RETURNS TABLE
1118
Часть V. Программирование
AS RETURN SELECT au_lname, au_fname, phone FROM authors WHERE LEFT "(au_l name, 1) =@Char
Попробуем выполнить созданную функцию: SELECT * FROM M y F u n c B ( ' G ' )
Будет возвращен следующий результат: au_lname
au_fname
phone
Green Gringlesby Greene. (3 row(s) affected)
Marjorie Burt Morningstar
415 986-7020 707 938-6445 615 297-2723
Функции Multi-statement Для создания функций этого типа применяется следующий вариант команды CREATE FUNCTION: CREATE FUNCTION [owner_name.]function_name ( [ { @parameter_name scalar_parameter_data__type [ = default ] } [ ,.--n ] ] ) RETURNS @return_variable TABLE [ WITH [ ,...n ] ] [ AS ] BEGIN f unct ion__body RETURN END
Большая часть аргументов команды CREATE FUNCTION, используемых при создании функций типа Multi-statement, были рассмотрена ранее при описании созданий функций других типов. Тем не менее, некоторые отличия все же имеются. Самое заметное отличие — в определении типа возвращаемого значения. Напомним, что тип возвращаемого значения указывается после ключевого слова RETURNS. В отличие от функций Inline и Scalar здесь необходимо указать имя локальной переменной, содержимое которой будет возвращено как результат выполнения функции. Как видно, эта переменная имеет тип данных t a b l e . При этом необходимо явно определить набор столбцов, которые будут применяться для хранения данных. Дополнительно можно определить индексы, ограничения целостности и т. д. Подробно работа с переменными типа данных t a b l e была рассмотрена в главе 26. Еще одно отличие связано с завершением работы функции. Как и при работе с функциями других типов, завершение работы функции Multi-statement происходит при выполнении команды RETURN. Однако не требуется указание значения, которое будет возвращено как результат выполнения функции. Всегда возвращается содержимое переменной типа t a b l e , указанной после ключевого слова RETURNS.
Глава 27. Функции SQL Server 2000
1119
Изменение функций Не стоит и говорить, что по тем или иным причинам может возникнуть необходимость внести в уже созданную функцию некоторые изменения. Решением "в лоб" будет удаление функции и повторное ее создание с внесенными изменениями. Однако минусом такого подхода является потеря всех разрешений, выданных пользователям базы данных на доступ к этой функции. Более того, если с функцией был связан некоторый объект базы данных (т. е. ссылающийся на функцию и созданный с указанием опции SCHEMABINDING), TO удалить ее не удастся. Более естественным методом изменения будет использование команды ALTER FUNCTION, специально предназначенной для изменения функций. Так же, как и для создания, для изменения функций применяются разные варианты команды. Изменение функций типа Scalar осуществляется с помощью следующего варианта команды: ALTER FUNCTION [owner_name.]function_name ([{@parameter_name scalar_parameter_data_type RETURNS scalar_return_data_type [WITH [,...n]] [AS] BEGIN function_body RETURN scalar_expression END
[= default ]} [,...n]])
Изменение же функций типа Inline выполняется с помощью команды: ALTER FUNCTION [owner_name.]function_name ([{@parameter_name scalar_parameter_data_type RETURNS TABLE [ WITH < function_option > [ ,...n ] ] [ AS ] RETURN [ ( ] s e l e c t _ s t m t [ ) ]
[= default]}
[,...n]])
Наконец, для изменения функций Multi-statement предназначен такой вариант команды: ALTER FUNCTION [owner_name.]function_name ([{@parameter_name scalar_parameter_data_type [= default]} RETURNS @return_variable TABLE [WITH [,...n ]] [AS] BEGIN funct ion_body RETURN END
[,...n]])
He трудно заметить, что команда ALTER FUNCTION практически повторяет синтаксис команды CREATE FUNCTION. Поэтому мы не будем лишний раз останавливаться на рассмотрении уже описанных параметров. Скажем только, что при изменении функции необходимо полностью указывать все ее команды, что можно сравнить с созданием функции с нуля. Помочь в изменении функции
1120
Часть V. Программирование
может системная хранимая процедура s p h e i p t e x t , позволяющая получить код команды CREATE FUNCTION, с помощью которого была создана функция. Например, для получения кода функции MyFuncB, созданной в одном из предыдущих разделов, можно выполнить команду: sp_helptext
'dbo.MyFuncB'
Замечание Заметим, что код функции не удастся просмотреть, если она была создана с указанием параметра E N C R I P T I O N .
Удаление функций Одной из основных операций работы с объектами баз данных, в т. ч. и с функциями, является удаление. Итак, для удаления функции служит команда DROP FUNCTION, имеющая синтаксис: DROP FUNCTION
{[owner_name.]function_name} [,...n]
Как видно из синтаксиса, команда DROP FUNCTION не делает различия между типами функций и уничтожает все подряд. Более того, с помощью одной команды можно удалить множество функций, просто перечислив их имена через запятую. Например, для удаления функций MyFuncA и MyFuncB, созданных в предыдущих разделах, следует выполнить команду: DROP FUNCTION MyFuncA, MyFuncB
Глава 28
Вставка, удаление и изменение данных Изначально целью любой системы управления базами данных является предоставление пользователям удобных и эффективных механизмов управления данными. Любая СУБД предоставляет пользователям инструменты для ввода, изменения, удаления и выборки данных. Остальные возможности, такие как репликация, резервное копирование, автоматическое администрирование, перенос данных и другие являются лишь дополнительными компонентами, обеспечивающими более эффективное решение все тех же задач ввода, изменения, удаления и выборки данных. Своеобразным стандартом является язык SQL, различные модификации которого используются практически во всех современных СУБД для управления данными. В главе 25 были рассмотрены основы языка Transact-SQL, являющегося расширением стандарта ANSI SQL-92 и используемого в SQL Server 2000. Задачи, которые можно решать с помощью Transact-SQL, довольно обширны. Управление данными — лишь часть этих задач, пусть даже большая. В этой главе будет подробно рассмотрено управление данными — добавление новых строк в таблицу, изменение существующих данных и удаление ненужных строк. Следующая же глава будет посвящена рассмотрению выборки данных. SQL Server 2000 предлагает несколько различных механизмов управления данными. Например, вставка данных может выполняться не только средствами Transact-SQL, но и с помощью утилиты bcp.exe или служб трансформации данных (DTS, Data Transformation Services). Однако в этой главе будет рассмотрено использование только команд INSERT (добавление строк), UPDATE (изменение данных) и DELETE (удаление строк). (
Замечание
^
Для управления данными Microsoft предлагает множество технологий — ODBC, ADO, OLE DB, DB Library и другие. В этой книге будет рассмотрено управление данными только с помощью Transact-SQL. Для получения информации о работе с другими технологиями управления данными следует обратиться к дополнительным источникам информации.
Добавление строк Прежде чем начать работу с данными, их необходимо добавить в таблицу. Сразу же после создания таблица не содержит никаких данных и не предлагает пользо-
Часть V. Программирование
7122
вателям никакой информации. После того, как таблица будет заполнена данными, пользователи смогут производить выборку, изменение и удаление данных. SQL Server 2000 является очень мощной СУБД, обеспечивающей пользователя множеством разнообразных механизмов вставки данных в таблицу. Однако сейчас мы рассмотрим только два из этих механизмов: П Команда INSERT. Обеспечивает вставку одной или более строк в существующую таблицу на основе явно заданных значений или результата выборки данных. •
Команда SELECT...INTO. С ее помощью на основе результата выборки создается новая таблица, которая будет иметь структуру, необходимую для хранения выбранных данных, и содержать весь результат выборки. Замечание В конце главы также будет рассмотрена вставка строк с использованием механизмов массивного копирования — команды BULK INSERT И утилиты bcp.exe.
Более подробно каждая из команд будет рассмотрена в следующих разделах. В начале каждого раздела предлагается синтаксис рассматриваемой команды с описанием назначения и использования всех параметров и аргументов команды. После этого будут приведены примеры, относящиеся к различным аспектам работы команды.
Команда INSERT Команда INSERT используется для вставки в таблицу одной или более строк. Это единственная команда, с помощью которой можно добавить данные в существующую таблицу. Синтаксис команды INSERT таков: INSERT [INTO] {table_name WITH ( [,...n]) I view_name I rowset_function_limited} {[(column_list)] {VALUES ({DEFAULT | NULL I expression}[,...n]) I derived_table I execute_statement}} I DEFAULT VALUES Рассмотрим подробно назначение и использование каждого из аргументов. О table_name Имя таблицы, в которую необходимо добавить строки. Помимо имени таблицы можно указать имя ее владельца и имя базы данных, в которой она находится. То есть ИМЯ таблицы МОЖНО записать В форме d a t a b a s e . owner . table_name. •
WITH ( < t a b l e _ h i n t _ l i m i t e d > [ , . . . n ] ) После ключевого слова WITH указывается один или более хинтов, с помощью которых можно устанавливать необходимый режим блокирования при вставке данных. Конструкция имеет следующую структуру:
Глава 28. Вставка, удаление и изменение данных
1123
::= {INDEX(index_val [,...n]) I FASTFIRSTROW | HOLDLOCK | PAGLOCK | READCOMMITTED I REPEATABLEREAD | ROWLOCK | SERIALIZABLE | TABLOCK | TABLOCKX}
Замечание Использование хинтов и описание уровней блокирования было рассмотрено в разд. "Управление блокировками на уровне команд" главы 19. ID view_name Имя представления, в которое необходимо вставить строки. При вставке строк в представление необходимо убедиться, что оно позволяет изменять исходные данные. Кроме того, следует учитывать, что за одну операцию можно изменить данные только в одной таблице. То есть, если представление построено на основе трех таблиц, то команда INSERT должна обращаться к столбцам, принадлежащим одной таблице. Как видно из синтаксиса, при вставке данных не разрешается установка уровней блокирования по усмотрению пользователя. SQL Server 2000 сам принимает решение об использовании наилучшего уровня блокирования. ID rowset_function_limited Этот аргумент подразумевает использование функций OPENQUERY ИЛИ OPENROWSET, с помощью которых можно выполнять вставку данных на связанном (linked) сервере. ID (column_list) С помощью этого параметра указывается список столбцов, в которые необходимо вставить данные. Имена столбцов, в которые необходимо вставить данные, просто перечисляются через запятую. Порядок перечисления столбцов задает порядок перечисления вставляемых значений. Порядок значений, указываемых с помощью ключевого слова VALUES, должен соответствовать порядку перечисления столбцов. Если список столбцов не указывается, то команда INSERT поочередно вставляет значения, указанные с помощью VALUES, во все столбцы таблицы. Однако при этом не происходит вставка в столбцы счетчика (IDENTITY) И столбцы типа данных timestamp, т. к. значения в них контролируются сервером автоматически. То есть пользователь не должен указывать с помощью VALUES значения для таких столбцов. В список столбцов могут не входить имена столбцов, для которых определено значение по умолчанию или разрешено хранение значений NULL. Перечисление всех остальных столбцов обязательно.
^Замечание Рекомендуется всегда перечислять столбцы, в которые должны быть вставлены данные. Особенно это замечание касается хранимых процедур. Предположим, что в хранимой процедуре не были явно указаны столбцы, в которые должны быть вставлены данные, т. е. вставка данных производилась последовательно во все столбцы таблицы. На каком-то этапе структура таблицы была изменена. Например, изменилось количество столбцов или их порядок, поменялись их имена, были определены
1124
Часть V. Программирование значения по умолчанию или сделаны другие изменения. Если количество столбцов и типы данных не изменились коренным образом, то хранимая процедура, ничего не подозревая о проделанных модификациях, будет продолжать вставлять данные. Однако логическая целостность окажется нарушенной. Если бы имена столбцов были бы указаны явно, то процедура либо выдала ошибку, либо продолжала корректно работать. В таблицу можно было бы легко добавить новые столбцы, разрешив для них хранение значений NULL, ИЛИ определив значения по умолчанию. В этом случае процедура продолжала бы корректно работать.
•
VALUES ({DEFAULT | NULL | expression} [,...n]) После ключевого слова VALUES указываются значения, которые должны быть вставлены в перечисленные столбцы. Порядок указания вставляемых значений должен строго соответствовать порядку перечисления столбцов. Как видно из синтаксиса, с помощью команды INSERT МОЖНО вставить не только явное значение, но и значение по умолчанию, определенное для столбца. Для этого достаточно указать ключевое слово DEFAULT. При указании NULL В столбец будет вставлено значение NULL. Однако необходимо убедиться, что столбец позволяет хранение этих значений. Для вставки конкретного значения достаточно указать необходимое выражение. В этом выражении могут использоваться константы и переменные, но запрещается вызов подзапросов, функций и других сложных выражений. При необходимости подзапросы и функции могут быть выполнены заранее, а возвращаемый результат занесен в переменную, которая и будет указана при вставке строки. Конструкция [,.. .п] говорит о том, что в скобках может быть указано множество значений. Более того, количество вставляемых значений должно строго соответствовать количеству столбцов, перечисленных с помощью конструкции ( c o i u m n i i s t ) . Если список столбцов не задан явно, то количество указываемых значений должно соответствовать количеству столбцов таблицы за Исключением Столбцов СЧеТЧИКа (IDENTITY) И столбцов timestamp. Замечание В принципе, в столбец счетчика допускается вставка значений, указанных пользователем. Для разрешения этой возможности используется команда SET IDENTITY_INSERT
[databas.e . [ o w n e r . ] ] { t a b l e }
{ON
|
OFF}.
derived_table
В предыдущем пункте было рассмотрено явное задание значений, вставляемых в столбцы, с помощью ключевого слова VALUES. Однако этот метод с помощью одной команды INSERT позволяет вставить всего одну строку в таблицу. Но часто бывает необходимо с помощью одной команды разместить в таблице множество строк. При этом данные обычно берутся из одной или нескольких таблиц. Конечно, вставка за раз по одной строке без возможности использования подзапросов требует больших затрат. Решением проблемы является вставка данных на основе результата выборки, возвращаемого обычной командой SELECT. Аргумент d e r i v e d t a b i e как раз и подразумевает использование команды SELECT, С ПОМОЩЬЮ которой должен быть подготов-
Глава 28. Вставка, удаление и изменение данных
1125
лен набор данных, добавляемых в таблицу. Можно применять как простые запросы, просто выбирающие столбцы одной таблицы, так и сложные запросы, использующие объединение, агрегирование, различные выражения, преобразования и т. д. Единственным требованием к результату выборки является соответствие количества и порядка возвращаемых столбцов порядку и количеству столбцов, перечисленных в конструкции ( c o i u m n i i s t ) команды INSERT. Использование команды SELECT будет рассмотрено в следующей главе. П
execute_statement
Предыдущий параметр позволяет выполнять вставку строк в таблицу на основе результата выполнения запроса. Однако, если один и тот же запрос выполняется множеством пользователей, его можно реализовать в виде хранимой процедуры, которая будет возвращать нужный набор данных. Это особенно полезно при работе со сложными запросами, обращающимися к множеству таблиц. Администратору базы данных достаточно один раз разработать хранимую процедуру, а пользователям — вызвать ее для получения необходимых данных. С помощью аргумента execute_statement результат выполнения команды EXECUTE будет вставлен в таблицу. В команде EXECUTE могут выполняться как команды SELECT И READTEXT, так и хранимые процедуры. Использование хранимых процедур для подготовки набора данных для вставки имеет ряд преимуществ. Например, можно не разрешать пользователям непосредственный доступ к таблицам, а ограничиться предоставлением им права на выполнение процедуры. Кроме того, при изменении логики формирования набора данных администратору достаточно будет исправить одну хранимую процедуру, и не вносить никаких изменений в клиентские приложения. Результат, возвращаемый командой EXECUTE, должен следовать всем правилам, относящимся к команде SELECT И описанным в предыдущем пункте. В частности количество, порядок и типы данных, возвращаемые командой EXECUTE, должны соответствовать списку столбцов, указанных с помощью конструкции (column_list) . Самый простой вариант команды INSERT МОЖНО записать в виде: INSERT table_name VALUES (expressions [,...n])
После ключевого слова VALUES В скобках должны быть перечислены значения для всех столбцов таблицы кроме столбца-счетчика (IDENTITY) И столбца timestamp. Например, для вставки новой строки в таблицу authors необходимо выполнить команду: INSERT authors VALUES ('237-52-1978', 'Mamaev1, 'Evgeniy', '390 223-3418', 'Puschkina 6', 'Abakan', 'KH','65500', 0)
В более сложных вариантах можно явно указывать столбцы, для которых необходимо задать явные значения. Например, приведенный ниже пример добавляет новую строку в таблицу authors, указывая значения только для четырех столбцов из девяти: INSERT authors (au_id, au_lname, au_fname, contract) VALUES ('238-52-1978', 'Mamaev', 'Evgeniy1, 0)
1126
Часть V. Программирование
В рассмотренных примерах вставляемое значение задается с помощью констант. Нетрудно привести пример с использованием переменных: DECLARE @Varl char(10), @Var2 char(30), @Var3 char(30). SET @Varl='239-52-1978' SET @Var2='Mamaev' SET @Var2='Evgeniy' INSERT authors (au__id, au_lname, au_fname, contract) VALUES (@Varl, @Var2, @Var3, 0)
Во всех рассмотренных примерах данные для вставки были подготовлены заранее, и их значение было известно до выполнения вставки данных. Однако такой подход позволяет вставить за одну команду только одну строку. Рассмотрим пример добавления в таблицу множества строк на основе результата выполнения запроса. Для этого сначала создадим таблицу compact authors: CREATE TABLE compactauthors (au_id char(10), name char(15), phone char(12))
Теперь вставим в созданную таблицу строки: INSERT compactauthors SELECT au_id, CAST((RTRIM(au_lname)+ 1 '+LEFT(au_fname,l)+'.') as CHAR(15)), phone FROM authors WHERE contract=l AND state='CA'
После выполнения команды в таблицу compactauthors будет добавлено тринадцать строк. Для просмотра содержимого таблицы выполним следующий запрос: SELECT * FROM compactauthors
Будет получен результат: au_id
name
172-32-1176 White J. 213-46-8915 Green M. 238-95-7766 Carson С 267-41-2394 O'Leary M. 274-80-9391 Straight D. 409-56-7008 Bennet A. 427-17-2319 Dull A. 472-27-2349 Gringlesby B. 486-29-1786 Locksley С 672-71-3249 Yokomoto A. 724-80-9391 MacFeather S. 756-30-7391 Karsen L. 846-92-7186 Hunter S. (13 row(s) affected)
phone 408 415 415 408 415 415 415 707 415 415 415 415 415
496-7223 986-7020 548-7723 286-2428 834-2919 658-9932 836-7128 938-6445 585-4620 935-4228 354-7128 534-9219 836-7128
Приведенный пример иллюстрирует формирование значений для столбца name как результата обработки столбцов aufname и auiname исходной таблицы authors. Это сравнительно простой пример. В более сложных запросах могут использоваться подзапросы, множество таблиц, сложные функции агрегирования и т. д. Все это позволяет реализовывать очень сложные алгоритмы обмена данными.
Глава 28. Вставка, удаление и изменение данных
1127
Команда SELECT...INTO Команда INSERT предоставляет пользователям мощные средства закачки данных в таблицу. Однако эта команда разрешает вставлять данные только в созданную таблицу. Тем не менее, иногда бывает необходимо добавить данные в отдельную таблицу. Конечно, можно сначала создать таблицу с помощью команды CREATE TABLE и потом закачать в нее нужные данные. Но можно воспользоваться командой SELECT...INTO, которая позволяет автоматически создавать новую таблицу на основе результата выборки данных.
(
Замечание
J
Мы рассматриваем команду S E L E C T . . . I N T O как отдельную команду, но на самом деле это просто один из режимов работы команды S E L E C T . Тем не менее, создание
новой таблицы на основе выборки имеет специфические моменты. Структура создаваемой таблицы полностью определяется форматом данных, получаемых при выполнении запроса. От пользователя требуется только указать имя таблицы, которую необходимо создать. Кроме того, перед выполнением команды SELECT...INTO следует убедиться, что в базе данных уже не имеется таблицы с таким же именем. В противном случае выполнение команды будет прервано. Синтаксис команды SELECT...INTO таков: SELECT {column_name [[AS] column_alias], ...n} INTO new_table FROM {source_table, ...n} [<select_options>]
Рассмотрим подробно назначение и использование каждого из аргументов: О
column_name
Имя столбца одной из таблиц, указанных в списке FROM { s o u r c e t a b i e [, . . .n] }. Указанный столбец будет включен в результат выборки. Если имя столбца повторяется в нескольких таблицах, то необходимо дополнительно привести имя таблицы. С другой стороны, если из разных таблиц выбирается множество столбцов с одинаковыми именами, то необходимо использовать псевдонимы (alias). Дело в том, что по умолчанию в создаваемой таблице столбцы будут иметь то же имя, что и в исходной. При выборке нескольких одноименных столбцов из разных таблиц возникнет ситуация, что в одной таблице должно быть создано несколько столбцов с одинаковым именем. Однако это недопустимо. П
[AS]
column_alias
С помощью этого аргумента указывается псевдоним, который будет присвоен столбцу. Псевдонимы позволяют присваивать столбцам имена, отличные от первоначальных. Использование псевдонимов необходимо при выборке нескольких одноименных столбцов из разных таблиц. Кроме того, если данные в столбе формируются не простым копированием, а после дополнительной обработки одного или более столбцов одной или более исходной таблицы, то этот столбец не имеет никакого имени. Тем не менее, при создании таблицы
1128
Часть V. Программирование
каждому из столбцов должно быть присвоено определенное уникальное имя. Это можно сделать с помощью псевдонима. •
INTO new_table
Указание ключевого слова INTO говорит о том, что на основе результата выборки должна быть создана новая таблица. Если запрос выполняется без указания INTO, то создание таблицы производиться не станет, и результат выборки будет выведен на экран. Имя создаваемой таблицы указывается с помощью аргумента n e w t a b i e . Необходимо убедиться, что в базе данных уже не имеется таблицы или представления с аналогичным именем. На основе выборки можно также создавать и временные таблицы (указав # или ## перед именем таблицы). Это предоставляет удобный механизм для временного хранения промежуточных данных. Например, можно в хранимой процедуре создать локальную временную таблицу, которая станет использоваться для хранения промежуточных данных. Эта таблица будет автоматически уничтожаться при завершении хранимой процедуры. Кроме того, если другой пользователь вызовет эту же хранимую процедуру, будет создана вторая таблица. При использовании стандартных таблиц применение команды SELECT...INTO требует дополнительной проверки на существование в базе данных указанной таблицы. При работе с временными таблицами эту проверку выполнять не нужно, т. к. разные копии хранимой процедуры могут без проблем создавать одноименные локальные временные таблицы. П
FROM { s o u r c e _ t a b l e , . . . n }
После ключевого слова FROM приводится список таблиц, из которых будут выбираться данные. Если указывается более одной таблицы, то их имена необходимо разделить запятой. Помимо указания существующих статических таблиц, можно использовать динамические таблицы, содержимое которых формируется во время выполнения запроса на основе результата выборки, возвращаемого подзапросом. О <select_options>
Эта конструкция подразумевает применение различных разделов команды SELECT (WHERE, ORDER BY, GROUP BY и т. д.). Однако использование этих раз-
делов не обязательно.
По у м о л ч а н и ю с о з д а н и е т а б л и ц ы с п о м о щ ь ю к о м а н д ы S E L E C T . . . I N T O з а п р е щ е н о .
Чтобы иметь возможность выполнить эту команду, необходимо на уровне таблицы разрешить ее выполнение. Для этого используется хранимая процедура sp_dboption
'database_name',
'select
into/bulkcopy',
TRUE. Вместо
аргумента database_name следует подставить имя нужной базы данных. Последний пример предыдущего раздела выполнял вставку в таблицу compactauthors набора строк на основе результата выборки. Рассмотрим пример использования команды SELECT...INTO, приводящий к такому же результату.
Глава 28. Вставка, удаление и изменение данных
1129
Единственное условие — необходимо гарантировать, что в базе данных уже нет таблицы или представления с именем compactauthors. Если для выполнения предыдущего примера такая таблица была создана, то ее нужно удалить с помощью следующей команды: DROP TABLE compactauthors
После этого можно выполнять команду SELECT...INTO: SELECT au_id, CAST((RTRIM(au_lname)+' '+LEFT(au_fname,1)+'.') as CHAR(15)) as name, phone INTO compactauthors FROM authors WHERE contract=l AND state='CA?
Как видно из примера, для второго столбца (name) был использован псевдоним, т. к. по умолчанию столбцу не присваивается никакого имени. Набор данных в таблице после выполнения приведенной команды будет идентичен набору данных, приведенному для последнего примера предыдущего раздела. До сих пор были рассмотрены примеры, выполняющие выборку данных лишь из одной таблицы. Следующий пример создает временную локальную таблицу # t i t i a u t h , состоящую всего из двух столбцов. Таблица содержит информацию об авторах и написанных ими книгах. Содержимое таблицы формируется на основе запроса, обращающегося к трем разным таблицам с применением дополнительных условий выборки данных. Выборка осуществляется только для авторов, проживающих в штате Калифорния и в городах Oakland, Berkeley, Palo Alto и Menlo Park. SELECT [Фамилия]=au_fname, [Название книги]=title INTO #titlauth FROM titleauthor, authors, titles WHERE authors.au_id=titleauthor.au_id AND titles.title_id=titleauthor.title_ID AND state='CA' AND city IN ('Oakland' , 'Berkeley', 'Palo Alto', 'Menlo Park 1 )
Просмотрим данные, которые были помещены в таблицу #titlauth: SELECT * FROM # t i t l a u t h
Будет получен результат: Фамилия
Название книги
Johnson Prolonged Data Deprivation: Four Case Studies Marjorie The Busy Executive's Database Guide Marjorie You Can Combat Computer Stress! Cheryl But Is It User Friendly? Dean Straight Talk About Computers Abraham The Busy Executive's Database Guide Ann Secrets of Silicon Valley , Stearns Cooking with Computers: Surreptitious Balance Sheets Stearns Computer Phobic AND Non-Phobic Individuals Livia Computer Phobic AND Non-Phobic Individuals Sheryl Secrets of Silicon Valley (11 row(s) affected)
1130
Часть V. Программирование
Изменение данных В предыдущих разделах была подробно рассмотрена вставка данных. Однако не менее важной операцией работы с информацией является и операция изменения. Нередко бывает, что с течением времени становится необходимым внести некоторые изменения в данные. В распоряжении пользователей имеется множество различных способов и методов выполнения таких изменений. Кроме того, можно просто удалить старые данные и вместо них вставить новые. Тем не менее, в Transact-SQL существует специальная команда, предназначенная для выполнения изменений данных в таблицах — команда UPDATE. С ее помощью за одну операцию можно изменять данные в нескольких столбцах множества строк таблицы. Кроме того, эта команда также может быть использована для выполнения различных вычислений с применением переменных, причем сами данные при этом не изменяются. Рассмотрим синтаксис команды UPDATE: UPDATE {table_name WITH ( [...rij'j I view_name I rowset_function_limited} SET {column_name = {expression | DEFAULT | NULL} I @variable = expression I @variable=column=expression} [,...n] {{[FROM {} [,... ,n] ] [WHERE <search_condition>]} I [WHERE CURRENT OF {{[GLOBAL] cursor__name} I cursor_variable__name} ] } [OPTION ( [,...n])]
Рассмотрим назначение и использование параметров команды: П
table_name WITH ( [...n]) С помощью этой конструкции указывается имя таблицы, в которой необходимо выполнить изменения. Дополнительно могут быть перечислены хинты, с помощью которых определяется режим блокирования данных в изменяемой таблице. Структура и использование конструкции аналогичны работе с одноименной структурой, описанной в разд. "Команда ISERТ" ранее в этой главе. Следует обратить внимание, что за одну операцию изменения могут быть модифицированы данные, находящиеся в одной таблице. Для изменения данных множества таблиц придется выполнить команду UPDATE количество раз, равное количеству таблиц.
О view_name Этот параметр определяет имя представления, данные которого необходимо изменить. При изменении данных представления следует учитывать, что за одну операцию допускается изменение данных, принадлежащих одной таблице. Если представление создано на основе, например, трех таблиц, и необходимо изменить данные во всех столбцах представления, то придется трижды запустить команду UPDATE.
Глава 28. Вставка, удаление и изменение данных
1131
П rowset_function_limited
Этот параметр подразумевает применение функций OPENQUERY И OPENROWSET, с помощью которых задается набор изменяемых строк. Эти функции используются при изменении данных через OLE DB, особенно на удаленных источниках. • SET После этого ключевого слова перечисляются имена столбцов, которые должны быть изменены. Помимо столбцов также допускается использование переменных. Может быть указано множество столбцов и переменных. •
column_name={expression I DEFAULT I NULL}
С помощью этой конструкции указывается, какое значение должно быть сохранено в конкретном столбце. Имя столбца задается с помощью параметра columnname. Если для столбца приведено значение по умолчанию, то, указав DEFAULT, можно присвоить столбцу это значение. При вводе параметра NULL столбец примет неопределенное значение. Однако использование параметра NULL возможно только в том случае, если для столбца разрешено хранение значений NULL. Параметр expression подразумевает указание выражения и предназначен для присвоения столбцу произвольных значений. Выражение может представлять собой константу, имя переменной, имя столбца и т. д. Кроме того, допускается использование различных операторов и функций. Также в выражении разрешается применение имени изменяемого столбца. В этом случае в выражение подставляется первоначальное значение, производятся все необходимые вычисления, и только после этого результат сохраняется в указанном столбце. d
@variable=expression
При использовании этой конструкции в переменную будет занесено значение указанного выражения. В выражении могут использоваться имена столбцов, переменных (в т. ч. той, в которую будет сохранен результат), констант и т. д. При этом изменения самих данных не происходит. Аналогичного результата можно добиться и при использовании команды SELECT. d
@variable=column=expression
Данный вариант подразумевает одновременное присваивание результата вычисления выражения переменной и столбцу. Это бывает полезно при выполнении изменений множества строк, когда значение следующей изменяемой строки зависит от значений предыдущих строк. Переменная может использоваться для значений предыдущих строк и указываться в выражении. Указанным способом можно легко пронумеровать строки таблицы, используя чтото Вроде SET @Varl=RowNum=@Varl+l. П
FROM { < t a b l e _ s o u r c e > }
Если для изменения данных используются значения, хранящиеся в других таблицах, то эти таблицы можно указать в разделе FROM. Синтаксис и применение этого раздела аналогичны использованию раздела FROM команды SELECT и было описано ранее в этой главе.
1132
Часть V. Программирование
П WHERE <search_condition> Конструкция определяет логические условия, ограничивающие диапазон изменяемых строк, а также устанавливающие связи между таблицей, указанной после ключевого слова UPDATE И таблицами, указанными в разделе FROM. Использование раздела WHERE И логических условий будет подробно рассмотрено в следующей главе при описании команды SELECT. •
WHERE CURRENT OF {{[GLOBAL] cursor_name } | cursor_variabie_name} Эта конструкция предназначена для обновления данных в курсорах. Изменение данных производится в текущей позиции курсора. Имя изменяемого курсора может быть указано непосредственно с помощью параметра cursor_name ИЛИ С ПОМОЩЬЮ переменной (cursor_variable_name). Если на сервере существуют локальный и глобальный курсоры с одинаковыми именами, то при указании ключевого слова GLOBAL будет использоваться глобальный курсор. В противном случае изменения станут производиться в локальном курсоре. Перед выполнением изменений в курсоре следует убедиться, что он поддерживает изменение данных.
•
OPTION
(
[,...n])
С помощью этого раздела пользователь может контролировать поведение оптимизатора запросов при выполнении изменений. Синтаксис данного раздела и описание всех параметров также будут рассмотрены в следующей главе при описании команды SELECT. Рассмотрим несколько примеров использования команды UPDATE. Чтобы не изменять данные в таблице authors, создадим временную таблицу, в которую скопируем часть данных из этой таблицы: SELECT au_id, au_lname, au_fname, phone INTO #auto FROM, authors WHERE state='CA' AND contract=l
Чтобы было с чем сравнивать, выведем содержимое этой таблицы: SELECT * FROM # a u t o
Будет получен следующий результат: аи id
аи lname
172-32-1176 White 213-46-8915 Green 238-95-7766 Carson 267-41-2394 O'Leary 274-80-9391 Straight 409-56-7008 Bennet 427-17-2319 Dull 472-27-2349 Gringlesby 486-29-1786 Locksley 672-71-3249 Yokomoto 724-80-9391 MacFeather 756-30-7391 Karsen 846-92-7186 Hunter (13 row(s) affected)
аи fname
phone
Johnson Marjorie Cheryl Michael Dean Abraham
408 415 415 408 415 415 415 707 415 415 415 415 415
Ann Burt Charlene Akiko Stearns Livia Sheryl
496-7223 986-7020 548-7723 286-2428 834-2919 658-9932 836-7128 938-6445 585-4620 935-4228 354-7128 534-9219 836-7128
1133
Глава 28. Вставка, удаление и изменение данных
Теперь изменим данные в столбцах aulname и aufname. В первом из них сохраним сразу имя и фамилию автора, а во втором — фамилию и первую букву имени. Причем будем изменять данные только тех авторов, у которых телефон оканчивается на цифру 8: UPDATE #auto SET au_lname=au_lname+' '+au_fname, au_fname=LEFT(au_fname,1)+'. '+au_lname WHERE phone LIKE '%8'
Теперь посмотрим результат: au_id
au_lname
172-32-1176 White 213-46-8915 Green 238-95-7766 Carson 267-41-2394 O'Leary Michael 274-80-9391 Straight 409-56-7008 Bennet 427-17-2319 Dull Ann 472-27-2349 Gringlesby 486-29-1786 Locksley 672-71-324 9 Yokomoto Akiko 724-80-9391 MacFeather Stearns 756-30-7391 Karsen 846-92-7186 Hunter Sheryl (13 row(s) affected)
au fname
phone
Johnson Marjorie Cheryl M. O'Leary Dean Abraham A. Dull Burt Charlene A. Yokomoto S. MacFeather Livia S. Hunter
408 415 415 408 415 415 415 707 415 415 415 415 415
496-7223 986-7020 548-7723 286-2428 834-2919 658-9932 836-7128 938-6445 585-4620 935-4228 354-7128 534-9219 836-7128
Теперь приведем пример использования переменных при изменении данных. Создадим временную таблицу, в которую скопируем данные из таблицы t i t l e s : SELECT title_id, title=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE " END, pub_id, type, price INTO #titl FROM titles WHERE type IN ('business', 'popular_comp', 'mod_cook') ORDER BY pub_id, price
После выполнения запроса создается таблица # t i t l , в которой будут содержаться следующие данные: title id title
pub id type
price
BU2075 You Can Combat Computer Stress. MC3021 The Gourmet Microwave MC2222 Silicon Valley Gastronomic Tre. PC9999 Net Etiquette BUI111 Cooking with Computers: Surrep. BU1032 The Busy Executive's Database . BU7832 Straight Talk About Computers PC8888 Secrets of Silicon Valley PC1035 But Is It User Friendly? (9 row(s) affected)
0736 0877 0877 1389 1389 1389 1389 1389 1389
2.9900 2.9900 19.9900 NULL 11.9500 19.9900 19.9900 20.0000 22.9500
business mod_cook mod cook popular comp business business business popular comp popular comp
Теперь выполним изменение данных с использованием переменной:
1134
Часть V. Программирование
DECLARE @Varl money, @Var2 int SET @Varl=0 UPDATE #titl SET @Varl=price=ISNULL(price,0)+@Varl*0.1, 1 title id=LEFT(type,3)+ISNULL(RIGHT(CAST(@Varl as char(6)),3),'NUL
При просмотре содержимого таблицы увидим следующее: title_id t i t l e
pub_id type
price
bus.99 You Can Combat Computer Stress.. mod.29 The Gourmet Microwave mod.32 Silicon Valley Gastronomic Tre.. pop.03 Net Etiquette bus.15 Cooking with Computers: Surrep.. bus.21 The Busy Executive's Database .. bus.11 Straight Talk About Computers pop.21 Secrets of Silicon Valley pop.17 But Is It User Friendly? (9 row(s) affected)
0736 0877 0877 1389 1389 1389 1389 1389 1389
2.9900 3.2890 20.3189 2.0319 12.1532 21.2053 22.1105 22.2111 25.1711
business mod_cook mod_cook popular_comp business business business popular_comp popular comp
Так как данный пример приведен только в качестве иллюстрации возможностей Transact-SQL по изменению данных, то не стоит искать здравого смысла в рассмотренном запросе.
Удаление данных Когда данные становятся неактуальными и ненужными, то рано или поздно перед пользователями встает вопрос об их удалении. Кроме того, иногда удаление строк является неизбежной частью работы с базой данных. Например, если вы готовите квартальный отчет, то вряд ли захотите, чтобы в нем фигурировали лишние данные, которые могут исказить достоверность отчета. Необходимо вовремя удалять ненужные данные из таблиц. Однако целью этого раздела не является рассмотрение причин удаления данных из таблиц. Ограничимся лишь рассмотрением чисто технической стороны удаления строк из таблиц базы данных. Минимальный блок, который можно удалить из таблицы — это строка. Для удаления одной и более строк таблицы служит команда DELETE, имеющая синтаксис: DELETE [FROM] {table_name WITH ( [...n]) I view_name I rowset_function_limited} [FROM {} [,...n]] [WHERE {<search_condition> I {[CURRENT OF {{[ GLOBAL ] cursor_name}I cursor_variable_name}]} ] [OPTION ( [,...n])]
Назначение и использование параметров команды DELETE аналогично одноименным параметрам команд UPDATE И SELECT.
В качестве демонстрации приведем запрос, который удаляет данные из таблицы # t i t i , созданной в предыдущем примере. Из таблицы будут удалены все строки, в которых названия книг содержат букву 1: DELETE FROM #titl WHERE CHARINDEX('1', title)>0
Глава 28. Вставка, удаление и изменение данных
1135
Будут удалены 4 строки, после чего в таблице останутся следующие строки: title_id t i t l e
.
BU2075 You Can Combat Computer Stress.. . MC3021 The Gourmet Microwave PC9999 Net Etiquette BU1111 Cooking with Computers: Surrep.. . BU1032 The Busy Executive's Database .. . (5 row{s) affected)
(
Замечание
pub_id type
price
0736 0877 1389 1389 1389
2.9900 2.9900 NULL 11.9500 19.9900
business mod cook popular comp business business
}
Перед тем, как удалить строки, иногда бывает полезно предварительно просмотреть их. Д л я этого м о ж н о з а м е н и т ь к л ю ч е в о е слова D E L E T E на S E L E C T *. В о т в е т б у д е т
выведен список строк, которые предполагается удалить. Однако этот метод не применим при работе с курсорами.
Механизмы массивного копирования Возможности переноса и обработки данных, предоставляемые службами трансформации данных DTS, могут быть использованы для решения самых изощренных задач. Но иногда бывает необходимо просто перенести в таблицу SQL Server 2000 данные из обычного текстового файла. Такой процесс называется массивным копированием (bulk copy). Особенностью массивного копирования является отсутствие любых изменений данных. Информация просто копируется из текстового файла в таблицу базы данных. Допускается использование только одного текстового файла и одной таблицы. В SQL Server 2000 имеется очень мощная система массивной закачки данных. Эта система даже имеет свой программный интерфейс, работающий через ODBC (ODBC BCAPI, ODBC bulk copy API). Используя этот API, независимые производители могут создавать свои собственные утилиты закачки данных или использовать его в приложениях OLE DB, ODBC, SQL-DMO или DB-Library. По сравнению с предыдущими версиями в SQL Server 2000 были внесены существенные изменения в архитектуру подсистемы массивного копирования. Теперь операции вставки данных обрабатываются оптимизатором запросов подобно обычным операциям вставки. Это позволяет дополнительно повысить скорость операций массивного копирования. Кроме того, операции массивной вставки данных не отражаются в журнале транзакций базы данных, что также положительно влияет на скорость операций вставки. SQL Server 2000 имеет несколько встроенных средств, с помощью которых можно выполнять массивную закачку данных: •
утилита командной строки bcp.exe;
•
команда Transact-SQL BULK INSERT;
О службы трансформации данных DTS. 37 Зак. 83
1136
Часть V. Программирование
(
Замечание
J
Массивная закачка с помощью DTS работает с API массивного копирования, а не использует у т и л и т у bcp.exe или команду B U L K
I N S E R T , которые, в свою
очередь,
также обращаются к API массивного копирования. Достоинством утилиты bcp.exe является возможность выполнения полной проверки ограничений целостности после закачки данных и автоматический запуск на основе расписания, используя интегрированный календарь. К недостаткам можно отнести отсутствие графического интерфейса и невозможность трансформации данных в процессе копирования. Высокая скорость передачи данных, работа с большими объемами информации и поддержка различных форматов данных делают эту утилиту чрезвычайно удобным и эффективным инструментом для обмена данными между SQL Server и различными приложениями, поддерживающими текстовые файлы.
Замечание Следует обратить особое внимание на перенос колонок типа timestamp и вычисляемых колонок. Непосредственная вставка таких данных в таблицу не поддерживается. Взамен SQL Server 2000 для колонок timestamp генерирует новые значения, а значения вычисляемых колонок вообще не хранятся в таблице, а получаются динамически при каждом обращении. При вставке в таблицу, имеющую колонку timestamp или вычисляемую колонку, следует изменить файл форматирования для пропуска этих колонок. При выполнении экспорта из таблицы SQL Server 2000 в текстовый файл значения для вычисляемых колонок и колонок timestamp сохраняются подобно обычным колонкам.
Область применения утилиты bcp.exe В утилите bcp.exe реализована поддержка текстовых файлов произвольного формата и поддержка стандарта Unicode. С помощью этой программы можно легко передавать данные между серверами SQL Server 2000 и SQL Server 7.0 с различными кодовой страницей, порядком сортировки и сопоставлением Unicode. Утилита bcp.exe также активно использовалась в SQL Server 7.0 при изменении на сервере одного из этих параметров. Перед тем, как изменить кодовую страницу, порядок сортировки или сопоставление Unicode производится выкачивание данных из всех таблиц в текстовые файлы и скриптование всех объектов базы данных. Затем выполняются все необходимые изменения, и перестраиваются системные базы данных. Заключительным этапом является создание объектов базы данных с помощью заранее подготовленных скриптов и последующее закачивание данных из текстовых файлов в только что созданные таблицы.
Замечание В зависимости от используемого формата текстового файла могут существовать некоторые ограничения на выполнение утилиты bcp.exe. Например, при использовании обычного текстового формата копирование данных на различных языках будет невозможно.
Глава 28. Вставка, удаление и изменение данных
1137
Другой областью применения утилиты bcp.exe является обмен информацией с системами, не поддерживаемыми SQL Server 2000. Практически любая программа, работающая с данными, поддерживает работу с текстовыми файлами. Не имея возможности обмениваться данными напрямую, можно в качестве промежуточного хранилища использовать текстовые файлы. В этом случае утилита bcp.exe может служить механизмом интеграции SQL Server 2000 с различными приложениями. Используя возможности подсистемы автоматизации, можно спланировать работу программы bcp.exe таким образом, что обмен данными будет происходить автоматически без участия администратора.
Импорт и экспорт данных утилитой bcp.exe Как уже говорилось, утилита bcp.exe обладает довольно высокой функциональностью. Конечно, отсутствие удобного графического интерфейса является значительным минусом, но, тем не менее, с ее помощью можно решать довольно "тяжелые" задачи переноса данных. Утилита bcp.exe может выполнять как экспорт, так и импорт данных. Как и все утилиты командной строки, параметры работы утилиты bcp.exe задаются с помощью специальных ключей. Для более детального знакомства с возможностями утилиты приведем все параметры ее запуска: Ьср {[[database_name.][owner].]{table_name I view__name} | "query"} {in | out | queryout I format} data_file [-m max_errors] [-f format_file] [-e err_file] [-F first_row] [-L last_row] [-b batch_size] t-n] [-C] [-w] [-N] t-V (60 I 65 | 70)] [-6] [-q] [-C code_page] [-t field_term] [-r row_term] [-i input_file] [-o output_file] [-a packet_size] [-S server_name[\instance_name]] [-U login_id] [-P password] [-T] [-v] [-R] [-k] [-E] [-h "hint [,...n]"]
Рассмотрим подробно назначение и использование каждого из параметров. СЗ database_name Независимо от того, какая конкретно выполняется операция — импорт или экспорт, этот параметр указывает базу данных, с которой будет работать утилита bcp.exe. Данный параметр не является обязательным и может быть опущен. В этом случае работа будет вестись с базой данных по умолчанию, установленной для пользователя, работающего с утилитой. d
owner Этот параметр указывает, кому принадлежит таблицы или представление, с которым будет работать утилита bcp.exe. Параметр также может быть опущен. В этом случае SQL Server 2000 предполагает, что владельцем объекта является текущий пользователь. Если такого объекта не существует, то предполагается, что владельцем является пользователь dbo.
П table_name
I view_name
Имя таблицы или представления, с которыми будет работать утилита.
1138
Часть V. Программирование
О "query"
Утилита bcp.exe не позволяет копировать данные из нескольких таблиц, но разрешает получать их с помощью запроса. При этом автоматически создается временная таблица, в которую вставляются данные, получаемые в результате выполнения запроса. Затем производится массивное выкачивание данных из этой таблицы во временный файл. Запрос разрешается указывать только при выполнении операций экспорта данных из SQL Server 2000. Указание имен базы данных, владельца, таблицы или представления при выборке данных с помощью запроса запрещается. П in | out | queryout
I format
Для программы bcp.exe необходимо явно указать направление перекачивания данных. Если нужно закачать данные из текстового файла в таблицу SQL Server 2000, то указывается in. Если же выполняется экспорт данных из SQL Server 2000 в текстовый файл, то используется out. Когда же требуется закачать в текстовый файл результат выполнения запроса, то следует применять queryout. Параметр format используется в том случае, когда нужно получить только файл форматирования, но не выполнять сам перенос. •
data_file Этот параметр задает имя текстового файла, с которым будет работать утилита bcp.exe. При выполнении импорта в SQL Server 2000 файл должен содержать необходимые данные, если же производится экспорт, то утилита удалит указанный файл, создаст его заново и заполнит данными.
П -m max_errors В процессе переноса данных могут возникнуть ошибки, связанные с тем, что в текстовом файле указаны неверные данные. Параметр -m m a x e r r o r s управляет количеством ошибок, которое будет допускать утилита bcp.exe. Если копируемая строка имеет неправильный формат, то она игнорируется. При этом на единицу увеличивается счетчик ошибок. Когда счетчик достигает указанной величины, процесс переноса данных прерывается и генерируется сообщение об ошибке. По умолчанию допускается 10 ошибок независимо от количества переносимых строк. П -f
format_file
Утилита bcp.exe позволяет работать с текстовыми файлами, имеющими произвольные разделители строк и колонок. Кроме того, поддерживается работа с различными форматами самих данных. Сам текстовый файл не содержит никакой информации о своем формате. Эта информация должна указываться отдельно одним их трех следующих способов: •
пользователь вводит ее интерактивно, отвечая на вопросы утилиты;
•
с помощью ключей форматирования -п, -с, -w, -б и -N;
•
взять ее из специального файла форматирования с расширением fmt, который можно создать вручную или с помощью утилиты bcp.exe.
Глава 28. Вставка, удаление и изменение данных
1139
Если выполняется импорт данных из SQL Server 2000, то необходимо указать формат, в котором будут сохранены данные. В том случае, когда данные закачиваются в SQL Server 2000, файл форматирования определяет, как будут рассматриваться данные в файле. С помощью параметра -f format_fiie указывается имя файла форматирования, содержащего описание структуры текстового файла. Файл форматирования может быть создан автоматически в процессе работы утилиты. Для этого используется ключ - format, описание работы которого было дано ранее. Имя файла, который должен быть получен, указывается в параметре -f f o r m a t f i i e . Если этот параметр опущен, то по умолчанию создается файл bcp.fmt. П -е e r r _ f i l e Как уже говорилось, в процессе переноса данных могут встретиться ошибки. По умолчанию неправильные строки игнорируются и пропускаются. Найти потом эти ошибочные строки довольно проблематично. Утилита bcp.exe позволяет копировать неверные данные в отдельный файл. Пользователь может позже исправить несоответствия в полученном файле и добавить их в таблицу. Параметр -е e r r f i l e предписывает утилите сохранять неверные строки в указанном файле. Если этот параметр опущен, то файл не создается, и информация об ошибках не сохраняется. •
-F first_row Предположим, что вы выполняли копирование миллиона строк, и где-то на половине переноса произошел сбой. Часть данных была скопирована, а другая — нет. Утилита bcp.exe позволяет продолжить копирование с того места, на котором оно прервалось. Для этого используется параметр - F f i r s t r o w . С его помощью можно явно указать, с какой строки текстового файла следует начинать копирование. По умолчанию копирование начинается с первой строки файла.
П -L last_row Помимо того, что можно начать копирование с определенной строки, пользователь также может указать до какой строки включительно следует выполнять перенос. Используя параметр -L l a s t r o w совместно с параметром - F f i r s t r o w , можно разбить весь процесс копирования на отдельные блоки. По умолчанию для параметра -L iast_row устанавливается значение 0. Это означает, что будут скопированы все строки, начиная с указанной в параметре - F f irst_row, и до конца файла. П -b batch_size Для каждой базы данных можно установить, будут ли операции вставки данных при выполнении массивного копирования выполняться с помощью транзакций или же они станут производиться напрямую. Вставка данных с помощью транзакций позволяет добавить либо все данные, либо никаких. По умолчанию утилита bcp.exe вставляет все данные одним блоком. Если эта операция выполняется с использованием транзакций и происходит ошибка при вставке всего лишь одной строки, то производится откат всей операции встав-
1140
Часть V. Программирование
ки. Если осуществляется вставка нескольких сотен тысяч строк, то такой вариант неудовлетворителен. Для решения этой проблемы утилита bcp.exe позволяет выполнять вставку данных блоками или пакетами (batch). Пакет состоит из ограниченного количества строк. Вставка каждого пакета выполняется как отдельная транзакция. Неудачная вставка одного пакета не приведет к полной отмене массивного копирования. Весь процесс добавления разбивается на множество более мелких операций. Количество строк в пакете устанавливается с помощью параметра -ь b a t c h s i z e . Запрещается использование этого параметра СОВМесТНО С Параметром -h "ROWS_REP_BATCH=nn".
• -n Как уже говорилось, утилита bcp.exe может работать с различными форматами текстовых файлов. Кроме того, имеется специальный формат файлов, называющийся исконным (native). В этом формате данные представляются именно в том виде, в каком они хранятся в таблице SQL Server 2000. Пользователь не должен указывать никакой информации о формате текстового файла. Полученный файл исконного формата не может быть просмотрен напрямую в текстовом редакторе. Исконный формат обеспечивает наиболее высокую производительность операций массивного копирования. К недостаткам можно отнести несовместимость с другими приложениями. Исконные файлы поддерживаются только серверами SQL Server. При использовании опции -п для создания текстовых файлов для SQL Server 6.x следует учесть, что колонки Unicode не будут восприниматься в SQL Server 6.x. П -с Если нужно, чтобы все данные в текстовом файле были сохранены в символьном виде, то необходимо использовать ключ -с. Полученный файл можно просматривать в любом текстовом редакторе и использовать для любой системы обработки информации. Для разделения колонок применяется символ табуляции \ t , а для разделения строк — символ новой строки \п. Если указывается ключ -с, то сведения о формате текстового файла приводить не нужно.
• -W Результатом использования этого ключа будет создание текстового файла, в котором все данные сохранены в текстовом формате с поддержкой Unicode. Для разделения колонок применяется символ табуляции \ t , для разделения строк — символ новой строки \п . Файлы Unicode в принципе можно прочитать с помощью текстового редактора, но это связано с определенными трудностями. Кроме того, такие файлы нельзя использовать, если нужно передать данные в SQL Server 6.x, т. к. эти системы не поддерживают стандарта Unicode. • -N Этот формат поддерживается только утилитой bcp.exe, поставляемой с SQL Server 2000 и SQL Server 7.0. В более ранних версиях (до SQL Server 7.0) поддержка этого формата не реализована. Формат является комбинацией фор-
Глава 28. Вставка, удаление и изменение данных
1141
матов, обеспечиваемых опциями -п и -w. При использовании опции -N ДЛЯ всех текстовых данных используется формат Unicode, а все другие типы данных представляются в исконном, внутреннем, формате SQL Server 2000. Такой подход обеспечивает высокую производительность наряду с возможностью хранения данных на любом национальном языке. Поэтому такие файлы часто применяются для переноса данных между серверами SQL Server 2000. Недостатком является то, что полученные текстовые файлы могут быть использованы только в SQL Server 2000. •
[-V
(60
|
65
|
70)]
Задание этой опции предписывает утилите использовать типы данных, совместимые с SQL Server указанной версии. Эта возможность не существовала в более ранних версиях утилиты bcp.exe.
• -6 Если подготавливаемый текстовый файл предназначен для SQL Server 6.x, то использование ключа -б предпишет утилите bcp.exe представлять данные в формате, доступном SQL Server 6.x. В противном случае не гарантировано, что все типы данных будут правильно считаны. Опция -б может использоваться совместно с опциями -с и -п. (
Замечание
~")
При копировании данных в SQL Server 6.x следует учесть, что в этой версии для полей типа b i t не поддерживается значение N U L L , поэтому утилита bcp.exe заменит N U L L на 0. Кроме того, при переносе полей типа d a t e t i m e и s m a l l d a t e t i m e данные всегда сохраняются в формате ODBC, а не в формате SQL Server 6.x. Поэтому могут возникнуть проблемы при переносе информации о дате и времени. •
-q
Если имя таблицы или представления, с которым будет работать утилита bcp.exe, содержит недопустимые символы, например пробелы, то имя должно заключаться в двойные кавычки. Дополнительно необходимо указать ключ -q, чтобы утилита восприняла значения в кавычках как имена объектов. L"J -С code_page
При переносе данных, не поддерживаемых Unicode (колонки типа t e x t , varchar и char), требуется явно указать, к какой кодовой странице они принадлежат. Однако этого можно не делать, если не используются символы кодом ниже 32 или выше 127. Для установки кодовой страницы предназначен ключ -с. Аргумент codepage может принимать одно из следующих значений: •
ОЕМ. Кодовая страница, установленная на локальном компьютере. Если опция -с не указана, то по умолчанию утилита bcp.exe работает именно в этом режиме.
•
АСР. Кодовая страница 1252 (ISO 1252, ANSI/Microsoft Windows).
•
RAW. При указании этого параметра данные записываются в "сыром" (raw) виде. Никакое преобразование не выполняется. Это позволяет достичь
1142
Часть V. Программирование максимальной производительности. Часто используется при работе с данными на однотипных серверах.
•
. В этом случае необходимо указать конкретный номер кодовой страницы, в соответствии с которым будет выполнено преобразование данных.
П -t field_term С помощью опции - t можно указать произвольный разделитель для колонок. По умолчанию используется символ табуляции (\t). О -г row_term С помощью опции -г можно указать произвольный разделитель для строк. По умолчанию используется символ перевода строки (\п). О -i input_file Если при запуске утилиты bcp.exe не указан ни один из параметров формата файла (ключи -п, -с, -w, -N ИЛИ -б), то пользователь для каждой колонки должен будет вручную ввести информацию о типе данных и его размерности. Утилита bcp.exe позволяет автоматизировать процесс ввода информации о форматировании данных. Для этого применяется файл ответов (response file). Это не то же самое, что файл форматирования. Файл ответов заменяет клавиатурный ввод, тогда как файл форматирования используется напрямую. Это можно сравнить с работой средств перенаправления MS-DOS, в частности символа <. О -о output_file Помимо того, что утилита bcp.exe позволяет не вводить данные с клавиатуры, а брать их из файла, она имеет возможность сохранять в отдельный файл всю информацию, выводимую в процессе работы на экран. Это сравнимо с использованием символа > при работе со средствами перенаправления MSDOS. Запись информации в файл может понадобиться при автоматическом запуске утилиты bcp.exe. Если в ходе ее работы произошли какие-либо ошибки, то администратор может позже проанализировать полученную информацию. Кроме того, если утилита выводит на экран много сообщений, не помещающихся на один экран, то также можно перенаправить их в файл. О -a packet_size Если утилита bcp.exe выкачивает данные из удаленного сервера, то не избежать использования сетевых протоколов. С помощью опции -а можно управлять размером пакета, передаваемого по сети. По умолчанию устанавливается минимальный размер пакета, равный 4096 байтам. Максимальный размер пакета равен 65 535 байт. Замечание Данные по сети передаются пакетами, размер которых может меняться. Скорость передачи данных зависит от размера пакета. Чем больше пакет, чем меньше управляющей информации приходится на один байт данных и тем выше скорость пере-
Глава 28. Вставка, удаление и изменение данных
1143
дачи данных. С другой стороны, повреждение пакета потребует повторной передачи данных. Если работа сети нестабильна и часто происходят сбои при передаче данных, то слишком большой размер пакета может существенно снизить производительность. Чтобы избежать этого, утилита bcp.exe может автоматически уменьшать размер пакета вплоть до минимального размера (4096 байт). Средний размер пакета за всю работу утилиты выводится после завершения переноса данных. О -S server_name [ \instance__name]
Если требуется скопировать данные с удаленного сервера, то следует явно указать его имя. Для этого используется опция -s. Если данные будут копироваться с локального сервера, то использование этой опции необязательно, т. к. по умолчанию утилита bcp.exe работает с локальным сервером. При необходимости следует указать имя инсталляции, с которой нужно работать. О -U login_id
С помощью этой опции указывается имя учетной записи SQL Server 2000, под которой будет работать утилита bcp.exe. Утилита сможет скопировать только те данные, к которым имеет доступ используемая учетная запись. Явное указание имени учетной записи в командной строке требуется при автоматическом запуске утилиты bcp.exe. Это позволит предоставить утилите фиксированный набор прав доступа, не зависящих от того, какой пользователь работает в конкретный момент на компьютере. d
-Р password
Эта опция задает пароль учетной записи, под которой устанавливается соединение с сервером. Если пароль не указан явно, то его необходимо будет ввести после запуска утилиты. При вводе в командной строке только опции -р (без пароля) для установления соединения будет использоваться пустой пароль.
• -т Эта опция предписывает утилите bcp.exe для соединения с сервером SQL Server 2000 использовать доверительное соединение. То есть права доступа утилиты bcp.exe будут соответствовать правам доступа учетной записи Windows NT пользователя, запустившего утилиту. При этом значения опций -и и -р будут проигнорированы.
Замечание Использование опции - т необходимо лишь в том случае, если явно указана опция -и. Если опция -и отсутствует, то по умолчанию устанавливается доверительное соединение с правами учетной записи Windows NT пользователя, запустившего утилиту bcp.exe, и нужды в использовании опции -т нет.
• -1 С помощью этого ключа можно получить информацию о версии утилиты bcp.exe.
1144 •
Часть V. Программирование
-R По умолчанию утилита bcp.exe игнорирует региональные установки, сделанные администратором для данных времени, даты, валюты, десятичных значений и других параметров. Получаемый текстовый файл будет иметь всегда один и тот же формат данных, независимо от региональных установок. Это позволяет стандартизировать операции обмена данными между серверами с различными значениями региональных установок. Но в некоторых случаях все же требуется, чтобы данные в текстовом файле соответствовали значениям региональных установок. Для этого необходимо использовать опцию -R.
• -к При указании этого ключа для пустых колонок текстового файла в таблицу станет добавляться значение NULL. В противном случае в таблицу будет вставлено значение по умолчанию, определенное для соответствующей колонки. •
-Е Если в таблице, в которую осуществляется вставка данных, имеется колонка с установленным свойством IDENTITY, TO ПО умолчанию при вставке каждой новой строки значение в этой колонке будет генерироваться автоматически SQL Server 2000. То есть значения для колонки IDENTITY В текстовом файле и колонке таблицы будут разными. Но часто бывает, что нужно вставить данные в колонку IDENTITY таким образом, чтобы они были идентичны данным в текстовом файле. Чтобы добиться этого, при запуске утилиты bcp.exe необходимо указать ключ -Е .
П
-h " h i n t
[,...n]"
Ключ позволяет выполнить некоторые дополнительные операции предварительной обработки данных перед вставкой их в таблицу. Управление этими операциями осуществляется с помощью специальных ключевых слов или хинтов (hint). Допустимы следующие хинты: •
CHECK_CONSTRAINTS. По умолчанию при вставке данных проверка ограничений целостности (constraints) не выполняется. Использование этого хинта заставит сервер произвести проверку на соответствие данных установленным ограничениям целостности. Если данные не соответствуют одному из установленных ограничений целостности, то вставка не осуществляется.
•
ORDER (column [ASC \ DESC] [ , . . . n ] ) . По умолчанию считается, что данные в текстовом файле не отсортированы. Если же при создании текстового файла данные не были упорядочены, то с помощью этого хинта можно указать их порядок сортировки в файле. В хинте указывается имя колонки (column), по которой выполнена сортировка и порядок сортировки — по возрастанию (ASC) ИЛИ убыванию (DESC). Указание порядка сортировки данных в текстовом файле в некоторых случаях может существенно повысить производительность операций вставки. Однако следует обратить внимание, что повышение производительности будет достигнуто
Глава 28. Вставка, удаление и изменение данных
1145
лишь в том случае, если сортировка выполнена по колонке, участвующей в кластерном индексе (clustered index). Если же указывается имя колонки, не участвующей в кластерном индексе или неправильное имя, то хинт ORDER игнорируется, и вставка данных производится в обычном режиме. •
TABLOCK. Применение этого хинта заставит SQL Server 2000 блокировать таблицу, в которую осуществляется вставка данных, на все то время, пока выполняется процесс массивного копирования. Блокирование таблицы позволяет повысить производительность операций вставки, т. к. управление блокировками осуществляется не на уровне отдельной строки или страницы, а на уровне таблицы. Это позволяет резко снизить затраты на ведение журнала блокировок. Недостатком блокирования является ограничения доступа к данным обычного пользователя. В то же время, использование хинта TABLOCK разрешает вставлять данные в таблицу нескольким процессам массивного копирования. Однако добавление данных несколькими процессами возможно только в том случае, если в таблице не определены индексы. Для каждой таблицы может быть установлено индивидуальное значение по умолчанию для хинта TABLOCK. ЭТО регулируется с помощью опции " t a b l e lock on bulk load".
•
KILOBYTES_PER_BATCH=CC. С помощью этого хинта можно явно указать, какой размер в килобайтах должен иметь пакет. Значение по умолчанию для этого параметра не определено.
•
ROws_PER_BATCH=bb. В отличие от предыдущего этот хинт определяет размер пакета не в килобайтах, а в строках. Операции переноса данных будут оптимизированы для указанного значения. Запрещается использование этого хинта совместно с опцией -ь. Значение по умолчанию для хинта ROWS_PER_BATCH не определено.
Замечание При работе с текстовыми файлами исконного формата (native format), подготовленными в SQL Server 6.x, использование хинтов не поддерживается.
Формат файлов утилиты bcp.exe Как уже говорилось, генерируемые утилитой bcp.exe текстовые файлы могут иметь разные форматы. Выбор конкретного формата зависит от целей экспорта. Например, если необходимо перенести данные между серверами SQL Server 2000, то лучше всего использовать исконный формат, обеспечивающий максимальную производительность. Если же данные должны быть отправлены как письмо электронной почты, то лучше прибегнуть к символьному формату. В этом случае все данные представляются в понятной форме и могут быть просмотрены визуально. Текстовые файлы, имеющие символьный формат, могут быть использованы практически в любой системе обработки информации, в текстовых процессорах,
1146
Часть V. Программирование
электронных таблицах и так далее. Рассмотрим пример получения текстового файла, данные в котором будут представлены визуально: bcp "pubs..discounts" out discounts.txt -с
Замечание Напомним, что для получения текстового файла в символьном формате необходимо указать ключ -с. Эта команда выполняет экспорт данных из таблицы discounts базы данных pubs. Таблица содержит три строки. В результате выполнения команды будет получен текстовый файл d i s c o u n t s . t x t , при просмотре которого можно будет увидеть следующее: Initial Customer Volume Discount Customer Discount
100
10 .50 б .70 5 .00
1000
8042
В файле имеется ПЯТЬ КОЛОНОК: discounttype, stor_id, lowqty, highqty И d i s count. По умолчанию колонки разделяются символом табуляции (\t), а строки — символом начала новой строки (\п). При необходимости в качестве разделителей могут быть использованы и другие символы.
Замечание В рассматриваемом примере данные копируются из базы данных pubs, поставляемой в комплекте с SQL Server 2000. Эта база имеется на каждом только что установленном SQL Server 2000. Поэтому результат выполнения представленной команды будет аналогичен приведенному.
Файл форматирования Как видно из предыдущего примера, в текстовом файле не содержится никакой информации о названии колонок, их размере, типе данных и т. д. При выполнении импорта данных из текстового файла в таблицу могут возникнуть проблемы с интерпретацией формата данных. Утилита bcp.exe должна иметь необходимую информацию о каждой колонке текстового файла. Эта информация хранится отдельно от самих данных в специальном файле форматирования (format file). Утилита bcp.exe позволяет пользователю не вводить информацию о формате данных, предлагая несколько стандартных форматов представления данных. Например, использование ключа -с приведет к созданию текстового файла в символьном формате, а ключа -п — к созданию текстового файла в исконном формате SQL Server 2000. (
Замечание
^
Полный список ключей, обеспечивающих создание текстового файла стандартного формата, следующий: -с, -n, -w, -б и -N. Более подробно каждый из этих ключей был рассмотрен ранее в этой главе.
Глава 28. Вставка, удаление и изменение данных
1147
Все же в некоторых ситуациях бывает необходимо получить текстовый файл своего собственного формата. В этом случае пользователь должен явно указать, в каком формате следует сохранить каждую из колонок таблицы. Если при запуске утилиты bcp.exe не указывается ни один из ключей форматирования (-с, -n, -w, -б или -N), TO пользователь должен будет ввести информацию о параметрах форматирования данных вручную. Утилита bcp.exe при этом запускается в интерактивном режиме и предлагает пользователю ряд вопросов. Формат конечного текстового файла будет зависеть от того, как пользователь ответит на эти вопросы. Рассмотрим, как поведет себя утилита bcp.exe, если в предыдущем примере убрать ключ форматирования -с: bcp "pubs..discounts" out discounts.txt
Приведем всю информацию, выдаваемую утилитой на экран: Password: Enter the file storage type of field discounttype [char]: Enter prefix-length of field discounttype [0]: Enter length of field discounttype [40]: Enter field terminator [none]: Enter the file storage type of field stor_id [char]: Enter prefix-length of field stor_id [0]: Enter length of field stor_id [4]: Enter field terminator [none]: Enter the file storage type of field lowqty [int-null]: Enter prefix-length of field lowqty [1]: Enter field terminator [none]: Enter the file storage type of field highqty [int-null]: Enter prefix-length of field highqty [1]: Enter field terminator [none]: Enter the file storage type of field discount [decimal]: Enter prefix-length of field discount [1]: Enter field terminator [none]: Do you want to save this format information in a file? [Y\n] Host filename [bcp.fmt]: Starting copy. 3 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 1 Avg
0 (3000.00 rows per sec.)
Как мы видим, сначала пользователь должен ввести пароль для своей учетной записи SQL Server 2000. Если пароль не указывается, то утилита пытается установить с сервером доверительное соединение. То есть утилите предоставляют права доступа, установленные для учетной записи Windows NT пользователя, запустившего утилиту bcp.exe.
1148
•
Часть V. Программирование
Замечание Если необходимо предоставить утилите bcp.exe права доступа произвольной учетной записи SQL Server 2000, то нужно воспользоваться ключами -и и -Р. После того, как пройдет авторизация прав доступа, пользователь должен будет ответить на ряд вопросов относительно формата, в котором в текстовом файле будут храниться переносимые колонки таблицы. Для каждой колонки необходимо ответить на три или более вопроса.
Замечание Количество вопросов, на которые должен ответить пользователь, напрямую зависит от количества колонок в таблице. Кроме того, количество вопросов, задаваемых для конкретной колонки, зависит от типа данных, установленного для этой колонки. Первый вопрос, задаваемый для каждой колонки, следующий: Enter the file storage type of field columnname [datatype]:
Пользователь обязан выбрать формат, в котором должна быть сохранена информация. По умолчанию предлагается тот же формат, что используется для хранения данных в таблице. Пользователь может выбрать и любой другой формат. В таблице 28.1 приведены сведения о типах данных, которые могут быть использованы в текстовом файле. Таблица 28.1. Использование различных типов данных Тип данных S Q L Server 2000
Ответ на вопрос
Опция Host file data type
Prefix Length
Binary
X
SQLBINARY
1, 1,2, 2
bit
b[it]
SQLBIT
0, 1,0, 1
Char
с [har]
SQLCHAR
2, 2, 2, 2
Datetime
d[ate]
SQLDATETIME'
0, 1, 1, 1
Decimal
N
SQLDECIMAL
float
f[loat]
SQLFLT8
Image
I[mage]
SQLBINARY
1, 1, 1, 1 0, 1, 1, 1 4, 4, 4, 4
int
i[nt]
SQLINT
0. 1,1,1
money
m[oney]
SQLMONEY
0, 1, 1, 1
Nchar
W
SQLNCHAR
2, 2, 2, 2
Ntext
W
SQLNCHAR
4, 4, 1, 1
Numeric
N
SQLNUMERIC
Nvarchar
W
SQLNCHAR
1, 1, 1, 1 2, 2, 2, 2
real
R
SQLFLT4
0, 1, 1, 1
Глава 28. Вставка, удаление и изменение данных
1149
Таблица 28.1 (окончание) Тип данных SQL Server 2000
Ответ на вопрос
Опция Host file data type
Prefix Length
Smalldatetime
D
SQLDATETIM4
0,1,1,1
smallint
s[mallint]
SQLSMALLINT
0, 1, 1, 1
SQLMONEY4
0, 1, 1, 1
smallmoney Text
T[ext]
SQLCHAR
4, 4, 4, 4
timestamp
X
SQLBINARY
1, 1,2, 2
tinyint
t[inyint]
SQLTINYINT
0, 1, 1, 1
Uniqueidentifier
U
SQLUNIQUEID
1, 1, 1, 1
Varbinary
X
SQLBINARY
1, 1, 2, 2
Varchar
c[har]
SQLCHAR
2, 2, 2, 2
После того, как информация о типе данных будет указана. Пользователь должен будет ввести информацию о длине префикса: Enter prefix-length of field columnname [n]: Значение допустимой длины префикса для каждого типа данных указано в табл. 28.1 в столбце Prefix Length. Для каждого типа данных указано четыре значения: •
первое значение указывается, если данные хранятся в исконном формате и хранение значений NULL не поддерживается;
•
второе значение также используется для исконного формата, но с поддержкой хранения значений NULL;
•
третье значение употребляется при сохранении данных в символьном формате без возможности хранения NULL;
•
последнее значение указывается для символьного формата с поддержкой NULL.
Следующий вопрос, на который должен ответить пользователь, касается количества байт, которое должно быть отведено в текстовом файле для хранения значений колонки: Enter length of field columnname [л]: Замечание Указание количества байт обязательно только для строковых данных. Если для колонки используется исконный тип данных, то указание количества байт для некоторых типов данных не поддерживается. Например, для хранения данных типа d a t e t i m e или u n i q u e i d e n t i f i e r всегда применяется фиксированное количество байт, и изменить это значение нельзя. Последний вопрос касается символа-разделителя, который будет служить для отделения текущей колонки от следующей. Для каждой колонки может быть
1150
Часть V. Программирование
использован индивидуальный разделитель. В качестве разделителей колонок в текстовом файле могут быть следующие символы: П \ t . Символ табуляции. П \п. Символ начала новой строки в файле. G \г. Символ перевода строки в файле. •
\\. Обратный слэш.
•
\0. Нулевой разделитель (Null — невидимый разделитель).
•
(*, н, 4, d и т. п.). Любой одиночный печатаемый символ. Использование управляющих символов (исключая символы табуляции, начала новой строки, перевода строки и нулевого разделителя) нежелательно по той причине, что они не будут печататься и колонки окажутся неразделенными.
•
($$\t**, !@#$%л&*(), * \ t \ r \ n * , bakkara2ooo и т. п.). Произвольная строка длиной до 10 символов, в которой могут быть использованы любые из вышеперечисленных символов.
После того, как вся информация о формате данных будет введена, пользователь должен решить, нужно или нет создавать файл форматирования. В файле форматирования сохраняются все ответы на вопросы о форматировании данных, задаваемые утилитой bcp.exe. Если предполагается выполнять перенос данных периодически, то чтобы избежать ввода данных форматирования вручную каждый раз при запуске утилиты bcp.exe, следует согласиться на создание файла форматирования. В этом случае необходимо будет дополнительно указать имя файла форматирования, в который будет записываться информация. По умолчанию выбирается имя файла bcp.fmt.
С
Замечание
^
В рассматриваемом примере выполняется копирование из таблицы, имеющей всего 4 колонки. При этом пользователь должен ответить более чем на 10 вопросов. Если же количество колонок в таблице значительно, то пользователь должен будет ответить на гораздо большее количество вопросов. Если при ответе на один из вопросов будет допущена ошибка, то утилиту нужно будет запустить заново и отвечать на вопросы вновь. Использование файла форматирования в этом случае может существенно облегчить процесс переноса данных.
На этом интерактивная часть работы утилиты bcp.exe заканчивается. Все последующие выводимые на экран данные носят чисто информативный характер. С помощью этих сведений пользователь может получить информацию о производительности работы утилиты bcp.exe. В рассматриваемом примере указано, что скопировано три строки. При этом размер сетевого пакета равен 4 Кбайт (значение по умолчанию). На выполнение экспорта данных понадобилось всего 1 мс. При этом была достигнута скорость копирования 3000 строк в секунду. Как видно, скорость работы утилиты bcp.exe очень высока.
Глава 28. Вставка, удаление и изменение данных
1151
^
Замечание
Если внимательно присмотреться к вопросам, то можно заметить, что в конце каждого из них в квадратных скобках указывается значение по умолчанию. Если пользователь в ответ на вопрос введет пустое значение (просто нажмет клавишу <Enter>), то утилита bcp.exe будет использовать указанное значение. Применение значений по умолчанию для всех вопросов приведет к тому же результату, что и использование ключа -п. То есть данные будут сохранены в исконном формате. Конечно, создание файла форматирования вовсе необязательно. Но все же, если есть вероятность, что в будущем понадобится выполнить подобную операцию экспорта данных, то рекомендуется создать файл форматирования. Кроме того, если необходимо будет перенести данные из текстового файла обратно в SQL Server 2000, то файл форматирования поможет избежать проблем с неправильной интерпретацией данных. Рассмотрим более подробно структуру файла форматирования и смысл хранимых в нем данных. На рис. 28.1 приведено содержание типичного файла форматирования. Длина префикса
г
Разделитель
/ г
столбцов
Порядок полей в файле
э
r
i
ч
1
SQLCHAR
(
4
2
SQLCHAR
0
40
3
SQLCHAR
0
20
4
SQLCHAR
0
2
SQLCHAR^
0
30
L5
,.r. "St" ••!••
"
V
Тип данных
/
1
pubjd
SQ L_L ati n 1 _G en eral_C p437_B in
2
pubjiame
SQ L_L atin 1 _G en eral _C p850_A S
3
city
SQL_Latin1_Geneial_Cp1_CI_AS
4
state
SQL_AltDiction_Cp850_CI_AI
"\г'л"
country \
4
^
_ Имя столбца на сервере
SQL Scandinavian Pref CP350 Cl AS 4
Размер данных ^ Порядок столбцов на сервере
\_Сопоставление столбца
Рис. 2 8 . 1 . Структура файла форматирования
Рассмотрим назначение каждого из параметров, приведенных на рисунке: • Версия. Версия SQL Server, к которой принадлежит утилита bcp.exe, участвовавшая в создании файла. • Количество столбцов. Количество колонок, которое содержится в текстовом файле. • Порядок полей в файле. Этот столбец определяет последовательность, в соответствии с которой в текстовом файле хранятся колонки таблицы. • Тип данных. Для каждой колонки в этом столбце указывается тип данных, в котором она сохранена в текстовом файле. Например, если колонка с типом данных decimal записывается в символьном формате, то для нее будет указано значение SQLCHAR.
1152
Часть V. Программирование
• Длина префикса. В этом столбце указывается количество символов, используемых для префикса. Существование значения в этом столбце обязательно лишь в том случае, если для колонки разрешено хранение значений NULL. Допускается использование только значений 0, 1, 2 и 4. По умолчанию используется значение 1. Если применение префикса нежелательно, то нужно указать значение 0. П Размер данных. В этом столбце задается количество байт, отводимых в текстовом файле для хранения данных колонки. G Разделитель. В этом столбце указывается разделитель полей в текстовом файле. Обычно для разделения колонок принято использовать символ табуляции (значение \ t ) . Для последней колонки таблицы указывается символ конца строки и перевода каретки (значение \г\п). При использовании символьного формата указанные значения позволят просматривать данные в удобной форме. • Порядок столбцов на сервере. В этом столбце указывается номер колонки таблицы, в которую будут вставлены данные из текстового файла. Эта информация используется только при импорте данных в SQL Server 2000. По уМОЛЧанИЮ значения В столбцах Server column order И Host file field order совпадают. О Имя столбца на сервере. При выполнении экспорта данных из таблицы утилита bcp.exe автоматически вставляет в этот столбец имя исходной колонки таблицы, из которой копировались данные в файл. Информация в этом столбце носит чисто информативный характер и нигде не используется. При создании файла форматирования вручную в текстовом редакторе можно установить для столбца server column name произвольное значение. Единственное требование — это поле не должно быть пустым.
Замечание Столбец S e r v e r column o r d e r предоставляет пользователю возможность манипулирования данными. Установив для определенной колонки значение 0, можно избежать копирования этой колонки в таблицу. Кроме того, изменяя значения в этом столбце, можно скопировать данные из текстового файла в таблицу, имеющую порядок колонок, отличный от порядка колонок текстового файла. Необходимо правильно указать номер колонки таблицы, в которую должны вставляться данные из колонки текстового файла и следить, чтобы данные из двух колонок файла не копировались в одну колонку таблицы. Количество колонок в файле и таблицы могут не совпадать.
• Сопоставление столбца. Указывается имя сопоставления, которое имел соответствующий столбец на сервере. Рассмотрим, что же получится после выполнения рассматриваемого примера. В ответ на все вопросы утилиты bcp.exe были приняты значения по умолчанию (просто нажата клавиша <Enter>). В итоге был получен файл форматирования bcp.fmt, содержащий следующую информацию:
8.0 5 1
SQLCHAR
0
40
""
1
discounttype
Cyrillic_General_CI__AS
Глава 28. Вставка, удаление и изменение данных
2 3 4 5
SQLCHAR SQLSMALLINT SQLSMALLINT SQLDECIMAL
0 1 1 1
4 2 2 19
2 3 4 5
1153
stor_id
Cyrillic_General_CI_AS
lowqty
""
highqty
""
discount
""
Полученный файл может быть с успехом использован в дальнейшем как для экспорта, так и для импорта данных.
Использование команды BULK INSERT Возможности, предоставляемые утилитой bcp.exe, способны удовлетворить самых требовательных пользователей. Однако существует одно серьезное ограничение, препятствующее ее массовому применению — программа bcp.exe является утилитой командной строки, и вызов ее из программы или хранимой процедуры связан с некоторыми сложностями. В принципе, использование утилиты bcp.exe возможно и при работе со средствами Transact-SQL. В комплекте с SQL Server 2000 поставляется набор системных хранимых процедур. Среди этих системных процедур имеется процедура xp_cmdsheli, с помощью которой можно получить доступ к командной строке и выполнить утилиту bcp.exe со всеми необходимыми ключами. Но все же это не лучший выход из положения. Разработчики Microsoft предполагали, что при выполнении программы или хранимой процедуры может появиться необходимость в переносе данных из текстового файла в таблицу SQL Server 2000. Поэтому они создали специальную команду Transact-SQL, с помощью которой можно производить операции массивного копирования. Название этой команды BULK INSERT. Команда BULK INSERT предоставляет доступ к механизмам массивного копирования средствами Transact-SQL и является аналогом утилиты bcp.exe. Но существует серьезное ограничение на область применения команды BULK INSERT. Проблема в том, что эта команда поддерживает только импорт данных из текстового файла в таблицу SQL Server 2000. Для экспорта данных в текстовый файл придется воспользоваться либо утилитой bcp.exe, либо службами трансформации данных DTS (Data Transformation Services). Достоинством команды BULK INSERT является то, что она, как и утилита bcp.exe, поддерживает файлы форматирования. Однако создать файл форматирования с помощью команды BULK INSERT нельзя. Его необходимо подготовить предварительно вручную или с помощью утилиты bcp.exe. Полный синтаксис команды BULK INSERT таков: BULK INSERT [['database_name'.]['owner']•]{'table_name! FROM data_file} [WITH ([ BATCHSIZE [= batch_size]] [[, ] CHECK_CONSTRAINTS] [[,] CODEPAGE [= 'ACP' I 'OEM' I 'RAW | 'code_page']] [[,] DATAFILETYPE [= {'char' | 'native'I 'widechar' I 'widenative'}]] [[,] FIELDTERMINATOR [= 'field_terminator']] [[,] FIRSTROW [= first row]]
1154
Часть V. Программирование [[,] [[,] [[,] [[,] [[,] [[,] [[, ] [[,] [[,]
FORMATFILE [= 'format_file_path']] KEEPIDENTITY] [[,] KEEPNULLS] KILOBYTES_PER_BATCH [= kilobytes_per_batch]] LASTROW [= last_row]] MAXERRORS [= max_errors]] ORDER ({column [ASC | DESC]} [,...n])] ROWS_PER_BATCH [= rows_per_batch]] ROWTERMINATOR [= 'row_terminator']] TABLOCK]) ]
Рассмотрим назначение каждого из используемых параметров. О database_name • Имя базы данных, в которой находится таблица, в которую будут копироваться данные. Указание этого параметра необязательно. d
owner Это необязательный параметр, указывающий владельца таблицы, в которую будут вставляться данные. Если имя владельца не указано, то предполагается, что таблица принадлежит пользователю, выполняющему команду BULK INSERT. Если такая таблица не найдена, то ищется таблица, принадлежащая пользователю dbo (data base owner, владелец базы данных).
О table_name Обязательный параметр, определяющий имя представления или таблицы, в которую будет выполняться копирование данных.
Замечание Если на сервере не существует указанной таблицы, то выдается сообщение об ошибке. Создание новой таблицы не производится. Проверьте правильность указания имени базы данных, владельца и собственно таблицы. О data_file Этот параметр указывает имя текстового файла, из которого будет осуществляться импорт данных. Необходимо указать полное имя файла. Допускается использование файлов, расположенных на жестком диске, дисководе, сетевом ресурсе и т. д. при использовании файла, расположенного в сети, полный путь к файлу указывается в формате UNC. •
BATCHSIZE = batch_size Этот параметр указывает, какое количество строк должно содержаться в одном пакете. Вставка в таблицу всех строк, включенных в один пакет, выполняется в теле одной транзакции. Если аргумент BATCHSIZE не указан, то по умолчанию размер пакета устанавливается максимальным. То есть все копируемые строки включаются в один пакет и вставляются за одну транзакцию.
•
CHECK_CONSTRAINTS По умолчанию проверка вставляемых строк на соответствие определенным в таблице ограничениям целостности (constraints) не выполняется. Это может привести к тому, что в таблицу будут вставлены некорректные данные. Что-
Глава 28. Вставка, удаление и изменение данных
1155
бы избежать этого, необходимо указать параметр CHECKCONSTRAINTS. После завершения вставки данных SQL Server 2000 выполнит проверку данных на соответствие ограничениям целостности. Если конфликтов не обнаружено, то транзакция подтверждается, и вставка данных фиксируется. В противном случае происходит откат транзакции, и вставка данных отменяется. П
CODEPAGE
[= 'АСР'
|
'OEM'
|
'RAW
|
'code_page']
Аргумент CODEPAGE определяет, для какой кодовой страницы был создан текстовый файл. При необходимости сервер выполняет автоматическое преобразование данных. Значение кодовой страницы используется для типов данных char, varchar и t e x t и влияет только на символы с кодом меньше 32 или больше 127, П
DATAFILETYPE [={'char' | 'native'I 'widechar' | 'widenative'}] Если при создании текстового файла был использован один из стандартных форматов (с помощью ключа -с, -n, -w или - N ) , TO, введя аргумент DATAFILETYPE, можно указать нужный формат. Рассмотрим назначение каждого из параметров:
П
•
char. Файл имеет символьный формат. Это самый простой формат текстовых файлов, который может быть сгенерирован практически любым приложением или введен вручную. Файл в этом формате может быть получен с помощью утилиты bcp.exe при использовании ключа -с.
•
n a t i v e . Это исконный формат текстовых файлов, специфичный для SQL Server. Файлы данного типа могут быть созданы с помощью утилиты bcp.exe при использовании ключа -п или с помощью служб трансформации данных DTS.
•
widechar. В этом случае предполагается, что данные в файле хранятся в символьном формате с поддержкой Unicode. Текстовый файл этого формата может быть получен с помощью утилиты bcp.exe с использованием ключа -w.
•
widenative. Формат является комбинацией исконного формата и символьного с поддержкой Unicode. Все данные в текстовом файле имеют исконный формат SQL Server 2000. Исключение составляют данные типа char, varchar и t e x t , для которых используется символьный формат с поддержкой Unicode. Текстовые файлы в этом формате могут быть сгенерированы утилитой bcp.exe при использовании ключа -N.
FIELDTERMINATOR [= '. field_terminator'] С помощью этого аргумента задается символ-разделитель, использованный в текстовом файле для разделения полей. Этот аргумент не применяется для файлов формата n a t i v e и widenative. По умолчанию предполагается, что колонки в файле разделены символом табуляции (\t).
•
•
FIRSTROW [=
first_row]
Если выборку строк из текстового файла нужно начать не с первой строки, то с помощью этого параметра можно указать номер строки, с которой будет начинаться выборка строк.
1156
'
Часть V. Программирование
П FORMATFILE [= ' format_f ile__path ' ] Если требуется использовать файл форматирования, то с помощью этого аргумента необходимо указать полный путь к файлу. О KEEPIDENTITY Если в таблице, в которую копируются данные, определена колонка с установленным свойством IDENTITY, то по умолчанию при вставке новой строки SQL Server 2000 будет автоматически генерировать последовательные значения для этой колонки. Значения, указанные в файле, будут игнорироваться. Чтобы вставить данные в колонку IDENTITY непосредственно из таблицы, необходимо в команде BULK INSERT использовать аргумент KEEPIDENTITY. •
KEEPNULLS Если в текстовом файле строка содержит пустое поле, то при вставке в таблицу такой строки в соответствующую колонку таблицы будет установлено значение по умолчанию. При использовании аргумента KEEPNULLS вместо вставки значения по умолчанию будет вставляться значение NULL.
•
KILOBYTES_PER_BATCH [= kilobytes_per_batch] Этот аргумент определяет приблизительный размер пакета в килобайтах. Для аргумента значение по умолчанию не определено.
•
LASTROW [= l a s t _ r o w ] С помощью данного аргумента можно указать, какая строка будет скопирована последней. В комбинации с аргументом FIRSTROW МОЖНО операцию вставки данных разбить на несколько отдельных операций. Если аргумент LASTROW опущен, то копирование выполняется до последней строки в файле.
•
MAXERRORS [= m a x _ e r r o r s ] Этот аргумент определяет максимальное количество ошибок, которое допустимо при копировании данных. Каждый раз, когда происходит ошибка, SQL Server 2000 увеличивает на единицу счетчик ошибок. При достижении указанного числа ошибок процесс массированного копирования прерывается, а пользователь получает сообщение об ошибке.
•
ORDER ({column [ASC | DESC]} [,...n]) Этот аргумент указывает, в каком порядке отсортированы строки в текстовом файле. Если колонка, по которой отсортированы данные в файле, входит в кластерный индекс таблицы, то указание этой колонки с помощью аргумента ORDER может увеличить производительность операций массивного копирования. По умолчанию считается, что данные в текстовом файле не отсортированы.
•
ROWS_PER_BATCH [= rows_per_batch] С помощью этого аргумента можно задать, какое количество строк должно быть включено в один пакет. Операции передачи данных будут оптимизированы для указанного значения. Параметр ROWS_PER_BATCH нельзя использовать совместно с параметром BATCHSIZE.
Глава 28. Вставка, удаление и изменение данных П
1157
ROWTERMINATOR [= ' r o w _ t e r m i n a t o r ' ]
По умолчанию для разделения строк в текстовом файле применяются символы конца строки (\п) и перевода каретки (\г). Если были использованы другие символы, то их можно указать с помощью аргумента ROWTERMINATOR. G
TABLOCK
С помощью этого ключа можно заставить SQL Server 2000 блокировать таблицу на все время выполнения вставки данных. При выполнении копирования большого количества строк это может существенно повысить производительность, т. к. не нужно будет тратить ресурсы на блокирование отдельных страниц и экстентов. На этом рассмотрение механизма массированного копирования можно считать законченным.
Глава 29
Выборка данных По большому счету вставка данных в таблицу является лишь подготовительным этапом к их использованию. В основном же работа с данными заключается в их изменении и выборке по различным критериям. Быстрая выборка данных по различным критериям является важнейшей задачей, стоящей перед любой системой управления базами данных. Если система не обеспечивает мощных и простых механизмов доступа к данным, то все остальные достоинства системы будут сведены на нет. В принципе, данные можно хранить и в текстовом файле, но поиск нужной информации и ее обработка потребуют очень больших усилий. SQL Server 2000 предоставляет пользователям гибкие средства доступа к данным. В одном запросе пользователи могут сразу обращаться к множеству разнообразных источников данных, возможно расположенных на разных серверах сети. За счет использования технологии OLE DB пользователи могут получить доступ не только к реляционным источникам данных, как это было бы во время применения ODBC, но и к нереляционным, таким как текстовые файлы и электронные таблицы. Для выборки данных в Transact-SQL существует команда SELECT, которая позволяет как делать простую выборку всех данных из одной таблицы текущей базы данных, так и выполнять сложные запросы одновременно к множеству таблиц различных баз данных, расположенных на нескольких серверах сети. В самом простейшем случае выборка данных производится с помощью команды: SELECT * FROM table_name
Эта команда выводит данные из всех столбцов для всех строк таблицы, т. е. в результате выполнения запроса возвращается вся информация, содержащаяся в таблице. Однако в большинстве случаев применяются более сложные конструкции, использующие группировку, агрегирование, подзапросы, условия и другие дополнительные механизмы управления запросом. Полный синтаксис команды SELECT следующий: SELECT select_list [INTO new_table_] FROM table_source [WHERE search_condition] [GROUP BY group_by_expression] [HAVING search_condition] [UNION] [ORDER BY order_expression [ASC I DESC]] [COMPUTE compure_expression] [FOR] [OPTION ]
Глава 29. Выборка данных
1159
Как видно, синтаксис команды SELECT может быть очень сложный. Пожалуй, команда SELECT является самой сложной и многофункциональной командой Transact-SQL. Разработчиками SQL Server 2000 были приложены большие усилия, чтобы сделать команду SELECT максимально наглядной и простой в использовании. В итоге перед пользователями предстала хорошо структурированная команда, разбитая на отдельные разделы. Каждый из разделов выполняет узкоспециализированную функцию и является практически независимым от других разделов. Пользователи могут указывать только те разделы, которые им действительно необходимы, и не вникать в логику работы остальных разделов. Хотя количество разделов довольно велико, на практике обычно применяется "облегченный" вариант команды SELECT: SELECT select_list [INTO new_table] FROM table_source [WHERE search_condition] [GROUP BY group__by_expression] [ORDER BY order_expression [ASC | DESC]]
Умение создавать правильные и эффективные запросы является важнейшим требованием к профессиональному разработчику. Можно не уметь работать с механизмами DTS, не представлять работы репликации, не знать о возможностях службы SQLServerAgent, но нужно уметь производить выборку данных по определенным критериям. Вряд ли можно перебрать все варианты использования команды SELECT. Нередко к одному и тому же результату можно прийти различными путями. Кроме того, оптимизатор запросов (query optimizer) при необходимости может изменить вид запроса для повышения производительности. Эти действия прозрачны для пользователя и приводят к требуемому результату. В следующих разделах будут подробно рассмотрены структура и использование всех разделов команды SELECT. П О мере возможности будут приведены примеры, демонстрирующие те или иные аспекты выборки данных.
Раздел SELECT С помощью этого раздела указывается список столбцов, которые будут включены в результат выборки. Кроме того, в этом разделе можно управлять количеством и качеством строк, входящих в результат выборки. Структура раздела SELECT такова: SELECT [ALL | DISTINCT] [TOP n [PERCENT] [ WITH TIES]] <select_list>
Рассмотрим использование параметров раздела. •
ALL
Это ключевое слово указывает, что в результат выборки должны быть включены все строки, возвращаемые запросом. То есть результат выборки может содержать повторяющиеся строки. Параметр ALL используется по умолчанию и его указание необязательно.
Часть V. Программирование
/160 П DISTINCT
Применение этого параметра позволяет исключить из возвращаемого результата повторяющиеся строки. Тем самым можно обеспечить уникальность каждой строки, возвращаемой запросом. Значения NULL считаются эквивалентными и включаются в выборку. Если DISTINCT не указывается, то будет использоваться параметр ALL. П
TOP n [PERCENT] [WITH TIES] С помощью этой конструкции можно ограничить количество строк, которые будут включены в результат выборки. После ключевого слова ТОР С ПОМОЩЬЮ параметра п задается максимальное количество строк, которое может содержать результат. Если указывается ключевое слово PERCENT, TO параметр п означает количество строк в процентах от общего числа строк, возвращаемых запросом. Например, если таблица содержит 50 строк, а запрос должен возвратить всего 30 строк, то при указании ТОР 50 PERCENT будет возвращено 15 строк.
•
Если в запросе используется раздел ORDER BY, определяющий порядок сортировки, то возможна ситуация, что вследствие ограничения количества возвращаемых строк будет разорвана цепочка однотипных строк. Указание параметра WITH TIES предписывает включить в результат выборки дополнительные строки, имеющие то же значение в столбцах, указанных в разделе ORDER BY, что и последняя строка. Например, если сортировка выполняется по названию штата и количество строк ограничивается с помощью ТОР, ТО возможна ситуация, что для одного из штатов будет выведена только часть строк. Чтобы вывести все строки, относящиеся к штатам, фигурирующим в выборке, достаточно использовать параметр WITH TIES. Применение WITH TIES допускается только совместно с разделом ORDER BY.
•
<select_list> С помощью этой конструкции формируется собственно список столбцов, которые будут включены в результат выборки, а также значения для этих столбцов. Структура этой конструкции такова: <select_list> ::= { * I {table_name I view_name I table_alias}.* I {column_name I expression | IDENTITYCOL I ROWGUIDCOL} [[AS] column_alias] | coluim_alias=expression} [,...n]
Рассмотрим подробно назначение каждого из параметров: • . *. Указание этого символа повлечет включение в результат выборки всех столбцов всех таблиц и представлений, участвующих в запросе и указанных в разделе FROM. Однако следует быть внимательным при выборке одноименных столбцов из разных таблиц. Обращение к таким столбцам будет весьма затруднено при дальнейшем использовании результата выборки, т. к. сервер вряд ли сможет определить, к какому конкретно столбцу необходимо обратиться. Порядок перечисления столбцов в результате выборки соответствует физическому порядку столбцов в таблице. Кроме
Глава 29. Выборка данных
1161
того, сначала перечисляются все столбцы первой таблицы, указанной в разделе FROM, затем второй таблицы и т. д., пока не будут выведены столбцы всех таблиц. Если не используется конструкция WHERE, TO ДЛЯ каждой строки одной таблицы будет выводиться полный набор комбинаций строк других таблиц. Например, если выборка производится из двух таблиц с количеством строк 23 и 13, то общее количество возвращенных строк будет 299 (23x13). •
{table_name | view_name I t a b l e _ a l i a s } . *. Позволяет ограничить КОличество столбцов включением только всех столбцов одной таблицы или представления. Как видно из синтаксиса, сначала указывается имя объекта, из которого будет производиться выборка, потом точка, и в конце СИМВОЛ *. Параметры t a b l e _ n a m e И view_name ГОВОРЯТ О ТОМ, ЧТО МОЖНО
ссылаться на конкретную таблицу или представление соответственно. Параметр t a b i e _ a i i a s позволяет ссылаться на данные через псевдоним таблицы. При этом под псевдонимом можно обратиться как к реальной физической таблице, так и к результату выборки, возвращаемому подзапросом (динамической таблице). В любом случае, имя объекта должно быть упомянуто в разделе FROM. •
coiumn_name. Подразумевает указание имени столбца, который должен быть включен в результат выборки. Столбец должен принадлежать таблице или представлению, указанному в разделе FROM. ЕСЛИ В таблицах* И представлениях, используемых в запросе, содержится более одного столбца с одинаковым именем и этот столбец должен быть включен в результат выборки, то помимо имени самого столбца следует указать имя таблицы, к которой принадлежит столбец. То есть необходимо задать полное имя столбца в формате tabie_name.coiumn_name. В противном случае нельзя будет определить, какой именно столбец должен быть включен в выборку.
•
expression. Этот параметр подразумевает указание выражения, на основе которого будет формироваться содержимое столбца. Имя столбца является частным случаем выражения. В выражении допускается использование констант, переменных, функций, имен столбцов, а также любых разрешенных операций над ними. Следует учитывать, что по умолчанию столбец, содержимое которого формируется на основе вычисления выражения, не имеет никакого имени. Если требуется присвоить столбцу конкретное имя, то необходимо указать псевдоним столбца. Псевдонимы столбцов будут описаны далее в этом разделе.
•
IDENTITYCOL. Указание этого параметра включает в результат выборки столбец-счетчик (с установленным свойством IDENTITY). Аналогичного результата можно добиться, явно указав имя столбца с помощью параметра coiumn_name. Использование параметра IDENTITYCOL позволяет гарантированно включить в результат выборки столбец счетчика, даже не зная его имени. Если в запросе участвует более одной таблицы, в которой имеется столбец счетчика, то дополнительно необходимо указать имя таблицы в формате table_name. IDENTITYCOL. В выборке вместо IDENTITYCOL
1162
Часть V.
Программирование
будет подставлено имя столбца, присвоенное ему при создании. Таким образом можно легко включить в выборку один и тот же столбец дважды. Если в таблице не определен столбец-счетчик, то при попытке использования параметра IDENTITYCOL будет выдано сообщение об ошибке, говорящее об указании неверного имени столбца. •
ROWGUIDCOL. Использование этого параметра похоже на применение предыдущего параметра. Наличие параметра ROWGUIDCOL позволяет включить в результат выборки столбец с установленным свойством ROWGUIDCOL. Принципы работы и использования этого параметра полностью соответствуют аналогичным характеристикам параметра IDENTITYCOL.
•
[AS] c o i u m n a i i a s . С помощью этого параметра можно определять псевдонимы (alias) для столбцов. Не нужно путать псевдонимы столбцов с псевдонимами таблиц или представлений. Использование псевдонимов позволяет изменять имена столбцов, под которыми они будут выведены в результат выборки, по сравнению с их первоначальными именами. SQL Server 2000 позволяет включать в результат выборки столбцы с одинаковыми именами или вообще без имен. С помощью псевдонимов можно . лишить столбцы имен или сделать их все одинаковыми. Тем не менее, обычно псевдонимы служат для формирования в результате выборки набора столбцов с разными именами или для присваивания столбцам более понятных названий, возможно на национальном языке. Также псевдонимы позволяют присваивать имена столбцам, формируемым на основе вычисления выражений. По умолчанию таким столбцам не присвоено никакого имени. Применение псевдонимов неизбежно при работе с подзапросами. Для ссылки на столбцы подзапроса каждый из столбцов обязан иметь конкретное уникальное имя. Если в подзапросе используются одноименные столбцы или столбцы на основе выражения, то им необходимо присвоить уникальные имена с помощью псевдонимов.
•
coiumn_aiias=expression. Этот параметр является вторым способом задания псевдонимов для столбцов. В этом варианте сначала указывается имя, которое будет присвоено столбцу в результате выборки, а после знака равенства — выражение, на основе которого будет формироваться столбец. В простейшем случае выражение допускает использование имени отдельного столбца, что позволяет просто назначить столбцу новое имя. В более сложных случаях применяются константы, переменные, функции, имена столбцов, над которыми производятся различные действия. Возможности, предоставляемые параметрами [AS] coiumnaiias и column_alias=expression, практически эквивалентны. (
Замечание^
^
Ниже будут приведены примеры, иллюстрирующие работу раздела S E L E C T . Все примеры основаны на применении базы данных pubs, автоматически устанавливаемой при инсталляции SQL Server 2000 и доступной каждому пользователю.
1163
Глава 29. Выборка данных
Использование параметра ALL не вызывает особых затруднений — будет выведен набор всех строк, имеющихся в таблице. Рассмотрим применение параметра DISTINCT на примере выборки всех штатов, в которых проживают авторы. SELECT DISTINCT state FROM authors state CA IN KS MD MI OR TN UT (8 row(s) affected)
Было возвращено всего 8 строк, хотя общее количество строк в таблице authors составляет 23. Следующий пример демонстрирует параметр WITH TIES. ДЛЯ начала приведем вариант, иллюстрирующий использование параметра ТОР без параметра WITH TIES: SELECT TOP 35 PERCENT au_id, au_lname, city, state FROM authors ORDER BY state
Будет возвращен результат: au id
аи lname
172-32-1176 White 213-46-8915 Green 238-95-7766 Carson 2 67-41-2394 O'Leary 274-80-9391 Straight 409-56-7008 Bennet 427-17-2319 Dull 472-27-2349 Gringlesby 486-29-1786 Locksley (9 row(s) affected)
city
state
Menlo Park Oakland Berkeley San Jose Oakland Berkeley Palo Alto Covelo San Francisco
CA CA CA CA CA CA CA CA CA
Теперь в этот же запрос добавим параметр WITH TIES: SELECT TOP 35 PERCENT WITH TIES au_id, au_lname, city, state FROM authors ORDER BY state
Будет возвращен следующий результат: аи id
аи lname
city
state
172-32-1176 213-46-8915 238-95-7766 267-41-2394 274-80-9391 409-56-7008
White Green Carson O'Leary Straight Bennet
Menlo Park Oakland Berkeley San Jose Oakland Berkeley
CA CA CA CA CA CA
Часть V. Программирование
1164 427-17-2319 Dull 472-27-2349 Gringlesby 486-29-1786 Locksley 672-71-3249 Yokomoto 724-08-9931 Stringer 724-80-9391 MacFeather 756-30-7391 Karsen 846-92-7186 Hunter 893-72-1158 McBadden (15 row(s affected)
Palo Alto Cove1о San Francisco Walnut Creek Oakland Oakland Oakland Palo Alto Vacaville
CA CA CA CA CA CA CA CA CA
Как видно, хотя указание параметра ТОР 35 PERCENT возвращает всего 9 строк, при указании параметра WITH TIES В результат выборки включаются все строки, имеющие значение 'СА' в столбце s t a t e . Если в разделе ORDER BY указывается более одного столбца, то будут добавлены только те строки, у которых значения в столбцах раздела ORDER BY совпадают со значениями последней возвращенной строки. / Использование псевдонимов не представляет особых проблем. Тем не менее, в качестве примера рассмотрим запрос, который возвращает столбцы под псевдонимом. Кроме того, для формирования одного из столбцов применяется выражение: SELECT TOP 10 [Название книги]=title, type as [Тип], price*ytd_sales as [Доход] FROM titles
Будет возвращен результат: Название книги
Тип
Доход
The Busy Executive's Database Guide Cooking with Computers You Can Combat Computer Stress! Straight Talk About Computers Silicon Valley Gastronomic Treats The Gourmet Microwave The Psychology of Computer Cooking But Is It User Friendly? Secrets of Silicon Valley Net Etiquette (10 row(s) affected)
business business business business mod_cook mod_cook UNDECIDED popular_comp popular_comp popular_comp
81859.0500 46318.2000 55978.7800 81859.0500 40619.6800 66515.5400 NULL 201501.0000 81900.0000 NULL
Следующий пример выполняет обновление идентификаторов для всех авторов, проживающих в Калифорнии, и оставляет старый идентификатор для остальных авторов. Кроме того, приведенный пример иллюстрирует различные способы указания псевдонима для столбцов. Имя псевдонима может быть задано непосредственно, в квадратных скобках, в одинарных или двойных кавычках. SELECT (CASE WHEN state='CA' THEN CAST(NEWID() as CHAR(36)) ELSE CAST(au_id as char(16)) END) as [Идентификатор], 'Имя'=au_fname, au_lname "Фамилия", ct=contract FROM authors
Глава 29. Выборка данных
1165
Будет возвращен следующий результат: Идентификатор
Имя
Фамилия
с
14699896-0466-11D3-ADBA- 204C4F4F5020 14699897-0466-11D3-ADBA- 204C4F4F5020 14699898-0466-11D3-ADBA- 2O4C4F4F5O2O 14699899-0466-11D3-ADBA- 2O4C4F4F5O2O 14 69989A-04 66-11D3-ADBA- 204C4F4F5020 341-22-1782 14 69989B-04 66-11D3-ADBA- 204C4F4F5020 14 69989C-04 66-11D3-ADBA- 204C4F4F5020 14 69989D-04 66-11D3-ADBA- 204C4F4F5020 14 69989E-04 66-11D3-ADBA- 204C4F4F5020 527-72-3246 648-92-1872 14 69989F-04 66-11D3-ADBA- 204C4F4F5020 712-45-1867 722-51-5454 14 6998A0-04 66-11D3-ADBA- 204C4F4F5020 14 6998A1-04 66-11D3-ADBA- 204C4F4F5020 14 6998A2-04 66-11D3-ADBA- 204C4F4F5020 807-91-6654 14 6998A3-04 66-11D3-ADBA- 204C4F4F5020 14 6998A4-04 66-11D3-ADBA- 204C4F4F5020 899-46-2035 998-72-3567 (23 row(s) a f f e c t e d )
Johnson Marjorie Cheryl Michael Dean Meander Abraham Ann Burt Charlene Morningstar Reginald Akiko Innes Michel Dirk Stearns Livia Sylvia Sheryl Heather Anne Albert
White Green Carson O'Leary Straight Smith Bennet Dull Gringlesby Locksley Greene Blotchet-Ha Yokomoto del Castill DeFrance Stringer MacFeather Karsen Panteley Hunter McBadden Ringer Ringer
1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1
Раздел INTO Раздел INTO предназначен для помещения результата выборки в отдельную таблицу, которая создается как часть выполнения запроса. Этот раздел уже был описан в предыдущей главе, и более не будет рассматриваться.
Раздел FROM С помощью этого раздела указываются таблицы и представления, из которых будет производиться выборка данных. При этом все таблицы и представления, участвующие в выборке данных, должны быть указаны в разделе FROM. Кроме того, даже если ни один из столбцов таблицы не включен в результат выборки, но используется в разделе WHERE, ORDER BY, GROUP BY ИЛИ других, то имя этой таблицы также должно быть указано в разделе FROM. Замечание Выборка данных из таблиц и представлений не имеет принципиальных различий, поэтому далее в основном будет рассматриваться только работа с таблицами. Од-
1166
Часть V. Программирование нако если не будет отмечено отдельно, то сказанное о таблицах может быть применено и к представлениям.
Раздел FROM имеет следующий синтаксис: FROM {} [ , . . . n ] : : = table_name [[AS] t a b l e _ a l i a s ] [WITH ( [ , . . . n ] ) ] I view_name [[AS] t a b l e _ a l i a s ] I rowset_function [[AS] t a b l e _ a l i a s ] I d e r i v e d _ t a b l e [AS] t a b l e _ a l i a s [(column_alias [ , . . . n ] ) ] I <joined_table> Рассмотрим подробно использование каждого из параметров: О table_name Имя таблицы, из которой будет производиться выборка. Любая таблица, из которой предполагается произвести выборку, должна быть указана в разделе FROM. Кроме того, даже если данные из таблицы непосредственно не выводятся в результат выборки, но участвуют в подготовке результата, то имя этой таблицы также должно быть приведено. Допускается применение таблиц, расположенных вне текущей базы данных, а также на других серверах сети. Для ссылки на таблицу базы данных локального сервера необходимо указать имя таблицы в формате database_name.table_name. Если же таблица находится на другом сервере, то дополнительно нужно указать и имя сервера. Чтобы иметь возможность работы с удаленными серверами, необходимо предварительно сконфигурировать связанные (linked) серверы на локальном SQL Server 2000. •
[AS] table_alias С помощью этого параметра можно присвоить таблице псевдоним, под которым на нее можно будет ссылаться в запросе. Часто псевдонимы служат для упрощения вида запроса при работе с длинными именами таблиц. Например, если в запросе часто упоминается таблица p u b s . t i t l e a u t h o r , то ей можно присвоить псевдоним, например, t a . Это позволит не писать каждый раз полное имя таблицы, а приводить короткое имя. Кроме того, псевдонимы таблиц активно используются при работе с подзапросами. Если в подзапросе будет выполняться обращение к той же таблице, что и в основном запросе, возможна ситуация, что подзапрос обращается к столбцу, а сервер не может определить, какое значение нужно вернуть — текущее значение основного запроса или значение, обрабатываемое в подзапросе. Применение псевдонима позволяет однозначно идентифицировать нужные данные.
О
WITH
(
[,...n])
С помощью этой конструкции можно установить конкретный режим блокирования по усмотрению пользователя. Если конструкция WITH не указана, сервер сам выбирает наиболее оптимальный режим блокирования. Режим блокирования устанавливается с помощью конструкции , имеющей следующую структуру:
Глава 29. Выборка данных
1167
::= {INDEX(index_val [,...n]) I FASTFIRSTROW | HOLDLOCK | NOLOCK I PAGLOCK | READCOMMITTED I READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK I SERIALIZABLE | TABLOCK | TABLOCKX | UPDLOCK}
Замечание Использование хинтов и описание уровней блокирования было рассмотрено в главе 19. view_name
[[AS] t a b l e _ a l i a s ]
С помощью этого параметра в запросе разрешается использование представлений, что позволяет производить из них выборку данных и применять в различных разделах. Работа с представлениями практически ничем не отличается от работы с обычными таблицами. Так же, как и для таблиц, для представлений можно использовать псевдонимы. rowset_function
[[AS] t a b l e _ a l i a s ]
Параметр row.set_f u n c t i o n подразумевает указание команд подготовки набора ДанНЫХ — OPENQUERY, OPENROWSET, FREETEXTTABLE ИЛИ CONTAINSTABLE. Эти
команды позволяют использовать в запросе динамические таблицы, построенные на основе данных, полученных в результате выполнения запросов к удаленным источникам данных OLE DB. В качестве таких источников данных могут выступать серверы Oracle, SQL Server, текстовые файлы, файлы DBF и XLS, базы данных MS Access и т. д. Подготовленному набору данных может быть присвоен псевдоним, что позволяет работать с данными как с обычной таблицей. derived_table
[AS] t a b l e _ a l i a s
[(column_alias
[,...n])]
Эта конструкция позволяет использовать в запросе динамические таблицы. Динамические таблицы представляют собой набор данных, формируемых в момент выполнения запроса на основе информации, возвращаемой подзапросом. Динамические таблицы не существуют физически в базе данных, и поэтому у них нет постоянного имени. Однако чтобы иметь возможность ссылаться на данные динамической таблицы, ей должно быть присвоено какое-то имя. Для этого используются псевдонимы, которые указываются с помощью параметра t a b i e a l i a s . В отличие от представлений и стандартных таблиц, для динамических таблиц указание псевдонима обязательно. Дополнительно с помощью параметра coiumnaiias можно задать псевдонимы для столбцов динамической таблицы, т. е. переименовать их. <joined_table>
Эта конструкция предназначена для выборки данных из связанных таблиц. В SQL Server 2000 нет механизмов автоматического отслеживания взаимосвязи данных с установленными ограничениями целостности FOREIGN KEY. ДЛЯ обработки таких данных может с успехом выступать конструкция <joined_table>. Помимо этого, конструкция <joined_table> используется и при связывании таблиц, между которыми не установлены ограничения целостности. Область применения конструкции <joined_table> станет более по38 Зак. 83
1168
Часть V. Программирование
нятна
при рассмотрении
типов
связывания.
Синтаксис
конструкции
<joined_table> таков: <joined_table> ::= <join_type> ON <search_condition> I CROSS JOIN I <joined_table>
Рассмотрим назначение и использование каждого из аргументов: •
. С помощью этого параметра указывается источник, из которого будут браться данные. В качестве источника может выступать стандартная статическая таблица, представление, функция подготовки набора данных (rowset function) или динамическая таблица. Весь текущий раздел посвящен практически только рассмотрению конструкции . Даже конструкция <joined_table> является частью конструкции . Таким образом, получается рекурсивная зависимость КОНСТРУКЦИЙ И <joined_table> Друг ОТ Друга, что позволяет создавать многоуровневые зависимости между таблицами.
•
<join_type>. Этот параметр определяет метод связывания данных двух таблиц между собой. От выбранного метода связывания зависит, какие конкретно строки каждой из двух связываемых таблиц будут рассматриваться при выполнении запроса. Структура конструкции <join_type> следующая: <join_type> ::= [INNER | {{LEFT | RIGHT | FULL} [OUTER]}] [<join__hint>] JOIN
Рассмотрим назначение параметров и их использование: • INNER. При задании этого типа связывания каждая из двух участвующих в связывании таблиц будет включать только те строки, для которых есть соответствие во второй таблице. Данный тип связывания используется по умолчанию. Соответствие определяется условием связывания, которое задается с помощью параметра <search_condition>. Например, если в качестве условия связывания таблиц t i t l e s и t i t i e a u t h o r рассматривать столбец titieid, то оно будет выглядеть как titles.title_id=titleauthor.title_id.
При Использовании СВЯЗЫВа-
ния INNER в каждую таблицу будут включены только те строки, для которых значения t i t l e _ i d имеются как в левой ( t i t l e s ) , так и в правой ( t i t i e a u t h o r ) таблицах. То есть в таблице t i t l e s будут доступны только те строки, у которых значение в столбце t i t i e _ i d соответствует значению столбца t i t i e _ i d хоть одной строки таблицы t i t i e a u t h o r . Аналогично, в таблице t i t i e a u t h o r будут доступны только те строки, у которых значение в столбце t i t i e i d соответствует значению столбца t i t l e _ i d ХОТЬ ОДНОЙ СТРОКИ таблицы t i t l e s .
• LEFT [OUTER]. При использовании этого типа связывания в левой таблице будут оставлены все строки независимо от того, есть ли для них соответствие в правой таблице. Применительно к предыдущему приме-
Глава 29. Выборка данных
1169
ру это означает, что если в таблице t i t l e s имеются книги, которые не упомянуты в таблице t i t i e a u t h o r , то строки, соответствующие этим книгам, все равно окажутся доступными. В правой же таблице будут доступны только те строки, для которых имеется соответствие в левой таблице. В столбцах, соответствующих отсутствующим данным правой таблицы, будут выведены значения NULL. •
RIGHT [OUTER]. Действие этого параметра обратно предыдущему. При использовании указанного типа связывания в правой таблице будут оставлены все строки независимо от того, есть ли для них соответствие в левой таблице. В результате выборки столбцы, отображающие данные левой таблицы, будут содержать значения NULL ВО всех строках, для которых нет соответствия.
•
FULL [OUTER] . Тип связывания разрешает использование всех строк связываемых таблиц. Можно представить этот тип связывания как одновременное использование LEFT И RIGHT (ЧТО не разрешено). При выборке в
столбцах с отсутствующими данными будет выведено значение NULL.
Замечание Тип связывания INNER МОЖНО легко заменить использованием оператора = в разде-
ле WHERE. С помощью специальных операторов *= и =* можно заменить типы связывания LEFT И RIGTH... •
<join_hint>. С помощью этой конструкции задается алгоритм связывания данных. Обычно сервер сам выбирает наиболее оптимальный режим связывания таблиц. Однако пользователь имеет возможность явно указать алгоритм связывания. Мы не будем рассматривать поведение сервера при использовании того или иного алгоритма, ограничившись приведением синтаксиса конструкции: <join_hint> ::= {LOOP | HASH | MERGE | REMOTE}
На этом рассмотрение теоретической части использования раздела FROM МОЖНО считать завершенным. Однако некоторые аспекты требуют приведения практических примеров. Для начала разберем пример применения в запросе двух таблиц с указанием псевдонимов: SELECT TOP 10 t.title, au_id, royaltyper as rtyper FROM titieauthor as ta, titles [t] WHERE t.title_id=ta.title_id
, Будет получен следующий результат: title
au_id
Prolonged Data Deprivation: Four Case Studies The Busy Executive's Database Guide You Can Combat Computer Stress! But Is It User Friendly? Cooking with Computers: Surreptitious Balance Sheets
172-32-1176 213-4 6-8 915 213-46-8915 238-95-7766 267-41-2394
rtyper 100 40 100 100 40
1170
Часть V. Программирование
Sushi, Anyone? Straight Talk About Computers The Busy Executive's Database Guide Secrets of Silicon Valley Sushi, Anyone? (10 row(s) affected)
267-41-2394 274-80-9391 409-56-7008 427-17-2319 472-27-2349
30 100 60 50 30
Использование представлений практически не отличается от использования таблиц и отдельно рассматриваться не будет. Заслуживает внимания работа с динамическими таблицами. В следующем примере в разделе FROM С ПОМОЩЬЮ подзапроса формируется динамическая таблица, которая будет доступна под псевдонимом dt. SELECT [Фамилия]=au_lname, [Имя]=au_fname, [Название произведения]=minititle FROM authors, (SELECT au_id, minititle=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE " END FROM titleauthor as ta, titles as t WHERE t.title_id=ta.title_id) as dt WHERE authors.au_id=dt.au_id AND state!='CA'
Будет получен результат: Фамилия
Имя
Название произведения
Blotchet-Halls del Castillo DeFrance Panteley Ringer Ringer Ringer Ringer (8 row(s) affected)
Reginald Innes Michel Sylvia Anne Anne Albert Albert
Fifty Years in Buckingham Pala... Silicon Valley Gastronomic Tre... The Gourmet Microwave Onions, Leeks, and Garlic: Coo... The Gourmet Microwave Is Anger the Enemy? Is Anger the Enemy? Life Without Fear
Следующий пример иллюстрирует использование связывания INNER ДЛЯ достижения того же результата, что и предыдущий пример: SELECT [Фамилия]=au_lname, [Имя]=au_fname, [Название произведения]=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE '' END FROM authors as a INNER JOIN (titleauthor as ta INNER JOIN titles as t ON ta.title_id=t.title_id) ON a.au_id=ta.au_id WHERE state!='CA'
В рассмотренном примере используется двойное связывание. Сначала выполняется связывание таблиц titleauthor и t i t l e s по столбцу t i t i e i d , а затем — связывание таблиц authors и titleauthor по столбцу au_id. В итоге таблицы authors и t i t l e s также оказываются связанными. Для полноты картины можно привести еще один пример, приводящий к достижению того же результата, но выполняющий связывание таблиц при помощи раздела WHERE: SELECT [Фамилия]=au_lname, [Имя]=au_fname, [Название произведения]=CAST(title as char(30))+
Глава 29. Выборка данных
1171
CASE WHEN LEN(title)>30 THEN '...' ELSE " END FROM authors a, titles t, titleauthor ta WHERE ta.au_id=a.au_id AND ta.title_id=t.title_id AND state!='CA'
Мы рассмотрели один из примеров использования связывания таблиц с помощью INNER. Теперь рассмотрим связывание таблиц с указанием LEFT И RIGHT. Чтобы иметь базу для сравнения, сначала приведем еще один пример применения связывания INNER: SELECT TOP 10 authors.au_lname, authors.au_fname, contract as ct, titleauthor.au_ord, titleauthor.royaltyper FROM authors INNER JOIN t i t l e a u t h o r ON authors.au id=titleauthor.au id ORDER BY contract ASC
Замечание Чтобы отследить поведение сервера при использовании различных методов связывания и не выводить полного содержимого таблиц, применяется сортировка по столбцу c o n t r a c t и ограничение на количество выводимых строк (ТОР 10).
В результате выполнения запроса будет получен результат: au_lname
au_fname
ct
au_ord royaltyper
White Green Green Carson O'Leary O'Leary Straight Bennet Dull Gringlesby (10 row(s) affected)
Johnson Marjorie Marjorie Cheryl Michael Michael Dean Abraham Ann Burt
1 1 1 1 1 1 1 1 1 1
1 2 1 1 2 2 1 1 1 3
100 40 100 100 40 30 100 60 50 30
Как видно, в результате имеются только строки, упомянутые в обеих таблицах. Запрос связывает строки таблиц authors и titleauthor по столбцу a u i d . В таблице titleauthor нет строк для авторов, у которых в столбце contract таблицы authors стоит значение 0. Для просмотра списка строк, существующих в таблице authors и отсутствующих в таблице titleauthor, выполним следующий запрос: SELECT au_id, au_fname, au_lname, contract FROM authors WHERE au_id NOT IN (SELECT au_id FROM titleauthor)
Будет получен результат: au_id
au_fname
341-22-1782 Meander 527-72-324 6 Morningstar 724-08-9931 Dirk 893-72-1158 Heather (4 row(s) affected)
au_lname
contract
Smith Greene Stringer McBadden
0 0 0 0
1172
Часть V. Программирование
Теперь заменим INNER на LEFT OUTER И посмотрим, к чему это приведет: SELECT TOP 10 authors.au_lname, authors.au_fname, contract as ct, titleauthor.au_ord, titleauthor.royaltyper FROM authors LEFT OUTER JOIN titleauthor ON authors.au id=titleauthor.au id ORDER BY contract ASC
Будет получен результат: au lname
аи fname
ct
au ord royaltyper
Smith Greene Stringer McBadden White Green Green Carson O'Leary 0 1 Leary (10 row(s) affected)
Meander Morningstar Dirk Heather Johnson Marjorie Marjorie Cheryl Michael Michael
0 0 0 0 1 1 1 1 1 1
NULL NULL NULL NULL
NULL NULL NULL NULL
1 2 1 1 2 2
100 40 100 100 40 30
В столбцах au_ord и royaltyper, принадлежащих таблице t i t l e a u t h o r , выведено значение NULL ДЛЯ тех авторов, информации о которых нет в таблице t i t l e a u t h o r . Изменение режима связывания LEFT на режим связывания RIGHT ДЛЯ ЭТОГО запроса приведет к тому же результату, что и использование режима связывания INNER. Дело в том, что для любой строки таблиц t i t l e a u t h o r есть соответствующая строка в таблице authors. Для демонстрации использования связывания RIGHT изменим запрос с двойным связыванием INNER, рассмотренный несколько ранее: SELECT [Фамилия]=au_lname, [Имя]=au_fname, [Название произведения]=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE '' END FROM authors as a RIGHT OUTER JOIN (titleauthor as ta RIGHT OUTER JOIN titles as t ON ta.title_id=t.title_id) ON a.au_id=ta.au_id WHERE pub_id='0877'
Замечание С помощью раздела WHERE ставится логическое условие, ограничивающее диапазон выборки. Это делается для уменьшения количества строк, получаемых в результате выполнения запроса.
Будет возвращен результат: Фамилия
Имя
Название произведения
del Castillo DeFrance Ringer NULL MacFeather Karsen
Innes Michel Anne NULL Stearns Livia
Silicon Valley Gastronomic Tre. The Gourmet Microwave The Gourmet Microwave The Psychology of Computer Coo. Computer Phobic AND Non-Phobic. Computer Phobic AND Non-Phobic.
Глава 29. Выборка данных Panteley Blotchet-Halls 0' Leary Gringlesby Yokomoto (11 row(s) affected)
Sylvia Reginald Michael Burt Akiko
1173 Onions , Leeks, and Garlic: Coo... Fifty Years in Buckingham Pala... Sushi, Anyone? Sushi, Anyone? Sushi, Anyone?
Как видно, в четвертой строке в столбцах Фамилия и имя выведено значение NULL, т. к. книге не соответствует ни один автор. Теперь приведем пример использования связывания FULL OUTER: SELECT [Фамилия]=au_lname, [Имя]=au_fname, [Название произведения]=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE " END FROM authors as a FULL OUTER JOIN (titleauthor as ta FULL OUTER JOIN titles as t ON ta.title_id=t.title_id) ON a.au_id=ta.au_id WHERE pub_id='0877' OR contract=0
Будет получен следующий результат: Фамилия
Имя
del Castillo Innes . DeFrance Michel Ringer Anne NULL NULL Karsen Livia MacFeather Stearns Panteley Sylvia Blotchet-Halls Reginald О'Leary Michael Gringlesby Burt Yokomoto Akiko Smith Meander Stringer Dirk McBadden Heather Greene Morningstar (15 row(s) affected)
Название произведения Silicon Valley Gastronomic Tre. The Gourmet Microwave The Gourmet Microwave The Psychology of Computer Coo. Computer Phobic AND Non-Phobic. Computer Phobic AND Non-Phobic. Onions, Leeks, and Garlic: Coo. Fifty Years in Buckingham Pala. Sushi, Anyone? Sushi, Anyone? Sushi, Anyone? NULL NULL NULL NULL
При использовании режима связывания FULL OUTER В таблицах будут доступны все строки, независимо от того, есть ли для них сопоставления в других таблицах. В столбцах, для которых нет данных, будет выведено значение NULL. Как видно, значения NULL находятся в последних четырех строках для столбцов таблицы t i t l e s и в четвертой строке для столбца таблицы authors.
Раздел WHERE Этот раздел предназначен для ограничения количества строк, включаемых в результат выборки. Будут включены только те строки, которые удовлетворяют указанному логическому условию. Синтаксис раздела WHERE следующий: WHERE <search condition> I column name {*= I =*} column name
1174
Часть V. Программирование
Рассмотрим назначение и использование параметров: П column_name {*= | =*} column_name Этой конструкцией можно заменить использование режимов связывания LEFT OUTER и RIGHT OUTER. С помощью параметра *= можно заменить параметр LEFT OUTER, а параметр =* заменяет параметр RIGHT OUTER. Первый па-
раметр coiumn_name определяет столбец левой таблицы, связываемый со столбцом правой таблицы, который указывается с помощью второго параметра column_name. В разделе FROM достаточно просто перечислить имена используемых таблиц через запятую. П <search_condition> С помощью этой конструкции можно задать любое произвольное условие для выборки данных. Конструкция <searcn_condition> является выражением, которое должно возвращать булево значение — TRUE ИЛИ FALSE. Указанное выражение вычисляется для каждой строки таблицы и, только если возвращается значение TRUE, TO строка включается в результат выборки. В противном случае строка игнорируется. Обычно условие включает имена столбцов таблицы, вместо которых при сканировании для каждой строки подставляется конкретное значение. Однако в условии имена столбцов могут и не участвовать. Структура конструкции <search_condition> такова: <search_condition> ::= { [NOT] <predicate> I (<search_condition>)} [{AND | OR} [NOT] {<predicate> | (<search_condition>)}] } [,...n]
Основное назначение самой конструкции <search_condition> состоит в объединении множества логических условий, каждое из которых возвращает булево значение. Объединение выполняется с помощью операторов AND, OR И NOT. Кроме того, из синтаксиса конструкции видно, что можно создавать сложные вложенные условия. Само же условие определяется с помощью конструкции <predicate>, имеющей следующий синтаксис: <predicate> : : = {expression { = I <> I != I > I >= I !> I < I <= I !<} expression | string_expression [NOT] LIKE string_expression [ESCAPE 'escape_character'] | expression [NOT] BETWEEN expression AND expression | expression IS [NOT] NULL | CONTAINS ({column | * } , '') I FREETEXT ({column.| * } , 'freetext_string') I expression [NOT] IN (subquery I expression [,...n]) | expression { = I <> I != I > I >= I !> I < I <= I !< } {ALL I SOME | ANY} (subquery) I EXISTS (subquery)}
Работа с частью операторов не вызывает особых затруднений. К таким операторам относятся = , < , > , != и т. д. Тем не менее, часть операторов и аргументов все же требует дополнительных комментариев: •
expression. Этот параметр означает использование любого выражения. В большинстве случаев выражение возвращает некоторый результат, который сравнивается с результатом вычисления другого выражения. Если в
Глава 29. Выборка данных
1175
результате сравнения возвращается TRUE, TO строка включается в результат выборки. •
string_expression. Этот аргумент подразумевает наличие выражения, возвращающего символьное значение. Для строк в Transact-SQL имеются специальные операторы, с помощью которых могут выполняться некоторые операции, специфические только для строк. Примером такой операции является оператор LIKE, С ПОМОЩЬЮ которого можно проверить соответствие строкового выражения шаблону.
•
expression [NOT] BETWEEN expression AND expression. С ПОМОЩЬЮ ЭТОЙ конструкции можно выполнить проверку на принадлежность значения, возвращаемого при вычислении выражения, определенному диапазону. Границы диапазона также задаются как результат вычисления выражения.
•
expression i s [NOT] NULL. Эта конструкция используется для проверки выражения на равенство значению NULL. ЕСЛИ результатом вычисления выражения является значение NULL, TO выражение expression i s NULL вернет TRUE, результатом чего будет включение соответствующей строки в результат выборки. В качестве параметра expression может выступать как сложное выражение, так и имя отдельного столбца. В обычных условиях сравнение выражения и значения NULL С ПОМОЩЬЮ оператора = или != невозможно, т. к. любое выражение с участием NULL возвратит NULL, а не TRUE ИЛИ FALSE. Поэтому для проверки выражения на
равенство NULL необходимо указывать оператор i s NULL. В качестве демонстрации вышесказанного приведем пример: DECLARE @Varl int SET @Varl=NULL IF @Varl=NULL SELECT 'aaa' ELSE SELECT 'bbb' IF @Varl!=NULL SELECT 'aaa' ELSE SELECT 'bbb'
Будет возвращен следующий результат: bbb (1 row(s)
affected)
bbb (1 row(s)
affected)
Однако для решения представленной проблемы Transact-SQL позволяет изменять поведение сервера при сравнении выражений со значением NULL. Для этого предназначена команда SET ANSI_NULLS {ON I OFF}. При
использовании параметра ON, устанавливаемого по умолчанию, при сравнении выражения со значением NULL будет возвращено значение NULL. Если же задан параметр OFF, TO сравнение происходит обычным образом. Изменим предыдущий пример для демонстрации сказанного: DECLARE @Varl int SET ANSI_NULLS OFF SET @Varl=NULL
/ / 76
Часть V. Программирование IF @Varl=NULL SELECT 'aaa' ELSE SELECT 'bbb' 1 IF @Varl!=NULL SELECT 'aaa ELSE SELECT 'bbb'
Будет возвращен следующий результат:
aaa
•
(1 r o w ( s )
affected)
bbb (1 r o w ( s )
affected)
CONTAINS
({column
|
*},
' < c o n t a i n s _ s e a r c h _ c o n d i t i o n > ' ) . С ПОМОЩЬЮ
этой конструкции можно выполнять сложный поиск в символьных столбцах таблицы. •
FREETEXT ({column | *}, ' f r e e t e x t _ s t r i n g ' ) . С ПОМОЩЬЮ ЭТОЙ конструкции можно производить сложный поиск в текстовых столбцах таблицы.
•
expression [NOT] IN (subquery | expression [, . . .n] ). С ПОМОЩЬЮ оператора IN МОЖНО проверить вхождение выражения в набор данных, который может задаваться с помощью подзапроса или простого перечисления через запятую всех возможных значений.
•
e x p r e s s i o n {= | о | != | > | >= | !> | < | <= | !<} {ALL | SOME | ANY} (subquery). С помощью этой конструкции производится проверка удовлетворения значения, возвращаемого при вычислении выражения, логическому условию для всех или хотя бы для одного значения в подзапросе.
•
EXISTS (subquery). Оператор EXISTS возвращает значение TRUE, если подзапрос возвращает хоть одну строку. В противном случае возвращается FALSE.
Раздел WHERE уже приводился довольно часто, и простейшие варианты использования условий для отбора строк уже понятны. Примером такого условия может служить следующий запрос: SELECT * FROM authors WHERE state!='CA'
Запрос возвращает полный набор столбцов для всех авторов, проживающих вне штата Калифорния. В представленном ниже запросе выводится название книги и сумма их продажи для всех книг, написанных авторами не из Калифорнии: SELECT title, value=price*ytd_sales FROM titles WHERE title_ID IN (SELECT title_id FROM titleauthor WHERE au_id IN (SELECT au_id FROM authors WHERE state!='CA')) ORDER BY value DESC
Будет получен результат: title
value
Fifty Years in Buckingham Palace Kitchens
180397.2000
Глава 29. Выборка данных The Gourmet Microwave Silicon Valley Gastronomic Treats Is Anger the Enemy? Onions, Leeks, and Garlic Life Without Fear (6 row(s) affected)
1177 66515.5400 40619.6800 22392.7500 7856.2500 777.0000
Следующий запрос демонстрирует использование оператора EXISTS ДЛЯ получения того же результата, что и предыдущий запрос: SELECT t i t l e , v a l u e = p r i c e * y t d _ s a l e s FROM t i t l e s as t WHERE EXISTS (SELECT * FROM t i t l e a u t h o r as t a WHERE t a . t i t l e _ i d = t . t i t l e _ i d AND au_id IN (SELECT au_id FROM a u t h o r s WHERE s t a t e ! = ' C A ' ) ) ORDER BY value DESC Замечание Хотя запросы внешне и различаются, время их выполнения одинаково. Оптимизатор запросов SQL Server 2000 модифицирует запрос таким образом, что решение поставленной задачи будет произведено наиболее эффективно. Это снимает с пользователя необходимость анализа производительности выполнения того или иного запроса и упрощает разработку конечных приложений.
Раздел GROUP В Y С помощью этого раздела можно осуществлять группировку данных. Данные группируются по одному или более столбцам таким образом, что для всех строк с одинаковыми значениями в столбце, по которому выполняется группировка, в результате выборки будет возвращена всего одна строка. При этом в результат выборки разрешается включение только столбцов, по которым производится группировка, а также столбцов, использующих функции агрегирования. Синтаксис раздела GROUP BY таков: GROUP BY [ALL] group_by_expression [,...n] [WITH {CUBE | ROLLUP}] Перед тем, как начать рассмотрение параметров раздела GROUP BY, сначала расскажем об особенностях работы с разделом SELECT при использовании раздела GROUP BY. В раздел SELECT нельзя включать непосредственно имена столбцов, не указанных в разделе GROUP BY. Также нельзя использовать имена таких столбцов в любых выражениях. В непосредственном виде допускается применение только имен столбцов, по которым выполняется агрегирование. Однако в разделе SELECT ПОМИМО выражения группировки могут существовать специальные функции агрегирования, возвращающие для всех строк группы единственное значение, которое и включается в результат выборки. Непосредственное использование имен столбцов в разделе SELECT при выполнении группировки не допускается, т. к. в каждой группе может содержаться более одной строки и нельзя отдать предпочтение какой-то конкретной строке. Приведем список функций агрегирования с кратким описанием каждой из них:
1178
Часть V. Программирование
П COUNT (соlumn_name). Возвращает количество строк в группе с не пустым значением (не NULL) В указанном столбце. •
COUNT(*). Возвращает общее количество строк в группе, включая строки с неопределенным значением (NULL).
•
MAX(column_name). Возвращает максимальное значение в указанном столбце в пределах группы.
•
MiN(coiumn_name). Возвращает минимальное значение в указанном столбце в пределах группы.
•
suM(coiumn_name). Возвращает сумму всех значений в пределах группы в указанном столбце. Эта функция может применяться только к столбцам с числовым типом данных.
•
AVG{coiumn_name). Возвращает среднее арифметическое для указанного столбца в пределах строк, принадлежащих одной группе. Эта функция может применяться только к столбцам с числовым типом данных. Замечание При организации группировки следует учитывать, что при агрегировании пропускаются значения NULL. В противном же случае могла возникнуть ситуация, когда результатом выполнения функции агрегирования было бы значение NULL. Дело в том, что все операции с участием N U L L возвращают N U L L . Например, если выполнить сложение 4 5 и N U L L , TO результатом этой операции будет N U L L . Особенности обработки значений N U L L следует учитывать при использовании функций COUNT(column_name) и AVG(column_name).
Помимо указания в разделе SELECT непосредственно функций агрегирования, также допускается использование различных выражений, построенных на основе этих функций и столбцов, по которым осуществляется группировка. Кроме того, функции агрегирования могут применяться не только непосредственно к определенному столбцу, но и к различным выражениям, построенным на основе этих столбцов. Приведем несколько примеров, демонстрирующих сказанное: SELECT price, price*MAX(ytd_sales), MIN(type) FROM titles GROUP BY price
Этот запрос выполняет группировку данных по значениям в столбце p r i c e . Помимо значений столбца p r i c e в результат включаются два столбца, один из которых построен на основе умножения значения столбца p r i c e на значение, возвращаемое функцией агрегирования МАХ. ВО втором столбце выводится минимальное значение для столбца type в пределах группы. Будет возвращен результат: price NULL 2.9900 7.0000 7.9900 10.9500
0 2 1 1 1
2 2 1 1 1
NULL 66515.5400 777.0000 26654.6400 22392.7500
popular comp business psychology psychology psychology
Глава 29. Выборка данных 11.9500 14.9900 19.9900 20.0000 20.9500 21.5900 22.9500 (12 row(s)
2 1 4 1 1 1 1
. 2 1 4 1 1 1 1
180397.2000 61384.0500 81859.0500 81900.0000 7856.2500 8096.2500 201501.0000
1179
business trad_cook business popular_comp trad cook psychology popular comp
affected)
Очередной запрос демонстрирует разницу между использованием функций COUNT(column_name) И COUNT(*): SELECT t y p e ,
count(price),
count(*)
FROM t i t l e s GROUP BY t y p e
Будет возвращен результат: type
4 business mod cook 2 popular comp 2 psychology 5 trad cook 3 UNDECIDED 0 (6 row(s) affected)
4 2 3 5 3 1
Следующий пример демонстрирует использование функций агрегирования не к отдельным столбцам, а к различным выражениям, построенным на основе этих столбцов: SELECT type, SUM(price*ytd_sales*0.78)-MAX(price*ytd_sales*0.78), CASE WHEN AVG((ytd_sales-advance))<0 THEN 'Тираж продается не полностью' ELSE 'Тираж продается успешно' END FROM titles GROUP BY type
Будет возвращен результат: type business 143641.703400 mod_cook 31683.350400 popular_comp 63882.000000 psychology 45178.099200 trad_cook 54007.434000 UNDECIDED NULL (6 row(s) affected)
Тираж Тираж Тираж Тираж Тираж Тираж
продается продается продается продается продается продается
успешно успешно не полностью не полностью успешно успешно
Теперь же рассмотрим назначение и использование параметров раздела GROUP BY: О group_by_expression
С помощью этого параметра указывается выражение, по которому будет выполняться группировка. В качестве такого выражения может выступать как имя отдельного столбца, так и сложное выражение, в котором используются ссылки на несколько столбцов и различные операторы. Желательно, чтобы
1180
Часть V. Программирование
выражение возвращало ограниченный набор вариантов, каждому из которых соответствовало бы несколько строк. Выражение, по которому производится группировка, может быть включено в раздел SELECT. Дополнительно этому выражению можно присвоить псевдоним. Приведем пример группировки строк таблицы authors по столбцу s t a t e с вычислением количества авторов, проживающих в каждом из штатов: SELECT state, count(*) FROM authors GROUP BY state
Будет возвращен следующий результат: state СА 15 IN 1 KS 1 MD 1 1 MI 1 OR TN 1 UT 2 (8 row(s) affected)
В этом примере в качестве выражения группировки использовалось имя столбца. Следующий пример осуществляет группировку по первой букве названия книг: SELECT [Char]=LEFT(title,1), COUNT(*) FROM titles GROUP BY LEFT(title,1)
Будет возвращен результат: Char В
1 2 Е 1 1 F I 1 1 L N 1 1 О Р 1 4 S 3 т 1 Y (12 row(s) affected)
с
В следующем примере выполняется группировка книг по общей сумме их продаж. Создается четыре интервала, в каждом из которых подсчитывается количество книг и сумма, на которую в общей сложности было продано книг в данной группе. SELECT [Диапазон]= (CASE (CASE WHEN p r i c e * y t d _ s a l e s < 1 0 0 0 0 THEN 1
Глава 29. Выборка данных
1181
WHEN price*ytd_sales<20000 THEN 2 WHEN price*ytd_sales<30000 THEN 3 ELSE 4 END) WHEN 1 THEN 'Продано < $10000' WHEN 2 THEN 'Продано от $10000 до $20000' WHEN 3 THEN 'Продано от $20000 до $30000' WHEN 4 THEN 'Продано более чем на $30000' END), [Кол-во книг]=С0ШТ(*) , [На общую сумму]=SUM(price*ytd_sales) FROM titles GROUP BY (CASE WHEN price*ytd_sales<10000 THEN 1 WHEN price*ytd_sales<20000 THEN 2 WHEN price*ytd_sales<30000 THEN 3 ELSE 4 END)
Будет возвращен результат: Диапазон
Кол-во книг На общую сумму
Продано < $10000 3 Продано от $20000 до $30000 2 Продано более чем на $30000 13 (3 row(s) affected)
16729.5000 49047.3900 979731.8300
• ALL При использовании этого параметра в результат выборки будут включены все группы, независимо от того, соответствуют ли связанные с ними данные существующим в разделе WHERE условиям выборки. В строках, которые не соответствуют условиям выборки, во всех столбцах кроме столбцов, по которым выполняется группировка, будут выведены значения NULL. Для сравнения сначала рассмотрим запрос без использования параметра ALL: SELECT state, [Кол-во]=COUNT(state), MAX(city) FROM authors WHERE city LIKE '[CS]%' GROUP BY state
Этот запрос выводит информацию по количеству авторов, проживающих в каждом штате в городах, начинающихся с буквы с или s. В качестве примера использования функции агрегирования приводится функция МАХ. Приведенный запрос возвращает следующий результат: State Кол-во
СА OR UT
3 1 2
(3 row(s)
San Jose Corvallis Salt Lake City affected)
Теперь в тот же запрос добавим параметр ALL: SELECT state, [Кол-во]=COUNT(state), MAX(city) FROM authors WHERE city LIKE '[CS]%' GROUP BY ALL state
Будет получен такой результат: State Кол-во
1182 СА IN KS MD MI OR TN UT
Часть V. Программирование 3 0 0 0 0 1 0 2
(8 row(s)
San Jose NULL NULL NULL NULL Corvallis NULL Salt Lake City affected)
Как видно, в результат выборки были включены все возможные значения выражений группировки. Однако для строк, не удовлетворяющих условию раздела WHERE, выведены значения NULL, а количество строк равно 0. Тем не менее, пользователь имеет представление обо всех возможных вариантах группировки. •
WITH {CUBE I ROLLUP}
С помощью этой конструкции выполняется суперагрегирование данных. Обычные функции агрегирования применяются к строкам группы и возвращают единственное значение для всей группы. При использовании операторов CUBE и ROLLUP происходит вычисление функции агрегирования для значений, возвращенных для каждой группы. Для сравнения приведем пример без использования функций суперагрегирования: SELECT type, MAX(price), MIN(price) FROM titles GROUP BY type
Будет возвращен результат: type business 19.9900 mod_cook 19.9900 popular_comp 22.9500 psychology 21.5900 trad_cook 20.9500 UNDECIDED NULL (6 row(s) affected)
2.9900 2.9900 20.0000 7.0000 11.9500 NULL
Теперь добавим функцию суперагрегирования ROLLUP: SELECT type, max(price), min(price) FROM titles GROUP BY type WITH ROLLUP
После этого результат будет выглядеть так: type business 19.9900 mod_cook 19.9900 popular_comp 22.9500 psychology 21.5900 trad_cook 20.9500 UNDECIDED NULL NULL 22.9500 (7 row(s) affected)
2.9900 2.9900 20.0000 7.0000 11.9500 NULL 2.9900
Глава 29. Выборка данных
1183
Как видно, была добавлена дополнительная строка (самая нижняя), в которой выводится результат выполнения функции агрегирования ко всем группам. Использование функции CUBE даст в этом запросе точно такой же результат. Более интересные сведения отображаются при выполнении группировки по двум и более выражениям. Сначала опять же рассмотрим запрос без использования функций суперагрегирования: SELECT type, pub_id, [Объем продаж]=SUM(price*ytd_sales), [Сред, цена]=AVG(price), [Макс, тираж]=МАХ(ytd_sales) FROM titles GROUP BY type, pub_id
Будет возвращен результат: type
pub_id Объем продаж
business 0736 psychology 0736 0877 mod cook 0877 psychology 0877 trad cook 0877 UNDECIDED 1389 business popular comp 1389 (8 row(s) affected)
55978.7800 131223.6700 107135.2200 8096.2500 249637.5000 NULL 210036.3000 283401.0000
Сред. цена 2.9900 11.4825 11.4900 21.5900 15.9633 NULL 17.3100 21.4750
Макс. тираж 18722 4072 22246
375 15096 NULL 4095 8780
Теперь добавим функцию суперагрегирования ROLLUP: SELECT type, pub_id, [Объем продаж]=SUM(price*ytd_sales), [Сред, цена]=AVG(price), [Макс, тираж]=МАХ(ytd_sales) FROM titles GROUP BY type, pub_id WITH ROLLUP
Будет получен следующий результат: type
pub id Объем продаж
Сред. цена
Макс. тираж
business business business mod_cook mod_cook popular comp popular_comp psychology psychology psychology trad cook trad_cook UNDECIDED UNDECIDED NULL
0736 1389 NULL 0877 NULL 1389 NULL 0736 0877 NULL 0877 NULL 0877 NULL NULL
2.9900 17.3100 13.7300 11.4900 11.4900 21.4750 21.4750 11.4825 21.5900 13.5040 15.9633 15.9633 NULL NULL 14.7662
18722 4095 18722 22246 22246 8780 8780 4072
55978.7800 210036.3000 266015.0800 107135.2200 107135.2200 283401.0000 283401.0000 131223.6700 8096.2500 139319.9200 249637.5000 249637.5000 NULL NULL 1045508.7200
375 4072 15096 15096 NULL NULL 22246
(15 row(s) affected) Как видно, в результате добавилось семь строк (отмечены жирным шрифтом). Для каждой из групп по столбцу type была добавлена строка с результатом вы-
Часть V. Программирование
1184
полнения функции агрегирования по столбцу p u b i d . Так как агрегирование выполняется по столбцу pub_id, то в нем находится значение NULL, ПО которому можно легко определить строки, полученные в результате суперагрегирования. Например, для группы business в строке, являющейся результатом суперагрегирования, для столбца объем продаж выведено значение 266015.0800, что является результатом выполнения функции агрегирования SUM (сумма) для всех строк исходных данных (не результата), относящихся к группе business в целом. В столбце Сред, цена указывается результат функции AVG (среднее) для столбца p r i c e исходных данных со значением business в столбце type. На примере средней цены видно, что результат суперагрегирования получается на основе исходных данных, а не результата агрегирования. В столбце макс, тираж выводится максимальное число по столбцу y t d s a i e s , получаемое в результате выполнения функции агрегирования МАХ (максимум). В итоге в результат были добавлены шесть строк с результатами суперагрегирования. Самая последняя строка содержит результат применения функций агрегирования ко всем данным в таблице, а не к отдельным группам. Так как функции агрегирования применяются ко всему набору исходных данных, то в каждом столбце, по которым выполняется агрегирование, стоит значение NULL. Итак, итогом использования оператора WITH ROLLUP является суперагрегирование по выражениям, на основании которых производится агрегирование. Но суперагрегирование не выполняется по первому выражению. Однако в некоторых ситуациях необходимо произвести суперагрегирование по всем выражениям, участвующим в группировке. Для этого служит оператор WITH CUBE. Перепишем предыдущий запрос для использования оператора WITH CUBE: SELECT t y p e , pub_id, [Объем продаж]=SUM(price*ytd_sales), [Сред, цена]=AVG(price), [Макс, тираж]=МАХ(ytd_sales) FROM t i t l e s GROUP BY type, pub_id WITH CUBE
Будет получен следующий результат: type
pub_id Объем продаж
Сред, цена
Макс. тираж
business business business mod cook mod cook popular comp popular comp psychology psychology psychology trad cook trad_cook UNDECIDED UNDECIDED NULL NULL
0736 1389 NULL 0877 NULL 1389 NULL 0736 0877 NULL 0877 NULL 0877 NULL NULL 0736
2.9900 17.3100 13.7300 11.4900 11.4900 21.4750 21.4750 11.4825 21.5900 13.5040 15.9633 15.9633 NULL NULL 14.7662 9.7840
18722 4095 18722 22246 22246 8780 8780 4072 375 4072 15096 15096 NULL NULL 22246 18722
55978.7800 210036.3000 266015.0800 107135.2200 107135.2200 283401.0000 283401.0000 131223.6700 8096.2500 139319.9200 249637.5000 249637.5000 NULL NULL 1045508.7200 187202.4500
Глава 29. Выборка данных NULL 0877 364868.9700 NULL 1389 493437.3000 (18 row(s) affected)
1185 15.4100 18.9760
22246 8780
По сравнению с предыдущим примером в результат выборки добавилось еще три строки. Эти строки являются результатом агрегирования выборки по столбцу p u b i d , когда подсчитываются значения функций агрегирования для всех строк с одинаковым значением в столбце p u b i d . Новые строки были добавлены в самый конец выборки.
РазделHAVING Этот раздел обычно используется совместно с разделом GROUP BY, ДОПОЛНЯЯ его. Назначением раздела HAVING является ограничение набора строк, подвергаемых группировке. По своим функциям раздел HAVING очень близок к разделу WHERE. Синтаксис раздела HAVING таков: HAVING < s e a r c h _ c o n d i t i o n >
Применение конструкции <search_condition> при работе с разделом HAVING ничем не отличается от указания этой же конструкции при работе с разделом WHERE. Более того, если раздел HAVING указывается без раздела GROUP BY, TO оп-
тимизатор запросов автоматически заменяет раздел HAVING аналогичным разделом WHERE. Однако раздел HAVING обладает некоторыми специфическими чертами. На условие, указанное в разделе HAVING, не действует параметр ALL, С ПОМОЩЬЮ которого в результат выборки включаются все группы, в том числе и не содержащие ни одной строки вследствие существующих логических условий. Помимо этого, установленные с помощью раздела HAVING условия игнорируются при суперагрегировании данных с помощью WITH CUBE.
В одном запросе допускается использование как раздела WHERE, так и раздела HAVING. При этом каждый из них будет вести себя по-своему. Приведенный ниже пример демонстрирует применение в одном запросе обоих разделов и иллюстрирует поведение сервера при обработке условий совместно с параметром ALL: SELECT state, count(au_lname), max(au_lname) FROM authors WHERE state!='CA' GROUP BY ALL state HAVING state!='UT'
Будет возвращен результат: state
CA IN KS MD MI OR TN
0 1 1 1 1 1 1
(7 row(s)
NULL DeFrance Smith Panteley del Castillo Blotchet-Halls Greene affected)
1186
Часть V. Программирование
Для сравнения выполним тот же запрос без разделов WHERE И HAVING: SELECT state, count(au_lname), max(au_lname) FROM authors GROUP BY ALL state
Будет возвращен такой результат: state
СА IN KS MD MI OR TN UT
15 1 1 1 1 1 1 2
(8 row(s)
Yokomoto DeFrance Smith Panteley del Castillo Blotchet-Halls Greene Ringer affected)
Как видно, в первом запросе в разделе WHERE существовало ограничение, запрещающее обработку строк об авторах, проживающих в Калифорнии (СА). Однако в разделе GROUP BY был указан параметр ALL, предписывающий выводить все группы несмотря на наложенные логические условия. В итоге результат выполнения запроса содержит строку для штата Калифорния, но самих данных нет. В разделе HAVING было указано дополнительное условие для игнорирования авторов из штата Юта (ит). В итоге результат выборки вообще не содержит никакого упоминания о штате Юта несмотря на использование параметра ALL.
Раздел UNION Иногда бывает необходимо в одном запросе объединить данные нескольких таблиц. Речь идет не об объединении столбцов таблиц, а о слиянии строк двух и более таблиц в один массив строк. Примером необходимости такого объединения может служить формирование отчета за год, когда данные за каждый месяц находятся в отдельной таблице. Другой пример — анализ данных различных подразделений, когда данные размещаются в разных базах данных и возможно на различных серверах. Объединение строк двух таблиц в один массив строк выполняется с помощью раздела UNION, имеющего следующую структуру: { | ()} UNION [ALL] ) [UNION [ALL]
Рассмотрим назначение и использование упомянутых параметров: П
I () С помощью этих конструкций указывается запрос, возвращаемые строки которого будут объединены со строками, возвращенными другим запросом. Как видно из синтаксиса, при использовании раздела UNION ДОЛЖНЫ быть
Глава 29. Выборка данных
1187
указаны два запроса, возвращающих одинаковое количество столбцов, причем столбцы должны иметь совместимые типы данных и располагаться в одном и том же порядке. Запрос может быть как очень простым (SELECT * FROM ), так и очень сложным с применением всех описанных ранее разделов. •
ALL По умолчанию в объединение не допускается вставка повторяющихся строк. То есть, если второй запрос возвращает строку, идентичную одной из строк, образованных первым запросом, то такая строка не будет включена в объединение. Однако с помощью параметра ALL МОЖНО заставить сервер включать в объединение все строки, возвращенные запросами, независимо от того, повторяются они или нет.
С помощью раздела UNION МОЖНО объединять более двух запросов. Для этого после второго запроса достаточно указать ключевое слово UNION И создать третий запрос. Таким же образом можно добавить четвертый запрос, пятый и т. д. Общее количество объединяемых запросов может составлять несколько десятков. Однако на практике обычно количество объединяемых запросов не превышает пяти. Имена столбцов объединения будут соответствовать именам столбцов, возвращаемых первым запросом. Имена столбцов остальных запросов игнорируются. Как уже было сказано, количество столбцов, возвращаемых всеми объединяемыми запросами, должно быть одним и тем же. Кроме того, порядок перечисления этих столбцов в разделе SELECT ВО всех запросах должен быть одинаков. Типы данных столбцов запросов, данные из которых будут объединены в один столбец, должны быть совместимыми. В идеале типы данных должны быть полностью одинаковы, но все же допускаются некоторые расхождения. При объединении ДВУХ СИМВОЛЬНЫХ столбцов (char, varchar, nchar И nvarchar) разной длины столбец объединения будет иметь тип данных, соответствующий строке большей длины. Также при объединении двоичных данных (binary и varbinary) столбец результата получит тип данных, соответствующий наибольшему из объединяемых столбцов. При объединении столбцов нецелочисленных ТИПОВ данных (money, smallmoney, f l o a t , numeric И decimal) столбец результата будет иметь тип данных, соответствующий исходному типу данных с наибольшей точностью. Кроме того, аналогичный результат будет и при объединении целочисленных данных ( i n t , smallint и t i n y i n t ) с нецелочисленными — объединение станет иметь нецелочисленный тип данных с наибольшей точностью. Если все соответствующие столбцы исходных запросов запрещают хранение значений NULL, ТО И В соответствующем столбце результата хранение значений NULL будет запрещено. Однако если хоть один из объединяемых столбцов разрешает хранение NULL, ТО И В объединении для соответствующего столбца будет разрешено хранение NULL. При попытке объединения столбцов с несовместимыми типами данных сервер выдаст сообщение об ошибке.
Часть V. Программирование
1188
Рассмотрим использование раздела UNION ДЛЯ СЛИЯНИЯ данных из t i t i e _ b u s i n e s s и titie_psychoiogy. Для этого сначала создадим эти таблицы на основе таблицы t i t l e s , выбрав из нее строки, относящиеся в каждой из серий: SELECT FROM SELECT FROM
title_id, title, price, ytd_sales INTO titles_business titles WHERE type='business' title_id, title, price, ytd_sales INTO titles_psychology titles WHERE type='psychology1
Эти два запроса создают необходимые таблицы и копируют в них нужные данные. Просмотрим содержимое этих таблиц: SELECT * FROM t i t l e s _ p s y c h o l o g y
Будет получен следующий результат: title_id title
price
ytd_sales
PS1372 Computer Phobic AND Non-Phobic Indiuals: PS2091 Is Anger the Enemy? PS2106 Life Without Fear PS3333 Prolonged Data Deprivation: Four CaStudie PS7777 Emotional Security: A New Algorithm (5 row(s) affected)
21 .5900 10 .9500 7. 0000 19 .9900 7. 9900
375 2045 111 4072 3336
Теперь просмотрим содержимое таблицы tities_business: SELECT * FROM titles business
Будет получен результат: title id title
price
ytd_sales
BU1032 The Busy Executive's Database Guide BU1111 Cooking with Computers: Surreptitious BU2075 You Can Combat Computer Stress! BU7832 Straight Talk About Computers (4 row(s) affected)
19.9900 11.9500 2.9900 19.9900
4095 3876 18722 4095
Теперь можно приступать к объединению данных: SELECT title_id, title=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE '' END, value=price*ytd_sales, type='psychology' FROM titlesjpsychology UNION SELECT title_id, title=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE '' END, value=price*ytd_sales, type='business' FROM titles_business
Этот запрос демонстрирует не только простое слияние данных двух таблиц, но и предварительную обработку этих данных перед слиянием. В частности, только данные столбца t i t i e i d не были подвергнуты изменениям. Все остальные столбцы сформированы на основе различных выражений. В результате выполнения запроса будет получен следующий результат:
Глава 29. Выборка данных title_id title
1189 value
type
BU1032 The Busy Executive's Database ... 81859.0500 BUllll Cooking with Computers: Surrep... 46318.2000 BU2075 You Can Combat Computer Stress... 55978.7800 BU7832 Straight Talk About Computers 81859.0500 PS3333 Prolonged Data Deprivation: Fo... 81399.2800 PS1372 Computer Phobic AND Non-Phobic... 8096.2500 PS2091 Is Anger the Enemy? 22392.7500 PS7777 Emotional Security: A N e w A l g o . . . 26654.6400 PS2106 Life Without Fear 777.0000 (9 row(s) affected)
business business business business psychology psychology psychology psychology psychology
В предыдущем запросе было рассмотрено слияние однотипных данных, однако в принципе не важно, какие данных объединяются. Важно лишь, чтобы они имели одинаковую структуру. Следующий пример демонстрирует объединение данных из таблиц с разной структурой. Кроме того, нет никакого смысла в выполняемом объединении, и оно производится только для демонстрации возможностей раздела UNION: SELECT title_id, title, price FROM titles WHERE type='popular_comp' UNION SELECT au_id, au_lname, contract FROM authors WHERE state NOT IN ('CA', 'UT 1 , 'KS') UNION SELECT phone, type, contract*ytd_sales*0.78 FROM authors a, titleauthor ta, titles t WHERE state NOT IN ('CA', 'UT', 'KS') AND ta.au_id=a.au_id AND t.title_id=ta.title_id
Будет получен результат: title_id
title
219 547-9982 mod_cook 301 946-8853 trad_cook 503 745-6402 trad_cook 527-72-3246 Greene 615 996-8275 mod_cook 648-92-1872 Blotchet-Halls 712-45-1867 del Castillo 722-51-5454 DeFrance 807-91-6654 Panteley PC1035 But Is It User Friendly? PC8888 Secrets of Silicon Valley PC9999 Net Etiquette (12 row(s) affected)
price 17351.88 292.50 11774.88 .00 1584.96 1.00 1.00 1.00 1.00 22.95 20.00 NULL
Как видно, первые строки объединения относятся к последнему запросу, затем идут строки второго запроса и только после этого включены строки первого запроса. Тем не менее, столбцы объединения имеют имена, соответствующие именам столбцов первого запроса.
1190
Часть V. Программирование
Раздел ORDER BY По умолчанию данные в. результат выводятся в соответствии с их физическим расположением в таблице. Если в таблице не определен кластерный индекс, то данные будут выводиться беспорядочно. Наличие в таблице кластерного индекса приводит к физическому перестроению порядка данных в соответствии с указанными критериями. Таким образом, данные становятся упорядоченными. Однако в таблице возможно наличие только одного кластерного индекса, что означает существование сортировки только по одному столбцу. Тем не менее, часто возникает необходимость отсортировать данные по различным критериям, причем иногда по нескольким сразу. Для выполнения сортировки данных, возвращаемых запросом, в распоряжении пользователей имеется раздел ORDER BY, специально предназначенный для определения параметров порядка вывода строк. Синтаксис этого раздела таков: ORDER BY {order_by_expression [ASC I DESC]} [,...n]
Рассмотрим назначение аргументов раздела: П
order_by_expression
Этот параметр определяет выражение, в соответствии с которым будет выполняться сортировка данных. В качестве выражения сортировки может указываться имя столбца, псевдоним или любое выражение. Также допускается указание номера столбца результата выборки, по которому следует осуществлять сортировку. Следует отдельно обратить внимание, что сортировка не обязательно должна производиться по выражению, включенному в результат выборки. •
ASC | DESC
Эти параметры указываются дополнительно к параметру o r d e r b y e x p r e s s i o n и определяют порядок сортировки. Можно указать только один из параметров. При использовании ASC данные располагаются по возрастанию, тогда как параметр DESC определяет порядок сортировки по убыванию. Если порядок сортировки не указан явно, то по умолчанию данные будут располагаться по возрастанию. •
[,...п] Этот параметр говорит о том, что в одном запросе сортировка может выполняться по нескольким критериям. Для этого необходимо через запятую указать выражения, по которым будет выполняться сортировка, а также дополнительно и порядок сортировки. Порядок указания выражений сортировки определяет приоритет того или иного выражения. Сначала сортировка производится по первому выражению. Затем выполняется дополнительная сортировка строк одной группы по второму выражению и т. д. Если указано только одно выражение, но существует множество строк, имеющих одинаковые значения выражения сортировки, то эти строки будут располагаться в соответствии с их физическим порядком в таблице.
Глава 29. Выборка данных
1191
Замечание При
использовании раздела O R D E R
B Y совместно с разделом U N I O N
сортировка
осуществляется по всему массиву данных, а не по данным каждого из запросов. Это относится и ко всем разделам, рассмотренным ранее. То есть сначала идет обработка разделов SELECT, INTO, FROM И Т.Д., а уже потом обрабатывается раздел ORDER
BY.
В качестве примера рассмотрим сортировку данных таблицы t i t l e s сначала по типу (столбец type), затем по номеру публикации (столбец pubid) и потом по названию произведения (столбец t i t l e ) : SELECT pub_id, type, title=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE " END, price FROM titles ORDER BY type, pub_id, 3
Будет возвращен результат: pub_id type
title
0736 business You Can Combat Computer Stress... 1389 business Cooking with Computers: Surrep... 1389 business Straight Talk About Computers 1389 business The Busy Executive's Database ... 0877 mod_cook Silicon Valley Gastronomic Tre... 0877 mod_cook The Gourmet Microwave 1389 popular_comp But Is It User Friendly? 1389 popular_comp Net Etiquette 1389 popular_comp Secrets of Silicon Valley 0736 psychology Emotional Security: A New Algo... 0736 psychology Is Anger the Enemy? 0736 psychology Life Without Fear 0736 psychology Prolonged Data Deprivation: Fo... 0877 psychology Computer Phobic AND Non-Phobic... 0877 trad_cook Fifty Years in Buckingham Pala... 0877 trad_cook Onions, Leeks, and Garlic: Coo... 0877 trad_cook Sushi, Anyone? 0877 UNDECIDED The Psychology of Computer Coo... (18 row(s) affected)
price 2.9900 11.9500 19.9900 19.9900 19.9900 2.9900 22.9500 NULL 20.0000 7.9900 10.9500 7.0000 19.9900 21.5900 11.9500 20.9500 14.9900 NULL
В предыдущем примере сортировка производилась по столбцам, которые существуют физически и включены в результат. Следующий пример демонстрирует выполнение сортировки по выражению, не включенному в результат выборки и построенному на основе нескольких столбцов: SELECT ТОР 10 pub_id, type,'title=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE " END, price FROM titles ORDER BY ytd_sales%10*(price-10)
Будет возвращен следующий результат: pub_id type 0877 1389
title
price
UNDECIDED The Psychology of Computer Coo... NULL popular_comp Net Etiquette NULL
1192
Часть V. Программирование
0877 mod_cook The Gourmet Microwave 0736 business You Can Combat Computer Stress... 0736 psychology Emotional Security: A New Algo... 0736 psychology Life Without Fear 1389 popular_comp But Is It User Friendly? 0736 psychology Is Anger the Enemy? 1389 business Cooking with Computers: Surrep... 0877 trad_cook Fifty Years in Buckingham Pala... (10 row(s) affected)
2.9900 2.9900 7.9900 7.0000 22.9500 10.9500 11.9500 11.9500
Конечно, трудно найти смысл в такой сортировке. Однако приведенный запрос отлично демонстрирует использование в качестве критерия упорядочения произвольных выражений, не входящих в результат выборки.
Раздел COMPUTE Этот раздел используется для агрегирования данных, содержащихся в результате выборки. Агрегирование выполняется по определенному столбцу результата выборки, причем сами данные остаются неизменными, а результат агрегирования добавляется отдельно. В разделе COMPUTE пользователь указывает функции агрегирования применительно к конкретным столбцам выборки. Агрегирование с помощью раздела COMPUTE принципиально отличается от агрегирования данных с помощью раздела GROUP BY. В последнем выборка представляет только результат агрегирования, тогда как первый отображает сами данные и только как дополнительный параметр содержит результат агрегирования. Наиболее простым и наглядным примером использования раздела COMPUTE является вывод суммы по столбцу. Часто в бухгалтерских отчетах внизу таблиц можно увидеть строку "Итого", в которой приводится сумма значений в колонках. Конечно, при работе с базами данных можно хранить строку "Итого" как отдельную строку таблицы, но при этом каждый раз при изменении данных нужно будет пересчитывать значения в этой строке. К тому же, если выполняется фильтрация данных, то значения в этой строке могут оказаться неверными. Применение раздела COMPUTE позволяет получать нужные значения динамически на основании результата выборки, что обеспечивает генерирование правильного результата и возможность выполнения любых функций агрегирования по усмотрению пользователя. Раздел COMPUTE может быть с успехом использован совместно с разделом UNION, ЧТО открывает дополнительные возможности. Приведем синтаксис раздела COMPUTE: COMPUTE {{ AVG | COUNT | MAX | MIN | STDEV (expression)} [,...n] [BY expression [,...n]]
| STDEVP
|VAR | VARP | SUM}
Рассмотрим назначение и использование параметров раздела: П expression. Этот параметр задает выражение, для которого будет применяться функция агрегирования. Выражение может быть любой сложности, одна-
Глава 29. Выборка данных
1193
ко оно должно содержаться в результате выборки. Это значит, что параметр expression должен быть ничем иным, чем одним из столбцов результата. Если столбец формируется на основе результата вычисления выражения и для него не указан псевдоним, то ссылка на этот столбец в разделе COMPUTE возможна только с помощью выражения, на основе которого вычисляются значения для этого столбца. Если же столбец имеет конкретное имя (например, указанное с помощью псевдонима), то ссылка на этот столбец возможна и по имени. •
AVG. Возвращает среднее арифметическое.
•
COUNT. Возвращает количество строк, в которых значение выражения агрегирования не равно NULL.
•
МАХ. Возвращает максимальное значение выражения во всех строках результата.
•
MIN. Возвращает минимальное значение выражения во всех строках результата.
•
STDEV. Возвращает статистическое стандартное отклонение для всех значений выражения.
П STDEVP. Возвращает смещенную оценку стандартного отклонения (квадратный корень от значения, возвращаемого функцией VARP) ДЛЯ всех значений столбца. •
VAR. Возвращает несмещенную оценку дисперсии величин для всех значений выражения.
•
VARP. Возвращает смещенную оценку дисперсии (второй центральный момент выборки относительно выборочного среднего) для всех значений выражения.
•
SUM. Возвращает сумму всех значений выражения.
•
BY expression. Этот параметр позволяет применять функции агрегирования не ко всему набору данных, а к отдельным группам. Например, если анализируется таблица продаж товаров, то можно выполнить группировку по наименованию товара и подсчитать, какое количество товара было продано и на какую сумму. Параметр BY указывается после выражения (или выражений), по которому осуществляется агрегирование. Использование параметра BY требует обязательного указания раздела ORDER BY. Кроме того, выражений, по которому выполняется группировка, должно быть указано в разделе ORDER BY, Т. е. данные в результате должны быть отсортированы по выражению группировки. Если группировка выполняется по нескольким выражениям и после параметра BY указано более одного выражения, то каждое из этих выражений должно быть также приведено и в разделе ORDER BY. Причем порядок перечисления выражений после параметра BY и в разделе ORDER BY должен совпадать. При этом необязательно, чтобы после параметра BY были указаны все выражения, представленные в разделе ORDER BY. Тем не менее, не допускается пропуск параметров. Например, еСЛИ ИСПОЛЬЗуеТСЯ ORDER BY columnl, column2, column3, TO все возможные варианты для раздела COMPUTE будут BY columnl, coiumn2, column3; BY columnl, column2 И BY columnl.
Часть V. Программирование
1194 Замечание При
наличии раздела C O M P U T E не допускается применение параметра
запрещающего включение в результат выборки повторяющихся строк.
DISTINCT,
Приведем несколько примеров использования раздела COMPUTE: SELECT title=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE '' END, price, .ytd_sales FROM titles COMPUTE AVG(price), SUM(ytd_sales), COUNT(ytd_sales)
Будет получен следующий результат: title
price
ytd_sales
The Busy Executive's Database . . 19.9900 Cooking with Computers: Surrep.. 11.9500 You Can Combat Computer Stress.. 2.9900 Straight Talk About Computers 19.9900 Silicon Valley Gastronomic Tre.. 19.9900 The Gourmet Microwave 2.9900 The Psychology of Computer Coo.. NULL But Is It User Friendly? 22.9500 Secrets of Silicon Valley 20.0000 NULL Net Etiquette Computer Phobic AND Non-Phobic.. 21.5900 Is Anger the Enemy? 10.9500 Life Without Fear 7.0000 Prolonged Data Deprivation: Fo.. 19.9900 Emotional Security: A New Algo.. 7.9900 Onions, Leeks, and Garlic: Coo.. 20.9500 Fifty Years in Buckingham Pala.. 11.9500 Sushi, Anyone? 14.9900
4095 3876 18722 4095 2032 22246 NULL 8780 4095 NULL
375 2045
111 4072 3336
375 15096 4095
avg 14.7662
sum 97446
cnt 16 (19 row(s)
affected)
Следующий вариант демонстрирует использование параметра BY: SELECT title=CAST(title as char(30))+ END, type, price, ytd_sales CASE WHEN LEN(title)>30 THEN '...' ELSE FROM titles ORDER BY type COMPUTE AVG(price), SUM(ytd_sales) BY type
Будет возвращен следующий результат: title
type
price
ytd_sales
The Busy Executive's Database
business
19.9900
4095
Глава 29. Выборка данных Cooking with Computers: Surrep. You Can Combat Computer Stress. Straight Talk About Computers
1195 business business business
11.9500 2.9900 19.9900
3876 18722 4095
avg 13.7300
sum Silicon Valley Gastronomic Tre. The Gourmet Microwave
mod cook mod cook
19.9900 2.9900
30788 2032 22246
avg 11.4900
sum But Is It User Friendly? Secrets of Silicon Valley Net Etiquette •
popular comp 22.9500 popular comp 20.0000 popular comp NULL
24278 8780 4095 NULL
avg 21.4750
sum 12875 Computer Phobic AND Non-Phobic. Is Anger the Enemy? Life Without Fear Prolonged Data Deprivation: Fo. Emotional Security: A New Algo.
psychology psychology psychology psychology psychology
21.5900 10.9500 7.0000 19.9900 7.9900
375 2045
111 4072 3336
avg 13.5040
sum 9939 Onions, Leeks, and Garlic: Coo. Fifty Years in Buckingham Pala. Sushi, Anyone?
trad_cook trad_cook trad_cook
20.9500 11.9500 14.9900
375 15096 4095
avg 15.9633
sum The Psychology of Computer Coo.
UNDECIDED
NULL
19566 NULL
avg sum (24 row(s) affected)
Часть V. Программирование
1196
Наконец, приведем пример с использованием группировки по двум столбцам: SELECT TOP 10 title=CAST(title as char(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE ' type, pub_id, ytd_sales FROM titles ORDER BY type, pub_id, price COMPUTE SUMfytd sales) BY type, pub_id
END,
Будет возвращен результат: title
type
You Can Combat Computer Stress... business
pub id ytd_sales 0736
18722
18722
Cooking with Computers: Surrep. The Busy Executive's Database . Straight Talk About Computers
business business business
1389 1389 1389
3876 4095 4095
sum 12066
The Gourmet Microwave Silicon Valley Gastronomic Tre
mod_cook mod cook
0877 0877
22246 2032
sum 24278
Net Etiquette Secrets of Silicon Valley But Is It User Friendly?
popular_comp 1389 popular_comp 1389 popular_comp 1389
NULL 4 095 8780
12875
Life Without Fear
psychology
0736
111
111 (15 row(s) affected)
Глава 29. Выборка данных
1197
Раздел FOR Этот раздел применяется только в приложениях, работающих с DB-Library, a также при работе с XML. Синтаксис раздела таков: [FOR {BROWSE | XML {RAW | AUTO | EXPLICIT} [, XMLDATA] [, ELEMENTS] [, BINARY BASE64] }]
Указание ключевого слова BROWSE позволяет приложениям DB-Library выполнять изменение выбранных данных непосредственно через форму просмотра. Однако указания лишь параметра FOR BROWSE недостаточно. Необходимо выполнить еще некоторые требования: П таблица должна включать столбец time stamp; О в таблице должен быть создан уникальный индекс; П раздел FOR BROWSE должен быть последним разделом команды SELECT. Обновление данных средствами браузера будет возможно только при соблюдении всех этих требований. Замечание Параметр F O R B R O W S E не может применяться в запросе, который указан как подзапрос раздела U N I O N . Кроме того, совместно с разделом F O R B R O W S E недопустимо использование хинта H O L D L O C K , предписывающего удерживать блокировку до конца транзакции.
При указании параметра XML сервер будет выполнять преобразование выбираемых данных в формат документа XML, что позволяет просматривать данные с помощью Интернет-браузера. При этом SQL Server 2000 может использовать различные режимы преобразования: •
RAW. Каждой строке результата выборки присваивается идентификатор.
П AUTO. Результат выполнения запроса возвращается в виде простого дерева XML. •
EXPLICIT. В этом случае форма документа XML определяется явно. Пользователь должен в запросе определить, какие элементы в какие ветви будут включены. Для этого первые два столбца результата выборки используются в качестве служебных.
Помимо определения режима преобразования данных можно также указать дополнительные параметры: П XMLDATA. При наличии этого ключевого слова в результат выборки не будет включено определение корневого элемента. Это необходимо при включении результата выполнения запроса в уже существующий документ. Если же параметр XMLDATA не указывается, то результат выборки представляет собой самостоятельный документ. П ELEMENTS. Столбцы будут возвращаться как подэлементы. Если же параметр ELEMENTS не указывается, то столбцы рассматриваются как атрибуты XML. G BINARY BASE64. Указание этого параметра предписывает серверу возвратить данные в двоичном 64-битовом формате.
1198
Часть V. Программирование
Раздел OPTION Раздел OPTION предназначен для контроля хода выполнения запроса. С помощью специальных хиншов (hint) пользователь может установить тот или иной режим слияния, объединения или агрегирования данных, а также контролировать некоторые другие тонкости выполнения запроса. Раздел OPTION имеет следующую структуру: OPTION ( {{HASH | ORDER} GROUP | {CONCAT | HASH | MERGE} UNION I { LOOP | MERGE | HASH } JOIN I FAST number_rows I FORCE ORDER I MAXDOP number | ROBUST PLAN I KEEP PLAN | KEEPFIXED PLAN | EXPAND VIEWS [,...n]})
Рассмотрим назначение и использование параметров раздела: •
{HASH | ORDER} GROUP
Эта конструкция определяет, какой алгоритм агрегирования будет применяться в разделах GROUP BY И COMPUTE. При указании HASH используется хэ-
ширование, тогда как указание ORDER приведет к обычному упорядочиванию данных. П
{CONCAT | HASH | MERGE} UNION С помощью этой конструкции указывается способ объединения данных при существовании раздела UNION.
•
{LOOP | MERGE | HASH} JOIN Определяет способ связывания данных при использовании раздела JOIN.
•
FAST number_rows При задании этого хинта сервер оптимизирует запрос для быстрой выборки первых numberrows строк. После этого выполнение запроса продолжится в обычном режиме. Такой подход позволяет быстро получить первую порцию данных, не дожидаясь обработки значительной части запроса.
•
FORCE ORDER
При указании этого хинта будет сохранен порядок связывания данных, приведенный в запросе. В противном случае оптимизатор запроса может использовать другой порядок связывания, отличный от указанного пользователем. •
MAXDOP number
Этот хинт разрешает явно указать стоимость распараллеливания запроса. Это позволяет переопределить значения, установленные с помощью хранимой процедуры sp_configure с использованием опции 'max degree of p a r a l l e l i s m ' . •
ROBUST PLAN
При указании этого хинта сервер выстраивает план выполнения запроса таким образом, чтобы обеспечить поддержку обработки данных большой длины. В
Глава 29. Выборка данных
1199
обычном режиме объем резервируемой памяти не позволяет обрабатывать строки большой длины, и при попытке выполнить запрос оптимизатор запросов (Query Optimizer) выдаст сообщение об ошибке еще на стадии создания плана выполнения запроса. Однако следует осторожно использовать ROBUST PLAN, т. к. в этом случае скорость выполнения запроса существенно падает. •
KEEP PLAN
Указание этого хинта предписывает серверу сохранить план исполнения запроса, подготовленный оптимизатором запроса. Точнее, снижается порог повторной компиляции плана выполнения запроса, что повышает производительность выполнения запросов. Порог определяет частоту перекомпиляции запроса в зависимости от объема изменений данных в таблице. •
KEEPFIXED PLAN
Этот хинт предписывает серверу не выполнять перекомпиляции плана исполнения запроса даже при изменении статистики или индексов. •
EXPAND VIEWS
Данный хинт предписывает серверу при работе с индексированными представлениями не подставлять вместо имени представления запрос, на основе которого было построено соответствующее представление. Это гарантирует, что будут использованы все преимущества индексированных представлений. Этот параметр говорит о том, что в разделе OPTION может быть указано множество хинтов. Тем не менее, следует учитывать, что при использовании раздела UNION раздел OPTION может применяться только для последнего запроса и будет определять ход выполнения всех объединяемых запросов, рассматриваемых в конечном счете как один запрос, к которому и относится раздел OPTION.
39 Зак. 83
Глава 30
Хранимые процедуры В одной из предыдущих глав были рассмотрены основы языка Transact-SQL, используемого в SQL Server 2000 для доступа к данным. В частности, в двух предыдущих главах обсуждались команды INSERT, SELECT, UPDATE И DELETE, ис-
пользуемые, соответственно, для добавления, выборки, изменения и удаления данных. В большинстве рассмотренных примеров производились простые операции, реализуемые всего несколькими командами. Выполнение этих операций, в частности написание кода команд, не вызывает особых затруднений. Пользователь может написать запрос непосредственно в окне Query Analyzer и выполнить его. Тем не менее, основными клиентами баз данных являются приложения, специально созданные для выполнения определенных задач. Эти приложения часто реализуют сложные операции, требующие использования множества команд. Чтобы выполнить такие операции, приложение отсылает на сервер одну или более команд, которые там выполняются. В ответ сервер отправляет клиенту (приложению) результат обработки запроса. Этим результатом может быть как сообщение об успешном завершении выполнения команды, занимающее всего несколько байт, так и огромный массив данных, включающий тысячи строк и занимающий несколько мегабайт. Клиент может обработать полученный результат и на основе своего полученного результата отослать серверу новый запрос. В рассмотренной ситуации логика обработки данных реализована на клиенте. Сервер просто принимает набор инструкций и выполняет их. При написании приложения разработчик должен позаботиться о разработке запросов, корректно работающих с данными и выполняющих все нужные действия. Предложенный подход к обработке данных имеет несколько недостатков. Например, если нужно изменить логику обработки данных, то следует изменять исходный код программы, после чего заново компилировать ее и распространять всем пользователям. Кроме того, если одна и та же логика обработки данных используется в нескольких приложениях, то в худшем случае для каждого из этих приложений нужно будет повторять процесс разработки запросов, а в лучшем переносить код из уже работающего приложения. Также следует обратить внимание на сам процесс взаимодействия сервера и клиента. По всей видимости, алгоритмы обработки данных будут реализованы в виде набора блоков команд, поочередно отправляемых на сервер. После выполнения блока приложение получает определенный результат, после обработки которого решается, какой следующий блок и с какими параметрами должен быть выполнен. В некоторых ситуациях обмен между клиентом и сервером наборами команд и результатами может занимать много времени и генерировать большой сетевой
Глава 30. Хранимые процедуры
1201
трафик, что отрицательно сказывается на работе приложения в целом и на работе других пользователей сети. Также необходимо сказать о безопасности. Для выполнения обработки данных пользователь должен иметь соответствующие права доступа. Предполагается, что эти права будут использованы приложением для доступа к данным. Однако нельзя быть до конца уверенным, что пользователь не сможет обратиться к данным напрямую, например, с помощью Query Analyzer, и выполнить неразрешенные действия. Также нельзя быть уверенным, что команды, отправляемые приложением, осуществляют верные действия. Ошибка разработчика при создании запроса может иногда привести к повреждению данных. Кроме того, нельзя не учитывать, что злоумышленник или тот же разработчик способен изменить код запроса для получения несанкционированного доступа к данным или для их повреждения и даже уничтожения. Все сказанное выше демонстрирует недостатки подхода к разработке систем, когда логика обработки данных реализуется на клиенте. Описанные проблемы могут быть решены за счет переноса алгоритмов обработки данных на сервер. В этом случае приложение просто сообщает серверу, какой именно набор команд необходимо выполнить. Дополнительно могут быть указаны параметры, которые в зависимости от реализации алгоритма будут влиять на ход выполнения процесса обработки данных. При этом приложение сможет получать только конечный результат выполнения. Все промежуточные результаты будут обработаны сервером. Это позволяет снизить сетевой трафик. Этот набор команд, хранимых на сервере, и выполняемых как одно целое, в терминологии SQL Server 2000 называется хранимой процедурой (stored procedure). Использование хранимых процедур позволяет снизить стоимость сопровождения системы и дает возможность избавиться от необходимости изменять клиентские приложения. Если понадобится изменить логику обработки данных, чтобы она отразилась для всех приложений сети, количество которых может насчитывать десятки и сотни, то достаточно будет изменить только хранимую процедуру. Кроме того, использование хранимых процедур также позволяет значительно повысить безопасность данных. Приложение или пользователь получает лишь специальное право на выполнение хранимой процедуры, которая и будет обращаться к данным. Доступа же к самим данным пользователь не получает. В хранимой процедуре можно реализовать проверки на правильность выполняемых изменений, что обеспечит логическую целостность данных. Также можно реализовать проверки на права пользователя выполнять те или иные действия.
Системные хранимые процедуры Хранимые процедуры активно используются для решения самых разнообразных задач, связанных с аспектами работы сервера и функционированием баз данных и всех ее объектов. Информация обо всех аспектах работы сервера хранится в системных таблицах. Самая важная из них, база данных Master, содержит ин-
1202
Часть V. Программирование
формацию о параметрах работы ядра SQL Server 2000, обладает данными об учетных записях пользователей, сведениями о созданных на сервере базах данных, а также многой другой информацией. Данные хранятся в специальных системных таблицах, каждая из которых имеет конкретное назначение. Изменение значений в этих таблицах приводит к изменению тех или иных аспектов работы сервера или баз данных. Пользователи могут изменять значения в этих таблицах напрямую с помощью команд UPDATE, INSERT, SELECT и DELETE. Однако такие изменения требуют специальных знаний. Иногда выполнение неверной команды может вывести из строя весь сервер и будет очень трудно восстановить его работоспособность. Кроме того, часто для осуществления одной операции необходимо выполнить множество команд. Чтобы избавить пользователя от рутины и обеспечить высокую безопасность выполняемых изменений, в SQL Server 2000 используются специальные системные хранимые процедуры (system stored procedure). Количество этих процедур составляет несколько сотен. Для удобства они разбиты на отдельные группы, каждая из которых предназначена для решения специфических задач. Например, имеются процедуры для управления системой репликации, процедуры для управления системой безопасности, процедуры для управления курсорами, процедуры для управления работой службы SQLServerAgent и некоторые другие. Системные хранимые процедуры характеризуются тем, что они хранятся в системной базе данных Master и в своем названии имеют префикс sp, после которого следует символ подчеркивания и затем имя собственно процедуры. Например, sp_help_fulltext_columns_cursor ИЛИ sp_attach_db.
Расширенные хранимые процедуры Расширенные хранимые процедуры (extended stored procedure) по своей природе коренным образом отличаются от системных и пользовательских хранимых процедур. Хотя вызов этих процедур и выполняется подобно другим процедурам, тем не менее, они представляют собой динамически подключаемые библиотеки (файлы dll). To есть расширенные хранимые процедуры представляют собой отдельные программы, которые в операционной системе могут играть роль самостоятельного приложения. Расширенные хранимые процедуры имеют префикс хр. В SQL Server 2000 имеется набор встроенных расширенных хранимых процедур, в частности используемых для отправки сообщений по электронной почте и для трассировки обращений к SQL Server 2000. Пользователи могут создавать новые хранимые процедуры с помощью любого языка, допускающего создание библиотек. При этом они должны использовать интерфейс программирования SQL Server Open Data Services API. Готовую библиотеку необходимо зарегистрировать в SQL Server 2000, после чего пользователи смогут применять реализованные в ней функции. Регистрация библиотеки ПРОИЗВОДИТСЯ При ПОМОЩИ Хранимой процедуры sp_addextendedproc, имеющей следующий синтаксис: sp addextendedproc
[Qfunctname =] 'procedure 1 ,
[@dllname =]
'dll'
Глава 30. Хранимые процедуры
1203
Параметр @functname определяет имя, по которому будет вызываться функция. Можно использовать любое имя, в том числе и с префиксом sp или хр. Однако это необязательно. Параметр @dliname задает путь к нужному dll-файлу. Регистрация расширенных хранимых процедур должна выполняться в контексте базы Данных Master. Типичным примером расширенной хранимой процедуры является процедура xp_cmdsheil, с помощью которой можно вызвать интерфейс командной строки и выполнить любые команды. Приведенный ниже пример выводит в окне Query Analyzer содержимое корневого каталога диска С:. xp_cmdshell ' d i r с:\ '
Будет получен результат: output Volume in drive C has no label. Volume Serial Number is 94F7-C453 NULL Directory of c:\ NULL 02.06.00 19:56 Documents and Settings 02.06.00 19:56 Program Files 15.05.00 00:12 25 CONFIG.DOS 29.06.01 22:17 50 331 648 pagefile.sys 15.05.00 00:39 129 CONFIG.SYS 15.05.00 00:13 WININST0.400 15.05.98 20:01 95 192 COMMAND.COM 15.05.00 00:16 WINDOWS 15.05.00 00:39 7 274 NETLOG.TXT 144 AUTOEXEC.BAT 29.06.00 12:16 WIN95 04.04.01 12:24 SERVICE 29.06.00 12:17 04.04.01 22:28 !! ! 04.04.01 22:29 DN 07.06.00 23:18 Мои документы 28.04.00 15:12 03.06.00 18:08 WINNT 03.06.00 18:14 TEMP 03.06.00 18:52 Multimedia Files 24.04.00 23:50 DrWeb 50 434 412 bytes 20 File(s)
117 751 80i3 bytes free (27 row(s) affected)
(
Замечание
J
В приведенном примере выводится просто список файлов, однако с таким же успехом можно выполнить удаление файлов на диске. Для выполнения процедуры xp_cmdshell необходимы права системного администратора (system administrator).
1204
Часть V. Программирование
Другим примером использования расширенных хранимых процедур является отправка сообщений по электронной почте с помощью процедуры xpsendmaii. Данная процедура позволяет отправлять не только сообщения, но и прикреплять к ним результат выполнения запроса. Приведенный ниже пример отправляет на адрес [email protected] результат выборки из таблицы authors: EXEC xp_sendmail @recipients = '[email protected]', @query = 'SELECT * FROM pubs..authors', 1 @subject = 'SQL Server Report , Smessage = 'The contents of table pubs..authors', 1 @attach_results = 'TRUE , @width = 320
Возможность применения динамически подключаемых библиотек раскрывает перед разработчиками SQL Server 2000 огромные возможности, предоставляя в их распоряжение все ресурсы операционной системы. С их использованием можно легко написать проигрыватель музыкальных файлов, которые хранятся в базе данных SQL Server 2000.
Создание хранимой процедуры В двух предыдущих разделах было рассказано о системных и расширенных хранимых процедурах. Однако наибольший интерес для разработчиков представляют пользовательские хранимые процедуры, предназначенные для реализации алгоритмов обработки данных. Такие хранимые процедуры создаются на уровне конкретной базы данных. В SQL Server 2000 имеется специальное право доступа — EXECUTE, с помощью которого можно разрешить пользователю или роли базы данных выполнять указанную процедуру. Создание хранимой процедуры производится с помощью команды CREATE PROCEDURE, имеющей следующий синтаксис: CREATE PROC[EDURE] procedure_name [/number] [ {@parameter data_type} [VARYING] [= default] [OUTPUT] ] [,...n] [WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ] [FOR REPLICATION] AS sql_statement [...n]
Рассмотрим назначение и использование параметров команды: d
procedure_name
С помощью этого параметра указывается имя, которое будет иметь хранимая процедура. Имя должно следовать общим правилам именования объектов базы данных, которые были рассмотрены в главе 18. Если в имени процедуры используются недопустимые символы, например пробелы, то имя должно быть заключено в ограничители (квадратные скобки^или двойные кавычки). В SQL Server 2000 допускается создание глобальных и локальных временных хранимых процедур. Для этого перед именем процедуры ставится символ # (локальные) или символы ## (глобальные). Оба типа хранимых процедур автоматически уничтожаются при закрытии соединения, в котором они были созданы. Глобальные временные процедуры доступны для выполнения изо
Глава 30. Хранимые процедуры
1205
всех соединений, тогда как локальные могут вызываться только из того соединения, в котором они были созданы. Максимальная длина имени хранимой процедуры, включая символы # и ##, не должна превышать 128 символов. Дополнительно к имени самой процедуры разрешается указание имени владельца. Например, •andyk.get_siit_student'. Указание имени базы данных не разрешается, поэтому хранимую процедуру можно создать только в текущей базе данных. О ;number Этот параметр предназначен для создания группы одноименных процедур. При этом дополнительно к имени хранимой процедуры можно указать через точку с запятой целое число, которое будет являться номером процедуры. Такой подход позволяет управлять несколькими процедурами как одним целым. Например, если приложение использует 20 хранимых процедур и все их необходимо уничтожить, то при работе с группой для удаления всех процедур достаточно выполнить всего одну команду DROP PROCEDURE. Номера процедур не обязательно должны следовать друг за другом. Например, первая процедура может иметь номер 63, вторая 7, а третья 92. Если в имени процедуры используются неразрешенные символы и оно заключено в ограничители, то номер процедуры должен указываться вне ограничителей. В противном случае номер процедуры будет рассматриваться как часть имени. Например [andyk] . [Get L i s t S t u d e n t ] ; 3. Для вызова одной из процедур ГРУППЫ также НУЖНО будет указать ее НОМер: EXEC [andyk] . [Get L i s t Student] ; 3 . При работе с группой процедур с помощью Enterprise Manager все процедуры будут сохранены под одним именем. О @parameter С помощью этого аргумента для хранимой процедуры указываются входные параметры. При вызове хранимой процедуры пользователь должен будет указать значения для этих параметров, если не определено значение по умолчанию. С помощью параметров хранимой процедуры пользователи могут управлять логикой ее выполнения. В принципе, хранимая процедура может не иметь ни одного параметра. Но даже если параметры указаны, то они могут никак не влиять на ход выполнения процедуры. Параметры представляют собой не что иное, как обычные локальные переменные, создаваемые во время выполнения процедуры. Однако этим переменным автоматически присваиваются значения, указанные пользователями при вызове хранимой процедуры. В теле хранимой процедуры эти переменные используются точно так же, как и переменные, объявленные с помощью команды DECLARE. Как и все обычные переменные, имя параметра хранимой процедуры должно начинаться с символа @ и следовать стандартным правилам именования объектов. d data_type Этот параметр определяет тип данных, который будет иметь соответствующий параметр хранимой процедуры. Допускается использование не только встроенных в SQL Server 2000, но также и определенных пользователями типов данных (UDDT, user defined data type). Также разрешается использование
1206
Часть V. Программирование
типа данных cursor, позволяющего передавать в процедуру или из нее наборы строк, что представляет удобный механизм для обмена большими блоками данных, не умещающимися в одну переменную. •
VARYING
Это ключевое слово используется только для параметров хранимой процедуры, имеющих тип данных cursor. Использование VARYING необходимо, когда в хранимой процедуре происходит создание динамического курсора и полученные данные нужно возвратить из процедуры для дальнейшего использования. •
default С помощью этого аргумента указывается значение по умолчанию, которое будет автоматически присваиваться соответствующему параметру хранимой процедуры, если при ее вызове пользователь не задал явного значения параметра. Применение значения по умолчанию для параметра хранимой процедуры очень напоминает указание значений по умолчанию для столбцов таблицы. В обоих случаях, если не приведено конкретное значение, то будет использоваться значение по умолчанию. При работе с хранимыми процедурами это позволяет упростить их вызов, освободив пользователя от необходимости ввода всех параметров, количество которых может достигать нескольких десятков. В качестве значения по умолчанию разрешается использовать только константы. Применение функций, вызовов хранимых процедур, имен столбцов, подзапросов и т. д. не разрешается. При необходимости значение параметров хранимой процедуры можно изменить в теле процедуры, проверив, что оно совпадает со значением по умолчанию, в качестве которого допускается также использовать значение NULL.
•
OUTPUT
Это ключевое слово приводится, когда необходимо возвратить измененное значение параметра хранимой процедуры. Например, если при вызове хранимой процедуры в качестве значения параметра используется переменная, то при указании ключевого слова OUTPUT после завершения выполнения процедуры значение этой переменной будет относиться к значению соответствующего параметра хранимой процедуры. Не стоит понимать, что при указании OUTPUT параметр процедуры используется исключительно как выходной. Он также может быть применен и в качестве входного параметра.
• ,...п Эта конструкция подразумевает, что для хранимой процедуры может быть указано множество параметров, общее количество которых может достигать 1024. Параметры должны быть указаны через запятую. Для каждого из них обязательно указывается тип данных. Дополнительно можно указать значение по умолчанию и параметры VARYING И OUTPUT. •
WITH
После этого ключевого слова приводятся дополнительные опции хранимой процедуры. Рассмотрим их:
Глава 30. Хранимые процедуры
1207
•
RECOMPILE. Использование этого параметра предписывает не выполнять кэширование плана выполнения хранимой процедуры. То есть всякий раз при вызове процедуры будет происходить генерирование плана обработки запроса. В обычных ситуациях использование этого параметра не рекомендуется.
•
ENCRYPTION. При указании данного параметра происходит шифрование кода процедуры в таблице syscomments, где хранится исходный текст процедуры. Если разработанный алгоритм является коммерческой тайной, то использование шифрования позволит сохранить в тайне код процедуры.
•
FOR REPLICATION. Этот параметр применяется только при выполнении репликации хранимых процедур. Указанный тип репликации позволяет передавать от издателя к подписчикам не весь набор выполненных изменений, и лишь вызов хранимой процедуры со значениями всех входных параметров. Таким образом можно резко снизить объем сетевого трафика. Хранимая процедура, созданная на подписчике с использованием FOR REPLICATION, не может быть вызвана пользователем. Ее запуск разрешен только подсистеме репликации.
• AS После этого ключевого слова начинается тело хранимой процедуры, которое содержит набор команд Transact-SQL. О
sql_statement
[...n]
Этот параметр подразумевает указание собственно команд Transact-SQL, из которых и формируется тело хранимой процедуры. В теле процедуры могут присутствовать вызовы других процедур, команды создания, фиксирования и отката транзакций, команды создания объектов базы данных, команды управления данными и т. д.
Использование номера процедуры Для лучшего понимания использования хранимых процедур и команды CREATE PROCEDURE рассмотрим несколько примеров создания и вызова хранимых процедур. Для начала рассмотрим создание простой хранимой процедуры, которая выводит список всех авторов, проживающих вне Калифорнии: CREATE PROCEDURE get_list_authors;1 AS SELECT au_id, au_lname, state, phone FROM pubs..authors WHERE state!='CA'
После того, как процедура будет создана, можно будет приступить к ее использованию: EXEC get_list_authors;l
Будет возвращен следующий результат: au_id
au_lname
341-22-1782 Smith
state phone KS
913 843-0462
1208
Часть V. Программирование
527-72-3246 Greene 648-92-1872 Blotchet-Halls 712-45-1867 del C a s t i l l o 722-51-5454 DeFrance 807-91-6654 Panteley 899-46-2035 Ringer 998-72-3567 Ringer (8 row(s) affected)
TN OR MI IN MD UT UT
615 503 615 219 301 801 801
297-2723 745-6402 996-8275 547-9982 946-8853 826-0752 826-0752
В приведенном примере была создана хранимая процедура, содержащая всего одну команду и не использующая параметров. Помимо имени процедуры был использован номер, который также был указан при вызове процедуры.
Использование параметров Теперь создадим процедуру с тем же именем, но другим номером и использующую параметр: CREATE PROCEDURE get_list_authors;6 @state char(2) = 'UT1 AS SELECT au_id, au_lname, state, phone FROM pubs..authors WHERE state=@state
В процедуре имеется параметр e s t a t e , который используется для выборки авторов из определенного штата. Для этого параметра указано значение по умолчанию, равное • и т ' . То есть, если при вызове процедуры не будет явно указано значение параметра e s t a t e , то выведенным окажется список авторов, проживающих в штате Юта: EXEC get_list_authors;6
Будет возвращен результат: au_id
au_lname
899-46-2035 Ringer 998-72-3567 Ringer (2 row(s) affected)
state phone UT UT
801 826-0752 801 826-0752
Теперь попробуем указать значение входного параметра: EXEC get_list_authors;6 'СА'
Будет возвращен такой результат: au_id
au_lname
state phone
172-32-1176 213-46-8915 238-95-7766 267-41-2394 274-80-9391 409-56-7008 427-17-2319 472-27-2349 486-29-1786
White Green Carson O'Leary Straight Bennet Dull Gringlesby Locksley
CA CA CA CA CA CA CA CA CA
408 415 415 408 415 415 415 707 415
496-7223 986-7020 548-7723 286-2428 834-2919 658-9932 836-7128 938-6445 585-4620
Глава 30. Хранимые процедуры 672-71-3249 Yokomoto 724-08-9931 Stringer 724-80-9391 MacFeather 756-30-7391 Karsen 846-92-7186 Hunter 893-72-1158 McBadden (15 row(s) affected)
1209
CA CA CA CA CA CA
415 415 415 415 415 707
935-4228 843-2991 354-7128 534-9219 836-7128 448-4982
Возвращение значений из процедуры Теперь же создадим хранимую процедуру, которая будет использовать параметр OUTPUT для возвращения значений. Процедура должна выполнять поиск телефона автора по фамилии и имени или по идентификационному номеру автора. Кроме того, также можно будет выполнить обратную операцию — возвратить идентификационный номер автора, его имя и фамилию по номеру телефона. В процедуре нужно будет как-то определить, хотим мы найти номер автора по его данным или получить данные об авторе по его номеру телефона. Для этого мы будет проверять значение входного параметра процедуры, соответствующего номеру телефона. Если он содержит значение NULL, TO выполняется поиск номера телефона по имени с фамилией или по идентификационному номеру. В противном случае телефонный номер будет использоваться для получения данных об авторе. CREATE PROCEDURE get_author_info @phone char(12)=NULL OUTPUT, @au_id char(ll)=NULL OUTPUT, @LName char(40)=NULL'OUTPUT, ' @FName char(20)=NULL OUTPUT AS IF @phone IS NOT NULL SELECT @au_id=au_id, @LName=au_lname, @FName=au_fname FROM authors WHERE phone=@phone ELSE IF @au_id IS NOT NULL SELECT @phone=phone FROM authors WHERE au_id=@au_id ELSE SELECT @phone=phone FROM authors WHERE au_lname=@LName AND au_fname=@ FName
Теперь используем эту процедуру для поиска идентификационного номера автора по номеру телефона: DECLARE @phone char(12), @ID char(11), @LastName char(40), @FirstName char(20) SET @phone='503 745-6402' EXEC get_author_info gphone, @ID OUTPUT, @LastName OUTPUT, @FirstName OUTPUT SELECT [ID автора]=@ID, [Фамилия автора]=@LastName, [Имя автора]=@FirstName
1210
Часть V. Программирование
Будет получен результат: ID автора
Фамилия автора
Имя автора
648-92-1872 Blotchet-Halls (1 row(s) affected)
Reginald
Теперь же попробуем получить номер телефона автора по его имени и фамилии: DECLARE @phone char(12), @LastName char(40), QFirstName char(20) SET @LastName = 'Gringlesby' SET SFirstName = 'Burt' EXEC get_author_info @phone OUTPUT, @Lname = @LastName, @Fname = @FirstName SELECT [Фамилия автора] = QLastName, [Имя автора] = @FirstName, [Телефон] = @phone
Будет получен такой результат: Фамилия автора
Имя автора
Телефон
Gringlesby (1 row(s) affected)
Burt
707 938-6445
Хотя в рассмотренных примерах использовалось всего несколько команд, на практике количество команд может составлять несколько десятков, а то и сотен. Однако приведенные примеры позволяют понять механизм обмена данными между внешним приложением и хранимой процедурой.
Замечание Помимо обмена данными с помощью параметров также имеется возможность вставки в таблицу результата выборки, возвращаемого хранимой процедурой. Эта операция в ы п о л н я е т с я с п о м о щ ь ю команды I N S E R T
рассмотрена в главе 28.
I N T O , работа с которой б ы л а
Работа с курсорами Если с обменом данными через переменные ситуация прояснилась, то обмен данными с использованием курсоров требует дополнительных пояснений. Подробно использование курсоров будет рассмотрено в одной из следующих глав, однако все же приведем пример обмена сложными блоками данных. Создадим хранимую процедуру, которая будет возвращать курсор одного из двух типов. Первый из них будет содержать список авторов, написавший книги указанной серии, тогда как второй станет содержать собственно список книг. Тип курсора будет указываться при вызове хранимой процедуры с помощью параметра @mode. Если этот параметр равен 1, то возвращается список авторов. Для получения списка книг необходимо будет использовать 2. Во всех остальных случаях будет возвращено сообщение об ошибке.
Глава 30. Хранимые процедуры
1211
CREATE PROCEDURE get_series_info @type char(12), SResult CURSOR VARYING OUTPUT, @mode int=l AS IF @mode=l BEGIN SET @Result = CURSOR STATIC FOR SELECT au_id, au_lname, state, phone FROM pubs..authors WHERE au_id IN (SELECT au_id FROM titleauthor ta INNER JOIN titles t ON ta.title_id = t.title_id AND type=@type) OPEN @Result RETURN END IF @mode=2. BEGIN SET @Result = CURSOR STATIC FOR SELECT title_id, title = CAST(title as char(30)), price, ytd_sales FROM titles WHERE type=@type OPEN @Result RETURN END RAISERROR('Указаны неверные параметры при вызове хранимой процедуры',1,11)
Теперь с помощью созданной процедуры попробуем получить список всех авторов, написавших книги серии business: DECLARE @curs cursor, @ID char(11), Sphone char(12), QLastName char(40), @State char(2) EXEC get_series_info 'business', @curs output FETCH FIRST FROM @curs INTO @ID, @LastName, @Phone, @State SELECT [ID автора]=@ID, [Фамилия автора]=@LastName, [Телефон]=@phone, [Штат]=@State WHILE @@FETCH_STATUS=O BEGIN FETCH NEXT FROM @curs INTO @ID, @LastName, @Phone, @State SELECT [ID автора]=@ID, [Фамилия автора]=@LastName, [Телефон]=@phone, [niTaT]=@State END
Будет получен результат: ID автора
Фамилия автора
213-46-8915 Green
Телефон
Штат
CA
41
Телефон
Штат
CA
40
(1 row(s) affected) ID автора
Фамилия автора
267-41-2394 O'Leary (1 row(s) affected)
Часть V. Программирование
1212 ID автора
Фамилия автора
Телефон
Штат
274-80-9391 Straight (1 row(s) affected)
СА
41
ID автора
Телефон
Штат
409-56-7008 Bennet (1 row(s) affected)
СА
41
ID автора
Телефон
Штат
724-80-9391 MacFeather (1 row(s) affected)
СА
41
ID автора
Телефон
Штат
СА
41
Фамилия автора
Фамилия автора
Фамилия автора
724-80-9391 MacFeather (1 row(s) affected)
Теперь же попробуем получить список книг серии business: DECLARE @curs cursor, @ID char(6), @Name char(30), @price numeric, @sales int EXEC get_series_info 'business', @curs output, 2 FETCH FIRST FROM @curs INTO @ID, @Name, @Price, @Sales SELECT [ID книги]=@ID, [Название произведения]=@Name, [Цена]=@price, [Продано]=@sales WHILE @@FETCH_STATUS=0 BEGIN FETCH NEXT FROM @curs INTO @ID, @Name, @Price, @Sales SELECT [ID книги]=@ID, [Название произведения]=@Name, [Цена]=@price, [Продано]=@sales END
Будет получен результат: ID книги Название произведения
Цена
Продано
BU1032 The Busy Executive's Database (1 row(s) affected)
20
4095
ID книги Название произведения
Цена
Продано
BU1111 Cooking with Computers: Surrep 12 (1 row(s) affected) ID книги Название произведения
Цена
BU2075 You Can Combat Computer Stress 3 (1 row(s) affected)
3876
Продано 18722
Глава 30. Хранимые процедуры
1213
ID книги Название произведения
Цена
Продано
BU7832 Straight Talk About Computers (1 row(s) affected)
20
4095
ID книги Название произведения
Цена
Продано
BU7832 Straight Talk About Computers (1 row(s) affected)
20
4095
Приведенный пример хранимой процедуры демонстрирует использование одной и той же процедуры для получения самых разнообразных результатов.' Пользователи могут включать в процедуры различные проверки на права доступа пользователей выполнять те или иные действия. Например, в последней процедуре можно было реализовать проверку имени пользователя, вызвавшего процедуру, и разрешить получение списка авторов по серии только нескольким пользователям, тогда как получение списка книг одной серии разрешить всем пользователям.
Использование кода завершения В последнем примере была указана команда RETURN, использование которой допускается только внутри хранимой процедуры. Когда встречается эта команда, выполнение хранимой процедуры прерывается и управление передается в то место, откуда произошел вызов процедуры. При этом в команде RETURN допускается указание кода завершения. Для этого в конец команды просто добавляется целое число, которое и будет являться кодом завершения процедуры. Если значение не указано явно, то будет возвращено значение 0.
С
Замечание
Код возврата можно рассматривать как еще один механизм обмена данными между клиентом и хранимой процедурой. Конкретное назначение того или иного возвращаемого значения зависит от разработчика. Обычно при удачном завершении процедуры возвращается значение 0. Код возврата может быть как положительным, так и отрицательным. Рассмотрим хранимую процедуру, которая использует код завершения процедуры для возвращения количества книг, стоимость которых выше значения, указанного при вызове процедуры: CREATE PROCEDURE get_series_info;27 @price NUMERIC (6,2) AS DECLARE @cnt INT SELECT Sent = COUNT(*) FROM titles WHERE price>=@price RETURN Sent
Для получения кода завершения выполнения хранимой процедуры используется КОНСТРУКЦИЯ EXEC = <stored procedureX Запустим созданную процедуру и получим код завершения:
Часть V. Программирование
1214 DECLARE @aa int EXEC @aa=get_series_info;27 15 SELECT •Количество книг'=@aa
Будет возвращен следующий результат: Количество книг
(1 row(s) affected)
Изменение хранимых процедур Как бы хорошо ни разрабатывалась хранимая процедура, все равно возникает надобность изменить в ней одну или более команд. Для этого используется команда ALTER PROCEDURE, имеющая следующий синтаксис: ALTER PROC[EDURE] procedure_name [;number] [{@parameter data_type } [VARYING] [= default] [OUTPUT]] [WITH {RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION}] [FOR REPLICATION] AS sql_statement [...n]
[,...n] •
При выполнении изменений средствами Transact-SQL нет возможности модифицировать часть команд, оставив другие без изменения. Команда ALTER PROCEDURE выполняет исправление всего кода процедуры. То есть пользователь при выполнении изменения должен указать весь код хранимой процедуры. При модификации процедуры с помощью Enterprise Manager пользователи могут видеть код хранимой процедуры и могут изменять только ее часть. У пользователя может сложиться впечатление, что он изменяет непосредственно код процедуры. Однако на самом деле происходит полная перезапись старого кода новым кодом, введенным пользователем. Замечание О д н и м и з п р е и м у щ е с т в использования к о м а н д ы A L T E R
PROCEDURE
вместо у д а л е н и я
и затем повторного создания процедуры является возможность сохранения прав доступа пользователей к хранимой процедуре. При удалении процедуры права доступа пользователей теряются, и после повторного создания процедуры необходимо будет заново предоставить пользователям право на выполнение процедуры. При использовании команды A L T E R PROCEDURE права доступа пользователей сохраняются.
В SQL Server 2000 имеется хранимая процедура s p h e l p t e x t , с помощью которой можно просмотреть код другой хранимой процедуры. Например, попробуем вывести код хранимой процедуры g e t s e r i e s i n f o , которая была создана в одном из предыдущих примеров: sp_helptext
'get_series_infо'
Будет получен следующий результат: Text
Глава 30. Хранимые процедуры
1215
CREATE PROCEDURE get_series_info @type char(12), @Result CURSOR VARYING OUTPUT, @mode int = 1 AS IF Smode = 1 BEGIN SET @Result = CURSOR STATIC FOR SELECT au_id, au_lname, state, phone FROM pubs..authors WHERE au_id IN (SELECT au_id FROM titleauthor ta INNER JOIN titles t ON ta.title_id = t.title_id AND type=@type) OPEN @Result RETURN END IF @mode = 2 BEGIN SET @Result = CURSOR STATIC FOR SELECT title_id, title = CAST(title as char(30)), price, ytd_sales FROM titles WHERE type=@type OPEN @Result RETURN END RAISERROR('Указаны неверные параметры при вызове хранимой процедуры',1,11) CREATE PROCEDURE get_series_info;27 @price NUMERIC (6,2) AS DECLARE @cnt INT SELECT @cnt = COUNT(*) FROM titles WHERE price>=@price RETURN @cnt
Как видно, под именем одной процедуры на самом деле хранится две процедуры. При внесении изменений следует учитывать эту особенность. Полученный текст можно использовать для выполнения изменений, достаточно скопировать его в буфер обмена и перенести в окно команд Query Analyzer. Замечание При модификации хранимой процедуры в Enterprise Manager для получения кода процедуры также используется хранимая процедура s p _ h e l p t e x t . Полученный текст отображается в диалоговом окне, в котором пользователь может вносить необходимые изменения. При завершении редактирования и сохранении изменений происходит удаление старой процедуры, и вместо нее создается новая с тем же именем. Если обратить внимание, то в окне Enterprise Manager выводится весь код, с помощью которого выполняется создание процедуры, включая слова CREATE P R O C E D U R E , о п и с а н и е п а р а м е т р о в и т. д .
Мы использовали хранимую процедуру spheiptext для получения кода созданной нами же процедуры базы данных pubs. Однако с помощью этой проце-
1216
Часть V. Программирование
дуры можно легко получить код и системных хранимых процедур, хранящихся в базе данных Master. Например, выведем код хранимой процедуры spaddgroup: USE master EXEC sp_helptext
'sp_addgroup'
Будет возвращен следующий рерультат: Text create procedure sp_addgroup @grpname sysname as declare @ret int execute @ret = sp_addrole return @ret
—
name of new role
Sgrpname
Как видно из приведенного кода, процедура spaddgroup просто выполняет вызов процедуры sp_addroie, передавая ей входной параметр и возвращая код возврата, полученный после выполнения процедуры s p a d d r o i e . Дело в том, что процедура spaddgroup оставлена лишь для обеспечения совместимости с предыдущими версиями SQL Server. Но так как в SQL Server 2000 группы не используются, а вместо них предложены роли, то вместо создания группы будет создана пользовательская роль базы данных с таким же именем.
Удаление хранимых процедур Процедура может быть удалена при выполнении изменений или просто из-за ненадобности. Для удаления хранимых процедур используется следующая команда: DROP PROCEDURE
{procedure} [,...n]
С помощью одной команды DROP PROCEDURE МОЖНО удалить множество процедур. Удаление процедуры включает удаление из системной таблицы sysobjects строки с информацией о хранимой процедуре, а также удаление из таблицы syscomments собственно кода хранимой процедуры. Так как SQL Server 2000 не позволяет восстанавливать удаленные строки таблиц, то нельзя будет и восстановить хранимую процедуру после удаления. Не стоит удалять процедуру, если есть даже небольшая вероятность того, что она в будущем снова может понадобиться. Процедуры занимают не так много места, чтобы стремиться избавиться от них. При необходимости можно изменить имя процедуры, добавив префикс, по которому можно было сразу же определить, что процедура не используется и может быть удалена. В качестве такого префикса можно использовать, например ' wasted '. При удалении процедур следует учитывать, что с помощью команды DROP PROCEDURE нельзя удалить отдельную процедуру из группы, а можно лишь убрать всю группу процедур целиком. Если все же необходимо удалить не всю группу, а лишь одну процедуру, то для этого можно использовать команду ALTER TABLE ИЛИ ВЫПОЛНИТЬ удаление всей группы и затем создать только нужные процедуры. Получить текст некоторой процедуры можно с помощью хранимой процедуры s p h e l p t e x t .
Глава 31
Использование курсоров В ответ на запросы пользователей SQL Server 2000 может возвращать сотни тысяч строк, общим объемом в десятки мегабайт. Передача такого объема данных по сети одновременно многими пользователями может вызвать значительную загрузку, что отрицательно скажется на работе всех пользователей сети. Кроме того, не каждый клиент имеет достаточный объем памяти, чтобы сохранить все полученные данные. К тому же обычно клиент работает лишь с небольшой частью данных, например отдельной строкой, а не со всем набором строк. То есть клиенту не нужен одновременно весь набор данных. Для него было бы предпочтительней получать с сервера результат выборки отдельными порциями. Это бы позволило снизить требования к мощности компьютера-клиента и уменьшить интенсивность сетевого трафика. Кроме того, часто бывает просто необходимо иметь возможность обратиться к конкретной строке выборки по ее номеру, однако с помощью команды SELECT сделать это довольно трудно. Механизмом, обеспечивающим хранение результата выборки на сервере и предоставляющим пользователю возможность доступа к любой строке выборки по ее номеру, являются курсоры (cursors). Курсор представляет своего рода окно, накладываемое на результат выборки. Пользователь может работать в каждый момент времени только с одной строкой, но, перемещая окно, он способен получить доступ к любой строке выборки. Исходный набор данных, к которому обращается пользователь, называется полным набором строк (complete set of rows). В результате выполнения запроса SELECT пользователю возвращается набор данных, называемый результирующим набором (resulting set). Результирующий набор формируется в результате применения к полному набору строк горизонтального и вертикального фильтров. Горизонтальная фильтрация выполняется с помощью указания одного или более логических условий в разделе WHERE. Вертикальная же фильтрация подразумевает включение в результирующий набор не всех столбцов исходного набора данных. Горизонтальная и вертикальная фильтрации могут использоваться как по отдельности, так и вместе. Курсоры SQL Server 2000 работают с результирующим набором, предлагая пользователям дополнительные средства по его обработке. При создании курсора пользователь указывает запрос SELECT, на основе которого создается результирующий набор данных. Аналогично формируется и представление. Однако с представлением пользователь работает как с обычной таблицей, используя стандартные команды обработки данных — SELECT, INSERT, UPDATE и DELETE. При этом сервер обращается ко всем строкам результирую-
1218
Часть V. Программирование
щего набора (если не указано условие в разделе WHERE). При работе с курсорами в каждый момент времени пользователь может работать только с одной строкой. Каждая команда работы с данными курсора оперирует лишь с одной строкой результирующего набора. Если курсор содержит 1000 строк и нужно подсчитать сумму по одному из столбцов, то нужно будет организовать цикл и последовательно обращаться к каждой строке. В итоге необходимо будет выполнить 1000 команд чтения данных. При использовании обычных средств работы с данными того же результата можно добиться с помощью единственной команды SELECT. Однако если вам требуется сформировать в приложении раскрывающийся список, добавляя в него по одному элементу, то использование команды SELECT будет невозможно. Пользователь должен будет последовательно считывать данные из каждой строки и на их основе формировать каждый элемент раскрывающегося списка. В этом случае именно курсоры предлагают лучшее решение задачи. Во многих языках программирования позволяют обращаться к произвольным элементам результирующего набора. То есть, получив в ответ на запрос SELECT от сервера результирующий набор, приложение автоматически формирует набор строк (record set), который позволяет пользователям обращаться к отдельной строке результирующего набора в произвольном порядке. Возможно, при формировании раскрывающегося списка этот подход будет более предпочтителен. Однако в этом случае весь набор данных хранится на клиенте. Использование курсоров SQL Server 2000 дает преимущества, когда обработка данных большей частью происходит на сервере, а не на клиенте. То есть приложение формирует на сервере набор данных, после чего отправляет запросы, обращающиеся к этому набору данных. В ответ может передаваться только результат обработки данных, размер которого значительно меньше объема всего результирующего набора. Операции обработки данных с использованием курсоров выполняются заметно медленнее обычных команд обработки данных и не позволяют работать со всеми строками одновременно. Поэтому всегда, когда это возможно, следует избегать применения курсоров и пользоваться командами SELECT, UPDATE, INSERT И DELETE.
Виды курсоров По месту хранения и принципам работы курсоры классифицируются следующим образом: П Курсоры Transact-SQL (Transact-SQL Cursors). Создание курсоров этого типа и работа с ними ведется средствами команд Transact-SQL. Эти курсоры создаются на сервере. Интенсивное применение курсоров может потребовать использования дополнительной оперативной памяти для хранения данных курсоров. Курсоры Transact-SQL могут создаваться и работать в транзакциях, хранимых процедурах и триггерах. •
Курсоры API сервера (API Server Cursors). Этот тип курсоров используется приложениями при работе с различными механизмами доступа к данным
Глава 31. Использование курсоров
1219
(ODBC, OLE DB, DB Library и т. д.). Используя соответствующий API, клиент выполняет команду создания курсора. API сервера принимает запрос и создает на сервере курсор Transact-SQL. Работа с этим курсором выполняется средствами API, реализующего все базовые операции с курсорами и, возможно, некоторые дополнительные операции. Как и в случае с курсорами Transact-SQL, при действиях с курсорами API сервера данные хранятся на сервере. • Курсоры клиента (Client Cursors). Этот тип курсоров создается непосредственно на клиенте. Сервер обрабатывает отправленный клиентом запрос и возвращает ему результирующий набор. Клиент получает весь результирующий набор и уже сам организует нужные механизмы доступа к данным. Такой подход весьма удобен при работе с небольшим набором данных, т. к. позволяет повысить производительность за счет уменьшения количества обращений к сети, требующих определенного времени на обработку. Однако при работе с большими наборами данных каждый из клиентов должен иметь необходимый объем оперативной памяти. Как уже было сказано, формирование содержимого курсоров происходит на основе результата, возвращаемого после выполнения запроса SELECT. ЭТО позволяет в одном курсоре работать с данными, находящимися в разных таблицах. Кроме того, помимо отображения в курсоре непосредственно данных столбцов исходных таблиц, также допускается использование различных выражений, построенных с использованием функций, констант, имен столбцов и т. д. Также допускается использование переменных. Хотя ранее говорилось, что курсоры разрешают одновременно работать лишь с одной строкой, тем не менее, существуют так называемые блочные курсоры, позволяющие за одну операцию обращаться сразу к нескольким строкам результирующего набора. Однако курсоры этого типа являются своего рода расширением стандартного курсора. В SQL Server 2000 блочные курсоры могут создаваться средствами ODBC, OLE DB, ADO или DB Library. Однако создание блочных курсоров средствами Transact-SQL не поддерживается. По способу обращения к данным курсоры можно разделить на две следующие категории: • Последовательные (Forward-only). Этот тип курсоров разрешает только последовательное считывание строк, начиная с первой строки и заканчивая последней. После выполнения команды выборки сервер автоматически перемещает указатель на следующую строку. Сам пользователь не может управлять ходом выборки строк — например, считать предыдущую строку или строку через две после текущей. Последовательные курсоры, хотя и обладают ограниченной функциональностью, работают быстрее прокручиваемых курсоров. П Прокручиваемые (Scrollable). В отличие от последовательных курсоров, курсоры этого типа позволяют обращаться к произвольной строке результирующего набора. В распоряжении пользователей имеются средства как последовательного обращения к строкам курсора, так и средства работы со строками
1220
Часть V. Программирование
по их порядковому номеру в результирующем наборе. Направление перебора строк при последовательном обращении может быть не только прямым (от первой строки к последней), но и обратным (от последней к первой). Кроме того, можно в произвольном порядке комбинировать команды последовательного и произвольного обращения к строкам курсора. Замечание Серия последовательных выборок данных из курсоров называется прокручиванием (или скроллингом) курсора. Для последовательных курсоров допускается только прямой скроллинг, тогда как для прокручиваемых также и обратный.
Курсоры Transact-SQL В этой книге мы не будем рассматривать курсоры API сервера и курсоры клиента, ограничившись подробным рассмотрением курсоров Transact-SQL. В SQL Server 2000 реализовано четыре типа курсоров, обладающих разными возможностями. Иногда свойства курсоров разных типов (или даже одного типа) полностью перекрывают возможности другого типа. Использование того или иного типа зависит от требований пользователя. По возможности следует применять самые простые типы курсоров, т. к. они обрабатываются сервером быстрее и требуют меньше ресурсов. (
Замечание
^
Тип курсора указывается в момент его создания и после этого не может быть изменен.
Статические курсоры Как уже говорилось, для создания курсора необходимо указать запрос SELECT, на основе которого будет выполняться формирование результирующего набора данных, отображаемого в курсоре. При создании статического курсора (static cursor), или как его еще называют, курсора моментального снимка (snapshot cursor) сервер сохраняет полученные данные в системной базе данных Tempdb, используемой для временного хранения данных. При работе с курсором сервер обращается не к данным исходных таблиц, а к данным, сохраненным в базе данных Tempdb. Таким образом, в распоряжении пользователя имеется копия исходных данных (моментальный снимок). Во время создания статического курсора сервер блокирует все данные, удовлетворяющие критериям выборки. На момент формирования курсора ни одна транзакция не может изменить даже одну строку, входящую в курсор. Таким образом и получается моментальный снимок. Пользователи могут обращаться к произвольным строкам результирующего набора, на основе которого построен статический курсор. В статических курсорах не поддерживается отображение изменений, сделанных в исходных данных. При использовании статических курсоров пользователь мо-
Глава 31. Использование курсоров
1221
жет работать с данными, которые уже не существуют в исходных таблицах или были изменены таким образом, что при повторном создании статического курсора они бы уже не вошли в результирующий набор, т. к. не удовлетворяли бы условию горизонтальной фильтрации. Кроме того, в исходные таблицы могут быть добавлены новые строки, которые удовлетворяют условию горизонтальной фильтрации курсора. Помимо того, что изменения в исходных таблицах никак не отображаются в статическом курсоре, пользователь даже не получает никаких сообщений о выполненных изменениях. Природа статического курсора не позволяет выполнять изменения отображаемых в нем данных. Это связано с тем, что нет никакой гарантии в существовании строк, включенных в курсор, а также в том, что эти строки не претерпели изменений. Поэтому статические курсоры всегда открываются в режиме "только для чтения" (read only.) Несмотря на все описанные ограничения, статические курсоры весьма полезны при работе с данными, зависящими друг от друга. Например, если пользователь последовательно считывает номера паспортов из таблицы, и прочитал уже половину строк, а другой пользователь в это время удаляет строку из начала таблицы и вставляет ее в конец таблицы, то курсор прочитал бы одни и те же данные дважды. Это произойдет несмотря на то, что в каждый момент времени таблица содержит уникальные значения номеров паспорта и целостность данных не нарушена. При использовании статических курсоров пользователи могут быть уверены, что описанная проблема не будет иметь места.
(
Замечание
Так как данные курсора хранятся в системной базе данных Tempdb, то при активном использовании статических курсоров для хранения больших объемов данных многими пользователями следует позаботиться о том, чтобы в этой базе данных имелось достаточно свободного пространства. Возможно, лучшим решением будет разрешение автоматического увеличения (auto grow) размера этой базы данных.
Ключевые курсоры Курсоры, базирующиеся на наборе ключей (keyset driven cursors) или ключевые курсоры, представляют собой набор ссылок на строки, которые удовлетворяют условиям горизонтальной фильтрации, указанным при создании курсора в разделе WHERE запроса SELECT. TO есть, в отличие от статического курсора, ключевые курсоры выбирают не всю строку, а лишь ключевые поля, позволяющие однозначно идентифицировать каждую строку результирующего набора в полном наборе. Полученный набор уникальных ссылок называется набором ключей (keyset). Таким образом, результирующий набор физически является ничем иным, как набором ключей. Пользователи могут обращаться к произвольным строкам результирующего набора. При обращении к строке курсора сервер находит в наборе ключей нужный идентификатор и выбирает данные непосредственно из полного набора данных. Такой подход позволяет отображать в курсоре любые изменения, сделанные в
1222
Часть V. Программирование
исходном наборе данных. Однако набор ключей формируется только в момент открытия курсора и впоследствии не изменяется. Если в исходные таблицы были добавлены новые строки, удовлетворяющие условиям горизонтальной фильтрации курсора, то такие строки не будут отображены в курсоре. Кроме того, пользователи могут удалить строки, входящие в результирующий набор курсора. Такие строки показываются в курсоре как поврежденные (row missing). К аналогичному результату приведет и изменение значений в ключевых столбцах. Кроме того, если при создании курсора использовались логические условия (раздел WHERE) ДЛЯ ограничения диапазона строк, входящих в результирующий набор, то если пользователи изменят строки таким образом, что они не будут удовлетворять условиям горизонтальной фильтрации, то эти строки все равно станут обрабатываться курсором. Это является следствием того, что набор ключей формируется при открытии курсора и в дальнейшем не изменяется. (
Замечание
^
Набор ключей, как и данные статического курсора, хранится в системной базе данных Tempdb. При активном использовании ключевых курсоров и хранении больших объемов данных многими пользователями следует позаботиться о том, чтобы в этой базе данных имелось достаточно свободного пространства. Возможно, лучшим решением будет разрешение автоматического увеличения (auto grow) размера этой базы данных.
Последовательные курсоры Как уже было сказано ранее, по способу обращения к данным курсоры SQL Server 2000 можно классифицировать как последовательные (forward-only) и прокручиваемые (scroll). Если предполагается произвести лишь одиночное последовательное сканирование всех строк курсора, то рекомендуется использовать специально для этого предназначенные последовательные курсоры (forward-only cursors). Этот тип курсоров поддерживает только обращение к следующей строке курсора и не позволяет вернуться к любой из ранее выбранных строк. Кроме того, не разрешается перескакивать через одну или более строк. Таким образом, пользователи могут перебирать одну строку за другой, начиная с первой и заканчивая последней. При создании последовательного курсора сервер не сохраняет значений ключей или копий строк. Сервер оперирует лишь запросом SELECT И номером текущей строки. При считывании следующей строки сервер выполняет поиск в исходных таблицах следующей после текущей строки, удовлетворяющей условиям горизонтальной фильтрации. Такой подход позволяет отображать в курсоре все изменения, выполненные в результирующем наборе другими пользователями. Кроме того, при работе с последовательными курсорами минимальны требования к объему оперативной памяти. Независимо от количества строк, доступных в курсоре, объем необходимой памяти для работы с последовательными курсорами будет всегда примерно одинаков.
Глава 31. Использование курсоров
1223
Динамические курсоры Динамические курсоры (dynamic cursors) используют тот же принцип обращения к данным, что и последовательные, однако позволяют обращаться к любой произвольной строке результирующего набора. По способу доступа к данным и отображению в результирующем наборе изменений, сделанных другими пользователями, динамические курсоры напоминают ключевые курсоры. Однако между этими типами имеется одно существенное различие. Как было сказано ранее, ключевой курсор представляет собой набор идентификаторов строк (набор ключей), входящих в результирующий набор курсора. Этот набор ключей не меняется за все время использования курсора. Следствием этого является то, что в курсоре содержатся даже те строки, которые после внесения изменений пользователями не удовлетворяют условиям горизонтальной фильтрации. Природа же динамических курсоров такова, что при каждом обращении к строкам сервер заново обрабатывает ассоциированный с курсором запрос SELECT, обновляя тем самым результирующий набор. Если в исходный набор данных пользователями были внесены изменения, влияющие на список строк результирующего набора, то такие изменения будут автоматически отражены в курсоре. При использовании динамических курсоров пользователь гарантированно работает со строками, удовлетворяющими условиям горизонтальной фильтрации курсора. При работе с динамическими курсорами пользователи могут выполнять с помощью них изменения данных в исходных таблицах. Для этого предназначены команды UPDATE, INSERT и DELETE. Однако каждая такая команда за один раз может работать только с одной строкой. Во время выполнения выборки или изменений данных с помощью курсора SQL Server 2000 блокирует соответствующим образом нужную строку. При чтении данных с помощью курсора другие пользователи не смогут изменить данные, читаемые в курсоре. Если же в курсоре производится изменение данных, то другие пользователи не смогут даже прочитать эти данные. Такой подход полностью соответствует требованиям ACID, рассмотренным в главе 19.
С
Замечание
^
Если установлен уровень изоляции, допускающий грязное чтение, то другие пользователи смогут читать изменяемые с помощью курсора данные, не дожидаясь фиксирования транзакции.
Работа с курсорами После того, как был выбран нужный тип курсора и разработан запрос SELECT, на основе которого будет формироваться результирующий набор данных, можно приступать к реализации и использованию этого курсора.
1224
Часть V. Программирование
Весь процесс использования курсора можно разбить на пять этапов: •
Объявление курсора (declare cursor). Прежде чем выполнить любую операцию с курсором, его необходимо объявить. Объявление курсора можно сравнить с объявлением переменной или созданием таблицы. Объявление курсора подразумевает указание его имени и запроса SELECT, который будет использоваться для формирования результирующего набора. При объявлении курсора также указывает его тип.
•
Открытие курсора (open cursor). Сразу же после создания курсор не содержит никаких данных, так же как и после создания таблице в ней нет никаких данных. В процессе открытия курсора выполняется ассоциированный с курсором запрос SELECT. Если создается статический курсор, то сервер будет копировать весь полученный результат в системную базу данных Tempdb. При работе с ключевым курсором в базу данных Tempdb будет помещен только набор ключей.
О Выборка данных из курсора и использование курсора для изменения исходных данных. После того, как курсор открыт, пользователь может приступать к выборке данных из этого курсора. В зависимости от типа созданного курсора также с помощью курсора возможно изменение исходных данных. D Закрытие курсора (close cursor). После того, как из курсора были получены все интересующие данные и выполнены все необходимые изменения, его можно закрыть. Закрытие курсора подразумевает освобождение выделенного для него пространства в системной базе данных Tempdb. После закрытия курсора пользователь не сможет обратиться ни к одной строке. П Освобождение курсора (release cursor). Закрытый курсор может быть удален. Удаление курсора подразумевает удаление из оперативной памяти описания курсора как объекта. Если курсор закрыт, но не удален, он может быть повторно открыт для использования. При этом в него будет помещен новый набор строк. Можно удалить только закрытый курсор. Рассмотрим более подробно каждый из этапов использования курсоров.
Объявление курсора Первое, что выполняется при работе с курсорами — это их объявление. Объявление курсора выполняется с помощью команды DECLARE CURSOR. SQL Server 2000 поддерживает два формата этой команды. Первый из них соответствует требованиям стандарта ANSI SQL-92 и предоставляет базовый набор опций. Второй же формат является собственной разработкой Microsoft и предоставляет пользователям более широкий набор возможностей. Обсудим использование обоих вариантов команды. Сначала же рассмотрим формат ANSI SQL-92: DECLARE c u r s o r _ n a m e [INSENSITIVE] [SCROLL] CURSOR FOR s e l e c t _ s t a t e m e n t [FOR {READ ONLY | UPDATE [OF column name [ , . . . n ] ] } ]
I !
Глава 31. Использование курсоров
1225
Рассмотри назначение и использование параметров команды: О cursor_name Этот параметр определяет имя курсора, которое в дальнейшем будет применяться для обращения к нему. Имя курсора должно удовлетворять общим требованиям именования объектов. В отличие от имени переменной, имя курсора должно начинаться не с символа @. •
INSENSITIVE
Использование этого ключевого слова предписывает серверу создать статический курсор. Результирующий набор курсора будет размещаться в базе данных Tempdb. Работа с таким курсором будет разрешена лишь в режиме "только для чтения". Если ключевое слово INSENSITIVE не указывается, то создается динамический курсор. •
SCROLL
При указании этой опции в создаваемом курсоре можно будет выполнять выборку данных в произвольном порядке. Если же опция SCROLL не указывается, то курсор можно будет просматривать только последовательно в направлении от первой строки к последней. Однако не нужно путать курсор, не обеспечивающий выборку в произвольном порядке, с последовательным курсором. П select_statement
Этот параметр подразумевает указание кода запроса SELECT, который будет использоваться для формирования результирующего набора курсора. При написании кода запроса следует учитывать, что в запросе не допускается применение разделов INTO, GROUP BY И COMPUTE. •
READ ONLY
При указании этого параметра работа с курсором будет возможна только в режиме чтения. Задание этого параметра не обязательно при создании статического курсора, который по своей природе не допускает изменений. Однако не нужно путать курсор "только для чтения" со статическим курсором. Использование параметра READ ONLY ДЛЯ динамических курсоров позволяет повысить скорость выполнения операций работы с курсором. П
UPDATE
[OF c o l u m n _ n a m e
[,...n]]
Указание этого параметра разрешает проводить с помощью курсора изменение исходных данных. Использование этого параметра не разрешается совместно с использованием параметра INSENSITIVE. Аргумент coiumn_name [ , . . . п ] определяет список столбцов, для которых будет поддерживаться возможность изменения данных. Если имена столбцов не указаны, то по умолчанию разрешается обновлять все столбцы курсора. Как видно, стандарт ANSI SQL-92 предоставляет пользователям весьма скудные возможности использования курсоров. В частности, пользователи не могут применять ключевые и последовательные курсоры.
1226
Часть V. Программирование
Более широкие возможности по созданию курсоров предоставляет формат Transact-SQL команды DECLARE CURSOR: DECLARE c u r s o r _ n a m e CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | KEYSET | DYNAMIC | FAST_FORWARD] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] [TYPE_WARNING] FOR s e l e c t _ s t a t e m e n t [FOR UPDATE [OF c o l u m n j i a m e [ , . . . n ] ] ]
Рассмотрим назначение и использование параметров этого формата команды, однако не будем перечислять параметры, уже описанные ранее: •
LOCAL При указании этой опции создаваемый курсор будет локальным, т. е. существовать только на время выполнения транзакции, хранимой процедуры или пакета команд. После завершения работы создавшей курсор транзакции, процедуры или пакета возникает неявное удаление курсора. Это происходит даже в том случае, если курсор не был закрыт. Данные локального курсора могут быть переданы из хранимой процедуры при использовании параметра OUTPUT. Курсор доступен только в пределах создавшей его структуры.
О
GLOBAL
Использование этой опции предписывает создать глобальный курсор, который будет существовать вплоть до закрытия соединения, в котором он был создан. При этом не важно, был ли создан курсор в хранимой процедуре, пакете или триггере. Однако, хотя курсор и называется глобальным, видно его будет только в пределах соединения, в котором он был создан.
Замечание В одном и том же соединении может быть создано два курсора с одинаковыми именами. Это связано с тем, что локальный и глобальный курсоры считаются объектами различных типов, и поэтому допускается применение одинаковых имен для локального и глобального курсора. В этом случае при использовании курсора нужно дополнительно указывать тип курсора, с которым будет выполняться работа. •
FORWARDJDNLY
Использование этого ключевого слова предписывает серверу создать курсор, из которого возможна только последовательная выборка в направлении от первой строки к последней. •
SCROLL В отличие от предыдущего параметра, данный параметр позволяет создавать курсор, допускающий выборку информации в произвольном порядке.
•
STATIC При указании этого параметра будет создан статический курсор.
•
KEYSET Предписывает создание ключевого курсора.
Глава 31. Использование курсоров П
1227
DYNAMIC
Предписывает создание динамического курсора. П
FAST_FORWARD
Указание этого ключевого слова совместно с параметром READONLY позволяет создавать курсор, оптимизированный для последовательного просмотра данных, т. е. когда строки выбираются друг за другом в направлении от первой к последней. Использование FAST_FORWARD не допускается совместно с параметрами SCROLL ИЛИ FORUPDATE. Кроме того, параметры FORWARDJDNLY И
FAST_FORWARD являются взаимоисключающими. •
READJDNLY
Указание этого параметра позволяет запретить использование курсора для выполнения любых изменений исходных данных (изменение или удаление). Использование параметра READ_ONLY не обязательно для статического курсора. Применение же этого параметра с курсорами других типов позволяет оптимизировать операции работы с курсорами. Рекомендуется всегда задавать этот параметр, когда не предполагается выполнять изменений с помощью курсора. •
SCROLL_LOCKS
При указании этого параметра сервер блокирует все строки, входящие в результирующий набор. Это позволяет повысить скорость выполнения операций чтения и модификации данных с помощью курсора, т. к. не нужно будет ожидать каждый раз разблокирования нужных ресурсов. Одновременное использование параметров FAST_FORWARD И SCROLL_LOCKS не допускается. •
OPTIMISTIC
Создание курсора с этим параметром позволяет контролировать попытки изменения через курсор данных, которые уже были изменены пользователями. При этом не используется полное блокирование данных результирующего набора, как это происходит при использовании параметра SCROLLLOCKS. Е С ЛИ в исходной таблице имеется столбец timestamp, то он автоматически используется для отслеживания изменений. Если же такого столбца нет, то выполняется подсчет контрольной суммы каждой строки результирующего набора курсора. Когда пользователь пытается произвести изменение или удаление данных, происходит сравнение значений, хранимых во внутренних структурах курсора, со значениями строки. Если они совпадают, то изменения выполняются. В противном случае пользователь получает сообщение о том, что исходные данные были изменены (другим пользователем или приложением), и операция откатывается. Не допускается одновременное использование ОПЦИЙ FAST_FORWARD И OPTIMISTIC. П
TYPE_WARNING
Если тип курсора, указанный пользователем при его создании, по тем или иным причинам не может быть использован, то сервер выполняет неявное автоматическое преобразование типа курсора. При этом по умолчанию поль-
1228
Часть V. Программирование
зователь не получает никакого сообщения о выполняемых изменениях. Использование параметра TYPE_WARNING предписывает серверу в обязательном порядке информировать пользователя о выполняемом преобразовании типа курсора. Приведем пример создания курсора с использованием переменной: DECLARE @state char(2) SET @state='CA' DECLARE [auth state] CURSOR SCROLL KEYSET LOCAL FOR SELECT au_id, au_lname, au_fname, state FROM authors WHERE state=@state
Замечание Порядок расположения строк в курсоре соответствует их порядку в результате выборки, возвращаемой после выполнения ассоциированного с курсором запроса S E L E C T . И с п о л ь з у я раздел O R D E R B Y , п о л ь з о в а т е л и могут у п р а в л я т ь порядком расположения строк в курсоре.
Открытие курсора Одного объявления курсора недостаточно. Прежде чем приступить к использованию курсора, его необходимо открыть. Открытие курсора включает выполнение ассоциированного с курсором запроса SELECT. Дальнейшие действия с полученным результатом выборки зависят от типа курсора. Например, при открытии статического курсора сервер помещает весь результирующий набор данных в системную базу данных Tempdb. Открытие курсора производится с помощью команды OPEN, имеющей следующий синтаксис: OPEN {{[GLOBAL] cursor_name}
| cursor_variable_name}
Параметр GLOBAL указывает, что открывается глобальный курсор. Указание этого параметра необходимо, если в соединении созданы локальный и глобальный курсоры, имеющие одинаковые имена. Если параметр GLOBAL не используется, то подразумевается, что пользователь работает с локальным курсором. Если выполняется открытие глобального курсора, и в соединении нет локального курсора с таким же именем, то применение параметра GLOBAL также необязательно. Имя открываемого курсора указывается с помощью параметра cursorname. Имя курсора также можно указать с помощью переменной (параметр cursor_variabie_name). Независимо от типа указания имени курсора следует убедиться, что курсор объявлен. В противном случае будет выдано сообщение об ошибке. В приведенном ниже примере выполняется открытие курсора, объявленного в предыдущем примере: OPEN [auth s t a t e ]
Глава 31. Использование курсоров
1229
Выборка данных После открытия курсора пользователь может приступать к выборке или изменению данных. В этом разделе будет рассмотрено только выполнение выборки данных из курсора, тогда как изменение и удаление данных будет рассмотрено в следующих разделах. Для считывания строки данных из курсора используется команда FETCH, имеющая синтаксис: FETCH [ [NEXT | PRIOR | FIRST | LAST| ABSOLUTE {n | @nvar} I RELATIVE {n | @nvar} ] FROM ] {{[GLOBAL] cursor_name} | @cursor_variable_name} [INTO @variable_name[,...n] ]
Непосредственно после слова FETCH указывается строка, которую нужно выбрать. Выбираемую строку можно определить, указав либо ее абсолютную, либо относительную позицию. Затем следует ключевое слово FROM, а далее приводится имя курсора, из которого будут выбираться данные. После ключевого слова INTO указываются имена переменных, в которые будут помещены значения столбцов выбираемой строки курсора.
Замечание
J
Прежде чем выбрать данные, сервер выполняет переход на указанную строку. То есть сначала указанная строка становится текущей, и только после этого производится выборка данных. При этом возможен выход за пределы диапазона строк. Например, если текущей является последняя строка результирующего набора, а пользователь пытается выбрать следующую строку, то такая попытка закончится неудачей. Рассмотрим более подробно назначение и использование параметров команды: •
NEXT Выполняется переход на следующую строку, располагающуюся в результирующем наборе непосредственно после текущей. Использование этой опции при первой выборке данных из курсора делает текущей первую строку результирующего набора и возвращает данные, хранящиеся в этой строке. Если пользователь не указывает явно, из какой строки будет выполняться выборка, то станет использоваться опция NEXT, Т. е. данные будут считываться последовательно.
П PRIOR В отличие от предыдущей опции, с помощью PRIOR осуществляется переход на предыдущую строку, из которой и считываются данные. П FIRST Этот параметр используется для перехода на самую первую строку результирующего набора курсора. Эта строка становится текущей, после чего из нее считываются данные.
1230 П
Часть V. Программирование
LAST
Этот параметр служит для перехода на самую последнюю строку результирующего набора курсора. Эта строка становится текущей, после чего из нее считываются данные. •
ABSOLUTE
Параметр предназначен для перехода на строку с определенным номером (абсолютная адресация). Указанная строка становится текущей и из нее выполняется считывание данных. Номер строки должен изменяться в пределах от 1 и до числа, соответствующего количеству строк в курсоре. Номер строки может быть указан двумя способами:
•
•
п. Константа, определяющая номер строки.
•
@nvar. Имя переменной, в которой задается номер строки, на которую нужно перейти.
RELATIVE {n I @nvar}
В отличие от предыдущего параметра, устанавливающего текущую строку с указанным абсолютным номером, использование параметра RELATIVE позволяет делать текущей строку, расположенную на указанное число строк после или до текущей строки (относительная адресация). Подобно предыдущему параметру, смещение может задаваться как с помощью константы, так и с помощью переменной. При этом могут использоваться как положительные, так и отрицательные значения. Применение положительных значений позволяет переместить указатель текущей строки на указанное количество строк к концу результирующего набора, тогда как указание отрицательного значения перемещает указатель на указанное количество строк к началу результирующего набора. При использовании значения 0 указатель не смещается и повторно считывается текущая строка. П
GLOBAL
Указание этого параметра необходимо, если работа ведется с глобальным курсором и в текущем соединении имеется еще и локальный курсор с таким же именем, что и глобальный курсор. Если параметр GLOBAL не указан, то считывание данных выполняется из локального курсора. Если имя курсора уникально (т. е. имеется только один курсор с указанным именем), то использование параметра GLOBAL не требуется. d cursor_name
Этот параметр подразумевает указание имени курсора, из которого осуществляется выборка данных. К моменту выборки курсор должен быть уже открыт. В противном случае будет выдано сообщение об ошибке. П
@cursor_variable_name
Помимо указания имени курсора непосредственно, пользователь также может задать имя курсора с помощью переменной, для чего и предназначен рассматриваемый параметр. Использование переменных для работы с курсорами позволяет динамически создавать множество курсоров.
Глава 31. Использование курсоров О
1231
@variable_name[,...п]
Этот параметр подразумевает указание имен переменных, в которые будут сохранены значения всех столбцов текущей строки курсора. Переменные должны быть предварительно объявлены и иметь тип данных, соответствующий типу данных столбцов курсоров. Допускается применение переменных типа данных, допускающего неявное преобразование типов данных столбцов курсора. Количество переменных, указанных после ключевого слова INTO, ДОЛЖНО В ТОЧНОСТИ соответствовать количеству столбцов курсора. Причем порядок указания переменных должен соответствовать порядку столбцов курсора.
С
Замечание
Если в команде FETCH не указывается ключевое слово INTO И, соответственно, не
приведен список переменных, в которые будут сохранены значения текущей строки курсора, то команда F E T C H просто выведет соответствующие значения на экран подобно команде S E L E C T .
Приведем пример выборки данных из динамического курсора: DECLARE cursl CURSOR LOCAL DYNAMIC SCROLL READJDNLY FOR SELECT au_id, au_lname, phone FROM authors WHERE state in ('CA1, 'UT') OPEN cursl DECLARE @ID char(11), @LName char(40), @Phone char(12) FETCH FIRST FROM cursl INTO @ID, @LName, @Phone SELECT [.ID автора] =@ID, [Телефон]=@Phone, [Фамилия автора] =@LName FETCH NEXT FROM cursl INTO @ID, @LName, @Phone SELECT [ID автора]=@ID, [Телефон]=@Phone, [Фамилия автора]=@LName FETCH NEXT FROM cursl INTO @ID, @LName, @Phone SELECT [ID автора]=@ID, [Телефон]=@Phone, [Фамилия автора]=@LName FETCH NEXT FROM cursl FETCH NEXT FROM cursl FETCH NEXT FROM cursl
Будет возвращен результат: ID автора
Телефон
Фамилия автора
172-32-1176 408 496-7223 White (1 row(s)
affected)
ID автора
Телефон
Фамилия автора
213-46-8915 415 986-7020 Green (1 row(s) affected) ID автора 40 Зак. 83
Телефон
Фамилия автора
1232
Часть V. Программирование
238-95-7766 415 548-7723 Carson (1 row(s) au_id
affected) au_lname
phone
267-41-2394 O'Leary
408 286-2428
(1 row(s) affected) au_id
au_lname
phone
274-80-9391 Straight
.
415 834-2919
(1 row(s) affected) au_id
au_lname
phone
409-56-7008 Bennet (1 row(s) affected)
415 658-9932 :
Изменение данных Для выполнения изменений данных с помощью курсора предназначена команда UPDATE. Однако ее синтаксис несколько отличается от синтаксиса, используемого при выполнении изменений обычным способом. Команда UPDATE производит изменения в одной из исходных таблиц в строке, соответствующей текущей строке курсора. В команде UPDATE нельзя указать, какой строке курсора должно соответствовать выполняемое изменение. Предварительно с помощью команды FETCH нужно сделать текущей ту строку, для которой предлагается выполнить изменения. За одну операцию изменения данных, как и при работе с представлениями, допускается изменение значений столбцов, расположенных в одной таблице. Если строка курсора строится на основе данных трех таблиц и необходимо изменить все значения строки курсора, то для этого придется выполнить три команды UPDATE.
При работе с курсорами применяется следующий синтаксис команды UPDATE: UPDATE table_name SET {column_name={DEFAULT WHERE CURRENT OF cursor_name
| NULL | expression}} [,...n]
С помощью параметра t a b i e n a m e указывается имя таблицы, в которой необходимо выполнить изменения. Список столбцов, в которых необходимо осуществить изменения, а также значения, которые будут им присвоены, указываются после ключевого слова SET. Раздел WHERE, в котором обычно определяется логическое условие, ограничивающее диапазон обрабатываемых строк, содержит конструкцию CURRENT OF
Глава 31. Использование курсоров
1233
cursor_name. Эта конструкция позволяет однозначно идентифицировать строку исходной таблицы, в которой необходимо выполнить изменения. Вместо параметра cursor name подставляется имя курсора, определяющего строку таблицы, для которой необходимо выполнить изменения. Допускается изменение любых столбцов таблицы, в том числе и не входящих в результирующий набор курсора. В качестве примера рассмотрим изменение фамилии автора. В начале примера выведем исходное состояние данных. Затем создадим курсор и выполним необходимые изменения. После этого снова выведем строки таблицы и посмотрим на изменения. BEGIN TRAN SELECT au_id, au_lname, au_fname, state FROM authors WHERE state!='CA' DECLARE curs2 CURSOR LOCAL SCROLL FOR SELECT au_id, au_lname, au_fname FROM authors WHERE state!='CA' OPEN curs2 FETCH FROM curs2 FETCH FROM curs2 FETCH FROM curs2 UPDATE authors SET state='XY', au_lname=au_lname+' '+LEFT(au_fname,1)+'.' WHERE CURRENT OF curs2 FETCH FROM curs2 UPDATE authors SET state='YZ', au_lname=LEFT(au_fname,l) +'.'+' '+au_lname WHERE CURRENT OF curs2 SELECT au_id, au_lname, au_fname, state FROM authors WHERE state!='CA' ROLLBACK TRAN
Замечание Как видно, пример выполняется в виде транзакции. В конце программы выполняется откат транзакции и всех изменений, произведенных в ходе примера. Это сделано для того, чтобы сохранить данные таблицы authors в первоначальном виде, т. к. они еще нам понадобятся для выполнения других примеров. В результате работы приведенного кода будет получен результат: аи id
аи lname
аи fname
state
341-22-1782 Smith 527-72-3246 Greene 648-92-1872 Blotchet-Halls 712-45-1867 del Castillo 722-51-5454 DeFrance 807-91-6654 Panteley 899-46-2035 Ringer 998-72-3567 Ringer (8 row(s) affected)
Meander Morningstar Reginald Innes Michel Sylvia Anne Albert
KS TN OR MI IN MD
аи id
au_fname
аи lname
341-22-1782 Smith (1 row(s) affected)
Meander
• UT
UT
Часть V. Программирование
1234 аи id
аи lname
527-72-324 6 Greene (1 row(s) affected) аи id
аи lname
648-92-1872 Blotchet-Halls (1 row(s) affected)
аи fname Morningstar
аи fname Reginald
(1 row(s) affected) аи id
аи lname
712-45-1867 del Castillo (1 row(s) affected)
аи fname Innes
(1 row(s) affected) аи id
аи lname
341-22-1782 Smith 527-72-3246 Greene 648-92-1872 Blotchet-Halls R. 712-45-1867 I. del Castillo 722-51-5454 DeFrance 807-91-6654 Panteley 899-46-2035 Ringer 998-72-3567 Ringer (8 row(s) affected)
au_fname
st
Meander Morningstar Reginald Innes Michel Sylvia Anne Albert
KS TN XY YZ IN MD UT UT
Как видно, был изменен столбец, не входящий в результирующий набор курсора.
Удаление данных Удаление данных из курсора производится с помощью команды DELETE, имеющей синтаксис: DELETE [FROM] table_name WHERE CURRENT OF cursor_name
Назначение и использование параметров этой команды аналогично назначению и использованию аналогичных параметров команды UPDATE, которая была описана в предыдущем разделе. При выполнении команды DELETE С приведенным синтаксисом происходит удаление строки указанной таблицы, связанной с текущей строкой курсора. Предварительно необходимо сделать в курсоре текущей нужную строку. Если строка курсора формируется на основе значений нескольких таблиц, то для удаления всех данных необходимо выполнить команду DELETE отдельно для каждой таблицы.
Глава 31. Использование курсоров
1235
Изменим предыдущий пример, заменим команду UPDATE на команду DELETE И посмотрим к чему это приведет: BEGIN TRAN SELECT au_id, au_lname, au_fname, state FROM authors WHERE state!='CA' DECLARE curs2 CURSOR LOCAL SCROLL FOR SELECT au_id, au_lname, au__fname FROM authors WHERE state!='CA' OPEN curs2 FETCH FROM curs2 FETCH FROM curs2 FETCH FROM curs2 DELETE authors WHERE CURRENT OF curs2 FETCH FROM curs2 DELETE authors WHERE CURRENT OF curs2 SELECT au_id, au_lname, au_fname, state FROM authors WHERE state!='CA' ROLLBACK TRAN
Будет возвращен следующий результат: аи id
аи lname
аи fname
state
341-22-1782 Smith 527-72-3246 Greene 648-92-1872 Blotchet-Halls 712-45-1867 del Castillo 722-51-5454 DeFrance 807-91-6654 Panteley 899-4 6-2035 Ringer 998-72-3567 Ringer (8 row(s) affected)
Meander Morningstar Reginald Innes Michel Sylvia Anne Albert
KS TN OR MI IN MD UT UT
аи id
au_fname
аи lname
341-22-1782 Smith (1 row(s) affected)
Meander
аи id
au_fname
аи lname
527-72-324 6 Greene (1 row(s) affected)
Morningstar
аи id
au_fname
аи lname
648-92-1872 Blotchet-Halls (1 row(s) affected)
Reginald
(1 row(s) affected) аи id
аи lname
712-45-1867 del Castillo (1 row(s) affected)
au_fname Innes
1236
Часть V. Программирование
(1 row(s) affected) au_id.
au_lname
341-22-1782 Smith 527-72-3246 Greene 722-51-5454 DeFrance 807-91-6654 Panteley 899-46-2035 Ringer 998-72-3567 Ringer (8 row(s) affected)
au fname
st
Meander Morningstar Michel Sylvia Anne Albert
KS TN IN MD UT UT
Закрытие курсора После того, как все необходимые операции с использованием курсора были выполнены, и хранящиеся в нем данные больше не нужны, можно закрыть курсор. Закрытие курсора подразумевает освобождение всех областей памяти (как оперативной, так и в базе данных Tempdb), используемых для хранения данных курсора. Однако при этом не происходит удаления курсора как объекта. Закрытый курсор может быть снова открыт. При этом происходит повторное выполнение запроса SELECT, ассоциированного с курсором. Таким образом, при повторном открытии курсора он будет содержать более "свежие" данные. При работе со статическими курсорами закрытие и повторное открытие можно использовать как средство обновления хранимых в курсоре данных. При работе с ключевыми курсорами таким способом можно произвести обновление набора ключей. При закрытии курсора сервер также снимает все блокировки, установленные курсором. Замечание Естественно, операция закрытия курсора может быть применена только к открытому курсору. Закрытие курсора выполняется с помощью команды Transact-SQL: CLOSE {{[GLOBAL] cursor_name} | @cursor_variable_name}
Указание параметра GLOBAL необходимо, если работа ведется с глобальным курсором, и в текущем соединении имеется еще и локальный курсор с таким же именем, что и локальный курсор. Если параметр GLOBAL не задан, то считывание данных выполняется из локального курсора. Если имя курсора уникально (т. е. имеется только один курсор с указанным именем), то использование параметра GLOBAL не требуется. Имя закрываемого курсора приводится с помощью параметра cursorname. Имя курсора может быть также указано с помощью переменной (параметр @cursor_variable_name).
Глава 31. Использование курсоров
1237
Освобождение курсора Операция закрытия курсора приводит к освобождению областей памяти, используемых для хранения результирующего набора курсора. Однако при этом курсор может быть повторно открыт. То есть курсор продолжает существовать как объект базы данных. Для полного удаления всей информации, ассоциированной с курсором, включая его имя и код запроса SELECT, необходимо выполнить освобождение курсора. Если провести аналогию с таблицами, то закрытие курсора сравнимо с полным удалением всех строк таблицы. Однако таблица продолжает существовать как объект базы данных, имеющий определенную структуру и имя. Освобождение курсора сравнивается с удалением самой таблицы. Кода пользователь удаляет таблицу, то она перестает существовать как объект базы данных. После этого можно создать новую таблицу с таким же именем, но имеющую другую структуру. Для освобождения курсора используется команда DEALLOCATE, имеющая синтаксис: DEALLOCATE {{[GLOBAL] cursor_name}
I @cursor_variable_name}
Назначение параметров этой команды аналогично одноименным параметрам команды объявления, открытия, выборки или закрытия курсора, которые рассматривались ранее в этой главе.
Дополнительные средства В Transact-SQL имеется набор дополнительных средств, незаменимых при работе с курсорами. Например, часто необходимо знать, как много строк содержится в курсоре. Количество строк, имеющихся в последнем открытом в соединении курсоре, может быть получено с помощью функции @@CURSOR_ROWS. ЕСЛИ В соединении создается более одного курсора, то после открытия очередного курсора рекомендуется сохранять значение функции @@CURSOR_ROWS В локальной переменной. В противном случае после открытия следующего курсора функция @@CURSOR_ROWS будет возвращать значения для нового курсора. Если функция @@CURSOR_ROWS возвращает значение 0, то либо в соединении не было открыто ни одного курсора, либо последний открытый курсор не содержит ни одной строки, либо последней операцией работы с курсором было закрытие или освобождение курсора. Если возвращается значение —1, то был открыт динамический курсор. Возвращение значения меньше —1, говорит о том, что открыт ключевой курсор. Абсолютное значение показывает, сколько ключей имеется в курсоре. Возвращение положительного числа говорит об открытии статического курсора, в котором имеется указанное количество строк. При последовательном обращении к строкам курсора необходимо определять, не выполняется ли обращение к строке, выходящей за границы курсора. Например, если текущей строкой является 3-я строка, а пользователь пытается обратиться на 5 строк назад, то такая операция будет невыполнима. Конечно,
1238
Часть V. Программирование
можно отслеживать попытки обращения к строкам курсора программно, основываясь на количестве строк в курсоре, однако это не всегда удобно. В Transact-SQL имеется специальная функция @@FETCH_STATUS, возвращающая результат выполнения последней команды выборки данных из курсора. Если функция возвращает значение 0, то последняя операция была выполнена успешно. Если возвращается значение —1, то это означает, что была предпринята попытка выборки строки, находящейся за пределами результирующего набора. Например, выборка строки с абсолютным номером —4, или номером, превышающим значение, возвращенное для курсора функцией @@CURSOR_ROWS. Если функция @@FETCH_STATUS возвращает значение - 2 , то это означает, что пользователь попытался выбрать поврежденную строку (row missing). Это происходит, когда из ключевого курсора производится выборка строки, удаленной другим пользователем после открытия курсора.
Замечание При
работе
с несколькими
курсорами
@ @ F E T C H _ S T A T U S - возвращает результат
следует
выполнения
учитывать,
что функция
последней команды
FETCH.
При этом не важно, с каким именно курсором ведется работа. Пользователь строит алгоритм таким образом, чтобы проверка результата выполнения выборки данных в ы п о л н я л а с ь как м о ж н о б л и ж е к к о м а н д е F E T C H .
В качестве примера рассмотрим использование функции @@FETCH_STATUS ДЛЯ обнаружения границы курсора: DECLARE curs3 CURSOR LOCAL STATIC FOR SELECT au_lname FROM authors OPEN curs3 DECLARE @LName char(30), @Rs varchar(40) SET @Rs='' FETCH FIRST FROM curs3 INTO QLName WHILE @@FETCH_STATUS=0 BEGIN SET @Rs=@Rs+LEFT(@LName,1) FETCH FROM curs3 INTO @LName END SELECT @Rs CLOSE curs3 DEALLOCATE curs3
Будет возвращен следующий результат: BBCDdDGGGHKLMMOPRRS S SWY (1 row(s) affected)
Глава 32
Триггеры Часто разработчикам приходится реализовывать сложные алгоритмы поддержки целостности данных. В предыдущих главах рассматривалось использование ограничений целостности Primary Key, Foreign Key, Unique, правил, умолчаний и т. д. Эти средства предоставляют разработчикам достаточно эффективные механизмы обеспечения целостности данных. Однако все же их часто бывает недостаточно. Например, с помощью упомянутых механизмов нельзя разрешить изменение данных в том случае, если в одном из столбцов находится определенное значение. Описанная ситуация является простейшим примером того, какие проверки часто приходится выполнять перед изменением, удалением или вставкой данных в таблицу. В реальной ситуации применяются гораздо более сложные алгоритмы предварительной проверки данных. Помимо выполнения простых проверок, при модификации данных одной таблицы иногда бывает необходимо соответствующим образом модифицировать данные одной или нескольких таблиц. Решением описанной задачи является использование триггеров.
Использование триггеров Триггеры (triggers) SQL Server 2000 представляют собой набор команд TransactSQL, выполняемых автоматически при осуществлении тех или иных модификаций данных в таблице. Физически триггеры являются ни чем иным, как хранимыми процедурами специального типа. Каждый триггер связан с конкретной таблицей и запускается сервером автоматически каждый раз, когда пользователи пытаются произвести вставку, изменение или удаление данных. Триггер получает всю информацию о выполняемых пользователем изменениях в таблице. Разработчик реализовывает в триггере необходимые проверки и изменения данных в других таблицах базы данных. Когда пользователь начинает изменение данных, сервер автоматически начинает транзакцию, в которой и выполняется триггер. В теле транзакции разработчик может реализовывать произвольные алгоритмы, которые могут выполнять как проверку, так и изменения данных. В конце концов, работа триггера сводится либо к фиксации, либо к откату транзакции, которая осуществляет изменение данных. Если выполняется откат транзакции, то попытка пользователя изменить данные отменяется. При этом также отменяются все исправления, сделанные самим триггером в различных таблицах (если они выполнялись). При фиксации транзакции производится как фиксирование изменений, выполненных пользователем, так и изменений, сделанных самим триггером.
1240
Часть V. Программирование
Замечание В SQL Server 2000 триггеры могут быть созданы не только для таблиц, но и для представлений.
Существует несколько типов триггеров, каждый из которых реагирует на определенный тип изменений данных. В SQL Server 2000 существует три типа триггеров, классифицирующихся по названию команд, на которые они реагируют: П INSERT TRIGGER. Триггеры этого типа вызываются при попытке пользователя добавить данные в таблицу, например, с помощью команды INSERT. • UPDATE TRIGGER. Этот тип триггеров выполняется при изменении данных с помощью команды UPDATE. • DELETE TRIGGER. Этот тип триггеров выполняется при удалении данных с помощью команды DELETE. Замечание Триггеры не запускаются при выполнении команд U P D A T E
T E X T ИW R I T E
T E X T , ВЫ-
ПОЛНЯЮЩИХ обработку больших блоков данных (столбцов с типом данных image,, t e x t и n t e x t ) . Однако если обработка этих данных производится с помощью команд U P D A T E , вызов триггеров все же осуществляется.
Помимо классификации триггеров по типу операции, на которую они реагируют, они также различаются по поведению: П AFTER. Это стандартный тип триггеров, активно используемый в предыдущих версиях SQL Server. По умолчанию триггер SQL Server 2000 имеет именно этот тип. • INSTEAD OF. Триггеры этого типа выполняются взамен пользовательских действий. То есть запрос пользователя не выполняется, а вносятся лишь изменения, осуществляемые в теле триггера. В версиях SQL Server ранее 7.0 в каждой таблице разрешалось определять только один триггер каждого типа. Однако, начиная с SQL Server 7.0, для одной таблицы допускается создавать множество триггеров каждого типа. Это позволяет реализовывать сложные многоуровневые механизмы контроля целостности данных. Теперь разработчик может не создавать один большой триггер, включающий множество проверок, а организовать несколько небольших триггеров, каждый из которых выполняет отдельную проверку. Триггеры весьма широко используются при разработке промышленных систем. Область их применения достаточно широка и не ограничивается какими-то строгими рамками. Например, репликация сведением (merge replication) построена на основе триггеров. Каждый раз, когда пользователь выполняет вставку, изменение или удаление данных, специальные триггеры, созданные при публикации таблицы, отслеживают выполняемые пользователями изменения и сохраняют всю необходимую информацию о них в специальные системные таблицы, автоматически создающиеся при установке репликации сведением.
Глава 32. Триггеры
1241
Разработчики могут использовать триггеры для решения самых разнообразных задач. Однако выполнение триггеров является довольно "тяжелой" задачей и по возможности нужно избегать их использования. Если задачу можно решить на уровне ограничений целостности, пакета или хранимой процедуры, то так и следует сделать. Триггеры можно использовать лишь тогда, когда они дают значительный выигрыш функциональности и предлагают значительные удобства для пользователей. Замечание Сервер на все время выполнения триггера удерживает блокировки на данные, к которым обращается этот триггер. Это является еще одной причиной, по которой следует осторожно использовать триггеры.
Ограничения использования триггеров Хотя в триггере допускается применение довольно большого количества команд Transact-SQL, тем не менее, все же существуют некоторые ограничения на выполняемые операции. Эти ограничения связаны с тем, что сервер должен гарантировать соблюдение требований ACID. To есть в триггере должны выполняться только те операции, которые могут быть отменены в случае отката транзакции. Однако в SQL Server 2000 существует набор операций, для которых не реализованы механизмы отката. Ярким примером является восстановление резервной копии базы данных. Но вряд ли понадобится выполнять восстановление резервной копии базы данных в триггере.
(
ЗамечанИё
)
Кроме того, ограничения на использование команд могут быть также вызваны тем, что ряд команд должен выполняться как первая команда пакета, что не реализуемо в триггере. Приведем список тех операций, выполнение которых в триггере неразрешено: •
создание и удаление правил (CREATE RULE И DROP RULE);
•
создание и удаление умолчаний (CREATE DEFAULT И DROP DEFAULT);
•
создание и удаление индексов (CREATE INDEX И DROP INDEX);
G создание, изменение и удаление триггеров (CREATE TRIGGER, ALTER TRIGGER и DROP TRIGGER);
D создание, изменение и удаление хранимых процедур (CREATE ALTER PROCEDURE И DROP PROCEDURE);
PROCEDURE,
П создание, изменение и удаление таблицы (CREATE TABLE, ALTER TABLE И DROP TABLE);
П создание, изменение и удаление представления (CREATE VIEW, ALTER VIEW И DROP VIEW);
1242 •
Часть V. Программирование
создание, изменение и удаление
базы данных
(CREATE
DATABASE, ALTER
DATABASE И DROP DATABASE);
•
обновление статистики (UPDATE STATISTICS);
•
создание схемы (CREATE SCHEMA);
•
усечение таблицы (TRUNCATE TABLE);
•
управление правами доступа пользователей к объектам базы данных (GRANT, REVOKE и DENY);
•
восстановление резервной копии базы данных или журнала транзакций (RESTORE
•
DATABASE, RESTORE LOG, LOAD DATABASE И LOAD LOG);
выполнение команд RECONFIGURE, DISK RESIZE И DISK I N I T .
Как видно, ограничение на использование перечисленных команд вряд ли скажется на функциональности создаваемых триггеров. Перечисленные команды выполняются достаточно редко и обычно в качестве самостоятельных операций.
Создание триггера Как и при написании хранимых процедур, перед созданием триггера следует тщательно продумать алгоритм выполнения изменений и проверок данных, а также согласовать последовательность этих действий с другими триггерами и хранимыми процедурами. Дело в том, что триггеры способны длительное время блокировать значительную часть ресурсов, и неправильно написанные триггеры могут создавать мертвые блокировки (deathlocks).
Замечание Если к одним и тем же данным обращается множество триггеров и хранимых процедур, то во всех них следует использовать одинаковую последовательность доступа к данным. Это заметно снизит вероятность возникновения мертвых блокировок. Для создания триггера используется команда CREATE TRIGGER, имеющая синтаксис: CREATE TRIGGER trigger_name ON {table | view} [WITH ENCRYPTION] { { FOR [{ AFTER | INSTEAD OF }] { [DELETE] [,] [INSERT] [,] [UPDATE] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE (column) [ { AND -| OR } UPDATE (column) ] [ ...n ] | IF (COLUMNS_UPDATED() { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] }
Глава 32. Триггеры
1243
Замечание Создание триггера должно выполняться как отдельная команда, т. е. триггер не может быть создан внутри хранимой процедуры. Как видно из синтаксиса, триггер может быть создан только в текущей базе данных. Однако в его теле могут производиться обращения к таблицам различных баз данных, возможно расположенных на различных серверах. Рассмотрим назначение и использование параметров команды: О trigger_name Этот параметр подразумевает указание имени триггера. При выборе имени нужно следовать стандартным правилам именования объектов SQL Server 2000. При необходимости имя триггера может быть заключено в ограничители. Имя указывается в формате Unicode и максимальная его длина составляет 128 символов. Дополнительно можно указать имя владельца триггера. Однако указание имени базы данных не допускается. П
{ table
I view }
Имя таблицы или представления текущей базы данных, к которой будет привязан триггер. Дополнительно разрешается указание имени владельца, однако указание имени базы данных не разрешается. Указанная таблица или представление должны существовать к моменту создания триггера.
С
Замечание
^
Триггер не может быть создан для системной таблицы. Кроме того, не допускается создание триггеров в системных базах данных. П
WITH ENCRYPTION
При указании этой опции сервер будет выполнять шифрование кода, используемого для создания триггера. Этот код хранится в системной таблице syscomments, имеющейся в каждой базе данных. Шифрование обычно применяется, когда необходимо скрыть от пользователя информацию о том, какие операции выполняются в триггере. • FOR После этого ключевого слова указывается тип создаваемого триггера. Допустимы варианты: •
AFTER. Будет создан стандартный триггер. Если не указано ни AFTER, НИ INSTEAD OF, TO ПО уМОЛЧаНИЮ ИСПОЛЬЗуеТСЯ AFTER.
•
INSTEAD OF. Создаваемый триггер будет выполняться взамен команды, приведшей к запуску триггера. Только один триггер этого типа может быть определен для каждой таблицы или представления. Путем создания для представления триггеров INSTEAD OF МОЖНО разрешить пользователям выполнять изменение данных представления, принадлежащих более чем одной таблице. Механизмы выполнения этих изменений должны быть реализованы непосредственно в теле триггера.
1244
•
Часть V. Программирование
•
DELETE. Создаваемый триггер будет вызываться при попытке удаления данных из указанной таблицы.
•
INSERT. Создаваемый триггер будет вызываться при попытке добавления в указанную таблицу новых строк с помощью команды.
•
UPDATE. Создаваемый триггер будет вызываться при попытке изменения данных в указанной таблице.
WITH APPEND
Использование этой опции необходимо только для баз данных, имеющих уровень совместимости (compatibility level) ниже чем 70, т. е. база данных работает в режиме SQL Server 6.x, допускающем создание в каждой таблице всего одного триггера. При использовании опции WITH APPEND ДЛЯ баз данных с уровнем совместимости 60 или 65 для каждой таблицы будет разрешено создание более одного триггера каждого типа. Это бывает необходимо во время применения репликации сведением, использующей триггеры для сбора данных. Если уровень совместимости базы данных 70, то команда CREATE TRIGGER ИСПОЛЬЗуеТ ОПЦИЮ WITH APPEND ПО уМОЛЧаНИЮ. •
NOT FOR REPLICATION
При указании этой опции триггер не будет вызываться, если модификация данных (вставка, изменение или удаление) производится средствами подсистемы репликации. Это необходимо для триггеров репликации сведением, чтобы избежать повторного считывания данных. Однако эта возможность может быть использована и пользователями. О AS
На этом ключевом слове заканчивается определение триггера, и описываются действия, которые он будет производить, а также некоторые дополнительные условия выполнения триггера. •
IF UPDATE (column)
С помощью этой конструкции можно разрешить выполнение триггера только при осуществлении изменений в определенном столбце таблицы. Имя нужного столбца указывается с помощью параметра column. Однако использование этой возможности допускается только для триггеров типа UPDATE И INSERT. Если необходимо разрешить вызов триггера при изменении более чем одного столбца, то можно указать имена дополнительных столбов с помощью параметра UPDATE (column), объединив множество таких параметров с помощью логических операторов OR ИЛИ AND. Замечание Функция UPDATE (column) применяется внутри триггеров и возвращает значение TRUE, если производится изменение указанного столбца, и F A L S E — в противном случае. Таким образом можно определить, выполняется ли изменение конкретного столбца.
I !
Глава 32. Триггеры П
IF
1245
(COLUMNS_UPDATED()...)
Эта конструкция является вторым способом выполнения проверки изменений определенных столбцов. Функция COLUMNSJJPDATED () возвращает двоичное значение, каждый бит которого соответствует одному столбцу. Самый правый бит соответствует самому левому столбцу таблицы. Если выполняется изменение в одном из столбцов, то в возвращаемом функцией COLUMNS_UPDATED( ) двоичном значении соответствующий бит будет установлен в 1. В противном случае бит устанавливается в 0. Анализируя полученное значение, можно определить, какие именно столбцы пытается изменить пользователь. Вся же конструкция I F (COLUMNSJJPDATED О . . .) позволяет выполнять триггер только тогда, когда изменяются определенные столбцы. При необходимости произвести проверку множества столбцов эта конструкция является более удачным решением, чем использование конструкции I F UPDATE (column), т. к. она более компакта в использовании. Рассмотрим параметры, применяемые для проверки изменения нужных столбцов: •
bitwise_operator. Этот параметр подразумевает указание оператора побитовой обработки. Возвращаемое функцией COLUMNS_UPDATED () двоичное значение подвергается дополнительной обработке для выделения из него флагов изменения отдельных столбцов. Для этого обычно используется оператор & (побитовое AND). НО также допускается использование и любых других побитовых операторов, хотя область их применения довольно узка.
•
updatedjDitmask. Этот параметр подразумевает указание константы, определяющей маску анализа изменяемости столбцов. Если используется побитовый оператор &, то в маске необходимо установить биты, соответствующие столбцам, при изменении которых должен выполняться триггер. Например, если таблица имеет 6 столбцов, но пользователь изменяет лишь 1, 3 и 4 столбцы, то функция COLUMNS_UPDATED () возвратит десятичное значение 13 (двоичное 001101). Если триггер должен выполняться при изменении 1 и 4 столбцов, то маска должна быть равна 9 (двоичное 001001). В качестве же побитового оператора нужно использовать &. Тогда общий синтаксис будет выглядеть как (COLUMNS_UPDATED( ) & 9) .
•
comparisonoperator. После того, как возвращенное функцией COLUMNS_UPDATED() двоичное значение будет обработано побитово, полученный результат необходимо проверить — действительно ли выполняется изменение нужных столбцов. Параметр c o m p a r i s o n o p e r a t o r подразумевает указание оператора сравнения. Обычно указывается оператор =, но также могут использоваться и другие операторы (<, >,!= и т. д.).
•
coiumnjoitmask. Этот параметр подразумевает указание битовой маски столбцов, с которой будет сравниваться значение, полученное после выполнения выражения (COLUMNSJJPDATED() {bitwise_operator} updated^ bitmask). Триггер будет вызван только в том случае, если выполняется указанное условие. Продолжим рассмотрение предыдущего примера. Если необходимо, чтобы триггер выполнился только при изменении как 1, так
1246
Часть V. Программирование и 4 столбцов, то полное условие будет выглядеть как I F (COLUMNSJJPDATEDO & 9) = 9. Если же необходимо выполнить триггер, когда производится изменение либо 1, либо 4 столбца, то нужно использовать условие (COLUMNSJJPDATEDO & 9) > 0.
• П
[.. . п ] . Этот параметр говорит о том, что можно использовать множество проверок на то, какие столбцы были изменены.
sql_statement
[...n]
Этот параметр подразумевает указание команд Transact-SQL, которые будут выполняться при вызове триггера. Могут применяться команды цикла, выборки данных, изменения, вставки и удаления строк. Внутри триггера также можно создавать транзакции. Список операций, которые не разрешено выполнять в теле триггера, был приведен в предыдущем разделе.
Модификация триггера Как бы хорошо вы ни планировали код триггера, все же иногда бывает необходимо внести в его код те или иные изменения. Это может быть вызвано обнаружением ошибки или изменением структуры таблицы, к которой привязан триггер. При выполнении изменения триггера сервер просто обновляет его код в системной таблице syscomments. При следующем вызове сервер будет использовать новый код. Для изменения параметров и кода триггера предназначена команда ALTER TRIGGER, имеющая синтаксис: ALTER TRIGGER trigger_name ON (table | view) [WITH ENCRYPTION] { { (FOR | AFTER | INSTEAD OF) { [DELETE] [,] [INSERT] [,] [UPDATE] } [NOT FOR REPLICATION] AS sql_statement [...n] } I { (FOR | AFTER | INSTEAD OF) { [INSERT] [,] [UPDATE] }. [NOT FOR REPLICATION] AS { IF UPDATE (column) [ {AND | OR} UPDATE (column) ] [...П] I IF (COLUMNSJJPDATEDO {bitwise__operator} updated_bitmask) {comparison_operator} columnjoitmask [...n]} sql_statement [...n] } }
Назначение и использование параметров команды ALTER TRIGGER аналогично одноименным параметрам команды CREATE TRIGGER И В ЭТОМ разделе рассматриваться не будет. При выполнении изменений следует учитывать, что нужно указывать все необходимые опции. Например, если при создании триггера использовалась опция WITH ENCRYPTION (шифрование кода триггера), то при изменении триггера также следует указать эту опцию, если необходимо сохранить код в зашифрованном виде. В противном случае код будет сохранен в открытом виде. Это касается и всех других опций.
Глава 32. Триггеры
1247
Правом изменения триггера обладают члены фиксированных ролей базы данных db_owner и db_ddladmin, а также владелец таблицы. Право изменения триггера не может быть предоставлено другим пользователям. Если все же необходимо, чтобы изменение триггера выполнил определенный пользователь, то можно сделать его владельцем таблицы или включить в одну из указанных ролей.
Удаление триггера Если триггер больше не нужен или, более того, начал мешать нормальной работе, то его можно удалить. Для этого используется команда Transact-SQL: DROP TRIGGER
{trigger}
[,...n]
Единственный параметр этой команды, t r i g g e r , определяет имя триггера, который необходимо удалить. С помощью одной команды DROP TRIGGER МОЖНО удалить множество триггеров, перечислив их через запятую. Правом удаления триггера обладает владелец таблицы, к которой относится триггер, а также все члены фиксированных ролей базы данных dbowner и db_ddladmin.
Программирование триггеров В разд. "Создание триггера"был приведен синтаксис команды CREATE TRIGGER, С помощью которой выполняется создание триггера. Однако там не было практически ничего сказано об особенностях написания самого тела триггера. Хотя в начале главы и было сказано, что триггеры являются специальным типом хранимых процедур, программированием триггеров имеет некоторую специфику по сравнению с программированием хранимых процедур. Ранее уже было сказано, что в триггере можно использовать большую часть команд Transact-SQL. В начале главы также был приведен список операций и команд, которые не разрешено выполнять в теле триггера. В этом же разделе будут рассмотрены средства, предлагаемые Transact-SQL специально для триггеров, позволяющие реализовывать высоко функциональные алгоритмы обработки данных. При запуске триггера для соединения ODBC сервер автоматически меняет некоторые параметры конфигурации, выполняя для триггера следующие команды: О
SET QUOTED_IDENTIFIER
ON — ДВОЙНЫе КЭВЫЧКИ будут ЯВЛЯТЬСЯ аНЭЛОГОМ
квадратных скобок, т. е. заключенные в двойные кавычки строки станут рассматриваться как имена объектов; П SET TEXTSIZE 2147483647 — устанавливает размер строк, возвращаемых командой SELECT при выборке данных из столбцов с тилом данных t e x t и ntext;
d
SET ANSI_DEFAULTS ON — внутри триггера будут использоваться стандартные значения параметров ANSI;
1248
Часть V. Программирование
П SET CURSOR_CLOSE_ON_COMMIT OFF — запрещает автоматическое закрытие курсора при фиксировании транзакции; •
SET IMPLICIT_TRANSACTIONS OFF — запрещает неявное начало транзакций. Пользователь должен будет явно инициировать транзакцию, указывая команду BEGIN TRAN.
Описанные параметры являются всего лишь параметрами по умолчанию, автоматически устанавливаемыми сервером для триггера. Однако внутри триггера указанные параметры могут быть легко изменены с помощью команды SET. Хорошим тоном является написание триггеров, которые не обращаются ни к каким объектам базы данных кроме таблицы, с которой они ассоциированы. Если триггер обращается к внешней таблице, представлению или хранимой процедуре, то изменение этих объектов может привести к нарушению функционирования триггера. Также не рекомендуется написание триггеров, возвращающих данные с помощью команды SELECT. Дело в том, что многие приложения анализируют содержимое результата выборки, возвращаемое при выполнении того или иного запроса. При этом данные, возвращенные триггером, могут быть неправильно восприняты приложениями. Однако команда SELECT может быть с успехом использована для присвоения значений переменным. В теле триггера можно вызывать любые хранимые процедуры, в том числе и системные. Однако эти процедуры также должны следовать описанным правилам. В Transact-SQL имеется набор функций, позволяющих получать дополнительную информацию о триггере: •
COLUMNSJJPDATEDO . Эта функция возвращает двоичное значение, каждый бит которого соответствует одному столбцу связанной с триггером таблицы. В этом значении устанавливаются в 1 биты, соответствующие столбцам, в которых выполняется изменение значений. Более подробно использование этой функции было описано при рассмотрении синтаксиса команды CREATE TRIGGER в одном из предыдущих разделов этой главы.
CJ UPDATE (column). С помощью этой функции можно узнать, был ли изменен конкретный столбец. Функция UPDATE (column) возвращает булево значение. Эта функция может быть с успехом использована вместо предьщущей функции. П
TRIGGER_NESTLEVEL ( [ o b j e c t _ i d ] ) . С ПОМОЩЬЮ ЭТОЙ фуНКЦИИ МОЖНО ОПреде-
лить уровень вложенности триггера. Параметр o b j e c t i d определяет идентификационной номер триггера как объекта базы данных. Для получения этого идентификационного номера используется функция O B J E C T I D ( t r i g g e r _ n a m e ) . П р и м е н я я фуНКЦИЮ TRIGGERJMESTLEVEL, МОЖНО КОНТрОЛИ-
ровать, вызывается ли триггер непосредственно или вследствие изменения данных таблицы другим триггером. До сих пор не было сказано о том, как же в триггере будет выполняться контроль изменений, производимых пользователем. Для отслеживания этих изменений сервер автоматически создает при вызове триггера две специальных таб-
Глава 32. Триггеры
1249
лицы — i n s e r t e d и deleted. Рассмотрим, какие данные содержатся в этих таблицах при выполнении различных операций: О INSERT. При вызове триггера этого типа таблица i n s e r t e d содержит список строк, вставляемых пользователем. При успешном завершении триггера (фиксации транзакции) все строки из таблицы i n s e r t e d переносятся в пользовательскую таблицу базы данных. В таблице deleted не содержится никаких данных, и обращаться к этой таблице в триггере INSERT не имеет смысла. П DELETE. Для триггеров этого типа в таблице deleted приводится список всех строк, которые будут удалены. В таблице i n s e r t e d не содержится никаких данных, и анализировать эту таблицу не нужно. О UPDATE. При выполнении триггеров этого типа данные имеются как в таблице inserted, так и в таблице deleted. Последняя из них — список всех строк таблицы, которые пытается изменить пользователь. В таблице i n s e r t e d указываются строки, которые будут внесены в таблицу вместо соответствующих строк таблицы deleted. To есть сервер как бы удаляет старые строки и вставляет вместо них измененные строки. Анализируя строки в таблицах i n s e r t e d и deleted, можно отследить все изменения, выполняемые пользователями. Таблицы i n s e r t e d и deleted не существуют физически, а представляют логические структуры, создаваемые сервером индивидуально для каждого триггера. В эти таблицы запрещено вносить любые изменения, так что они доступны в режиме "только для чтения". Эти таблицы представляют своего рода частичную копию журнала транзакций, в которой отображается всего лишь одна транзакция. В таблице deleted отображается состояние, которое данные имели до начала транзакции, тогда как в таблице i n s e r t e d — состояние, в котором будут находиться данные после фиксирования изменений. Сама же таблица, в которой производятся изменения, находится в состоянии, в котором она бы была после фиксирования всех изменений. В теле триггера разрешается вносить любые изменения в данные этой таблицы, причем даже в те строки, которые не были изменены пользователем. Триггер может анализировать содержимое таблиц i n s e r t e d и d e l e t e d для принятия решения о фиксировании или отмене транзакции и внесении различных изменений в связанную с триггером таблицу, а также в любые другие таблицы, расположенные как в текущей, так и в других базах данных.
Пример создания триггера В завершение этой главы приведем пример создания триггера, отвергающего изменение данных. Для этого сначала создадим новую таблицу small t i t l e s , в которую скопируем часть столбцов таблицы t i t l e s : SELECT title_id, title=CAST(title as nvarchar(30))+ CASE WHEN LEN(title)>30 THEN '...' ELSE " END, type, price, sales = ytd_sales INTO smalltitles FROM titles
1250
Часть V. Программирование
Просмотрим содержимое созданной таблицы: SELECT * FROM s m a l l t i t l e s
Будет получен следующий результат: t i t l e id t i t l e
type
price
s.ales
BU1032 The Busy Executive's Database .. BU1111 Cooking with Computers: Surrep.. BU2075 You Can Combat Computer Stress.. BU7832 Straight Talk About Computers MC2222 Silicon Valley Gastronomic Tre.. MC3021 The Gourmet Microwave MC3026 The Psychology of Computer Coo.. PC1035 But Is It User Friendly? PC8888 Secrets of Silicon Valley PC9999 Net Etiquette PS1372 Computer Phobic AND Non-Phobic. PS2091 Is Anger the Enemy? PS2106 Life Without Fear PS3333 Prolonged Data Deprivation: Fo.. PS7777 Emotional Security: A New Algo.. TC3218 Onions, Leeks, and Garlic: Coo.. TC4203 Fifty Years in Buckingham Pala.. TC7777 Sushi, Anyone? (18 row(s) affected)
business business business business mod cook mod cook UNDECIDED popular comp popular comp popular comp psychology psychology psychology psychology psychology trad_cook trad cook trad cook
19.9900 11.9500 2.9900 19.9900 19.9900 2.9900 NULL 22.9500 20.0000 NULL 21.5900 10.9500 7.0000 19.9900 7.9900 20.9500 11.9500 14.9900
4095 3876 18722 4095 2032 22246 NULL 8780 4095 NULL
375 2045
111 4072 3336
375 15096 4095
Теперь создадим триггер, который будет запрещать изменение названия серий popular_comp и psychology, а также разрешим изменение книг тиражом более 10 000 экземпляров только пользователю sa. Кроме того, запретим всякое изменение столбца t l t i e i d , в котором хранится идентификационный номер книги. Код триггера будет таким: CREATE TRIGGER smalltitles_triggerl ON smalltitles WITH ENCRYPTION FOR UPDATE AS IF UPDATE(title_id) BEGIN RAISERROR ('Изменение идентификационного номера книги запрещено', 1 ,11) SELECT + FROM deleted WHERE title_ID NOT IN (SELECT title_id FROM inserted) ROLLBACK TRAN RETURN END IF UPDATE(type) AND EXISTS(SELECT * FROM deleted WHERE type IN ('popular_comp', 'psychology')) BEGIN RAISERROR ('Изменение названия серий popular_comp и psychology запрещено', 1 ,11) SELECT * FROM deleted as i WHERE type!= (SELECT type FROM inserted as d WHERE d.title_id = i.title_id) AND type IN ('popular_comp', 'psychology') ROLLBACK TRAN
Глава 32. Триггеры
1251
RETURN END IF EXISTS(SELECT * FROM deleted WHERE sales>10 000) AND SUSER_SID()!=SUSER_SID('sa') BEGIN RAISERROR ('Изменение книг тиражом более 10 000 разрешено только пользователю sa', 1 ,11) SELECT * FROM deleted WHERE sales>10000 ROLLBACK TRAN RETURN • . END COMMIT TRAN RETURN
Теперь попытаемся выполнить изменение столбца t i t i e i d : UPDATE smalltitles SET title_id=LEFT(title_id, 5) WHERE LEFT (title, 1) IN ('С, 'Т', 'L')
Будет получен результат: Msg 50000, Level 1, State 50000 Изменение идентификационного номера книги запрещено title_id title type
price
sales
BU1032 BU1111 MC3021 MC3026 PS1372 PS2106
19.9900 11.9500 2.9900 NULL 21.5900 7.0000
4095 3876 22246 NULL 375 111
The Busy Executive's Database ... Cooking with Computers: Surrep... The Gourmet Microwave The Psychology of Computer Coo... Computer Phobic AND Non-Phobic... Life Without Fear
business business mod__cook UNDECIDED psychology psychology
(6 row(s) affected)
Причем триггер отклонит попытку изменить идентификационный номер на то же самое значение: UPDATE smalltitles SET title_id = title_id
Однако на этот раз будет возвращен следующий результат: Msg 50000, Level I, State 50000 Изменение идентификационного номера книги запрещено title id .title type
price
sales
(0 row(s) affected)
Такое поведение триггера обусловлено логикой проверки изменений. Избавиться от этой проблемы легко. Достаточно добавить в первую проверку триггера дополнительное условие, в котором будет выясняться существование хотя бы одной строки с измененным идентификационным номером. Теперь же попытаемся изменить название серии для книги с идентификационным номером РС88 8 8 (серия popular_comp): UPDATE s m a l l t i t l e s SET type = 'new_comp' WHERE t i t l e _ i d = 'PC8888'
Часть V. Программирование
1252 Будет получен результат:
Msg 50000, Level 1, State 50000 Изменение названия серий popular_comp и psychology запрещено title id title type price PC8888 Secrets of Silicon Valley (1 row(s) affected)
new_comp
20.0000
sales 4095
Теперь же попытаемся изменить название серии для всех книг: UPDATE smalltitles SET type = 'UNDECIDED' Будет выведен следующий результат: Msg 50000, Level 1, State 50000 Изменение названия серий popular_comp и psychology запрещено title_id title type price PC1035 But Is It User Friendly? PC8888 Secrets of Silicon Valley PC9999 Net Etiquette PS1372 Computer Phobic AND Non-Phobic. PS2091 Is Anger the Enemy? PS2106 Life Without Fear PS3333 Prolonged Data Deprivation: Fo. PS7777 Emotional Security: A New Algo. (8 row(s) affected)
popular comp popular comp popular comp psychology psychology psychology psychology psychology
22.9500 20.0000 NULL 21.5900 10.9500 7.0000 19.9900 7.9900
sales 8780 4095 NULL 375 2045 111 4072 3336
Предметный указатель
@ ©©CONNECTIONS 1101 @@CPU_BUSY 1112 @@CURSOR_RQWS 1103, 1237 @@DATEFIRST 1101 @@DBTS 1101 @@ERROR 1110 @@FETCH_STATUS 1103, 1238 ©©IDENTITY 1111 ©©IDLE 1112 @@IO_BUSY 1112 ©©LANGID 1101 ©©LANGUAGE 1101 @@LOCK_TIMEOUT 1102 @@MAX_CONNECTIONS 176, 1102 @@MAX_PRECISION 1102 ©©NESTLEVEL 1102 ©©OPTIONS 1102 @@PACK_RECEIVED 1112 @@PACK_SENT 1113 @@PACKET_ERRORS 1113 ©©PROCID 1107 @@REMSERVER 1102 ©©ROWCOUNT 1111 ©©SERVERNAME 1102 ©©SERVICENAME 1102 @@SPID 1102 ©©TEXTSIZE 1102 ©©TIMETICKS 1113 @@TOTAL_ERRORS 1113 @@TOTAL_READ 1113 @@TOTAL_WRITE 1113 ©©TRANCOUNT 864, 1111 ©©VERSION 1102
ABS 1105 ACOS 1105 ALL 1079, 1159, 1181, 1187 ALTER DATABASE 938 ALTER FUNCTION 1119 ALTER PROCEDURE 1214
ALTER TABLE 970 ALTER TRIGGER 1246 ALTER VIEW 1011 AND 1078 ANY 1079 APP_NAME() 1111 AS 1162 ASC 1190 ASCII 1109 ASIN 1106 ATAN 1106 ATN2 1106 AVG 1178
В BACKUP DATABASE 526, 544, 549 BACKUP LOG 550, 926 BEGIN DISTRIBUTED TRAN 861 BEGIN TRAN 853 BEGIN...END 1083 BETWEEN 1078 bigint 1089 binary 64, 1094 bit 1098 bitwise NOT 1072 BULK INSERT 1153 bulkadmin 222
CASCADE 953 CASE 1066 CAST 1099 CEILING 1106 CHAR 1109 CHARINDEX 1109 CHECK 948 CLOSE 1236 COALESCE 1069 COL_LENGTH 1107 COL_NAME 1107 COLLATION PROPERTY 889, 1111 COLUMN PROPERTY 1107
1254 COLUMNS_UPDATED() 1248 COMMIT TRAN 854 COMPUTE 1192 console.exe 39 CONTAINS 1176 CONVERT 1099 COS 1106 COT 1106 COUNT 1178 CREATE DATABASE 892 CREATE DEFAULT 828 CREATE FUNCTION 1115 CREATE INDEX 1030 CREATE PROCEDURE 1204 CREATE RULE 836 CREATE STATISTICS 1048 CREATE TABLE 958 CREATE TRIGGER 1242 CREATE VIEW 996 CUBE 1182 CURRENTJTIMESTAMP 1111 CURRENTJJSER 1111 cursor 1098 CURSOR_STATUS 1103
D DATABASEPROPERTY 1107 DATABASEPROPERTYO 922 DATABASEPROPERTYEXO 922 DATALENGTH 1111 DATEADD 1104 DATEDIFF 1104 DATENAME 1104 DATEPART 1105 datetime 1092 DAY 1105 db_accessadmin 234 db_backupoperator 234 db_datareader 234 db_datawriter 234 db_ddladmin 234 db_denydatareader 234 db_denydatawriter 234 DB_ID 1107 DB_NAME 1107 db_owner 234 db_securityadmin 234 DBCC: DBREINDEX 1042 SETINSTANCE 725 SHOW_STATISTICS 1052 SHOWCONTIG 1044 SHRINKDATABASE 930
Предметный указатель SHRINKFILE 927 SQLPERF 925 dbcreator 222 dbo 227 DEALLOCATE 1237 decimal 1090 DECLARE 1059 DECLARE CURSOR 1224 DEFAULT 950 DEGREES 1106 DELETE 1134 DENY 258 DESC 1190 DIFFERENCE 1109 diskadmin 222 DISTINCT 1160 distrib.exe 40, 585 DROP DATABASE 945 DROP DEFAULT 831 DROP FUNCTION 1120 DROP INDEX 1044 DROP PROCEDURE 1216 DROP RULE 837 DROP STATISTICS 1053 DROP TABLE 980 DROP TRIGGER 1247 DROP VIEW 1016 dtsrun.exe 333 dtsrun.exe 39 dtswiz.exe 39
E EXISTS 1080, 1176 EXP 1106 EXPAND VIEWS 1199
FAST 1198 FETCH 1229 FILEJD 1107 FILE_NAME 1107 FILEGROUPJD 1107 FILEGROUP_NAME 1108 FILEGROUPPROPERTY 1108 FILEPROPERTY 1108 float 1091 FLOOR 1106 FOR 1197 FORCE ORDER 1198 FORMATMESSAGE 1111 FREETEXT 1176 FROM 1165
Предметный указатель FULL OUTER 1169 FULLTEXTCATALOG PROPERTY 1108 FULLTEXTSERVICEPROPERTY 1108
G GETANSINULL 1111 GETDATE() 1105 GO 1087 GOTO 1085 GRANT 254 Grid Pane 391 GROUP BY 1177 guest 227 GUID 609, 1097
H HAS_DBACCESS 1108 HAVING 1185 HOSTJD0 1111 HOST_NAME() 1111
I AM 813 IDENTJNCR 1111 IDENT_SEED 1111 IDENTITY 956, 1111 IDENTITYCOL 1161 IF...ELSE 1083 IN 1080 INDEX_COL 1108 INDEXPROPERTY1108 INNER 1168 INSENSITIVE 1225 INSERT 325, 1122 int 1089 INTO 1165 IS_MEMBER 1108 IS_SRVROLEMEMBER 1108 1SDATE 1105 ISNULL 1070, 1111 ISNUMERIC 1106 isql.exe 39 isqlw.exe 39 itwiz.exe 39
1255
LEFT 1109 LEFT OUTER 1168 LEN 1109 LIKE 1081 LOG 1106 LOG10 1106 logread.exe 40, 583 LOWER 1109 LTRIM 1109
M makepipe.exe 39 Master 22 MAX 1178 MIN 1178 Model 24 money 1091 MONTH 1105 Msdb 26 msmerge_contents 610, 611 msmerge_tombstone 610 msrepltransactions 603
N nchar 1095, 1109 NEWID() 1112 NO ACTION 953 NOT 1078 ntext 1096 NULL 949 NULLIF 1112 numeric 1090 nvarchar 1096
О OBJECT_NAME 1108 OBJECTPROPERTY 1108 odbccmpt.exe 39 odbcping.exe 40 OPEN 1228 OPTION 1198 OR 1078 ORDER BY 1190 osql.exe 40 OUTPUT 1209
К KEEP PLAN 1199 KEEPFIXED PLAN 1199
PARSENAME 1112 PATINDEX 1109
1256 PERCENT 1160 PERMISSIONS 1112 PI 1106 POWER 1106 PRINT 1059 processadmin 222 Profiler 34
qrdrsvc.exe 584 QUOTENAME 1109
R RADIANS 1106 RAID 778 RAND 1106 READ ONLY 1225 readpipe.exe 40 real 1091 rebuildm.exe 40, 120, 540 RECOVERY 774 Remsetup.exe 79 REPLACE 1110 REPLICATE 1110 replmerg.exe 40, 587 RESTORE DATABASE 563, 565 RESTORE LOG 566 RETURN 1213 REVERSE 1110 REVOKE 259 RIGHT 1110 RIGHT OUTER 1169 ROBUST PLAN 1198 ROLLBACK TRAN 854 ROLLBACK WORK 854 ROLLUP 1182 ROUND 1106 ROWCOUNT_BIG() 1112 ROWGUID 609, 610 ROWGUIDCOL 609, 950, 1162 RTRIM 1110
sa221 SAVE TRAN 853 scm.exe 40 SCROLL 1225 securityadmin 222 SELECT 1159 SELECT INTO 325
Предметный указатель SELECT...INTO 1127 SERVERPROPERTY 1112 SESSION USER 1112 SET: ANSI_NULL_DFLT_OFF 949 ANSI_NULL_DFLT_ON 949 DEADLOCK_PRIORITY 880 IDENTITYJNSERT 957 IMPLICITJTRANSACTION OFF 852 ON 856 LOCK_TIMEOUT 867 QUOTEDJDENTIFIER 824 REMOTE_PROC_TRANS 861 TRANSACTION ISOLATION LEVEL 869 setupadmin 222 Setupsql.exe 75, 77 SHUTDOWN 147 SID 203, 1093 SIGN 1107 SIN 1107 smalldatetime 1092 smallint 1089 small money 1091 snapshot.exe 40, 582 SOME 1079 SOUNDEX 1110 sp_add_alert 501 s p a d d j o b 493 sp_add_operator 505 sp_addapprole 244 spaddextendedproc 1202 spaddgroup 241 sp_addlinkedserver 283 sp_addlinkedsrvlogin 290 sp_addlogin 208 sp_addremotelogin 313 spaddrole 240 sp_addrolemember 236 spaddserver 308 spaddsrvrolemember 223 sp_addtype 840 spadduser 231 sp_attach_db 542, 944 sp_attach_single_file_db 944 sp_bindefault 829 sp_bindrule 837 spchangedbowner 919 spchangeobjectowner 825, 1016 sp_configure 162, 193 allow update 230, 492 allow updates 179 cost threshold for parallelism 173 default language 179 fill factor 183
Предметный указатель 'locks' 865 'max server memory' 168 'max worker threads' 171 'min memory per query' 169 'min server memory' 168 'nested triggers' 180 'priority boost' 172 1 'query governor cost limit 180 'recovery interval' 184 'remote access' 177 'remote proc trans' 177, 861 'remote query timeout' 177 'set working set size' 169 'show advanced options' 163 'two digit year cutoff 181 'user connections' 176 sp_dboption 912 sp_depends 978, 1015 sp_detach_db 542, 942 sp_dropapprole 246 sp_droplinkedsrvlogin 295 sp_dropremotelogin 318 sp_droprole 242 sp_droprolemember 237 sp_dropserver 298 sp_dropsrvrolemember 224 sp_droptype 842 sp_dropuser 233 sp_fkeys 979 sp_grantdbaccess 231 sp_grantlogin 212 sp_help974, 1012 sp_helpdb 920 sp_helpfile 921 sp_helpfilegroup 921 sp_helplinkedsrvlogin 292 sp_helpremotelogin 315 sp_helprolemember 237 sphelprotect 260 sp_helpsrvrole 224 sp_helpsrvrolemember 223 sp_helptext 206 sp_helpuser 231 sp_remoteoption 317 sp_rename 1010, 1043 sp_renamedb 918 sp_revokedbaccess 232 spserveroption 295 sp_setapprole 245 sp_spaceused 924 sp_unbindefault 831 spunbindrule 837 sp_updatestats 1051 sp_user_counter 724 SPACE 1110
1257 sql_variant 1098 sqlagent.exe 40 sqlcli.bat 78 sqlcst.bat 78 sqldiag.exe 40 sqlftwiz.exe 41 sqlins.bat 78 sqlmaint.exe 40 sqlrem.bat 78 sqlservr.exe 40, 147 sqltrace.exe 761 sqlupg.bat 78 SQRT 1107 SQUARE 1107 STANDBY 774 STATS_DATE 1112 STDEV 1193 STDEVP 1193 STR 1110 STUFF 1110 SUBSTRING 1110 SUM 1178 SUSER_SID 1109 SUSER_SID() 230 SUSER_SNAME 1109 sysadmin 221, 222 sysalerts 474 sysdatabases 891 sysdepends 1015 sysindexes 1048 syslogins 206 sysoperators 505 sysservers 281 SYSTEM_USER 1112 systypes 840 sysusers 228 sysxlogins 206, 289
TAN 1107 Tempdb 25 text 1096 timestamp 617, 1097 tinyint 1089 TOP 1160 TRIGGER_NESTLEVEL([object_id]) 1248 TYPEPROPERTY 1108
и UNION 1186 UNIQUE 951 UPDATE 1130, 1248
1258 UPDATE STATISTICS 1049 UPPER 1110 USE 1086 USER ID 1109
Предметный указатель VARP 1193 VARYING 1210 vswitch.exe 41, 90
w VAR 1193 varbinary 1094 varchar 1095
Административные задачи 264 Администрирование 120 автоматизация 468 Архивирование 526 Атрибут 791 Аудит 719
База данных: автоматический рост 884 архитектура 806 восстановление 184 выбор сопоставления 885 изменение 938 имени 917 использование групп файлов 883 копирование объектов 427 неформатированные разделы 885 объекты 820 отсоединение 542, 942 передача прав владения 918 планирование конфигурации 881 получение информации 920 присоединение 541, 942 проектирование 785, 794 размещение: по умолчанию 184 файлов 881 распределения 579 распределенная 787 системные 21 создание 891 удаление 945 уменьшение размера 926 управление свойствами 911 централизованная 785
WAITFOR 1086 WHERE 1173 WHILE...CONTINUE 1084 WITH TIES 1160
Блокировки 845, 847 использование 864 конкуренция: оптимистическая 865 пессимистичекая 866 конфликты 877 менеджер 849 мертвые 848, 878 основы 848 проблема: грязного чтения 849 неповторяемого чтения 850 последнего изменения 849 чтения фантомов 850 типы 872 управление 870 уровни блокирования 867
В Вертикальный фильтр 575 Виртуальный сервер 775 Владелец базы данных 227 Вложенные триггеры 180 Внешние запросы 410 Волокна 172 Восстановление 773 Временные таблицы 1058 Вторая нормальная форма 799 Вторичный сервер 776 Выборка данных 1158 Выражения 1062
Глобальная временная таблица 1060 Глобальный уникальный идентификатор 609, 1097 Горизонтальный фильтр 575
Предметный указатель Горячая резервная копия 772 Группы: серверов 279 страниц 811 файлов 809
Д Двойные кавычки 824 Двухфазный протокол фиксирования 860 Динамически подключаемые библиотеки 73 Динамический моментальный снимок 663 Динамический фильтр 662 Диспетчер безопасности Windows NT 205 Добавление строк 11216, 1122, 1127 Доверительные отношения 204 Домен 791 Дублирование дисков 780
Задача 379 Закачка данных 430 Запись 788, 791 Запрос 1057 ограничение по цене исполнения 180 тайм-аут для удаленных серверов 177 цена распараллеливания 173 Запуск: SQL Server 2000 147, 155, 157, 159 запроса 419 приложения 417 Зеркальное отображение дисков 780 Зеркальный набор дисков 779
И Идентификатор безопасности 203, 1093 Идентификация пользователя 200 Избыточность 798 Изменение данных 1130 Именованные каналы 73, 122 Импорт данных 324 Индексирование представлений 1027 Индексы 820, 1017 использование 1019 кластерный 1022 некластерный 1020 переименовывание 1043 перестроение 1042 представления 1027 создание 1030 удаление 1044 уникальный 1024
1259 управление 1029 фактор запосления 1025 Инструмент DTS Designer 376 задачи 379 ActiveX Script 384 Bulk Insert 430 Copy SQL Server Objects 427, 448 Data Driven Query 423 Dynamic Properties 456 Execute Package 436 Execute Process 417 Execute SQL 419 File Transfer Protocol 381 Message Queue 440 Send Mail 429 Transfer Database 454 Transfer Error Messages 446, 453 Transfer Jobs 453 Transform Data 387 источники данных 378 Использование процессоров 169 Использование файла подкачки 169
К Каналы именованные 537 Кардинальное число 792 Категория событий 737 Класс событий 737 Кластер 775, 777 Клиент-сервер 786 Клиенты 126 Ключ 792, 820 Кодовая страница 65 Колонка 738,791 Константы 1062 Контрольная точка 184 Конфигурирование базы данных 181 Конфигурирование сервера 178 Конфликт изменения 586 Координатор распределенных транзакций 616, 858 Копирование данных 423 Копирование резервное 526, 535, 543 Кортеж 791 Курсоры 1217 выборка 1229 динамические 1223 дополнительные средства 1237 закрытие 1236 изменение данных 1232 использование 1223 ключевые 1221 (окончание рубрики см. на стр. 1260)
1260 Курсоры (окончание):
объявление 1224 освобождение 1237 открытие 1228 последовательные 1219, 1222 прокручиваемые 1219 статические 1220 удаление данных 1234
Л Локальная: временная таблица 1061 система 53
м Магнитная лента 536 Макет таблицы 790 Максимальное количество пользователей 175 Массивное копирование 1135 Массивы RAID 779 Мастера 41 Менеджер: блокировок 849, 866 ресурсов 858 Метка 1085 Модели данных 788 Моментальный снимок 582, 597 Мониторинг 719 Event Viewer 735 Performance Monitor 722 SQL Server Profiler 736 Task Manager 732 выбор инструмента 720 основы 737 осуществление 761 фильтр 741
н Набор символов 63, 65 Неформатированные разделы 885 Нить выполнения 171 Нормализация 799
О Обновление 81 Обработчик распределенных запросов 859 Объект 722 Обязанности администратора 265
Предметный указатель Ограничения целостности 821 Ограниченные идентификаторы 823 Операнды 1062 Оператор: параметры рассылки сообщений 189 последней надежды 190 Операторы 1062, 1072 Определяемые пользователем типы данных 821, 839 Определяемые пользователем функции 821 Основной сервер 776 Отношение 790, 791
п Пакет DTS 330, 456, 463 Пакет команд 1087 Параметризированные запросы 395 Переменные 1058, 1063 Перенаправление: событий 188 сообщений 508 Перенос данных 325 Подготовка к установке 52, 63 Подзапрос 1064 Поле 788, 791 Пользователь: базы данных 224 домена 53 локальный 53 Порядок сортировки 63, 64 Поток 171 Почтовый профиль 180 Права доступа 55, 234, 247 Правила 821, 835 Представления 820, 995 Профиль трассировки 761
Разделяемая память 74, 122 Распределенные: запросы 858 транзакции 858 Расщепление страниц 182, 517 Резервная копия 184 Резервный сервер 772 Репликация данных 185, 572 Роли 221, 234
Связанные серверы 280 Сервер 269
1261
Предметный указатель Сетевые библиотеки 69, 121 Система безопасности 198 Системные таблицы 179 Скрипт 120 Слот 1025 Службы: SQL Server 2000 16, 119, 161 трансформации данных 328 События 472, 737 Сокеты TCP/IP 74, 122 Сопоставление 66 Unicode 63 Спящий режим 189 Стандартные идентификаторы 823 Статистика 1048 Степень заполнения 517 Стоимость владения 45 Столбец 791 Страница 811 Строка 791 Сущность 790, 791 Сценарий 120 Счетчики 722
Умолчания 820, 827 Управление: группой серверов 507 памятью 167 серверами и группами 268 Усечение 531 Установка 45, 74, 92 Утилиты командной строки 38 Учетная запись 205, 209, 221
Ф Файл автоматической установки 76 Файл-сервер 786 Файлы 807 Фактор заполнения 181, 1025 Функции 1063, 1100 X Хранимые процедуры 821, 1200
Ц Цена распараллеливания запроса 173 Таблицы 790, 820, 946 Технология RAID 778 Типы данных 1088 Точки сохранения 853 Транзакции 845, 854 Триггеры 821, 1239
э Экспорт данных 324 Экстенты 811 Электронная почта 429
Я Удаление данных 1134 Удаленные серверы 307
Язык по умолчанию 178 Язык структурированных запросов 1057
агазин-сапон "НОВАЯ ТЕХНИЧЕСКАЯ КНИГА 190005, Санкт-Петербург, Измайловский пр.» 29
В магазине представлена литература по компьютерным технологиям радиотехнике и электронике физике и математике экономике медицине и др. Низкие цены Прямые поставки от издательств Ежедневное пополнение ассортимента Подарки и скидки покупателям Магазин работает с 10.00 до 20.00 без обеденного перерыва выходной день - воскресенье Тел.: (812)251-41-10, e-mail: [email protected]