/
Автор: Каучмэн Дж.С. Марисетти С.Н.
Теги: программное обеспечение базы данных информационные технологии
ISBN: 5-85582-261-3
Год: 2002
Текст
Моей жене Стейси
— Джейсон Каучмэн
Моей жене Суджани н сыновьям Рахату н Ришабху
— Срдхир Марисетти
ORACLE
Oracle Press
TM
OCA Oracle9/
Associate DBA
Certification
Exam Guide
Jason S. Couchman
Sudheer N. Marisetti
McGraw-Hffl/Osbome
New York Chicago San Francisco
Lisbon London Madrid Mexico City Milan
New Delhi San Juan Seoul Singapore Sydney Toronto
ORACLG
Oracle Press
TM
OCA Oracle9/
Associate DBA
Подготовка
администраторов
баз данных
Джейсон С. Каучмэн
Судхир Н. Марисетти
Издательство "Лори"
Издательский дом "Питер"
OCA Oracle9/
Associate DBA Certification
Exam Guide
Jason S. Coachaiaa
SaAeer N. Marisetti
Copyright © 2002 by The McGraw-Hill Companies, Inc. (Publisher)
All rights reserved
ISBN 5-85582-261-3 (978-5-85582-261-8)
OCA Oracle9i
Associate DBA
Подготовка администраторов
баз данных
Джейсои С. Каучмзи
СудхивН. Марасетти
Переводчики М. Горелик, В. Сидорова
Научный редактор А. Головко
Корректор Л. Белая
Верстка В. Канивец
i© Издательство "Лори", 2006/
Изд. № : OAI (03)
ЛР№: 07612 30.09.97 г.
ISBN 5-85582-261-3 (978-5-85582-261-8)
Подписано в печать 10.08.06. Формат 84x108/16
Гарнитура Times Печать офсетная
Печ. л. 44 Тираж 2000 Заказ № 35
Цена договорная
Издательство "Лори"
123100, Москва, Шмитовский пр., д. 13/6, стр. 1 (пом. ТАРП ЦАО)
Телефон для оптовых покупателей: (495)256-09-83
Размещение рекламы (495)259-01-62
www.lory-press.ru
ООО "Питер Пресс"
194044, Санкт-Петербург, Б. Сампсониевский пр., д. 29, лит. А
Телефон для оптовых покупателей:
Санкт-Петербург (812)703-73-73, 703-73-72
Москва (495)234-38-15, 255-70-67, 255-70-68
WWW.PITER.COM
Отпечатано в типографии ООО Тиль-2004"
Москва, Каширский пр., д. 23
Об авторах
Джейсон С Каучмэн
Джейсон С. Каучмэн является консультантом в области баз данных и автором
книги Qnck8/ Certified Professional DBA Certification Exam Guide, ранее
изданной Oracle Press. Он является регулярным участником конференций и встреч
пользователей Oracle по общим вопросам и вопросам, связанным с ОСР. Его
работы ранее публиковались в журнале Oracle Magazine, в издательствах Harvard
Business School Publishing и Gannett Newspapers и в других местах.
Судхир Н. Марисетти
Судхир Н. Марисетти занимается администрированием баз данных, Unix
и Web и в то же время является президентом компании Abacus Concepts со
штаб-квартирой в Нью-Джерси — консалтинговой фирмы,
специализирующейся на проектировании, построении и сопровождении систем баз данных.
Кроме того, он является преподавателем Колумбийского университета, где он
ведет занятия по современным методам администрирования Oracle.
Марисетти имеет степень магистра в области электротехники.
Oracle Certified
Professional
О программе Oracle Certified Professional
Квалификация администраторов баз данных (АБД) Oracle является
неотъемлемой составной частью успешного функционирования становящихся все
более сложными сегодняшних компьютерных систем и сред. Самые хорошие
АБД работают, оставаясь за кулисами, и ищут способы тонкой и точной
настройки повседневной производительности, позволяющие избежать
незапланированных кризисов и длительных дорогостоящих простоев. Они знают, что
именно такие способы являются тонкой гранью, отделяющей прекрасную
производительность от кризиса, который может стать причиной полной
остановки деятельности компании. Хорошо понимая, что для достижения
высокого уровня квалификации зачастую требуются годы, группа Oracle Certification
Program Database Administration Track предлагает АБД три уровня
сертификации, позволяющие им продемонстрировать свои знания и навыки в области
баз данных Oracle. Эти уровни называются: Oracle Certified Associate (OCA),
Oracle Certified Professional (ОСР) и Oracle Certified Master (OCM).
Программа сертификации Oracle Certification Program была разработана
Oracle для того, чтобы в соответствии со строгими стандартами Oracle
отобрать технических профессионалов, способных демонстрировать
определенную глубину знаний при использовании технологий. Сертификация на ОСА
является начальной сертификацией, которая позволяет начинающим
профессионалам в области информационных технологий (ИТ) подтвердить свой
базовый уровень знаний и помогает отличить их от всех остальных кандидатов,
не имеющих этого сертификата. Получение свидетельства ОСА является
первым шагом к получению следующих уровней сертификации АБД: ОСР и
ОСМ. С получением профессиональной сертификации ваши накопленные
упорным трудом впечатляющие знания и навыки будут подтверждены
официальным документом, что упрочит ваше положение и откроет перспективы
карьерного роста или приведет к появлению более привлекательной и хорошо
оплачиваемой работы.
Лица, прошедшие сертификацию на Oracle Certified Associate, получают
значок с логотипом Oracle Certified Associate и сертификат, который можно
вставить в рамку.
Требования для сертификации ОСА
Чтобы стать начинающим сертифицированным администратором баз данных
Oracle для Огас1е9/, вы должны сдать два экзамена. Эти экзамены проверяют
vn
знания по основным аспектам языка SQL и администрирования Oracle.
Процесс сертификации подразумевает, что вы будете сдавать два следующих
экзамена:
■ Введение в Oracle9n SQL (1Z0-007)
■ База данных Огас1е9п Основы I (1Z0-031)
Если вам не удастся сразу пройти тестирование, вы должны будете
подождать не менее 30 дней, прежде чем можно будет повторно сдавать этот
экзамен. Каждый тест можно пытаться сдать не более трех раз в течение 12
месяцев.
Повторная сертификация
По мере выхода новых продуктов и обновлений к существующим продуктам
Oracle извещает о требованиях по обновлению сертификации. Как правило,
Oracle выпускает уведомление о появлении новой версии экзамена за шесть
месяцев до истечения срока действия текущей версии.
Формат экзамена
Основанные на применении компьютера экзамены оформлены в виде
многовариантных тестов, обычно состоящих из 50-^—65 вопросов, ответы на которые
следует дать в течение 90—120 минут. После появления курса ОСА Oracle стал
предлагать экзамен по SQL (1Z0-O07) как в онлайновой (интерактивной)
форме, так и в форме экзамена с преподавателем. Посетите, пожалуйста, сайт
www.oracle.com/education/certification, где можно найти подробности и самые
последние обновления спецификаций экзамена.
Благодарности
Я хотел бы поблагодарить очень многих людей за помощь при написании этой
книги. В первую очередь я хотел бы от всего сердца поблагодарить читателей,
которые, несмотря на свою занятость, смогли уделить время и сообщить мне
свои замечания по предлагаемой вашему вниманию книге. Я прислушался к
вашим похвалам и здоровой критике и приложил множество усилий, чтобы
скорректировать и расширить мою работу, учитывая ваши замечания. Далее я
выражаю благодарность всем сотрудникам Oracle, сделавшим возможным
появление этой книга. УльрикаШвинн и Джим Дилани—вы оба были верными
помощниками, коллегами и друзьями в процессе моих непрекращающихся
попыток помочь читательской аудитории, превышающей 110000 человек,
получить сертификацию от Oracle. Я благодарен также сотрудникам Oracle
University за их замечания и помощь в общем развитии курсов ОСР DBA. Как и
всегда, я благодарен хорошим людям из издательств Osborne и MacAllister
Publishing Services за их работу по компоновке моей рукописи и превращению ее в
законченный труд.
Эта книга посвящается моей жене, Сгейси, украсившей все стороны моей
жизни. Сгейси, я пытаюсь быть тебе лучшим мужем и помочь твоему росту как
личности. Сейчас, когда ты делаешь свой очередной шаг по жизни и из
новичка превращаешься в профессионала, я хочу, чтобы ты знала, что я от всего
сердца поддерживаю тебя и сделаю все, что в моих силах, чтобы наш брак был
прочным, особенно если тебе придется работать допоздна! Я тебя люблю.
Джейсон Каучмэн
Я хочу поблагодарить Джейсона, предоставившего мне возможность стать его
соавтором этой книги. Совместная работа над книгой и его руководство были
для меня неоценимыми. Я благодарю сотрудников издательства Osbor-
ne/McGraw-НШ за помощь при завершении этой книги. Кроме того, я
благодарен корпорации Oracle за рецензирование каждой главы и появившиеся в
результате этого ценные замечания. Благодарен я и всем моим бывшим и
нынешним студентам, взаимодействие с которыми было просто неоценимым для
формирования моих технических знаний.
Я благодарен моему доброму другу Рави Кадирмангалану, чья поддержка и
советы помогали мне и в жизни, и в написании этой книги. Я счастлив, что у
меня есть такой друг. Больше всего я обязан своей любимой жене, Суджани
"Пуппала" Марисетти, которая "охраняла крепость" и умудрялась чем-то
занимать двух наших суперактивных сыновей, пока я по выходным и ночами
каторжно работал над этой книгой. Без ее терпения, поддержки и вдохновения я
многого не достиг бы в своей жизни.
Свои отзывы вы можете посылать мне по адресу smarisetti@yahco.com.
Судхир Марисетти
Содержание
Часть!
Подготовка к первому экзамену на ОСА
для АБД: введение в SQL
Введение в цели экзамена по SQL для Oracle9/ 2
1 Обзор баз данных Oracle 4
Обзор Oracle 5
Теоретические и физические аспекты реляционных
баз данных 6
Реализации РСУБД и ОРСУБД Oracle 9
Использование и преимущества PL/SQL 13
Написание основных операторов SQL 16
Возможности операторов SQL select 16
Выполнение операторов select 19
Различия между командами SQL и SQL*Plus 29
Резюме главы 36
Двухминутное погружение в пройденное 36
Вопросы для самопроверки 37
Вопросы ко всей главе 37
Ответы на вопросы для самопроверки 39
Ответы на вопросы ко всей главе 39
2 Ограничение и сортировка возвращаемых
данных и манипулирование ими 41
Ограничение и сортировка строк данных 42
Сортировка выходных данных с помощью фразы order by 42
Ограничение числа выбираемых данных
с помощью фразы where 45
Использование однострочных функций 49
Различные типы однострочных функций SO
Использование функций в операторах select 54
Функции для работы с датами 59
Функции преобразования 62
Резюме главы 65
Двухминутное погружение в пройденное 65
Вопросы для самопроверки 66
Вопросы ко всей главе 66
Ответы на вопросы для самопроверки 67
Ответы на вопросы ко всей главе 67
3 Расширенная выборка данных в Oracle 69
Показ данных из нескольких таблиц,. 70
Ключи к соединению таблиц 70
Операторы select, соединяющие данные
более Чем из одной таблицы 71
Создание внешних соединений 77
Соединение таблицы с самой собой 84
Групповые функции и их использование 86
Опознавание и использование групповых функций 87
Использование фразы group by 90
Исключение полученных с помощью group by
данных фразой having 94
Резюме главы 95
Двухминугное погружение в пройденное 96
Вопросы для самопроверки 97
Вопросы ко всей главе 98
Ответы на вопросы для самопроверки 99
Ответы на вопросы ко всей главе 99
4 Подзапросы 101
Использование подзапросов . 102
Понимание и определение подзапросов 102
Перечень различных типов подзапросов и их запись 106
Написание многостолбцовых подзапросов 110
Значение NULL и подзапросы 111
Подзапросы во фразе from 114
Формирование удобочитаемых выходных данных в SQL*Plus 116
Ввод переменных 116
Настройка сред SQL*PluS 122
Формирование удобочитаемых выходных данных 128
Создание и выполнение сценариев 131
Сохранение настроек 133
Резюме главы 134
Двухминугное погружение в пройденное 134
Вопросы для самопроверки 136
Вопросы ко всей главе 136
Ответы на вопросы для самопроверки 138
Ответы на вопросы к главе 138
5 Создание объектов базы данных Oracle 141
Создание таблиц базы данных Oracle 142
Описание таблиц 142
Создание таблиц N 144
Определения типов данных и столбцов 149
Изменение определений таблиц 154
Удаление, переименование и усечение таблиц 158
Включение ограничений 160
Описание ограничений 160
Создание и сопровождение ограничений 163
Резюме главы 175
Двухминутное погружение в пройденное 175
Вопросы для самопроверки 177
Вопросы ко всей главе 177
Ответы на вопросы для самопроверки 179
Ответы на вопросы ко всей главе 179
XI
6 Манипулирование данными Oracle 181
Добавление новых строк в таблицу 182
Выполнение изменений данных в существующих строках 187
Удаление данных из базы данных Oracle 189
Слияние данных в таблице Oracle 191
Значение управления транзакциями ...; 193
Резюме главы 200
Двухминутное погружение в пройденное 200
Вопросы для самопроверки. 201
Вопросы ко всей главе 201
Ответы на вопросы для самопроверки. . . 202
Ответы на вопросы к главе 202
7 Создание других объектов базы данных Oracle.... 204
Создание представлений 203
Создание простых представлений.". 203
Создание представлений для принудительного
введения ограничений 211
Создание сложных представлений 214
Модификация и удаление представлений 218
Другие объекты базы данных 220
Обзор других объектов базы данных 220
Использование последовательностей 221
Использование индексов 226
Использование общедоступны хи частных синонимов 233
Резюме главы 236
Двухминутное погружение в пройденное 236
Вопросы для самопроверки 238
Вопросы ко всей главе 239
Ответы на вопросы для самопроверки 241
Ответы на вопросы ко всей главе 241
8 Управление доступом пользователей в Oracle 243
Создание пользователей 244
Предоставление и отзыв объектных привилегий 250
Использование ролей для управления доступом
к базе данных 256
Резюме главы 261
Двухминутное погружение в пройденное 261
Вопросы для самопроверки. . 261
Вопросы ко всей главе 261
Ответы на вопросы для самопроверки 262
Ответы на вопросы ко всей главе. 263
Часть II
Практические экзаменационные материалы
для ОСА Oracle9/ SQL
9 Первый экзамен ОСА: введение в SQL 266
Первый комплект экзаменационных вопросов 267
Второй комплект экзаменационных вопросов 279
Третий комплект экзаменационных вопросов 290
Ответы на первый комплект экзаменационных вопросов 303
Ответы на второй комплект экзаменационных вопросов 313
Ответы на третий комплект экзаменационных вопросов 323
Часть III
Подготовка к экзамену "Основы
администрирования базы данных ОСА I*
10 Основы архитектуры базы данных Oracle 341
Компоненты архитектуры Oracle 342
Архитектура сервера Oracle 342
Чтение данных с диска для пользователей: серверный процесс. . . . 343
Структуры для установления соединений пользователей
с серверами Oracle 347
Стадии обработки запросов, изменения и команды commit 348
Запуск сервера Oracle 3S4
Общие административные инструментальные средства
базы данных 334
ОШ 355
Настройка аутентификаци ис помощью файла паролей 361
Компоненты OEM 365
Управление экземпляром Oracle 369
Создание и управление файлом параметров инициализации 369
Конфигурация OMF 373
Запуск экземпляра 376
Контроль использования диагностических файлов 382
Создание базы данных Oracle 384
Предпосылки создания базы данных 385
Создание баз данных с помощь K>Database Configuration Assistant. . 389
Создание базы данных вручную 391
Резюме главы 394
Двухминутное погружение в пройденное 395
Вопросы для самопроверки 399
Вопросы ко всей главе 399
Ответы на вопросы для самопроверки 401
Ответы на вопросы ко всей главе 401
XIII
11 Управление физическими структурами
базы данных 404
Содержание и использование словаря данных 403
Построение представлений словаря данных 403
Ключевые компоненты словаря данных и содержание 407
Обращение к словарю данных 413
Поддержка управляющих файлов 413
Использование управляющих файлов 416
Исследование содержимого управляющего файла 417
Контроль управляющих файлов
с помощью свойства Oracle-Managed Files 421
Получение информации об управляющих файлах 423
Мультиплексирование управляющих файлов 423
Поддержка файлов журнала базы данных 427
Назначение и структура оперативных файлов журнала
базы данных 427
Управление переключением журнала
базы данных и контрольными точками 430
Мультиплексирование и поддержка журнала
базы данных 433
Управление оперативными файлами журнала базы данных
с помощью OMF 433
Резюме главы 437
Двухминутное погружение в пройденное 437
Вопросы ко всей главе 440
Ответы на вопросы ко всей главе 441
12 Управление табличными пространствами
и файлами данных 444
Описание логической структуры базы данных 445
Создание табличного пространства 430
Изменение размера табличного пространства 433
Назначение пространства временным сегментам 436
Временные сегменты в постоянном табличном щюстранстве 437
Изменение состояния табличного пространства 461
Изменение параметров памяти табличного пространства 463
Oracle-Managed Files (OMF) 466
Резюме главы 468
Двухминутное погружение в пройденное 468
Вопросы для самопроверки 469
Вопросы ко всей главе 470
Ответы на вопросы для самопроверки 471
Ответы на вопросы ко всей главе 471
13 Структуры памяти и данные отмены 473
Структуры памяти и их взаимоотношения 474
Различные типы сегментов и их использование 474
Управление использованием экстентов сегментами 480
Параметры использования пространства в блоках 487
Получение информации о структурах памяти 491
XIV
Управление данными отмены, 492
Назначение сегментов отмены 493
Реализация автоматического управления отмены • 493
Создание и конфигурация сегментов отмены вручную 500
Получение информации о данных отмены 507
Резюме главы 507
Двухминутное погружение в пройденное 508
Вопросы для самопроверки 509
Вопросы ко всей главе 510
Ответы на вопросы для самопроверки 511
Ответы на вопросы ко всей главе 511
14 Управление объектами базы данных 513
Управление таблицами 514
Различные методы хранения данных 514
Различение типов данных Oracle 519
Расширенные и ограниченные ROWID 522
Структура блоков данных и строк 523
Создание постоянных и временных таблиц 525
Управление структурами памяти в таблице 530
Реорганизация, усечение и удаление таблиц 533
Удаление неиспользованных столбцов из таблиц 537
Управление индексами 539
Различные типы индексов и их использование 540
Создание индексов В-дерева и битовых индексов 545
Реорганизация индексов 548
Удаление индексов 552
Получение информации об индексе из словаря данных 552
Контроль использования индексов 553
Управление целостностью данных 556
Реализация ограничений целостности данных 556
Поддержка ограничений целостности 562
Получение из Oracle информации об ограничениях 564
Резюме главы. . - , 565
Двухминутное погружение в пройденное 566
Вопросы для самопроверки 568
Вопросы ко всей главе 568
Ответы на вопросы для самопроверки 571
Ответы на вопросы ко всей главе 571
15 Управление пользователями базы данных 574
Управление пользователями 575
Создание новых пользователей базы данных 575
Изменение и удаление существующих пользователей 580
Контроль информации о существующих пользователях 582
Управление ресурсами и защитой пароля 584
Управление использованием ресурсов с помощью профилей 585
Управление профилями 587
Управление паролями с помощью профилей 590
Получение информации о профиле из словаря данных 594
XV
Управление привилегиями 396
Идентификация системных и объектных привилегий 396
Предоставление и отменена привилегий 601
Определение возможности аудита 604
Управление ролями 610
Создание и изменение ролей 610
Контроль доступности ролей 613
Удаление ролей 615
Использование предопределенных ролей 616
Показ информации о роли из словаря данных 617
Резюме главы 618
Двухминутное погружение в пройденное 619
Вопросы для самопроверки 623
Вопросы ко всей главе • • ■ • 623
Ответы на вопросы для самопроверки 623
Ответы на вопросы ко всей главе 625
Часть IV
Основы администрирования
базой данных Orac1e9/1
Тренировочные экзамены
16 Основы администрирования
базой данных Oracle9/1 630
Первый комплект экзаменационных вопросов 631
Второй комплект экзаменационных вопросов 642
Третий комплект экзаменационных вопросов 653
Ответы на первый комплект экзаменационных вопросов 667
Ответы на второй комплект экзаменационных вопросов 669
Ответы на третий комплект экзаменационных вопросов 671
А Поддержка глобализации 675
Выбор базы данных и набора национальных символов
для базы данных 676
Определение поведения в зависимости от языка 678
Параметры NLS 678
Получение информации об использовании поддержки
глобализации .. . ; 679
Предисловие
■ нтерес Джейсона к сертификации в области Oracle начался в
1996 г., когда он прочел о предлагаемом компанией Chauncey
Group сертификате Oracle DBA. Он обнаружил по крайней мере
две причины, почему было трудно подготовиться к этим
сертификационным экзаменам. Во-первых, отсутствовали перечни
практических вопросов. Во-вторых, для подготовки к экзамену
требовалось ознакомиться с шестью или семью различными руководствами по
Oracle, а также с книгами издательства Oracle Press, ни одна из которых не
была специально приспособлена для подобной подготовки. Судя по тому, как
быстро распространяются имеющиеся сегодня по этой теме книги
издательства Oracle Press, такие проблемы были не у него одного.
Предлагаемая вашему вниманию книга разделена на четыре блока, в
первом из которых содержатся подготовительные материалы для знакомства с
экзаменом по Огас1е9/ SQL, являющимся частью курса сертификации по Огас1е9/
ОСА DBA. В этом блоке имеется восемь глав, в каждой из которых содержится
несколько дискуссий, концентрирующих ваше внимание на конкретных темах
или более узких вопросах (подтемах), входящих в экзаменационную
программу курса Огас1е9/ Certified Database Associate Track Candidate Guide. (Полный
перечень всех проверочных тем для этого экзамена можно найти в главе 1.) За
каждой дискуссией следует раздел "Закрепление пройденного материала", где
перечислены три или четыре основные концепции, которые необходимо
сохранить в памяти после изучения материала дискуссии. Затем вы увидите от
двух до шести вопросов-упражнений, правильные варианты ответа на которые
вы сможете выбрать из нескольких коротких ответов, приведенных в
принятом для экзамена формате. Вслед за ними приводятся ответы на
предложенные вопросы, которые должны помочь вам быстрее справиться с изучаемым
материалом. Следовательно, пользуясь этой книгой, вам практически никогда
не придется отклоняться от того, что вы выучили по теме Огас1е9/ DBA для
экзамена ОСА.
В конце каждой главы вы найдете краткое резюме главы (изложение того, о
чем шла речь в главе), а за ним, если можно так сказать, двухминутное
пособие для зубрежки (Two-Minute Drill). Это пособие содержит еще один
маркированный список фактов для просматривания и запоминания или шпаргалок
перед заветным экзаменом на ОСА. Заканчивается глава короткими ответами
(их обычно бывает от 5 до 20) на выбранные из экзаменационных материалов
вопросы с несколькими вариантами ответов. Это делается для того, чтобы
помочь вам еще раз провести самотестирование и проверить свое понимание
пройденного в главе материала.
Предисловие
XVII
Второй блок состоит из одной главы, содержащей три полномасштабных
практических экзамена. Каждый тест состоит из вопросов с несколькими
вариантами ответов и построенных на базе сценариев вопросов, специально
разработанных по экзаменационным материалам. Кроме того, в конце этой главы
вы найдете ответы на каждый вопрос практического экзамена и
обстоятельные объяснения, а также ссылки на экзаменационные темы и подтемы из
руководства ОСА Candidate Guide. Эта опция должна помочь вам с высокой
степенью точности определить те области, которые требуют от вас
дополнительной подготовки.
Третий и четвертый блоки книги имеют структуру, аналогичную первому и
второму блокам соответственно, но охватывают темы, относящиеся к
экзамену кОгас1е9г Основы Г'. Третий блок состоит из шести глав, каждая из
которых содержит несколько обсуждений, концентрирующих ваше внимание на
конкретных темах или более узких вопросах (подтемах), входящих в
экзаменационную программу курса Oracle Certification Program Oracle9i Certified
Database Associate Track Candidate Guide для экзамена Основы I. (Полный список
всех тем для этого экзамена можно найти в главе 10.) В четвертом блоке,
состоящем из одной главы, содержатся три полномасштабных практических
экзамена для подготовки к экзамену Основы I.
И наконец, маленькое замечание об обновлениях и исправлениях ошибок.
Поскольку ОСА охватывает такой огромный объем сведений, она быстро
становится "живым" текстом, существующим по своим законам. Если вы
почувствуете, что вследствие каких-то ошибок вы столкнулись с трудностями, вы
можете найти самые свежие исправления на сайте www.OraclePressBooks.com.
Удачи вам!
Введение
редлагаемая корпорацией Oracle программа Oracle Certification
Program для АБД является отличной возможностью
продемонстрировать свои навыки использования программного
обеспечения баз данных Oracle. Эта программа сегодня состоит из трех
уровней сертификации, зависящих от уровня вашего владения
предметом. Она представляет кульминацию запросов
множества людей, желающих получить объективные стандарты администрирования
баз данных Oracle — одного из самых "горячих" рынков на софтверном поле.
Наличие на рынке подобной сертификации означает, что Oracle реально
открывает путь к карьерному росту. Oracle является сформировавшимся,
надежным и стабильным продуктом для управления информацией в масштабе
крупного предприятия. Однако корпорациям, сталкивающимся с серьезной
нехваткой квалифицированных профессионалов в области Oracle, необходим
механизм для измерения квалификации специалистов.
Уровень сертификации ОСА является начальным уровнем для АБД и
состоит из двух тестов в следующих областях Огас1е9г. SQL и Основы АБД I. Заметим,
что в действующую сегодня программу экзаменов входят все версии Oracle,
вплоть до Огас1е9/. На момент издания этой книги каждый из тестов состоял
примерно из 60 вопросов, относящихся к рекомендованному использованию
баз данных Oracle, с несколькими вариантами ответа на них. На сдачу каждого
экзамена отводится 90 минут. Для получения сертификации на уровень Огас1е9/
ОСА АБД необходимо выдержать оба экзамена. Эта книга поможет вам
подготовиться к обоим экзаменам — Oracle9/ SQL и Основы АБД I.
Зачем нужна сертификация?
Если вы только еще собираетесь стать профессионалом в области Oracle, вы
можете задать себе вопрос: "Зачем мне нужно получить сертификацию?"
Программа Oracle Certification Program предлагает признаваемый всей отраслью
эталонный тест ваших навыков и удостоверение о сертификации —
верительную грамоту, которая мгновенно повышает престиж вашего резюме. Хотя
никто не скажет вам в глаза, что вы не знаете Oracle, только потому, что в вашем
резюме не говорится, что вы имеете соответствующий сертификат. Имеющий
всеобщее признание сертификат поможет вам доказать, насколько вы знаете
Oracle, не проходя специального технического собеседования (или, как
принять говорить сейчас, интервью). Когда сертификат Oracle только начал свое
распространение, мы задали себе вопрос об его истинной ценности. Мы были
сильно удивлены, когда обнаружили, что после многих лет использования
Oracle, разработки приложений для Oracle и администрирования баз данных
Oracle в компаниях, входящих в список Fortune S0O, имеется довольно много
' связанных с Oracle тем, которых мы не знаем. И единственной причиной,
почему мы знаем их сейчас, стало то, что мы потратили время и силы и получили
сертификацию.
Если вы ищете другие причины, по которым необходима сертификация,
обратите внимание на опыт компьютерных профессионалов со знаниями в
области Novell NetWare в конце 1980-х и начале 1990-х гг. Когда мысленно
возвращаешься в те времена, кажется, что любой человек с минимальными
познаниями относительно технологий Novell мог рассчитывать на
фантастические предложения работы. Затем в Novell ввели программы
сертификации CNE/CNA. Сначала наниматели были согласны брать на работу
любых профессионалов, независимо от того, есть у них сертификат или нет.
Однако по прошествии некоторого времени наниматели прекратили искать
компьютерных профессионалов с опытом работы с Novell NetWare; теперь
они уже искали людей с сертификатами CNE и CNA. То же самое
происходило и с Microsoft Windows NT, где наличие сертификата MCSE стало
стандартом, в соответствии с которым профессионалы сравнивали и оценивали свои
навыки. Более того, в связи с последним спадом в управляемой
современнейшими технологиями экономике США появилась возможность
принудительного изменения рынка вакансий в области информационных технологий
(ИТ). Если вы хотите оставаться компетентным в области администрирования
или разработок для баз данных Oracle, вы должны задавать себе вопрос не о
том, зачем нужно проходить сертификацию, а о том, когда ее лучше пройти.
Если вы никогда не занимались разработками или управлением базами
данных Oracle или решили связать свою карьеру с продуктами Oracle, сейчас
самое подходящее для этого время. После введения трехуровневой
сертификации — ОСА, ОСР и ОСМ — программа сертификации стала просто идеальной
для любого новичка, только что вступившего на это поприще и решившего
серьезно заняться Oracle. Предоставляя самый нижний уровень сертификации
(ОСА), который лучше других подходит младшим (начинающим) членам
команды Oracle, эта программа открывает прямой путь к достижению более
широкого диапазона навыков — программ ОСР и ОСМ. Программа Oracle
Certification Program уже изменила "правила игры" для АБД и разработчиков,
сместив фокус задаваемых при приеме на работу вопросов со "Сколько лет вы
работаете с этими продуктами?" на "Знаете ли вы, как ими пользоваться?".
При таком подходе в выигрыше оказываются и организации, использующие
Oracle, и профессионалы, использующие Oracle, потому что акцент стал
делаться на навыки, а не на стаж работы.
Менеджеры, которым приходится сталкиваться с задачами приема на
работу профессионалов Oracle, тоже могут теперь вздохнуть с облегчением. За счет
отбора профессионалов, сертифицированных именно по тому уровню,
который необходим организации, они могут затрачивать намного меньше времени
на определение кандидатов, обладающих требующимися навыками для
работы с Oracle, и уделять намного больше времени оценке характера поведения
кандидата и его совместимости с командой.
Совет Экзаменационные задания для обоих экзаменов ОСА — SQL и
Основы АБД I — можно найти в начале глав 1 и 10 соответственно.
Как готовиться к экзаменам?
Если вы используете свое свободное время для знакомства с тем, как работает
опция, позволяющая Oracle удалять файлы базы данных после заданной вами
команды DROP TABLESPACE, то вполне вероятно, что вы уже готовы к сдаче
экзаменов ОСА. Для всех остальных корпорация Oracle и другие компании
предлагают классные комнаты и курсы по изучению Oracle с помощью компьютеров.
Сейчас вам предлагается еще одна возможность — эта книга! Выбрав нашу книгу,
вы уже продемонстрировали два прекрасных качества: во-первых, вы стали на
путь, ведущий к прекрасной карьере, связанной с использованием продуктов
Oracle, и, во-вторых, вы позаботились о том, чтобы тщательно и правильно
подготовиться к экзаменам. И кстати, опция, позволяющая Oracle удалять файлы
базы данных после того, как вы удалили табличное пространство, называется
Oracle-Managed Files, и именно про нее особенно часто задают вопрос на
экзамене курса ОСА Отас1е9п Основы АБДI. Об этой опции, а также о тысячах других
опций будет подробно рассказано в предлагаемой вашему вниманию книге,
чтобы помочь подготовиться к экзаменам ОСА и успешно сдать их.
Прошлое и настоящее сертификации АБД
Сертификация специалистов по Oracle началась в середине 1990-х годов.
Первыми приступили к сертификации в компании Chauncey Group International,
подразделении компании Educational Testing Service. С помощью многих АБД
Oracle компании Chauncey удалось скомпилировать объективный, основанный
на фактах и сценариях экзамен по администрированию баз данных Oracle. Этот
тест в свое время отлично зарекомендовал себя при измерении знаний в
области Огас1е7 для версий с 7.0 до 7.2. Экзаменационные материалы компании
Chauncey, состоявшие из 60 вопросов, охватывали несколько различных тем, в том
числе резервное копирование и восстановление, безопасность,
администрирование и настройку производительности, причем все это в рамках одного теста.
Следующий шаг, предпринятый корпорацией Oracle, заключался в
дальнейшем развитии сертификации АБД в связи с приходом ОСР (которая ранее
называлась Oracle Certified Professional). Сертификация по этой программе
состояла в основном из четырех тестов по 60 вопросов в каждом. Увеличив в четыре
раза количество вопросов, на которые нужно было ответить соискателю, Oracle
показала, что требует от соискателя непревзойденной глубины знаний в
области администрирования баз данных Oracle. Кроме того, Oracle подтвердил, что
будет включать в экзамены по ОСР вопросы сценарного плана (scenario-based
questions), поэтому в предлагаемую вашему вниманию книгу включены и
подготовительные материалы по этим новым вопросам. Вопросы сценарного плана
требуют от вас не только знания относящихся к Oracle фактов, но и понимания
того, как можно применить эти факты в ситуациях из реальной жизни.
С выпуском экзаменов для Огас1е9/ корпорация Oracle сделала еще один
шаг вперед в развитии программы сертификации, признав, что отрасли
требуются сертифицированные профессионалы всех уровней, начиная с
начинающего администратора (помощника администратора — ОСА), продолжая
опытными экспертами уровня ОСР и заканчивая экспертами, так сказать,
корпоративного уровня — ОСМ. Чтобы стать ОСА, кандидат должен сдать
следующие экзамены:
■ Введение в Огас1е9»: SQL (1Z0-O07)
■ База данных Огас1е9/: Основы I (1Z0-031)
После получения статуса ОСА и приобретения дополнительных навыков и
возможностей благодаря своей практической деятельности и обучению
растущие и не желающие останавливаться в своем росте профессионалы в области
Oracle могут получить статус ОСР. Для этого им требуется сдать два экзамена:
■ База данных Огас1е9/: Основы II (1Z0-032)
■ База данных Oracle9i: Настройка производительности (1Z0-033)
Уровень сертификации ОСМ является кульминационным пунктом,
венчающим многие годы практической деятельности и непрерывной подготовки и
обучения. Чтобы дойти до этой точки, вы должны сначала пробиться через
уровни ОСА и ОСР, пройти два дополнительных расширенных курса
обучения в Oracle University, а затем сдать практический тест (непосредственно
представителям Oracle). Но как и всякий длинный путь, это восхождение
начинается с первого шага — с получения степени ОСА.
Завершающим вкладом Oracle в дело развития сертификации является
обязательство пересматривать и обновлять материалы, представленные в
сертификационных экзаменах. АБД, имеющим сертификаты Oracle, необ-
XXI
ходимо поддерживать действие своей сертификации, периодически
повторно сдавая сертификационные экзамены. Это означает, что
сертифицированные профессионалы всегда будут находиться на переднем крае
технологий баз данных Oracle, чего нельзя будет сказать о тех, у кого такой
сертификации нет.
Следующие шаги
Теперь давайте рассмотрим интерфейс, с которым вам придется встретиться в
день экзамена. На рис. 1.1 приведен пример графического интерфейса
пользователя (ГИП) реального теста. В верхней части экрана приводится
информация о том, сколько времени осталось до конца экзамена и на какое количество
вопросов вы уже ответили. Флажок в левом верхнем углу экрана можно
использовать для того, чтобы отмечать те вопросы, на которые вы желаете ответить
позже. В главном окне интерфейса находятся текст очередного
экзаменационного вопроса и возможные варианты ответов на него. Вообще говоря,
интерфейс позволяет кандидату выбрать только один вариант ответа (за
исключением случаев, когда в вопросе непосредственно указывается, что следует дать
большее число ответов). В подобном случае интерфейс не воспрепятствует вам
выбрать столько ответов, сколько требуется для этого вопроса. После ответа
на вопрос (или после того как вы отметили, что желаете вернуться к нему
позже) можно перейти к следующему (Next) вопросу, щелкнув по
соответствующей кнопке в нижнем левом углу экрана. Для возврата к предыдущему
вопросу достаточно щелкнуть по размещенной там же кнопке Previous.
Нам осталось рассказать только о кнопке Exhibit. В некоторых случаях вам
может понадобиться использовать приложение, содержащее дополнительную
информацию из базы данных, которая может оказаться полезной при ответе
на вопрос. Если для ответа на вопрос не требуется дополнительной
информации, эта кнопка будет отмечена как недоступная.
После того как вы закончили ответы на все вопросы экзамена, интерфейс
Sylvan Prometric отобразит перечень всех выбранных вами ответов, как это по-
Пример
экзаменационного
интерфейса компании
Sylvan Prometric
Отметьте вопрос
для возврата
к нему позже
Количество
оставшихся
вопросов
□ Отметьте вопрос
Вопрос 1 из 60
Осталось 1:29
Выберите наилучший ответ на следующий вопрос
Как называется столица штата Флорида?
О А. Орландо
о В.Майами
О С. Джексонвилль
о О.Таллахасси
^радндуи»^
Спешащий!
I | Просмотр]
ГТТТ"
Перейти Перейти Просмотреть
к предыдущему к следующему приложение
вопросу вопросу
Просмотреть Выйти без подсчете
все ответы набранных баллов
казано на рис. 1.2. Вопросы, отмеченные вами как те, к которым нужно
вернуться, будут выделены, и интерфейс поможет вам просмотреть все отмеченные
вопросы. Если вы не желаете возвращаться к отмеченным вопросам, можно
просто предложить Sylvan Prometric оценить сданный экзамен:
Оценка теста указывает на качество выполнения вами теста в специальном
окне оценки, например в таком, как изображено на рис. 1.3. Вам покажут (в
разбивке по разделам теста), как вы отвечали на вопросы по тематике,
опубликованные в изданном Oracle руководстве кандидата (Candidate Guide).
Столбчатая диаграмма показывает, в каком соотношении с максимально
возможными для экзамена баллами находятся набранные вами баллы. Программа
приема экзаменов показывает набранные вами баллы сразу после того, как вы
выйдете из экрана просмотра ответов, так что вы немедленно узнаете,
выдержали вы испытание или нет. Вы имеете возможность напечатать отчет о
набранных вами баллах.
С появлением курса ОСА Oracle имеет возможность предложить
соискателям экзамен по SQL (1Z0-007) как в онлайновом формате, так и в формате
экзамена с преподавателем. Мы рекомендуем вам посетить сайт www.orac-
le.com/education/ceitification, где можно найти подробное описание, как сдать
экзамен в онлайновом режиме.
Стратегии для улучшения результатов экзамена
Когда появился первый выпуск экзамена на ОСР, количество баллов,
набранных в процессе сдачи каждого экзамена, находилось в диапазоне от 200 до 800.
Однако впоследствии Oracle отказалась от оценки результатов в баллах и в
порядке эксперимента стал сообщать соискателям только общее число вопросов,
на которые был дан правильный ответ. Практический результат при этом
остался тем же самым. Так как в экзамене обычно насчитывается 60 вопросов,
для того чтобы успешно пройти экзамен, вы должны правильно ответить не
Пример интерфейса
ответов на вопросы
Sylvan Prometric
Вопросы, отмеченные
для возврата к ним
1. Д
2. В
3. А
4. А]
5. Д
6. Д1
7. А
8. А
9. А
10.Д
Просмотр ответов
Осталось 1:29
11. А
12.Д
13. Д
14. Д
15.Д
16. Д
17. Д
18.Д
19.ДЦ
20. Д
21. Д
22. Д
23. Д
24. Д
25. Д
26. Д
27. Д
28. Д
29. Д
30. Д
31.Д
32. Д
33. А
34. Д
35. Д|
36. Д
37. Д
38. Д
39. Д
40. Д
41. Д
42. А
43. Д|
44.Д
45. Д
46. А
47. Д
48. Д
49. Д
50. А1
51. А
52. А |
53. Д
54. Д
55. Д
56.Д
57. А
58. Д |
59. Д
60. Д
Просмотреть
отмеченные
вопросы
Т=Т
п
Перейти к | Оценить тест |
Выйти без подсчета
набранных баллов
Просмотреть Просмотреть Оценить Выйти без подсчета
все отмеченные отдельные результаты набранных баллов
вопросы вопросы экзамена
XXIII
Оценка экзамена
Пример интерфейса
оценки экзамена
Sylvan Prometric
1
Ваши баллы
Проходной
балл
Примите наши поздравления! Вы прошли тест
РотЗимса. нвврвнных баллов по разделам
Столица Флориды——»-——•————.—8 от 12 |
Фактические данные о Флориде..-—.............—12 of 12 I
Когда во Флориде "—.——••—•••"..•..... Т 0 от 12 ^
Некоренное население Флориды — -1 О of 12 |
Экология Флориды...............—. 11 of 12 J
Разделы
Распечатать результаты экзамена I
Выход
Печать
Выход
менее чем на 75% вопросов, или на 45 вопросов. На сайте www.oracle.com/edu-
cation/certffication можно ознакомиться с новейшей информацией о
проходном балле — Oracle постоянно публикует новые версии экзамена, и вследствие
этого проходной балл может измениться. Кроме того, экзамен Основы I имеет
две модификации — базовый (Basic) и мастерский (Mastery), у которых
процент правильных ответов (проходной балл) разный. Если на вопрос требуется
дать два или даже три правильных ответа, вы должны быть особенно
внимательны и выбрать при ответе на такой вопрос все правильные ответы, иначе вы
не получите полного балла за правильный ответ. Штрафные очки за
неправильные ответы не начисляются.
Теперь мы сформулируем для вас несколько предварительных замечаний,
относящихся к сдаче экзамена. Наш первый совет: не ждите, пока вы станете
самым крупным в мире авторитетом по Oracle. Если оценивать ваш
экзаменационный балл по той шкале, которая использовалась в первых выпусках
экзамена, то проходной балл для всех экзаменов будет равен примерно 650. Вы
должны ответить правильно на 45—50 вопросов, или примерно на 75—80%
экзаменационного материала. Так что, если вы отвечаете правильно на четыре
из пяти вопросов оценочного теста или тестов, размещенных^ главах нашей
книги (кое-что о формате глав мы сообщим вам чуть ниже), вам стоит
попробовать держать экзамен. Помните, что вы получите заветный сертификат, если
наберете примерно от 77 до 96% правильных ответов.
Во-вторых, если вы не можете ответить на вопрос в течение 30 секунд,
установите флажок, который находится в левом верхнем углу экрана ОСР,
чтобы вернуться к нему позже. Наиболее существенное различие между
внешним видом интерфейсов реального экзамена и оценочного теста заключается в
специальном экране, появляющемся после того, как вы ответите на все
вопросы. На этом экране отображаются все ваши ответы. Рядом с вопросами,
которые вы отметили для того, чтобы впоследствии вернуться к ним, помещается
специальный индикатор. Здесь же имеется специальная кнопка, на которой
нужно щелкнуть мышью для того, чтобы вернуться к отмеченным вопросам.
Мы советуем вам активно пользоваться этой возможностью. Если на первую
попытку ответить на вопрос вы будете тратить не более 30 секунд, у вас
останется по крайней мере час времени на более тщательное рассмотрение
вопросов, в которых вы не уверены, и будет дополнительный бонус, так «как вы
твердо знаете, что уже ответили на все вопросы, кажущиеся вам самыми легкими.
В-третьих, за попытку угадать правильный ответ не начисляются штрафные
очки. Если вы правильно отвечаете на вопрос, ваша сумма баллов
увеличивается, если нет, то сумма просто не увеличивается. Если вы можете отбросить все
неверные варианты ответа, вы должны использовать этот шанс для
увеличения числа набранных вами баллов. На некоторые вопросы требуется указать
два или даже три варианта ответа; это также работает на вас, так как в
подобных случаях для правильного ответа на вопрос нужно отбрасывать меньшее
число вариантов ответа.
Замечание об обновлениях и исправлении ошибок
Всю подобного рода информацию — сведения о внесенных обновлениях,
исправлениях и расширениях для всех книг издательства Oracle Press — вы можете
найти на сайте www.OraclePressBooks.com. Почаще наведывайтесь на этот
сайт, так как там постоянно появляется что-то новое. Удачи вам в борьбе за
звание ОСА и наилучшие пожелания в вашей карьере на ниве Oracle!
ЧАСТЫ
Подготовка к первому экзамену
на ОСА для АБД:
введение в SQL
Часть I
Введение в цели экзамена по SQL для Oracle9/
Первый экзамен по программе ОСР для АБД и разработчиков посвящен
основным правилам использования языка программирования SQL для
взаимодействия с базой данных Огас1е9/. В приведенном ниже списке
перечисляются все задания и цели ОСР для этого экзамена. Предлагаемая информация
получена из опубликованного для этого экзамена корпорацией Oracle
документа ОСР Candidate Guide (Руководство соискателя ОСР). Этот документ
можно найти на сайте www.oracle.com/education/certification:
1. Написание базовых операторов SQL — select
1.1. Перечислите основные возможности операторов SQL select
1.2. Выполните основной оператор select
1.3. Укажите отличия между командами SQL и SQL'Plus
2. Ограничение и сортировка данных
2.1. Ограничьте количество строк, возвращаемых запросом
2.2. Отсортируйте строки, возвращенные запросом
3. Однострочные функции
3.1. Опишите различные типы имеющихся в SQL функций
3.2. Использование текстовых и числовых функций и функций
типа даты в операторах выборки
3.3. Использование функций преобразования
4. Отображение данных из нескольких таблиц
4.1. Напишите операторы select для доступа к данным более
чем из одной таблицы с использованием соединений по
равенству и неравенству
4.2. Просмотр не удовлетворяющих условиям объединения
данных с помощью внешних соединений
4.3. Соедините таблицу саму с собой, используя
самосоединение
5. Агрегирование данных с использованием групповых функций
5.1. Идентифицируйте имеющиеся групповые функции
5.2. Использование групповых функций
5.3. Группировка данных с помощью фразы group by
5.4. Включите или исключите сгруппированные строки,
используя фразу having
6. Подзапросы
6.1. Опишите типы проблем, которые можно разрешить
с помощью подзапросов
6.2. Дайте определение подзапроса
6.3. Перечислите типы подзапросов
6.4. Напишите однострочные и многострочные подзапросы
7. Как с помощью SQL*Plus сделать выходные данные
удобочитаемыми
7.1. Создайте запросы, использующие подстановочные
переменные
7.2. Создайте удобочитаемую форму представления выходных
данных
7.3. Создайте и выполните файл сценария
8. Манипулирование данными
8.1. Опишите каждый оператор DML
8.2. Вставка строк в таблицу
8.3. Обновление строк в таблице
8.4. Удаление строк из таблицы
8.5. Объединение строк таблицы
8.6. Управление транзакциями
Подготовка к первому экзамену на ОСА для АБД
3
9. Создание таблиц и управление ими
9.1. Опишите основные объекты базы данных
9.2. Создание таблиц
9.3. Опишите типы данных, которые можно использовать
при специфицировании определений столбцов
9.4. Изменение определения таблиц
9.5. Удаление, переименование и усечение таблиц
10. Включение ограничений
10.1. Описание ограничений
10.2. Создание и сопровождение ограничений
11. Создание представлений
11.1. Описание представлений
11.2. Создание,, изменение и удаление представлений
11.3. Выборка данных через представления
11.4. Операторы вставки (insert), обновления (update)
и удаления (delete) данных через представления
11.5. Создайте и используйте встроенное представление
11.6. Выполните анализ "первые N" (top-N)
12. Создание других объектов базы данных
12.1. Создание, сопровождение и использование
последовательностей
12.2. Создание и сопровождение индексов
12.3. Создание частных и общедоступных синонимов
13. Контроль доступа пользователей
13.1. Создание пользователей
13.2. Создание ролей для облегчения создания
и сопровождения модели безопасности
13.3. Использование операторов grant и revoke
ГЛАВА 1
Обзор баз данных Oracle
Обзор баз данных Oracle
5
этой главе мы познакомимся со следующими областями, а
потом и продемонстрируем свои знания по ним:
■ Обзор баз данных Oracle
■ Выборка данных из Oracle
Первый экзамен из серии ОСР требует от вас понимания
основных вопросов использования и проектирования баз данных. Каждый
пользователь, разработчик или АБД Oracle должен в совершенстве овладеть
этими вопросами, прежде чем переходить к следующим разделам теста. Для
знакомства с этим блоком вопросов от вас не требуется или почти не требуется
знаний по Oracle, но освоив этот блок вопросов, вы превращаетесь из
человека, никогда ранее не использовавшего Oracle, в человека, имеющего
достаточно опыта и знаний о серверных продуктах Oracle для сопровождения и
усовершенствования имеющихся приложений и разработки небольших новых
приложений. В этой главе состоится наше знакомство с Oracle и будут
рассмотрены основные аспекты выборки данных из баз данных Oracle.
Материалы, которые будут рассмотрены в этой главе, составляют
примерно 8% содержания первого экзамена программы ОСР.
Следуйте за нами со своей базой данных! По мере нашего продвижения по
этой главе вы будете сталкиваться с примерами заданных для базы данных
Oracle операторов SQL. По большей части вы можете повторить эти примеры
на собственной работающей базе данных. Если приведенные ниже
инструкции звучат для вас, как на иностранном языке, покажите эту страничку
вашему АБД Oracle и попросите его (или ее) о помощи:
1. В режиме командной строки на машине, где установлено программное
обеспечение Oracle, измените каталог на $ORACLE_HOME/rdbms/admin.
S. Войдите в Oracle как привилегированный пользователь, например SYSTEM,
которому разрешено создавать других пользователей.
3. Задайте команду Sutlsampl. sgl. По этой команде будет выполнен
сценарий utlsampl. sgl, создающий объекты, которыми владеет пользователь
scott/tiger и которые будут использоваться в примерах в остальной
части книги.
4. Если вы имеете некоторые навыки работы с Oracle и желаете использовать
собственное имя пользователя и пароль, а не прибегать к услугам
пресловутого пользователя scott/tiger, вы можете выполнить сценарий
demobld.sql ИЗ директории $ORACLE_HOME/sqlplus/demo, если ВЫ
ВОШЛИ в Oracle под именем, отличающимся от scott.
Совет В некоторых наиболее тривиальных примерах этой главы могут
использоваться таблицы, которые не были созданы в процессе выполнения
утилиты utlsampl. sql. Такие примеры специально помечены в тексте.
Сценарии для создания подобных примеров отсутствуют. Если вы желаете
использовать эти таблицы, их следует создать самостоятельно.
Инструкции по созданию таблиц можно найти в главе 5.
Обзор Oracle
В этом разделе для обзорного знакомства с базами данных Oracle
рассматриваются следующие вопросы:
И Теоретические и физические аспекты реляционных баз
данных
■ Реализации РСУБД и ОРСУБД Oracle
И Использование PL/SQL и его преимущества
Добро пожаловать в мир баз данных Oracle! Хотя этот раздел и не имеет
прямого отношения к официальным задачам экзамена, в нем вы найдете
очень много вводного материала, который может оказаться полезным для зна-
6
Глава 1
комства с Oracle при подготовке к использованию запросов для получения
данных из базы данных. Прежде чем с головой уйти в подробности
функционирования программного обеспечения Oracle, многим читателям, никогда
ранее не имевшим дела с Oracle, будет полезно ознакомиться с этим материалом
для получения общего представления о нем. Если вы относитесь к их числу,
смело можете приступать к чтению! Даже если вы уже большой дока по части
использования Oracle SQL, все равно вы можете захотеть бегло просмотреть
этот материал, прежде чем идти дальше, особенно если раньше вам не
приходилось сталкиваться с обзорными материалами по программному
обеспечению Oracle. Сначала мы поговорим о некоторых основных аспектах
теоретической и физической стороны реляционных баз данных, а также о
реализациях РСУБД и ОРСУБД Oracle. Кроме того, речь пойдет об
использовании и преимуществах PL/SQL — собственного языка корпорации Oracle,
используемого для разработки приложений базы данных, которые хранятся и
выполняются непосредственно внутри базы данных Oracle.
Теоретические и физические аспекты реляционных
баз данных
Корни Oracle лежат в теории реляционных баз данных, начала которой были
заложены в 1950-е гг. в работах Е. Ф. Кодда и которая впоследствии была
распространена на бесконечное число таких направлений, как работа с
хранилищами данных, онлайновая обработка транзакций и приложения,
поддерживающие работу в Web. Без сомнения, завоеванная этим программным
обеспечением популярность является одной из причин того, что вы держите в
руках эту книгу. В этой книге есть ответы на все вопросы, которые вы можете
задать: что такое база данных Oracle, как она работает и что можно сделать с ее
помощью. Ответы на все эти вопросы потребуются вам для того, чтобы
выдержать первый экзамен: введение в SQL.
Занимающиеся разработкой программного обеспечения компании
используют много различных подходов к управлению информацией. На протяжении
многих лет наиболее популярные софтверные пакеты для хранения и выборки
данных использовали в качестве основного средства хранения данных
системы простых (или, как их иногда называют, плоских) файлов. При этом выбор
того, как именно хранится и выбирается информация, оставался за вами, а в
качестве языка программирования обычно использовался COBOL. В
некоторых ранних разновидностях систем плоских файлов использовались
иерархические системы хранения, где записи данных хранились в иерархическом
виде, подобном той иерархической структуре каталогов, которую можно
увидеть в окне Windows Explorer, например для жесткого диска вашего ПК. Такие
приложения выполнялись на мэйнфреймах, а среди широко известных
торговых марок можно выделить IMS — иерархическую систему корпорации IBM и
IDMS — сетевую систему компании Computer Associates. Наиболее часто
употреблявшимся в этих системах для разработки механизмов добавления данных
и управления ими языком программирования был, как мы уже говорили,
COBOL.
Такие системы с плоскими файлами прекрасно подходили для
определенных задач, например для создания отношений типа "родитель-потомок". Эти
отношения могли, к примеру, использоваться для представления отношений
между сотрудниками отдела продаж компании, занимающейся дистрибуцией
пищевых продуктов, и клиентами компании. Еще одним примером отношения
"родитель-потомок" может служить отслеживание номеров счетов и их связи с
позициями номенклатуры продукции в заказах клиентов этой дистрибьютор-
ской продовольственной компании. Однако один из недостатков таких систем
плоских файлов был следствием того, что отношения "родитель-потомок" не
могли моделировать все возможные типы взаимосвязей данных. В приведенном
выше примере с продовольственной компанией в заказе пользователя могло
быть перечислено много различных продуктов. Каждый из этих продуктов сам
по себе может появляться во многих различных заказах. Как в этом случае,
который принято называть отношением "многие продукты во многих заказах",
Обзор баз данных Oracle
7
следует проектировать иерархию? Какой объект следует использовать в
качестве родителя, а какой — в качестве потомка? Обычное решение заключалось в
создании двух отдельных иерархий: одной, где в качестве родителя выступает
продукт, и другой, где в этой же роли используется заказ. К сожалению, это
зачастую означает сопровождение во многом совпадающей информации в двух
местах (или в большем количестве мест), что приводит к появлению
избыточных данных. Поддержание согласованности данных в нескольких местах
хранения делает хранение и выборку данных сложной задачей. Еще один
существенный недостаток иерархических баз данных, использующих систему плоских
файлов, заключается в том, что их довольно трудно адаптировать к изменению
бизнес-потребностей предприятия. Если дистрибьютор продовольствия создаст
у себя новую систему продаж, которая предусматривает возможность
совместного владения учетными записями клиентов несколькими сотрудниками
отдела продаж, компании потребуется заново проектировать иерархическую базу
данных.
Мотивируя свои исследования неудовлетворенностью громоздкими
характеристиками иерархических баз данных, состоящих из плоских файлов,
Е. Ф. Кодд, ученый-компьютерщик, работавший в 1930-е гг. на IBM,
разработал альтернативу — реляционную модель. Вместо хранения данных в
иерархиях Кодд предложил хранить связанные элементы данных, например
контрольные номера и заказанные продукты, в таблицах. Как обнаружил
Кодд, если эти таблицы спроектированы в соответствии с несколькими
простыми принципами, они будут понятными и чрезвычайно
эффективными для хранения данных. Один элемент данных может храниться только в
одном месте. По прошествии некоторого времени многие производители
программного обеспечения поняли всю значимость работы Кодда и начали
разрабатывать продукты, соблюдающие модель Кодда. Начиная с 1980-х гг.
практически все софтверные продукты для баз данных (включая Oracle)
соответствуют реляционной модели.
Главным элементом, принесшим успех реляционной модели, является
использование для хранения и выборки данных и манипулирования ими
реляционной системы управления базами данных (РСУБД). При использовании
более ранних продуктов организациям для кодирования механизмов
управления процедурами выборки данных, которые непосредственно
взаимодействуют с файлами базы данных, приходилось иметь в штате множество
программистов на языке COBOL. В противоположность этому механизму РСУБД
обрабатывает такие задачи автоматически, используя для этого
функциональный язык программирования SQL (произносится либо как "сиквел", либо со-
глано произношению каждой буквы: Эс-Ку-Эль). SQL означает "Structured
Query Language — язык структурированных запросов", и с его помощью
пользователи могут делать запросы к требующимся им данным в соответствии со
строгими критериями сравнения. К примеру, если вы желаете для сотрудника
по фамилии SMITH проверить идентификационный номер (ID) и
информацию о его заработной плате, вам поможет сделать это следующий оператор
SQL:
SQL> SELECT EMPNO, ENAME, SAL FROM EHP
2 WHERE ENAME = 'SMITH';
Совет Предшествующий блок был взят непосредственно из SQL*Plus —
инструментального средства, предоставляемого корпорацией Oracle для
взаимодействия со своими базами данных. Символ "2", означающий, что вы
начали ввод второй строки, записывается SQL*PIus автоматически. Вы не
должны пытаться ввести этот символ ."2" собственноручно. Сейчас вас не
должно волновать, что на самом деле означает этот оператор SQL или
какими должны быть его результаты; просто поймите, что перед вами
пример оператора SQL.
В системе, оставаясь, так сказать, за кулисами, РСУБД транслирует этот
оператор в последовательность операций, которые выбирают информацию из
файлов, размещенных на машине, где хранится ваша база данных. Этот шаг
8
Глава 1
называется анализом или раэбором (parsing). По окончании раэбора РСУБД
выполняет ряд операций для завершения требующихся действий.
При этом могут быть выполнены некоторые (или все) операции из
приведенного ниже списка (порядок их выполнения может быть
произвольным):
■ Неявное преобразование типов
■ Поиск по индексам (в случае необходимости) для сокращения времени
реакции системы
■ Операции чтения с диска или записи на диск
■ Фильтрация данных таблицы в соответствии с критериями поиска
■ Сортировка и форматирование возвращаемых данных
Совет Индексом называется специальный объект базы данных, который
может быть использован для повышения производительности конкретных
операций РСУБД. Типом данных (datatype) называется определение типа
данных (data type), хранящихся в столбцах таблицы. Более подробно речь об
индексах будет идти в следующих главах.
РСУБД против систем плоских файлов:
быстрое ознакомление
В таблице 1.1 проводится сравнение систем с плоскими файлами и
реляционных систем управления базами данных.
Таблица 1.1. Сравнение реляционных баз данных с другими системами управления
данными
Задача
Обрабатывает отношения "родитель-потомок"?
Обрабатывает другие типы отношений?
Легко ли справляется с манипулированием
данными?
Легко ли адаптируется к изменению бизнес-
потребностей?
Легко ли справляется с выборкой данных?
Быстро ли выполняет выборку данных?
Система с плоскими
файлами
Да
Не слишком
Нет
Нет
Иногда
Иногда
хорошо
РСУБД
Да
Да
Да
Да
Да
Иногда
Закрепление пройденного материала
1. Какие задачи выполняет за кулисами РСУБД, когда пользователи
запрашивают определенного рода данные?
S. Убедитесь, что можете описать характеристики, преимущества и
недостатки систем с плоскими файлами и реляционных систем управления базами
данных.
Упражнения
1. Вы исследуете теоретические аспекты РСУБД Oracle. Какой из четырех
вариантов выбора идентифицирует аспект управления данными, который
РСУБД Oracle не обрабатывает от вашего имени?
A. Преобразование типов данных
B. Чтение с диска ^
Обзор баз данных Oracle
9
С Сортировка и форматирование возвращаемых данных
D. Определение требующейся информации через SQL
S. Вы производите оценку использования Oracle для замены в вашей
организации унаследованных дореляционных систем. Если сравнивать с РСУБД
Oracle, то с каким из перечисленных ниже аспектов дореляционные
системы баз данных справлялись так же хорошо, как и их реляционные аналоги?
A. Отношения "многие ко многим"
B. Отношения "родитель-потомок"
С Адаптируемость к изменению бизнес-потребностей
D. Манипулирование данными
3. Как звали того ученого, который первым концептуализировал
использование реляционных систем управления базами данных?
Ответы
1. Р. 2. В. 3. Е. Ф. Кода
Реализации РСУБД и ОРСУБД Oracle
Хотя каждая реляционная база данных предлагает собственную РСУБД,
которая воспринимает в основном одни и те же типы операторов SQL, не все базы
данных имеют одинаковые компоненты. База данных Oracle значительно
сложнее, чем многие базы данных для ПК, с которыми вам приходилось
сталкиваться, например Microsoft Access или даже SQL Server. Компоненты базы
данных Oracle можно разделить на три основные области, соответствующие
трем основным областям тех хост-машин, на которых выполняется база
данных Oracle. Советуем в этом разделе обратить особое внимание на то, как
каждый компонент каждой части базы данных Oracle взаимодействует с
компонентами других частей. На рис. 1.1 показаны различные части базы данных
Oracle, знание которых самым тщательным образом проверяется во время
экзамена на ОСР (1Z0-022): Основы администрирования баз данных I. Вот эти
компоненты:
■ Памлъ Глобальную системную область Oracle (System Global Area —
SGA) иногда называют также совместно используемой глобальной
областью (Shared Global Area), потому что эта выделенная память совместно
используется всеми пользователями базы данных Oracle.
■ Диск Файлы данных Oracle, журналы базы данных, управляющие файлы и
файлы параметров. В этих типах файлов содержатся данные, хранящиеся в
базах данных Oracle.
■ Процессы Потоки (нити) фонового процесса oracle.exe (для Windows) или
индивидуальные процессы (UNIX) и процесс сервера. Именно эти
процессы выполняют всю закулисную работу, обеспечивающую надлежащее
функционирование баз данных Oracle.
SGA Oracle
Компонент памяти Oracle — SGA — состоит из нескольких элементов,
каждый из которых предназначен для конкретной цели.
Буферный кэш С помощью буферного кэша Oracle хранит данные для
пользователей в памяти, чтобы они могли просматривать или изменять их.
Таким образом, пользователи никогда не делают изменений непосредственно в
дисковых файлах. Вместо этого Oracle считывает необходимые данные в
память, чтобы процесс пользователя мог изменить их, а затем в какой-то момент
времени записывает их обратно на диск. Модифицированный алгоритм LRU
(алгоритм удаления наиболее давно использовавшихся элементов) испольэу-
10
Глава 1
ется буферным кэшем для определения того момента, когда можно будет
удалить данные из этой области, так как в буферном кэше требуется освободить
место для затребованной пользователем информации. Информация из
буферного кэша может совместно использоваться всеми пользователями,
подключенными в данный момент к базе данных Oracle.
Журнальный буфер В журнальном буфере хранится специальная
информация, которая называется информацией для повторного выполнения операций
(redo) и используется Oracle для помощи при реконструкции изменений в
данных в случае отказа системы. Информация для повторного выполнения
операций записывается в журнальный буфер пользователями, выполняющими
изменения в данных, и хранится в нем до тех пор, пока Oracle не сможет
записать информацию для повторного выполнения операций на диск.
Разделяемый пул В разделяемом пуле хранятся многие элементы,
являющиеся стратегически важными для функционирования базы данных Oracle.
Компонентами разделяемого пула являются библиотечный кэш, словарный
кэш, а также фиксаторы (latches) и другие механизмы управления базой
данных. Библиотечный кэш используется для хранения разобранных операторов
SQL, чтобы их могли повторно использовать другие пользователи. Словарный
кэш, или кэш строк, используется для хранения информации из словаря
Oracle в оперативной памяти, где к ней можно быстро обратиться.
Совет Словарем данных Oracle называется набор информации, хранящийся
в среде Oracle и содержащий все наиболее важное относительно базы
данных. Словарь данных часто используется как пользователями, так и
процессами Oracle, так что для достижения высокой общей производительности
базы данных важно всегда, когда это возможно, хранить информацию
словаря в оперативной памяти. Отсюда становится очевидной необходимость
размещения словарного кэша в разделяемом кэше.
Большой пул Четвертым и наименее часто используемым компонентом
Oracle SGA является так называемый большой пул, представляющий большую
выделенную область памяти, используемую для поддержки операций Oracle по
резервному копированию и восстановлению, серверных процессов
ввода-вывода и сеансовой памяти для разделяемого сервера. Этот впервые появившийся в
Огас1е8 компонент является необязательным для работы базы данных Oracle.
Другие области памяти В Огас1е8/ и более поздних версиях имеются и
другие компоненты SGA, например пул Java и большой пул, которые не показаны
на рис. 1.1. Эти элементы не включены в обсуждение и (или) в рисунок, так
как детальное исследование этих вопросов необязательно для сдачи экзамена
ОСР по SQL. Рис. 1.1 и настоящее обсуждение служат для того, чтобы
показать вам общую картину Oracle, перед тем как погрузиться в целенаправленное
обсуждение запросов SQL.
Дисковые компоненты Oracle
В дисковых компонентах Oracle хранятся все виды жизненно важной
информации о вашей базе данных Oracle. Нельзя эксплуатировать Oracle, не имея всех (за
исключением файла паролей) дисковых компонентов.
Файлы данных Этот обязательный дисковый компонент используется для
хранения объектов словаря Oracle и прикладной базы данных. Эти
компоненты иногда очень сильно увеличиваются в размерах. Информация из файлов
данных на дисках попадает в размещенные в оперативной памяти буферный и
словарный кэши. В каждой базе данных Oracle имеется по крайней мере один
файл данных (но обычно их бывает больше). В файлах данных хранятся
данные Oracle. Если вы создаете в Oracle таблицу и заполняете ее строками, Oracle
помещает эту таблицу и строки в файл данных. Каждый файл данных может
быть связан только с одной базой данных.
Обзор баз данных Oracle
11
Архитектура сервера
Oracle
Процесс
прослушивания л
Журнал базы данных Этот обязательный дисковый компонент
используется для хранения на диске информации для повторного выполнения операций.
Со временем туда оказывается записанной информация из буфера журнала в
оперативной памяти. Этот компонент предназначен для записи всех
изменений, выполненных над данными базы данных Oracle. Журналы оказываются
критичными при восстановлении данных в случае отказа базы данных.
Управляющие файлы Этот обязательный дисковый компонент
используется для хранения жизненно важной информации о размещении дисковых
компонент Oracle в хост-системе. Физические адреса файлов данных и
журнальных файлов в файловой системе сервера базы данных хранятся в
12
Глава 1
управляющем файле. База данных Oracle может иметь один или несколько
управляющих файлов. Если имеется несколько управляющих файлов, все они
должны быть абсолютно идентичными. При каждом запуске базы данных
Oracle читает информацию управляющего файла, а при каждом изменении
размещения или добавлении новых файлов данных и журналов базы данных
обновляет управляющий файл.
Файлы паролей Этот необязательный дисковый компонент используется
для защиты информации о подключениях привилегированных пользователей,
чтобы дать возможность управлять базой данных в удаленном режиме через
Enterprise Manager, инструментальное средство Oracle для управления базами
данных. Кроме того, с его помощью контролируется количество
привилегированных подключений к базе данных для управления системой, которые могут
быть произведены в одно и то же время. Если у вас отсутствует файл паролей,
вы можете выполнять администрирование своей базы данных, только
непосредственно подключившись к той машине, где размещена база данных, и
используя для этих целей инструментальные средства управления типа SQL*Plus
(тоже непосредственно с хост-машины).
Файлы параметров Этот обязательный дисковый компонент используется
для конфигурирования действий Oracle во время эксплуатации. Для того
чтобы запустить экземпляр базы данных, Oracle должен прочесть файл
параметров и определить, какие параметры инициализации установлены для этого
экземпляра. В файле параметров содержатся многочисленные параметры и их
установленные значения. Oracle считывает файл параметров при запуске базы
данных. Некоторые профессионалы Oracle называют файл параметров просто
файлом init.ora. Для базы данных можно ввести один или несколько файлов
параметров. При этом каждый из файлов будет соответствовать различным
конфигурациям экземпляра, которые могут быть использованы в различные
моменты времени.
Процесс сервера и фоновые процессы Oracle
Последним подлежащим рассмотрению компонентом Oracle является набор
элементов, из которых состоит Oracle "с точки зрения" процессоров
хост-системы. Серверный процесс Oracle читает данные из файлов данных в буферный
кэш от имени процессов пользователей. Он может быть либо распределенным
(и тогда им совместно пользуется несколько пользователей), либо выделенным
для одного пользователя. Кроме того, в средах Windows база данных Oracle
имеет один фоновый процесс — oracle.exe. Если вы одновременно нажмете на
машине, на которой размещена база данных Oracle, клавиши Ctrl-Alt-Del,
щелкните мышкой по кнопке Task Manager (диспетчер процессов), чтобы
активировать процесс Task Manager, а затем щелкните по закладке Processes
(процессы), то вы увидите, что на вашей машине выполняется процесс
oracle.exe. В средах Windows у этого процесса может быть много нитей,
управляющих разнообразной деятельностью базы данных в фоновом режиме. В Windows
информацию о созданных для использования с программным обеспечением
базы данных Oracle сервисах можно найти, нажав последовательно Start |
Settings | Control Panel. Для NT под иконкой Services будут перечислены все
сервисы (или службы), доступные для этой машины. Для Windows 2000 следует
дважды щелкнуть по иконке Administrative Tools, а затем выбрать в
открывшемся окне иконку Services. На машинах с UNIX Oracle состоит из нескольких
фоновых процессов. Если база данных выполняется на UNIX-мапгане, вы можете
в командной строке компьютера набрать команду ps -fu oracle.
Что такое ОРСУБД
По мере того как завоевывало популярность объектно-ориентированное
программирование, Oracle приспосабливал свою парадигму управления
реляционными базами данных, включая в нее поддержку проектирования
объектно-реляционных баз данных. В эту методологию инкорпорированы (включены) все
Обзор баз данных Oracle
13
лучшие возможности как объектного, так и реляционного программирования.
Она позволяет разработчикам при проектировании систем Oracle черпать
лучшее из обоих методов. К двум лучшим характеристикам из числа объектных
можно отнести следующие:
■ Позволяет пользователям определять структуру данных, которые они
желают хранить
Ш Дает пользователям возможность определять программные методы
манипулирования этими данными и непосредственно ассоциировать эти
методы с хранимыми данными
Закрепление пройденного материала
Запомните три основные компоненты базы данных Oracle и будьте в
состоянии назвать каждый элемент каждой из компонент.
Упражнения
1. Вы изучаете компоненты базы данных Oracle. Какой из перечисленных
ниже вариантов выбора идентифицирует тот аспект Oracle, который
постоянно находится на дисках машины, где размещена база данных?
A. SGA В. Файл данных
С Фоновый процесс D. Пул Java
S. Вы желаете увидеть процессы Oracle, выполняющиеся на хост-машине с
Windows. В какой из перечисленных ниже областей вам следует их искать?
A. Иконки Control Panel | Services (Панель управления | Сервисы)
B. Desktop (Рабочий стол)
С Windows Explorer (Проводник)
D. Меню Start
Э. Вы желаете увидеть процессы Oracle, выполняющиеся на хост-машине с
UNIX. Какую из перечисленных ниже команд нужно для этого
использовать?
A. Is В. grep
С ps D. df
Ответы
1. В. 2. А. 3. С.
Использование и преимущества PL/SQL
Сегодня вопрос о том, как писать программы на PL/SQL, не входит в
программу первого экзамена ОСР — введения в SQL. Тем не менее вам, как
собирающемуся стать профессионалом Oracle, стоит потратить немного времени,
чтобы узнать о существовании PL/SQL и о его использовании и
преимуществах. PL/SQL — так называется собственный язык Oracle для разработки
приложений базы данных. Помимо того что этот язык поддерживает все операции
SQL, которые поддерживает Oracle SQL, PL/SQL добавляет в него такие
присущие языку программирования расширения, как обработку условных
операторов, циклы, переменные, операции с курсорами, абстрактные типы данных,
модуляризацию (разбивку на модули), инкапсуляцию, перегрузку операций
(так в объектно-ориентированном программировании называется
возможность выбора компилятором различных реализаций одной и той же функции в
зависимости от типов ее параметров в вызове функции) и много других воз-
14
Глава 1
можностей. В приводимом ниже списке перечисляются часто называемые
причины, почему разработчики на PL/SQL пользуются этим языком:
■ Языку PL/SQL легко научиться и им легко пользоваться. Даже
профессионалы со скромным уровнем предварительных знаний по программированию
могут теперь без слишком больших усилий довольно быстро освоить
синтаксис PL/SQL и приступить к разработке программ средней сложности.
Профессионалы, если у них отсутствует какой бы то ни было
предварительный опыт программирования, могут при изучении PL/SQL затратить
больше усилий на ознакомление с такими базовыми конструкциями языка, как
определение переменных, обработка условных операторов и тому подобное.
■ PL/SQL хранится в базе данных Oracle, что значительно повышает
производительность. Это означает, что достаточно скомпилировать код в базе
данных Oracle, после чего он сразу становится доступным всем пользователям
системы. Исчезает необходимость в длительном развертывании, как в
традиционных приложениях клиент/сервер. Результатом компиляции
является код, который быстро выполняется и естественным образом работает с
данными Oracle.
■ PL/SQL легко интегрируется с базами данных Oracle. Для выполнения
операций SQL, в которых задействованы данные из базы данных Oracle, не
требуется специального синтаксиса команд. Не требуется в качестве
префиксов переменных использовать двоеточия, вопросительные знаки
или какие-то другие дополнительные символы, как в других языках.
Единственным исключением из этого правила является разработка триггеров,
которые являются гибридом объекта базы данных и PL/SQL.
■ PL/SQL особенно хорош при обработке больших блоков данных. Oracle
PL/SQL предлагает специальную конструкцию, которая называется
циклом cursor for и которая позволяет вам делать запросы к нескольким
строкам данных таблицы, а затем интерактивным образом обрабатывать по
одной строке данных. Этот режим позволяет обрабатывать очень большое
количество данных.
■ PL/SQL приходит к пользователям с большим количеством поставляемых
Oracle кодов-(программ), помогающих при выполнении конкретных задач.
Oracle распространяет вместе с каждой поставляемой базой данных
несколько пакетов с кодами PL/SQL. Эти коды позволяют пользователям
выполнять в высшей степени специализированные задачи типа ввода-вывода
файлов, выборки web-страниц из базы данных, планирования заданий,
динамических операторов SQL, межпроцессных взаимодействий,
управления ресурсами и многие другие. Ссылаться на эти поставляемые Oracle
пакеты можно точно так же, как и на другие программы на PL/SQL.
■ PL/SQL поддерживает именованные и анонимные программы. Имеется много
различных типов именованных программ, которые можно разрабатывать в
PL/SQL, в том числе хранимые процедуры, функции и пакеты. Эти блоки
кода обычно компилируются и хранятся в базе данных, где они доступны
для дальнейшего использования. Кроме того, можно писать и так
называемые анонимные программы, которые компилируются в тот момент, когда
вы размещаете код для выполнения, и затем выполняются, но не
записываются на хранение в базу данных.
■ PL/SQL можно интегрировать с таблицами базы данных через триггеры.
Oracle через триггеры интегрирует программную деятельность PL/SQL с
таблицами баз данных. Эта характеристика позволяет разрабатывать
приложения, использующие для регулирования данных в базе данных
сложные бизнес-правила, что существенно снижает для пользователей
возможность разрушения базы данных или ввода в нее неподходящих
данных.
■ PL/SQL поддерживает инкапсуляцию и модуляризацию. Термин
"инкапсуляция'' означает использование одной именованной программы PL/SQL
Обзор баз данных Oracle
IS
для вызова другой именованной программы PL/SQL. Модуляризация
заключается в разбивке большой задачи на несколько более мелких и в
последующем написании именованных программ PL/SQL для обработки
этих более мелких задач. В результате получается код, который легче
читать и сопровождать.
■ PL/SQL поддерживает перегрузку. Перегрузка происходит в том случае,
когда имеется пакет, содержащий процедуры или функции с одними и
теми же именами, которые принимают в качестве входных параметров
различные наборы переменных или различные типы данных. Когда
вызывается перегружаемая процедура, Oracle динамически определяет, какую
версию процедуры следует использовать, опираясь на типы данных
переданных в процедуру переменных.
■ PL/SQL позволяет программистам собирать написанные на этом языке коды
в пакеты (пакетировать коды). Oracle PL/SQL поддерживает
конструкцию, которая называется пакетом. Эта характеристика позволяет
логически объединять несколько процедур или функций, которые работают
совместно, в единую конструкцию. Сгруппированные в пакеты процедуры
работают лучше, чем они работали бы поодиночке, потому что все
процедуры пакета будут загружены в память сразу же после вызова первой
входящей в него процедуры. Напротив, одиночные (т.е. не входящие в пакет)
процедуры загружаются только после того, как они будут вызваны. За счет
пакетирования сокращаются так называемые накладные расходы,
требующиеся Oracle для управления памятью, и увеличивается
производительность.
■ PL/SQL поддерживает расширенные типы данных. PL/SQL дает
пользователям возможность определять абстрактные типы данных, например записи,
позволяя добиться объектно-ориентированной гибкости в процедурном
коде. Кроме того, PL/SQL предлагает конструктивные элементы таблиц для
определения и использования переменных, приближающиеся к
использованию массивов. Наконец, PL/SQL позволяет декларировать ссылочные
типы (REF) данных, что дает возможность использовать типы данных,
аналогичные указателям в С и C++.
■ Код PL/SQL является переносимым. Можно написать на PL/SQL
программу для базы данных Oracle, выполняющейся в среде Solaris, а затем
перенести программу в среду Oracle для Windows 2000 или для любой другой
операционной системы, не переписывая программу.
Закрепление пройденного материала
Убедитесь, что на концептуальном уровне вы понимаете все преимущества
программирования на PL/SQL как части базы данных Oracle. Поскольку в
первом экзамене по ОСР больше не проверяются ваши знания о том, как
разрабатывать приложения на PL/SQL, на этом этапе будет достаточно
концептуального уровня понимания.
Упражнения
1. Вы разрабатываете пакет PL/SQL для использования в базе данных Oracle.
Выберите правильный вариант ответа, определяющий, где будет храниться
код.
A. Исполняемый файл в хост-системе
B. Неоткомпилированный код в базе данных
С Скомпилированный код в базе данных
D. Плоский файл, посылаемый в базу данных всякий раз, когда вы
собираетесь выполнить программу
16
Глава 1
S. Вы хотите разработать пакет PL/SQL, содержащий различные процедуры с
одинаковыми именами, но с различными типами данных переменных. Как
называется позволяющая это опция PL/SQL?
A. Пакетирование
B. Перегрузка
С Инкапсуляция
D. Эта функция невозможна в PL/SQL
Э. Как называется специальный оператор цикла, делающий PL/SQL особенно
подходящим для обработки больших количеств записей данных?
Ответы
1. С. 2. В. 3. Оператор цикла cursor for.
Написание основных операторов SQL
В этом разделе мы займемся следующими вопросами, относящимися к
выборке данных:
■ Возможности операторов SQL select
■ Выполнение операторов select
■ Различия между операторами SQL и SQL*Plus
Теперь давайте полностью погрузимся в изучение систем Oracle. Этот
раздел напрямую связан с целями и задачами экзамена ОСР, и мы узнаем из него,
что предлагает Oracle для работы в средах Oracle. Мы рассмотрим также, как
проектируется и записывается крайне важный оператор select, используемый
для получения данных из Oracle. Мы узнаем даже, как отличить команды SQL
от команд SQL*Plus. Этот навык становится особенно важным, если вы
используете SQL*Plus для разработки и выполнения запросов, а также потому,
что имеются команды SQL*Plus, которые необходимо знать для того, чтобы
сдать экзамен ОСР.
Возможности операторов SQL select
Если вам уже приходилось разрабатывать коды SQL для других приложений
баз данных, то у нас есть для вас несколько хороших новостей. Oracle SQL
соответствует таким отраслевым стандартам, как ANSI SQL92. Но прежде чем
перейти к детальному изучению оператора select, мы рассмотрим все
имеющиеся в SQL категории операторов и их использование:
■ select Используется для выборки данных и доступа к запросам. Многие
разработчики считают этот оператор частью операций языка
манипулирования данными (data manipulation language — DML) базы данных. Однако
Oracle придерживается другого мнения. Когда в ОСР идет речь об
операторах DML, мы должны помнить, что Oracle не относит к их числу
команду select.
■ insert, update, delete Используются для операций DML над базой
данных Oracle, в том числе для вставки новых записей, для изменения и
удаления существующих записей.
■ create, alter, drop Используются для операций языка определения
данных (data definition language — DDL) базы данных Oracle, в том числе
для добавления, модификации и удаления объектов базы данных,
например таблиц, индексов, последовательностей и т.п.
■ coomit, rollback, savepolnt Используются для действий по
управлению транзакциями в рамках пользовательского сеанса, в том числе для со-
Обзор баз данных Oracle
17
хранения изменений, отказа от сделанных изменений и разметки
логических контрольных точек внутри транзакций.
И grant, revoke Используются для операций языка управления данными
(data control language — DCL) в базах данных Oracle, где вам может
потребоваться контроль над доступом пользователей к данным.
Познакомьтесь: SQL* Plus
Многие разработчики, проектировщики, АБД и продвинутые пользователи
начинают свое знакомство с Oracle с использования имеющегося в
организации приложения Oracle. И первым инструментальным средством для
непосредственной выборки данных из базы данных Oracle, с которым они
знакомятся, часто становится именно SQL*Plus. Когда пользователи в первый раз
запускают SQL*Plus, то в большинстве случаев для того, чтобы начать сеанс с
базой данных Oracle, им требуется ввести свои имена пользователей и пароли.
Имеются некоторые исключения из этого правила, например, при
использовании аутентификации паролей, обеспечиваемой операционной системой.
В следующем примере показано, как можно начать сеанс с Oracle из
командной строки UNIX, если база данных работает на той UNIX-машине, к которой
вы подключены:
$/bome/oracle> sqlplus acott/tiger
Совет В среде Windows можно выполнить показанную выше команду из
строки приглашения DOS, если вы желаете выполнить версию SQL*Plus для
командной строки. Или же можно последовательно щелкнуть мышью Start |
Programs | Oracle ORACLE_BOME \ Application Development \ SQL*Plus, чтобы
выполнить версию SQL *Plus для графического интерфейса пользователя. Доя
большинства систем ORACLE_BOME должен быть заменен именем
каталога, в котором на этой машине хранится программное обеспечение Oracle,
например OraHomel.
Если вы желаете подключиться к базе данных Oracle, которая размещена
не на той машине, к которой вы в данный момент подключены, вы можете
выполнить команду sqlplus, где после имени пользователя и пароля
проставлено имя конкретной базы данных. Вы можете увидеть, как это делается в блоке
кода, указанном ниже. Дополнительные символы @orcl, занимающие место
в конце команды, сразу после имени пользователя и пароля, указывают
операционной системе имя той базы данных Oracle, к которой вы желаете
подключиться. Вот пример подобной команды:
$/home/oracle> sqlplus acott/tigereorcl
Совет В предлагаемой вашему вниманию книге мы будем считать, что
база данных Oracle, к которой вы желаете подключиться, размещена на
той же машине, на которой вы выполняете SQL*Plus.
Каждый раз, когда вы входите в Oracle через SQL*Plus, вы создаете сеанс с
базой данных. Сеансом называется интерактивная исполнительная среда,
аналогичная таким средам командной строки, как UNIX или DOS, в которых вы
вводите команды для выборки данных. На основании введенных вами команд
SQL Oracle выполняет ряд действий по получению запрошенных вами данных.
Сеанс начинается сразу же после того, как вы вошли в Oracle, и заканчивается,
когда вы выходите из системы. Думайте о нем, как о разговоре, для которого
требуется язык. Помните: для того чтобы получить требующуюся информацию,
вы общаетесь с Oracle на языке структурированных запросов — SQL.
Совет Для подключения к базе данных вам должно быть предоставлено
(punted) соответствующее разрешение — просто иметь идентификатор
пользователя и пароль для этого недостаточно. Более подробную
информацию о разрешениях можно найти в главе 8.
18
Глава 1
SQL является функциональным языком программирования. Это означает,
что вы определяете то, что хотите увидеть в терминах желаемого результата.
Вы определяете требующийся вам результат, a Oracle определяет, как этого
результата добиться. Взгляните еще раз на оператор select, с которым мы уже
имели дело ранее:
SQL> SELECT EMPNO, ENAME, SAL FROM EMP
2 WHERE ENAME - 'SMITH';
Первое, что следует знать об операторах SQL: они могут занимать
несколько строк. Наш оператор содержит две строки, состоящие из ключевых слов и
текстовых строчных выражений. Однако обратите внимание, что мы не
разделили (не перенесли) ни одного ключевого слова между строками — в Oracle
это не разрешено. И наконец, операторы SQL нечувствительны к регистру.
Следовательно, приведенный выше оператор логически эквивалентен
следующему оператору:
SQL> select erapno, enerae, ael from emp
2 where ename - 'SMITH';
Замечание Хотя имена столбцов и таблиц и ключевые слова (например,
select, from и where) неявляются чувствительными к регистру,
текстовые строки типа SMITH, встречающиеся в одиночных кавычках в
приведенных выше образцах кода, к регистру чувствительны. Это связано с тем, что
Oracle хранит текст в точности в том же виде, как вы его ввели; поэтому,
если при записи строки в таблицу ЕМР вы ввели фамилию SMITH в верхнем
регистре, Oracle запомнит эту строку именно в таком виде. Иногда по
этой причине текстовые строки называют литералами — они литерно
(т.е. с буквальной точностью) повторяют то, что вы ввели.
Теперь обратите внимание на содержание оператора SQL. Этот оператор
просит Oracle предоставить из таблицы ЕМР такие данные, у которых
значение определенного столбца, называющегося ENAME, равно SMITH. Нам не
важно, как Oracle сделает это, лишь бы он вернул нам из таблицы ЕМР
именно ту запись, которую мы запросили. Сравните этот подход с подходами
других языков программирования, о которых вы слышали или, может быть,
использовали сами, например C++ или COBOL. Эти языки часто называют
процедурными или итеративными языками программирования, потому что код,
написанный на этих языках, приводит к получению конечного результата в
итоге явного определения процесса получения результата. Приведенный ниже
блок кода на вымышленном процедурном языке программирования, похожем
на С, служит иллюстрацией того, как можно реализовать эту функцию, явно
определяя средства ее выполнения:
Include Otdio.i»
Include <atring.h>
Include <rdbms.h>
Int *empno;
Cher "stetement;
Type erap_rec is record (
Int empno;
Char(10) emp_name;
Int sal; )
Void main( ) {
login_to_orecle(scott,tiger);
Access_table(emp);
Open(atetement, memaddr);
Strcpyf"SELECT EMPNO, ENAME, SAL FROM EMP WHERE
ENAME - 'SMITH'",statement.text),-
perse(atetement);
execute(statement);
for (1-1,1-statement.results, 1+1) ;
fetch(stetement.result[I], emp_rec);
print f(emp_rec);.
close(atetement.memaddr);
)
Обзор баз данных Oracle
1?
Конечно, этот блок кода, который внешне напоминает С, можно
откомпилировать только в вашем воображении, а не на какой-нибудь реальной
машине, но цель этого примера очевидна — другие языки программирования
вынуждают вас определять процесс, в то время как SQL позволяет определить
результат процесса.
Закрепление пройденного материала
Что такое SQL? На что способен SQL? Каким вам видится SQL в сравнении с
другими языками программирования, например Java и С?
Упражнения
1. Вы заняты определением того, какой тип оператора SQL использовать в
базе данных Oracle. С помощью какого из перечисленных ниже типа
операторов вы сможете выбрать данные из базы данных?
A. Select В. update
С Insert D. delete
S. Какой из перечисленных ниже языков программирования является
функциональным?
А. С В. Java
С COBOL D. SQL
3. Укажите команду, являющуюся частью языка управления данными SQL
(DCL).
4. Укажите команду, являющуюся частью языка манипулирования данными
SQL (DML).
5. Укажите команду, являющуюся частью языка определения данных SQL
(DDL).
Ответы
1. А. 2. D. 3. grant или revoke. 4. update, delete или insert. Oracle не считает
оператор select частью DML. 5. create, alter, drop.
Выполнение операторов select
Наиболее часто встречающимся оператором SQL, выполняемым в большинстве
сред баз данных, является оператор select, который обращается с запросом к
таблице базы данных, чтобы получить из нее запрошенные данные. Таблицы
Oracle на концептуальном уровне похожи на так называемые электронные
таблицы (spreadsheets). Посмотрите на следующий блок кода, где вы можете
увидеть оператор select в контексте сеанса с Oracle:
£9 S/home/oracle> sqlplus scott/tiger
SQL*Plus: Release 8.1.7.0.0 - Production on Fri July 06 18:53:11 2001
Copyright (c) Oracle Corporation 1979, 2000. All rights reserved.
Connected to: 0racle9i Release 9.0.1.0.0
With the partitioning option
JServer Release 9.0.1.0.0 Production
SQL> Mlact * from шар;
EMPNO
7369
7499
7521
7566
7654
ENAME
SMITH
ALLEN
HARD
JONES
MARTIN
JOB
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MGR
7902
7698
7698
7839
7698
HIREDATE
17-DEC-80
20-FEB-81
22-FEB-81
02-APR-81
28-SEP-81
SAL
800
1600
1250
2975
1250
COMM
300
500
1400
DEPTNO
20
30
30
20
30
20
Глава 1
769В
7782
778В
7В39
7844
7876
7900
7902
7934
14 rows sel
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
ected.
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
7B39
7B39
7566
769B
778B
769B
7566
77B2
01-MAY-B1
09-JUNE-B1
19-APR-B7
17-NOV-81
OB-SEP-81
23-MAY-B7
03-DEC-B1
03-DEC-B1
23-JAN-82
2850
2450
3000
5000
1500
1100
950
3000
1300
Совет В последней части блока кода Oracle сообщает, сколько строк
получено из базы данных в ответ на выданную команду SQL. Впоследствии мы
будем опускать эту строчку ради экономии места. Можно дать указание
SQL*Plus не показывать информацию о счетчике строк, используя для
этого команду SQL *Plus set feedback off. О командах SQL *Plus мы поговорим
более подробно уже в этой главе.
Первая часть, содержащая информацию об авторских правах, является
просто пригласительным сообщением SQL'Plus. По вашему желанию
печать этой информации можно отменить. Для этого достаточно при вызове
SQL*Plus из командной строки операционной системы ввести sqlplus -s
и нажать Enter. Расширение - s указывает, что SQL*Plus должен
выполняться в режиме молчания. Иногда это бывает полезно для пакетных программ,
которые записывают выходные данные в файл для последующего
автоматизированного ввода, где нежелательно иметь посторонний "мусор" во
входной информации, так как это может привести к ошибкам. Далее в этой
главе мы изучим некоторые команды SQL*Plus, которые помогут нам
управлять внешним видом выходных данных. Часть строки в блоке кода,
выделенная полужирным шрифтом, показывает простой SQL-оператор
select. В общих чертах, мы просим Oracle возвратить нам все данные изо
всех столбцов таблицы ЕМР. В ответ Oracle возвращает содержимое
таблицы ЕМР. Основные компоненты оператора select перечислены ниже. Оба
эти компонента должны присутствовать в каждом операторе select,
задаваемом для базы данных:
■ фраза select или column (столбец) В этой фразе содержатся разделенные
запятыми имена столбцов или выражения, содержащие данные, которые
мы хотим увидеть. В предыдущем запросе был использован специальный
символ, называемый групповым символом или маской (*), указывающий,
что мы желаем получить данные из всех столбцов таблицы.
■ Фраза from или table (таблица) Эта фраза указывает Oracle, из какой
таблицы следует взять данные
Совет Если оператор вводится непосредственно в SQL *Plus, для
завершения оператора SQL используется символ "точка с запятой " (;). В
некоторых ситуациях можно использовать слеш (/), как, например, в пакетных
файлах SQL *Plus, но при этом следует быть внимательным — слеш в конце
оператора, уже завершенного точкой с запятой, приведет к повторному
выполнению оператора.
Замечание относительно столбцов и типов данных
Таблицы базы данных Oracle состоят из столбцов, в каждом из которых для
каждой строки хранится единица информации. Собранные вместе, эти
единицы для одной строки образуют хранящуюся в таблице запись.
Рассмотрим первую запись предшествующего блока кода для сотрудника с EMPNO
7369:
Обзор баз данных Oracle
21
EMPNO ENAME JOB MGR HIREDATE SAL СОМИ DEPTNO
7369 SMITH CLERK 7902 17-DEC-80 800 20
Каждый столбец идентифицирует какой-нибудь аспект (свойство) этого
уникального пользователя. EMPNO обозначает идентификационный номер
служащего, ENAME — его имя и тд. Информация об этом человеке,
хранящаяся в каждом столбце, должна соответствовать типу данных, определенному
для этого столбца. Например, столбец EMPNO был определен как столбец
типа NUMBER (числовой), это означает, что для записей в этом столбце
возможны только числовые значения определенного размера. В EMPNO нельзя
записать никакую текстовую информацию, дату или любую другую
нечисловую информацию, потому что это приведет к нарушению указанного для
столбца типа данных. Далее в книге мы будем часто говорить о типах данных
столбцов, так что стоит потратить немного времени на усвоение этой
фундаментальной концепции. Ниже перечисляются разрешенные в Oracle типы
данных столбцов, с которыми мы будем работать чаще других:
■ NUMBER Тип данных, используемый для хранения числовых данных. В
столбцах этого типа не допускаются дефисы, текст или любая другая
нечисловая информация.
■ DATE Тип данных, используемый для хранения информации о датах. Во
внутреннем представлении Oracle хранит даты как числа, которые могут
быть затем конвертированы в любой формат DATE по вашему желанию.
По умолчанию информация в формате DATE представляется в формате
DD-MON-YY (например, 25-DEC-79).
■ VARCHAR2 Этот тип данных используется для хранения текстовых
данных. В столбце типа VARCHAR2 могут храниться любые текстовые
символы (включая спецсимволы, числа, буквы, дефисы и тому подобное).
■ CHAR Этот тип данных используется для хранения текстовых данных. В
столбце типа CHAR могут храниться любые текстовые символы (включая
спецсимволы, числа, буквы, дефисы и тому подобное). В том случае, если
записанный текст имеет длину, меньшую указанной в определении
переменной, он будет дополнен справа пробелами. Следовательно, фамилия
SMITH, если ее поместить в столбец, определенный как CHAR(IO), будет
дополнена справа пятью пробелами.
Совет Главное различие между столбцами CHAR и VARCHAR2 состоит
в том, что размер памяти, требующейся для хранения текстовых данных
в столбце CHAR, всегда превышает размер памяти для хранения той же
информации в столбце VARCHAR2. Это связано с тем, что столбцы CHAR
имеют фиксированную длину и всегда содержат одинаковое количество
байтов, в то время как столбцы VARCHAR2 имеют переменную длину и
содержат ровно столько байтов, сколько вы предоставили для записи.
В Oracle существуют и типы данных для хранения других типов
информации; однако их не так много, как в базах данных других производителей.
Например, в Oracle отсутствует тип данных для хранения валют. Значения этого
типа рассматриваются как простые числа и как таковые их можно хранить в
столбцах типа NUMBER.
Совет Еще один тип данных, с которым мы будем время от времени
встречаться на страницах этой книги, называется ROWID. Это специальный
тип данных, применяемый Oracle для форматирования информации,
используемой для отображения физического адреса строки на диске.
"Схема" вещей
Взгляните на следующий блок кода:
SQL> select empno, enarae, sal
2 from scott.emp;
22
Глава 1
MPNO
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
Вы обратили внимание на то, каким образом во фразе table реализована
ссылка на таблицу ЕМР? В нее в виде префикса включено имя пользователя —
SCOTT. Разработчики и АБД Oracle говорят о концепции упоминания имени
пользователя вместе с именем таблицы, как о схеме. Если вы создаете такой
объект базы данных, как таблица, этот объект принадлежит вам. Он является
частью вашей схемы. Идентификационные параметры, используемые вами
при входе в базу данных перед выполнением сценария demobld. sgl,
определяют имя схемы, которой будут принадлежать все эти таблицы.
В том случае, если таблица, на которую вы ссылаетесь в запросе, не имеет
префикса в виде имени схемы, которой она принадлежит, Oracle будет
считать, что таблица принадлежит вашей схеме, и попытается выполнить запрос
именно к ней. Если в вашей схеме такая таблица отсутствует, вы обязаны в
качестве ее префикса использовать информацию о схеме, отделяя имя владельца
схемы от имени таблицы точкой.
Совет Схемой называется логическое группирование объектов базы данных
по имени пользователя, владеющего этими объектами.
Задание префиксов столбцам по имени таблицы
Такая же концепция создания псевдонимов работает и для фразы column — вы
можете во фразе column вашего запроса в качестве префикса столбца
использовать имя таблицы, отделяя его от имени столбца точкой (.). Убедитесь, что
правильно поняли, как специфицируются владелец схемы, имя таблицы и имя
столбца в операторе select для SQL*Plus. Следующий блок кода
демонстрирует наиболее формальное использование задания префиксов посредством
соответствующей информации о схеме и таблице:
select иыя_таблицы.иыя_столбца, иыя_таблицы.иыя_стсшбца
FROM схема.иыятаОлицы;
Арифметические данные и данные из таблиц
Oracle позволяет выполнять арифметические действия над цифровыми
данными таблиц. Используемые в Oracle операторы выглядят точно так же, как в
повседневной жизни (+ для обозначения сложения, — для вычитания, для
умножения и / для деления). Скажем, вы должны выполнить простейший годовой
контроль заработной платы, в рамках которого предоставить всем служащим
прибавку в размере 8% их годовой заработной платы для повышения их уровня
жизни. Чтобы вычислить для каждого служащего новый размер заработной
Обзор баз данных Oracle
23
платы, требуется умножить ее старое значение на 1.08. Oracle делает эту работу
более легкой, используя арифметические выражения, как показано ниже:
SQL> select empno, ename, sal, aal 1.08
2 from emp,-
EMFNO
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
SAL*1.08
864
1728
1350
3213
1350
3078
2646
3240
5400
1620
иве
.1026
3240
1404
Старшинство операторов
По крайней мере, один вопрос экзамена по программе ОСР обычно
затрагивает старшинство операторов или, по-другому, порядок их выполнения —
математическую концепцию, определяющую, какие вычисления должны
быть выполнены в первую очередь. Простейший способ запоминания
правильного порядка выполнения операторов в математике — это
использовать акроним PEMDAS. Запомнить значение акронима вам поможет
мнемоническое правило: "Please Excuse My Dear Aunt Sally". Акроним
PEMDAS расшифровывается как parentheses (скобки), exponents
(возведение в степень), multiplication and division (умножение и деление), addition
and subtraction (сложение и вычитание). Вот несколько примеров действия
правила PEMDAS:
■ 2 + 6/2 равняется 5
■ (2 + 6)/2 равняется 4
■ 2/10 + 36 (84 - 6) равняется 2808.2
■ 2/10 + 36 84 - 6 равняется 3018.2.
2 + 2 и таблица DUAL
Как упоминалось раньше, каждый оператор select должен иметь фразы column
и table. Однако иногда вы можете захотеть выполнить арифметические действия
над числами, не содержащимися в реальных таблицах. К примеру, вы просто
желаете сложить два числа, например 2 + 2. К счастью, во фразе column оператора
select не обязательно должны содержаться имена реальных столбцов. Здесь
вместо имен столбцов могут содержаться фиксированные числа или другие типы
выражений. А как бьпь с фразой table? Так как вы используете во фразе columns
фиксированные числа, вы вовсе не желаете, чтобы выбирались данные из реально
существующей таблицы. Тогда почему бы не воспользоваться выдуманным
названием? В подобных случаях для заполнения фразы table используется специальная,
таблица, получившая имя DUAL При этом Oracle не использует хранящиеся в ней
данные. Взгляните на следующий блок:
SQL> select 2+2 from dual;
2 + 2
4
24
Глава 1
Таблица DUAL состоит из одного столбца, называющегося DUMMY,
содержащего одно значение — X. Выполните оператор select * from DUAL и
убедитесь, что в ней не хранится никакого осмысленного значения. Она
существует просто как конструктивный элемент SQL для поддержки
требований спецификации таблицы во фразе from. Таблицей DUAL владеет
встроенный в Oracle пользователь с именем SYS. Кроме того, можно
воспользоваться таблицей DUAL для лучшего знакомства со схемами.
Следующий пример показывает, как получить имя пользователя, использованное
вами при входе в Oracle:
SQL> select user from dual;
USER
SCOTT
Обработка значений NULL
Иногда в результате запроса информации получается "пустой" результат. В
терминах баз данных "пусто" называется NULL. В теории множеств,
математическом фундаменте реляционных баз данных, NULL представляет значение
пустого набора данных (множества) или множества, не содержащего
значений. Другими словами, NULL — это не символ пробела, отображаемый при
нажатии вами соответствующей клавиши, и не что-то эквивалентное нулю!
NULL обозначает отсутствие информации. Пока явно не указывается что-то
другое, столбец таблицы проектируется таким образом, что в нем не
размещено никакой информации. Пример выборки значения NULL иллюстрируется
столбцом MGR следующего блока кода в строке EMPNO 7839:
SQL> select empno.
2 from
EMPNO
7369
7499
7521
7566
7 654
7698
7782
7788
7839
7844
7876
7900
7902
7934
emp;
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
ename, mgr
MGR
7902
7698
7698
7839
769B
7839
7839
7566
7698
778B
7698
7566
7782
Однако бывают случаи, когда мы желаем заменить NULL на некоторое
значение. Для таких случаев в Oracle имеется функциональная возможность,
реализуемая с помощью специальной функции, называемой nvl < ). Допустим, вы
не хотите видеть пробелы на месте информации о менеджере, которому
подчиняется сотрудник Вы желаете, чтобы взамен значения NULL в выходных
данных запроса выводился нуль (0). В следующем блоке кода приводится запрос, с
помощью которого можно добиться желаемого результата:
SQL> select empno, ename, nvl(agr,0)
2 from emp;
EMPNO
ENAME
NVL(MGR,0)
7369 SMITH 7902
7499 ALLEN 7698
Обзор баз данных Oracle
25
7521
7566
7654
7698
7782
7788.
7839
7844
7876
7900
7902
7934
HARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
7698
7839
7698
7839
7839
7566
0
7698
7788
7698
7566
7782
В общем случае синтаксис для функции nvl ( ) имеет следующий вид:
NVL(hmh_столбца, значекие_если_пи11). Обратите внимание на то, что
указанный в nvl ( ) столбец содержит реальное значение. Это значение
равняется тому, которое возвращает Oracle; если же значение столбца равно
NULL, возвращается специальная строка. Функцию nvl ( ) можно
использовать для столбцов, содержащих любые типы данных, однако следует помнить,
что специфицированное (указанное) значение, которое будет возвращено в том
случае, если значение столбца — NULL, должно быть того же типа, который
был задан для столбца.
Ключевое слово distinct
Если мы вернемся к тому блоку кода, где были перечислены все сотрудники из
таблицы ЕМР, то обнаружим кое-что интересное в столбце JOB (должность).
Многие сотрудники имеют одинаковые названия занимаемых должностей.
Иногда может возникнуть ситуация, когда вам для какого-либо столбца
потребуются только уникальные значения, хотя вы знаете, что в нем имеется
множество повторяющихся значений. Для того чтобы это можно было
сделать, Oracle предлагает ключевое слово distinct. Для получения уникальных
значений столбца, содержащего дубликаты (повторяющиеся значения), вы
должны всего лишь указать во фразе columns перед ссылкой на столбец
ключевое слово distinct, например, следующим образом:
SQL> select distinct job
2 from emp;
JOB
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
Совет Чтобы ключевое слово distinct сработало, в SQL-запросе оно
должно появиться непосредственно после ключевого слова select.
Если после ключевого слова distinct в операторе select появляется более
одного имени столбца, Oracle пытается определить все различающиеся
сочетания в названных столбцах. Взгляните на пример:
SQL> select distinct job/ ешрпо from emp;
JOB EMPNO
ANALYST
ANALYST
CLERK
CLERK
CLERK
CLERK
MANAGER
MANAGER
MANAGER
PRESIDENT
SALESMAN
7778
7902
7369
7876
79,00
7934
7566
7698
7782
7839
7499
26
Гла«а 1
SALESMAN
SALESMAN
SALESMAN
7521
7654
7844
Замена заголовков столбцов псевдонимами
Для каждого результирующего набора, возвращаемого Oracle в ответ на
введенные коСоветманды SQL, Oracle создает заголовки для каждого столбца,
чтобы вы знали, что за данные вы получили. По умолчанию Oracle
воспроизводит имя столбца в точности так же, как оно было указано в операторе
select, включая имена функций, если они имеются. К сожалению, этот
метод часто дает плохое представление о том, что в действительности
отражают хранящиеся в столбце данные. Oracle усекает выражения, чтобы
уложиться в определенный размер, соответствующий типу данных
возвращаемого столбца, что еще более усугубляет проблему. К счастью, для
разрешения этой проблемы вы можете использовать во фразе column так
называемые псевдонимы. При создании псевдонима столбца вы
присваиваете ему другое имя, которое Oracle использует при отображении результатов
выполнения оператора select. Такой режим дает вам возможность
использовать в отведенном для столбца пространстве более осмысленные имена.
Предлагаем пример:
SQL> select empno, ename, nvl(mgr,0) as mgr
2 from emp;
EMPNO
7369
7499
7521
7566
7654
7698
77B2
7788
7B39
7844
7876
7900
7902
7934
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
MGR
7902
769B
7698
7839
7698
7839
7839
7566
0
7698
7.788
7698
7566
7782
Совет Можно опустить в псевдониме для столбца ключевое слово as и все
равно получить практически тот же результат.
Псевдонимы столбцов полезны при добавлении в выходные данные
запросов осмысленных заголовков. Псевдонимы можно определить двумя
способами: либо указать имя псевдонима сразу после спецификации столбца во фразе
column (отделив его пробелом), либо использовать для этой цели ключевое
слово as, чтобы более отчетливо подчеркнуть, что это именно псевдоним.
Ниже мы приводим общее правило записи псевдонимов (в обоих вариантах):
SQL> — SELECT имя_столвца_или_операции псевдоним,
SQL> SELECT nvl(mgr,0) MGR~
2 FROM EMP;
ИЛИ
SQL> — SELECT ихя_столбца_или__операции AS псевдоним,
SQL> SELECT nvl(mgr,0) AS MGR
2 FROM EMP;
Вам не требуется специфицировать функцию, для того чтобы
использовать псевдоним. К примеру, если вы просто желаете заменить заголовок
столбца для столбца MGR на что-нибудь более информативное, то для этой
цели также можно воспользоваться псевдонимом столбца. Оператор SQL
может выглядеть, например, следующим образом: select mgr as "Manager
Code" from emp.
Обзор баз данных Oracle
27
Объединение столбцов с помощью конкатенации
Для того чтобы обеспечить более интересный или более удобочитаемый вид
выходных данных, можно сцепить вместе несколько столбцов с данными.
Такая операция называется конкатенацией. Для изображения операции
конкатенации используются два соединенных вместе символа конвейера: ||. Кроме
того, можно использовать оператор concat ( ), передавая в него имена двух
сцепляемых столбцов. В следующем примере столбец ENAME
конкатенируется с текстовым выражением и со столбцом JOB с использованием обоих
допустимых методов, что позволяет получить более осмысленный результат:
SQL>select ename I I ', who is the I I
2 concat(job,' for the company')
3 as 'Name and Role"
4 from emp;
Name and Role
SMITH, who is the CLERK for the company
ALLEN, who is the SALESMAN for the company
WARD, who is the SALESMAN for the company
JONES, who is the MANAGER for the company
MARTIN, who is the SALESMAN for the company
BLAKE, who is the MANAGER for the company
CLARK, who is the MANAGER for the company
SCOTT, who is the ANALYST for the company
KING, who is the PRESIDENT for the company
TURNER, who is the SALESMAN for the company
ADAMS, who is the CLERK for the company
JAMES, who is the CLERK for the company
FORD, who is the ANALYST for the company
MILLER, who is the CLERK for the company
Совет Чтобы сделать выходные данные более осмысленными и читаемыми,
используйте псевдонимы для именования конкатенированных вами столбцов.
Закрепление пройденного материала
1. Необходимо понимать два компонента операторов select и знать, что
такое схема.
S. Необходимо знать, как выполняются в Oracle арифметические действия
над выделенными столбцами и числовыми выражениями и что такое
таблица DUAL.
3. Необходимо знать оба метода, используемые для конкатенации, а также
как определить псевдоним для столбца. Кроме того, следует знать, что
такое ключевое слово distinct и как оно используется.
4. Умейте определить, что означает понятие NULL в контексте Oracle SQL и
как использовать функцию nvl ( ).
5. Убедитесь, что с помощью акронима PEMDAS вы можете указать
правильный порядок выполнения операторов.
Упражнения
1. В операторе select вы идентифицируете для использования созданную не
вами таблицу. Какой из следующих вариантов идентифицирует ту ссылку,
28
Гла«а1
которую следует включить в оператор select, чтобы Oracle знала, где ей
искать информацию.
А. Псевдоним В. Схема
С Выражение D. Сеанс
S. Используйте для ответа на приведенный ниже вопрос следующий блок
кода:
SQL> select empno.
2 from emp;
EMPNO
7369
7499
7521
7566
7654
769B
7782
77BB
7B39
7B44
7B76
7900
7902
7934
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KINS
TURNER
ADAMS
JAMES
FORD
MILLER
ename, mgr
MQR
7902
769B
7698
7839
7698
7B39
7B39
7566
7698
77BB
769B
7566
77B2
SQL> select empno, ename, nvl(mgr,'none') as mgr
2 from emp;
Какой из следующих вариантов ответа описывает, что возвратит для этого
запроса Oracle в качестве выходных данных в столбце МGR для записи
служащего KING?
A. Oracle возвратит в столбце MGR для записи служащего KING
значение NULL.
B. Oracle возвратит в столбце MGR для записи служащего KING
значение MGR.
С Oracle возвратит в столбце МGR для записи служащего KING
значение NONE:
D. Oracle возвратит ошибку.
3. В SQL-запросе вы конкатенируете информацию из двух столбцов. Какой
из вариантов ответа правильно идентифицирует специальный символ,
требующийся для этой операции?
А.@ В. #
С || D. /
4. Предложите имя для таблицы, не содержащей никакой осмысленной
информации, которую можно использовать для выполнения требований
фразы table оператора select при выполнении арифметических операций
над фиксированными числовыми выражениями:
5. Для ответа на следующий вопрос можно использовать содержимое
стандартной таблицы ЕМР, использовавшейся в этом обсуждении. Вы пытаетесь
вычислить 20% от заработной платы и комиссионных каждого служащего
компании. Какой их приведенных ниже операторов SQL подойдет для решения
этой задачи?
A. select empno, ename, sal/20, comm/20 from emp;
B. select empno, ename, sal*20, comm*20 from emp;
С select empno, ename, sal/.20, comm/.20 from emp;
D. select empno, ename, sal*.20, comm.*.20 from emp;
Обзор баз данных Oracle
20
6. Для ответа на этот вопрос можно воспользоваться содержанием
следующего блока кода:
SQL> select from dept;
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
Вы задаете в Oracle следующий оператор: select distinct dname, loc
from dept. Какой из следующих вариантов ответа корректно описывает
возвращаемый Oracle результат?
A. Oracle возвращает различные комбинации значений столбцов
DNAME и LOC.
B. Oracle возвращает только три различных значения из DNAME в
таблице DEPT.
С Oracle возвращает только различные значения из столбца DEPTNO.
D. Oracle возвращает содержимое всех четырех записей таблицы.
Ответы
1. В. 2. D. Помните, что тип данных второго параметра функции nvl ( ) должен
совпадать с типом данных столбца. 3. С. 4. DUAL. S. D. 6. А.
Различия между командами SQL и SQL*Plus
Хотя рабочая среда SQL*Phis прекрасно работает в том случае, если вы не
делаете ошибок, она не прощает опечаток, начиная с того момента, как вы
нажали на клавишу Enter, чтобы перейти к следующей строке ввода. До сих пор это
ограничение не предоставляло нам особых трудностей, так как наши запросы
не были длинными. Однако, по мере того как запросы становятся все более и
более сложными, вы все чаще остаетесь разочарованными. SQL'Plus
допускает некоторую коррекцию введенных операторов с помощью специальной
команды, которая называется change (сокращенно — с). Рассмотрим
следующий пример, иллюстрирующий этот момент:
ВШ SQL> SELECT ешрпо, ename, NVL(шдг,'none') mgr,
2 hiredate, эа1, conn, deptno
3 FROM EMP;
SELECT ешрпо, enane, NVL(mgr,'none') mgr,
*
ERROR at line 1:
ORA-01722: Invalid number (неверное число)
SQL> 1
1SELECT empno, ename, NVL(mgr,'none') mgr,
SQL> c/'nona'/O
1 SELECT empno, ename, NVL(mgr,0) mgr,
SQL> /
EMPNO
7369
7499
7521
7566
7654
7698
77B2
77B9
7B39
7844
7876
7900
7902
7934
ENAME
SMITH
ALLEN
HARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KINS
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
MGR
7902
7698
7698
7839
7698
7639
7839
7566
0
7698
7788
7698
7556
7782
HIREDATE
17-DEC-80
20-FEB-81
22-FEB-B1
02-APR-81
28-SEP-81
01-MAY-ei
09-JUNE-81
19-APR-87
17-NOV-81
08-SEP-81
23-MAY-87
03-DEC-81
03-DEC-81
23-JAN-82
SAL
800
1600
1250
2975
1250
2650
2450
3000
5000
1500
1100
950
3000
1300
COMM
300
500
1400
0
DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10
30
Глава 1
В этом примере оператор select содержит ошибку, связанную с
несовпадением типов данных в функции nvl ( ). Oracle замечает эту ошибку и
предупреждает о ней выдачей сообщения ora- 01722.
Могут быть произведены и другие сообщения об ошибках, в том числе и
следующее:
ORA-00904: invalid column name
Эта ошибка означает, что столбца, на который вы ссылаетесь, не
существует или его имя было каким-либо образом искажено. Для разрешения
этой проблемы вы должны проверить фразу column на предмет наличия в
ней опечаток и убедиться, что столбец с таким именем действительно
существует в таблице. Иногда в имени столбца могут встречаться такие не
буквенно-цифровые символы, как подчеркивания, предназначенные для
разделения слов. Следовательно, имя столбца EMPNO совсем не то же самое,
что EMP_NO, хотя в концептуальном смысле оба они значат примерно
одно и то же.
ORA-00923: FROM keyword not found where expected
Эта ошибка означает, что ключевое слово from не было включено или
было записано неправильно. Иногда эта ошибка появляется, если вы
поставили запятую после имени последнего столбца, перечисленного во фразе select
(например, select empno, ename, from emp), так что в первую очередь
проверьте оператор на наличие этой распространенной ошибки.
ORA-00942: table or view does not exist
Эта ошибка означает, что набранного вами имени таблицы или
представления не существует. Обычно ошибка ORA-00942 означает, что в имени
таблицы или представления имеется опечатка или что перед именем
таблицы не было специфицировано имя схемы. Эта ошибка исправляется либо
путем исправления допущенной в имени опечатки, либо путем указания
перед именем таблицы имени схемы. (Альтернативным решением последней
проблемы является создание синонимов для таблиц, к которым могут
обращаться другие пользователи. Это решение будет обсуждаться в этой книге
позже.)
В любом случае метод, используемый для решения проблемы опечаток,
состоит в том, что сначала нужно ввести номер строки, содержащей ошибку,
чтобы сделать возможным ее редактирование. В предыдущем примере мы
сделали это, набрав число 1 (выделено полужирным шрифтом). Затем мы
использовали команду change (также выделена полужирным шрифтом) и ввели с ее
помощью правильный синтаксис:
с/старое_эиачеиие/новое_эначение
После того как выполнено требующееся изменение в первом вхождении
старого_зночения текущей строки, Oracle повторно выводит текущую строку
со сделанными изменениями. Обратите внимание, что изменения
производятся только для первого вхождения старого_значения. Если изменения должны
быть сделаны в конкретном месте строки, следует задать больше символов в
параметре старое_значение. Наконец, откорректированный текст может быть
выполнен повторно, для чего достаточно ввести в строке приглашения слеш
(/), как это было показано в приводившемся примере, или в командной строке
SQL'Pms ввести команду run.
Совет Если у вас есть сомнения по поводу разницы между использованием
слеша и точки с запятой, помните, что команда слеш повторно выполняет
код, в данное время находящийся в операционном буфере SQL *Plus, в то
время как точка с запятой используется для завершения SQL-оператора,
который вы набираете в буфер.
Обзор баз данных Oracle
31
Использование текстового редактора
Oracle дает вам возможность пользоваться своим любимым текстовым
редактором для редактирования оператора, созданного в файле afiedt.buf,
где SQL'Plus хранит последний выполнявшийся оператор SQL. Для этого
достаточно просто набрать команду edit (сокращенно ed). В результате
этого действия Oracle перенесет оператор SQL из файла af iedt. buf в
используемый по умолчанию текстовый редактор операционной системы.
В UNIX-системах это обычно редактор VI или EMACS, в то время как для
сред Windows используется Notepad. Чтобы изменить используемый
текстовой редактор, задайте в строке приглашения SQL'Plus оператор
define_editor='ваш_редактор'.
Совет Можно определить текстовый редактор в графическом интерфейсе
пользователя SQL*Plus, используя опции меню Tools | Environment.
Использование другого текстового редактора, отличающегося от
собственного редактора SQL*Plus, предоставляет много преимуществ. Используя
хорошо известный текстовый редактор, вы сможете более близко познакомиться и
с SQL'Plus, что является полезным для адаптации к приложению. Кроме того,
при работе с большими запросами полезно держать перед глазами весь блок
кода и иметь к нему мгновенный доступ.
Запись команд SQL в сценариях
Можно сначала в текстовом редакторе записать целиком тексты запросов,
а затем загрузить их в SQL*Plus. Если вы собираетесь поступать именно так, не
забудьте при сохранении сценария указать расширение . sql, чтобы SQL'Plus
было легче распознать, что это сценарий. Для загрузки файла сценария
в SQL*Plus имеются две команды. Первая из них называется get. Команда
get открывает специфицированный файл и помещает его содержимое в файл
afiedt.buf. После того как сценарий загружен, вы можете выполнить
записанную команду, используя команду слеш (/). Как альтернативный вариант
можно использовать команду @ или start, которая загружает операторы
SQL из именованного файла в файл afiedt.buf и выполняет их за один
шаг. Оба метода показаны в следующем примере; сценарий имеет имя
select_emp. sql".
5/home /oracle> aqlplua acott/tiger
SQL*Plua: Release 8.1.7.0.0 - Production on Fri Jul OS 18:53:11 2001
Copyright (c) Oracle Corporation 1979, 2000. All rights reserved.
Connected to Oracle9i Release 9.0.1.0.0
With the partitioning option
JServer Release 9.0.1.0.0 - Production
SQL> «T nlwt «*>
T 1ЯСМ
/
EMPNO
7369
7499
7521
7566
7654
769B
77B2
778B
7839
7844
7876
7900
7902
7934
"*
ENAKE
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
MGR
7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
#
HIRE DATE
17-DEC-80
20-FEB-81
22-FEB-81
02-APR-81
28-SEP-81
01-MAY-81
09-JUNE-81
19-APR-87
17-NOV-81
08-SEP-81
23-MAY-87
03-DEC-81
03-DEC-81
23-JAN-82
SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
COMM
300
500
1400
0
DEPTNO
2.0
30
30
20
30
30
10
20
10
30
20
30
20
10
32
Глава 1
SQL> gralact
■_■*
sxlkt * from тщ>
EMPNO
7369
7499
7521
7566
7 654
7698
7782
7788
7B39
7844
7876
7900
7902
7934
ENAME
SMITH
ALLEN
HARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KINS
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
MGR
7902
7698
7698
7839
7 698
7839
7839
7566
7698
7788
7.698
7566
77B2
HIREDATE
17-DEC-80
20-FEH-81
22-FEB-81
02-APR-81
2B-SEP-81
01-MAY-81
09-JUNE-81
19-APR-87
17-NOV-81
08-SEP-81
23-MAY-87
03-DEC-81
03-DEC-81
23-JAN-82
SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
COMM
300
500
1400
0
DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10
Совет Знак "коммерческое at"(@) перед именем сценария SQL в
приведенном выше блоке кода играет другую роль в отличие от того же знака перед
именем базы данных, с которым мы столкнулись в одном из предыдущих
примеров при запуске SQL*PLus из командной строки. Убедитесь, что вы
научились не путать две эти формы его применения.
Обратите внимание, что в строке с командой get после имени файла было
опущено распшрение . sql. Дело в том, что SQL*Plus предполагает, что все
сценарии, содержащие операторы SQL, будут иметь расширение . sql, так что
в командах get и @ их можно опустить. Можно хранить команды SQL в
текстовых файлах с другими расширениями, например . txt или . l st, но если вы
используете такую возможность, следует в команде get указать полное имя
файла, включая расширение. К тому же обратите внимание: после того как
файл импортирован с помощью команды get, его можно выполнить с
помощью команды слеш (/). Далее, в этом же блоке кода мы использовали команду
@ для того, чтобы считать тот же самый файл в af iedt. buf. Содержимое
буфера выполняется на том же шаге, благодаря чему отпадает необходимость
вводить и использовать команду слеш (/). Как и в прошлый раз, мы опустили
распшрение .sql. И в заключение, если мы при вводе имени файла для
команды get или @ не специфицировали путь к файлу, Oracle предполагает,
что файл лежит в том же каталоге, из которого был запущен SQL*Plus.
Совет При вводе в сценарий операторов SQL, которые вы собираетесь
выполнять в SQL*Plus, не ставьте в конце этих операторов символ точка с
запятой " (;). Вместо этого поместите на место первого символа последней
строки сценария символ слеш (/). Так нужно поступить, если вы
столкнулись с проблемой, когда Oracle сообщает, что обнаружил в сценарии
недопустимый символ (точку с запятой).
Другие команды SQL* Plus, о которых следует знать
В оставшейся части этого обсуждения мы будем заниматься идентификацией
других важных команд, которые вы должны знать в SQL* Plus как для своей
работы, так и для сдачи экзамена ОСР. Давайте сейчас познакомимся с
несколькими мчташ командами SQL*Plus, о которых вы должны знать.
i DESCRIBE шш_тябднцы Эта команда возвращает описание имени
таблицы, в том числе имена всех столбцов таблицы, тип данных каждого столбца и
указание, могут ли в столбце содержаться значения NULL. Если вы
столкнулись с ошибкой ORA-00904, эта команда используется для определения имен
столбцов таблицы, на которую вы ссылаетесь. Синонимом команды служит ее
сокращенное обозначение — desc. Вот пример использования команды:
ЕВЯВВВ SQL> describe emp
Name Null? Type
EMPNO NOT NULL NUMBER (4)
ENAME VARCUAR2(10)
Обзор баз данных Oracle
33
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER (7, 2)
COMM NUMBER (7, 2)
DEPTNO NUMBER (2)
LIST Эта команда используется для распечатки содержимого текущего
рабочего буфера SQL'Plus, упорядоченного по номерам строк. SQL'Phis
буферизует последнюю заданную вами команду SQL. Если к моменту задания команды
list вы еще не ввели ни одной команды SQL, будет выведено сообщение об
ошибке SP2-0223: No lines in SQL buffer (в буфере SQL отсутствуют
строки). Доступная для редактирования текущая строка буфера будет отмечена
символом "звездочка" (*), следующим непосредственно за номером строки,
как это показано в примере:
SQL> select мврпо, ename
2 from emp
3 where empno 7700;
EMPNO ENAME
7369
7499
7521
7566
7654
7698
6 rows
selected.
SQL> list
1 select empno,
2 from
emp
3* wherzze
empno
ename
<
7700
SMITH
ALLEN
HARD
JONES
MARTIN
BLAKE
DEL номер Эта команда удаляет из рабочего буфера SQL*Plus строку с
указанным номером (а вовсе не указанное число строк!). Каждой строке в
рабочем буфере предшествует номер строки, а в последней строке буфера сразу же
за номером строки следует символ звездочки (*). Если необходимо удалить
несколько строк, укажите их номера через пробел. Ниже приведен пример
использования команды del:
SQL> del 3
SQL> list
1 select empno, ename
2* from emp
APPEND строка Эта команда добавляет специфицированную в команде
строку в текущую строку. В строке разрешено иметь пробелы, а если в текущей
строке уже имеется информация, то добавляемая строка должна начинаться с
пробела. Текущая строка обозначается в выходных данных команды append
звездочкой (*). Взгляните на следующую команду append для отображения
информации текущей строки вместе с содержимым рабочего буфера: SQL'Plus:
SQL> append where empno < 7700
2* from emp where empno < 7700
CLEAR BUFFER Эта команда очищает содержимое буфера SQL'Plus. Вот
пример использования команды clear buffer:
SQL> clear buffer
Buffer cleared
INPUT Если ввести ее в строке приглашения SQL, эта команда позволяет
добавить содержимое в текущую строку буфера операций SQL'Plus. Если
буфер был очищен, ввод начинается с первой строки. Если в буфере что-то
было, ввод начнется с начальной позиции новой строки, которая будет
помещена в конец буфера. Вот пример использования команды input:
34
Глава 1
SQL> input
1 select ename, sal
2 from emp
3 where empno < 7600;
ENAME SAL
SMITH
ALLEN
WARD
JONES
BOO
1600
1250
2975
Совет Команда append имеет отличия от команды input, так как первая
позволяет указать строку, которую вы желаете пополнить информацией, в
то время как вторая сама определяет, куда будет введена новая строка.
RUN Эта команда выполняет содержимое буфера SQL'Plus. Вот пример ее
выполнения:
SQL> run
1 select
ename.
2 from emp
3* where
ENAME
SMITH
ALLEN
WARD
JONES
empno <
sal
7600
SAL
600
1600
1250
2975
номер строки Когда в SQL'Plus вводится номер, за которым следует строка
символов, SQL'Plus добавляет в буфер операций специфицированную вами
строку символов как строку с указанным номером. Если такой номер строки
уже имеется, Oracle заменяет ее. Если указанный номер строки не является
смежным с номерами имеющихся в буфере строк, SQL'Plus добавит строку
как последнюю строку буфера. Взгляните на пример ее использования:
SQL> б new line being added
SQL> list
1 select ename, sal
2 from emp
3 where empno < 7 600
4* new line being added
SQL> 2 from jason.emp
SQL> list
1 select ename, sal
2 from jason.emp
3 where empno < 7600
4* new line being added
SPOOL {им я_файла|011?10иТ} Эта команда записывает все выходные
данные, показанные в приведенном ниже издании команды spool filename, в
текстовый файл, идентифицированный как ю*я_файла. Если не указано
расширение файла, SQL'Plus автоматически добавляет расширение . 1st. Если в
команде указано ключевое слово off, спулинг (откачка) выходных данных
SQL'Plus в выходной файл отключается. Рассмотрим пример:
SQL> spool jason.out
SQL> select ename, sal
2 from emp
3 where empno < 7600,-
ENAME SAL
SMITH
ALLEN
WARD
JONES
SQL> spool
SQL> exit
C:\WINDONS
off
600
1600
1250
2975
type jason.out
SQL> select ename, sel
Обаор баз данных Oracle
35
2 from ешр
3 where ешрпо < 7600;
ENAME SAL
SMITH 800
ALLEN 1Б00
WARD 1250
JONES 2975
SQL> spool off
SAVE шма_фаяда Эта команда помещает содержимое буфера SQL'Plus в
текстовый файл, который носит имя иня_файла. Если расширение файла не
указано, SQL'Plus автоматически добавляет .sql.
EXIT Эта команда осуществляет выход из интерфейса SQL'Plus и возврат в
операционную систему.
Совет Можно отметить, что возможность редактировать команды
SQL, используя ваш любимый текстовый редактор, является удобной
возможностью SQL*Phis, которая позволяет избежать изучения всех команд
SQL*Pius. Тем не менее, перед тем как решитесь пойти сдавать экзамен
ОСР, убедитесь, что вам понятны основы ввода SQL с использованием
SQL*Plus.
Закрепление пройденного материала
1. Убедитесь, что вы знаете два имеющихся механизма ввода и модификации
SQL-операторов в SQL*Phis.
S. Вспомните, как используется в командной строке SQL'Plus команда edit
и как загрузить содержимое сценария SQL в SQL*Ptus и выполнить его.
3. Как используются другие команды SQL'Plus, идентифицированные в этом
разделе?
Упражнения
1. Вы проводите модификацию строки 3 буфера SQL*Plus. Какой из
следующих вариантов лучше других определяет метод, применяемый при
использовании команды edit?
A. Модифицируйте блок кода, используя свой любимый текстовый
редактор.
B. Сначала обратитесь к номеру строки, а затем используйте команду
change.
С Сначала удалите строку, используя команду del, а затем обратитесь к
номеру строки.
D. Загрузите тот оператор SQL, который собираетесь модифицировать,
используя команду input.
S. Вы хотели бы перечислить столбцы, обнаруженные в таблице Oracle. Какая
из приведенных ниже команд SQL* Plus может оказаться полезной для этой
цели?
A.Get В. input
С Describe D. spool
3. Эта команда отображает содержимое буфера SQL*Plus:
4. Так называется файл, в котором Oracle хранит содержимое буфера
SQL'Plus:
36
Глава 1
Ответы
1. А. 2. С. 3. list. 4. afiedt.buf.
Резюме главы
Эта глава несколько претенциозно проводит вас от введения в базы данных
Oracle через некоторые базовые методики, используемые в операторах
select. Вы узнали о теоретическом обосновании реляционных баз данных,
одной из которых является РСУБД Oracle, и чем они отличаются от имевшихся
ранее систем для хранения и выборки данных. Вы познакомились с
концепцией таблицы, а также с основными типами данных, используемыми в этих
таблицах. В главе также описана базовая архитектура системы баз данных
Oracle, рассмотрено, что представляет собой объектно-реляционная РСУБД, и
показаны некоторые возможности разработки программ на разработанном
корпорацией Oracle и принадлежащем ей языке PL/SQL. После этого мы
сосредоточились на использовании оператора select, для которого обсудили
использование фраз table и column.
Двухминутное погружение в пройденное
■ Для выборки данных из Oracle используется оператор select.
■ Синтаксис оператора select состоит (пока!) из фраз select from
■ Появляющиеся после ключевого слова select выражения являются
частью фразы column и обычно представляют собой имена колонок таблиц,
из которых вы желаете выбирать данные.
■ Появляющиеся после ключевого слова from выражения являются частью
фразы table и обычно представляют собой имена таблиц, из которых вы
желаете выбирать данные.
■ Когда вы, используя SQL*Plus, вводите оператор select из строки
приглашения, для завершения оператора нужно использовать точку с запятой
(;) в конце оператора или слеш (/) в начале первой пустой строки буфера
операций.
■ Для выполнения арифметических операций над выбранными из таблиц
данными или над числами можно использовать обычные математические
операции.
■ Состоящая из одного столбца и одной строки таблица DUAL используется
для выполнения синтаксических требований SQL-оператора select.
■ Значения столбцов для некоторых строк могут быть пустыми (NULL).
■ Для того чтобы возвратить осмысленное значение вместо пустого места
для столбца, содержащего значение NULL, следует использовать
функцию nvl( ).
■ Вместо настоящего имени столбца или для того чтобы убрать Из заголовка
имя функции, можно использовать псевдонимы.
■ Выходные данные двух столбцов могут быть объединены вместе
(конкатенированы) с помощью двойного знака конвейера (||). Для этой же цели
можно использовать функцию concat().
■ Команды SQL можно вводить непосредственно в командную строку
SQL*Plus.
■ С помощью команды change можно редактировать ошибки в SQL*Plus. В
том случае, если сделана ошибка, следует использовать команду change
(c/old/new).
Обзор баз данных Oracle 37
Ш Если вы используете свой любимый текстовый редактор, для исправления
ошибок и внесения изменений можно использовать команду edit (ed).
■ Определить свой любимый текстовый редактор можно, выдав в строке
приглашения команду define _editor.
■ Для того чтобы запомнить правильный порядок выполнения операторов
(старшинство операторов), пользуйтесь акронимом PEMDAS.
■ В SQL*Plus имеется масса команд, не являющихся частью языка
структурированных запросов. Ниже перечисляются некоторые из них, на которые
следует обратить внимание:
■ get — для выборки сценариев SQL в SQL*Plus
■ run — для выполнения выбранных сценариев SQL
■ @ — для выборки и выполнения сценария за один шаг.
■ describe — для распечатки перечня столбцов конкретной таблицы
вместе с их типами данных
■ spool — для указания SQL*Phis, что нужно записать содержание
сеанса в файл
Вопросы для самопроверки
1. Этот термин используется для обозначения логического группирования
таблиц по имени создавшего их пользователя:
2. Если вы хотите выполнить операцию над двумя выражениями, вы можете
выполнить запрос к этой таблице:
3. Инструментальное средство командной строки, часто используемое для
обращения к Oracle, называется:
4. Функция, предназначенная для вставки двух символов конвейера (||),
объединенных вместе, называется:
5. Компонент Oracle, поддерживающий хранение требуемых данных,
называется:
6. Набор команд, специально созданный для получения данных из Oracle,
называется:
Вопросы ко всей главе
1. Вы формулируете запросы в среде SQL'Plus. Какой из следующих
операторов правильно описывает, как определить псевдоним столбца?
A. Поместите псевдоним перед началом оператора описания таблицы.
B. Для описания столбца поместите псевдоним после каждого имени
столбца, отделив его пробелом.
С Для описания столбца поместите псевдоним после каждого имени
столбца, отделив его запятыми.
D. Поместите псевдоним в конце оператора описания таблицы.
2. Во фразе column оператора SQL вы желаете использовать функцию nvl ( ).
Для выполнения какой из следующих задач применяется функция nvl( )?
A. Помогает распределить выходные данные между несколькими
столбцами.
B. Дает возможность определить альтернативную форму вывода данных
для непустых (non-NULL) значений столбцов.
38
Глава 1
С Дает возможность определить альтернативную форму вывода данных
для пустых (NULL) значений столбцов.
D. Обнуляет значения выводимого столбца.
3. Ниже показаны выходные данные для таблицы PLAYS с двумя столбцами:
PLAY_NAME и AUTHOR. Каким из следующих SQL-операторов были
сформированы эти выходные данные?
PLAYJTABLE
"Midsummer Nights Dream", SHAKESPEARE
"Waiting for Godot", BECKETT
"The Glass Menagerie", WILLIAMS
A. select PLAY_NAME || AUTHOR from PLAYS;
B. select PLAYJJAME, AUTHOR from PLAYS;
С select PLAYJJAME || ', ' || AUTHOR from PLAYS;
D. select PLAY_NAME || ', ' | | AUTHOR play_table from PLAYS;
4. Вы конфигурируете рабочую среду SQL*Plus. К какому результату приведет
выдача команды define _editor=' emacs' ?
A. Выбираемым по умолчанию текстовым редактором для SQL*Plus
станет редактор EMACS.
B. Будет немедленно запущен редактор EMACS.
С Редактор EMACS больше не будет использоваться как выбираемый
по умолчанию текстовый редактор для SQL*Plus.
D. Редактор EMACS будет немедленно удален из системы.
5. Вы используете SQL*Plus для выполнения некоторых математических
функций. Какую из таблиц следует использовать при выполнении
арифметических вычислений над значениями, указанными непосредственно в
операторе select (а не выбранными из столбцов таблицы)?
А.ЕМР
В. Таблица, содержащая значения столбцов
С DUAL
D. Определенная Oracle таблица
6. Вы желаете использовать SQL'Plus для подключения к базе данных Oracle.
В каком из следующих вариантов ответа указывается компонент, который
не следует задавать при входе в Oracle?
A. Ключевое слово sqlplus
B. Имя пользователя
С Пароль
D. Имя базы данных
7. Изучите следующие выходные данные сеанса SQL*Plus:
Name Null? Type
SYMPTOM NOTNOLL VARCHAR2(10)
CAUSE VARCHAR2(10)
TREATMENT VARCHAR2(9)
С помощью какого из следующих ключевых слов получены эти выходные
данные?
A. describe B. get
С run D. spool
Обзор баз данных Oracle
39
Ответы на вопросы для самопроверки
1. Schema
S. DUAL
3. SQLePlus
4. concat ( )
5. РСУБД или реляционная система управления базами данных
6. SQL или язык структурированных запросов
Ответы на вопросы ко всей главе
1. В. Для описания столбца поместите псевдоним после каждого имени
столбца, отделив его пробелом.
Объяснение Псевдонимы не описывают таблицы; они описывают столбцы.
Тем самым отвергаются ответы А и D. Между именами столбцов,
появляющимися во фразе column оператора select, требуются запятые. Если после
имени столбца появится псевдоним, Oracle либо выберет неправильное имя
столбца, основываясь на информации, содержащейся в псевдониме, либо
возвратит вам ошибку.
8. С. Позволяет организовать альтернативный вывод для значений NULL в
столбце.
Объяснение Функция nvl( ) является простым оператором if-then,
который проверяет значения столбца на выходе, чтобы убедиться, не являются
ли они NULL. Если это так, nvl ( ) подставляет вместо NULL
специфицированное по умолчанию значение. Поскольку эта функция определена
только для столбцов, выбор А является некорректным. Выбор В некорректен,
потому что он является логическим отрицанием выбора С. Выбор D
некорректен, потому что nvl ( ) разработана для замены реальных значений
в тех случаях, когда в них присутствует значение NULL, а вовсе не для
обнуления данных.
3. D. select PLAY_NAME | | ', ' | | AUTHOR play_table from PLAYS;
Объяснение Этот вопрос служит хорошей иллюстрацией того, как важно
быть внимательным при ответе. Так как в выходных данных этого вопроса
содержится псевдоним столбца, единственно корректным ответом на
поставленный вопрос будет D, хотя и ответ С также соответствует осуществлению
правильных действий. Ответ А является некорректным, поскольку в нем указан
неточный метод конкатенации, а ответ В ошибочен, поскольку в нем вообще не
указана конкатенация.
4. А. Выбираемым по умолчанию текстовым редактором для SQL*Plus станет
редактор EMACS.
Объяснение Оператор define _editor предназначен для определения
текстового редактора, используемого по умолчанию в SQL'Plus. Изменение
определения не приводит ни к запуску, ни к остановке редактора, что позволяет
отказаться от ответов В и D. Ответ С является логической
противоположностью ответа А и потому некорректен.
5. С. DUAL
Объяснение В том случае, когда все данные, которые должны быть
обработаны в запросе, представлены в самом операторе и нет необходимости в
выборке данных из базы данных, пользователи обычно специфицируют таблицу
DUAL, чтобы выполнить синтаксические требования фразы from.
40
Глава 1
6. D. Имя базы данных
Обысвенне Вам не нужно указывать имя базы данных, к которой вы
желаете подключиться. Если эта информация опущена, Oracle предполагает, что вы
желаете подключиться к локальной базе данных вашей машины, которая
называется ORCL. Все остальные варианты ответа обозначают компоненты,
необходимые для подключения к базе данных Oracle.
7. A. describe
Объяснение Команда de scribe генерирует листинг всех столбцов таблицы,
а также ассоциированных с ними типов данных. Ответ В некорректен, так как
команда get просто загружает содержимое сценария в память SQL'Plus. Ответ
С также некорректен, поскольку команда run выполняет сценарии, ранее
загруженный в память SQL*Plus. Наконец, ответ D неверен, так как команда
spool используется для записи команд сеанса SQL*Plus, выданных после
срабатывания команды spool, в плоский файл.
ГЛАВА 2
Ограничение и сортировка
возвращаемых данных
и манипулирование ими
42
Глава 2
этой главе мы получим (а потом и продемонстрируем) знания
по следующим вопросам:
■ Ограничение и сортировка строк данных .
■ Использование однострочных функций
Эта глава строится на концепциях предыдущей главы, относящихся в
первую очередь к выборке данных из баз данных Oracle. В ней мы обсудим, как
ограничить количество данных, отбираемых из базы данных Oracle, и как дать
понять Oracle, что данные должны быть возвращены в определенном порядке.
Кроме того, мы обсудим, как категория функций, называемая однострочными
функциями, используется для манипулирования результатами выполненных
вами запросов. Рассматриваемые в этой главе материалы составляют около
16% содержания первого экзамена ОСР.
Ограничение и сортировка строк данных
В этом разделе мы рассмотрим вопросы, связанные с ограничением и
сортировкой строк данных:
■ Сортировка возвращаемых данных с помощью фразы order by
■ Ограничение объема возвращаемых строк с помощью фразы where
Получить все выходные данные из таблицы — это просто здорово, но
обычно при получении выходных данных мы должны быть гораздо более
избирательными. Большинство приложений баз данных содержат огромное
количество данных. Кстати, знаете ли вы, сколько данных может храниться в
базе данных? Некоторые приложения содержат таблицы с миллионом (и
более!) строк, а в последнем выпуске Огас1е9/ может храниться более 512 пета-
байт (512х10245) данных. Конечно, это всего лишь теоретический предел.
Реальное количество данных, которые вы можете хранить в базе данных Oracle,
зависит от того, сколько дисковой памяти вы выделили для использования
Oracle; но стоит заметить, что манипулирование такими огромными объемами
данных требует от вас особой тщательности. Всегда просите ровно столько,
сколько вам требуется, и ничего лишнего. В этом разделе мы научим вас, как
это сделать.
Сортировка выходных данных с помощью фразы
order by
Заметьте, что Oracle не возвращает запрошенные данные для любого
конкретного столбца — цифрового или текстового — в каком-то определенном
порядке. В строгом соответствии с фундаментальными положениями теории
реляционных баз данных таблица по определению является неупорядоченным
набором строк данных. Это хорошо для "башен из слоновой кости'', но далеко
не всегда подходит к ситуациям реальной жизни. Oracle помогает вам
упорядочить выходные данные операторов select, используя для этого фразу
order by. В этой фразе можно указать порядок сортировки для одного или
нескольких столбцов в возрастающем или убывающем порядке для каждого из
указанных столбцов. Если для порядка сортировки указано более одного
выражения, Oracle сортирует данные в порядке их появления в первом
выражении. Если после этого в выходных данных останутся дубликаты, Oracle
сортирует их в порядке, указанном во втором выражении, и так далее. Фраза order
by обычно является последней в операторах языка структурированных
запросов. Обычно в синтаксис фразы order by включаются как сам текст order
by, так и имена столбцов (или их псевдонимы), по которым Oracle должна
упорядочить результаты, за каждым из которых может следовать специальная
фраза, определяющая направление упорядочивания (asс для упорядочивания
по возрастанию и desc для упорядочивания по убыванию). Значением по
умолчанию для этой фразы является asc. Ниже приводится пример
использования фразы order by:
Ограничение и сортировка возвращаемых данных
43
SOL> select ешрпо,
2 from
3 order
EMPNO
7876
7499
7698
7782
7902
7900
7566
7839
7654
7934
7788
7369
7844
7521
emp
by ename
ENAHE
ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
HARD
ename, sal
asc;
SAL
1100
1600
2850
2450
3000
950
2975
5000
1250
1300
3000
800
1500
1250
\
А вот пример сортировки выходных данных в убывающем порядке с
использованием ключевого слова desc:
SOL> select * from
2 order
EMFNO
7521
7844
7369
7788
7934
7654
7839
7566
7900
7902
7782
7698
7499
7876
by ename
ENAME
WARD
TURNER
SMITH
SCOTT
MILLER
MARTIN
KING
JONES
JAMES
FORD
CLARK
BLAKE
ALLEN
ADAMS
enp
! desc;
JOB
SALESMAN
SALESMAN
CLERK
ANALYST
CLERK
SALESMAN
PRESIDENT
MANAGER
CLERK
ANALYST
MANAGER
MANAGER
SALESMAN
CLERK
MGR
7698
769B
7902
7566
7782
7696
7839
769B
7566
7839
7839
7698
77BB
HIREDATE
22-FEB-81
08-SEP-81
17-DEC-80
19-APR-87
23-JAN-82
28-SEP-81
17-NOV-81
02-APR-ei
03-DEC-81
03-DEC-81
09-JUN-81
01-МАТГ-81
20-FEB-81
23-МАТГ-87
SAL
1250
1500
800
3000
1300
1250
5000
2975
950
3000
2450
2850
1600
1100
COMM
500
0
1400
300
DEPTNO
30
30
20
20
10
30
10
20
30
20
10
30
30
20
Совет Если а столбце, no которому Oracle пытается выполнить
сортировку, появляются данные NULL, Oracle помещает эти строки в конец
списка. При сортировке в убывающем порядке Oracle помещает данные NULL
в начало списка.
Фраза order by может оказаться полезной при создании простых отчетов.
Ее можно применять к столбцам типа NUMBER, текстовым столбцам
(VARCHAR2 и CHAR) и столбцам типа DATE. Вместо имен столбцов во
фразе order by можно даже использовать порядковые номера, указывающие
положение в таблице столбца, по которому следует выполнить упорядочение.
Например, если вы зададите оператор, аналогичный приведенному в следующем
блоке кода, порядок выходных данных будет таким же, как изображенный
ниже (число 2 означает, что для сортировки и упорядочения выходных данных
должен быть использован столбец, указанный вторым во фразе column):
SOL> select ешрпо, ename from enp
2 order by 2 desc;
EMFNO ENAME
7521
7844
7369
7788
7934
7654
7839
7566
7900
7902
HARD
TURNER
SMITH
SCOTT
MILLER
MARTIN
KING
JONES
JAMES
FORD
44
Глава 2
7782 CLARK
769В BLAKE
7499 ALLEN
7876 ADAMS
SQL> select enaoie, empno from emp
ENAHE
MILLER
FORD
JAMES
ADAMS
TURNER
KING
SCOTT
CLARK
BLAKE
MARTIN
JONES
HARD
ALLEN
SMITH
EMPNO
7934
7902
7900
7B76
7844
7B39
7788
7782
7698
7654
7566
7521
7499
7369
Совет Сортировку можно вести и по псевдонимам столбцов.
Ниже приведен более сложный пример:
SQL> select ename, deptno, sal
2 from emp
3 order by 2 sac, 3 deac;
ENAME
KING
CLARK
MILLER
SCOTT
FORD
JONES
ADAMS
SMITH
BLAKE
ALLEN
TURNER
HARD
MARTIN
JAMES
DEPTNO
10
10
10
20
20
20
20
20
30
30
30
30
30
30
SAL
5000
2450
1300
3000
3000
2975
1100
B00
2850
1600
1500
1250
1250
950
Закрепление пройденного материала
1. Необходимо знать, как привести в порядок данные, возвращенные
оператором select, а также знать, что упорядочение возможно в двух
направлениях (asc и deac). Знать, что Oracle может выполнять одновременную
сортировку по нескольким столбцам.
в. Убедитесь, что вы понимаете оба возможных способа (по порядку или по
имени) указания столбцов, по значениям которых выполняется сортировка.
Упражнения
1. С помощью какой из приведенных ниже фраз order by сгенерированы
приведенные в примере выходные данные?
EMPNO ENAME MGR
7369 SMITH 7902
7566 JONES 7B39
77В2 CLARK 7839
769В BLAKE 7B39
7В76 ADAMS 7788
7934 MILLER 77B2
7499 ALLEN 769B
Ограничение и сортировка возвращаемых данных 45
7654 MARTIN 7698
7521 HARD 7698
7900 JAMES 7698
7В44 TURNER 7698
7788 SCOTT 7566
7902 FORD 7566
A. order by empno asc
B. order by ename desc
С order by hiredate asc
D. order by mgr desc
8. Вы сортируете данные используемой в операторе select таблицы по
убыванию столбца, в котором встречаются значения NULL. Куда будут при
сортировке помещены эти записи?
A. В начало перечня
B. В конец перечня
С В середину перечня
D. Останутся на тех же местах, где они были в неупорядоченной таблице
3. Назовите, в каком порядке Oracle выполняет сортировку по умолчанию:
4. Ниже показаны результаты выполнения SQL-запроса: *
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
40 OPERATIONS BOSTON
20 RESEARCH DALLAS
30 SALES CHICAGO
Какой из следующих операторов SQL не мог сгенерировать такие
выходные данные?
A. select deptnor dname, loc from dept order by 2 asc,
1 asc, 3 desc;
B. select deptno/ dname, loc from dept order by 3 asc;
С select deptno, dname, loc from dept order by 2 asc;
D. select deptno, dname, loc from dept order by 2 asc,
3 desc, 1 desc;
Ответы
1. P. 2. A. 3. По возрастанию. 4. В.
Ограничение числа выбираемых данных
с помощью фразы where
С появлением в операторах select фразы where ситуация сразу становится
намного интереснее. Эта важная фраза оператора select дает вам
возможность выделить всего несколько строк из сотен, тысяч или даже миллионов
подобных им строк. Фраза where работает на базовом принципе сравнения и
должна следовать сразу же за фразами select и from оператора SQL. Ниже
приводится пример использования этой фразы:
■В SQL> select * from ешр
2 where empno - 7844;
EMPNO . ENAME JOB MGR HIREDATE SAL СОММ DEPTNO
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
46
Глава 2
Если верно предположение, что в столбце EMPNO содержатся только
уникальные значения, то из таблицы ЕМР будет выбрана для показа только одна
строка. Чтобы определить, какую строку следует отображать, фраза where
выполняет указанную в запросе операцию сравнения. В этом случае в роли
сравнения выступает операция равенства: where empno = 7844. Однако равенство
не является единственной операцией, посредством которой Oracle может
получать данные. Таблица 2.1 демонстрирует некоторые другие виды сравнений.
Каждое сравнение двух величин в Oracle сводится к одной или нескольким
операциям из этой таблицы.
Таблица 2.1. Операции сравнения в Oracle
ж - у
х > у
х >- у
х <- у
х О у
х у, х !- у, х
like
soundex
between
In (множество)
Сравнение для проверки, что х равно у.
Сравнение для проверки, что х больше, чем у.
Сравнение для проверки, что х больше или равно у.
Сравнение для проверки, что х меньше, чем у.
Сравнение для проверки, что х меньше или равно у
Сравнение для проверки, что х не равно у
Специальное сравнение, которое используется в
сочетании с групповыми символами поиска. В Oracle
имеются два групповых символа поиска. Первый из
них — знак процента (%) — используется в Oracle
для обозначения нескольких (произвольного
количества) символов; так, например, ' %ORA%'
используется для обозначения всех столбцов или строк,
содержащих текстовую строку ORA. Второй — знак
подчеркивания (_) — используется для замены
одного символа, как это сделано в примере ' or_cle ' для
поиска всех строк; в которых пользователь мог
сделать опечатку, набрав, например, I вместо А. В
качестве примера применения групповых символов
поиска можно привести следующий оператор: select
ename from ешр where ename is like ' S%'.
Специальная функция, используемая для введения
в сравнения текстовых строк так называемой
"нечеткой логики'' (fuzzy logic) путем разрешения
устанавливать равенство для похоже звучащих слов.
Операция сравнения для диапазона значений,
позволяющая выполнять над датами, числами и
символами операции типа следующего числового
сравнения: у находится в диапазоне от х до z, т.е.
Находится между (between) х и z. Примером
такого сравнения может служить оператор select *
from emp where sal is between 300 and 500.
Специальное сравнение, позволяющее установить
сразу множество операций равенства, определяя
набор значений, каждому из которых может быть
равно сравниваемое значение. Примером
использования этого сравнения может служить оператор
select * from emp where deptno in
(10,20,30).
Можно также использовать фразы where и order by вместе, в одном
операторе. Приведенный ниже блок кода дает пример выборки из таблицы ЕМР
всех данных о сотрудниках отдела продаж, упорядоченной по уменьшению
заработной платы:
SQL> select ename, empno, sal,
2 from emp
3 where job - 'SALESMAN'
4 order by sal desc;
Ограничение и сортировка возвращаемых данных 47
ENAME EMPNO SAL
ALLEN
TURNER
HARD
MARTIN
7499
7844
7521
7654
1600
1500
1250
1250
Как повысить избирательность запросов
Несколько сравнений можно объединить вместе, используя для этого
операции, приведенные в таблице 2.2. В ней приведены операторы и условия, при
которых выполняется критерий, исходя из наличия оператора. Например,
ключевое слово and может быть использовано для объединения вместе двух
сравнений. При этом Oracle возвратит только те строки, для которых будут
справедливыми оба сравнения. Напротив, ключевое слово or делает
возможным намного более слабое объединение двух сравнений и позволяет Oracle
вернуть записи, удовлетворяющие либо одному, либо другому критерию. В
том случае, если запись удовлетворяет обоим критериям, она, конечно, тоже
будет возвращена.
Таблица 2.2. Ключевые слова для объединения сравнений
х and у Должны быть истинными, т.е. выполняться, оба сравнения.
х or у Хотя бы одно из сравнений должно быть истинным.
Not х Логическое отрицание х.
х is NULL Этот оператор возвращает значение TRUE (истина), если
значением х является NULL. С его помощью решается
проблема, когда сравнение переменной х с NULL дает результат
NULL, а не TRUE. Пример: select ename from emp where
mgr is null.
В экзамене ОСР может присутствовать (хотя и необязательно) вопрос о
порядке выполнения операторов (говоря по-другому, о старшинстве операторов)
во фразе where оператора select. Приведем тот порядок, в котором Oracle
разрешает операторы во фразе select:
1. В первую очередь выполняются операторы сравнения.
S. Затем Oracle разрешает все операторы and как единый блок.
3. После этого Oracle разрешает все операторы or как отдельные блоки.
4. Наконец, Oracle разрешает все операторы not. Для изменения порядка
выполнения операторов можно использовать скобки.
Несколько примеров
Рассмотрим более сложный пример запроса, в котором используется фраза
where, так что мы сможем увидеть в действии некоторые другие операции
сравнения и ключевые слова из таблицы 2.2. Предположим, что мы желаем
получить информацию обо всех сотрудниках нашей компании, которые
получают более 900 долларов в год, а фамилии которых попадают в диапазон от
QUENTIN до ZYRYRAB. Приведенный ниже блок кода показывает, что
произойдет при выполнении этого запроса:
SQL> select ешрпо, ename, sal
2 from emp
3 where sal > 900
4 and ename between 'QUENTIN' and 'ZYRYRAB';
EMPNO ENAME SAL
7521 WARD 1250
7788 SCOTT 3000
7B44 TURNER 1500
48
Глава 2
Возможно, вы обратили внимание, что в приведенных выше выходных
данных отсутствует президент компании KING. Из предыдущих примеров и
из главы 1 вам известно, что он зарабатывает больше денег, чем SCOTT,
WARD или TURNER, и вот он не попал в число отобранных. Оказывается,
для этого имеется простая причина. Дело в том, что фамилия KING
лексикографически не попадает в заданный интервал фамилий (от QUENTIN до
ZYRYRAB), а так как для объединения двух критериев сравнения мы
использовали операцию AND, то KING оказался в числе исключенных.
А теперь рассмотрим другой пример выходных данных, где присутствуют
служащие, получающие более 900 долларов в год, или те, чьи фамилии
лексикографически попадают в интервал от QUENTIN до ZYRYRAB:
SQL> select empno, ename, sal
2 from erap
3 where sal > 900
4 OR ename between 'QUENTIN' and 'ZYRYRAB';
EMPNO
7369
7499
7S21
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
Как видно из представленных выходных данных, оказалось, что
избирательность нашего запроса равна нулю, потому что все сотрудники компании
попали в круг, очерченный заданными критериями. Другими словами, каждый
из сотрудников компании либо зарабатывает более 900 долларов в год, либо
имеет фамилию, лексикографически содержащуюся в диапазоне от
QUENTTNE до ZYRYRAB.
Наконец, взглянем на пример использования оператора отрицания (not),
чтобы увидеть, как этот "инвертор" может изменить выходные данные запроса:
SQL> select empno, епаше, sal
2 from emp
3 where sal > 900
4 OR ename NOT between 'QUENTIN' and 'ZYRYRAB';
EMPNO
7499
7521
7566
7654
7698
77B2
7788
7839
7844
7876
7900
7902
7934
ENAME
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
SAL
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
Вы заметили, кого нет в новом списке? В нем отсутствует SMITH, чья
фамилия как раз и попадает в интервал от QUENTIN до ZYRYRAB. Таким
образом, мы увидели, как этот инвертор может вычеркивать записи, которые в
противном случае попали бы в набор выходных данных. Однако мы советуем
быть осторожными при использовании ключевого слова not. Вы можете
включить его в контекст, где оно должно появляться вместе с другими ключе-
Ограничение м сортировка »«т""цппмитг данных
40
выми словами, но не перед символами или выражениями. Например, в Oracle
SQL можно использовать фразу where empno is not null, но использование
фразы where sal not > 900 приведет к ошибке.
Совет Значительная часть экзамена ОСР по SQL посвящена проверке
вашей возможности формулировать запросы с фразой where. Следовательно,
очень важно практиковаться в этом.
Закрепление пройденного материала
1. Умейте дать определение, что представляет собой фраза where и в чем
состоят принципы сравнения, которые используются в этой фразе для
выявления данных, которые будут возвращены пользователю.
8. Знайте все имеющиеся операции, которые могут помочь вам при
сравнении. Кроме того, убедитесь, что знаете, какие операции дают возможность
указывать во фразе where более одного сравнения.
Упражнения
1. Вы определяете оператор SQL для возврата ограниченного числа строк на
основании определенных критериев. В каком из приведенных ниже
вариантов ответа содержится имя фразы, которую необходимо использовать
для задания критерия поиска?
A. select B. from
С where D. order by
9. Принцип, по которому действуют все имеющиеся в SQL-операторе select
критерии поиска, называется
3. Операция, которую используют, если желают определить, содержит ли тот
или иной столбец значение NULL, называется (в ответе разрешено
употребить два слова)
4. Вы желаете получить данные из таблицы ORDERS с тремя столбцами:
CUSTOMER, ORDER_DATE и ORDER_AMT. В каком из ответов
приводится правильный вариант задания фразы where запроса к таблице
ORDERS, если вы желаете увидеть строки таблицы заказов, относящиеся к
заказчику по фамилии LESLIE, объем которых превышает 2700 долларов?
A, where customer = 'LESLIE';
B. where customer = 'LESLIE' and order_amt < 2700;
С where customer - 'LESLIE' or order_amt > 2700;
D. where customer = 'LESLIE' and order_amt > 2700;
Ответы
1. С. 2. Сравнение. 3. is NULL. 4. D.
Использование однострочных функций
В этом разделе рассматриваются различные аспекты, связанные с тем, как
используются так называемые однострочные функции:
■ Что такое однострочные функции
■ Использование функций в операторе select
■ Функции для работы с датами
■ Функции преобразования
50
Глава 2
В Oracle имеются десятки функций, которые могут быть использованы для
многих целей. Многие из этих функций разработаны для изменения данных,
возвращаемых запросом, как, например, уже известная нам функция nvl ( ).
Функции этой категории предназначены для работы со столбцами,
содержащими любые типы данных, и возвращают информацию различными
способами. Другие однострочные функции работают только с одним или несколькими
типами данных. В этом разделе мы объясним использование различных
важных для базы данных Oracle однострочных функций. Однострочные функции
предназначены для работы со столбцами индивидуальных строк (записей) для
каждой строки возвращаемого по результатам запроса набора данных. Кроме
того, мы познакомимся с тем, как эти функции используются в командах SQL.
Также будут подробно рассмотрены функции для работы с датами и функции
преобразования.
Различные типы однострочных функций
Функции похожи на операторы сравнения в том смысле, что они
манипулируют элементами данных и возвращают результат. А отличие их заключается в
том, что обычно они могут выполнять более сложные вещи, чем простые
сравнения. Имеется несколько различных типов функций, среди которых мы
выделим следующие:
■ Текстовые функции, выполняющие операции над буквенно- цифровыми
текстовыми строками
■ Арифметические функции, выполняющие операции над числами
■ Функции для работы со списками, выполняющие операции над списками
значений
■ Прочие функции, например decode ( ), выполняющие важные или
уникальные операции
Текстовые функции
Несколько функций Oracle манипулируют текстовыми строками. По
концепции работы эти функции аналогичны nvl ( ) и decode ( ) в том смысле, что
они производят изменения в некоторой части данных, но функции из этого
семейства могут изменять только данные типов VARCHAR2 и CHAR. Ниже
приведено несколько примеров:
■ lpad(x,y[,z]) и zptd(x, y[,z]) Возвращает данные из строки или из
столбца х, сдвинутые влево (или вправо) на у позиций. Необязательный
параметр z определяет тот символ (или символы), который будет
использован функцией lpad ( ) или rpad ( ) для вставки на освободившееся в
результате сдвига место. Если параметр z не указан, используется пробел.
■ lower (x), upper (x) и initcap (x) Возвращает данные из строки или
столбца х, записанные с использованием только нижнего или верхнего
регистра, или заменяет первую букву данных из столбца х на заглавную
(прописную) букву.
■ length (х) Возвращает число символов строки или столбца х.
■ substr (х, у [, z]) Возвращает подстроку строки или столбца х,
начинающуюся с символа, стоящего в позиции у. Эта подстрока либо содержит z
символов, либо (если параметр z не указан) продолжается вплоть до конца
исходной строки или столбца. К примеру, substr ( 'abcdefc ,3,4)
возвратит строку 'CDEF'.
■ inatr (x,y) Определяет, входит ли заданная подстрока у в строку х.
Например, instr (* CORPORATE FLOOR", 'OR') возвратит нам число 2.
Функция trim ( ) Однострочная функция, называемая trim ( ), ведет себя
как комбинация функций ltrim ( ) и rtrim ( ). Функция trim ( ) принимает
Ограничение м сортировка воааращаомых данных
51
строку, описывающую данные, которые вы желаете удалить из столбца,
используя для этого следующий синтаксис: trim{[[ключевое_слово] 'х' from]
иия_столОца). Первый параметр (ключевое_слово) может принимать
значения leading (начальные), trailing (хвостовые) или both (и те, и другие),
или вообще быть опущенным. Параметр х заменяется тем символом, который
следует удалить из столбца, или также пропускается. Если параметр х
пропущен, Oracle предполагает, что должны быть удалены пробелы. И наконец,
иия_столбца указывает на изменяемый столбец таблицы. Обратите
внимание, что функция tr im ( ) удаляет только хвостовые или лидирующие
экземпляры специфицированного символа. Если этот символ встречается в других
местах строки, функция trim ( ) не удалит его. Приведенный ниже блок кода
служит иллюстрацией использования trim ( ):
SQL> select col_l,
2 trim(both ■_• from col_l) as trimmed
3 from example;
LASTNAME TRIMMED
thr_ thr
g_593 8_S93
Booga Booga
А вот еще один пример:
SQL> select trim(0 from 000004439094000)
2 as example
3 from dual;
EXAMPLE
4439094
Совет Таблица, использованная в предыдущем примере, не создана
сценарием utlsampi. sql и не появится в вашей базе данных до тех пор, пока вы
сами не создадите ее и не заполните ее значениями. Однако это весьма
тривиальный пример, и вы с большим толком потратите себе время на
формулирование фразы where, но если вам необходимо восстановить в памяти
этот пример, все инструкции по созданию таблиц и добавлению в них
данных можно найти в главе 5.
Арифметические функции
Для выполнения специализированных математических функций,
используемых в научных приложениях, например для вычисления синусов и
логарифмов, предназначены другие функции. Подобные операции обычно
называются арифметическими или числовыми действиями. Ниже перечислены функции,
попадающие в эту категорию. Здесь, конечно, упомянуты далеко не все
имеющиеся в Oracle функции, а те из них, которые используются чаще других и с
большей вероятностью могут встретиться вам на первом экзамене ОСР:
Ш aba (дс) Вычисляет абсолютное значение числа. Так, например,
абсолютное значение числа —1 равно 1, а абсолютное значение числа 6 равно 6.
■ , round (ж,у) Округляет число х с точностью до у десятичных знаков
после десятичной точки. Если значение у отрицательное, округление
производится до у знаков перед (слева) десятичной точкой.
Например, round (134 .345,1) = 134.3, round(134.345,0) = 134, a
round (134 . 345, -1) = 130. Эту функцию можно также применять к
столбцам типа DATE.
Ш ceil (дс) Действие этой функции аналогично округлению до целого
числа (например, round (x, 0)), с тем исключением, что функция ceil всегда
выполняет округление в большую сторону. Например, ceil (1.4) = 2.
Заметьте, что в результате округления отрицательных чисел получаются
значения, более близкие к нулю (например, ceil (-1.6) = -1, а не —2).
52
Глава 2
■ floor (дс) Полностью аналогична cell, за исключением того, что функция
floor всегда округляет в меньшую сторону. Так, floor (1.6) = 1. Заметьте,
что в результате округления отрицательных чисел получаются значения,
более удаленные от нуля (например, floor (-1.6) = -2, а не -1).
■ mod(jr,y) Остаток по модулю, определяемый как при делении в столбик:
х делится на у до тех пор, пока больше нельзя получить целое число.
Например, mod (10,3) = 1, a mod(10,2) = 0.
■ aign (дс) Возвращает целое значение, соответствующее знаку х: 1 — если
х положительно, -1 — если х отрицательно.
■ aqrt (дс) Квадратный корень из х.
■ trvmc (дс, у) Усекает (truncate) значение х до у десятичных знаков после
запятой (если у положительно) или перед запятой (если у отрицательно).
Эту функцию можно использовать для столбцов типа DATE.
■ vaiza (дс) Размер памяти в байтах, занимаемый числом х.
Совет Все арифметические функции, получившие на входе значение NULL,
вернут в качестве результата значение NULL.
Функции для работы со списками
Последней категорией числовых функций, которая будет обсуждена здесь,
является набор функций для работы со списками. Реально эти функции
используются для множества различных типов данных, в том числе VARCHAR2,
NUMBER и DATE. Давайте перейдем к рассмотрению имеющихся в Oracle
функций для работы со списками:
■ gxaataat (дс, у,...) Возвращает наибольшее из значений перечисленных
в списке текстовых строк, чисел или дат (х, у...).
■ l«*at(x,y,...) Возвращает наименьшее из значений перечисленных в
списке текстовых строк, чисел или дат (х, у...).
Совет Если после прочтения материала обо всех этих функциях вы
немного обескуражены тем, что не представляете, как будут выглядеть
выходные данные их работы в SQL*Plus, не беспокойтесь. В последующих
обсуждениях мы обязательно рассмотрим некоторые примеры.
Функция decode ( )
Отдельного рассмотрения требует одна из наиболее часто употребляемых
однострочных функций. Она называется decode ( ). Функция decode ( )
работает по тем же принципам, что и оператор if-then-else, часто применяемый
в различных языках программирования, в том числе и в PL/SQL. При вызове
функции decode ( ) вы можете передать в нее переменное число значений,
которые затем появятся во фразе column оператора select. Первым
элементом списка параметров всегда должно быть имя столбца, который вы
собираетесь декодировать. Затем вы идентифицируете первое конкретное значение,
которое Oracle должен будет искать в декодируемом столбце. После этого
значения вводится значение, которое должно появиться в выходных данных
запроса, если Oracle встретит указанное ранее значение. Начиная с этого места,
вы можете определить столько пар значение-замена, сколько пожелаете.
После окончания списка замен можно, при желании, указать значение, которое
будет возвращено Oracle, если значение столбца не совпадет ни с одним из
указанных в функции значений. Посмотрите на приведенный ниже блок кода,
чтобы лучше понять, как все это работает:
SELECT decode(имя_столОца,
зкачекие1, эамена1,
зкачекие2, заыена2,
г
реэуль тат_по_у1*олчанию)
FROM ... ;
Ограничение м сортировка аоаартцаамых данных
53
Функция decode ( ) делает возможными мощные преобразования данных
от одних значений к другим. Скоро вы увидите несколько примеров
применения функции decode ( ). Мы поставили рассказ об этой функции первым,
потому что, как и nvi ( ), decode ( ) может работать практически со всеми
типами данных Oracle. Начиная с этого момента все описанные функции будут
иметь ограничения по типам данных, с которыми они могут работать. Давайте
рассмотрим пример:
SQL> select ename, decode(deptno, 10, 'Accounting',
2 20, 'Research',
3 30, 'Sales',
4 40, 'Operations', 'Other') Department
5 from erap
6 order by, department;
ENAME DEPARTMENT
CLARK
KING
MILLER
SMITH
ADAMS
FORD
SCOTT
JONES
ALLEN
BLAKE
MARTIN
JAMES
TURNER
WARD
Accounting
Accounting
Accounting
Research
Research
Research
Research
Research
Sales
Sales
Sales
Sales
Sales
Sales
Закрепление пройденного материала
1. Убедитесь, что вы можете идентифицировать функции, о которых шла речь
выше, как символьные, математические или функции для работы с датами.
Вспомните, какие две функции дают вам возможность преобразовывать
значения столбцов, не обращая внимания на тип содержащихся в них
данных.
2. Знайте, как используется функция trim ( ).
3. Понимайте действие функций, работающих со списками, речь о которых
шла выше, выполняющих действия над конкретными наборами данных.
Упражнения
1. Результат действия математической функции равен —97, а переданное на
вход значение было равно —97.342. Какая из указанных ниже функций
могла произвести такой результат?
A. abs( ) В. ceil ( )
С mod( ) D. sqrt( )
9. Вы хотите определить размер в байтах значения конкретного столбца.
Какая из приведенных ниже однострочных функций может помочь вам в
этом?
A»vsize( ) В. trunc( )
С trim( ) D. greatest( )
3. Какая из перечисленных ниже однострочных функций, о которых шла
речь выше, действует аналогично выражению if-then-else?
Ответы
1. В. 2. А. 3. decode( )
54
Глава 2
Использование функций в операторах select
Теперь посмотрим, как действуют все эти функции. В первом примере
детально разбирается использование оператора decode ( ). Предположим, что мы
выбираем данные из таблицы ЕМР. Данные в столбце JOB определяют, какую
роль выполняет в компании каждый из служащих. Вместо того чтобы вывести
просто название должности, приведенный ниже блок кода покажет вам, как
можно записать глагол, определяющий роль служащего, чтобы вы могли быть
уверены, что в нашей компании нет лентяев и лежебок:
НВ SQL> select ename I I does the I I
2 decode(job, 'ANALYST','analyzing',"CLERK1,'filing',
3 'MANAGER','managing','PRESIDENT','bossing around',
4 'SALESMAN1, 'golfing', 'goofing off) as functions
5 from emp;
FUNCTIONS
SMITH does the filing
ALLEN does the golfing
WARD does the golfing
JONES does the managing
MARTIN does the golfing
BLAKE does the managing
CLARK does the managing
SCOTT does the analyzing
KING does the bossing around
TURNER does the golfing
ADAMS does the filing
JAMES does the filing
FORD does the analyzing
MILLER does the filing
Команда decode ( ) имеет 12 переменных. Первая представляет собой имя
декодируемого столбца и должна присутствовать в операторе всегда.
Следующие две переменные определяют соответственно значение, которое можно
найти в столбце JOB (в нашем случае, это значение ANALYST), и то, на что
должна заменить его функция decode ( ), если это значение будет
обнаружено в столбце JOB (в нашем случае — ANALYST). Это приведение в
соответствие потенциальных значений и подходящих их замен продолжается до тех пор,
пока вы не просмотрите все случаи, которые хотели декодировать. Последняя
(необязательная) переменная используется для замены тех значений столбца,
которые не были указаны в перечислении.
Примеры текстовых функций
Теперь займемся примерами для текстовых (символьных) функций. Начнем
мы с примеров для функций rpad ( ) и lpad ( ). Как будет показано в
примере, эти функции могут быть использованы для получения требующейся
ширины столбца путем вставки дополнительных символов-заполнителей слева и
справа от данных столбца.
SQL> select епаше I I does the I I
2 MM (decode < job, 'ANALYST','analyzing','CLERK','filing',
3 'MANAGER','managing','PRESIDENT','bossing around',
4 'SALESMAN','golfing','goofing off'), 10, '-') as functions
5 from emp
6 where empno < 7600;
FUNCTIONS
SMITH does the filing
ALLEN does the golfing
HARD does the golfing
JONES does the managing—
Совет В этом примере иллюстрируется еще один важный принцип:
выходные данные одной функции SQL могут служить входом для другой/
Ограниченна м сортировка аозвратаомых данных
55
Далее показаны некоторые из наиболее простых символьных функций.
Следующие примеры демонстрируют однострочные функции, которые иногда
называют "трансляторами регистров'' (case translators), так как они
выполняют простой перевод регистра, основываясь на поступившей на вход
текстовой строке:
SQL> SELECT lower(ename) as one,
2 upper(ename) as two,
3 initcap(ename) as three
4 FROM emp;
ONE
smith
alien
ward
jones
martin
blake
dark
scott
king
turner
a dams
james
ford
miller
TWO
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
THREE
Smith
Allen
Ward
Jones
Martin
Blake
Clark
Scott
King
Turner
Adams
James
Ford
Miller
Еще одной простой и полезной символьной функцией является функция
length ( ), возвращающая длину текстовой строки:
SQL> select ename, length(ename) as length
2 from emp;
ENAME LENGTH
SMITH 5
ALLEN 5
WARD 4
JONES S
MARTIN 6
BLAKE 5
CLARK 5
SCOTT 5
KING 4
TURNER 6
ADAMS 5
JAMES 5
FORD 4
MILLER 6
Совет Если в строку включены пробелы, двойные кавычки или другие
специальные символы, все они считаются частью длины строки.
Еще одной важной функцией, связанной с текстовыми строками, является
функция substr ( ). Эта функция обычно используется для выделения
данных из более длинной текстовой строки. Функция substr ( ) получает из
своего первого параметра используемую для поиска полную текстовую строку.
Второй параметр содержит целое число, означающее номер символа, с
которого должна начинаться результирующая подстрока. Третий параметр
является необязательным и определяет, сколько символов вправо от начала
подстроки должно быть в нее включено. По умолчанию (то есть в том случае, если
третий параметр опущен) в подстроку включаются все символы до самого
конца строки. Познакомьтесь с приведенными ниже выходными данными,
чтобы лучше понять, к чему приводит отсутствие третьего параметра:
SQL> select ename, substr(ename,2,3)
2 from emp;
ENAME SOB
SMITH MIT
ALLEN LLE
WARD ARD
JONES ONE
56
Глава 2
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
SQL> se
ART
LAK
LAR
COT
ING
URN
DAM
AME
ORD
ILL
lect епаше, :
2 from erap;
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
SUBSTR(EN
MITH
LLEN
ARD
ONES
ARTIN
LAKE
LARK
COTT
ING
URNER
DAMS
AMES
ORD
ILLER
Примеры арифметических функций
Числовые (математические) функции часто используются в научных
приложениях. Первая функция, которую мы собираемся детально проанализировать,
называется abs ( ), или абсолютным значением. С ее помощью вычисляется,
как далеко от нуля на числовой оси лежит переданный ей параметр:
SQL> SELECT ABS(25), ABS(-12) FROM DUAL;
ABS(25) ABS(-12)
25 12
Следующей числовой функцией является функция ceil ( ), которая
автоматически округляет переданное как параметр число в большую сторону (до
ближайшего большего целого числа):
SQL> SELECT CEIL(123.323), CEIL(45),
2 CEIL(-392), CEIL(-1.12) FROM DUAL;
CEIL(123.323) CEIL(45) CEIL(-392) CEIL(-1.12)
124 45 -392 -1
Еще одна однострочная функция называется floor ( ). Функцию floor ( )
можно назвать противоположностью функции сел. 1 ( \, так как она округляет
переданное значение в меньшую сторону (до ближайшего меньшего целого
числа):
SQL> SELECT FLOOR(123.323), FLOOR(45), FLOOR(-392),
2 FLOOR(-1.12) FROM DUAL;
FLOOR(123.323) FLOOR(45) FLOOR(-392) FLOOR(-1.12)
123 45 -392
Следующая рассматриваемая нами в этом разделе функция относится к так
называемому "делению в столбик". Эта функция называется mod ( ) и
возвращает для числа остаток от деления, или модуль (modulus):
SQL> SELECT MOD(12,3), MOD(55,4) FROM DUAL;
MOD(12,3) MOD(55,4)
0
3
Ограничение и сортировка возвращаемых данных
57
Теперь перейдем к функции round ( ). Эта важная функция дает
возможность округлить число с заданной точностью:
SQL>
SELECT ROUND(123.323,2), ROUND(45,1),
2 ROUND(-392,-1), ROUND(-1.12,0) FROM DUAL;
ROUND(123.323,2) ROUND(45,l) ROUND(-392,-1) ROUND(-1.12,0)
123.32 45 -390 -1
Следующая функция называется sign ( ). Она помогает определить,
является число положительным или нет. Если переданное число является
положительным, sign ( ) возвратит 1, а если число отрицательное, sign ( ) возвратит
-1. Если же число равно нулю, sign ( ) возвратит 0:
SQL> SELECT SIGN(-1933), SIGN(55), SIGN(O) FROM DUAL;
SIGN(-1933) SIGN(55) SIGN(O)
-1
В роли следующего примера выступает функция sqrt ( ). Она
используется для извлечения квадратного корня из числа:
SQL> SELECT SQRT(34), SQRT(9) FROM DUAL;
SQRT(34) SQRT(9)
5.830951 3
Следующая однострочная функция называется trunc ( ).
Аналогично тому, как это делает функция round ( ), функция trunc ( ) обрезает
(truncate) передаваемое число в соответствии с заданной точностью:
SQL> SELECT TRUNC(123.232,2), TRUNC(-45,1),
2 TRUNC(392,-1), TRUNC(5,0) FROM DUAL;
TRUNC(123.232,2) TRUNC(-45,1) TRUNC(392,-1) TRUNC(5,0)
123.23 -45 390 5
Последней однострочной функцией, которую мы рассмотрим в этом
разделе, будет функция vsize ( ). Эта функция годится не только для цифровых
типов данных. Функция vsize ( ) дает размер в байтах для любого значения
типов VARCHAR2, CHAR, NUMBER, DATE, ROWID или для столбцов с
другими типами данных:
SQL> SELECT VSIZE(384838), VSIZE(• ORANGEJTABBY'),
2 VSIZE(sysdate) FROM DUAL;
VSIZE(384838) VS1ZE1'ORANGE TABBY") VSIZE(SYSDATE)
4 12 8
Закрепление пройденного материала
1. Убедитесь, что понимаете назначение оператора decode ( ) и что этот
оператор принимает все общеупотребительные типы данных Oracle.
Удостоверьтесь, что вы можете правильно записать обращение к этой функции.
В. Знайте, как используются текстовые функции. Удостоверьтесь также, что
вы понимаете, как комбинировать две функции, используя выходные
данные одной функции как вход для другой.
3. Вспомните, как используются основные математические функции. Будьте
уверены, что знаете, как, используя таблицу DUAL, применять их для
реальных столбцов и фиксированных выражений.
Упражнения
1. Используйте приведенные ниже выходные данные для ответа на вопрос
(исходя из предположения, что показанная ниже информация получена из
таблицы ЕМР, которую мы постоянно используем в этой главе).
58
Глава 2
ENAME
SMITH-dog-
ALLEN-dog-
WARD-dog-d
JONES-dog-
MARTIN-dog
BLAKE-dog-
CLARK-dog-
SCOTT-dog-
KING-dog-d
TURNER-dog
ADAKS-dog-
JAMES-dog-
FORD-dog-d
MILLER-dog
В каком из вариантов ответа записан тот оператор SQL, с помощью
которого были получены приведенные выше выходные данные?
A»select trim(trailing '-dog' from ename) as ename from
emp;
B. select rpad(ename, 10, '-dog') as ename from emp;
С select substr(ename, 1, 10) as ename from emp;
Dselect lpad(ename, 10, '-dog') as ename from emp;
8. Используйте для ответа на вопрос следующий блок кода:
SQL> select (■-45) as output from dual;
ODTPUT
-45
Какой из перечисленных ниже вариантов указывает на однострочную
функцию, которая не могла сгенерировать показанные выше выходные
данные?
A. abs( ) В. ceil( )
С floor( ) D. round( )
3. Столбец, содержащий данные типа VARCHAR2, в одной из строк
содержит значение SMITHY, дополненное приложением семью пробелами.
Какое значение будет возвращено при обработке этого значения функцией
length( )?
А. 5 В. 6
С 12 D. 13
4. Вы записали следующий оператор SQL*Plus:
SQL> select ceil(-97.342),
2 floor(-97.342),
3 round(-97.342,0), ^
4 trunc(-97.342),
5 from dual;
Какой из вариантов ответа указывает на функцию, которая не возвратит в
качестве результата число —97?
A. ceil () В. floor ( )
С round( ) D. trunc( )
5. Вы ввели в SQL'Plus следующий оператор:
SQL> select ceil (256.342),
2 floor(256.342),
3 round(256.342,0),
4 trunc(256.342)
5 from dual;
Какой из вариантов ответа указывает на функцию, которая не возвратит
в качестве результата число 256?
Ограничение и сортировка возвращаемых данных 59
A. ceil ( ) В. floor( )
С round( ) D. trunc( )
Ответы:
1. В. 2. А. 3. D. 4. В. Функция ceil ( ) возвратит -97, потому что -97 ближе к 0 и по-
этому больше, чем —98. 5. А
Функции для работы с датами
Вы можете не найти этого в официальных заданиях экзамена ОСР 9/ SQL,
изложенных в руководстве кандидата (Candidate Guide), но понимание функций
для работы с данными является важным при пользовании базами данных
Oracle. Поэтому мы решили выделить их в отдельный раздел. Прежде чем мы
начнем обсуждение функций для работы с данными, вы должны запомнить,
что имеется специальное ключевое слово, которое можно указать, чтобы
предоставить пользователю Oracle текущую дату. Это слово называется sysdate.
Точно так же, как ранее в этой главе вы выполняли простые арифметические
действия, используя для этого таблицу DUAL, можно выполнять операторы
select, используя в них ключевое слово sysdate для получения текущей даты.
Ниже приведен пример:
SQL> SELECT sysdate FROM DUAL;
SYSDATE
15-MAR-01
Совет Информация типа DATE, получаемая при использовании ключевого
слова sysdate, — это дата для сервера, на котором базируется база данных
Oracle. Поэтому возвращенная информация о дате может отличаться от
информации о дате для вашего клиентского ПК.
И еще одно замечание о формате. Обычно по умолчанию Oracle
отображает информацию о дате либо в формате DD-MON-YY, либо в формате
DD-MON-YYYY. Как вы понимаете, DD здесь обозначает двузначную дату
(01 — первый день месяца, 02 — второй день месяца и так далее), MON —
это трехсимвольное обозначение месяца (JAN — январь, FEB — февраль и
так далее), a YY или YYYY — это две последние цифры года или год
полностью. Если ваша организация использует Oracle и вы получили
информацию о дате (sysdate) в каком-либо другом формате, отличающемся от
описанного выше, не стоит паниковать! Всегда имеется шанс, что ваш АБД
(или кто-нибудь еще) изменил способ отображения Oracle информации о
дате и использовал какие-то форматы, отличающиеся от применяемых по
умолчанию. Немного позже мы поговорим о способах, с помощью которых
можно применить к информации Oracle о датах другие маски форматов.
Некоторые из имеющихся функций
для работы с датами
Имеющиеся в Oracle функции для работы с датами могут работать со
столбцами, содержащими тип данных DATE. Эти функции весьма полезны при
выполнении вполне определенных операций с данными типа DATE из таблиц и
с постоянными величинами. Готовясь к экзамену ОСР, удостоверьтесь, что вы
вполне разбираетесь в этом вопросе. Ниже приводится (неполный) перечень
функций для работы с датами вместе с их определениями:
■ add_month (x,y) Возвращает дату, соответствующую дате х, увеличенной
на у месяцев.
■ last_day (х) Возвращает дату последнего дня месяца, к которому
относится дата х.
60
Глава 2
■ monthjbetween (ж,у) Возвращает количество месяцев между датами х и
у. Если дата х более ранняя, чем у, результат будет отрицательным, в
противном случае — положительным. Если даты х и у содержат один и тот же
день для различных месяцев, результат будет целым, в противном случае
— числом с десятичной дробью.
■ n«w_tim* (х, у, z) Возвращает текущую дату и время для даты х во
временной зоне у, какой она была бы во временной зоне z.
■ next_day (x) Идентифицирует название дня, следующего за заданной
датой х.
Теперь рассмотрим информацию о датах и связанные с ней функции
несколько поподробнее. Как уже упоминалось ранее, Oracle хранит даты как
целые числа, представляющие число дней, прошедшее с начала действия
юлианского календаря. Этот метод позволяет легко изменять формат представления
даты на выходе и обеспечивает правильность работы в таких случаях, как
смена тысячелетий. Первой функцией, о которой пойдет речь, станет функция
add_month ( ). Эта функция принимает на входе дату и число месяцев,
которое необходимо к ней прибавить. Затем Oracle возвращает новую дату, равную
старой с добавленным числом месяцев:
SQL> SELECT ADD_MO(JTHS (■ 15-MAR-00 ■ ,26)
2 FROM DUAL;
ADD_M0(JTHS(45
15-MAY-02
Следующая функция — last_day ( ) — помогает определить дату
последнего дня месяца для заданной на входе даты:
SQLSELECT LAST_DAY (• 15-MAR-00') FROM DUAL;
LAST_DAY('15-M
31-HAR-OO
Следующая функция для работы с датами определяет количество месяцев
между двумя различными датами. Эта функция называется months_between ( ).
Синтаксис этой команды является довольно хитроумным и поэтому
будет приведен ниже. Этот синтаксис выглядит следующим образом:
monthsbetween (x,y) и возвращает значение х-у.
SQL> SELECT MONTHS_BETWEEN(' 26-JUN-99', ' 15-MAR-00") FROM DUAL;
MONTHS BETWEEN
-8.6451613
Совет Вообще говоря, вы должны пытаться определять передаваемые
в функцию months_between ( ) значения таким образом, чтобы первое
значение было больше второго. Если переданное вами второе значение
окажется больше первого, будет возвращена отрицательная величина.
Последний пример функций для работы с данными — это функция
new_time ( ). Она принимает три параметра. В первом содержатся текущие
дата и время, во втором — часовой пояс той точки, для которой задан первый
параметр, а в третьем — часовой пояс той точки, ко времени которой вы
хотите перейти. Название каждого часового пояса сокращено следующим образом:
AST или XDT, где S и D означают стандартное и летнее время соответственно,
а X означает первую букву названия часового пояса (к примеру, Atlantic, Bering,
Central, Eastern, Hawaii, Mountain, Newfoundland, Pacific или Yukon). Из этого
правила имеются два исключения: всемирное (гринвичское среднее) время
обозначается как GMT, а для Ньюфаундлендского часового пояса отсутствует
летнее время. Взгляните на следующий пример:
SQL> ALTER SESSION
2 SET NLS_DATE_FOBMAT - "DD-MON-YYYY HH24:MI:SS';
Session altered.
Ограничение и сортировка возвращаемых данных
ei
SQL> SELECT 1ЮТ_Т1Щ('15-MML-1999 14:35:00','ЫТ','OfE')
2 FROM DUAL;
MKHTMB (' 15-ШШ-199
15-МШ.-1999 18:35:00
До сих пор ни в одном из использовавшихся для демонстрации действия
функций работы с датами запросов не требовалось подобной точности. Для
того чтобы продемонстрировать все возможности Oracle в новой функции
newtime ( ), мы изменили формат, используемый Oracle для отображения
информации о дате, известный как формат даты NLS (National Language Set —
комплект поддержки национальных языков). Команда alter session set
nlsdateformat может быть использована для отображения полной даты и
времени для запроса. В последующем обсуждении содержится информация,
которая может показаться вам полезной для определения масок формата даты
для NLS_DATE_FORMAT.
Арифметические действия над датами
Внутренний формат хранения дат в Oracle — это целые числа, так что можно
выполнять над датами арифметические действия, как будто они являются
числами. Можно прибавлять к датам или вычитать из дат целые числа и получать
при этом новые значения дат. Так, если мы хотим определить, когда у
сотрудника истекает 180-дневный испытательный срок, отталкиваясь при этом от
даты его приема на работу, мы должны выполнить следующий запрос:
taaasag SQL> select hiredate + 180 as "Review Date"
2 from emp
3 where ename - 'TURNER';
Review Da
07-MAR-82
И наоборот, можно вычесть друг из друга две даты, чтобы найти,
например, число недель между этими датами, отработанных на компанию
каким-либо конкретным сотрудником. Как это можно сделать, показано в
следующем примере:
SQL> select ename, (sysdate-hiredate)/7 as "Weeks at Work"
2 from emp
3 where ename •= 'TURNER';
ENAME Weeks at Work
TURNER 4176.485
Закрепление пройденного материала
1. Даты хранятся в Oracle в виде чисел, что позволяет базе данных отображать
их с помощью множества форматов.
В. Формат даты определяется с помощью команды alter session set
nls_date_format.
3. Умейте идентифицировать и использовать описанные в этом разделе
функции для работы с данными, возвращающие информацию о датах. Помните,
что только функция monthsbetween ( ) возвращает информацию,
имеющую тип данных, отличающийся от DATE.
Упражнения
1. Вы задаете в Oracle следующий запрос:
SQL> select sysdate from dual;
SYSDATE
THURSDAY, MARCH 15 2001 10:35AM
62
Глава 2
Какая маска формата была использована для генерации этих выходных
данных?
A.DD, MONTH DAY RRRR HH:MI
В. DAY, MONTH DD YYYY HH:MIAM
С DAY, MON DD RR HH:MIAM
D. MONTH, DAY DD YYYY HH24:MI
8. Вы задаете в Oracle следующий запрос:
SQL> select months_between('15-MAR-83', 45-MAR-97') from dual;
Что возвратит Oracle?
A. 14 B. -14
С 168 D. -168
3. Какая команда используется для корректировки используемого вами
формата даты в то время, когда вы подключены к Oracle (два слова)?
Ответы
1. В. Этот вопрос нельзя отнести к числу простых — о соглашениях (conventions) по
поводу форматов даты речь пойдет только в следующем обсуждении этой главы. 2. D.
3. alter session
Функции преобразования
Функции преобразования предназначены для конвертирования данных из
одного формата типа данных в другой. Эти функции не приводят к реальному
изменению хранящихся в таблице данных; они всего лишь возвращают
преобразованные значения данных в ваш сеанс SQL*Plus. На рис. 2.1 показано, как
можно преобразовать информацию из одного типа данных в другой,
используя различные функции. В базе данных Oracle имеется несколько различных
функции преобразования, перечисленных ниже:
■ to_ch*r (x) Преобразует значение х в символы или преобразует дату в
символьную строку, используя соглашения о форматировании (см. ниже
подраздел "Соглашения о форматировании даты").
■ to_numb«r(x) Преобразует нечисловое значение в число.
■ to_data (х [, у]) Преобразует не являющееся датой значение х в дату,
используя специфицированный параметром у формат.
■ to_ffiulti_byte (x) Преобразует строку х однобайтовых символов в
многобайтовые символы, соответствующие национальным стандартам языка.
■ to_single_Jbyte (x) Преобразует многобайтовую символьную строку х
в однобайтовую строку, соответствующую национальным стандартам
языка.
Преобразование
данных различных
типов
( Число Л
I 906 J
^ to_numDer()
С *27-Feb-1984 J
f Символы >^
Ч. '906' J
to_date()
to_char()
I
дата
Ограничение м сортировка возвращаемых данных
63
■ chaxtorowid(x) Преобразует строку символов х в идентификатор строки
(ROWID) Oracle.
■ rowidtochar (ж) Преобразует значение ROWID в строку символов х типа
данных VARCHAR2.
■ hextoraw (х) Преобразует шестнадддтеричное (по основанию 16)
значение х во внутренний (двоичный) формат.
■ rawtohex(x) Преобразует внутреннее (двоичное) значение х в шестнад-
цатеричный формат.
■ convert(х[,у[,х]]) Выполняет преобразование буквенно-цифровой
строки х из текущего набора символов, указанного в необязательном
параметре z, в набор символов, специфицированный во втором параметре — у.
■ translate (ж, у, к) Выполняет простое преобразование значений для
символьной или цифровой строки х во что-то другое, основываясь на
значениях факторов конвертирования утя. z.
Соглашения о форматировании даты
Можно использовать функцию to_char( ) для преобразования информации
столбцов типа DATE в текстовую строку. Для этого используется следующий
формат команды: to_char (имя_столСца, ' маска_формата_даты'). К числу
наиболее популярных масок формата, имеющихся в Oracle, относятся следующие:
Ш DD Показывает двузначную дату (порядковый номер дня месяца).
■ DAY Показывает название дня (Monday, Tuesay и так далее).
■ MON Показывает трехбуквенное сокращенное название месяца,
например MAR — для марта (March).
■ MONTH Показывает полное название месяца.
■ YY Показывает двузначное обозначение года (не соответствует
требованиям для перехода к другому тысячелетию).
■ YYYY Показывает четырехзначное обозначение года (не соответствует
требованиям для перехода к другому тысячелетию).
■ RR Показывает двузначное обозначение года (соответствует требованиям
для перехода в другое тысячелетие).
■ RRRR Показывает четырехзначное обозначение года (соответствует
требованиям для перехода к другому тысячелетию).
■ НН Показывает двузначное обозначение времени в часах в формате
А.М./Р.М. (до полудня/после полудня). Должна использоваться вместе с
маской MIAM, речь о которой пойдет ниже.
■ НН24 Показывает двузначное обозначение времени в часах в 24-часовом
формате (не может быть использована вместе с маской MIAM).
■ Ml Показывает двузначное число минут (используется вместе с маской
НН24).
■ MIAM Показывает двузначное число минут в формате А.М./Р.М. (не
может быть использована вместе с маской НН24).
■ SS Показывает двузначное число секунд.
Совет Информацию о времени — часах, минутах и секундах, так же как и
информацию о дате — дне, месяце и годе, Oracle хранит в столбце типа
DATE. Поэтому, если вы желаете сравнивать даты, необходимо уточнить
свои представления о сравниваемых значениях, иначе нам придется часто
сталкиваться с проблемами, потому что время не желает сравниваться с
датами, хотя, казалось бы, они во всем совпадают. Для того чтобы
избежать подобных проблем, следует пользоваться функцией trunc ( ).
64
Глава 2
Демонстрация однострочных функций (продолжение)
В этом разделе мы проиллюстрируем действие наиболее часто употребляемых
процедур для преобразования дат. Мы разберем работу функций to_char ( ),
to_number ( ) и to_date ( ). Сначала поговорим о функции to_char ( ).
В примере для функции new_time ( ) — описанной ранее функции для
работы с датами — оператор alter session set nlsdateformat
использовался для демонстрации полных возможностей Oracle как в части хранения
информации о датах, так и в части преобразования дат и времени из одного
часового пояса в другой. Это упражнение можно было бы довести до
совершенства и с помощью функции преобразования to_char ( ). Использование
этой функции позволяет вам обойтись без использования опции
nls_date_f ormat, которая, будучи выполнена однократно, продолжает
оставаться в силе либо до самого завершения сеанса, либо пока не будет выдан еще
один оператор alter session nls_date_f ormat. Вместо того чтобы
использовать этот метод, вы можете предпочесть не такую совершенную опцию,
предлагаемую функцией to_char ( ), как это показано ниже:
SQL> SELECT TO_CHAR <NEW_TIME (TO_DATE ("15-MAR-2000 14:35:00',
2 'DD-MON-YYYY HH24:MI:SS■),■AST','GMT'))
3 FROM DUAL;
NEXT_DAY (' 15-MAR-200
15-MAR-2000 18:35:00
Обратите внимание, что в этом примере используется также функция
to_date ( ), еще одна функция преобразования из того списка, который мы
собираемся обсуждать. Эта функция очень полезна для преобразования чисел,
и особенно символьных строк, в сформатированные соответствующим
образом поля типа DATE.
Следующей будет рассмотрена функция to_number ( ), преобразующая
информацию из текстового формата или формата DATE в числа.
SQL> SELECT TO_NUMBER (• 49583") FROM DUAL
TO_NUMBER('49583')
49583
Хотя между выходными данными этого запроса и переданной на вход
строкой не видно практически никаких отличий, основные отличия заключаются
в их типах данных. Oracle достаточно "разумна", чтобы перед выполнением
арифметической операции, в которой участвуют два различных типа данных,
преобразовать состоящую только из цифр символьную строку. Это
иллюстрируется следующим блоком кода:
SQL> SELECT '49583' + 34 FROM DUAL;
■49583'+34
49617
Закрепление пройденного материала
1. Убедитесь, что вы умеете идентифицировать функции преобразования
типов данных, а также знаете, какие из функций используются чаще всего.
В. Умейте выделять ситуации, в которых Oracle выполняет неявное
преобразование типов данных.
Упражнения
1. Вы хотите использовать маску формата для информации о датах в Oracle. В
какой из перечисленных ниже ситуаций эта маска формата будет
неприменима:
A. to_date( )
B. to char( )
Ограничение и сортировка возвращаемых данных 65
С alter session set nls_date_format
D. to_number( )
2. Сформулируйте причину, по которой использование функции to_num-
Ьег( ) для преобразования "цифровой" текстовой строки в настоящие
цифровые данные в базах данных Oracle не является обязательным (четыре
слова):
Ответы
1. D. 2. Неявное преобразование типов данных
Резюме главы
Эта глава многое добавляет к вашему пониманию того, как запрашиваются
данные в базах данных Oracle, расширяя то, что мы с вами узнали об
операторе select в первой главе. Мы обсудили использование фразы сравнения
(ключевое слово where) для ограничения количества данных, возвращаемых
Oracle. Затем мы обсудили использование фразы order by для размещения
возвращаемых данных в том порядке, который был задан в используемом
нами критерии. Промежуточное рассмотрение запросов в настоящей главе
завершается вводом множества так называемых однострочных функций,
которые можно использовать для манипулирования возвращаемыми Oracle
данными.
Двухминутное погружение в пройденное
■ фраза order by оператора select полезна для установления порядка
сортировки в файле выходных данных.
■ Два используемых порядка сортировки называются ascending (по
возрастанию) и descending (по убыванию) или сокращенно asc и desc.
Порядок сортировки определяется для каждого сортируемого столбца,
указанного во фразе order by. Порядком по умолчанию является asc
■ фраза where используется в SQL-запросах для ограничения количества
данных, возвращаемых запросом.
■ Во фразе where содержатся операции сравнения, которые определяют,
будет строка включена в число строк, возвращаемых запросом, или нет.
■ К числу логических операций сравнения относятся =, >, >=, <, <, <=,
<>,!=и Л=.
■ В дополнение к логическим операциям для сравнения с эталоном может
использоваться операция сравнения, которая называется like. Для
обозначения так называемых групповых символов (wildcards) используются
символы % и _.
■ Операция для определения попадания в заданный интервал называется
between.
■ Операция нечеткой логики (fuzzy logic) называется soundex.
■ Во фразе where могут содержаться одна или несколько операций
сравнения, объединенные в единое целое с помощью логических операторов and
или or, которым может предшествовать логический оператор not.
■ Функции SQL можно разделить на символьные и числовые функции, а
также функции для работы с датами. Убедитесь, что знаете, как
использовать эти функции для экзамена ОСР.
■ Для преобразования данных из текстовых типов данных в цифровые и
обратно, цифровых типов в даты и обратно, текстовых типов в ROWID и об-
66
Глава 2
ратно и других преобразований в Oracle имеется несколько функций
преобразования.
Вопросы для самопроверки
1. Именно в таком порядке располагаются выходные данные при
использовании во фразе order by порядка сортировки по умолчанию:
2. Закончите предложение: Принципом работы фразы where является
использование одних значений с другими.
3. Два или более критерия во фразе where можно объединить в единое целое
с использованием этого ключевого слова, в результате чего Oracle отберет
только те данные, которые удовлетворяют всем критериям:
4. Это означает, что два значения сравниваются друг с другом, а в итоге этого
сравнения получается результат TRUE или FALSE:
5. Это ключевое слово рассматривается как инвертор, потому что оно
обращает (инвертирует) логический результат оператора сравнения, которому
предшествует: ,
Вопросы ко всей главе
1. В рамках сеанса SQL*Plus вы пишете операторы select к базе данных
Oracle. В каком из следующих операторов содержится ошибка?
A. select * from EMP where EMPNO = 493945;
B. select EMPNO from EMP where EMPNO = 493945;
С select EMPNO from EMP;
D.select EMPNO where EMPNO = 56949 and ENAME = 'SMITH';
2. Вы используете в операторе select однострочные функции. Про какую из
функций можно сказать, что она по своему действию более всего похожа
на оператор if-then-else?
A. sqrt( )
B. decode ( )
С new_time( )
D.rowidtochar( >
3. В операторах SQL вы желаете использовать однострочные функции. Какие
три из перечисленных ниже функций являются числовыми? (Выберите три
из четырех.)
A. sinh( )
В.to_number( )
С sqrt( )
D. round( )
4. Вы используете SQL'Plus для выборки данных из базы данных Oracle.
Какой из перечисленных ниже операторов записан без ошибок?
A. select to_char(nvl(sqrt(59483), '0')) from dual;
B. select to_char(nvl(sqrt(59483), 'INVALID')) from dual;
С select (to_char(nvl(sqrt(59483), '0')) from dual;
D. select to_char(nvl(sqrt(59483), 'TRUE')) from dual;
Ограничение м сортировка возвращаемых данных 67
5. Вы хотите использовать в операторе select фразу order by. какие из
следующих ключевых слов используются во фразе order by? (Выберите
два ключевых слова.)
A. abs В. asc
С desc D. disc
6. В сеансе SQL*Plus вы формулируете операторы SQL. Какие из
приведенных ниже высказываний относительно фразы order by неверны?
A. Порядок сортировки по возрастанию или убыванию можно
определить с помощью ключевого слова asc или desc.
B. Для установления порядка сортировки во фразе order by может быть
использован только один столбец.
С Для установления порядка сортировки во фразе order by может быть
использовано несколько столбцов.
D. Столбцы во фразе order by могут быть представлены числами,
обозначающими порядок их появления во фразе select.
7. Следующие операторы SQL были взяты из сеанса SQL*Plus:
select decode(EMPNO, 58385, 'INACTIVE', 'ACTIVE') empno
from EMP
where substr(ENAME,1,1) to_number('S')
and EMPNO 02000
order by EMPNO desc, ENAME asc;
Какие из следующих строк оператора select приведенного выше блока
кода содержат ошибки?
A.select decode(EMPNO,58385, 'INACTIVE', 'ACTIVE') empno
B. from EMP
С where substr(ENAME,1,1) to_number('S')
D. and EMPNO 02000
E. order by EMPNO desc, ENAME asc;
F. Ошибки в операторе отсутствуют
Ответы на вопросы для самопроверки
1. ascending
2. Сравнение
3. and
4. Логический
5. not
Ответы на вопросы ко всей главе
1. D. select EMPNO where EMPNO = 56949 and ENAME = 'SMITH';
Объяснение В операторе отсутствует фраза from. Хотя оператор select
может быть задан без фразы where, оператор select не может быть выполнен,
если в нем не специфицирована фраза from. Именно по этой причине
существует специальная таблица DUAL, предназначенная для удовлетворения
требований фразы from в тех ситуациях, когда все необходимые для выполнения
запроса данные определены в нем самом.
68
Глава 2
2. В. decode ( )
Объяснение Функция decode ( ) действует аналогично фразе if-then-else
в операторах SQL. Вариант А неверен, так как функция sqrt ( ) получает
квадратный корень из числа. Вариант С также неверен, поскольку функция
new_time ( ) на основании переданных ей при вызове значений возвращает
новое значение времени. И наконец, вариант D некорректен, потому что
rowidtochar ( ) — это функция, преобразующая информацию из типа
ROWID в тип CHAR.
3. А, С и D. sinh( ), sqrt( ) и round( )
Объяснение Единственная нецифровая функция в этом списке — это
to_number ( ), которая является функцией, выполняющей операцию
преобразования. На экзамене ОСР всегда бывает несколько вопросов подобного
типа и на каждый из них следует давать по нескольку ответов.
4. A. select to_char(nvl(sqrt(59483), '0')) from dual;
Объяснение Функции подобного типа можно использовать в сочетании
друг с другом. Хотя обычно тип данных, которые вставляются в столбец, если
его значением является NULL, должен совпадать с типом значений столбца,
для которого указана функция nvl ( ), Oracle многие преобразования типов
данных выполняет неявно, как и в этом случае.
5. В И С. asc и desc
Объяснение Информация, возвращаемая Oracle после выполнения запроса
с использованием фразы order by, может быть отсортирована либо в
возрастающем, либо в убывающем порядке, на что указывают ключевые слова в
ответах В и С. Функция abs ( ) — это функция вычисления абсолютного
значения числа, что отвергает ответ А. А функции disc ( ) не существует вообще,
что отвергает ответ D.
6. В. Для установления порядка сортировки во фразе order by может быть
использован только один столбец.
Объяснение Сначала обратите внимание, что между ответами В и С имеется
логическое отличие, что означает, что один из них может быть отброшен в
любом случае. Так как мы знаем, что для установления порядка сортировки во
фразе order by может быть использовано несколько столбцов, ответ С
отбрасывается автоматически. Ответ А является неверным, так как именно
ключевые слова asc и desc используются для указания того, какой порядок —по
возрастанию или по убыванию — будет использован во фразе order by. И
наконец, ответ D неверен, так как мы можем использовать числа для указания
сортируемых столбцов в соответствии с тем порядком, в котором они
перечислены в операторе select.
7. С. where substr(ENAME,1,1) > to_number(•S*)
Объяснение Буквенные символы, одним из которых является символ S, не
могут быть преобразованы в число. При выполнении указанного оператора в
этой строке появится сообщение об ошибке. Прочие строки оператора
ошибок не содержат.
ГЛЛВАЗ
Расширенная выборка данных
в Oracle
70 Глава 3
этой главе мы познакомимся со следующими вопросами, а
потом и продемонстрируем свои знания по ним:
■ Показ данных из нескольких таблиц
■ Групповые функции и их использование
В этой главе мы подведем вас к довольно высокому уровню понимания,
как делаются запросы к данным в Oracle. Во-первых, мы научимся писать
операторы select для выборки данных из нескольких таблиц. Кроме того, мы
научимся создавать соединения, показывающие данные из различных таблиц
даже в тех случаях, когда отсутствует полное соответствие между
информацией в этих таблицах. В этой же главе мы обсудим, как создавать и
использовать так называемые самосоединения (т.е. соединения таблицы с самой
собой). После обсуждения соединения таблиц мы познакомимся с фразой group
by, используемой в операторах select, и с групповыми функциями. Эта
фраза позволяет вам рассматривать весь столбец с данными как объект для
выполнения операции.
Материалы этой главы составляют 18% содержания первого экзамена ОСР.
Замечание Как и в главах 1 и 2, в этой главе также используются
стандартные демонстрационные таблицы, созданные при выполнении сценариев
utlsampl. sql или demobld. sql. Однако в этой главе используются
также тривиальные (а иногда и не совсем тривиальные) примеры, в которых
встречаются и другие таблицы. Для нетривиальных примеров мы включили
команды, которые создадут эти таблицы и заполнят их значениями. Так
как для сдачи экзамена ОСР для вас очень важна практика работы с Oracle,
мы не предлагаем вам сценариев для автоматической генерации объектов.
Показ данных из нескольких таблиц
В этом разделе мы коснемся вопросов, связанных с отображением данных из
нескольких таблиц:
■ Использование операторов select для соединения данных более чем из
одной таблицы
■ Создание внешних соединений
■ Соединение таблицы с самой собой
В типичной базе данных имеется много таблиц. В небольших базах данных
может иметься порядка десяти-двенадцати таблиц, а в больших базах данных
число таблиц доходит до нескольких сотен или даже тысяч. Но основной
вывод состоит в том, что из одной таблицы, в которой содержится все, что
требуется ее создателям, состоит очень малое количество баз данных. Поэтому
обычно вам приходится выбирать данные из нескольких таблиц. Для показа в
одном запросе данных из нескольких таблиц Oracle позволяет выполнять так
называемые соединения таблиц. Имеется два относящихся к соединению
таблиц правила, о которых следует постоянно помнить. Данные из двух (или
нескольких) таблиц могут быть объединены в том случае, если у обеих таблиц
имеется совпадающий столбец (с тем же самым или с другим именем) и этот
столбец в одной из таблиц является первичным ключом (или частью этого
ключа).
Совет Для того чтобы в операторе select можно было соединить две
таблицы, у них должен быть по крайней мере один общий столбец, и этот
столбец должен быть первичным ключом (или его частью) хотя бы в одной
из таблиц.
Ключи к соединению таблиц
Если у двух таблиц имеются совпадающие столбцы, это значит, что между
этими двумя таблицами существует связь (или отношение). Природа этой связи
определяется тем, какая из таблиц использует общий столбец в качестве пер-
Расширенная выборка данных в Oracle
71
вичного ключа. Естественно, при этом возникает вопрос: а что такое
первичный ключ? Первичным ключом называется столбец таблицы, используемый
для установления уникальности каждой строки таблицы. Таблица, в которой
столбец играет роль первичного ключа, называется родительской таблицей
отношения или главной таблицей, в то время как таблицу, столбец которой
ссылается на другую таблицу отношения, часто называют дочерней таблицей (а
иногда — таблицей деталей или подробностей). Общий столбец из дочерней
таблицы принято называть внешним ключом. На рис. 3.1 приведен пример
того, как такое отношение может быть реализовано в базе данных.
Родительская и
дочерняя таблицы
ТАБЛИЦА department
Родитель
(общий столбец
является
первичным
ключом)
dept*
412N
459С
757Z
958G
depLhead dept_admin chrg_to_acct \
Robins
Geertz
Muricw
Rajiv
MacArthur
Adams
Samms
Ween
060540-6949
560494-5944
293948-6594
439495-5100
I
. м-,-ш,~„4\^рми^д.-гк№Ашц.шпшш+-,ь-~№~'1^^-т>*^и-.1ь
ТАБЛИЦА employee
Дочерняя
(общий столбец
является
внешним
ключом)
empld
59495
30499
69495
39293
lastname
Duduc
Smcot
Moore
firstname
SI8
Jasper
Mitzi
Rajiv Ammur
dept*
757Z
459C
412N
958G I
Операторы select, соединяющие данные
более чем из одной таблицы
Вспомните (об этом шла речь в главах 1 и 2), что в операторе select могут
быть три части: фраза select, фраза from и фраза where. Эта последняя
фраза содержит операторы сравнения, отфильтровывающие нежелательные
данные от тех, которые вы желаете увидеть. Для соединения данных из одной
таблицы с данными из другой таблицы следует во фразе where сравнить данные
общего столбца из одной таблицы с данными того же столбца другой таблицы.
Синтаксис соединений Oracle
Давайте рассмотрим пример оператора соединения (join), использующего
традиционный синтаксис Oracle, где мы объединяем вместе содержимое таблиц
ЕМР и DEPT для получения перечня всех сотрудников и названий отделов,
где они работают:
SQL> select e.ename, e.deptno, d.dname
2 from emp e, dept d
3 where e.deptno - d.deptno;
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
DEPTNO
20
30
30
20
30
30
10
20
DNAME
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
72
Глава 3
KING 10 ACCOUNTING
TURNER 30 SALES
ADAMS 20 RESEARCH
JAMES 30 SALES
FORD 20 RESEARCH
MILLER 10 ACCOUNTING
Обратите внимание на многие важные компоненты этого соединения
таблиц. Использование во фразе from двух таблиц четко указывает на то, что
имеет место соединение таблиц. Обратите также внимание на то, что перед
именем каждой таблицы присутствует буква: Е для таблицы ЕМР или D для
таблицы DEFT. Это служит иллюстрацией интересной концепции — столбцы
могут иметь псевдонимы точно так же, как их имеют таблицы. Псевдонимы
служат важной цели — они не дают Oracle запутаться в том, какую таблицу
использовать при выводе данных в столбец DEPTNO. Вспомните, что в обеих
таблицах (ЕМР и DEPT) имеются столбцы с именем DEPTNO. Посмотрите,
что произошло бы, если бы мы не использовали псевдонимы:
SQL> select ename, deptno, dname
2 from emp, dept
3 where deptno - deptno;
where deptno - deptno
*
ERROR at line 3:
ORA-0091B: column ambiguously defined
(неоднозначно определенный столбец)
Неоднозначности при соединении таблиц можно также избежать, если в
качестве префикса перед именем столбца указать имена таблиц, но часто для
этого требуется дополнительное кодирование. Можно, в конце концов,
присвоить столбцам различные имена, но в таком случае вы можете забыть, что
между этими двумя таблицами существует связь. Уж лучше использовать
псевдонимы! Однако обратите внимание еще кое на что. Для столбца,
встречающегося только в одной из таблиц, нет необходимости специфицировать ни
псевдоним, ни полное имя таблицы. Взгляните еще на один пример:
SQL> select ename, «ар.deptno, dname
2 from emp, dept
3 where «пр.deptno - dept.deptno;
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10
DNAME
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
Декартовы произведения
Заметьте, что в нашу фразу where включено сравнение по полю DEPTNO,
соединяющему данные в ЕМР с данными в DEPT. В случае отсутствия этой
связи в выходные данные были бы включены все данные из ЕМР и DEPT,
перемешанные вместе в нечто, называемое декартовым произведением. Декартовы
произведения — это большие, бессмысленные листинги, которые почти
никогда не отражают того, что вы хотели. Они образуются, когда вы опускаете
условие соединения в операторе SQL, что побуждает Oracle объединять все
строки первой таблицы со всеми строками второй таблицы. Давайте рассмот-
Расширенная выборка данных в Oracle
73
рим простой пример, в котором мы допытаемся объединить две таблицы,
каждая из которых имеет по три строки, используя для этой цели оператор
select, в котором нет фразы where, что в результате дает нам состоящий из 9
строк выход:
SQL> select a.coll, b.col_2
2 from ехашр1е_1 a, exanple_2 Ь;
C0L1
1
2
3
1
2
3
1
2
3
C0L_2
one
one
one
two
two
two
three
three
three
Совет Эта таблица не создана сценариями utlsampl.sgl или de-
mobld. sql. Это довольно тривиальный пример, и если только вы не хотите
получить какой-то опыт создания таблиц и заполнения их данными, вам не
стоит пытаться выполнить этот запрос в Oracle. Если оке вы хотите
попробовать свои силы на собственной базе данных, выполните оператор
select для таблиц ЕМР и DEPT из предыдущего примера, но пропустите
фразу where.
Во избежание появления декартовых произведений вы всегда должны
включать в запросы условия соединения. И хотя в главе 2 вы узнали, что во
фразе where могут иметься не только операторы сравнения на равенство, но
и другие операторы, для того чтобы избежать появления декартовых
произведений, вы должны обязательно использовать при сравнении соединяемых
данных из двух таблиц операцию сравнения на равенство. Если вы желаете
использовать для сравнения другие операторы, вам будет необходимо сначала
соединить информацию, используя сравнение на равенство, а затем
выполнить остальные сравнения во фразе where. Вот почему операции соединения
таблиц иногда называют объединением по эквивалентности (equijoins).
Посмотрите на следующий пример, где показана надлежащая конструкция
соединения таблиц, в которой объединяемая информация затем сравнивается с
использованием операции неравенства, чтобы отсечь служащих
бухгалтерского отдела:
SQL> select ename, emp.deptno, dname
2 from ешр, dept
3 where emp.deptno - dept.deptno
4 and dept.deptno > 10;
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
SCOTT
TURNER
ADAMS
JAMES
FORD
DEPTNO
20
30
30
20
30
30
20
30
20
30
20
DNAME
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
RESEARCH
SALES
RESEARCH
SALES
RESEARCH
Синтаксис соединения по ANSI/ISO
В Огас1е9/ корпорация Oracle ввела усиленную поддержку синтаксиса
соединения по версии ANSI/ISO. В соответствии с этим синтаксисом для того,
чтобы соединить содержимое двух таблиц для получения единого результата, мы
должны включить л SQL-оператор фразу join имя_таблицы on
условие соединения. Если мы хотим в соответствии с новым синтаксисом вы-
Огаси>9/
■ fiimi шцирш
■ерсмй
Расширенная выборка данных в Oracle
74
полнить то же соединение таблиц, которое мы делали раньше, наш оператор
SQL будет выглядеть следующим образом:
SQL> select enarae, emp.deptno, dname
2 from enp join dept
3 on emp.deptno - dept.deptno;
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10
DNAME
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
Обратите внимания на различия между этим синтаксисом и синтаксисом
Oracle. Во-первых, в синтаксисе ANStylSO сравнения, используемые для
соединения, отделяются от всех остальных сравнений с помощью
специального ключевого слова on, указывающего на то, что именно это сравнение
используется для соединения. Вы по-прежнему можете включать в
соответствующие ANStylSO запросы на соединение фразу where.
Единственное отличие состоит в том, что фраза where теперь будет содержать
только дополнительные операторы сравнения, используемые для
дополнительной фильтрации данных. Кроме того, вы не должны теперь указывать во
фразе from имена всех объединяемых таблиц. Вместо этого сразу же после
фразы from вы должны использовать фразу j oin, в которой и будут
определены имена всех соединяемых таблиц.
Совет Никогда не смешивайте синтаксис соединения Oracle с
синтаксисом ANSI/ISO! Кстати, ни один из этих двух синтаксисов не уступает
другому в производительности.
Как много сравнений вам требуется?
При использовании для соединения таблиц синтаксиса Oracle запрос на
данные более чем из двух таблиц должен содержать достаточное количество
сравнений на равенство, чтобы избежать появления декартовых произведений.
Чтобы избежать путаницы, советуем использовать следующее простое
правило: если число подлежащих соединению таблиц равно N, включите в оператор
select по крайней мере N— 1 условий равенства, чтобы каждый общий
столбец упоминался в них не менее одного раза. Аналогично, если для соединения
таблиц вы используете синтаксис ANStylSO, вам потребуется не менее N-1
фразы join имя_таблицы on условие_соединения для каждой из N
подлежащих соединению таблиц.
Совет Для N таблиц, соединяемых с использованием синтаксиса
соединения таблиц Oracle или ANSI/ISO, потребуется не менее N-1 условия
объединения по эквивалентности (equijoins) во фразе where оператора select или
N-1 фразы join имя_таблицы on
условие_соединениясоответственно, чтобы избежать возникновения декартовых произведений таблиц.
Естественные соединения
Еще один тип соединений, о котором нужно знать для экзамена ОСР,
называется естественным соединением. Естественным соединением называется
соединение между двумя таблицами, в котором Oracle соединяет таблицы по оди-
Расширенная выборка данных в Oracle
75
наково называющемуся столбцу (столбцам) обеих таблиц (естественным
образом!). Естественное соединение выполняется в том случае, если указано
ключевое слово natural. Давайте рассмотрим пример. Вспомните, как мы
использовали в наших предыдущих обсуждениях таблицы ЕМР и DEPT.
Посмотрим, как у нас описаны столбцы этих таблиц:
SQL> describe
Mane
EMPNO
EKAME
JOB
MGR
HIREDATE
SAX
com
DEPTNO
SQL> describe
Name
DEPTNO
eop
dept
Null?
NOT
NULL
Null?
NOT
NULL
Type
NUMBER<4) ,
VARCHAR2<10>
VARCHAR2 0)
NUMBER(4>
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
Type
NUMBER(2)
DNAME VARCHAR2 (14)
LOC VARCHAR2(13)
Как видно, единственным совпадающим столбцом для этих двух таблиц
является DEPTNO, к тому же в обеих таблицах они имеют одинаковое имя.
Это сочетание фактов делает наш запрос на объединение таблиц ЕМР и DEPT
отличным кандидатом для естественного соединения. Теперь посмотрим:
SQL> select ename, deptno, dname
2 from amp natural join dept;
ENAME DEPTNO DNAME
SMITH
ALLEN
HARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
20
30
30
20
30
30
10
20
10
30
20
30
20
10
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
Нетрудно заметить, что естественные соединения позволяют в значительной
степени упростить запросы с соединением за счет устранения псевдонимов
таблиц и сравнений для соединения. Вот почему Oracle считает, что именно
столбцы с одинаковыми именами в обеих таблицах при соединении должны
использоваться для сравнения. Если в обеих таблицах имеется по нескольку столбцов с
одинаковыми именами, Oracle встроит в запрос сравнения соединения для всех
общих столбцов. Мы можем найти, где естественные соединения могут
значительно помочь в консолидации содержания фраз where запросов для
включения общего критерия фильтрации. Давайте рассмотрим пример:
SQL> select ename; deptno, dname
2 from emp natural join dept
3 where dept.loc - 'NEW YORK';
ENAME DEPTNO DNAME
CLARK 10 ACCOUNTING
KING 10 ACCOUNTING
MILLER 10 ACCOUNTING
Декартовы произведения: точка зрения ANSI/ISO
В некоторых случаях мы действительно хотим получить декартово
произведение, особенно в финансовых приложениях, где может иметься таблица чисел,
76
ГлаваЭ
которые нужно (для каких-то таинственных статистических целей)
перемножить с другой таблицей чисел. В синтаксисе ANSI/ISO предусмотрена
возможность получения подобных произведений с помощью так называемых
перекрестных соединений (cross-join). Перекрестное соединение получается, если
в запросе на соединение, соответствующем синтаксису соединения ANSI/ISO,
указывается ключевое слово cross. Вспомните, что в предыдущих примерах
мы получали декартово произведение, просто опуская фразу where при
соединении двух таблиц, имеющих по три строки каждая, чтобы получить выходные
данные, содержащие девять строк. Такого же результата можно добиться и
используя синтаксис ANSI/ISO, если применить ключевое слово cross,
специально выделенное в следующем ниже примере:
SQL> select coll, col_2
2 from example_l cxoaa join example_2;
C0L1 COL 2
1 one
2 one
3 one
1 two
2 two
3 two
1 three
2 three
3 three
Закрепление пройденного материала
1. Соединением таблиц называется тип запросов, в которых данные
выбираются из двух или большего количества таблиц на основании общей для
обеих таблиц информации.
4. Для того чтобы соединить данные из двух таблиц, требуется, чтобы у обеих
таблиц имелся одинаковый столбец и чтобы этот столбец был первичным
ключом хотя бы в одной из таблиц.
3. Для соединения данных из двух таблиц во фразе whs re используются
сравнения между этими таблицами на равенство. Сравнения по неравенству
обычно приводят к появлению декартовых произведений.
4. Помните, сколько сравнений на равенство должно быть включено в
оператор соединения. Для этого используется простая формула: для JV таблиц
задайте N-\ сравнение на равенство.
5. Убедитесь, что вы знакомы с такими понятиями, как естественные и
перекрестные соединения.
Упражнения
1. В базе данных имеются две таблицы: PRODUCT и STORAGE_BOX.
Индивидуальные продукты описываются в таблице их уникальным
идентификационным номером (ID), названием продукта и номером коробки, в
которой он хранится. Коробки индивидуального хранения (отождествляемые
по номерам), на которые имеются ссылки из другой таблицы, могут
содержать несколько различных продуктов, но каждая коробка может
находиться только в одном месте. Который из приведенных ниже операторов
корректно отобразит ID продукта, его название и место нахождения коробки с
этим продуктом для всех продуктов в этой базе данных, носящих гордое
имя "штуковина" (widget)?
A.select p.prod_id, p-prod^name, b.box_loc from
product p, storage_box b where p.prod_id »
b.prod_id and prod_name = 'WIDGET';
Расширенная выборка данных в Oracle
77
В.select p.prod_id, p.prod_name, b.box_loc fro*
product p, storage_box b where prod_name -
'WIDGET';
С select p.prod_id, p.prod_name, b.box_loc from
product p, storage_box b where p.stor_box_num —
b.stor_box_num and p.prod_name » 'WIDGET';
D. select prod_id, prod_name, box_loc from product,
storage_box where stor_box_num = stor_box_num and
prod_name = 'WIDGET';
S. Как часть процесса составления отчета вы собираетесь соединить
информацию из трех таблиц. Эти таблицы называются EMP, DEPT и
SALGRADE. Вам требуются только записи, составленные из строк с
соответствующими друг другу значениями имени служащего, адреса
размещения отдела и размера заработной платы служащих десятого и более
высоких разрядов. Сколько операций сравнения потребуется для такого
запроса?
A. Две В. Три
С Четыре D. Пять
3. Вы желаете соединить содержимое двух таблиц — PRODUCT и STORAGE,
чтобы перечислить места нахождения всех коробок. В таблице PRODUCT
имеются три столбца: ID, NAME и ВОХ#. В таблице STORAGE имеются два
столбца: ВОХ# и LOC. Какой из следующих вариантов ответа правильный?
A.select product.id, product.name, storage.loc from
product, storage where product.box# - storage.box#;
B. select product.id, product.name, storage.loc from product
join storage on product.boxf - storage.boxf;
С select product.id, product.name, storage.loc from
product natural join storage on product.boxf —
storage.boxf;
D.select product.id, product.name, storage.loc from
product natural join storage;
4. Как называется объект, полученный в результате выполнения оператора
соединения, в котором не хватает фразы where (два слова)?
. Какое ключевое слово ANSI/ISO можно использовать для
получения результата подобного типа? _.
Ответы
1. С. 2. В. Вспомните, что следует включить два сравнения на равенство для
образования правильного соединения и добавить еще одно отфильтровывающее сравнение,
чтобы отобрать только записи, где разряд превышает 10.3. С. 4. Декартово проиэведе-
ние, cross-join
Создание внешних соединений
Внешние соединения расширяют возможности запросов Oracle и включают
обработку ситуаций, когда требуется получить информацию из таблиц даже в том
случае, если в общих столбцах отсутствуют совпадающие записи. На рис. 3.2
приводится графическое представление внешних соединений. Давайте в целях
демонстрации зададим в рамках сеанса SQL*Plus следующий оператор:
ИЙЙЮД SQL> update erap set deptno - NULL where enaffle - 'KING';
1 row updated.
Совет Более подробно об операторах update мы поговорим в главе 6.
78
Глава 3
Внешние
соединения
-DEPT"
'Внешняя таблица"
ANSI
left outer Join dept where
deptdeptno = emp.deptno
ORACLE
Where deptdeptno (+) = emp.deptno
"EMP"
'Внутренняя таблица"
Записи из этой таблицы
будут возвращены даже
в том случав, если во внешней
таблица не существует
соответствующих записей
Выходные
данные SQL'Plus
На самом деле, мы сообщаем Oracle, что поскольку KING является
президентом компании, то он перестает числиться в своем прежнем отделе, то есть
перестает входить в его состав. Теперь давайте посмотрим, что произойдет,
если мы попытаемся соединить таблицу ЕМР с таблицей DEPT, используя для
этого общий столбец DEPTNO:
SQL> select
2 from
3 where
ENAME
SMITH
ALLEN
HARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
TURNER
ADAMS
JAMES
FORD
MILLER
e
dept
d
.епаше, e.deptno,
d.
emp e
deptno - e.deptno;
DEPTNO
20
30
30
20
30
30
10
20
30
20
30
20
10
DNAME
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
d.dnane
Вы обратили внимание: что-то в нашем списке пропущено? Правильно, в
выходных данных отсутствует служащий KING, так как он больше не приписан
ни к одному отделу. Когда в общем столбце одной из таблиц отсутствует
соответствующая информация, оператор соединения игнорирует эту запись
таблицы. Эта проблема может быть решена с помощью запроса с внешним
соединением. Внешние соединения возвращают строки, соответствующие условиям
соединения выполняемого запроса, но они возвращают также и некоторые или
все строки одной из таблиц, даже если эти строки таблицы не удовлетворяют
условиям соединения. В нашем случае мы хотим, чтобы Oracle возвратил запись
для служащего KING (напомним, что KING является президентом компании),
несмотря на то, что эта запись не удовлетворяет условиям соединения по
столбцу DEPTNO, являющемуся общим для таблиц ЕМР и DEPT. Для того чтобы
заставить запрос в принудительном порядке возвращать данные из ЕМР, даже
если для них отсутствуют соответствующие данные в таблице DEPT,
необходимо сЦецифицировать операцию внешнего соединения. Давайте посмотрим, как
может быть записана подобная операция соединения:
Расширенная выборка данных в Oracle
79
SQL> select e.ename, e.deptno, d.dnane
2 fron dept d, ешр е
3 where d.deptno (+) - e.deptno;
ENAME
SMITH
ALLEN
HARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
DEPTNO
20
30
30
20
30
30
10
20
30
20
30
20
10
DNAME
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
Используя операторы внешнего соединения, мы можем сделать так, что
KING будет включен в результат, даже если он не проходит по критерию
объединения, специфицированному в запросе. Обратите внимание на
использование выделенного полужирным шрифтом маркера (+) после ссылки на столбец
DEPTNO таблицы DEPT; он называется оператором внешнего соединения. Этот
маркер указывает, какая из таблиц может иметь данные NULL,
соответствующие значениям не-NULL в значениях столбца другой таблицы- Маркер
внешнего соединения стоит возле таблицы DEPT, а это означает, что данные из
таблицы ЕМР могут соответствовать либо значениям в DEPT, либо значению
NULL, если в таблице DEPT не нашлось подходящего значения. В том случае,
если порядок изменится, например если маркер будет проставлен рядом со
столбцом, указывающим на таблицу ЕМР, то будут включены все значения из
DEPT, независимо от того, имеются для них соответствующие значения в
ЕМР или нет. К чему это приводит, можно увидеть на следующем примере:
SQL> select e.enane, e.deptno, d.dname
2 from dept d, enp e
3 where d.deptno - e.deptno (+);
ENAME
MILLER
CLARK
SMITH
SCOTT
ADAMS
FORD
JONES
ALLEN
JAMES
TURNER
BLAKE
MARTIN
HARD
DEPTNO
10
10
20
20
20
20
20
30
30
30
30
30
30
DNAME
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES
OPERATIONS
Совет Будьте внимательны, когда проставляете символ (+) для внешних
соединений: если он появится в сравнении соединения следом за ссылкой на
столбец не для той таблицы, выходной набор данных будет содержать
непредсказуемые данные.
Синтаксис ANSI/ISO для внешних соединений
Огас1е9/ расширяет свое соответствие стандарту ANSI/ISO, поддерживая его
требования в части синтаксиса и семантики внешних соединений. Как и в
случае с синтаксисом стандартных операций соединения, синтаксис внешних
соединений старается отделить условия соединения от остальных операций
сравнения во фразе where SQL-запроса. Давайте еще раз рассмотрим один из
упоминавшихся ранее запросов, где мы исхитрились включить в отчет запись
Огаси>9/
■ более ■ч'чт**
мрснй
80
Глава 3
служащего KING, даже несмотря на то, что он не входит в состав ни одного
отдела. Для полноты картины ниже приводятся обе версии запроса:
SQL> — earlier version with outer join operator
SQL> — select e.ename, e.deptno, d.dname
SQL> — from dept d, emp e
SQL> — where d.deptno (+) - e.deptno;
SQL>
SQL> — ANSI/ISO version
SQL> select e.ename, e.deptno, d.dname
2 from emp e left outer join dept d
3 on d.deptno » a.deptao;
ENAME
MILLER
CLARK
FORD
ADAMS
SCOTT
JONES
SMITH
JAMES
TURNER
BLAKE
MARTIN
WARD
ALLEN
KING
DEPTNO
10
10
20
20
20
20
20
30
30
30
30
30
30
DNAME
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES
Более подробно рассмотрим выделенный полужирным шрифтом код из
предыдущего примера. Мы видим, что слова left outer join (левое внешнее
соединение) предшествуют ключевому слову join, означая тем самым, что это
внешнее соединение. Следовательно, можно увидеть, что ANSI/ISO вводит во
внешние соединения соглашение о двунаправленности внешних соединений.
Раньше мы помещали символ (+) сразу за обозначением D.DEPTNO в левой
стороне сравнения соединения. Это означало для Oracle, что записи из ЕМР
могут быть возвращены даже в том случае, если для них нет соответствующих
записей в DEPT. В синтаксисе ANSI/ISO оператор внешнего соединения
заменяется на фразу left outer join имя_таблицы. Мы специфицировали в
этой фразе DEPT как имя таблицы точно так же, как раньше мы помещали
символ внешнего соединения сразу же после ссылки на D.DEPTNO в
сравнении соединения.
Но что, если мы хотим возвратить записи из DEPT даже в том случае, если
отсутствуют соответствующие записи в ЕМР? Мы можем также
специфицировать правое внешнее соединение (right outer connection), которое приводит к
результатам, аналогичным результатам другого приводившегося ранее
запроса, в котором мы перенесли оператор внешнего соединения на другую сторону
равенства. И снова мы приводим обе версии запроса:
SQL> — Earlier version of outer join
SQL> — select e.enane, e.deptno, d.dname
SQL> — from dept d, ешр e
SQL> — where d.deptno - e.deptno (+),"
SQL>
SQL> — ANSI/ISO version
SQL> select e.ename, e.deptno, d.dname
SQL> from emp e right outer join dept d
SQL> on d.deptno - e.deptno;
ENAME DEPTNO DNAME
SMITH
ALLEN
HARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
TURNER
ADAMS
20
30
30
20
30
30
10
20
30
20
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
SALES
RESEARCH
Расширенная выборка данных в Oracle
81
FORD
MILLER
JAMES
20
10
30
RESEARCH
ACCOUNTING
SALES
OPERATIONS
Как мы могли видеть выше, правое внешнее соединение позволяет
изменить возвращаемые данные, не делая слишком много глубоких изменений.
Мы всего лишь изменили ключевое слово left на right, a Oracle сделал все
остальное.
Совет Опция внешнего соединения по умолчанию отсутствует. Если во
фразе outer join вы опустите ключевые слова left или right, Oracle
возвратит сообщение об ошибке: команда SQL не завершена должным
образом. Необходимо указать Oracle, каким должно быть соединение — правым
или левым.
Полное внешнее соединение
Кроме того, Огас1е9/ позволяет легко выполнить так называемое полное
внешнее соединение, включающее все записи из таблиц, которые попали (бы в
отчет, если бы были использованы обе фразы left outer join и right outer
join. Рассмотрим пример:
SQL> select e.ename, e.deptno, d.dname
2 from emp e full outer join dept d
3 on d.deptno - e.deptno;
ENAME DEPTNO DNAME
MILLER
CLARK
FORD
ADAMS
SCOTT
JONES
SMITH
JAMES
TURNER
BLAKE
MARTIN
WARD
ALLEN
KING
10
10
20
20
20
20
20
30
30
30
30
30
30
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES
OPERATIONS
Совет Никогда не смешивайте синтаксис внешних соединений Oracle
с синтаксисом ANSI/ISO!
В заключение этого урока
Поскольку мы внесли изменение в данные нашего примера, точнее, в запись
служащего KING в таблице ЕМР, мы хотим теперь отказаться от сделанных
изменений, используя для этого следующую команду:
SQL> rollback;
Rollback complete.
Совет Подробнее о команде rollback пойдет речь в главе 6.
Для быстрого ознакомления
Для быстрого ознакомления в таблице 3.1 приведены листинг с фразами where
для внешних соединений с использованием синтаксиса Oracle и их
эквиваленты по ANSI/ISO, в котором использованы фиктивные таблицы А и В.
Расширенная выборка данных в Oracle
82
Закрепление пройденного материала
1. Необходимо понимать, что внешние соединения полезны в ситуациях,
когда мы хотим показать в операторе соединения такие данные, где
записям из одной таблицы необязательно имеется соответствие в записях
другой таблицы.
Таблица 3.1. Синтаксис внешних соединений Oracle и эквивалент ANSI/ISO
Синтаксис внешнего соединения Oracle Эквивалент ANSI/ISO
from tab_a a, tab_b b from tab_a a left outer
where a.col_l (+) = b.col_l join tab_b b on a.col_l - b.col_l
from. tab_a a, tab_b b from tab_a a right outer
where a.col_l = b.col_l (+) join tab_b b on a.col_l - b.col_l
from tab_a a, tab_b b from tab_a a left outer join
where a.col_l (+) - b.col_l tab_b b on a.col_l - b.col_l
and b.col_2 - 'VALUE' ~ and b.col_2 = 'VALUE'
S. Маркер (+) — это специальный символ, используемый для обозначения
внешних соединений, однако следует помнить, что этот символ введен
Oracle. Помните, что очень важно, где именно вы помещаете оператор
внешнего соединения, так как именно это подсказывает Oracle, какая
таблица в процессе соединения может содержать записи NULL,
соответствующие значениям из другой таблицы.
3. Oracle принял соглашения ANSI/ISO для операторов соединения и теперь
использует фразы [left I right] outer join имя_ та блицы on
условие соединения, где имя_таблицы — это имя соединяемой таблицы, а
условие_соединенмя — это сравнение, используемое для соединения
данных.
4. Oracle9i вводит возможность выполнения полного внешнего соединения. В
этом случае включаются возвращаемые записи из обеих таблиц, объединяя
результаты выполнения правого и левого внешних соединений. Чтобы
сделать это, используйте фразу full outer join имя_таблицы on
условие соединения.
Упражнения
1. Назовите синтаксический символ Oracle, используемый для операций
внешнего соединения: . Назовите эквивалентную фразу
внешнего соединения для стандарта ANSI/ISO: .
2. Вы определяете оператор внешнего соединения. Какой из следующих
вариантов верен по отношению к операторам внешнего соединения?
A. Поскольку операции внешнего соединения позволяют иметь в одной
из таблиц значения NULL, вам не требуется определять сравнения на
равенство для соединения таких таблиц.
B. Во внешнем соединении таблиц А и В вы определяете правое
внешнее соединение, если желаете получить все строки таблицы А,
даже если отсутствуют соответствующие записи в таблице В.
С Во внешнем соединении таблиц А и В вы определяете левое внешнее
соединение, если желаете получить все строки таблицы В, даже если
отсутствуют соответствующие записи в таблице А.
D. Несмотря на то что операции внешнего соединения позволяют иметь
в одной из таблиц значения NULL, вы должны определять сравнения
на равенство для соединения таких таблиц.
3. В базе данных имеются две таблицы — PRODUCT и STORAGE_BOX.
Индивидуальные продукты описываются в таблице их уникальным идентифи-
Расширенная выборка данных a Oracle
83
кационным номером (ID), названием продукта и номером коробки, в
которой этот продукт хранится. Коробки индивидуального хранения
(отождествляемые по номерам), на которые имеются ссылки из другой
таблицы, могут содержать несколько различных продуктов, но каждая
коробка может находиться только в одном месте. Какой из приведенных ниже
операторов корректно отобразит ID продукта, его название и место
нахождения коробки с этим продуктом для всех продуктов, носящих гордое имя
"штуковина" (widget) в этой базе данных, для которых назначена или не
назначена коробка хранения?
A. select p.prod_id, p.prod_name, b.box_loc from
product p left outer join storage_box b on
p.stor_box_num = b.stor_box_num where p.prod_name -
'WIDGET' (+);
B. select p.prod_id, p.prod_name, b.box_loc from
product p left outer join storage_box b on
p.stor_box_num - b.stor_box_num where p.prod_name -
'WIDGET';
С select p.prod_id, p.prod_name, b.box_loc from
product p right outer join storage_box b where
b.stor_box_num = p.stor_box_num (+) and p.prod_name
= 'WIDGET';
D. select p.prod_id, p.prod_name, b.box_loc from
product p full outer join storage_box b on
p.stor_box_num - b.stor_box_num where
b.stor_box^_num is NULL;
4. Вы задали в Oracle следующую команду:
SQL> select e.ename, a.street_address, a.city, a.state, a.post_code
2 from emp e, addr a
3 where e.empno - a.empno (+)
4 and a.state - 'TEXAS';
В каком из следующих вариантов приведен эквивалентный оператор
ANSI/ISO?
A. select e.ename, a.street_address, a.city/ a.state,
a.post_code from emp e outer join addr a on e.empno
= a.empno where a.state = 'TEXAS';
B.select e.ename, a.street_address, a.city, a.state,
a.post_code from emp e left outer join addr a on
e.empno = a.empno and a.state = 'TEXAS';
С select e.ename, a.street_address, a.city, a.state,
a.post_code from emp e right outer join addr a on
e.empno = a.empno and a.state = 'TEXAS';
D. select e.ename, a.street_address, a.city, a.state,
a.post_code from emp e right outer join addr a
where e.empno = a.empno (+) and a.state = 'TEXAS';
5. Изучите следующие выходные данные SQL*Plus:
PRODUCT.ID PRODUCT.NAME BOX.LOCATION
578-X MIDGET IDAHO
TENNESSEE
456-Y MIDGET
Какой из следующих вариантов идентифицирует тип запроса, который,
вероятно, породил эти результаты?
А» Полное внешнее соединение
B. Левое внешнее соединение
84
Глава3
С Правое внешнее соединение
D. Объединение по эквивалентности
. »
Ответы
1. (+), [left I right] outer join имя_таблицы on условие_соединения. 2. D.
3. В. 4. С. 5. A.
Соединение таблицы с самой собой
В некоторых особых ситуациях оказывается необходимым выполнить
соединение таблицы, используя только одну таблицу. Все, что нужно для этого
сделать, — это использовать две копии таблицы и присоединить данные
таблицы к ней самой. Эта методика программирования на SQL известна под
именем самосоединения (self-join) таблиц. Такая задача может оказаться
полезной в ситуациях, когда есть вероятность, что имеется довольно слабое
различие между какими-либо двумя строками, которые в противном
случае были бы просто дубликатами друг друга (или, как их еще называют,
записями-двойниками). Если вы желаете выполнить с таблицей операцию
самосоединения, используйте для специфицирования второго ее экземпляра
псевдоним, чтобы Oracle поняла, что необходимо выполнить именно
самосоединение. Этот урок служит иллюстрацией надлежащего использования
самосоединения и показывает, как следует подобающим образом использовать
описываемую методику. Давайте зададим для нашей базы данных Oracle
следующую команду:
«з*имав SQL> insert into emp values (7903, 'FORD', 'ANALYST', '7566',
2 '03-DEC-81', 3000, null, 10);
1 row created.
Совет В главе 6 можно будет найти еще довольно много примеров
применения команды insert.
В этом случае мы добавили в таблицу ЕМР новую запись для служащего
FORD, который уже является служащим компании. Вся информация для
этого пользователя совпадает с уже содержащейся в базе данных информацией, за
исключением идентификационного номера служащего. После того как мы
обнаружили свою ошибку, мы можем задать простой запрос для выделения
записей-двойников:
м—шил SQL> select * from emp where ename - 'FORD';
EMPNO ENAME JOB MGR HI RE DATE SAL COMM DEFTNO
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7903 FORD ANALYST 7566 03-DEC-81 300D 20
Этот простой запрос хорошо работает для такого простого примера, но
попробуем усложнить его. Представим себе, что в таблице ЕМР хранятся данные
для компании, насчитывающей сотни служащих по фамилии FORD, которые
занимают различные должности и подчиняются различным менеджерам. В
таком случае, для того чтобы быть уверенным, что все экземпляры записи
FORD — это именно то, что нам необходимо, можно задать следующий
запрос:
НЙУРНШ SQL> select e.empno, е.ename, e.job
2 from emp e, emp e2
3 where e.empno <> e2.empno
4 and e.ename - e2.ename
5 and e.job - e2.job
6 and e.mgr - e2.mgr;
EMPNO ENAME JOB MGR
7903 FORD ANALYST 7566
7902 FORD ANALYST 7566
Этот запрос просто-таки говорит: "Хорошо, Oracle, покажи мне все записи
для пользователей с фамилией FORD, которые имеют различные
идентификационные номера служащего, но при этом отфильтруй мне всех тех FORD,
Расширенная выборка данных в Oracle
85
которые имеют разные должности и подчиняются разным менеджерам".
Нетрудно заметить, что самосоединения могут быть полезны для получения
записей, являющихся почти двойниками, особенно в случае возникновения
ошибочных ситуаций. К числу такого рода ситуаций относятся:
■ Пакетные задания, которые некорректно загрузили в базу данных
множество записей-двойников
■ Ситуации, когда почти дублирующие записи стали следствием ошибок
пользователей при вводе
■ Все случаи, когда необходимо ввести в базу данных запись, почти
идентичную ранее введенной записи
Некоторые пояснения по поводу самосоединений
Здесь мы хотим предостеречь вас. Имеются два важных фактора, вследствие
наличия которых самосоединения следует выполнять с предельной
осторожностью, хотя они (самосоединения) и являются мощным и полезным
средством для выявления записей-двойников. Во-первых, для обработки
самосоединений часто требуется много процессорного времени, а это может
отрицательно повлиять на производительность других пользователей базы
данных. Такое снижение связано с тем, что Oracle необходимо дважды
последовательно прочесть все данные таблицы. Во-вторых, так как требующееся
число операций проверки на равенство в ситуации с самосоединением равно
по крайней мере двум (одно —для соединения таблицы с самой собой, а
другое — для различения повторяющихся записей), в том случае, если вы неточно
сформулировали фразу where, могут возникнуть декартовы произведения.
Если во фразе where не будет сформулирован соответствующий набор
операций сравнения, это может привести к появлению в выходном наборе данных
множества копий каждой строки таблицы, что, несомненно, приведет к
увеличению времени выполнения запроса и формированию обширных и
бесполезных выходных данных.
Совет Обычно необходимое для использования во фразе where число
операций проверки на равенство для операции самосоединения таблицы с самой
собой должно быть не менее двух: одна — для соединения таблицы с самой
собой, а другая — для обнаружения повторяющихся записей.
В заключение
Для завершения этого урока давайте снова сделаем так, чтобы сделанные нами
изменения таблицы не были сохранены. Чтобы добиться этого, выполните
следующую команду:
HHBlfiB SQL> rollback;
Rollback complete.
Совет И снова напомним вам, что подробнее с командой rollback мы
познакомимся в главе 6.
Закрепление пройденного материала
1. Необходимо знать, что такое самосоединение и как оно формулируется и
используется.
S. При использовании самосоединения помните, что необходимо иметь во
фразе where достаточное количество операций проверки на равенство,
чтобы иметь возможность соединить таблицу саму с собой и различить
повторяющиеся записи.
3. Необходимо иметь представление о проблемах с возможного уменьшения
производительности и возникновения декартовых произведений, которые
могут появиться при использовании самосоединения.
ее
Глава 3
Упражнения
1. Международная компания, входящая в список Fortune 500 (список, в
котором приведено 500 наиболее удачливых и богатых компаний мира),
использует для подыскания своим сотрудникам подходящего места работы и
определения возможностей их профессионального роста внутреннее
тестирование. Тесты предлагаются сотрудникам по многим адресам.
Сотрудникам разрешается пройти тестирование на любую должность, на которую
они претендуют, но с одним ограничением: служащий может держать
конкретный экзамен на право занять интересующую его должность только
один раз в год. Недавно кадровая служба обнаружила, что некоторые
служащие обходят этот запрет, сдавая один и тот же экзамен в разных местах.
Какой из предложенных ниже запросов может оказаться полезным для
идентификации служащих, обошедших это ограничение?
A. select a.ename, a.test_name, a.test_date,
a.location b.test_date, b.location from tests a,
tests b where a.ename = b.ename and a.test_name =
b.test_name and a.location = b.location and
trunc(a.test_date) trunc(sysdate-365) and
trunc(b.test_date) trunc(sysdate-365);
B. select a.ename, a.test_name, a.test_date,
a.location b.test_date, b.location from tests a,
tests b where a.ename b.ename and a.test_name =
b.test_name and a.location = b.location and
trunc(a.test_date) trunc(sysdate-365) and
trunc (b.test_date) trunc (sysdate-365)",
С select a.ename, a.test_name, a.test_date,
a.location b.test_date, b.location from tests a,
tests b where a.ename = b.ename and a.test_name
b.test_name and a.location = b.location and
trunc(a.test_date) trunc(sysdate-365) and
trunc(b.test_date) trunc(sysdate-365);
D. select a.ename, a.test_name, a.test_date,
a.location b.test_date, b.location from tests a,
tests b where a.ename = b.ename and a.test_name =
b.test_name and a.location b.location and
a.test_date trunc(sysdate-365) and b.test_date
trunc(sysdate-365);
2. Сформулируйте главное возражение против использования
самосоединений в базах данных Oracle:
3. Определите проблему с самосоединениями, возникающую, при неудачной
формулировке фразы where (два слова):
Ответы
1. D. 2. Производительность. 3. Декартовы произведения.
Групповые функции и их использование
В этом разделе мы коснемся следующих вопросов, относящихся к групповым
функциям и их использованию:
■ Опознавание и использование групповых функций
■ Использование фразы group by
■ Исключение групп данных с помощью фразы having
Расширенная выборка данных ■ Oracle
87
Групповые функции позволяют выполнять операции с данными над
несколькими значениями в столбце данных, как будто столбец является
коллективной группой данных. Эти функции также называются функциями
группирования (group-by), потому что они часто используются в специальной фразе
операторов select, которая так и называется — group by. Более подробно
мы поговорим о фразе group by уже в этом разделе. Мы также опишем, как
во фразе group by используется фраза having, которая внутри нее может
действовать подобно фразе where.
Опознавание и использование
групповых функций
Вы можете захотеть трактовать данные столбца, как будто они являются
списком элементов, которыми можно манипулировать как единой группой.
Представьте себе содержимое таблицы ЕМР. Теперь, допустим, вы желаете
получить среднюю заработную плату сотрудников компании. Как известно,
формула вычисления среднего значения такова: необходимо сложить все
числа из списка, а затем разделить сумму на число элементов списка. Групповые
функции оказываются полезными для такого рода действий, потому что они, в
отличие от однострочных функций, могут выполнять действия над
несколькими строками одновременно. Ниже мы приводим список имеющихся в вашем
распоряжении групповых функций:
■ avg(jr) Усредняет все значения столбца х, возвращаемого оператором
select
■ count ( jc) Подсчитывает число не-NULL значений, возвращенных
оператором select для столбца х
■ шах ( jc) Определяет максимальное значение в столбце х для всех строк,
возвращенных оператором select
■ min (jc) Определяет минимальное значение в столбце х для всех строк,
возвращенных оператором select
■ stddav ( jc) Вычисляет стандартное отклонение для всех значений в
столбце х для всех строк, возвращенных оператором select
■ aum(jc) Вычисляет сумму всех значений в столбце х для всех строк,
возвращенных оператором select
■ Variance ( jc) Вычисляет дисперсию значений в столбце х для всех строк,
возвращенных оператором select
Групповые функции на практике
Более пристально взглянем на функции группирования. Функция avg ( )
принимает на входе значения всех строк одного столбца, возвращенных запросом,
и вычисляет для этого столбца среднее значение. Для таблицы ЕМР
применение функции avg ( ) к столбцу SAL приведет к следующему результату:
SQL> select avg(sal) from emp;
AVG(SAl)
2073.2143
Следующая функция группирования называется count ( ). Эта функция
претендует на то, чтобы стать краеугольным камнем репертуара каждого
профессионала Oracle. Функция count ( ) возвращает число строк таблицы для
заданных имен столбцов, критериев поиска операторов select или и того и
другого сразу. Заметьте, что самый быстрый способ вычисления функции
count ( ) — это передать ей такое значение, которое будет обработано
механизмом SQL быстрее всего. Среди быстро обрабатываемых величин можно
назвать псевдостолбцы ROW1D и целые числа, иллюстрацией чего служит
следующий пример:
88
Глава 3
SQL> SELECT COUNT(*), — Slow
2 COUNT(1), — Fast
3 COUNT(rowid) Fast
4 FROM EMP;
COUNT(*) COUNT(1) COUNT(rowid)
14 14 14
Совет Функция count (expr) возвращает число строк таблицы с
не-NULL значениями в том столбце, для которого выполняется. Другими
словами, если при вызове функции count ( ) для конкретного столбца
окажется, что в некоторых его строках содержатся значения NULL, эти
строки не будут включены в счетчик. Для того чтобы избежать подобных
проблем, многие пользователи Oracle используют count (ROWID). Он
вычисляется быстрее, чем count (*), и к тому же у каждой строки таблицы
имеется значение ROWID.
Звездочка (*) в предыдущем запросе является групповым символом
(wildcard), означающим все столбцы таблицы. Для повышения
производительности рекомендуется не использовать этот групповой символ, потому что
механизм обработки SQL должен перед выполнением функции разрешить все
имена столбцов таблицы — шаг, который совершенно необязателен, если вы
всего лишь пытаетесь подсчитать число строк таблицы. Обратите внимание,
что в одной из строк приведенного выше примера мы использовали
специальный псевдостолбец ROWID, являющийся особым значением, уникально
идентифицирующим каждую строку. Отметим, что у каждой строки в таблице
имеется свой уникальный ROWID.
Совет Не используйте count (*) для определения количества строк
таблицы. Вместо этого используйте count (1) или count (ROWID). Эти
операции выполняются быстрее, потому что они обходят некоторые ненужные
операции в механизме обработки SQL РСУБД Oracle.
Следующая пара функций группирования — это функции min ( ) и max ( ).
Функция тах( ) определяет максимальное значение для передаваемого
столбца, а функция min ( ) — его минимальное значение, как это показано
здесь:
SQL> select max(sal), min(sal) from emp;
HAX(SAL) MIN (SAL)
5000 BOO
Можно также комбинировать групповые и однострочные функции. Как
это делается, показано в следующем примере:
SQL> select to_char(max(hiredate), 'DD-MON-Yimf') "Newest",
2 to_char(min(hiredate), *DD-MON-YYYY') "Oldest"
3 from emp;
Newest Oldest
23-MAY-1987 17-DEC-1980
Последняя групповая функция, sum ( ), обычно используется в
простейших бухгалтерских отчетах. Эта функция дает нам сумму всех значений
столбца. Вот пример ее использования:
SQL> select sum(sal) from emp;
SUM (SAL)
29025
Вообще говоря, групповые функции работают со столбцами типов
NUMBER и DATE, потому что многие функции, представляемые ими,
являются цифровыми. Получение стандартного отклонения для набора из 12 слов
представляется довольно бессмысленным занятием, если только пользователь
не уточнит, что он желает, например, вычислить стандартное отклонение для
длин этих слов, и не скомбинирует функции stddev ( ) и length ( ). Однако,
Расширенная выборка данных ■ Oracle
89
как всегда, из общего правила имеются исключения. Первым таким
исключением является функция count ( ), которая может работать со столбцами
любого типа. Вторым исключением являются функции min ( ) и max ( ), которые
помимо типов данных NUMBER и DATE работают со многими другими
типами данных Oracle.
Групповые функции игнорируют значения NULL!
По умолчанию групповые функции игнорируют значения NULL. Чтобы в
принудительном порядке заставить групповые функции Oracle не
игнорировать значения NULL, можно использовать функцию nvl ( ). Рассмотрим
примеры действия групповых функций в ситуации, когда в обрабатываемом
столбце имеются значения NULL, в том случае, если используется функция
nvl ( ) и если функция nvl ( ) не используется:
SQL> select avg(coom) from emp;
AVG (COM)
550
SQL> select avg(nvl (coram, 0)) from emp;
AVG (NVL (СОНМ, 0) )
157.142B57
Закрепление пройденного материала
1. Необходимо знать групповые функции и знать, как они используются в
простых операторах select.
S. Нужно понимать, как используется функция count( ) и почему лучше
использовать count (1) или count (ROWID), чем count (*) .
3. Необходимо понимать, что групповые функции по умолчанию игнорируют
значения NULL, но если использовать функцию nvl ( ), можно добиться,
чтобы они не игнорировали эти значения.
Упражнения
1. В таблице, насчитывающей 1232432 заказа клиентов за истекший год,
имеется столбец TOTAL, в котором содержится общее количество денег,
потраченных клиентом на свои заказы. Для подсчета валовой выручки от
продаж за год вы задаете следующую команду: select sum (total) from
customers. Какой из следующих вариантов правильно определяет число
строк, которые появятся в выходных данных?
А.1 В. 2
С 500 D. 1232432
2. В стандартной таблице ЕМР, с которой мы работаем с самого начала
книги, содержатся 14 записей, каждая из которых соответствует одному из
служащих компании. Одна из этих записей содержит в столбце MGR значение
NULL. Вы задали для этой таблицы команду: select count (mgr) from
emp;. Какой из следующих вариантов совпадает со значением,
возвращенным Oracle?
А. 11 В. 12
С 13 D. 14
3. Укажите тип значений, который по умолчанию игнорируется групповыми
функциями: . Назовите однострочную функцию, которую
можно использовать в сочетании с групповыми функциями, чтобы
вынудить групповые функции не игнорировать значения этого типа:
90
Глава 3
Ответы
1. А. 2. С. 3. NULL, nvl ( )
Использование фразы group by
До сих пор мы встречались только с примерами использования групповых
функций, так сказать, самих по себе, в перечислении столбцов запроса. Такое
их применение заслуживает всяческих похвал, но иногда возникают ситуации,
когда с их помощью можно сделать более осмысленными выходные данные
оператора select, собрав данные в логические группировки. К примеру, вы
желаете получить листинг всех различных должностей в компании с
указанием числа сотрудников, выполняющих эти роли. Для нашей маленькой
компании можно просто вывести всю информацию таблицы ЕМР и выполнить все
подсчеты вручную. Но понятно, что подобный процесс не сработает для более
крупных организаций. Вместо этого можно использовать для получения более
легко поддающегося интерпретации листинга оператор select с групповой
функцией типа count ( ). Попробуем осуществить нашу идею:
мамаши SQL> select job, count (job)
2 from emp;
SQL> select job, count(job)
*
ERROR at line 1:
ORA-00937: not a single-group group function
Что произошло? Похоже, мы чего-то не учли. Oracle ожидает, что
групповые функции сгенерируют одну строку выходных данных для всех строк
таблицы, столбцы которой специфицированы в этих функциях. В нашем случае
Oracle приходит в замешательство от того, что наряду с групповой функцией
мы просим ее перечислить индивидуальные значения столбца JOB, включив в
список столбцов ссылку на столбец JOB. Решение проблемы заключается в
том, чтобы включить в оператор select фразу group by, которая, на самом
деле, приказывает Oracle вывести все различные значения столбца JOB, а
затем подсчитать, сколько раз это значение появляется в таблице ЕМР. Давайте
попробуем еще раз:
ДИИМЙЦ SQL> select job, count (job)
2 from emp
3 group by job;
JOB COUNT (JOB)
ANALYST 2
CLERK 4
MANAGER 3
PRESIDENT 1
SALESMAN 4
Совет Все столбцы в списке столбцов вашего оператора select, не
являющиеся групповыми функциями, должны быть перечислены во фразе group
by. Однако указанный во фразе group by столбец не обязан появляться во
фразе column.
Отлично! Фраза group by в последнем примере спасла нас от выполнения
значительного объема ручной работы. Вместо этого Oracle взяла большую
часть работы на себя и показала только требующиеся нам результаты. Фраза
group by прекрасно работает во многих ситуациях, когда требуется
выполнить для отчета вычисления с данными в соответствии с их группами и
категориями.
Теперь рассмотрим более сложный пример. Предположим, нам требуется
получить распечатку средних зарплат для каждой должности по каждому
отделу нашей компании. Вы уже видели, что получается, если совершенно
опустить фразу group by. Но есть еще кое-что, к чему следует относиться очень
внимательно. Давайте сделаем первую попытку спроектировать запрос с
фразой group by, который удовлетворял бы нашим требованиям:
Расширенная выборка данных ■ Oracle
91
SQL> select deptno, avg(sal), job
2 from emp
3 group by deptno;
select deptno, avg(sal), job
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
Когда мы используем в нашем запросе фразу group by, все несгруппиро-
ванные выражения во фразе column нашего запроса должны появиться в
этой фразе до групповых выражений. Иначе говоря, после групповых
выражений во фразе column не могут появляться несгруппированные выражения.
Чтобы разрешить эту проблему, мы можем полностью удалить столбец JOB из
фразы column. Однако и это не даст нам того вида выходных данных,
который необходим. Вместо этого мы должны сначала перегруппировать
несгруппированные выражения, чтобы все они появлялись перед групповыми
функциями, а затем включить столбец JOB во фразу group by. Вот теперь
Oracle понимает, как ей вычислять агрегированные столбцы в операторе
select, являющиеся частью групповых выражений. Ниже показано решение
поставленной задачи:
SQL> select deptno, job, avg(sal)
2 from emp
3 group by deptno, job;
DEPTNO
10
10
10
20
20
20
30
30
30
JOB
CLERK
MANAGER
PRESIDENT
ANALYST
CLERK
MANAGER
CLERK
MANAGER
SALESMAN
AVG(SAL)
1300
2450
5000
3000
950
2975
950
2850
1400
Обратите внимание, что записи выходных данных перечислены в порядке
возрастания содержимого столбца DEPTNO. Это связано с тем, что имя
столбца DEPTNO во фразе group by появляется первым. Если бы мы первым
указали имя столбца JOB, выходные данные были бы упорядочены (в нашем
случае расположены в алфавитном порядке) по должностям, как это показано
ниже:
SQL> select deptno, job, avg(sal)
2 from emp
3 group by job, deptno;
DEPTNO
20
10
20
30
10
20
30
10
30
JOB
ANALYST
CLERK
CLERK
CLERK
MANAGER
MANAGER
MANAGER
PRESIDENT
SALESMAN
AVG(SAL)
3000
1300
950
950
2450
2975
2850
5000
1400
С фразами group by можно использовать и фразы order by, и довольно
часто именно так и поступают. Давайте взглянем на следующие выходные
данные, которые мы упорядочили таким образом, чтобы сначала
перечислялись более высокие заработные платы, чтобы можно было сделать выводы, в
каких отделах и на каких должностях сотрудникам платят больше:
SQL> select deptno, job, avg(sal)
2 from emp
3 group by deptno, job
4 order by 3 desc;
92
Глава 3
DEPTNO
\
10
20
20
30
10
30
10
. 20
30
JOB
PRESIDENT
ANALYST
MANAGER
MANAGER
MANAGER
SALESMAN
CLERK
CLERK
CLERK
AVG(SAL)
5000
3000
2975
2850
2450
1400
1300
950
950
Совет Если вместе с фразой group by вы используете фразу order by,
то порядок, в котором вы перечисляете столбцы во фразе group by, не
имеет значения — порядок выходных данных будет определяться фразой
order by.
Возможности О LAP в Oracle
Некоторые опции обработки запросов в Oracle включают использование
операций онлайновой аналитической обработки (online analytical processing —
OLAP) в базе данных. Эти опции оказываются полезными для приложений,
работающих с хранилищами данных (data warehousing) и витринами данных
(data marts), которые используются для поддержки систем принятия
бизнес-решений. Первая из новых операций предназначена для повышения
производительности определенного типа запросов, которые называются
запросами "первые N" (top-N query). Более подробно мы коснемся этой темы позже.
Еще две новые операции позволяют выполнять во фразе group by
определенные операции OLAP. Эти две операции называются cube и rollup.
Рассмотрим каждую из них более подробно.
гоПир Эта операция из фразы group by используется для подведения
подытогов на любом требующемся уровне агрегации. Затем эти подытоги
"свертываются" в итоговую сумму в соответствии с элементами, перечисленными в
выражении из фразы group by. Это подведение итогов основано на одномерной
иерархии данных в групповой информации. Предположим, например, что мы
хотим получить разбивку платежной ведомости нашей компании по отделам и
должностям. Приведенный ниже блок кода дает требующуюся информацию:
SQL> select deptno, job, sum(sal) as salary
2 from emp
3 group by rollup(deptno, job);
DEPTNO JOB SALARY
10
10
10
10
20
20
20
20
30
30
30
30
CLERK
MANAGER
PRESIDENT
ANALYST
CLERK
MANAGER
CLERK
MANAGER
SALESMAN
1300
2450
5000
8750
6000
1900
2975
10875
950
2850
5600
9400
29025
Совет Обратите внимание, что значения NULL в выходных данных операций
rollup обычно означают, что в строке содержится информация о подытогах
или об итоговой сумме. Если вам угодно, можно вместо этого использовать
функцию nvl { ) для подстановки более "говорящего само за "себя" значения.
cube Это расширение, аналогичное rollup. Различие состоит в том, что
операция cube позволяет взять определенный набор группируемых столбцов и
создать подытоги для всех их возможных комбинаций. Операция cube
вычисляет все уровни подытогов по горизонтальным линиям в таблицах
Расширенная выборка данных в Oracle
93
(spreadsheets) выходных данных и создает итоги с перекрестными ссылками
(cross-tab) для множества вертикальных столбцов в этих таблицах. Результатом
являются итоговые строки, отражающие подытоги для каждой комбинации
столбцов или выражений во фразе group by, что известно под названием
n-мерная кросс-табуляция (л-dimensional cross-tabulation). В следующем
примере обратите внимание, как операция cube не то&пько дает разбивку платежной
ведомости компании по DEPTNO и JOB, но и дает разбивку платежной
ведомости для всех отделов по должностям (JOB):
f^ffffffi SQL> select deptno, job, sum(sal) as salary
2 from emp
3 group by cube(deptno, job);
DEPTNO
10
10
10
10
20
20
20
20
30
30
30
30
JOB
CLERK
MANAGER
PRESIDENT
ANALYST
CLERK
MANAGER
CLERK
MANAGER
SALESMAN
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
SALARY
1300
2450
5000
8750
6000
1900
2975
10875
950
2850
5600
9400
6000
4150
8275
5000
5600
29025
Закрепление пройденного материала
1. Необходимо знать об использовании групповых функций в сочетании с
негрупповыми выражениями во фразе column, что требует применения
фразы group by. Помните, что все негрупповые выражения должны быть
перечислены перед групповыми выражениями.
2. Необходимо понимать связь между порядком, в котором перечисляются
столбцы в выражении из фразы group by, и порядком, в котором Oracle
перечисляет строки в выходных данных. Кроме того, помните, что, если
используется фраза order by, она перекрывает порядок, установленный
фразой group by.
3. Убедитесь, что можете идентифицировать ситуации, в которых операторы,
содержащие фразу group by, завершатся ошибкой, а также знаете, как
ликвидировать эти ошибки.
4. Знайте, как использовать функциональные возможности OLAP,
обеспечиваемые во фразе group by операциями cube и rollup. Кроме того, следует
знать, что без этих функциональностей вам пришлось бы разрабатывать
множество длинных запросов, выходные данные которых пришлось бы
объединять с помощью операции union all (не задумывайтесь сейчас над
тем, что это за операция union all; просто будьте уверены, что сможете
назвать ее как альтернативу описанным в этом разделе функциям OLAP).
Упражнения
1. Вы разрабатываете запрос к таблице PROFITS, в которой хранится
информация о доходах компании, разбитая по регионам, типам продуктов и
кварталам. Какой из следующих операторов SQL отобразит кросс-табуляцию
выходных данных, показывающих прибыли в разбивке по регионам, типам
продуктов и по времени?
94
Глава 3
A. select region, prod_type, time, sum(profit) from
profits group by region, prod_type, time;
B. select region, prod_type, time from profits group
by rollup (region, prod_type, time);
С select region, prod_type, time from profits group
by cube (region, prod—type, time);
D. select region, prod_type, time, sum(profit) from
profits group by cube (region, prod_type, time);
S. Какой из следующих вариантов выбора идентифицирует запрос group by,
который не вызывает ошибки Oracle при выполнении этого запроса для
базы данных?
A. select deptno, job, sum(sal) from emp group by job,deptno;
B. select sum(sal), deptno, job from emp group by job,deptno;
С select deptno, job, sum(sal) from emp;
D. select deptno, sum(sal), job from emp group by job,deptno;
3. Изучите следующий оператор SQL:
SQL> select a.deptno, a.job, b.loc, sum(a.sal)
2 from emp a, dept b
3 where a.deptno - b.deptno
4 group by a.deptno, a.job, b.loc
5 order by sum(a.sal);
Какой из следующих вариантов указывает столбец, по которому будут
упорядочены выходные данные запроса?
A. A.DEPTNO В. A.JOB
С B.LOC D. sum (A. SAL)
4. Без использования встроенных во фразу group by функциональных
возможностей OLAP вам придется разрабатывать много запросов SQL,
выходные данные которых соединены вместе с помощью этого типа операторов
(два слова): _^
Ответы
1. D. 2. А. 3. D. 4. union all
Исключение полученных с помощью group by данных
фразой having
После того как данные сгруппированы с помощью фразы group by, иногда
бывает полезно отфильтровать нежелательные данные. Например, мы желаем
получить отчет о средней заработной плате служащих компании, разбитый по
отделам и названиям должностей. Однако в этот запрос мы желаем включить
только те отделы и те должности, где средняя зарплата превышает две тысячи
долларов. Фактически, мы хотели бы включить во фразу group by фразу
where, чтобы ограничить отбираемые результаты только отделами и
должностями со средней зарплатой, превышающей две тысячи долларов. Такого
эффекта можно добиться, используя специальную фразу, которая называется
having и которая ассоциирована с операторами group by. Посмотрим на
пример применения такой фразы:
МИЯШ» SQL> select deptno, job, avg(sal)
2 from emp
3 group by deptno, job
4 having avg(sal) > 2000;
Расширенная выборка данных в Oracle
95
DEPTNO JOB AVG (SAL)
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 3000
20 MANAGER 2 975
30 MANAGER 2850
Рассмотрим выходные данные этого запроса. Во-первых, Oracle вычисляет
средние значения заработной платы для каждой должности в каждом отделе
компании. Затем фраза having отсекает отделы и должности, для которых
средняя зарплата их служащих не превышает 2000 долларов. Такой
избирательности непросто добиться с помощью ординарных фраз where, поскольку
фраза where работает с индивидуальными строками, а в этом примере
требуется отбирать целые группы строк. В этом запросе нам удалось успешно
ограничить выходные данные после фразы group by за счет использования фразы
having.
Совет Нельзя указать конкретного порядка появления в запросе фраз
having и group by. Фраза having может появиться в запросе до фразы group
by. Однако кажется логичным, что первой в операторе SQL должна
появиться фраза group by.
Закрепление пройденного материала
1. Необходимо знать о фразе having и выполняемых ею функциях.
2. Помните, что упоминание во фразе having групповых выражений
позволяет Oracle фильтровать данные на основании вторичных критериев.
Упражнения
1. Вы разрабатываете запрос к таблице PROFITS, в которой хранится
информация о доходах компании по регионам, по типам продуктов и по
кварталам. Какой из следующих вариантов ответа идентифицирует запрос, после
которого можно получить средние доходы, превышающие 100 000 долларов
в разбивке по типам продуктов, регионам и по времени?
A. select region, prod_type, period, avg(profit) from
profits where avg(profit) 100000 group by region,
prod_type, period;
B. select region, prod_type, period, avg(profit) from
profits where avg(profit) 100000 order by region,
prod_type, period;
С select region, prod_type, period, avg(profit) from
profits group by region, prod_type, period having
avg(profit) 100000;
D. select region, prod_type, period, avg(profit) from
profits group by region, prod_type, period having
avg(profit) 100000;
2. Внутри выражения group by фраза having может играть роль фразы
именно этого типа:
Ответы
1. С. 2. where
Резюме главы
Рассмотренные в этой главе вопросы очень разнообразны. Вы многое узнали о
расширенном отборе данных в SQL*Plus. Мы обсудили, как соединять данные
Расширенная выборка данных в Oracle
96
из многих таблиц в единый набор выходных данных, используя допущение о
том, что у этих таблиц имеется общий столбец, который может быть
использован в операциях соединения. Мы обсудили, как создавать объединения по
эквивалентности, которые представляют такие соединения, когда запись из
одной таблицы появляется только в том случае, если во второй таблице удалось
найти соответствующую ей запись. Далее мы рассмотрели, как
формулируются внешние соединения, в которых требование о наличии в обеих таблицах
соответствующих друг другу записей соблюдается не так строго. Мы также
узнали, как соединять данные таблицы с ней самой, используя процесс
самосоединения. Затем мы перешли к обсуждению групповых выражений и
операций group by. Мы рассмотрели использование фразы having и таких
выражений OLAP, как cube и rollup.
Двухминутное погружение в пройденное
■ Операторы select, которые получают данные более чем из одной
таблицы и объединяют их, называются соединениями.
■ Для соединения данных из двух таблиц они должны иметь общий столбец.
И Общий для двух таблиц столбец может создавать так называемый внешний
ключ (или связь) из одной таблицы в другую. Это условие особенно
справедливо в том случае, если данные в одной из таблиц являются частью
первичного ключа — столбца, который определяет условия уникальности строк
таблицы.
■ Внешний ключ может создать между двумя таблицами отношение
"родитель-потомок".
И Один из типов соединений называется внутренним соединением или
объединением по эквивалентности. Операция объединения по эквивалентности
основана на операции проверки на равенство, связывающей данные из
общего столбца двух таблиц.
■ При соединении таблиц с использованием синтаксиса Oracle
используемые для соединения сравнения по общим столбцам таблиц должны быть
включены во фразу where запроса.
И При соединении таблиц с использованием синтаксиса ANSI/ISO
необходимо использовать фразу join иыя_таблицы on условие_соединения.
Используемые для соединения операции сравнения в этом случае
сохраняются отдельно от других условий фильтрации, которые могут
присутствовать во фразе where.
■ Синтаксисы соединений ANSI/ISO и Oracle логически эквивалентны.
Использование того или иного оператора не дает преимущества в
производительности. Однако синтаксис ANSI/ISO и Oracle нельзя использовать
вместе в одном запросе SQL.
■ Другой тип соединения называется внешним соединением. Внешнее
соединение возвращает данные из одной таблицы даже в том случае, если
данные в другой таблице отсутствуют. "Другая" таблица в операторе
внешнего соединения называется внешней таблицей.
И Общий столбец, появляющийся во внешней таблице соединения, должен
иметь специальный маркер, помещаемый сразу за операцией сравнения
оператора select, создающего таблицу.
■ Символом внешнего соединения в синтаксисе Oracle является маркер
"(+)", который эквивалентен фразе синтаксиса ansi/iso [left |
right] outer join. Место размещения этого маркера зависит от того,
каким (правым или левым) является внешнее соединение.
■ Если имена общих столбцов в обеих таблицах совпадают, то имени общих
столбцов обеих таблиц, используемых в операциях соединения по
синтаксису Oracle, должен предшествовать псевдоним таблицы, четко обозна-
97
Глава 3
чающий таблицу, которой принадлежит столбец, или полное имя
таблицы.
■ Данные таблицы могут быть соединены сами с собой. Эта технология
может быть полезной при определении, имеются ли в таблице строки,
содержащие лишь слегка отличающиеся значения, но во всем остальном
являющиеся дубликатами. Такие операции называются операциями
самосоединения.
■ В операторах select с самосоединениями должны использоваться
псевдонимы таблиц.
■ Если в операторе соединения по синтаксису Oracle пропущено сравнение
для соединения или в синтаксисе ANSI/ISO использованы ключевые
слова cross join, возникают так называемые декартовы произведения.
■ Для упрощения операций соединения можно использовать так
называемые естественные соединения. Естественные соединения возможны для
синтаксиса ANSI/ISO в тех случаях, когда все общие столбцы
объединяемых таблиц имеют попарно одинаковые имена. Для того чтобы указать
Oracle, что следует выполнить естественное соединение, нужно
использовать ключевое слово natural. Для того чтобы выполнить естественное
соединение, не нужно указывать специальное сравнение для соединения.
■ Выходные данные операторов select для таблицы могут быть
объединены в соответствии с установленными запросом критериями.
■ Фраза group by помогает группировать данные.
■ Имеются некоторые функции группирования, позволяющие выполнять
операции над данными столбца, как будто эти данные логически являются
одной переменной.
■ К числу групповых функций относятся функции max ( ), min ( ), sum ( ),
avg( ),stddev( ), variance ( ) и count ( ).
■ Эти функции фуппирования могут быть применены к значениям столбцов
таблицы в целом или к подмножествам данных столбцов для строк,
возвращаемых операторами group by.
■ Данные в операторе group by могут быть исключены или включены на
основании специального набора критериев where, определяемого
конкретно для этой группы во фразе having.
И Используемые для определения фразы having данные могут быть
определены запросом во время его выполнения.
■ Значения NULL игнорируются групповыми функциями. Для того чтобы
принудительно заставить групповые функции не игнорировать значения
NULL, используется функция nvl ( ).
Вопросы для самопроверки
1. Эта команда SQL позволяет агрегировать данные с использованием
функций для столбцов (два слова):
2. Эта фраза описывает результат соединения двух или более таблиц в том
случае, если плохо определена фраза whe ге:
3. Это ключевое слово SQL расширяет функциональность выражений для
группирования, играющих роль фразы whe re во фразе group by:
4. Этот тип ограничения используется в Oracle для определения отношения
между двумя таблицами, чтобы можно было выполнить операцию
соединения:
98
Глава 3
Вопросы ко всей главе
1. Вы желаете определить в SQL*Plus групповое выражение. Какая из
перечисленных ниже функций не является групповой?
A. avg ( ) В. sqrt ( )
С sum( ) D. max( )
2. Вы отбираете данные из нескольких таблиц Oracle с намерением соединить
результаты. Какой из критериев должен быть истинным, чтобы можно
было выполнить внутреннее соединение?
A. Общие столбцы в соединении не обязаны иметь совпадающие
значения.
B. Таблицы в соединении должны иметь общие столбцы.
C. Общие столбцы в соединении могут иметь, а могут и не иметь
совпадающих значений.
D. Общие столбцы в соединении обязаны иметь совпадающие
значения.
3. Пользователь создает оператор соединения для таблиц EMPLOYEE и
DEPT. В таблице ЕМР имеются некоторые служащие, записи о которых
пользователь обязательно хочет увидеть в выходных данных запроса,
хотя для этих пользователей до сих пор не заполнено поле "начальник
отдела". Какой оператор запроса больше всего подходит такому
пользователю?
A-select e.empid, d.head from EMPLOYEE e, dept d;
B.select e.empid, d.head from EMPLOYEE e, dept d
where e.deptf = d.deptf;
C. select e.empid, d.head from EMPLOYEE e, dept d
where e.deptf = d.deptf (+);
D. select e.empid, d.head from EMPLOYEE e, dept d
where e.deptf (+) = d.deptf;
4. Вы разрабатываете в Oracle групповые выражения. Какое из следующих
использований фразы having является правильным? (Выберите три варианта.)
A. Для возвращения выходных данных в отсортированном виде
B. Для исключения некоторых групп данных на основании известных
критериев
C. Для включения некоторых групп данных на основании неизвестных
критериев
D. Для включения некоторых групп данных на основании известных
критериев
5. Вы разрабатываете в Oracle операторы соединения таблиц и желаете
сделать это должным образом. В каком из следующих утверждений
приводится правильное определение декартова произведения?
A. Групповая функция
B. Результат выполнения оператора select с соединением, если в нем
отсутствует фраза where
C. Результат нечеткой логики
D. Специальная характеристика сервера Oracle
6. Вы проектируете приведенные ниже операторы SQL, содержащие
групповые выражения. Какую строку приведенного ниже оператора select
следует удалить, чтобы исправить имеющуюся в нем ошибку?
Расширенная выборка данных в Oracle
99
select deptno, avg(sal)
from emp
group by empno;
A-select deptno, avg(sal)
B. from EMP
С group by empno;
D. В этом операторе нет ошибок, поэтому убирать ничего не требуется.
Ответы на вопросы для самопроверки
1. group by
2. Декартово произведение
3. having
4. Внешний ключ
Ответы на вопросы ко всей главе
1. В. sqrt( )
Объяснение Операция извлечения квадратного корня выполняется над
значением одного столбца. Выбор А неверен, так как функция avg ( ) является
групповой функцией, которая принимает множество входных данных и
возвращает их среднее значение. Выбор С некорректен, потому что функция
sum ( ) является групповой функцией, возвращающей сумму значений
множества входных данных. И наконец, выбор D неверен, так как max ( )
является групповой функцией, принимающей на входе некоторое множество чисел и
возвращающей его наибольшее значение.
2. В. Участвующие в соединении таблицы обязаны иметь общие столбцы.
Объяснение Возможно, операция соединения не сгенерирует ни одного
возвращаемого значения так же, как это может оказаться возможным для любого
оператора select. Варианты А, С и D представляют спектр возможностей для
общих значений, которые могут присутствовать, а могут и не присутствовать в
общих столбцах. Однако само по себе соединение невозможно, если у таблиц
нет общих столбцов.
3. С. select e.empid, d.head, from EMPLOYEE e, dept d where
e.dept# = d.dept# (+);
Объяснение Выбор С описывает операцию внешнего соединения наиболее
подходящим для целей пользователя способом. Внешней таблицей этого
соединения является таблица DEPT, на что указывает маркер (+), размещенный
сразу же после имени столбца DEPT# оператора сравнения, определяющего
соединение. Любое другое определение либо неверно определяет место
размещения оператора внешнего соединения, либо содержит какие-то другие
ошибки.
4. В, С и D. Для исключения некоторых групп данных на основании
известных критериев, для включения некоторых групп данных на основании
неизвестных критериев, для включения некоторых групп данных на
основании известных критериев
Объяснение Исключение или включение сгруппированных строк
обрабатывается с помощью фразы having оператора select. Выбор А не подходит
нам, потому что во фразе order by оператора select задается порядок
сортировки.
5. В. Результат выполнения оператора select с соединением, если в нем
отсутствует фраза where
100
Глава 3
Объяснение Декартово произведение является результирующим выходным
набором оператора select, в котором возвращаемыми являются все данные
из обеих таблиц. К числу причин, приводящих к возникновению декартова
произведения, относится отсутствие для оператора select с соединением
фразы where.
6. С. group by empno;
Объяснение Так как столбец EMPNO не входит в исходный перечень
столбцов, которые должны быть отображены в результатах запроса, это имя не
может быть использовано в операторе group by. Этот вопрос обычно приводит в
замешательство многих читателей, которые считают, что ошибочным является
упорядочение ссылок на имена столбцов во фразе column. Чтобы вас
перестали мучить такие сомнения, вспомните, что, если вы удалите выражение group
by, запрос будет выполняться корректно, а вот если удалить фразу column,
запрос обязательно закончится аварийно.
ГЛАВА 4
Подзапросы
102
Глава 4
этой главе мы познакомимся со следующими вопросами, а
потом и продемонстрируем свои знания по ним:
Ш Использование подзапросов
■ Создание удобочитаемого выхода для SQL*Plus
Эта глава завершает список тем, связанных с выборкой данных в Oracle.
Сначала мы займемся обсуждением вопроса о том, как использовать в наших
операторах select подзапросы. Мы узнаем о простых и многостолбцовых
подзапросах. В конце этой главы мы поговорим о задании специального
форматирования, позволяющего превратить SQL*Plus в инструментальное
средство для генерации отчетов. Эти материалы завершают наше знакомство с темой
выборки данных и составляют около 10% экзаменационного материала.
Совет Из двух вопросов, которые мы собираемся рассмотреть, на первом
экзамене ОСР больше затрагивается вопрос о подзапросах. Поэтому при
желании вы можете ограничить свое знакомство с созданием
удобочитаемых выходных данных разбором использования подстановочных переменных,
а остальную информацию просто просмотреть "для полноты картины ".
Использование подзапросов
В этом разделе мы рассмотрим следующие вопросы, связанные с
использованием подзапросов:
Ш Понимание и определение подзапросов
Ш Перечень различных типов подзапросов и их запись
■ Многостолбцовые подзапросы
■ Значения NULL в подзапросах
• Подзапросы во фразе from
Подзапросом называется "запрос внутри запроса". Другими словами,
подзапрос — это оператор select, вложенный внутрь оператора select,
спроектированный таким образом, чтобы ограничить отобранные выходные
данные родительского запроса путем генерации промежуточного набора
результатов того или иного вида. Имеется несколько способов включения
подзапросов во фразы where операторов SQL. Мы поговорим в этом разделе
о типах проблем, которые помогают разрешить подзапросы, о том, как
разрабатывать подзапросы, о различных типах подзапросов и о том, как пишутся
однострочные (то есть возвращающие ровно одну строку) и многострочные
подзапросы.
Совет В некоторые вопросы, о которых здесь пойдет речь, мы углубимся
несколько больше, чем это требуется для экзамена на ОСР. Тем не менее мы
рекомендуем проработать этот материал, чтобы вы глубоко понимали все
связанное с подзапросами. Это поможет вам не только на экзамене, но ив
карьере профессионала в области Oracle.
Понимание и определение подзапросов
Подзапросы могут использоваться для получения значений для родительских
операторов select, когда неизвестен конкретный критерий поиска. Чтобы
добиться этого, во фразе where родительского оператора select должен
иметься оператор сравнения, в котором в результате выполнения подзапроса
определяется неизвестное значение, с которым производится сравнение.
Внутренний подзапрос выполняется один раз непосредственно перед
выполнением главного внешнего запроса. Подзапрос возвращает свои результаты во
внешний (главный) запрос. Рассмотрим пример, где мы хотим найти
информацию о фамилиях, номерах отделов и заработной плате сотрудников,
работающих в Нью-Йорке. Однако, не заглядывая в таблицу DEPT, мы не можем
узнать, номера каких отделов соответствуют нью-йоркскому офису компании.
Подзапросы
103
tgSiBSm
Сначала давайте посмотрим, как можно получить интересующую нас
информацию, используя оператор j oin:
SQL> select ename, emp.deptno, sal
2 from emp join dept on emp.deptno ~ dept.deptno
3 where dept.loc - 'NEW YORK';
ENAME
CLARK
KING
MILLER
DEPTNO
10
10
10
SAL
2450
5000
1300
А теперь посмотрим,
SQL> select ename
2 fi
com emp
3 where deptno
4 (
5
6
ENAME
CLARK
KING
MILLER
, deptno,
-
aalact dapteo
f ran dept
vhara loc
чем к
, sal
- 'NSH YORK') ;
DEPTNO
10
10
10
SAL
2450
5000
1300
Совет Подзапросы должны появляться внутри круглых скобок, иначе у
Oracle возникнут проблемы при попытке отличить подзапрос от
родительского запроса. Кроме того, вы должны убедиться, что подзапрос помещен в
правильном месте оператора сравнения.
Выделенная часть оператора SQL является подзапросом. Обратите
внимание, как родительский запрос требует подзапроса для получения для себя
значения DEPTNO, соответствующего офису в Нью-Йорке. При размещении
оператора select Oracle вначале обрабатывает подзапрос, чтобы разрешить
все неизвестные критерии поиска, а затем направляет этот разрешенный
критерий во внешний запрос. Затем внешний запрос может разрешить набор
данных, который должен быть возвращен.
Также примите во внимание, что в предыдущем примере для связи
родительского запроса с подзапросом используется сравнение по равенству. Это
наиболее часто используемый метод соединения подзапросов с их родительскими
запросами, но он не является единственным. Вы можете использовать
множество других операторов сравнения, например <, >, <=, <> и >= . Кроме того,
вы можете использовать оператор сравнения in, аналогичный оператору case,
используемому во многих языках программирования, поскольку можно
добиться разрешения на основании равенства значения в родительском столбце и
любого элемента группы. Рассмотрим пример:
SQL> select ename, job.
2 from emp
3 where deptno in
4 ( select deptno
5 from dept
6 where dname in
7
ENAME
ALLEN
HARD
MARTIN
BLAKE
CLARK
KING
TURNER
JAMES
MILLER
('ACCOUNTING',
JOB
SALESMAN
SALESMAN
SALESMAN
MANAGER
MANAGER
PRESIDENT
SALESMAN
CLERK
CLERK
sal
■SALES'));
SAL
1600
1250
1250
2850
2450
5000
1500
950
1300
Другим способом включения подзапроса во фразу where оператора select
является использование фразы exists. Эта фраза позволяет вам проверить на-
104
Глава 4
личие (существование) строк в результате подзапроса. Ее логическим
отрицанием является фраза not exists. Когда вы специфицируете во фразе where
операцию exists, необходимо включить подзапрос, удовлетворяющий
операции exists. Если подзапрос возвращает данные, результатом операции
exists будет TRUE и в родительский запрос будет возвращена запись. В
противном случае операция exists возвращает FALSE, а в родительский запрос
не будет возвращено никакой записи. Давайте рассмотрим пример, в котором
мы собираемся получить тот же листинг служащих, работающих в офисе в
Нью-Йорке, но на этот раз хотим использовать операцию exists:
ШИЖШЯ& SQL> select e.ename, e.job, e.sal
2 from erap e
3 where exists
4 ( select d.deptno
5 from dept d
6 where d.loc = 'NEW YORK'
7 and d.deptno = e.deptno);
ENAME JOB SAL
CLARK MANAGER 2450
KING PRESIDENT 5000
MILLER CLERK 1300
Обратите внимание на один весьма интересный момент, связанный с этим
примером о подзапросах. И в родительском запросе, и в подзапросе мы
использовали псевдонимы таблиц для создания так называемого коррелированного
подзапроса. Oracle выполняет коррелированный подзапрос в тех случаях, когда
подзапрос ссылается на столбец из таблицы, на которую имеется ссылка в
родительском запросе. Коррелированные подзапросы используются для того,
чтобы воздействовать на построчную (строка за строкой) обработку. Каждый
подзапрос выполняется один раз для каждой строки, созданной внешним
запросом. Эта методика позволяет нам "перепрыгивать" от подзапроса на
уровень родительского запроса, чтобы выполнять невероятно сложную, почти
алогичную обработку, для понимания которой нам придется обсудить одну
концепцию программирования, которая называется областью действия
переменных (variable scope).
Понятие области действия переменной относится к доступности или
"видимости" (viewability) данных в определенные моменты времени. Иногда
переменная имеет локальную область действия. Это означает, что переменная
бывает "видна" только в то время, когда выполняется текущий блок кода. Можно
считать, что столбцы в операторах сравнения подзапроса являются
переменными, чья область действия локальна по отношению к запросу. Кроме того,
имеется и глобальная область действия. В дополнение к переменной, имеющей
локальную область действия внутри того подзапроса, в котором они появляются,
переменная имеет также глобальную область действия, это означает, что она
будет доступна и во всех подзапросах этого запроса. В предыдущем примере все
переменные или столбцы, упомянутые в операторах сравнения самой ближней
внешней операции select, являются локальными для этой операции и
глобальными по отношению ко всем вложенным подзапросам.
Совет Мы с вами рассмотрели всего два примера, но вам необходимо
знать, что подзапросы могут быть вложены внутрь других подзапросов на
удивление глубоко —разрешено иметь до 255 подзапросов, вложенных в один
оператор select/ Подзапросы являются предметом большого числа
вопросов ОСР, так что, прежде чем решиться сдавать экзамен, вы должны быть
уверены, что у вас хватит опыта, чтобы писать такие запросы, и что вы
полностью усвоили материалы обсуждения подзапросов из этой книги!
В подзапросах можно использовать много различных типов функций.
Вообще говоря, все функции, которые разрешены в родительских запросах,
разрешены и в подзапросах. Например, получение списка служащих компании,
получающих минимальную зарплату, обычно представляет пусть и не
слишком большую, но все-таки проблему, особенно в том случае, если размер этой
минимальной зарплаты неизвестен. Эту проблему можно разрешить, если в
Подзапросы
105
подзапросе использовать для получения заранее неизвестного значения
групповую функцию, а затем использовать родительский запрос для поиска в
таблице ЕМР всех сотрудников, получающих такую зарплату. Ниже приведен
реализующий эту задачу запрос:
CSS&if&S SQL> select empno, ename, sal
2 from emp
3 where sal ■» (select min(sal) from emp);
EMPNO ENAME SAL
7369 SMITH 800
Закрепление пройденного материала
1. Необходимо знать, что такое подзапрос и когда можно вставить подзапрос
в оператор select.
2. Будьте уверены, что вы сможете идентифицировать и привести примеры
того, как пишутся подзапросы, связанные со своими родительскими
запросами с помощью сравнений по равенству, а также сравнений in и
exists.
Упражнения
1. В компании имеется приложение с двумя таблицами для расчета затрат на
содержание служащих. В одной таблице, которая называется ЕМР,
содержатся все данные о сотрудниках. В другой, носящей имя EXPENSE,
размещены оправдательные документы на расходы каждого служащего
компании. Какой из следующих запросов получит идентификаторы (ID) и
фамилии всех служащих, чьи расходы превышают их жалованье?
A.select e.empno, e.ename from emp e where e.sal <
(select sum(x.vouch_amt) from expense x) and
x.empno = e.empno;
B. select e.empno, e.ename from emp e where e.sal <
(select x.vouch_amt from expense x where x.empno =
e.empno);
С select e.empno, e.ename from emp e where sal <
(select sum(x.vouch_amt) from expense x where
x.empno = e.empno);
Deselect e.empno, e.ename from emp e where exists
(select sum(x.vouch_amt) from expense x where
x.empno = e.empno);
2. Взгляните на следующий оператор:
SQL> select ename
2 from emp
3 where empno in
4 ( select empno
5 from expense
6 where vouch_amt > 10000 );
Какой из следующих вариантов ответа определяет оператор SQL,
способный создавать те же выходные данные, что и в предыдущем примере, но с
помощью оператора exists?
A.select e.ename from emp e where exists (select
x.empno from expense x where x.vouch_amt > 10000)
and x.empno = e.empno;
B.select e.ename from emp e where exists (select
x.empno from expense x where x.vouch_amt > 10000
and x.empno = e.empno);
106
Глава 4
С select e.ename from emp e where x.empno = e.empno
and exists (select ix.empno from expense x where
x.vouch_amt > 10000);
D.select e.ename from emp e, expense x where x.empno
= e.empno and x.vouch_amt 10000 and exists
(select x.empno from expense x where x.vouch_amt >
10000);
3. Чтобы перепрыгивать с уровня на уровень во вложенных подзапросах,
часто оказывается полезной доступность данных из родительских запросов.
Поэтому про переменные из родительского запроса говорят, что они
имеют область применения.
Ответы
1. С. 2. В. 3. глобальную
Перечень различных типов подзапросов
и их запись
В следующем списке указано несколько различных типов подзапросов,
которые нужно понимать (и уметь ими пользоваться) для сдачи экзамена ОСР:
■ Однострочные подзапросы Главный запрос ожидает, что подзапрос
возвратит ему только одно значение.
■ Многострочные подзапросы Главный запрос способен обработать
ситуацию, когда подзапрос возвратит более одного значения.
■ Встроенные представления Подзапрос во фразе from, используемый для
определения набора с промежуточными результатами, относительно
которого будет сделан главный запрос. Эти типы подзапросов будут обсуждены
далее в этой главе.
■ Многостолбцовые подзапросы Подзапрос, который помимо того, что его
выход может содержать несколько строк, содержит более одного столбца
возвращаемых данных. Эти типы запросов также будут обсуждены далее в
этой главе.
Написание однострочных подзапросов
Посмотрите на следующий пример, который должен выглядеть для вас
знакомым:
гааиаивз SQL> select ename, deptno, sal
2 from emp
3 where deptno =
4 ( select deptno
5 from dept
6 where loc = 'NEW YORK' ) ;
ENAME DEPTNO SAL
CLARK 10 2450
KING 10 5000
MILLER 10 1300
Верите вы или нет, но это пример однострочного подзапроса. Вы спросите,
почему? Дело в том, что, хотя результирующий набор выходных данных и
содержит несколько (точнее, три) строк из таблицы ЕМР, подзапрос к таблице
DEPT, используемый для получения выходных данных из таблицы ЕМР, воз-4
вращает только одну строку с данными. Если вы не поверили этому
объяснению, проверьте работу следующего блока кода и убедитесь сами:
*$Р8ЯШ SQL> select deptno
2 from dept
3 where loc - 'NEW YORK';
Подзапросы
107
DEPTNO
10
Действительно, этот запрос возвращает только один столбец и одну строку
с данными. Иногда однострочные подзапросы называют скалярными
подзапросами. Основное различие между подзапросами, способными справиться с
одним значением, и подзапросами, которые могут "выдать на-гора"
несколько значений, связано с операторами сравнения, используемыми для связи
родительского запроса с подзапросом. Обратите внимание, что в нашей
ситуации мы использовали знак равенства. Следовательно, можно сформулировать
следующее простое правило: если подзапрос присоединяется к родительскому
запросу оператором сравнения по равенству, родительский запрос
рассчитывает получить из подзапроса только одну строку данных. Поэтому подзапросы,
присоединенные к родительским запросам с помощью операций сравнения по
равенству, являются однострочными подзапросами.
Совет К числу других операций сравнения, которые указывают на
однострочные подзапросы, относятся операции <, >, <=, > и О.
Написание многострочных подзапросов
Посмотрим, что произойдет, если родительский запрос получает больше
информации, чем рассчитывал:
«■амгадв SQL> select епапе, job, sal
2 from emp
3 where deptno ~
4 (select deptno
5 from dept
6 where dname In ('ACCOUNTING', 'SALES'));
(select deptno
*
ERROR at line 4:
OBA-01427: single-row subquery returns more than one row
(однострочный подзапрос возвращает Солее одной строки)
Для разрешения возникающей в этом примере проблемы необходимо
преобразовать однострочный подзапрос в многострочный. Вы спросите: как это
сделать? Для этого достаточно преобразовать сравнение по равенству,
связывающее подзапрос с родительским запросом, в операцию сравнения, которая
может обработать и несколько строк выходных данных, переданных из
подзапроса, например в операцию in (как это сделано в следующем примере):
«тщании SQL> select ename, job, sal
2 from emp
3 where deptno in
4 (select deptno
5 from dept
6 where dname in ('ACCOUNTING', 'SALES'));
ENAME
ALLEN
WARD
MARTIN
BLAKE
CLARK
KING
TURNER
JAMES
MILLER
JOB
SALESMAN
SALESMAN
SALESMAN
MANAGER
MANAGER
PRESIDENT
SALESMAN
CLERK
CLERK
SAL
1600
1250
1250
2850
2450
5000
1500
950
1300
Фраза having и подзапросы
Во фразе having также могут использоваться подзапросы. Скажем, вы снова
хотите проверить средние зарплаты сотрудников компании в разбивке по
отделам и названиям должностей. Но на этот раз вы желаете получить только те
отделы и названия должностей, для которых средняя зарплата выше, чем та
108
Глава 4
сумма, которую компания выплачивает сотруднику отдела продаж по
фамилии MARTIN. Все бы хорошо, но возникает одна маленькая проблема: мы не
помним, сколько денег получает MARTIN. Нам известно, что в ситуациях,
когда какая-то величина нам неизвестна, но мы знаем, как ее можно
получить, часто оказываются полезны подзапросы. В следующем примере мы
рассмотрим, как можно использовать подзапросы с фразой having:
SQL> select deptno, job, avg(sal)
2 from emp
3 group by deptno, job
4 having avg(sal) >
5 (select sal
6 from emp
7 where ename - 'MARTIN');
'DEPTNO
10
10
10
20
20
30
30
JOB
CLERK
MANAGER
PRESIDENT
ANALYST
MANAGER
MANAGER
SALESMAN
AVG(SAL)
1300
2450
5000
3000
2975
2850
1400
Совет Фраза order by может быть использована в запросах,
использующих подзапросы, но эта фраза должна встречаться только в самом внешнем
запросе. Определить фразу order by в подзапросе нельзя.
Oracle9/
н более поздних
версий
Фраза with и подзапросы
Иногда сложным запросам может понадобиться обрабатывать один и тот же
подзапрос несколько раз, по одному разу для каждой строки, полученной из
главного запроса. Такая ситуация служит причиной возникновения у Oracle
большого объема непроизводительных расходов по обработке, что может
значительно снизить возможности базы данных быстро предоставлять
запрошенные результаты. Вместо принудительной повторяющейся обработки
подзапроса Огас1е9/ предлагает воспользоваться фразой with, позволяющей
факторизовать подзапрос, присвоить ему имя, а затем многократно ссылаться
на это имя в основном запросе. Эта методика позволяет оптимизатору
выбирать, как ему распорядиться результатами подзапроса. Оптимизатор может
выбрать одну из следующих возможностей: создать временную таблицу и
выполнять запрос к этой таблице (о временных таблицах мы поговорим в главе 5)
или переписать запрос, используя методику встроенных представлений (inline
views), речь о которых пойдет уже в этой главе. К примеру, следующий запрос
соединяет две таблицы и излишне вычисляет агрегированную сумму
заработных плат, создавая тем самым дополнительные непроизводительные издержки
производительности на получение списка сумм заработных плат для
подразделений, составляющего более 1/3 годового бюджета заработной платы
компании. Полужирным шрифтом выделены повторяющиеся части запроса:
SQL>
2
3
4
5
6
7
в
select dnama, aum(aal) as dept total
from amp, dept
vhara amp.daptno ■> dept.deptno
group by dnama having sum(sal) >
(select aum(aal)*l/3
from amp, dapt
vhara amp.daptno ■> dept.deptno)
order by sum(sal) desc;
DNAME DEPTJTOTAL
RESEARCH
10875
Можно повысить производительность этого запроса, если предоставить
Огас1е9г возможность выполнять подзапрос только один раз, а затем просто
ссылаться на него в нужных местах главного запроса. В следующем блоке кода
предлагается более подходящая идея для выполнения той работы, которую
Подзапросы
109
должна сделать Oracle для получения требуемого результата. В этом блоке
полужирным шрифтом выделена общая часть подзапроса, которая будет
выполнена только один раз, и те места в главном запросе, где имеются ссьшки на
подзапрос:
SQL> with summary as
2 (salact dnama, aum(aal) aa dapt_total
3 from asp, dapt
A vhara amp.daptno - dapt.daptno
5 group by dnama)
6 select dname, dept_total
7 from aummary
8 where dept_total >
9 (select sum(dept_tatal) * 1/3
10 from aummaxy)
11 order by dept_total desc;
DNAME DEPT TOTAL
RESEARCH 10875
Закрепление пройденного материала
1. Необходимо знать, что существуют четыре различных типа подзапросов.
Кроме того, следует быть уверенным, что вы можете писать однострочные
и многострочные подзапросы и понимать примеры на эту тему.
8. Необходимо знать, что происходит, когда родительский запрос,
ожидающий, что подзапрос возвратит ему только одну строку, получит из
подзапроса более одной строки.
3. Необходимо знать, что можно заменить операторы проверки по равенству
или другие однострочные операции сравнения оператором in, чтобы
позволить родительскому запросу поддерживать обработку нескольких
возвращенных строк.
4. Необходимо понимать, что использование фразы with сводит к минимуму
избыточные действия при определении выполняемых подзапросом шагов.
Упражнения
1. Используйте для ответа на вопрос следующий блок кода:
SQL> select deptno, job, avg(sal)
2 from emp
3 group by deptno, job
4 having avg(sal) >
5 ( select sal
6 from emp
7 where ename = 'MARTIN');
Как называется использованный в предыдущем операторе тип подзапроса:
A. Однострочный подзапрос
B. Многострочный подзапрос
С Подзапрос с фразой from
D. Многостолбцовый запрос
8. В базе продаж компании имеются две таблицы. В первой из них, PROFITS,
хранятся размеры прибыли по продуктам, проданным различными
региональными отделениями корпорации в различные кварталы. Во второй
таблице, REGIONS, хранится информация о названии каждого
регионального подразделения, адрес штаб-квартиры корпорации в этом регионе, а
также фамилия регионального вице-президента корпорации. С помощью
какого из следующих запросов можно узнать размер полной прибыли,
полученной от продажи игрушек в регионах, возглавляемых
вице-президентами SMITHERS, FUJIMORI и LAKKARAJU7
110
Глава 4
A.select sum(profit) from profits where region in
(select region from regions where reg_head in
('SMITHERS', 'FUJIMORI', 'LAKKARAJU')) and product
= 'TOYS ' ;
B. select sum(profit) from profits where region in
(select region from regions where reg_head in
('SMITHERS', 'FUJIMORI1, 'LAKKARAJU') and product
= 'TOYS');
C.select sum(profit) from profits where region =
(select region from regions where reg_head in
('SMITHERS', 'FUJIMORI', 'LAKKARAJU')) and product
= 'TOYS';
D.select sum(profit) from profits where region in
(select region from regions where reg_head =
('SMITHERS', 'FUJIMORI', 'LAKKARAJU')) and product
= 'TOYS';
3. Назовите оператор, используемый для преобразования однострочных
подзапросов, возвращающих более одной строки, в подзапросы, способные
обрабатывать несколько строк, возвращаемых в главный запрос:
4. Следующий блок кода представляет собой запрос с подзапросом:
SQL> select dname, avg(sal) as dept_avg
2 from emp, dept
3 where emp.deptno = dept.deptno
4 group by dname having avg(sal) >
5 (select avg(sal) * 1/4
6 from emp, dept
7 where emp.deptno » dept.deptno)
8 order by avg(sal);
В каком из следующих вариантов указана фраза, которая может помочь
переопределить запрос с целью устранения избыточного выполнения
групповых функций в подзапросе и в главном запросе?
A. group by В. order by
C. with D. having
Ответы
1. A. 2. A. 3. In. 4. С
Написание многостолбцовых подзапросов
Обратите внимание, что во всех предыдущих примерах независимо от того,
возвращает подзапрос одну или несколько строк, каждая из этих строк
содержит только один столбец с данными для сравнения на уровне главного
запроса. Однако можно создать главный запрос, способный обрабатывать в каждой
возвращенной строке _по нескольку столбцов. Давайте рассмотрим пример,
показывающий, как можно использовать многостолбцовые подзапросы.
Допустим, мы желаем найти самого высокооплачиваемого сотрудника в каждом
отделе. Чтобы увидеть, как можно выполнить эту задачу, изучите следующий
блок кода:
1ВДДДШЬ SQL> select deptno, ename, job, sal
2 from emp
3 where (deptno, sal) in
4 (select deptno, max(sal)
5 from emp
6 group by deptno);
DEPTNO ENAME JOB SAL
10 KING PRESIDENT 5000
Подзапросы
111
20 SCOTT ANALYST 3000
20 FORD ANALYST 3000
30 BLAKE MANAGER 2850
Необходимо сделать пару полезных замечаний по поводу многострочных
подзапросов и их синтаксиса. Для многостолбцовых запросов (точнее, только для
них) следует заключать запрошенный из главного запроса список столбцов в
скобки; если это не будет сделано, запрос завершится сообщением об ошибке
"invalid relational operator" (недопустимый реляционный оператор). Кроме того,
ссылки на столбцы во фразе главного запроса where и в подзапросе должны
совпадать позиционно — другими словами, если в главном запросе столбец
DEPTNO упомянут первым, он должен быть отобран первым и в подзапросе.
Закрепление пройденного материала
Будьте уверены, что понимаете синтаксис и семантику многостолбцовых
подзапросов.
Упражнения
1. База данных международных легкоатлетических соревнований состоит из
одной таблицы, которая называется ATHLETES и содержит фамилию
участника соревнования, его возраст и представляемую им страну. Какой из
приведенных ниже запросов можно использовать для определения самого
молодого атлета для каждой страны?
A.select name, country, age from athletes where
(country, age) in (select min(age), country from
athletes group by country);
B. select name, country, age from athletes where
(country, age) in (select country, min(age) from
athletes) group by country;
С select name, country, age from athletes where age
in (select country, min(age) from athletes group by
country);
D. select name, country, age from athletes where
(country, age) in (select country, min(age) from
athletes gxoup by country);
8. Вы разрабатываете многостолбцовый подзапрос к базе данных Oracle.
Какое из следующих высказываний относительно содержащих
многостолбцовые подзапросы операторов SQL является верным?
A. Родительский запрос должен содержать подзапрос с одним столбцом.
B. Порядок столбцов, упоминаемых во фразе where, должен совпадать с
порядком столбцов в подзапросе.
С Родительский запрос должен использовать встроенные представления,
а иначе запрос придется переписывать.
О.Ддя получения правильного результата родительский запрос должен
содержать выражение group by.
Ответы
1. D. 2. В. -
Значение NULL и подзапросы
Если вы собираетесь продолжать работать с собственной таблицей ЕМР,
построенной с помощью сценария demobld. sql, то для нормального
протекания следующего урока вам придется выполнить следующий оператор:
112
Глава 4
SQL> update emp set deptno ™ null where ename » 'KING';
1 row updated.
Совет Об операторах update вы узнаете из главы 6.
Теперь изучим следующий блок кода, в котором мы повторно выполняем
многостолбцовый подзапрос из предыдущего примера:
SQL>
2
3
4
5
б
select deptno.
from emp
where (deptno.
(select depti
from emp
ename.
sal) in
no, max(
group by deptno);
■ DEPTNO ENAME
JOB
job,
i
Isal)
sa
SAL
1
10 CLARK MANAGER 2450
20 SCOTT ANALYST 3000
20 FORD ANALYST 3000
30 BLAKE MANAGER 2850
Обратили ли вы внимание на то, что из выходных данных кое-что пропало?
Хотя служащий KING по-прежнему присутствует в таблице ЕМР, его больше нет
в списке наиболее высокооплачиваемых сотрудников его отдела. Это странно,
особенно если мы взглянем на выходные данные подзапроса нашего примера:
DEPTNO HAX(SAL)
10 2450
20 3000
30 2850
5000
Можно заметить, что KING был перечислен как наиболее
высокооплачиваемый в его отделе. Но обратите внимание, что номер отдела при этом оказался
установленным в NULL. Если вы считаете, что проблема состоит в том, чтобы
что-то сделать с тем, как подзапросы обрабатывают значения NULL, то вы
абсолютно правы. К сожалению, подзапросы возвращают в родительский запрос
только значения не-NULL. Поэтому мы не видим служащего KING среди
выходных данных этого главного запроса. Чтобы быть уверенными в том, что наши
запросы не теряют значений NULL, следует переписать их таким образом, чтобы
в них не использовались выражения group by. Этого можно добиться, используя
коррелированный подзапрос, что и демонстрирует следующий блок кода:
SQL> select e.deptno, e.ename, e.job, e.sal
2 from emp e
3 whe
re e.sal
4 (select maxi
-
[e2.sal)
5 from emp e2
6* where nvl(e.deptno,99)
DEPTNO
30
10
20
20
ENAME
BLAKE
CLARK
SCOTT
KING
FORD
JOB
MANAGER
MANAGER
ANALYST
PRESIDENT
ANALYST
- nvl(e2.deptno,99));
SAL
2850
2450
3000
5000
3000
Заметили что-нибудь интересное в этом запросе? Использование в
подзапросе функции nvl ( ) позволяет заменить для записи KING NULL на 99. Это
некоторое произвольное значение, которое было выбрано просто потому, что
оно не используется как номер отдела. Вам, наверное, интересно, почему в
столбце DEPTNO выходных данных для служащего KING не отображается
значение 99. Дело в том, что на самом деле подзапрос не возвращает в
родительский запрос значение DEPTNO — возвращается только максимальное
значение заработной платы для этого отдела! Функцию nvl ( ) мы использовали
только в подзапросе, чтобы у нас не было значений NULL при сравнении в
подзапросе E.DEPTNO и E2.DEPTNO. Поскольку номер отдела для записи
KING по-прежнему остается NULL, именно это значение и отображается в
родительском запросе.
Подзапросы
113
Совет При написании запросов с использованием подзапросов следует
помнить, что некоторые операции, например group by, могут возвращать
знамения NULL и что подзапросы игнорируют эти значения (NULL), когда они
возвращают значения в главный запрос. Если оке вам необходимо включить в
выходные данные и эти "несуществующие " значения, вам следует
поэкспериментировать с переписыванием запроса другими способами.
В заключение
После того как закончите свои эксперименты, не забудьте отказаться от
сделанных в записи KING таблицы ЕМР изменений:
SQL> rollback;
Rollback complete.
Закрепление пройденного материала
Вы должны понимать, что некоторые операции, например group by, могут
генерировать значения'NULL, которые подзапросы в процессе возврата
результирующего набора данных в основной запрос игнорируют. Умейте переписать
подзапрос, если вам необходимо обрабатывать и значения NULL.
Упражнения
1. Это значение по умолчанию игнорируется подзапросами:
Используйте для ответа на приведенный ниже вопрос выходные данные
следующего блока кода:
SQL> select e.deptno, e.ename, e.job, e.sal
2 from emp e
3 where e.sal -
4 (select max(e2.sal)
5 from emp e2
6* where nvl(e.deptno,99) - nvl(e2.deptno,99));
DEPTNO ENAME JOB SAL
30
10
20
20
BLAKE
CLARK
SCOTT
KING
FORD
MANAGER
MANAGER
ANALYST
PRESIDENT
ANALYST
2850
2450
3000
5000
3000
С помощью какого из следующих запросов можно вывести в столбце
DEPTNO приведенного выше выходного набора данных значение 99?
A.select nvl(e.deptno,99), e.ename, e.job, e.sal from
emp e where (e.deptno, e.sal) = (select max(e2.sal)
from emp e2 where nvl(e.deptno,99) =
nvl(e2.deptno,99));
B.select nvl(e.deptno,99), e.ename, e.job, e.sal from
emp e where e.sal = (select max(e2.sal) from emp e2
where nvl(e.deptno,99) = nvl(e2.deptno,99));
C.select nvl(e.deptno,99), e.ename, e.job, e.sal from
emp e where (e.deptno, e.sal) = (select e2.deptno,
max(e2.sal) from emp e2 where nvl(e.deptno,99) =
nvl(e2.deptno,99));
D.select nvl(e.deptno,99), e.ename, e.job, e.sal from
emp e where (e.deptno, e.sal) = (select e2.deptno,
max(e2.sal) from emp e2 where nvl(e.deptno,99) =
nvl(e2.deptn о,9 9) group by e2.deptno);
Ответы
1. NULL. 2. B.
114
Глава 4
Подзапросы во фразе from
Если вы собираетесь продолжать работать с собственной таблицей ЕМР,
построенной с помощью сценария demobld. sql, то для нормального
выполнения следующего урока вам придется выполнить следующий оператор:
*ШЖШ& SQL> update emp get deptno - null where ename - 'KING';
1 row updated.
Совет Об операторах update вы узнаете в главе 6.
Подзапросы можно включать и во фразу from запроса. Написание
подзапросов во фразе from главного запроса может оказаться удобным и
легкодоступным способом собрать промежуточный набор данных, который главный запрос
для своих собственных целей доступа к запросу будет трактовать как таблицу.
Такие подзапросы во фразе from главного запроса называются встроенными
представлениями. Текст запроса для встроенного представления также должен
быть заключен в круглые скобки и ему назначается некоторая метка, с
помощью которой впоследствии можно будет обращаться к столбцам встроенного
представления. Подзапрос может быть оператором select, использующим
соединения и фразы group by или order by. В следующем блоке кода приведен
очень простой пример использования встроенных представлений, приводящего
к тем же результатам, что и обычное соединение таблиц. В этом примере
заключенному в круглые скобки запросу назначается псевдоним SUBQ. В SUBQ
содержится встроенное представление, отображающее информацию об отделах,
находящихся в Нью-Йорке и в Далласе. Главный запрос затем использует эту
информацию для определения сотрудников, работающих в этих городах:
*жиа»« SQL> select е.ename, subq.loc '
2 from emp e,
3 ( select deptno, loc
4 from dept
5 where loc in ('NEW YORK', 'DALLAS')) subq
6 where e.deptno - subq.deptno;
ENAME LOC
SMITH DALLAS
JONES DALLAS
CLARK NEW YORK
SCOTT DALLAS
ADAMS DALLAS
FORD DALLAS
MILLER NEW YORK
Совет В некоторых случаях упомянутые во встроенном представлении
столбцы могут вызывать однострочные или групповые функции. Это
разрешено, но если вы собираетесь обращаться к таким столбцам во фразе
where главного запроса, вам потребуется, помимо предоставления
псевдонима для всей таблицы во встроенном представлении, задать псевдонимы во
встроенном представлении и для них.
Встроенные представления и запросы "первые N"
Запросы типа "первые N" используют встроенные представления и весьма
удобны для отображения коротких списков данных их таблиц на основании
критериев типа "самые большие" или "самые маленькие". Предположим, что
в этом году прибыль нашей компании была особенно высокой, и мы желаем
составить список из трех сотрудников нашей компании с самой низкой
заработной платой, чтобы рассмотреть вопрос о ее повышении. Как раз для таких
целей и бывает полезен запрос типа "первые N". Рассмотрим запрос типа
"первые N", удовлетворяющий этому бизнес-сценарию:
В№ШЭД SQL> select ename, job, sal, rownum
2 from (select ename, job, sal from emp
3 order by sal)
4 where rownum <-3;
Подзапросы
115
ENAME JOB SAL ROWNUM
SMITH CLERK 800 1
JAMES CLERK 950 2
ADAMS CLERK 1100 3
Для экзамена ОСР следует знать две важные вещи о запросах "первые N".
Во-первых, их обычно используют во встроенных представлениях для
просмотра всех данных в отсортированном виде. Во-вторых, в этих запросах
используется ROWNUM — виртуальный столбец, определяющий номер строки в
таблице, чтобы с его помощью определить число строк, которые мы должны
вернуть как выходные данные. Наоборот, если вследствие плохих результатов
работы компании за истекший год мы вынуждены сократить заработную плату
сотрудникам, нам достаточно, как это показано ниже, просто поменять в
нашем встроенном представлении порядок сортировки на обратный, и мы
получим список самых высокооплачиваемых сотрудников компании, которым мы
и собираемся урезать зарплату:
ffP^fff SQL> select ename, job, sal, rownum
2 froqi (select ename, job, sal from emp
3 order by sal desc)
4 where rowium <»3;
ENAME JOB SAL ROWNUM
KING PRESIDENT 5000 1
SCOTT ANALYST 3000 2
FORD ANALYST 3000 3
Совет Встроенные представления поддерживают использование фразы
order by. Однако они являются единственным типом представлений в
Oracle, где эта фраза разрешена. Другие типы представлений, речь о
которых пойдет в главе 7, не поддерживают использование фразы order by.
В заключение
После того как вы закончите свои эксперименты, не забудьте отказаться от
сделанных в записи KING таблицы ЕМР изменений:
«еагаишг SQL> rollback;
Rollback complete.
Закрепление пройденного материала
1. Вы должны понимать синтаксис и семантику встроенных представлений.
Помните, что встроенные представления являются единственными
представлениями Oracle, поддерживающими использование фразы order by.
2. Помните, что такое запросы типа "первые N" и как для их создания
используются встроенные представления. Кроме того, убедитесь, что понимаете
использование в этих типах запросов столбца ROWNUM.
Упражнения
1. Имя псевдостолбца, часто используемого для получения информации для
запросов типа "первые N":
2. База данных продаж вашей компании состоит из одной таблицы PROFITS,
в которой хранятся прибыли в разбивке по названию продукта,
географическим регионам и кварталам финансового года компании. Если вам
требуется получить список пяти продуктов, которые лучше других
продавались за всю историю компании, то каким оператором SQL лучше всего для
этого воспользоваться?
A.select p.prod_name, p.profit from (select
prod_name, profit from profits order by profit
desc) where rownum <=5;
Т16
Глава 4
В. select p.prod_name, p.profit from (select
prod_name, sum(profit) from profits group by
prod_name order by sum(profit) desc) subq where
p.prod_name = subq.prod_name;
C.select prod_name, profit from (select prod_name,
sum(profit) from profits group by prod_name order
by sum(profit) desc) where rownum <=5;
D.select prod_name, profit from (select prod_name,
sum(profit) from profits order by sum(profit) desc)
where rownum <=5;
Ответы
1. ROWNUM. 2.
С.
продуктов прибыли
Помните,
что необходимо учесть
определяются один раз в квартал.
тот
факт,
что для одинаковых
Формирование удобочитаемых выходных
данных в SQL* Plus
В этом разделе мы рассмотрим следующие вопросы, связанные с
использованием переменных в исполнительном периоде:
■ Ввод переменных
■ Настройка сред SQL*Plus
■ Формирование удобочитаемых выходных данных
■ Создание и выполнение сценариев
■ Сохранение настроек
SQL*Plus является мощным инструментом, который можно использовать
для ввода команд в интерактивном режиме, что неоднократно
демонстрировалось на протяжении всей книги, или использовать его в "молчаливом" режиме
для пакетной обработки и генерации отчетов. Именно на этой теме мы
сосредоточим наше внимание в следующем разделе. А в этом разделе мы научимся
вводить переменные в операторы SQL*Plus непосредственно во время их
выполнения, настраивать нашу рабочую среду, формировать удобочитаемые
выходные данные, создавать и выполнять сценарии и сохранять созданные нами
настройки среды.
Совет В любой момент своей работы в SQL*Plus вы можете ввести
команду help KOMaHda_SQLPLUS, и SQL*Plus предоставит вам подробную
информацию об использовании этой команды.
Ввод переменных
Для того чтобы подготовиться к экзамену ОСР, вы должны потратить
немного дополнительного времени на эту тему, а затем рассматривать
остальные материалы этого раздела как исходные данные, фундамент для
справочных материалов. Следовательно, если вы уже хотя бы немного работали
с SQL, вам потребуется меньше времени на подготовку к экзамену ОСР.
Предположим, для того чтобы проанализировать некоторые аспекты
относящихся к служащим данных, вы желаете вручную выбрать данные для
нескольких различных служащих. Следующий пример показывает, как мы
могли это делать до сих пор:
1&&ЯЯЯ& SQL> select ename, job, deptno, sal
2 from emp
3 where empno - 784 4;
Подзапросы
117
ENAME JOB DEPTNO SAL
TURNER SALESMAN 30 1500
Скажем, теперь вы желаете получить эти же данные для служащего KING,
идентификационный номер которого равен 7839. Вы уже знаете, как
редактировать команды SQL в SQL*Plus и как повторно запускать их на выполнение,
используя для этого команду слеш (/). Вы можете редактировать оператор SQL
с помощью одной из команд change или edit, чтобы изменить информацию
столбца EMPNO, а затем повторно запустить команду. Однако, чего уж там
скрывать, вам придется проделать довольно большой объем работы с
клавиатурой и мышью, и эту работу никак нельзя назвать интересной. Сначала вы
должны открыть редактор текстов, затем найти тот текст, который собираетесь
редактировать, модифицировать его и, наконец, запомнить его в буфере
SQL*Plus. Только после этого можно будет еще раз запустить команду на
выполнение. Существует более легкий способ. Взгляните на следующий блок
кода:
f^SWWS SQL> select ename, job, deptno, sal
2 from emp
3 where empno - Aempno;
Enter value for empno: 7844
old 3: where empno e fiempno
new 3: where empno » 7844
ENAME JOB DEPTNO SAL
TURNER SALESMAN . 30 1500
Все, что вы должны теперь сделать, это выдать команду слеш, а затем
вводить новый номер служащего всякий раз, когда желаете посмотреть
информацию из таблицы ЕМР, как это показано ниже:
tasaesBK» SQL> /
Enter value for empno: 7839
old 3: where empno - iempno
new 3: where empno - 7839
ENAME JOB DEPTNO SAL
KING PRESIDENT 10 5000
Эту процедуру можно повторять столько раз, сколько вам потребуется, до
тех пор, пока вы не введете новый оператор SQL, что очень удобно, когда
необходимо многократно выполнять повторяющиеся операции SQL. Обратите
внимание на две важные вещи, касающиеся этих выходных данных.
Во-первых, это касается амперсанда (&), предшествующего ссылке на переменную
EMPNO во фразе where. Этот амперсанд указывает Oracle, что перед тем, как
Oracle обработает запрос, вы желаете определить значение этого столбца.
Комбинация амперсанда и идентификатора столбца создает лексическую
подстановочную переменную. Во-вторых, Oracle показывает вам строку в том
виде, как она присутствует в буфере, а затем демонстрирует подставленное
вами значение. Такая "презентация" позволяет вам быть в курсе, какие
данные были изменены посредством ввода.
Совет В Oracle также можно для определения в SQL *Plus переменных
величин использовать двойной амперсанд (&&). Ключевое слово && имеет
перед & преимущество, которое заключается в том, что при использовании
&& после первого сделанного вами определения переменной сохраняется
введенное вами значение, в то время как & предлагает вам вводить новое
значение при каждом выполнении оператора.
Если вы не желаете использовать для создания подстановочной
переменной символ амперсанда, в строке приглашения SQL в SQL*Plus ввод может
быть изменен с помощью команды set define. Вы можете заново выполнить
оператор, содержащий определение переменной в исполнительном периоде,
используя команду слеш (/) в строке приглашения SQL*Plus. Это
иллюстрируется следующим блоком кода:
118
Глава 4
*вяшкт sQL> set define question
SQL> select ename, job, deptno, sal
2 from emp
3 where empno ™ ?empno;
Enter value for empno: 7839
old 3: where empno = ?empno
new 3: where empno - 7839
ENAME JOB DEPTNO SAL
KING PRESIDENT 10 5000
SQL> /
Enter value for empno: 7844
old 3: where empno - ?empno
new 3: where empno - 7844
ENAME JOB DEPTNO SAL
TURNER SALESMAN 30 1500
Теперь, во избежание неприятностей вернемся к значениям по умолчанию:
ШШШ SQL> set define i
Совет Дополнительную информацию о команде set define можно найти
в обсуждении "Настройка сред SQL*Plus", которое мы проведем в этой
главе позже.
Немного по-другому производится определение лексической
подстановочной переменной, обрабатывающей текстовую информацию. Поскольку
текстовая информация должна появляться в SQL-запросах в Oracle в одинарных
кавычках, лексическая подстановочная переменная также должна быть
определена с помощью одинарных кавычек. Кроме того, не забывайте, что Oracle
, хранит текстовую информацию "литерно", то есть точно в том же виде, как
она была набрана в момент первичного ее ввода в Oracle, поэтому обращайте
пристальное внимание на такие вопросы, как пробелы между словами и тому
подобное. Следующий блок кода служит иллюстрацией того, как можно
создать лексическую подстановочную переменную для текстовых данных:
1Ш№ЙЛ SQL> select empno, deptno, sal
2 from emp
3 where ename - 'fiempname';
Enter value for empname: SMITH
old 3: where ename » 'fiempname'
new 3: where ename - 'SMITH'
EMPNO DEPTNO SAL
7369 20 800
И наконец, при создании лексической подстановочной переменной,
принимающей значение даты, она должна быть заключена в одинарные кавычки.
Вводимые данные должны соответствовать какой-нибудь маске формата
данных, используемой Oracle для отображения данных. В следующем блоке кода
вы увидите, как определить, какая маска формата используется, и как
правильно ввести ее в лексическую подстановочную переменную:
WHffihiM SQL> select ename, job, sal
2 from emp where hiredate - 'istartdate';
Enter value for startdate: 23-JAN-82
old 2: from emp where hiredate - 'fistartdate'
new 2: from emp where hiredate - '23-JAN-82'
ENAME JOB SAL
MILLER CLERK 1300
SQL> /
Enter value for startdate: 23-jan-82
old 2: from emp where hiredate - '(startdate'
new 2: from emp where hiredate - '23-jan-82'
ENAME JOB SAL
MILLER CLERK 1300
Подзапросы
119
Автоматическое определение переменных исполнительного
периода
В некоторых случаях может оказаться не слишком полезно вводить новые
значения переменных исполнительного периода при каждом очередном
выполнении оператора. Например, вам необходимо один раз в неделю выполнять
некоторый обременительный процесс генерации отчета по каждому
служащему компании. Процесс значительно упростится, если удастся для него создать
переменную, значение которой можно будет определять непосредственно во
время его выполнения, потому что в таком случае вы сможете просто снова и
снова выполнять один и тот же оператор, изменяя только значение
переменной EMPNO. Однако даже такое усовершенствование не доводит наш процесс
до желательного уровня совершенства. Вместо того чтобы раз за разом
выполнять оператор с определяемыми при прогоне новыми значениями, можно
создать сценарий, аналогичный следующему:
-- empinfo.sql -
— Этот сценарий выбирает информацию
— из ЕМР и возвращает ее
— пользователю
define var_empno - 7844
select ename, job, deptno, aal
from emp
where empno - &var_empno;
undefine var_empno
define var_empno =■ 7839
select ename, job, deptno, sal
from emp
where empno - Svar_empno;
Совет Вы с наибольшей пользой потратите время на подготовку к
экзамену ОСР, если будете учиться на предлагаемых вам примерах. Поэтому не
поленитесь потратить немного времени на ручное кодирование
предлагаемых примеров сценариев и их тестирование на своей системе. Чем больше
будет у вас опыта, тем лучше вы сдадите экзамен. Хроме того, если вы не
желаете использовать команду set define, чтобы в дальнейшем
использовать вопросительный знак для отождествления подстановочных
переменных, просто замените каждое вхождение символа ? на &.
Когда вы используете команду @ для выполнения сценария в SQL*Plus,
формируются следующие выходные данные:
WffiWMK SQL> @c:\windows\empinfo
old 3: where empno = fivar_empno
new 3: where empno - 7844
ENAME JOB DEPTNO SAL
TURNER SALESMAN 30 1500
old 3: where empno - &var_empno
new 3: where empno - 7839
ENAME JOB DEPTNO SAL
KING PRESIDENT 10 5000
Совет Команда @@ также может быть использована для выполнения
сценариев в SQL *Plus в тех случаях, когда сценарий вызывается на выполнение
из другого сценария. При использовании команды @@ SQL*Plus пытается
найти указанный сценарий в том оке каталоге, где был обнаружен
выполняющийся в настоящее время сценарий.
При использовании оператора define удается сэкономить время,
которое ранее расходовалось на ввод значений переменных, указанных в
SQL-операторе select. Однако заметьте, что перед каждым выполнением
оператора SQL встречается особый оператор, использующий команду
undefine. Это связано с тем, что в Oracle данные, определенные с помощью
команды define, остаются определенными (то есть переменная сохраняет
свое значение) до конца сеанса, когда переменная становится неопределен-
120
Глава 4
ной. Делая переменную неопределенной, вы тем самым позволяете с помощью
другого оператора define повторно использовать переменную при еще
одном выполнении того же самого или другого оператора.
Совет Команду define можно использовать и в тех случаях, когда вы
желаете повторно использовать подстановочные переменные в различных
операторах SQL, что позволяет передавать значения из одного оператора в другой.
Еще один способ определения переменных:
команда accept
Вы уже могли заметить, что методы, используемые Oracle для идентификации
. ввода, хотя и не совсем конспиративные, но абсолютно невыразительные. Вам
совершенно не обязательно ограничиваться для идентификации вводимых
данных принятыми в Oracle по умолчанию сообщениями. Вместо этого можно
самим определять более выразительные тексты сообщений, которые будут
использоваться Oracle при вводе данных как подсказки/приглашения.
Предлагающая эту функциональность команда называется accept. Изучите
следующий блок кода, в котором приводится незначительная модификация сценария
empinfo.sql, использующая команду accept:
— empinfo2.sql -
— Этот сценарий выбирает информацию
— из ЕМР и возвращает ее пользователю
accept var_empno prompt 'Enter EMFNO now -> '
select ename, job, deptno, sal
from emp
where empno - Svar_empno;
Совет Вы с наибольшей пользой потратите время на подготовку к экзамену
ОСР, если будете учиться на предлагаемых вам примерах. Поэтому не
поленитесь потратить немного времени на ручное кодирование предлагаемых
примеров сценариев и их тестирование в своей системе. Чем больше у вас
будет опыта, тем лучше вы сдадите экзамен. Кроме того, обратите внимание
на использование двух идущих подряд символов минус (—) в нескольких первых
строчках этого блока кода. Эти символы означают комментарий.
После этого мы можем следующим образом запустить наш сценарий:
1ШШШЯ SQL> @с: Windows \empinfo2
Enter EMPNO now - 7844
■old 3: where empno - &var_empno
new 3: where empno » 7844
ENAME JOB DEPTNO SAL
TURNER SALESMAN 30 1500
Использование команды accept часто может оказаться более
предпочтительным, чем использование применяемых Oracle по умолчанию сообщений,
особенно в ситуациях, когда необходимо более точно или более конкретно
определить подсказку либо когда вы желаете, чтобы при определении данных
отображался более длинный и содержательный текст.
Совет По умолчанию типом данных для переменной, определяемой с
помощью команды accept, считается CHAR. Ксчастъю, Огас1еумеет
преобразовывать неявные типы данных из CHAR в типы данных, требующиеся для
входной переменной, так что проблем, как правило, не возникает. К тому
оке тип данных может быть указан в команде accept явно.
Закрепление пройденного материала
1. Необходимо помнить, какой специальный символ используется для
определения лексической подстановочной переменной (это амперсанд).
Подзапросы
121
8. Необходимо уметь использовать команду accept и знать, в чем
заключаются преимущества ее применения.
3. Убедитесь, что можете рассказать, как во время сеанса SQL*Plus
можно определять переменные, используя для этого команды define
и undefine.
4. Помните, что два идущих подряд символа минус (--) указывают
SQL*Plus, что остальной текст в этой строке является комментарием.
Упражнения
1. Ваша база данных продаж состоит из одной таблицы PROFITS, в которой
содержатся данные о прибылях по каждому проданному компанией типу
продукции в разбивке по кварталам и географическим регионам. Вам
необходимо разработать отчет, который пользователи будут запускать
интерактивно, чтобы увидеть прибыли от продажи игрушек (toys) в данном
квартале. Вы знаете, что пользователи неоднократно выражали недовольство по
поводу удобочитаемости и удобства использования отчетов. Какой из
приведенных ниже вариантов сценария следует использовать в отчете, чтобы
покончить с упреками пользователей?
A.select profit from profits
where prod_type = 'TOYS'
and time_period = '&v_period';
B.define v_period
select profit from profits
where prod_type = 'TOYS'
and time_period = '&v_period';
С accept v_period prompt 'Enter the time period => '
select profit from profits
where prod_type = 'TOYS'
and time_period = '&v_period';
D. accept v_period
select profit from profits
where prod_type = 'TOYS'
and timejperiod = '&v_period';
2. Изучите следующий блок кода, в котором воспроизводится содержание
сценария, называющегося dates. sql:
accept v_hiredate prompt 'enter hire date -> '
select empno, ename, job
from emp
where trunc(hiredate) - trunc('Sv_hiredate*);
Какой из перечисленных ниже аспектов сценария следует изменить, чтобы
он заработал надлежащим образом?
A. Переменную vhiredate следует изменить, чтобы она могла
принимать информацию типа DATE.
B. Следует удалить из запроса функцию trunc ( ).
С Фраза prompt в команде accept является необязательной.
D. Ничего, сценарий и так работает правильно.
3. Назовите строку, которая должна предшествовать лексическим
подстановочным переменным, если мы желаем, чтобы их значения сохранялись
в промежутке между выполнениями оператора:
122
Глава 4
Ответы
1.С. Помните, что одной из поставленных перед нами целей является удовлетворение
желаний пользователей. 2. А. 3. && ,
Настройка сред SQL* Plus
Операционную среду SQL*Plus можно настраивать с помощью команд set
системкая_перемеккая значение, где системная_переменная — это ИМЯ
системной переменной, которую можно установить в SQL*Plus, а значение —
это то значение, которое вы хотели бы ей присвоить. В ходе этого обсуждения
мы коснемся нескольких общеупотребительных системных переменных и их
допустимых значений. Каждый из заголовков подтемы содержит полное
название системной переменной, за которым в квадратных скобках ([]) следует
ее сокращенное наименование, а за ним в фигурных скобках ({}) указываются
допустимые значения переменной.
Замечание В первую очередь этот раздел предлагается для справочных
целей и для подготовки к экзамену ОСР. Примеры использования команд не
предлагаются, но мы предполагаем, что вы будете самостоятельно
практиковаться в использовании каждой из команд. Убедившись в том, что список
предлагаемых нами команд весьма обширен, вы можете для нужд экзамена
ОСР ограничиться изучением команд arraysize, colsep, feedback,
HEADING, LINESIZE, LONG, PAGESIZE, PAUSE U TERMOUT, а остальные
команды использовать как справочный материал.
ARRAYSIZE [ARRAY] {15|п} Эта команда устанавливает число строк,
одновременно выбираемых SQL*Plus из базы данных. Допустимые значения
лежат в диапазоне от 1 до 5000. Высокие значения этой переменной увеличивают
производительность запросов и подзапросов, которые могут выбирать по
многу строк, но для ее работы требуется больше памяти.
AUTOCOMMIT [AUTO] {OFF|ON|IMMEDIATE|n} Эта команда управляет
фиксацией сделанных изменений в базе данных Oracle. При установке
переменной в ON изменения фиксируются в базе данных после успешного
завершения каждой команды изменения данных или блока PL/SQL. Значение OFF
подавляет автоматическую фиксацию сделанных изменений, так что
пользователь должен выдавать команды commit вручную. Значение immediate
работает точно так же, как и опция ON. Задание конкретного значения п указывает
на то, что изменения будут фиксироваться в базе данных Oracle после
выполнения л успешных команд изменения данных или блоков PL/SQL, где л не
может быть отрицательным или превосходить 2000000000.
AUTOTRACE [AUTOT] {OFFjONfrRACEONLY|EXPLAIN|STATISTICS} Эта
команда выводит отчет о выполнении успешно завершенных операторов SQL.
В отчет может включаться статистика выполнения и выполняемая ветвь
запроса. При задании значения off отчет о трассировке не выводится. Если задано
значение ON, будет выведен отчет о трассировке. При задании traceonly будет
выведен только отчет о трассировке безданных запроса, если таковые имеются.
Прежде чем использовать команду autotrace, необходимо выполнить
сценарий plustrce.sql, хранящийся в каталоге sqlplus/admin ниже домашнего
каталога с программным обеспечением Oracle. Опции explain и statistics
можно использовать для настройки производительности, а также для показа
планов выполнения и статистики операторов SQL, полученных с помощью
стоимостного оптимизатора соответственно.
CMDSEP [CMDS] {;|c|OFF|ON} Эта команда устанавливает не
буквенно-цифровой символ, который будет использоваться для разделения
нескольких команд SQL*Plus, введенных в одной строке. После выполнения команды
он становится равным с. Значения on и off управляют возможностью ввода в
одной строке нескольких команд; при указании значения ON
символ-разделитель команд автоматически устанавливается равным точке с запятой (;).
Подзапросы
123
COLSEP [COLSEP] {|текст} Эта команда устанавливает текст, который
будет печататься между выбранными столбцами. Если переменная colsep
содержит пробелы или знаки пунктуации, ее следует заключить в одинарные
кавычки. Значением по умолчанию для этой переменной является одиночный
пробел. При выводе строк, которые на экране или устройстве печати не
умещаются в одной строке выходного устройства, разделитель столбцов между
столбцами, начинающимися на различных строках, не печатается.
COMPATABILITY [COM] {V7|Y8|NATTVE} Эта команда определяет номер
версии экземпляра Oracle, к которому вы в текущий момент подключены. Для
Огас1е7 или Oracle8 (Oracle8i) следует установить переменную compatibility
на V7 или V8. Если вы желаете, чтобы база данных сама определяла эту
установку, установите эту переменную на NATIVE (например, в том случае, если
вы подключены к Огас1е8 или Oracle8i, значением переменной compatabili-
ty по умолчанию будет V8). При неверной установке этой переменной вы не
сможете выполнить ни одной команды SQL. Однако, если вы подключены к
Oracle8i, переменная compatibility может иметь значение V7. Это
позволяет эксплуатировать SQL Oracle7 в среде Oracle8i.
CONCAT [CON] {.|c|OFF|ON} С помощью этой команды устанавливается
параметр, который можно использовать для завершения ссылки на
подстановочную переменную, если вам нужно сразу же после нее записать символ,
который Oracle в противном случае воспримет как часть имени подстановочной
переменной. При включении (ON) переменной concat SQL*Plus
автоматически устанавливает ее значение равным точке (.).
COPYCOMMIT [COPYC] {0|n} Эта команда управляет количеством
групп, после достижения которого команда сору фиксирует изменения в базе
данных. Команда сору фиксирует строки в целевой базе данных каждый раз
после того, как она скопирует п групп строк. Допустимые значения — от 0 до
5000. Размер группы может быть установлен с помощью переменной array-
size. Если вы установите copycommit равным 0, команда copycommit будет
выполнять операцию commit только после окончательного завершения
операции копирования.
COPYTYPECHECK [COPYTYPECHECK] {OFF|ON} Включает или
выключает подавление сравнения типов данных при вставке данных (insert) или
добавлении данных в конец таблицы (append) с помощью команды сору.
Команда предназначена для облегчения копирования данных в DB2, когда
необходимо, чтобы данные типа CHAR копировались в тип данных DATE
РСУБД DB2.
DESCRIBE [DESCRIBE] DEPTH {I|n[ALL} LINENUM {0N|OFF} INDENT
{ON|OFF} Эта команда устанавливает глубину уровня, до которого можно
рекурсивно описывать объект. Допустимые значения фразы depth находятся в
диапазоне от 1 до 50. Если вы зададите команду set describe depth ALL,
глубина рекурсии будет установлена равной 50, то есть максимально
возможному значению. Кроме того, можно отображать номера строк и включать и
выключать отступы в именах атрибутов или столбцов, если объект содержит
несколько типов объектов. Для управления общей шириной выводимых
данных следует использовать команду set linesize.
ECHO [ECHO] {OFF|ON} Контролирует, будут ли после запуска
командного файла (команда start) отображаться входящие в него команды в случае
их успешного завершения. При задании ON команды выводятся, а при задании
off вывод команд подавляется.
EDIT/FILE [EDITF] {имя_файла[.расш]} Этой командой устанавливается
имя используемого по умолчанию текстового редактора. Можно указать
полный путь к файлу и (или) его расширение. Для получения информации об
изменении значения по умолчанию для расширения имени файла используйте
переменную suffix этой команды. Используемое по умолчанию имя файла и
124
Глава 4
максимальная длина этого имени зависят от используемой операционной
системы.
EMBEDDED [EMB] {OFF|ON} Управляет размещением отчетов на
странице. При задании значения off каждый отчет будет в принудительном порядке
начинаться с новой страницы. В случае указания значения ON отчет может
начинаться с любого места страницы. Если вы желаете, чтобы печать отчета
начиналась сразу же после окончания печати предыдущего, установите значение
переменной embedded равным ON.
ESCAPE [ESC] {\|c|OFF|ON} С помощью этой команды определяется
символ, вводимый вами как символ начала управляющей последовательности.
Значение off отменяет использование символа начала управляющей
последовательности. Значение on снова разрешает использование символа начала
управляющей последовательности. Кроме того, указание on также изменяет
значение символа начала управляющей последовательности с ранее
указанного символа (с) обратно на значение по умолчанию (\). Можно использовать
символ начала управляющей последовательности перед символом
подстановки (установленным с помощью команды set define) для указания того, что
SQL*Plus должно трактовать символ подстановки как обычный символ, а не
как запрос на использование подстановочной переменной.
FEEDBACK [FEED] {6|n|OFF|ON} Эта команда показывает, сколько
записей будет возвращено запросом, если отобрано по крайней мере п записей.
Указание ON или off включает или отключает такой показ. Установка
значения переменной обратной связи на on эквивалентна установке и на 1.
Установка значения переменной обратной связи на 0 эквивалентна ее отключению
(OFF).
FLAGGER [FLAGGER] {OFF]ENTRY|E4TERMEDIATE|FULL} Эта команда
выполняет проверку для обеспечения уверенности, что оператор SQL
соответствует стандарту ANSI/ISO SQL92. Если в операторе встречаются любые
нестандартные конструкции, сервер Oracle помечает их как ошибочные и
отображает синтаксис оператора-"нарушителя". Эта команда является аналогом
команды SQL alter session set flagger. Можно выполнить команду set
flagger даже в том случае, если вы не подключены к базе данных. Действие
маркировки ошибочных операторов для сеанса SQL*Plus будет продолжаться
до тех пор, пока не будет (успешно) выполнена команда set flagger OFF
(или ее аналог — alter Session set flagger = off) или пока вы не
выйдете из SQL*Plus.
FLUSH [FLU] {OFF|ON} Управляет моментом посылки выходных данных
на устройство вывода пользователя. Значение off позволяет операционной
системе хост-машины буферизовать выходные данные. Значение ON отменяет
буферизацию. Используйте значение off только в том случае, когда у вас в
неинтерактивном режиме выполняется командный файл. Использование
команды flush off может повысить производительность за счет уменьшения
количества операций ввода/вывода программы.
HEADING [HEA] {OFF|ON} Эта команда в отчетах управляет печатью
заголовков столбцов. При задании значения on заголовки столбцов будут
печататься; указание значения off приводит к отключению печати заголовков.
Выполнение команды set heading off не влияет на ширину отображаемых
столбцов; подавляется только печать заголовков столбцов.
HEADSEP [HEADS] {||c|OFF|ON} Определяет символ, который вы
указываете в качестве разделителя столбцов. Символ-разделитель столбцов не
может быть буквенно-цифровым или пробелом. Указание ON или off включает
или выключает разделение столбцов. Если разделение столбцов отключено
(OFF), SQL*Plus печатает символ-разделитель столбцов точно так же, как и
все другие символы. Задание ON изменяет ранее использовавшееся значение
символа-разделителя (с) на значение по умолчанию (|).
Подзапросы
125
INSTANCE [путь_к_э1аемпляру|ЬОСА1/] Эта команда изменяет
установленный по умолчанию путь к экземпляру для вашего сеанса на
специфицированный в команде путь к экземпляру. Использование этой команды не
приводит к подключению к базе данных. Если экземпляр не специфицирован явно,
для выполнения команд используется экземпляр по умолчанию. Любая
команда, предшествующая первому использованию этой команды, вынуждает
SQL*Plus связываться с экземпляром по умолчанию.
LINESIZE [LIN] {80|п} Устанавливает общее количество символов,
выводимое SQL*Plus на одной строке, прежде чем начать новую строку. Можно
устанавливать line size в диапазоне от 1 до максимальной величины,
определяемой возможностями операционной системы.
LOBOFFSET [LOBOF] {п|1} Эта команда устанавливает точку отсчета,
начиная с которой выбираются и отображаются данные из так называемых
больших объектов (LOB).
LONG [LONG] {80|n} Устанавливает максимальную ширину (в байтах) для
отображения значений LONG, CLOB и NCLOB, а также и для копирования
значений LONG. Максимальное значение л равно 2 Гбайт.
LONGCHUNKSIZE [LONGC] {801п} Эта команда устанавливает размер (в
байтах) приращений, выделяемых SQL*Plus при выборке значений LONG,
CLOB или NCLOB.
NEWPAGE [NEWP] {I|n|NONE} Устанавливает число пустых строк,
которые будут выведены между началом страницы и первым заголовком. При
задании значения 0 в начало каждой новой страницы помещается управляющий
символ "перевод страницы" (в том числе и для ^первой страницы) и (для
большинства терминалов) производится очистка экрана. Если вы установите
переменную newpage в NONE, SQL*Plus не будет печатать пустую строку или
переходить на новую страницу при смене страниц отчета.
NULL [NULL] {текст} Эта команда задает текст, который будет использован
для представления значений NULL в результатах работы команды select.
NUMFORMAT [NUMF] {формат} Устанавливает формат, используемый
для представления чисел по умолчанию. Введите вместо формата поля
числовой формат.
NUMWIDTH [NUM] {10|п} Эта команда устанавливает ширину поля для
представления чисел по умолчанию.
Совет Подробная информация о форматировании чисел как выходных
данных SQL *Plus будет изложена в следующем обсуждении.
PAGESIZE [PAGES] {24|n} Устанавливает число строк на странице.
Можно установить pagesize равным 0 и тем самым подавить печать всех шапок,
переходы на новую страницу (разрывов страницы), а также печать заголовков,
пустых строк в начале страницы и прочей форматирующей информации.
PAUSE [PAU] {OFF|ON|TeKCT} Эта команда позволяет вам контролировать
скроллинг вашего терминала при прогоне отчетов. Значение on вынуждает
SQL*Plus делать паузу в начале каждой страницы выходных данных отчета.
Для прекращения паузы достаточно нажать на Enter. Если указана опция
PAUSE текст, этот текст SQL*Plus будет выводить при каждой паузе. Если
текст состоит из нескольких слов, его нужно заключить в одинарные кавычки.
Можно также встроить в команду PAUSE зависящие от типа терминала
управляющие последовательности. Эти последовательности позволяют вам
создавать негативные видеосообщения или другие эффекты на терминалах,
поддерживающих подобные характеристики.
RECSEP [RECSEP] {WRAPPED|EACH|OFF} Указывает SQL*Plus, куда
следует вставлять символ разделения записей. К примеру, если установить
recsep равным WRAPPED, SQL*Plus будет выводить символ-разделитель
записей только после окончания занимающей несколько строк записи. Если же за-
126
Глава 4
дать для recsep значение EACH, SQL*Plus будет выводить разделитель
записей после каждой строки. Если задать recsep равным off, SQL*Plus вообще не
будет печатать разделители записей.
RECSEPCHAR [RECSEPCHAR] {|с} Эта команда выводит на экран или
печатает разделитель записей. Разделитель записей — это одна строка,
заполненная символом-разделителем записей (recsepchar), повторенным
linesize раз. Команда recsepchar определяет символ-разделитель записей.
Значение по умолчанию — пробел.
SERVEROUTPUT [SERVEROUT] {OFF|ON} SIZE {N} Управляет тем,
будут ли в SQL*Plus выводиться на экран выходные данные вызовов процедуры
dbms_output .put_line ( ) из блоков PL/SQL или нет. Значение OFF
подавляет этот вывод; при задании ON выходные данные отображаются на экране.
Фраза size устанавливает количество байтов выходных данных, которые
могут быть буферизованы в Огас1е8/. Значение л по умолчанию равно 2000 и не
может быть менее 2000 или более 100 0000. Эта команда может обрабатывать и
другие значения типа wrapped, truncated и format, но эти функциональные
возможности, скорее всего, не станут одной из тем экзамена ОСР.
SHIFTINOUT [SHIFT] {VISIBLE]|INVISIBLE]} Эта команда позволяет
корректно выполнять выравнивание для терминалов, отображающих символ
смены регистров (shift). Команда set shiftinout оказывается полезной
для терминалов, которые вместе с данными отображают и символы смены
регистров (например, для терминалов IBM 3270). Эту команду можно
использовать только для чувствительных к смене регистров наборов символов
(например, JA16DBCS). Используйте значение visible для терминалов,
отображающих символ смены регистров (например, пробелом или цветом).
При указании значения invisible, которое является противоположностью
visible, никакие символы смены регистров не отображаются.
SHOWMODE [SHOW] {OFF|ON} Контролирует, будет ли SQL'Plus
показывать старые и новые значения установок системных переменных SQL*Plus
при их изменении с помощью команды set. При задании ON установки будут
показаны; off подавляет их показ.
SQLBLANKLINES [SQLBL] {ON|OFF} В SQL'Plus эта команда управляет
возможностью включения в оператор SQL пустых строк. При задании
значения ON пустые строки и символы новой строки интерпретируются как часть
команды SQL. Значение же по умолчанию (off) запрещает использование в
командах SQL пустых строк и символов новой строки. Когда встречаются
символы завершения оператора SQL или блока PL/SQL, SQL*Plus
возвращается к поведению по умолчанию.
SQLCASE [SQLC] {MKED|LOWER|UPPER} Непосредственно перед
выполнением конвертирует регистр команд SQL и блоков PL/SQL. Все входящие
в состав команды текстовые последовательности, включая "закавыченные"
литеры и идентификаторы, SQL*Plus конвертирует следующим образом:
■ В верхний регистр, если sqlcase равно upper
■ В нижний регистр, если sqlcase равно lower
Ш Оставляет без изменения, если sqlcase равно mixed
Совет Ключевое слово sqlcase не изменяет содержимого буфера SQL.
SQLCONTINUE [SQLCO] {|текст} Эта команда устанавливает
последовательность символов, которую SQL*Plus отображает как строку приглашения
после того, как вы продолжаете ввод команды SQL или блока PL/SQL на
дополнительной строке, используя для этого символ переноса (-).
SQLNUMBER [SQLN] {OFFJON} Устанавливает символ приглашения для
второй и последующих строк команды SQL или блоков PL/SQL. ON
устанавливает приглашение равным номеру строки, off устанавливает приглашение
равным значению переменной sqlprompt.
Подзапросы
127
SQLPREFLX [SQLPRE] {#|c} Команда устанавливает символ префикса
SQL*Plus. В то время как вы вводите команду SQL*Plus или блок PL/SQL, вы
имеете возможность на отдельной строке ввести команду SQL*Plus, перед
которой набирается символ префикса SQL*Plus. SQL*Plus немедленно выполнит
эту команду, не влияя на вводимые команду или блок PL/SQL.
Символ-префикс не должен быть буквенно-цифропым.
SQLPROMPT [SQLP] {SQLjreKCT} Устанавливает вид подсказки для
команд SQL*Plus.
SQLTERMINATOR [SQLT] {;|c|OFF|ON} Эта команда устанавливает
символ, используемый для завершения и выполнения команд SQL, равным с. off
означает, что SQL*Plus не распознает символа-завершителя команды и вы
должны будете завершить команду SQL вводом пустой строки, on возвращает
символу-завершителю его значение по умолчанию — точку с запятой (;).
SUFFIX [SUF] {SQLj-гекст} Устанавливает значение по умолчанию для
расширения имен файлов, которое используется SQL*Plus в командах, связанных
с командными файлами. Значение suffix не управляет расширениями для
файлов спулинга.
TAB [TAB] {OPTION} Эта команда определяет, как SQL*Plus форматирует
символы-разделители в выходных данных терминала. OFF использует для
форматирования разделителей пробелы, в то время как on использует для этой
цели символ tab (табуляцию). Этот символ создает промежутки между
данными путем вставки восьми символов пробела. Значение по умолчанию для
символа tab зависит от используемой системы.
TERMOUT [TERM] {OFF10N} Контролирует отображение выходных
данных, генерируемых командами, выполняющимися из командного файла, off
подавляет их отображение, так что вы можете откачивать выходные данные из
командного файла таким образом, чтобы они не были показаны на экране.
При задании значения ON выходные данные выводятся на экран. Установка
termout OFF не влияет на показ выходных данных команд, введенных в
интерактивном режиме.
TIME [П] {OFT|ON} Эта команда управляет выводом текущего времени.
При задании значения ON текущее время выводится на экран перед
приглашением к вводу каждой команды, off подавляет вывод текущего времени.
TIMING [TIMI] {OFF|ON} Управляет выводом статистики временных
интервалов, on задает вывод временной статистики для каждой выполненной
команды SQL или блока PL/SQL. OFF подавляет хронометраж каждой
команды.
TRIMOUT [TRIM] {OPTION} Эта команда определяет, будет ли SQL'Plus
разрешать использование хвостовых пробелов в конце каждой выводимой
строки. Задание on позволяет удалять пробелы в конце каждой строки, что
повышает производительность системы, особенно если вы обращаетесь к
SQL*Plus с медленного коммуникационного устройства. При задании off
SQL*Plus получает возможность выводить хвостовые пробелы. Установка
trimout в ON не влияет на вывод данных в файл спулинга.
TRIMSPOOL [TRIMS] {ON|OFF} Эта команда определяет, будет ли
SQL*Plus разрешать использование хвостовых пробелов в конце каждой
выводимой в файл спулинга строки. Задание on позволяет удалять пробелы п конце
каждой строки. При задании off SQL*P1us получает возможность включать
хвостовые пробелы. Установка trimspool в ON не влияет на вывод данных на
терминал.
VERIFY [VER] {OFF|ON} Эта команда управляет тем, будет ли SQL*Plus
выводить текст оператора SQL или блока PL/SQL до и после того, как SQL*Plus
выполнит замену подстановочных переменных их значениями. ON — текст
печатается; off подавляет печать.
128
Глава 4
Совет В большинстве случаев, если вам требуется узнать значение,
установленное для конкретного атрибута SQL*Plus, вы можете
воспользоваться командой show с указанием имени атрибута. Например, чтобы выяснить,
чему в данный момент равна длина строки (linesize), используйте команду
Show linesize.
Закрепление пройденного материала
Убедитесь, что знаете, как, используя команду set, настраивать среду
исполнительного периода SQL*Plus, в том числе как использовать такие системные
переменные, как pagesize,linesize,termout,feedback,sqlprompt и echo.
Упражнения
1. С помощью этой команды SQL*Plus можно добиться вывода сообщения
следующего содержания "N rows selected": .
S. Эта команда SQL*Plus помогает определить, какое расширение SQL*Plus
ожидает увидеть у файлов, содержащих команды SQL:
3. Для использования этой команды необходимо, чтобы сначала был
выполнен сценарий plustrce. sql:
Ответы
1. feedback 2. suffix 3. autorace
Формирование удобочитаемых
выходных данных
Имеются некоторые команды для улучшения вида выходных данных SQL*Plus.
Объяснение работы этих команд приводится в последующих подтемах. Если для
команды имеется аббревиатура, она будет приведена в квадратных скобках ([]). В
фигурных скобках ({}) приводятся допустимые значения для этой команды.
COLUMN {столб} FORMAT {форм} HEADING {строка} Наиболее часто
употребляемой командой для придания читабельности выходным данным
SQL*Plus за счет управления форматом столбца выходных данных является
команда column col, где col — это имя столбца в SQL-запросе. Включать и
выключать форматирование столбца можно, указывая column col on или
column col off соответственно. Можно обнулить (очистить) любую установку,
выдав команду column col clear. Можно изменить используемый для
столбца заголовок, используя фразу heading 'string1. Помимо этого, можно
уточнить формат выходных данных, появляющихся в этом столбце, используя
для этого фразу format fmt. Для появляющейся в столбце
буквенно-цифровой информации fmt епецифицируется как anum, где num является числом,
указывающим, какой должна быть ширина столбца выходных данных. Для
чисел fmt задается как последовательность, состоящая из цифр 9,
представляющих число цифр в столбце с (возможно) включенными валютными символами
(L для локальной (местной) валюты), запятыми и (или) точками. Например, в
результате применения команды column sal format $9, 999. 99 все числа в
столбце запроса будут отображаться следующим образом:
ИИМШШ SQL> column sal format $9,999.99
SQL> select sal from emp;
SAL
$800.00
$1,600.00
$1,250.00
92,975.00
$1,250.00
$2,850.00
$2,450.00
$3,000.00
$5,000.00
Подзапросы
129
$1,500.00
$1,100.00
$950.00
$3,000.00
$1,300.00
UNDERLINE {UND] {-|c|ON|OFF} Эта команда устанавливает символ,
используемый для подчеркивания заголовков столбцов SQL*Plus, в с. Заметьте,
что с не может быть буквенно-цифровым символом или символом пробела,
табуляции или пустой строки, on и off включают и выключают
подчеркивание соответственно. К тому же ON возвращает значение с к значению по
умолчанию (-). Если мы желаем использовать для подчеркивания заголовков
символ звездочки, это можно сделать следующим образом:
И?Д*ЯЕ81 SQL> column erapno format 99999
SQL> column ename format al2
SQL> get underline *
SQL> select empno, ename, sal
2 from emp;
EMPNO ENAME SAL
******* ********* *********
7369 SMITH $800.00
7499 ALLEN $1,600.00
7521 WARD $1,250.00
7566 JONES $2,975.00
7654 MARTIN $1,250.00
76S8 BLAKE $2,850.00
7782 CLARK $2,450.00
7788 SCOTT $3,000.00
7839 KING $5,000.00
7844 TURNER $1,500.00
7876 ADAMS $1,100.00
7900 JAMES $950.00
7902 FORD $3,000.00
7934 MILLER $1,300.00
WRAP [WRA] {OFF|ON| В строке заголовка, определенной в команде
column, может присутствовать символ конвейера (|). К примеру, задание column
dname heading 'd|name' означает, что вы желаете разбить заголовок столбца
на две отдельные строки. В некоторых случаях, когда таким образом
форматируются выходные данные столбца, значения столбца могут не уместиться в
отведенном столбцу пространстве. Переменная переноса управляет тем, будет
ли SQL'Plus обрезать на выходе отобранные строки, если они чересчур
длинны для текущей ширины столбца. Значение OFF обрезает отобранные
(selected) строки, ON делает возможным перенос выбранной строки на
следующую строку выходного файла. Если вы желаете, можно также
специфицировать recsep и recsepchar, чтобы печатать разделители между
строками с автоматическим переносом слов и тем самым сделать выходные
данные более понятными. Взгляните на пример:
SQL> column dname heading dI name format a4
ияввиив SQL> set recsep wrapped
SQL> set recsepchar '-'
SQL select * from dept;
d
DEPTNO name LOC
10 ACCO NEW YORK
UNTI
NG
20 RESE
ARCH
30 SALE CHICAGO
S
40 OPER BOSTON
ATIO
NS
130
Глава 4
BREAK Иногда, если информация, возвращаемая SQL-запросом,
упорядочена по столбцу, в отчете может'появиться много строк, имеющих одинаковые
значения для того столбца, по которому производилось упорядочение. Можно
изменить выходные данные таким образом, чтобы повторяющееся значение
выводилось только для первой строки из всей совокупности строк с
повторяющимся значением. Как это выполняется, можно понять, понаблюдав за
работой следующего блока кода, в котором используется команда break:
fWWBfS SQL break on deptno
SQL select deptno, ename from emp
2 order by deptno;
DEPTNO
10
20
30
ENAME
CLARK
KING
MILLER
SMITH
ADAMS
FORD
SCOTT
JONES
ALLEN
BLAKE
MARTIN
JAMES
TURNER
WARD
Совет В команде break можно использовать фразы skip n и skip page
для вставки п пустых строк или перехода на новую страницу
соответственно.
COMPUTE Используя команду compute в сочетании с командой break, в
SQL*Plus можно генерировать простые отчеты. Команда compute выполняет
одну или несколько групповых функций для того столбца, по значениям
которого производится разбивка, в том числе функции sum, minimum, maximum,
avg (среднее значение), std (стандартное отклонение), variance, count и
number (число строк в столбце). В следующем блоке кода показаны примеры
использования команд compute и break:
SQL> — пример 1
SQL> break on deptno skip 1
SQL> compute sum of sal on deptno
SQL> select deptno, ename, sal
2 from emp order by deptno;
DEPTNO
10
********
sum
sum
20
30
********
sum
SQL>
SQL>
ENAME
CLARK
KING
MILLER
SMITH
ADAMS
FORD
SCOTT
JONES
ALLEN
BLAKE
MARTIN
JAMES
TURNER
HARD
— пример 2
clear
breaks
breaks cleared
SQL>
clear
computes
SAL
2450
5000
1300
8750
800
1100
3000
3000
2975
10875
1600
2850
1250
950
1500
1250
S400
Подзапросы
131
computes cleared
SQL> break on report
SQL> compute sum of sal on report
SQL> /
DEPTNO
10
10
10
20
20
20
20
20
30
30
30
30
30
sum
ENAME
CLARK
KING
MILLER
SMITH
ADAMS
FORD
SCOTT
JONES
ALLEN
BLAKE
MARTIN
JAMES
TURNER
SAL
2450
5000
1300
800
1100
3000
3000
2975
1600
2850
1250
950
1500
29025
TTITLE и ВТПЪЕ Об использовании команд break и compute речь пойдет
и позже, в процессе широкого обсуждения вопросов применения SQL*Plus
для написания отчетов. Если на каждой странице отчета вам нужны
колонтитулы — верхний и (или) нижний — их можно разместить там с помощью
команд ttitle и btitle соответственно. Синтаксис этих команд имеет
следующий вид: [btitle[ttitle] положение 'текст^колонтитула', где
положение может принимать следующие значения: left, center, right или
col л, что означает отступ на фиксированное число символов от начала
строки колонтитула.
Сопет Использование переменных linesize и pagesize для определения
ширины страницы и того, сколько строк текста может появиться на
странице, будет также определять позиции на странице, куда команды
btitle и ttitle поместят строки, содержащие верхний и нижний
колонтитулы соответственно.
Закрепление пройденного материала
Попрактикуйтесь в написании отчетов средствами SQL*Plus с
использованием команд, упомянутых в этом и предыдущем обсуждениях.
Упражнения
1. Эта команда SQL*Plus может быть использована для вычисления сумм
данных по столбцам аналогично групповым функциям:
2. Эта команда SQL* Plus может быть использована для повышения
удобочитаемости отчетов благодаря уменьшению количества повторений одного и
того же значения в сортируемом столбце:
3. Эта команда SQL*Plus может быть использована для помещения
колонтитула в нижней части страницы:
Ответы
1. compute 2. break 3. btitle
Создание и выполнение сценариев
Всякий раз, когда в SQL*Plus выполняется оператор SQL, этот оператор
сохраняется в буфере, используемом SQL*Plus для повторных вычислений. Если
имеются операторы SQL, которые вы регулярно выполняете в SQL*Plus, то
самое полезное, что вы можете сделать, это сохранить такие операторы, как
сценарии. Это можно сделать несколькими различными способами, один из ко-
132
Глава 4
торых заключается в том, чтобы просто открыть имеющийся на вашей машине
текстовый редактор, ввести те операторы, которые собираетесь регулярно
выполнять, и сохранить сценарий на вашей хост-машине как открытый
(незашифрованный) файл. Другой метод, которым можно воспользоваться,
находясь в SQL*Plus, это использовать команду save с расширением .sql,
например, следующим образом:
6QL> select erapno.
2 from
EMPNO
7369
7499
7521
7566
7654
7698
7782
7788
7839
7644
7876
7900
7902
7934
SQL> save
emp;
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
employee
ename, sal,
sql
Created file employee.
SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
sql
dept
no,
DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10
hiredate
HIREDATE
17-DEC-80
20-FEB-81
22-FEB-81
02-APR-81
28-SEP-81
01-MAY-81
09-JUN-81
19-APR-87
17-NOV-81
08-SEP-81
'23-MAY-87
03-DEC-81
03-DEC-81
23-JAN-82
Вы уже видели: если необходимо еще раз выполнить сценарий, можно
выполнить в SQL*Plus команду @. Посмотрим еще раз, что при этом получится:
SQL> Uemployee.sql
SQL> Uemployee.sql
EMPNO ENAME SAL DEPTNO HIREDATE
7369
7499
7521
7566
7654
7698
7782
77B8
7839
7844
7876
7900
7902
7934
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
20
30
30
20
30
30
10
20
10
30
20
30
20
10
17-DEC-80
20-FEB-81
22-FEB-81
02-APR-81
28-SEP-81
01-MAY-81
09-JUN-81
19-APR-87
17-NOV-81
08-SEP-81
23-MAY-87
03-DEC-81
03-DEC-81
23-JAN-82
Закрепление пройденного материала
■ Убедитесь, что помните, какие команды используются для сохранения и
выполнения сценариев в SQL*Plus.
Упражнения
1. Это команда для сохранения содержимого буфера SQL*Plus как
командного файла:
S. Это команда для загрузки командного файла SQL в буфер операций и его
выполнения:
Ответы
1. save 2. €
Подзапросы
133
Сохранение настроек
Для сохранения настроек в файле следует использовать команду store,
которая принимает ключевое слово set, а также имя файла, в котором будут
сохранены установки среды. Следующий блок кода служит иллюстрацией этого
принципа:
ш&еепиш SQL> set termout on
SQL> set pagesize 132
SQL> store set myfile.out
Created file myfile.out
SQL>
После того как установки среды будут сохранены, их можно просмотреть в
том файле, который был создан SQL*Plus. Для восстановления установок
следует выполнить в SQL*Plus содержимое файла. Оба этих момента
иллюстрируются приведенным ниже блоком кода:
1ШЯт SQL> get myfile.out
1 set appinfo ON
2 set appinfo "SQL*Plus"
3 set arraysize 15
4 set autocommit OFF
5 set autoprint OFF
6 set autotrace OFF
7 set shiftinout invisible
8 set blockterminator "."
9 set cmdsep OFF
10 set colsep " "
11 set compatibility NATIVE
12 set concat "."
13 set copycorranit 0
14 set copytypecheck ON
15 set define "&"
16 set echo OFF
17 set editfile "afiedt.buf"
18 set embedded OFF
19 set escape OFF
20 set feedback 6
21 set flagger OFF
22 set flush ON
23 set heading ON
24 set headsep "I"
25 set linesize 100
26 set long 80
27 set longchunksize 80
28 set newpage 1
29 set null ""
30 set numformat ""
31 set numwidth 9
32 set pagesize 132
33 set pause OFF
34 set recsep WRAP
3 5 set recsepchar " "
36 set serveroutput OFF
37 set showmode OFF
38 set sqlcase MIXED
39 set sqlcontinue " "
40 set sqlnumber ON
41 set sqlprefix "#"
42 set sqlprorapt "SQL "
4 3 set sqlterminator ";"
44 set suffix "sql"
45 set tab ON
4 6 set termout ON
47 set time OFF
48 set timing OFF
4 9 set trimout ON
50 set trimspool OFF
51 set underline "-"
52 set verify ON
53* set wrap ON
SQL> (Smyfile.out
SQL>
134
Глава 4
Примечание В выходной файл не будут включены установки для column,
break, compute, btitle u ttitle.
Альтернативно, если файл окружения сохранен в файле, который
называется login. sql, SQL*Plus может автоматически выполнить содержимое
файла, так что, когда вы в следующий раз войдете в SQL*Plus, ваша среда будет в
точности такой, как вы хотели. Этот файл должен храниться или в локальном
каталоге, из которого загружается SQL*Plus, или в каталоге, определяемом
используемой операционной системой.
Закрепление пройденного материала
Убедитесь, что понимаете, как сохранить установки среды и для чего
используется файл login.sql.
Упражнения
1. Это команда для записи данных о среде SQL*Plus в сценарий для
последующего выполнения:
2. Это имя сценария, который будет выполняться при каждом запуске
SQL*Plus для конфигурирования установок вашей среды:
Ответы
1. store 2. login, sql
Резюме главы
В этой главе был рассмотрен широкий круг вопросов. Вы многое узнали о
расширенном отборе данных в SQL*Plus, в том числе, о том, как структурировать
однострочные, многострочные и коррелированные подзапросы, а также о том,
как идентифицировать все эти типы запросов. Кроме того, вы узнали, что
подзапросы игнорируют результаты типа NULL — факт, небесполезный для
сдачи экзамена ОСР. После этого мы обсудили многие команды SQL*Plus для
форматирования выходных данных отчетов, как пишутся сценарии и как
вводить переменные в запросы SQL для удобного их использования.
Двухминутное погружение в пройденное
■ Данные, используемые для определения фразы having, могут быть
специфицированы либо в исполнительном периоде запроса, либо с помощью
специального встроенного запроса, который называется подзапросом и
получает неизвестные критерии поиска на основании известных методов
поиска.
■ Для определения неизвестного критерия поиска в других частях оператора
select также могут использоваться подзапросы. Обычно таким образом
подзапросы включаются во фразу where.
Ш Подзапросы могут использовать в операторах сравнения столбцы,
являющиеся локальными по отношению к таблице, указанной в подзапросе,
либо столбцы, упомянутые в любой таблице родительского запроса. Такое
использование базируется на принципах области действия переменных,
которые были приведены в этой главе.
■ Среди различных типов подзапросов, с которыми сталкиваются при
использовании Oracle, можно назвать следующие:
■ Однострочные подзапросы Главный запрос рассчитывает получить из
подзапроса только одно значение.
Подзапросы
135
■ Многострочные подзапросы В главном запросе могут обрабатываться
ситуации, когда подзапрос возвращает более одного значения.
I Встроенные представления Подзапрос во фразе from, используемый для
определения промежуточного набора данных, для которого строится
главный запрос.
■ Подзапрос, содержащий более одного столбца возвращаемых данных.
■ Убедитесь, что понимаете, как для выборки данных в Oracle создаются и
используются коррелированные подзапросы.
■ Вспомните, что большинство подзапросов (даже те, что возвращают по
несколько строк) обычно возвращают результаты только для одного
столбца. Однако можно сконструировать такие запросы, которые
возвращают несколько столбцов. Вернитесь к прочитанной главе и освежите в
своей памяти используемые для этой цели синтаксис и семантику.
Ш Подзапросы, содержащие выражения group by, игнорируют строки, если
используемый в group by столбец содержит для них значение NULL.
Убедитесь, что представляете, как можно в случае необходимости переписать
подобные запросы, чтобы получить и эти, содержащие значения NULL,
строки.
Ш Подзапрос, размещенный во фразе from родительского запроса,
называется встроенным представлением. Проверьте, помните ли вы синтаксис и
семантику, применяемые при использовании встроенных приложений,
особенно если требуется обратиться непосредственно к столбцам из
встроенного приложения. А также вспомните про использование
встроенных представлений для запросов типа "первые N".
■ Вспомните характеристики округления SQL*Plus, которые можно
конфигурировать с помощью команды set.
■ Убедитесь, что вы полностью понимаете, как использовать для
повышения удобочитаемости выходных данных следующие команды SQL*Plus:
Ш format
■ btitle
■ ttitle
Ш break
Ш compute
■ Значения переменным можно присваивать непосредственно во время
выполнения оператора select. Это делается с помощью так называемых
переменных исполнительного периода. Для обозначения таких переменных
применяется символ амперсанда (&), предшествующий имени
переменной.
Ш Значение специального символа, обозначающего переменную
исполнительного периода, можно изменить, пользуясь командой set define.
Ш Команда define может идентифицировать переменную исполнительного
периода, которая будет автоматически определяться оператором select.
■ После того как переменная была определена, она остается определенной
до окончания сеанса или до тех пор, пока она не будет сделана
неопределенной процессом пользователя с помощью команды undefine.
■ Можно модифицировать текст сообщения, приглашающего пользователя
ввести значение переменной. Такого рода действия выполняются с
помощью команды accept.
136
Глава 4
Вопросы для самопроверки
1. Для генерации отчетов, в которых отображаются накопленные суммы
информации, можно использовать команду SQL*Plus:
2. После назначения значения переменной в команде SQL*Plus ее значение
можно переназначить, используя команду SQL*Plus:
3. Это ключевое слово SQL*Plus используется для определения форматов, с
помощью которых SQL*Plus отображает информацию столбцов:
4. Эта фраза описывает запрос, передающий в родительский запрос одну
строку результатов для его уточнения, когда сформулированный во фразе
where критерий поиска неизвестен:
Вопросы ко всей главе
1. Как долго переменная остается определенной в SQL*Plus после того, как
ей было назначено значение?
A. До момента закрытия базы данных
B. До момента закрытия экземпляра
С До окончания действия оператора
D. До момента завершения сеанса
2. Вы желаете изменить приглашение, используемое Oracle для получения от
пользователей входной информации. Какие из предложенных вариантов
ответа подходят для этого? (Выберите два варианта ответа.)
A. Измените параметр prompt файла config.ora.
B. Измените фразу prompt команды accept.
С Введите новое приглашение в файл login. sql.
D. В Oracle невозможно изменить приглашение.
3. Какой символ по умолчанию используется для специфицирования
подстановочных переменных в операторах select?
A. Амперсанд
B. Эллипс
C. Кавычки
D. Звездочка
4. Какой из предлагающихся вариантов применяется для изменения
используемого по умолчанию символа, определяющего переменную
исполнительного периода?
A. Модификация файла initsid.ora
B. Модификация файла login, sql
С Задание команды define имя_переменной
D. Задание команды set define
5. Вы разрабатываете для Олимпийских игр многострочный запрос,
способный обрабатывать сложные и динамические операторы сравнения. В
запросе используются две таблицы. В таблице CONTESTANT
(участники соревнований) перечислены все участники изо всех стран, а в таблице
MEDALS (медали) перечислены все принимающие участие в
соревнованиях страны и количество завоеванных ими золотых, серебряных и
Подзапросы
137
бронзовых медалей. Если страна не получила ни одного из этих типов
медалей, в соответствующем столбце появляется значение 0.
Следовательно, запрос всегда возвратит какое-то значение, даже если страна не
завоевала медалей. Какой из приведенных ниже запросов покажет
участников только из тех стран, которые имеют более десяти медалистов
любого типа?
A.SELECT NAME FROM CONTESTANT C, MEDALS M WHERE
С.COUNTRY = M.COUNTRY;
В. SELECT NAME FROM CONTESTANT WHERE COUNTRY С IN
(SELECT COUNTRY FROM MEDALS M WHERE С COUNTRY =
M.COUNTY)
С SELECT NAME FROM CONTESTANT WHERE COUNTRY С =
(SELECT COUNTRY FROM MEDALS M WHERE С COUNTRY =
M. COUNTY)
D. SELECT NAME FROM CONTESTANT WHERE COUNTRY IN
(SELECT COUNTRY FROM MEDALS WHERE NUM_GOLD +
NUM_SILVER + NUM_BRONZE > 10)
6. Вы задаете в сеансе SQL*Plus следующий запрос:
SELECT NAME, AGE, COUNTRY FROM CONTESTANT
WHERE (COUNTRY, AGE) IN (SELECT COUNTRY, MIN(AGE)
FROM CONTESTANT GROUP BY COUNTRY);
В каком из следующих вариантов ответа правильно определен и тип
запроса, и ожидаемый из базы данных Oracle результат?
A. Однострочный подзапрос, самый молодой участник из конкретной
страны.
B. Многострочный подзапрос, самый молодой участник изо всех стран.
С Многостолбцовый подзапрос, самый молодой участник изо всех
стран.
D. Многостолбцовый подзапрос; Oracle возвратит сообщение об ошибке,
потому что операцию in следует заменить на = .
7. Содержимое таблицы CONTESTANT имеет следующий вид:
NAME
BERTRAND
GONZALEZ
HEINRICH
TAN
SVENSKY
SCO
AGE
24
29
22
39
30
21
COUNTRY
FRANCE
SPAIN
GERMANY
CHINA
RUSSIA
Вы задаете к этой таблице следующий запрос:
SELECT NAME FROM CONTESTANT
WHERE(COUNTRY, AGE) IN ( SELECT COUNTRY, MIN(AGE)
FROM CONTESTANT GROUP BY COUNTRY);
Кто из перечисленных участников соревнований не появится в выходных
данных этого запроса?
A.SOO
B. HEINRICH
C. BERTRAND
D. GONZALEZ
8. Пользователь JANKO хочет вставить строку в таблицу EMPLOYEE. У
этой таблицы имеются три столбца: EMPID, LASTNAME и SALARY. Он
138
Глава 4
желал бы ввести следующие данные: EMPID = 59694, LASTNAME =
Harris, а зарплата отсутствует. Какой из операторов подойдет для этого лучше
всего?
A.insert into EMPLOYEE values (59694, 'HARRIS', NULL);
B.insert into EMPLOYEE values (59694, 'HARRIS');
C. insert into EMPLOYEE (EMPID, LASTNAME, SALARY)
values (59694, 'HARRIS');
D. insert into EMPLOYEE (select 59694 from 'HARRIS');
9. Какой из перечисленных ниже эффектов произведет пропуск фразы where
в операторе delete?
A. Оператор delete завершится с ошибкой, поскольку отсутствуют
записи для удаления.
B. Оператор delete попросит пользователя ввести критерий удаления.
C. Оператор delete завершится аварийно из-за синтаксической
ошибки.
D. Оператор delete удалит из таблицы все записи.
Ответы на вопросы для самопроверки
1. compute
2.undefine
3. Set
4. Однострочный подзапрос
Ответы на вопросы к главе
1. D. До момента завершения сеанса
Объяснение Определенная пользователем во время сеанса SQL*Plus
переменная будет оставаться определенной либо до конца сеанса, либо до тех
пор, пока пользователь явно не объявит ее неопределенной. Отсылаем вас к
материалам обсуждения вопроса об объявлении переменных в тексте этой
главы.
2. В и С. Изменить фразу prompt команды accept и ввести новое приглашение
В файл login.sql.
Объяснение Вариант D должен быть отброшен немедленно, после чего
остается сделать выбор между ответами А, В и С. Ответ А некорректен,
поскольку файл config.ora имеет непосредственное отношение к сетевому
коммуникационному продукту Oracle для реализации архитектуры
клиент/сервер. Вариант С справедлив, поскольку мы можем использовать
команду set sqlprompt в файле login.sql. Это специальный файл, который
пользователи Oracle могут включить в свое использование Oracle и который
автоматически конфигурирует такие аспекты сеанса SQL*Plus, как
используемый по умолчанию редактор текстов, формат столбцов, форматы дат по
NLS и другие элементы.
3. А. Амперсанд
Объяснение По умолчанию для определения переменных исполнительного
периода используется символ амперсанда (&). Рассмотрите еще раз материалы
обсуждения переменных исполнительного периода и команды set define.
Подзапросы
139
4. D. Задание команды set define
Объяснение Выбор А некорректен, так как изменение файла initsid.ora
приведет к изменению параметров, используемых Oracle для запуска
экземпляра базы данных. Об использовании этой возможности пойдет речь в
следующем модуле. Вариант В некорректен, потому что, хотя файл login. sql может
задавать многие свойства сеанса SQL*Plus, символ, обозначающий
переменную исполнительного периода, не относится к их числу. Вариант С также
некорректен, так как команда define используется для определения переменных,
используемых сеансом, а не для определения индивидуальных символов.
Рассмотрите еще раз материалы обсуждения переменных исполнительного
периода в операторах select.
5. D. SELECT NAME FROM CONTESTANT WHERE COUNTRY IN (SELECT
COUNTRY FROM MEDALS WHERE NUM_GOLD + NUM_SILVER +
NUM_BRONZE > 10)
Объяснение Этот запрос корректен, потому что он содержит подзапрос,
корректно возвращающий подмножество стран, имеющих участников
соревнований, завоевавших десять или более медалей любого достоинства. Выбор А
некорректен, потому что содержит операцию соединения, а не подзапрос.
Вариант В представляет просто переписанный вариант запроса А, где
использован многострочный подзапрос; однако он не способен корректно
ограничить отбираемые данные и поэтому некорректен. Вариант С является
однострочным подзапросом, выполняющим в основном те же действия, что и
вариант В, и поэтому тоже некорректен.
6. С. Многостолбцовый подзапрос, самый молодой участник изо всех
стран.
Объяснение Поскольку в главном запросе выполняется сравнение по двум
столбцам, возвращаемым подзапросом, он является многостолбцовым
подзапросом, который должен возвратить фамилию самого молодого
участника соревнований для всех стран таблицы. Этот многостолбцовый запрос
является и многострочным подзапросом, но поскольку определяющим
фактором здесь является факт присутствия в подзапросе двух столбцов, вы
должны отдать ему предпочтение перед количеством возвращаемых строк.
Тем самым отбрасываются варианты А и В. Тем не менее подзапрос
возвращает несколько строк. Поэтому вы должны учесть тот факт, что главный
запрос должен содержать фразу IN, а не знак равенства (=), и отбросить
вариант D.
■ 7. A. SOO
Объяснение Примите наши поздравления, если выбрали вариант SOO!
Правильным ответом является именно SOO, потому что действия
подзапроса, специфицированные во фразе IN, неявно игнорируют значения NULL.
Следовательно, так как для участника SOO страна не была определена, эта
строка не будет отобрана как часть подзапроса. В результате в выходных
данных будет перечислен каждый из самых молодых участников из названных
стран, так что варианты В, С и D будут присутствовать в результирующем
наборе.
8. A. insert into EMPLOYEE values (59694, 'HARRIS', NULL);
Объяснение Этот вариант является приемлемым, потому что
позиционный критерий для неспецифицированного порядка столбцов будет вполне
удовлетворен данными во фразе values. Когда вы желаете указать, что
данные для ввода в конкретный столбец отсутствуют, одним из способов
является вставка значения NULL. Вариант В некорректен, потому что указаны
значения не для всех столбцов таблицы. Если для заполнения столбцов
используются ссылки на их положение, должны быть представлены значения
для всех столбцов таблицы. В противном случае столбцы должны быть по-
140
Глава 4
именованы явно. Выбор С некорректен, потому что, когда столбцы, в которые
должны быть введены значения, названы во фразе insert into, их значения
обязательно должны присутствовать во фразе values. Вариант D
некорректен, так как использование многострочной опции insert с оператором select
в подобной ситуации не поддерживается. Подробнее об этом пойдет речь при
обсуждении операторов insert.
9. D. Оператор delete удалит из таблицы все записи.
Объяснение Пропуск фразы where в любом операторе может привести
только к одному результату: запрашиваемая операция будет выполнена для всех
записей таблицы.
ГЛАВА 5
Создание объектов
базыданных Oracle
142
Глааа 5
этой главе мы познакомимся со следующими вопросами, а
потом и продемонстрируем свои знания по ним:
Ш Создание таблиц базы данных Oracle
■ Включение ограничений
Как мы уже говорили, в этой главе мы рассмотрим создание таблиц базы
данных Oracle и включение ограничений. Приобретя мастерство в этих
вопросах, вы переходите с уровня обычного пользователя в мир разработки
приложений. Именно разработчики приложений обычно создают объекты базы
данных и определяют, как обычные пользователи смогут обращаться к этим
объектам в промышленной среде. Администратором базы данных (АБД)
называется лицо, ответственное за перенос спроектированных объектов в
промышленную среду, а затем и за управление всеми потребностями промышленной
системы. В этой главе будет заложен фундамент для обсуждения создания
объектов баз данных Oracle и ограничений, что весьма важно как для
разработчиков, так и для АБД, так что отнеситесь к этому материалу с самым
пристальным вниманием. Экзаменационные вопросы по этой теме составляют около
15% первого экзамена ОСР.
Создание таблиц базы данных Oracle
В этом разделе мы затронем следующие вопросы, относящиеся к созданию
таблиц:
■ Описание таблиц
■ Создание таблиц
■ Определения типов данных и столбцов
■ Изменение определений таблиц
■ Удаление, переименование и усечение таблиц
В этом разделе мы объясним основные правила синтаксиса, требующиеся
разработчикам и АБД для того, чтобы создавать логические объекты, которые
в базах данных Oracle называются таблицами. Мы изучим синтаксис и
семантику создания таблиц и связанных с ними объектов баз данных. Мы узнаем
также, как определить характеристики уже созданных таблиц. Кроме того, мы
поговорим о том, как изменить определения существующих таблиц, и о других
расширенных типах манипулирования таблицами в базах данных. И наконец,
мы познакомимся с быстрым и изящным способом удаления записей из
таблиц, оставляющим незатронутым определение таблицы.
Описание таблиц
Для большинства новичков в области Oracle лучший способ представить себе
таблицу — это нарисовать в воображении лист бумаги, разбитый на клетки и
содержащий несколько записей с данными. В верхней части таблицы
попытайтесь вообразить себе горизонтальный перечень имен столбцов, используемых в
качестве меток столбцов при обращении к содержащимся в них данным.
Каждая запись таблицы называется ее строкой. Команда describe SQL*Plus
позволяет получить базовый перечень характеристик таблицы. На страницах этой
книги нам уже приходилось встречаться с командой describe, но посмотрим
еще раз на хорошо знакомую нам таблицу ЕМР из демонстрационного
примера, владельцем которой является пользователь SCOTT:
5QL> describe scott.ecnp
Name Null? Type
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
NOT
NULL
NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
Создание объектов базыданных Oracle
143
СОММ NUMBER(7,2)
DEPTNO NUMBER(2)
Совет Название команды describe можно сократить до desc, что
позволяет получать те же самые результаты меньшими усилиями. Не следует
путать это сокращение с ключевым словом desc, используемым в фразах
order by для получения выходных данных в убывающем порядке!
Обратите внимание на некоторые интересные характеристики выходных
данных предшествующего блока кода. Во-первых, команда describe
перечисляет все столбцы таблицы ЕМР по именам. Иногда столбцы таблицы называют
полями. Мы снабдили имя таблицы ЕМР префиксом в виде имени владельца
схемы — SCOTT. Если бы мы не сделали этого, Oracle предположил бы, что мы
желаем получить описание таблицы ЕМР из собственной схемы, если такая
таблица существует. Во-вторых, обратите внимание на столбец, который
называется "Null". Содержащаяся в нем информация показывает, допускают ли
входящие в таблицу столбцы появление в них значений NULL. Если для
какого-нибудь столбца указано значение NOT NULL, то обычно (хотя и не всегда)
это означает, что такой столбец используется в качестве первичного ключа,
определяющего уникальность строк в таблице. И наконец, в выходных данных
указывается подробная информация о типе данных каждого столбца таблицы.
Совет Вы уже немного продвинулись по пути изучения Oracle. Поэтому
широко использовавшиеся в предыдущих главах демонстрационные таблицы
становятся для нас менее интересными. Начиная с этого момента мы будем
работать с собственными объектами базы данных: сначала создадим их,
затем заполним значениями, а затем, если потребуется, займемся выборкой
из них информации. Вероятно, вы по-прежнему будете использовать
идентификатор пользователя SCOTT, поскольку ему присвоены все необходимые
для выполнения этих примеров полномочия!
Закрепление пройденного материала
Необходимо знать, как используется команда describe и каково ее
сокращенное название. Помните, какие три вида информации приводятся в
выходных данных этой команды и, конечно, что эта информация означает.
Упражнения
1. В SQL*Plus вы задаете следующую команду: describe PROFITS. Какой из
следующих вариантов определяет ту информацию, что не будет показана в
листинге выходных данных выполнения команды?
A. Столбцы таблицы
B. Внешние ключи из этой таблицы в другие
С Типы данных столбцов таблицы
D. Первичный ключ таблицы
2. В SQL*Plus вы задаете следующую команду: describe PROFITS. Под
каким заголовком в выходных данных команды будет содержаться
информация о потенциальном первичном ключе этой таблицы?
A. NAME
B. NULL?
С TYPE
D. Ни в одном из перечисленных выше
3. Это ключевое слово вводится как сокращение для команды describe:
144
Глава 5
Ответы
1. В. 2. В. 3. desc
Создание таблиц
Для создания таблиц в Oracle используется команда create table. Эта
команда является всего лишь одним из многочисленных представителей
семейства операторов для создания объектов базы данных, которые известны в
Oracle как язык определения данных (Data Definition Language — DDL). Для
наших целей мы попытаемся в нескольких следующих примерах создать
собственную таблицу служащих компании. Приведенный ниже блок кода
предлагает базовый оператор create table для создания новой таблицы
EMPLOYEE:
<ЯЙ8ЯСТ SQL> create table employee
2 (empid varchar2(5),
3 firstname varchar2(10),
4 lastname varchar2(10),
5 salary number(7));
Table created.
Совет Для того чтобы создавать таблицы в базе данных Oracle,
необходимо иметь привилегию create table. У пользователя SCOTT такая
привилегия имеется. Информацию о том, как предоставляются необходимые
привилегии другим пользователям, можно найти в главе 8. Или же можно
попросить АБД той компании, где вы работаете, предоставить
привилегию create table тому идентификатору пользователя, который вы
собираетесь использовать для работы с примерами на протяжении этой главы.
Отметьте для себя некоторые важные аспекты показанного оператора
create table. Мы определили имя таблицы, а затем в круглых скобках
перечислили имена всех столбцов, которые желаем включить в нее, и разделили их
запятыми. Абсолютный максимум числа столбцов таблицы не может
превысить 1000. С каждым столбцом ассоциируется определенный тип данных,
который должны иметь все хранящиеся в столбце величины. Открытые в начале
перечисления столбцов скобки должны быть обязательно закрыты, после чего
Oracle приступит к созданию для нас таблицы. Если в схеме нашего
пользователя уже имеется таблица с именем EMPLOYEE, Oracle выдаст следующее
сообщение об ошибке, а таблица не будет создана:
вЙКМа SQL> create table employee
2 (empid varchar2(5));
create table employee
ERROR at line 1:
ORA-00955: name is. already used by an existing object
(имя уже использовано существующим объектом)
Совет В том случае, если имя таблицы, которую вы хотите создать, уже
используется существующим объектом вашей схемы, ее можно создать в
схеме другого пользователя, переименовать тот объект, который нужно
создать, или удалить существующий объект.
Создание временных таблиц
По большей части, если в Oracle создается таблица, все записи, которые в
конечном счете заполнят ее, будут оставлены внутри базы данных навечно (или,
по крайней мере, до тех пор, пока кто-то из пользователей не удалит их).
Однако бывают ситуации, когда вы желаете создать записи внутри базы данных
только на короткое время. В этом случае можно создать так называемую
временную таблицу, для которой помещенные в нее данные будут сохраняться
только в течение пользовательского сеанса или только на время выполнения
текущей транзакции. Транзакцией называется промежуток времени, для
которого все сделанные изменения данных рассматриваются как один логический
блок работы. Подробнее о транзакциях мы поговорим в главе 6.
Создание объектов базыданных Oracle
145
Временная таблица создается с помощью команды create global
temporary table. Почему создаваемая временная таблица должна быть
глобальной? Дело в том, что определения временных таблиц можно сделать
доступными каждому пользователю системы. Однако содержимое временной
таблицы может увидеть только тот сеанс пользователя, в рамках которого она
была создана, несмотря на то что определение таблицы доступно всем.
Временные таблицы являются относительно новой возможностью Oracle, и у
разработчиков еще не было достаточно времени, чтобы реализовать
"локальные" временные таблицы (то есть такие временные таблицы, которые будут
доступны только владеющему ими пользователю). Ищите такую
функциональную возможность в новых выпусках базы данных. Пример команды
create global temporary table приведен в следующем блоке кода:
&П1Р%№г SQL> create global temporary table temp_emp
2 (empno number,
3 ename varchar2 (lO)') ;
Table created.
Итак, попробуем выделить все главное, что мы знаем про временные
таблицы:
■ Оператор create global temporary table создает временную таблицу
для транзакции или сеанса пользователя.
■ Для определенных на время транзакции таблиц данные, включенные в
них, сохраняются только на время существования транзакции.
■ Для определенных на время сеанса пользователя таблиц данные,
включенные в них, сохраняются только на время существования сеанса.
■ Данные из временных таблиц являются частными данными сеанса. Это
означает, что каждый сеанс может видеть и модифицировать только
данные из временных таблиц собственного сеанса.
Создание одной таблицы вместе с данными
на базе другой таблицы
В большинстве случаев при создании разработчиком таблицы базы данных
Oracle она создается пустой, то есть в ней отсутствуют данные. После создания
таблицы пользователи и разработчики имеют возможность заполнять эту
таблицу данными при условии, что им предоставлены соответствующие права.
Однако в некоторых случаях разработчик имеет возможность создать таблицу
сразу вместе с данными. Для этого используется оператор creare table as
select, как это показано ниже:
P№W№ SQL> create table empcopy
2 as select * from emp
3 where deptno = 10;
Table created.
Стоит упомянуть о двух вещах, связанных с оператором create table
as select. Во-первых, заметьте, что в таблице EMP_COPY нам не
требуется определять никаких имен столбцов. Это связано с тем, что во фразе
column для получения данных из таблицы ЕМР использован групповой
символ, который указывает Oracle, что в таблице EMP_COPY следует создать
такие же столбцы, что и в таблице ЕМР — с теми же именами и с теми же
определениями типов данных. Во-вторых, в оператор create table as
select может быть включен любой оператор select, который может быть
задан в SQL*Plus. Oracle автоматически определяет, какие данные должны
быть включены из таблицы ЕМР, и автоматически заполняет EMPCOPY
этими данными. Однако, если во фразу column оператора select включен
146
Глава 5
ffisffiSS
список конкретных столбцов, во фразе create table также должен быть
приведен точно такой же список столбцов, заключенный в круглые скобки.
Приведенный ниже пример иллюстрирует сказанное:
SQL> create table emp_copy_2
2 (empno, sal) as
3 select empno, sal from emp
4 where deptno = 10;
Table created.
SQL> describe emp_copy_2
Name Null? Type
EMPNO
SAL
SQL> select
EMPNO
7782
7839
7934
* from emp copy 2;
SAL
2450
5000
1300
NOT NULL
NUMBER(4)
NUMBER(7,2)
Соглашения об именовании таблиц
Множество "философских" принципов, связанных с именованием
переменных, таблиц, столбцов и других элементов программного обеспечения,
пришло из начала компьютерной эпохи. На вычислительных машинах тех дней
были сильно ограничены размеры доступной оперативной и дисковой памяти,
так что имена таблиц и столбцов в этих суровых условиях часто были
короткими и загадочными. Однако в современных системах разработчикам не
приходится сталкиваться с подобными ограничениями. Им больше не нужно
связывать имена таблиц и столбцов жесткими правилами прошедших лет. Тем не
менее стандарты именования таблиц и столбцов продолжают существовать
хотя бы ради удобства чтения имен. Имеются непреложные правила
относительно имен таблиц и столбцов и в Oracle. Для наших целей мы разобьем
имеющиеся правила на две категории: твердые правила и мягкие стилистические
правила.
Имена ДОЛЖНЫ быть короткими и описательными Имена, присваиваемые
таблицам и столбцам баз данных Oracle в соответствии с соглашением об
именовании должны быть компактными, но любой человек, впервые
знакомящийся с таблицами и столбцами вашей базы данных, должен понимать, каким
объектам реального мира они соответствуют.
В Твердое правило Имена объектов базы данных Oracle должны начинаться
с буквы английского языка и могут иметь длину от 1 до 30 символов, за
исключением имени самой базы данных (не более 8 символов) и имени
связи баз данных (разрешено иметь не более 128 символов). Имена
записываются без учета регистра клавиатуры.
■ Мягкое стилистическое правило Если вы назовете таблицу
EMP_LN_FN_SAL, это может оказаться не так понятно, как простое имя
EMPLOYEE или даже просто ЕМР.
Связывайте имена таблиц-потомков с именами таблиц-родителей В некоторых
ситуациях может оказаться, что разработчикам приложений требуется создать
несколько таблиц для определения логической сущности, представляющей
отношение "родитель-потомок". Рассмотрим пример, в котором приложение
для расчета затрат на содержание служащего использует две таблицы. Одна из
них называется EXPENSE и содержит такую информацию, как имя служащего
и полная сумма выставленных счетов, а другая называется
EXPENSE_DETAIL и содержит индивидуальные счета на оплату
авиаперелетов, аренду автомобиля, отеля и тому подобных расходов. Оба имени являются
описательными, и из их названий следует, что между этими двумя таблицами
существует отношение (взаимосвязь).
Создание объектов базыданных Oracle
147
■ Твердое правило Пользователь не может владеть или ссылаться на два
объекта с одним и тем же именем, так что, если таблицей EMPLOYEE
владеете и вы, и пользователь SCOTT, вы должны перед ссылками на
EMPLOYEE использовать в качестве префикса имя владельца схемы.
■ Мягкое стилистическое правило Связанные внешним ключом таблицы
(то есть таблицы, реализующие отношение "родитель-потомок") должны
иметь частично совпадающие имена таблиц.
Столбцы, являющиеся внешними ключами, должны иметь одинаковые имена
в обеих таблицах Когда вы создаете связь между столбцами двух таблиц по
внешнему ключу, будет очень полезно, если эти появляющиеся в обеих
таблицах столбцы будут называться одинаково, тем самым делая еще более
очевидным существование внешнего ключа. Помните, что если в операторах
соединения приходится ссылаться на столбцы с одинаковыми именами, то можно
использовать псевдонимы таблиц, чтобы избежать неоднозначности.
■ Твердое правило Запрещается называть таблицу именем DUAL,
поскольку, как вы помните, в Oracle уже используется таблица с этим именем,
доступная для всех пользователей.
■ Мягкое стилистическое правило Желательно, чтобы у общих столбцов
таблиц, по которым реализуется отношение "родитель-потомок", были
совпадающие (общие) имена.
Имена ассоциированных объектов должны иметь отношение к имени
таблицы Иногда помимо таблиц приходится создавать другие связанные с ними
объекты. К числу таких объектов относятся ограничения целостности,
триггеры и индексы. Что это за объекты, мы расскажем вам позже. А сейчас
достаточно просто знать, что такие объекты существуют и что полезно присваивать
им выразительные имена, указывающие их связь с основной таблицей.
■ Мягкое стилистическое правило Присваивайте ассоциированным с
таблицей объектам выразительные имена, указывающие их связь с основной
таблицей, например РК_ЕМР_01 (первичный ключ таблицы ЕМР),
IDX_EMP_01 (индекс для таблицы ЕМР) и TRIG_EMP_01 (триггер для
таблицы ЕМР).
Избегайте кавычек, ключевых слов и не буквенно-цифровых символов
Запрещается использовать в именах таблиц или столбцов кавычки, а также
большинство не буквенно-цифровых символов. Из этого правила имеется всего
три исключения: знак доллара ($), знак подчеркивания (_) и символ решетки
(#). Знак доллара чаще всего используется в именах динамических
представлений производительности, в то время как знак решетки используется в
некоторых таблицах словаря данных, которыми владеет привилегированный
пользователь Oracle по имени SYS. Вообще говоря, мы советуем избегать
использования в именах символов $ и #. Знак подчеркивания полезен для
разделения двух слов или сокращений.
■ Твердое правило Не используйте имен таблиц, начинающихся с символов
SYS.
■ Твердое правило В именах таблиц и столбцов разрешается использовать
только три специальных символа: #, $ и _.
■ Твердое правило Не используйте в именах баз данных, глобальных баз
данных или связей баз данных специальных символов из европейского
или азиатского набора символов.
■ Твердое правило Имя объекта не может быть зарезервированным словом
Oracle, например select или from, типом данных, например NUMBER,
или именем встроенной функции, например decode ( ). Oracle может не
выразить недовольства, когда вы создаете объект с подобным именем, но
она может преподнести вам пренеприятный сюрприз, когда вы
попытаетесь сослаться на этот объект в операторе SQL.
148
Глааа 5
Ш Твердое правило В зависимости от того, каким продуктом вы планируете
воспользоваться для обращения к объекту базы данных (например,
WebDB, JDeveloper или Developer), могут появиться дополнительные
ограничения в виде других зарезервированных слов. Список
зарезервированных слов для различных продуктов можно найти в руководствах по
соответствующим продуктам.
Закрепление пройденного материала
1. Необходимо знать, как используются операторы для создания таблиц,
временных таблиц и таблиц, заполненных данными. Помните, что
максимальное число столбцов таблицы не может превысить 1000.
2. Убедитесь, что можете назвать некоторые соглашения для именования
таблиц в части описательности, синтаксической и семантической
корректности и связей с другими объектами.
Упражнения
1. Вы создаете в Oracle определения таблиц базы данных. В каком из
следующих вариантов содержится недопустимое для использования имя таблицы?
A. TEST_NUMBER
B. P$$#_LOC
С l_COPY_OF_EMP
D. FLOP_TEST_#3
2. Вы создаете в Oracle таблицы базы данных. В каком из следующих
вариантов содержится недопустимый оператор создания таблицы?
A. create table cats (c_name varchar2(10), c_weight
number, c_owner varchar2(10));
B. create table my_cats as select * from cats where
owner = 'ME';
С create global temporary table temp_cats (c_name
varchar2(10), c_weight number, c_owner
varchar2(10));
D. create table cats_over_5_lbs as select c_name,
c_weight from cats where c_weight 5;
3. Ваша попытка создания таблицы для Oracle завершается выдачей
сообщения ORA-00955-name is already used by an existing object. Какой
из следующих вариантов не подходит для адекватного разрешения
сложившейся ситуации?
A. Создать этот объект как другой пользователь.
B. Удалить существующий объект с таким же именем.
С Изменить имена столбцов в создаваемом объекте.
D. Переименовать существующий объект.
4. В Oracle все временные таблицы доступны для всех пользователей, что
подразумевает необходимость этого ключевого слова:
Ответы
1. С. 2. Р. 3. С. 4. global
Создание объектов базыданных Oracle
149
Определения типов данных и столбцов
О необходимости использования типов данных при определении типа данных,
которые могут содержаться в столбцах таблицы, уже шла речь в главе 1. При
первоначальном обсуждении этого вопроса мы ограничились обсуждением
только тех типов данных, которые используются в таблице EMP (VARCHAR2,
DATE и NUMBER), чтобы мы могли сосредоточиться на изучении того, как
разрабатывать запросы. Однако сейчас нам необходимо обсудить все
имеющиеся в базе данных Oracle типы данных, чтобы знать о них все, что необходимо
для сдачи экзамена ОСР. Ниже приводится перечень всех типов данных Oracle
вместе с их описаниями:
Тип данных
VARCHAR2(n)
NVARCHAR2(n)
CHAR(n)
NCHAR(n)
NUMBER(n[,/n])
DATE
RAW
LONG
LONG RAW
ROWID
BLOB
CLOB
NCLOB
BFILE
Описание
Содержит текстовые строки переменной длины с максимальной
длиной л байт, где л может иметь значение вплоть до 4000 байт.
Содержит состоящую из однобайтовых или многобайтовых
символов текстовую строку переменной длины с максимальной
длиной л байт, где л может иметь значение вплоть до 4000 байт.
Содержит фиксированные текстовые строки длиной л байт, где л
может иметь значение вплоть до 2000 байт.
Содержит состоящую из однобайтовых или многобайтовых
символов фиксированную текстовую строку с максимальной длиной л
байт, где л может иметь значение вплоть до 2000 байт.
Содержит цифровые данные, содержащие до л цифр, где л может
доходить до 38. Данные типа NUMBER могут иметь
необязательный параметр т, обозначающий число цифр после (справа) от
десятичной точки. Эта последовательность цифр называется
мантиссой. Мантисса также может содержать до 38 цифр. Если значение л
ие указано, Oracle по умолчанию считает его равным 38.
Содержит информацию из дат. Столбцы типа DATE имеют длину
7 байт.
Содержит двоичные данные длиной до 2000 байт. Это тип данных
переменной длины, наподобие VARCHAR2.
Содержит текстовые данные длиной до 2 Гбайт.
Содержит двоичные данные длиной до 2 Гбайт.
Содержит адреса строк таблицы. Это могут быть физические или
логические ROWID.
Хранит данные из больших неструктурированных двоичных
объектов (доступен для Огас1е8 и более поздних версий) размером до
4 Гбайт.
Хранит большие объемы символьных данных из набора символов
базы данных (доступен для Огас1е8 и более поздних версий)
размером до 4 Гбайт.
Хранит большие объемы символьных (однобайтовых или
многобайтовых) данных, использующих набор символов базы данных
уникода (доступен для Oracle8 и более поздних версий) размером
до 4 Гбайт.
Хранит указатели на большие неструктурированные файлы
операционной системы вне базы данных Oracle (доступен для Огас1е8 и
более поздних версий).
150
Глава 5
Объяснение типов данных
Имеются несколько текстовых типов данных, которые могут содержать
буквенно-цифровую информацию, — CHAR и VARCHAR2. И хотя оба этих типа
данных содержат текстовые строки, между ними существуют некоторые едва
заметные различия. Во-первых, тип данных CHAR поддерживает текстовые
строки длиной до 2000 байт, в то время как тип данных VARCHAR2
поддерживает текстовые строки длиной до 4000 байт. Но более важное различие
демонстрируется следующим блоком кода:
«ИИИИМИ SQL> create table tester
2 (coll char(10),
3 col2 varchar2 (10));
Table created.
SQL> insert into tester values ('BRADY', 'BRADY');
1 row created.
SQL> select vsize(coll), vsize(col2) from tester;
VSIZE(COLl) VSIZE(COL2)
10 5
Совет Такие операторы манипулирования данными, как insert, будут
обсуждаться в главе 6. Сейчас же достаточно просто понимать, что
оператор insert используется в Oracle для добавления строк в таблицы. Другими
словами, в приведенном выше блоке кода нет ничего незнакомого для вас.
Если вы не помните, что именно пытается донести до вас функция vsize( ),
вернитесь к сделанным в главе 2 объяснениям.
Обратите внимание на тот факт, что в таблице TESTER значение
BRADY, хранящееся в столбце COL1, занимает 10 байт. Это происходит
потому, что Oracle дополняет хранящиеся в столбцах типа CHAR значения
пробелами до указанной в описании столбца длины. А вот для точно такого
же значения, хранящегося в столбце, определенном как тип данных
VARCHAR2, Oracle не дополняет его пробелами.
Совет Цифра 2 в конце названия типа данных VARCHAR2 появилась
потому, что в ранних версиях Oracle когда-то имелся тип данных VARCHAR.
Хотя в настоящее время VARCHAR и VARCHAR2 являются синонимами,
они могут перестать быть ими в будущем. Вот почему Oracle рекомендует
использовать тип данных VARCHAR2. VARCHAR является допустимым
типом данных, соответствующим стандарту ANSI, и Oracle
поддерживает его, чтобы всегда можно было сказать, что Oracle соответствует
стандарту ANSI.
Тип данных NUMBER
В типе данных NUMBER могут храниться цифровые данные. Этот тип данных
может быть специфицирован для хранения целых или вещественных чисел.
Чтобы понять, как определяются столбцы типа NUMBER, предположим, что
мы определили столбец так, как это показано в следующем блоке кода:
™ш""" SQL> create table tester2
2 (coll number(15,2));
Table created.
Общее количество цифр, которое может храниться в этом столбце типа
NUMBER, в этом случае равно 15. Перед десятичной точкой может появиться
до 13 цифр, а две цифры отводятся под мантиссу. Поэтому в этом столбце
может быть сохранено число 1234567891011, как это показано ниже:
PSff**a*M SQL> insert into tester2 values(1234567891011);
1 row created;
Но вот число 12345678910111 в такой столбец записать не удастся. Это
иллюстрирует следующий пример:
Создание объектов базыданных Oracle
151
"™""™"tl SQL> insert into tester2 values (12345678910111);
insert into tester2 values(12345678910111)
*
ERROR at line 1:
ORA-01438: value larger than specified precision allows
for this column
(значение больше, чем это разрешено для столбца при специфицированной точности)
Интересные вещи происходят, когда вы пытаетесь вставить в этот столбец
значения, где длина мантиссы превосходит отведенные для нее два знака.
Посмотрите:
fffi»*ff№ SQL> insert into tester2 values(1234567891011.121);
1 row created.
Погодите минутку, скажете вы. Когда мы пытались добавить в столбец
значение, длина целой части которого превышала 13 цифр, Oracle выдала нам
сообщение об ошибке. Однако, когда мы добавляем значение, содержащее более
15 цифр, но переполнение касается только дробных разрядов (справа от
десятичной точки), Oracle принимает такое значение. Хорошо, но это справедливо
только отчасти. Чтобы лучше понять, что произошло, давайте взглянем на
содержимое TESTER2:
tvsm&№t. SQL> column coll format 9999999999999.99
SQL> select * from tester2;
COL1
1234567891011.00
1234567891011.12
Первая команда в блоке кода форматирует выходные данные столбца
COL1, чтобы мы могли более легко читать их. Если бы мы опустили команду
форматирования, Oracle возвратила бы нам эти данные в экспоненциальном
представлении (то есть в виде мантиссы и порядка). Обратите внимание на
значение во второй строке COL1, где Oracle изменила введенное нами
значение 1234567891011.121 на 1234567891011.12! Следовательно, мы можем
экстраполировать два простых правила:
■ Если вы пытаетесь вставить значение, для которого превышено
разрешенное число цифр, то, если речь идет о лишних знаках после десятичной
точки, Oracle всегда проводит округление.
I Если лишние знаки появляются перед десятичной точкой, Oracle
возвращает ошибку.
Другие типы данных в Oracle
Кратко коснемся остальных типов данных Oracle. Мы уже видели, как
работает тип данных DATE, который сохраняет значения дат в особом формате
Oracle, представляющем количество дней, прошедших с 31 декабря 4713 г. до нашей
эры. Этот тип данных обеспечивает большую гибкость при выполнении
операций манипулирования с датами, например если нужно прибавить к
заданной дате 30 дней. Вспомните, что имеется много функций, которые
выполняют сложные операторы с датами. Еще одной приятной особенностью
методики хранения дат Oracle является то, что она по своей сути соответствует
правилам для смены тысячелетий (millennium-compliant).
Помимо типа данных DATE, имеется целый ряд важных опций объявления
типов, предназначенных для хранения текстовой и неформатированной
двоичной информации. К числу этих типов данных относятся LONG, RAW и LONG
RAW. В типах данных RAW могут храниться данные в двоичных форматах
длиной вплоть до 2000 байт. Этйт тип данных полезен для хранения графических и
звуковых файлов и используется в сочетании с LONG, порождая тип данных
LONG RAW, в котором может храниться до 2 Гбайт данных. Кроме того, можно
объявить столбцы имеющими тип LONG, после чего в них можно хранить до 2
Гбайт буквенно-цифровых данных. Однако, поскольку данные в столбцах
LONG или LONG RAW хранятся смежно с остальными данными таблицы (то
152
Глава 5
есть подряд, непрерывно с ними), тип данных LONG может быть назначен
только одному столбцу таблицы.
За счет появления новых типов данных BLOB, CLOB или NCLOB в Огас1е8
было значительно улучшено хранение больших блоков данных. В каждом из
этих типов может храниться до 4 Гбайт двоичных, односимвольных и
многосимвольных данных символьного типа. Данные в столбцах BLOB, CLOB и
NCLOB хранятся следующим образом. Если длина данных меньше 4 Кбайт,
информация может храниться непосредственно вместе с остальными
данными таблицы. В противном случае вместе с остальными данными таблицы
хранится указатель, указывающий, в каком месте за пределами таблицы Oracle
сохраняет наши данные. Это отличается от более ранних версий Oracle, в
которых данные типов LONG и LONG RAW должны были всегда храниться
вместе с основной информацией таблицы. В результате применения нового
способа хранения больших блоков данных стало возможным иметь в таблице
более одного столбца типов BLOB, CLOB или NCLOB.
Совет "Встроенное" хранение данных означает, что данные в столбцах
типа LONG хранятся буквально в одной строке с остальными данными
строки в противоположность другому способу хранения, когда в одной строке с
остальными данными Oracle хранит только указатель места реального
хранения данных столбца типа LONG.
И наконец, тип данных ROWID хранит информацию, связанную с
размещением строк таблиц на диске. Вообще говоря, нельзя создать столбец, в
котором будут храниться данные типа ROWID, но этот тип данных
поддерживает псевдостолбец типа ROWID, ассоциированный с каждой таблицей. Под
псевдостолбцом следует понимать виртуальный столбец таблицы. Для каждой
таблицы имеется несколько псевдостолбцов, в том числе и псевдостолбец
ROWID. Псевдостолбцы являются критичными для вашей способности
хранить информацию в таблицах, поскольку именно они определяют, как Oracle
размещает строки. Кроме того, они однозначно идентифицируют строки
таблицы. Итак, для каждой таблицы имеется один псевдостолбец типа ROWID, в
котором содержатся ROWID для всех строк таблицы. Следующий блок кода
служит иллюстрацией того, что запросы к данным в столбце ROWID таблицы
можно делать точно так же, как и к другим столбцам таблицы:
шзеямяш SQL> select rowid from emp;
ROWID
AAACwdAABAAAJGdAAA
AAACwdAABAAAJGdAAB
AAACwdAABAAAJGdAAC
AAACwdAABAAAJGdAAD
AAACwdAABAAAJGdAAE
AAACwdAABAAAJGdAAF
AAACwdAABAAAJGdAAG
AAACwdAABAAAJGdAAH
AAACwdAABAAAJGdAAI
AAACwdAABAAAJGdAAJ
AAACwdAABAAAJGdAAK
AAACwdAABAAAJGdAAL
AAACwdAABAAAJGdAAM
AAACwdAABAAAJGdAAN
Совет Хотя идентификаторы строк (ROWID) весьма важны для
обработки баз данных Oracle, от вас не требуется глубоких знаний о механизме
их работы. Более тщательное изучение ROWID предусматривается
программой первого экзамена ОСРпо основам администрирования баз данных.
Значения столбцов по умолчанию
Можно определить таблицы, столбцы которых будут автоматически
заполняться значениями по умолчанию, используя для этой цели фразу default
команды create table. Эта фраза включается в определение столбца, чтобы
дать понять Oracle, каким должно быть значение по умолчанию для этого
столбца. Когда мы добавляем в таблицу строку и для такого столбца не опреде-
Создание объектов базыданных Oracle
153
лено значение, Oracle заполнит элемент строки, соответствующий этому
столбцу, указанным при определении столбца значением. Этот момент
иллюстрируется следующим блоком кода:
йзиагаяа; SQL> create table display
2 (coll varchar2(10),
3 col2 number default 0);
Table created.
SQL> insert into display (coll) values ('MYCOL');
1 row created.
SQL> select * from display;
COL1 C0L2
MYCOL 0
Закрепление пройденного материала
1. Убедитесь, что можете назвать все типы данных, имеющиеся в Oracle.
Знайте формат дат, хранящихся в типе данных DATE, и что такое тип
данных ROWID.
2. Необходимо знать, как определяются столбцы типа NUMBER, и
понимать важность значений, специфицированных для общей длины и для
мантиссы числа. Знайте, что произойдет, если заносимое в столбец типа
NUMBER значение превышает указанную длину до и (или) после
десятичной точки.
3. Помните о разнице между типами данных LONG и CLOB, связанной с
тем, где хранятся данные по отношению к остальным данным таблицы.
4. Умейте описать различия между типами данных CHAR и VARCHAR2,
особенно связанные с тем, как в данных типа CHAR используются
дополнительные пробелы при записи текстовых строк.
5. Знайте о том, как используется фраза default в составе команды create
table.
Упражнения
1. Столбец PROFITS в составе таблицы SALES объявлен как NUMBER(10,2).
Какое из следующих значений нельзя будет записать в этот столбец?
А. 5392845.324 В. 871039453.1
С 75439289.34 D. 60079829.25
2. Служащий KING был принят на работу 17 ноября 1981 г. Вы задали
следующий запрос к базе данных Oracle: select vsize (hiredate) from emp
where ename = 'KING';. Какой из следующих вариантов ответа будет
правильным?
А. 4 В. 7
С. 9 D. 17
3. Вы определили в таблице SALES столбец PRODUCT_NAME, задав его тип
как CHAR(40). Позже вы добавили в эту таблицу одну строку со значением
"CATJTOYS" в столбце PRODUCTJNAME. Затем вы набрали следующую
команду: select vsize (product_name) from sales. Какой из следующих
ниже вариантов ответа лучше других описывает возвращенный результат?
А. 8 В. 12
С 40 D. 4000
4. Данные в столбцах типа LONG RAW, размер которых превышает 4 Кбайт,
хранятся относительно остальных данных.
154
Глава 5
5. Таблица JOB состоит из трех столбцов: JOB_NAME, JOB_DESC и
JOB_WAGE. В таблицу JOB вставляется новая строка с использованием
следующей команды:
SQL> insert into job (job_name, job_desc)
2 values ('LACKEY', "MAKES KOFFEE');
Затем вы задали запрос к этой таблице и получили следующие результаты:
SQL> select * from job where job_name = 'LACKEY';
JOB_NAME JOB_DESC JOB_WAGE
LACKEY MAKES C0FFEE3 35
Какой из следующих вариантов ответа правильно объясняет, каким
образом были переданы данные в значение JOBWAGE?
A. Строка таблицы JOB для значения LACKEY существовала ранее, и
значение столбца JOB_WAGE было равно 35.
B. При создании таблицы для столбца JOB_WAGE была использована
фраза default, определяющая присваиваемое столбцу по умолчанию
значение.
С Во фразе values оператора insert содержится скрытое значение,
добавляемое при вставке строки.
D. Единственным возможным объяснением является следующее: после
создания таблицы и добавления к ней интересующей нас строки был
выполнен оператор update, который и добавил значение
JOB WAGE.
Ответы
1. В. 2. В. 3. С. 4. совместно (inline) 5. В. Вариант D является некорректным, потому
что наши выходные данные могут быть получены или с помощью оператора update,
или с помощью фразы default.
Изменение определений таблиц
Предположим, что после того, как в Oracle была создана таблица,
обнаружилось, что имеется некоторый факт, который следует сохранить в таблице, но
вы про него забыли. Вы считаете, что это проблема? Вовсе нет! Можно с
легкостью модифицировать существующие таблицы, используя оператор alter
table. Имеется несколько базовых изменений, которые могут быть
выполнены с помощью этого оператора. Эти возможности перечислены ниже:
■ Можно добавить в таблицу дополнительные столбцы.
■ Можно модифицировать размер существующего столбца.
■ Можно удалять столбцы из таблицы (правда, только в Огас1е8/, Огас1е9/ и
более поздних версиях).
■ Можно добавить или модифицировать ограничения для столбцов
таблицы. Ограничения используются в Oracle для того, чтобы не дать
пользователям возможности вводить в таблицу неверные данные. Основное
обсуждение этого вопроса будет проведено позже в этой главе.
Совет Третий тип изменений, которые можно проделать с помощью
оператора alter table, связан с хранением таблиц в базе данных Oracle.
Этот вопрос является частью экзаменационной программы второго
экзамена ОСР для АБД. Поэтому при подготовке к первому экзамену ОСР мы не
затронем его.
Добавление к таблице новых столбцов
Команду alter table можно использовать для добавления к таблице новых
столбцов. Однако при этом существуют некоторые ограничения. Во-первых, в
Создание объектов базыданных Oracle
155
таблице не должно быть двух столбцов с одинаковыми именами. Во-вторых, в
таблице должно быть не более одного столбца типа LONG или LONG RAW. И
в-третьих, максимальное количество столбцов в таблице не должно
превышать 1000. Ниже показан пример оператора alter table:
tnnsi&ant SQL> alter table employee add (hire_date date);
Table altered.
Как уже упоминалось, в таблице должно быть не более одного столбца типа
LONG. Под это же ограничение подпадает и тип данных LONG RAW. Однако
для Огас1е8 и более поздних версий в одной таблице может иметься любое
количество столбцов типов BLOB, CLOB, NCLOB и BFILE. Иногда бывает
полезно эмулировать поведение Oracle в базах данных Огас1е7, где заводится
специальная таблица, содержащая столбец LONG, и внешний ключ к таблице,
где должен был размещаться этот столбец; это уменьшает объем миграции
данных и образование цепочки строк для базы данных.
Совет Образование цепочек строк и миграция строк происходят в тех
случаях, когда РСУБД Oracle приходится перемещать данные или разбивать их
на части внутри файлов на диске, из которых состоит база данных Oracle.
Эта деятельность входит в сферу интересов АБД, поскольку она может
нанести значительный ущерб производительности базы данных.
Модификация типов данных столбцов
Еще одним важным аспектом столбцов таблицы, который можно
модифицировать с помощью команды alter table, является конфигурация типов
данных столбцов. Предположим, что наша недавно образованная компания,
использующая новую таблицу EMPLOYEE, только что приняла на работу
женщину, которую зовут Марта Параваэини-Кларк (Martha Paravasini-Clark).
Вспомните, как в начале этой главы мы создали таблицу EMPLOYEE со
столбцом LASTNAME (фамилия), имеющим тип VARCHAR2(10). К
сожалению, фамилия нашей новой служащей (Paravasini-Clark) содержит 16
символов, так что нам потребуется изменить столбец LASTNAME, чтобы в него
можно было записывать более длинные текстовые строки. Чтобы разрешить
этот вопрос, достаточно задать следующий оператор, который увеличит длину
столбца LASTNAME:
*№&№№ SQL> alter table products modify (lastname varchar2(25));
Table altered.
Общее эмпирическое правило при модификации типов данных
существующих столбцов состоит в том, что увеличение длин строк не приводит к
возникновению проблем, а вот уменьшение длины — штука более коварная. Вот
несколько примеров операций, которые, вообще говоря, являются
приемлемыми:
■ Увеличение размеров столбцов типов VARCHAR2 и CHAR
■ Увеличение размеров столбцов типа NUMBER
Для уменьшения размеров типов данных столбцов обычно требуются
специальные шаги. Взгляните на следующий блок кода, где мы пытаемся
уменьшить размер столбца COL2 нашей таблицы TESTER:
ИМИ SQL> desc tester
Name Null? Type
C0L1 CHAR(10)С
C0L2 VARCHAR2(10)
SQL> alter table tester modify (col2 varchar2(5));
alter table tester modify (col2 varchar2(5))
ERROR at line 1:
ORA-01441: column to be modified must be empty to decrease length
(для уменьшения длины модифицируемого столбца он должен выть пустым)
156
Глава 5
SQL> create table tester_col2
2 (col2) as select col2 from tester;
Table created.
SQL> update tester set col2 » null;
1 row updated.
SQL> alter table tester modify (col2 varchar2(5));
Table altered.
SQL> update tester set col2 » (select col2
from tester_col2);
1 row updated.
Совет Вы уже знакомы с примерами действия каждого из примененных в
этом блоке кода операторов; вам известно, что такое подзапрос, так что
вас не должно смутить ничего из того, что было сделано в этом блоке кода.
Более подробно речь об операторе update будет идти в главе 6.
Давайте пройдемся по операторам предыдущего блока кода. Сначала мы
задали для таблицы TESTER оператор describe, чтобы понять, как был
описан столбец COL2. Затем мы попытались сократить его длину до 5 байт. Oracle
это не понравилось, поскольку в столбце COL2 содержались данные. Поэтому
нам пришлось скопировать все данные в столбец COL2 по временному адресу,
используядляэтогокоманду create table as select. Затем мы заменили на
NULL значения данных в том столбце, длину которого собираемся
уменьшить, и выполнили это изменение размера столбца. И наконец, мы добавили
данные наЬад в таблицу TESTER, используя для этого оператор update с
подзапросом. Ниже приводится несколько других допустимых операций,
следующих этому принципу:
■ Уменьшение размера столбца типа NUMBER (только для пустого по всем
строкам столбца)
■ Уменьшение длины столбцов типа VARCHAR2 или CHAR (только для
пустого по всем строкам столбца)
■ Изменение типа данных столбца (только для пустого по всем строкам
столбца)
Удаление столбцов в Oracle
Команду Oracle alter table можно использовать и для удаления столбцов.
Для этого имеется два способа. Первый из них — дать Oracle указание
игнорировать столбец, используя для этого фразу set unused column. В таком
случае из столбца таблицы не удаляется никакой информации. Oracle просто
делает вид, что этого столбца нет. Впоследствии можно будет удалить этот
столбец, используя фразу drop unused columns. В следующем блоке кода
показаны оба этих шага:
t№P$S№f SQL> alter table employee set unused column salary;
Table altered.
SQL> alter table employee drop unused columns;
Table altered.
Второй способ заключается в том, чтобы немедленно удалить из таблицы
столбец и все его содержимое. Оператор для этой цели показан в следующем
блоке:
«aassae» SQL> alter table employee drop column salary;
Table altered.
Совет Если вы выполняете все предлагаемые упражнения в базе данных
Oracle, удостоверьтесь, что вы не забыли вернуть столбец SALARY обратно
в таблицу EMPLOYEE, после того как испробовали оба предложенных
способа удаления столбцов. Мы еще не один раз вернемся к таблице
EMPLOYEE впоследствии.
Создание объектов базыданных Oracle
157
Закрепление пройденного материала
1. Убедитесь, что знаете, как с помощью фразы add добавлять столбцы,
используя оператор alter table.
2. Знайте, как модифицировать определения типов данных столбцов с
использованием оператора alter table с фразой modify.
3. Необходимо понимать оба способа использования команды alter table
для удаления столбцов: первый — с использованием синтаксиса set unused
column и drop unused columns и второй — с использованием синтаксиса
drop column.
Упражнения
1. Вы желаете уменьшить размер не-NULL столбца (то есть столбца, среди
значений которого не может быть значений NULL), описанного как
NUMBER(IO), до NUMBER(6). Какой из следующих шагов должен быть
выполнен после выдачи соответствующей команды alter table?
A. Скопировать записи столбца во временную память.
B. Задать для всех строк столбца NUMBER значения NULL.
C. Создать временную память для хранения значений данных типа
NUMBER.
D. Скопировать записи столбца из временной памяти обратно в главную
таблицу.
2. Вы задаете следующий оператор: alter table sales drop column
profit;. Какой из следующих вариантов определяет, когда в действительности
столбец будет удален из Oracle?
A. Немедленно после выполнения этого оператора
B. После того как будет задана команда alter table drop unused
columns
C. После того как будет задана команда alter table set unused
column
D. После того как будет задана команда alter table modify
3. Вы желаете увеличить размер не-NULL столбца, описанного как
VARCHAR2(5), до VARCHAR2(10). Какой их следующих шагов следует
выполнить после выполнения соответствующей команды alter table?
A. Установить этот столбец VARCHAR2 на NULL для всех его строк.
B. Создать временную память для хранения данных VARCHAR2.
C. Скопировать записи столбца из временной памяти обратно в
основную таблицу.
D. Ничего. Операция выполняется автоматически.
4. Вы хотите увеличить размер столбца PRODUCT_TYPE таблицы SALES,
объявленного как столбец VARCHAR2(5), до VARCHAR2(10). Какая из
следующих команд может оказаться для этого полезной?
A. alter table sales add (product_type varchar2(10));
B.alter table sales modify (product_type varchar2(10));
C. alter table sales set unused column (product_type
varchar2(10));
D. alter table sales drop column product_type;
158
Глава 5
Ответы
1. D. 2. А. 3. D. 4. В.
Удаление, переименование и усечение таблиц
Имеются некоторые дополнительные операции для модификации таблиц; они
разработаны для удаления таблицы, изменения ее имени или для удаления из
таблицы всех данных, при котором не затрагивается определение таблицы.
Давайте подробно рассмотрим действие каждой из этих операций.
Удаление таблиц
Давайте сначала научимся удалять таблицы.. Чтобы удалить таблицу из базы
данных, необходимо выполнить команду drop table:
«аюв»«£ SQL> drop table emp_copy_2;
Table dropped. '
Как упоминалось ранее, с таблицами ассоциированы некоторые объекты,
которые существуют в базе данных наряду с таблицами. К числу таких
объектов относятся индексы, ограничения и триггеры. Если таблица удаляется,
Oracle автоматически удаляет и все индексы, ограничения и триггеры,
ассоциированные с этой таблицей. Заслуживают отдельного упоминания еще два
фактора, связанные с удалением таблиц:
■ Действие команды roll back (откат) не распространяется на команду
drop table.
■ Таблица, которую вы желаете удалить, должна входить в состав вашей
схемы либо вы должны обладать привилегией drop any table.
Усечение таблиц
Давайте перейдем к обсуждению того, как можно быстро удалить из таблицы
все данные, используя для этого специальную опцию Oracle. В такой ситуации
АБД или разработчик может использовать оператор truncate table. Этот
оператор является частью языка определения данных (DDL) Oracle, каким,
например, является оператор create table, но не является оператор delete.
При усечении таблицы из нее быстро удаляются все данные строк, а
определение таблицы, в том числе все определения ограничений и любых других
ассоциированных с таблицей объектов типа индексов, триггеров и ограничений
для таблицы, остается незатронутым. Оператор truncate является
высокоскоростным оператором удаления данных из таблиц, который обходит
средства управления транзакциями, специально имеющееся в Oracle для
обеспечения восстанавливаемости изменений данных. Операция усечения таблицы
практически всегда проходит быстрее, чем выполняется операция delete без
фразы where; но после того как эта операция будет завершена,
восстановление стертых данных невозможно, если только у вас не имеется ранее
сделанной резервной копии данных. Приведем пример:
УЯЙШМ SQL> truncate table tester;
Table truncated.
Совет Усечение таблицы оказывает влияние на ее характеристику,
которая в Oracle называется высшей точкой (high-water mark). Эта
характеристика представляет собой значение, используемое Oracle для запоминания
наибольшего размера, который когда-либо имела эта таблица. Когда вы
усекаете таблицу, Oracle возвращает значение этой переменной к нулю.
Переименование таблиц
Для того чтобы в Oracle переименовать таблицу, имеются две команды: rename
и alter table rename. Обе эти команды позволяют изменить имя таблицы
Создание объектов базыданных Oracle
159
без какого бы то ни было реального физического перемещения данных внутри
базы данных. Использование этих команд демонстрируется следующим
блоком кода:
tsmnes&m SQL> rename tester to tester2;
Table renamed.
SQL> alter table testers rename to tester;
Table altered.
Комментирование объектов
С помощью команды comment можно добавлять комментарии к таблице или
столбцу. Это бывает полезно, особенно в больших базах данных, где вы
желаете, чтобы и другим были понятны некоторые моменты информации о таблице,
например о типе хранящейся в таблице информации. В следующем блоке
приводится пример комментария к таблице:
ЯИЯМИ SQL> comment on table employee is
2 'This is a table containing employees';
Comment created.
А вот пример того, как создается комментарий к столбцам таблицы:
гваитшж SQL> comment on column employee.empid is
2 'unique text identifier for employees';
Comment created.
Совет Информация из комментариев для таблиц хранится в объекте,
который называется USER_TAB_COMMENTS, в то время как аналогичная
информация для столбцов хранится в объекте, который называется
USER_COL_COMMENTS. Эти объекты являются частью словаря данных
Oracle. Подробнее о словаре данных Oracle речь пойдет в следующих главах
книги.
Закрепление пройденного материала
1. Необходимо понимать, как можно удалить таблицу из базы данных.
Убедитесь, что можете правильно описать, что происходит со всеми
ассоциированными с таблицей объектами (индексами, триггерами и ограничениями)
при ее удалении.
2. Проверьте, знаете ли вы, как переименовывать и усекать таблицы.
Вспомните, что такое высшая точка таблицы и как влияет на значение этого
показателя усечение таблицы. Умейте добавлять комментарии к таблице.
3. Удостоверьтесь, что представляете разницу между удалением и усечением
таблицы. При удалении таблицы из базы данных Oracle полностью
удаляются описание таблицы и все имеющиеся в ней данные. При усечении же
таблицы полностью удаляются все ее данные, но определение таблицы
сохраняется и остается готовым к последующему вводу новых данных.
Упражнения
1. Вы желаете изменить имя имеющейся в базе данных таблицы. Какой из
следующих вариантов ответа не определяет практичного способа, как это
можно сделать?
A. Используйте оператор create table as select; затем удалите
первоначальную таблицу.
B. Используйте команду rename.
C. Удалите таблицу; затем создайте ее заново с новым именем.
D. Используйте команду alter table rename.
160
Глава 5
2. Так называется объект базы данных, содержащий всю информацию из
комментариев для таблицы:
3. В базе данных Oracle удаляется таблица, являющаяся родительской
таблицей отношения "родитель-потомок". Какой из следующих объектов не
будет удален из базы данных после удаления родительской таблицы?
A. Ассоциированные ограничения
B. Столбец-потомок
C. Ассоциированные триггеры
D. Ассоциированные индексы
Ответы
1. С. 2. USER_TAB_COMMENTS. 3. На самом деле при попытке удалить
родительскую таблицу у вас возникнут проблемы, если для нее существует таблица-потомок.
Это связано с тем, что Oracle в принудительном порядке выполняет проверку
ограничений по внешнему ключу. Более подробно об этих ограничениях мы поговорим уже
в следующем разделе.
Включение ограничений
В этом разделе будут затронуты следующие темы, касающиеся включения в
базу данных ограничений:
■ Описание ограничений
■ Создание и поддержание ограничений
В наших предыдущих обсуждениях уже заходила речь об ограничениях. В
настоящем разделе мы расширим наше понимание ограничений — тех правил,
которые можно задать для таблиц базы данных Oracle с целью ограничения
значений данных, которые могут быть размещены в таблице. В этом разделе мы
узнаем много нового о различных типах ограничений, имеющихся в системах
Oracle. Также мы узнаем о том, как создавать и поддерживать ограничения,
определенные для базы данных Oracle. Кроме того, мы затронем вопросы о том,
как можно модифицировать и переопределять ограничения и манипулировать
ими. Обращаем ваше внимание: ограничения являются одним их наиболее
трудных для понимания вопросов, особенно если ранее вам не приходилось
сталкиваться с Oracle. Поэтому не торопитесь и продвигайтесь вперед только по
мере того, как разберетесь в уже прочитанном.
Описание ограничений
В базе данных Oracle ограничения выполняют три основные цели. Во-первых,
они создают реальные и гибкие взаимосвязи между несколькими таблицами,
которые образуют типичное приложение базы данных. Мы уже сталкивались с
этим при рассмотрении отношений таблиц "родитель-потомок". Во-вторых,
ограничения предохраняют от проникновения в базу данных (против вашей
воли) "нежелательных" значений. Мы заключили слово "нежелательные" в
кавычки, потому что определение того, что следует называть нежелательными
данными, в конечном счете является полностью произвольным и полностью
зависит от вашего желания, так как разработчиком системы являетесь вы
сами. Но вот что должно быть абсолютно ясно: ограничения поддерживают
целостность базы данных и не дают проникнуть в нее плохим данным. У
ограничений имеется и третья важная функция — они не позволяют удалять
данные в тех случаях, если между таблицами существуют зависимости.
Типы ограничений
Имеющиеся в Oracle основные типы ограничений перечислены в таблице 5.1.
Об этих типах ограничений рассказывается в последующих подразделах.
Создание объектов базыданных Oracle
161
Таблица 5.1. Ограничения в Oracle
Ограничение
Первичный ключ
(Primary Key)
Внешний ключ
(Foreign Key)
Уникальность
(Unique)
Проверка по списку
(Check)
He-NULL (Not NULL)
Описание
Оговаривает в качестве особого условия, что значения
фигурирующих в ограничении столбцов должны быть
уникальными и не-NULL. Если первичный ключ составлен из
значений нескольких столбцов, уникальной и не-NULL
должна быть комбинация значений этих столбцов.
Принудительно ставит условие, что в качестве значений
фигурирующего в ограничении столбца таблицы-потомка
может быть использовано только какое-либо из значений
первичного ключа родительской таблицы.
В принудительном порядке ставит условие уникальности
значений упомянутого в ограничении столбца.
В принудительном порядке ставит условие, что
добавляемые в проверяемый столбец значения должны
присутствовать в статическом списке значений, разрешенных для
этого столбца.
В принудительном порядке ставит условие, что в столбце
не могут встретиться пустые строки, то есть что любая
строка столбца должна иметь значение не-NULL.
Первичный ключ Ограничение подобного типа определяет столбец (или
столбцы), одиночное значение которого (или их комбинация) определяет
уникальность строк таблицы Oracle. Каждая строка таблицы должна иметь
некоторое значение, определенное с помощью столбца(ов) первичного ключа.
Вспомните таблицу ЕМР, которой мы широко пользовались в предыдущих
главах. В ней в роли такого уникального идентификатора каждой строки
таблицы выступал EMPNO. Следовательно, именно EMPNO является
первичным ключом этой таблицы, так как никакие два служащих не могут иметь
одинаковые значения номера служащего в столбце EMPNO. На языке
реляционных баз данных про другие столбцы таблицы ЕМР говорят, что они
являются функционально зависимыми от первичного ключа — EMPNO. Это,
по сути дела, означает, что каждый другой столбец описывает потенциально
неуникальный атрибут этой уникальной строки. Другими словами, может
быть несколько сотрудников с фамилией SMITH, но только у одного из этих
сотрудников значение EMPNO может быть равно 7369. На рис. 5.1 это
взаимоотношение изображено детально.
Рис. 5.1.
Ограничения
первичного ключа
в Oracle
Каждое значение —^
должно быть уникальным
и не-NULL
Первичный
ключ
Empno
,.7844
7369
Ename
Turner
Smith
Job
Salesman
Clark
Таблица ЕМР
Mgr
7698
7902
Hlredate
08/09/87
17/12/80
Sal
1.500
800
Comm
0
Dapt. no
30
20
4_
_v
Первичный ключ может состоять
из двух или более столбцов,
в таком случае уникальной
и не-NULL должна быть
комбинация их значений
162
Глава 5
Внешний ключ Ограничение этого типа означает наличие отношения
родитель-потомок на базе общего столбца между двумя таблицами. Ограничение
внешнего ключа автоматически устанавливается для общего столбца
таблицы-потомка, в то время как на общий столбец родительской таблицы также
автоматически устанавливается ограничение внешнего ключа. Если на общий
столбец таблицы-потомка наложено ограничение внешнего ключа, Oracle
делает проверку, имеется ли в общем столбце родительской таблицы
соответствующее значение. Обратите внимание, что при подобной проверке многие
значения из родительской таблицы могут и не появиться в таблице-потомке,
но каждое значение из таблицы-потомка должно ассоциироваться с
каким-либо значением в родительской таблице. На рис. 5.2 это
взаимоотношение изображено детально.
I'm-. 5.2.
Отношения внешнего
ключа в Oracle
Первичный
■гптч ^
Могут появиться
или не появиться ^
в таблице ЕМР
Г
<.
*Ч
deptno
10
20
30
40
Таблица DEPT
dname
Accounting
Research
Sales
Operations
kx
New York
Dallas
Chicago
Boston
Empno
7844
7369
Ename
TUrner
Smith
*
Родительская таблица
Job
Sa
(
esman
Mgr
7698
7902
Hiredate
08/09/67
17/12/80
Sal
1,500
800
Comm
0
Q
Deptno
a
2
D
Должно
иметься
в DEPT
Таблица-потомок (дочерняя таблица)
Ограничение уникальности Ограничение подобного типа принудительно
устанавливает уникальность для добавляемых в этот столбец значений.
Хорошим примером данных, для которых требуется ограничение по уникальности,
является номер карточки социального обеспечения или так называемый
"правительственный номер" служащего. Каждому служащему необходим такой
уникальный номер, например для уплаты налогов, так что мы должны будем
хранить его в таблице информации о служащих. Однако этот реквизит не
слишком подходит для использования в качестве первичного ключа таблицы с
информацией о пользователях, так как многие служащие хотели бы "закрыть"
свой номер карточки социального обеспечения или "правительственный
номер". Поэтому мы могли бы хранить их в базе данных, но применять к ним
ограничения уникальности, а не ограничения первичного ключа.
Ограничения проверки по списку Ограничения этого типа устанавливают
принудительное выполнение специфицированных статических критериев для
Создание объектов базыданных Oracle
163
добавляемых в столбец значений. Например, компания может использовать
ограничения проверки по списку для того, чтобы убедиться, что все вводимые
зарплаты служащих не превышают, например, 250000 долларов в год. Это
статическое значение можно легко сравнить с введенным в столбец значением.
Заметьте, как настойчиво мы повторяем слова "статические критерии". В
последующем обсуждении мы с вами узнаем, что скрывается за этими словами.
Совет Ограничения уникальности, внешнего ключа и проверки по списку не
являются препятствием для ввода в соответствующие столбцы значений
NULL.
Ограничения не-NULL Ограничения этого типа в принудительном
порядке препятствуют включению в столбец значений NULL. Это довольно
специфическое ограничение позволяет проверить, не является ли вводимое
значение значением NULL.
Закрепление пройденного материала
Убедитесь, можете ли вы идентифицировать все пять типов ограничений в
Oracle. Что касается ограничений первичного ключа, убедитесь, что можете
объяснить, что понимается под функциональной зависимостью между
столбцами таблицы и первичным ключом.
Упражнения
1. Этот тип ограничений используется для принудительного введения
уникальности значений столбца и не позволяет вводить в него значения NULL: _
8. Этот тип ограничений означает отношение "родитель-потомок* между
таблицей-потомком и другой таблицей:
3. Этот тип ограничений устанавливает принудительную проверку вводимых
значений столбца на соответствие некоторым предварительно
определенным статическим критериям: :
Ответы
1. Первичный ключ. Помните, что это ограничение устанавливает принудительную
уникальность значений столбца и не позволяет ввести значение NULL. 2. Внешний
ключ. 3. Проверка по списку.
Создание и сопровождение ограничений
Для определения ограничений существует два метода: метод ограничений
для таблиц и метод ограничений для столбцов. В чем заключается разница
между этими двумя методами? Можно сказать, что она состоит в
следующем: ограничение называется ограничением для таблицы, если синтаксис
фразы constraint появляется после определений столбцов и типов
данных. Ограничение называется ограничением для столбца, если синтаксис
фразы constraint появляется как часть определения индивидуального
столбца. Все ограничения могут быть заданы и как ограничения для
столбцов, и как ограничения для таблиц, за исключением двух случаев:
■ Ограничения не-NULL могут быть определены только как ограничения
для столбцов.
■ Ограничения первичного ключа, состоящие из двух или более столбцов
(известны под названием составного первичного ключа), могут быть
определены только как ограничения для таблиц. Однако ограничения
первичного ключа, состоящего из одного столбца, можно задавать как
ограничения любого типа.
164
Глава 5
Создание ограничений первичного ключа
Однако хватит об определениях. Давайте перейдем к делу и рассмотрим
несколько примеров определения ограничений первичного ключа. Рассмотрим
следующий листинг, в котором представлен оператор create table для
создания нашей собственной таблицы EMPLOYEE с использованием ограничений,
определенных как ограничения для таблиц (обратите внимание, что фраза
constraint выделена полужирным шрифтом):
дмяеааи SQL> create table employee
2 (empid varchar2(5),
3 lastname varchar2 (25),
4 firstname varchar2 (25),
5 salary number(10,4),
6 constraint pk_employee_01
7 primary key (vapid));
Table created.
Совет Если мы хотим создать составной первичный ключ, состоящий из
двух или более столбцов, мы должны перечислить имена этих столбцов в
круглых скобках, следующих за ключевым словом primary key.
Таблице разрешено иметь только один первичный ключ. Теперь
посмотрим, как будет выглядеть оператор create table для генерации той же самой
таблицы EMPLOYEE. На этот раз листинг демонстрирует определение
первичного ключа как ограничения для столбца. Фраза constraint в приведенном
ниже примере снова выделена полужирным шрифтом:
fl**™™ SQL> create table employee
2 (empid varchar2(5),
3 cone train t pk_amployee_01 primary key,
4 lastname varchar2(25),
5 firstname varchar2(25),
6 salary number(10,4));
Table created.
Совет В обоих методах определения ограничений мы можем
самостоятельно определять имена создаваемых ограничений. Помните, что такая
возможность представляется весьма полезной, поскольку ограничения
являются объектами, ассоциированными с таблицами, а из предыдущих обсуждений
мы знаем, что полезно давать ассоциированным объектам базы данных
сходные имена.
Обратите внимание на тот факт, что в предыдущих примерах
ограничениям первичного ключа были при определении присвоены содержательные
имена. Oracle настоятельно рекомендует, чтобы ограничениям назначались
именно такие осмысленные имена, чтобы впоследствии ограничения было легко
идентифицировать. Вы можете спросить, если между объявлениями
ограничений для таблиц и для столбцов имеется столько общего, то остаются ли
вообще какие-то различия между этими двумя определениями? Различия, конечно
же, имеются! Вспомните, что ограничения для составного первичного ключа
могут быть объявлены только с помощью синтаксиса ограничений для таблиц, а вот
ограничения не-NULL — только с помощью синтаксиса ограничений для
столбцов. Еще одно различие между этими определениями заключается в том, что
можно упростить определение ограничений, просто дав Oracle указание, что
мы желаем наложить на тот или иной столбец ограничение (выделено
полужирным шрифтом в следующем примере):
МЧЙИВУ SQL> create table department
2 (depaftment_num number(5) primary key,
3 department_name varchar2(25),
4 location varchar2(25));
Table created.
Совет Если вы подобным образом упрощаете определение ограничений для
столбцов, именование этих ограничений Oracle берет на себя. В
соответствии с соглашением об именовании имена ограничений имеют вид
SYS_Cnnnnn.
Создание объектов базыданных Oracle
165
Составные первичные ключи
Для того чтобы для экзамена ОСР понять природу составных ключей Oracle, в
следующем примере блока кода показано, как определить составной
первичный ключ:
HfflMWff SQL> create table names
2 (firstname varchar2(10),
3 lastname varchar2 (10),
4 constraint pk_names_01
5 primary key (firstname, lastname));
Table created.
Уникальность составного первичного ключа достигается путем
объединения значений всех столбцов составного первичного ключа. Если такая
комбинация оказывается уникальной, ключ будет уникальным. Познакомьтесь со
следующим блоком кода, где приведено еще несколько примеров:
АФ^Ш8? SQL> insert into names values ('JASON', 'COUCHMAN');
1 row created.
SQL> insert into names values ('JASON', 'LEE');
1 row created.
SQL> insert into names values ('COUCHMAN', 'JASON');
1 row created.
SQL> insert into names values ('JASON', 'COUCHMAN');
insert into names values ('JASON', 'COUCHMAN')
•
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_NAMES_01) violated
(нарушено ограничение по уникальности (SCOTT.PK_NAMES_01) )
Во втором операторе показанного примера мы добавили в таблицу строку с
именем и фамилией JASON LEE. Все прошло "на ура", хотя у нас уже имелась
запись со значением столбца FIRSTNAME JASON, потому что Oracle требует
уникальности только для сочетания значений FIRSTNAME и LASTNAME.
Следовательно, мы можем даже поменять значения этих столбцов местами,
что мы и сделали в третьем операторе. Однако четвертый оператор все-таки
привел нас к ошибке, потому что он является точной копией первого.
Определение ограничений внешнего ключа
Чтобы понять, как определяются ограничения внешнего ключа, давайте
рассмотрим пример. Предположим, у нас имеется собственная таблица с именем
DEPARTMENT, которую мы создали в предыдущем блоке кода. Она состоит
из полей с номером отдела, названием отдела и городом, где находится этот
отдел, для всех отделов нашей маленькой компании. Теперь предположим,
что мы желаем создать таблицу EMPLOYEE с еще одним столбцом, который
будет называться DEPARTMENT_NUM. Поскольку между этими двумя
таблицами существует неявное отношение "родитель-потомок" с общими
столбцами, давайте сделаем это отношение официальным, используя для этого
ограничение внешнего ключа, как это показано в следующем блоке:
HHtfMMK SQL create table employee
2 (empid varchar2(5) primary key,
3 lastname varchar2 (25),
4 firstname varchar2(25),
5 salary number(10,4),
6 department_num number(5)
7 references department (department_num)
8 on delete set null);
Table created.
Для того чтобы ограничение внешнего ключа было действительным,
одинаковые столбцы из обеих таблиц должны быть описаны в точности с
одинаковыми типами данных. Имена столбцов не обязаны быть одинаковыми, но
если вы сделаете именно так, это будет вовсе неплохо. Ограничение внешнего
ключа не позволяет записать в столбец DEPARTMENT_NUM таблицы ЕМР
166
Глава 5
значение, которого нет в соответствующем столбце таблицы DEPT.
Заключительная фраза on delete set null представляет опцию, управляющую
удалением данных из родительской таблицы. Если попытаться удалить из
родительской таблицы строку, на которую имеются ссылки из дочерней таблицы,
Oracle установит все такие значения в дочерней таблице в NULL. Другая
опция управления удалением имеет вид on delete cascade. В этом случае при
удалении записи из родительской таблицы Oracle позволяет удалить из
дочерней таблицы все ссылающиеся на нее записи.
А теперь потренируемся в различении ограничений для таблицы и для
столбца. Является ли ограничение внешнего ключа из предыдущего примера
ограничением для таблицы или ограничением для столбца? Сначала может
показаться, что оно выглядит как ограничение для таблицы, поскольку
определение ограничения появляется после описания всех столбцов. Однако более
тщательное изучение указывает на две важные особенности. Во-первых,
отсутствует фраза constraint. Определение ограничения для таблицы должно
содержать фразу constraint; в противном случае Oracle возвратит нам
ошибку. Во-вторых, отсутствует запятая, отделяющая определение ограничения от
остальных описываемых столбцов. Если вы возвратитесь к другим примерам
определения ограничений и внимательно просмотрите их, вы поймете, что в
этом примере показан внешний ключ, определенный как ограничение для
столбца, а не для таблицы.
Совет Ограничение внешнего ключа для дочерней таблицы не может быть
создано до тех пор, пока не будет создана родительская таблица и для нее
не будет определен первичный ключ.
Определение ограничений по уникальности
Пусть мы желаем, чтобы в нашей таблице служащих хранилась информация о
номерах карточек социального обеспечения и "правительственной" карты.
Если определить для столбца GOVT_ID ограничение уникальности
(UNIQUE), это предохранит от определения для любых служащих в таблице
дублирующих номеров "правительственной" карты. Взгляните на следующий
пример, где определение ограничения уникальности выделено полужирным
шрифтом:
ИВЙИ SQL> create table employee
2 (ampid varchar2(5) primary key,
3 lastname varchar2 (25),
4 firstname varchar2(25),
5 salary number(10,4),
6 department_num number(5)
7 references department (department_num),
8 govt_ld number(10) unique);
Table created.
Совет В отличие от первичных ключей, для которых требуется, чтобы
помимо своей уникальности значения столбца обязательно были не-NULL,
ограничение уникальности позволяет добавлять к столбцу значения NULL.
Это значит, что если для столбца установлено ограничение уникальности,
то уникальными должны быть только значения не-NULL.
Определение других типов ограничений
Нам осталось рассмотреть два типа ограничений: not NULL (не-NULL) и check
(проверка по списку). По умолчанию Oracle позволяет иметь в столбцах
значения NULL. Ограничение not NULL запрещает иметь в столбце, для которого
оно задано, значения null. Также по умолчанию запрещено значение NULL и
для первичных ключей. Во всех других столбцах могут иметься значения null,
если только это не запрещено явно с помощью ограничения not NULL.
Ограничения типа check позволяют проверить допустимость введенного значения
столбца по отношению к некоторым статическим критериям. К примеру,
можно указать, что в столбце SALARY не может быть значений, превышаю-
Создание объектов базыданных Oracle
167
щих 250 000 долларов. Если кто-то пожелает создать строку служащего с
заработной платой 1 000 000 долларов в год, Oracle возвратит сообщение об
ошибке, в котором будет сказано, что для столбца SALARY нарушено ограничение
check. Давайте взглянем на пример кода, в котором использованы оба типа
ограничений — not NULL и check (они выделены полужирным шрифтом):
шеав&яь SQL> create table employee
2 (empid varchar2(5) primary key,
3 lastname varchar2(25) not null,
4 firstname varchar2(25),
5 salary number(10,4) check (salary <= 250000),
6 department_num number(5)
7 references department (department_num),
8 govt_id number(10) unique);
Table created.
Совет Вот что понимается под словами "статический критерий" для
ограничений CHECK: ограничения типа CHECK могут сравнивать данные
из строк этого столбца с конкретным набором констант или операций над
этими значениями. Ограничение CHECK не может ссылаться ни на один
из столбцов этой или любой другой таблицы. Также запрещается
использование таких ключевых слов, как, например, user, sysdate, currval,
nextval, level, uid, userenv, rownum и rowid.
Индексы, создаваемые ограничениями
Для поддержки ограничений целостности, принудительно вводящих
уникальность, Oracle автоматически создает индексы. Двумя типами ограничений
целостности, обеспечивающими уникальность строк, являются ограничения
primary key и unique. Одновременно с объявлением ограничения
первичного ключа или по уникальности строится индекс по уникальности для
поддержки уникальности (отсутствия дубликатов) в столбце и в этот индекс
помещаются все значения во всех столбцах, которые были определены как части
ограничений первичного ключа или уникальности.
Имя автоматически создаваемых индексов для поддержки ограничений
уникальности и первичного ключа совпадает с именем самого ограничения.
Следовательно, если вы явно присвоили ограничению первичного ключа для таблицы
ЕМР имя PK_EMPLOYEE_01, то индекс по уникальности Oracle также назовет
PKJBMPLOYEE01. Если же вы не назначаете имени ограничения явно, Oracle
автоматически создаст для него имя и присвоит такое же имя индексу по
уникальности.
Совет Когда создается ограничение первичного ключа или ограничение по
уникальности, вместе с ними создается и соответствующий индекс по
уникальности для принудительного введения требующейся уникальности.
Добавление ограничений целостности
в существующие таблицы
Еще одним видом деятельности, которой вам, возможно, придется заняться,
является добавление новых ограничений в существующие таблицы. Это может
быть достаточно просто, если в таблице в этот момент отсутствуют данные, но
может превратиться просто в кошмар, если в таблице имеются данные и они
не удовлетворяют критериям новых ограничений. Проще всего, конечно,
добавлять ограничения в таблицу, пока в нее еще не вставлены данные.
Взгляните на следующий блок кода:
*Wg№B8 SQL> create table employee
2 (empid varchar2(5),
3 lastname varchar2(25),
4 firstname varchar2(25),
5 salary number(10,4),
6 department_num number(5),
"7 govt_id number(10));
Table created.
168
Глава 5
SQL> alter table employee add constraint
2 pk_employee_01 primary key (empid);
Table altered.
SQL> alter table employee add constraint
2 fk_employee_01 foreign key (department_num)
3 references department (departmertt_num) ;
Table altered.
SQL> alter table employee add constraint
2 ck_employee_01 check (salary <=250000);
Table' altered.
SQL> alter table employee add constraint
2 uk_employee_01 unique (govt_id);
Table altered.,
SQL> alter table employee modify
2 (lastname not null);
Table altered.
Обратите внимание, что все примеры следуют одной общей модели: alter
table имя_таблицы add constraint имя_ограничения тип (определение),
за исключением ограничения not NULL, для которого используется оператор
alter table modify, с которым мы познакомились при предыдущих
обсуждениях. Столбец, для которого добавляется ограничение, должен уже
присутствовать в таблице базы данных; невозможно создать ограничение для
несуществующего столбца таблицы. Ниже перечислены некоторые другие
оговорки, действующие при создании ограничений, если в таблице уже
имеются данные:
Ш Первичные ключи Столбцы не могут содержать значений NULL, все
значения должны быть уникальными.
■ Внешние ключи Столбцы из другой таблицы, на которые делаются
ссылки, должны содержать все значения, имеющиеся в нашей таблице; в
противном случае значение столбца должно быть NULL.
■ Ограничения уникальности Столбцы должны содержать только
уникальные значения, либо только значения NULL, либо их комбинацию.
■ Ограничения проверки по списку (CHECK) Новые ограничения будут
применены только к данным, добавляемым или модифицируемым после
создания ограничения.
Ш He-NULL В столбце не могут содержаться значения NULL. Если вы
желаете добавить в таблицу столбец с ограничением не-NULL, следует
использовать фразу default для идентификации значения, которым Oracle
может заполнить этот столбец для существующих строк. Если вы желаете
определить ограничение не-NULL для существующего столбца, он
должен быть пустым либо значение столбца для любой строки не должно
быть NULL.
Отключение ограничений
Ограничение можно включить и выключить. Когда ограничение отключено,
оно более не выполняет свою работу по принудительному выполнению
установленных правил для вводимых в таблицу данных. В приведенном ниже
блоке кода демонстрируются несколько простых операторов для отключения
ограничений:
ffWffiS? SQL> alter table employee disable primary key;
Table altered.
SQL> alter table employee disable constraint uk_employee_01;
Table altered.
Мы можем столкнуться с проблемой, если попытаемся отключить
ограничение первичного ключа, от которого зависят внешние ключи в других
таблицах. Эта проблема иллюстрируется следующим блоком кода:
Создание объектов базыданных Oracle
169
SQL> alter table department disable primary key;
alter table department disable primary key
*
ERROR at line 1:
ORA-02297: cannot disable constraint (SCOTT.SYS_C001913) -
dependencies exist
(невозможно отклонить ограничение (SCOTT.SYS_C001913) — существуют зависимости)
Если вы пытаетесь удалить первичный ключ, от которого зависят внешние
ключи других таблиц, необходимо как часть оператора alter table disable
constraint использовать опцию cascade, как это показано в следующем
блоке кода:
Ейа&вая SQL> alter table department disable primary key cascade;
Table altered.
Совет При отключении ограничения таблицы становятся уязвимыми для
ввода неверных данных! Необходимо принять меры предосторожности,
чтобы быть уверенным в том, чтд данные, загруженные в тот промежуток
времени, когда ограничения отключены, не помешают впоследствии снова
активировать действие ограничений. Фраза cascade отключает все
зависимые ограничения целостности. Отключение ограничения первичного ключа
или ограничения по уникальности приводит к удалению из Oracle
ассоциированных индексов.
Активация отключенных ограничений
Если впоследствии ограничения активируются снова, это приводит к
восстановлению принудительного выполнения правил, ранее определенных
для ограничения, делая ограничения такими же эффективными, как и при
их первоначальном добавлении к таблице. Активировать ранее
отключенное ограничение можно следующим образом:
tWSffiffiS SQL> alter table department enable primary key;
Table altered.
SQL> alter table employee enable uk_employee_01;
Table altered.
Совет Активировать с помощью подобного кода можно только такое
ограничение, которое ранее было успешно определено, а в настоящее время
является отключенным. Ограничение, создание которого завершилось
ошибкой, не будет существовать в отключенном состоянии и дожидаться, когда
вы решите возникшую проблему и активируете ограничение. При
активации ограничения по уникальности или ограничений первичного ключа
автоматически перестраиваются индексы для этих
ограничений.
Если существующие данные столбца нарушают отключенное
ограничение
Этот вопрос относится к разряду более трудных, так что следует иметь это в
виду. Бывают ситуации, когда вам по какой-либо причине может
понадобиться отключить действующее ограничение. К примеру, вы желаете отключить
ограничение первичного ключа, чтобы ускорить выполнение большого
количества операторов insert. Будьте предельно осторожны, если захотите
воспользоваться этим подходом\ Если вы отключите ограничение, а затем (при
отключенном ограничении!) загрузите в столбец таблицы данные, нарушающие
ограничения целостности, ваша попытка активировать ограничение с
помощью оператора alter table enable constraint завершится ошибкой. Вам
придется использовать специальную таблицу, которая называется
EXCEPTIONS (создается путем выполнения сценария utlexcpt. sql из
каталога rdbms/admin внутри базового каталога с программным обеспечением
Oracle), чтобы определить и исправить нарушающие ограничения записи.
170
Глава 5
Приведенный ниже пример с использованием ограничения первичного ключа
показывает, как все это работает:
SQL> @@C:\ORACLE\ORABl\RDBMS\ADMIN\UTLEXCPT
Table created.
SQL> create table example_l (coll number);
Table created.
SQL> insert into example_l values (10);
1 row created.
SQL> insert into example_l values (1);
1 row created.
SQL> alter table example_l add (constraint pk_01 primary key coll));
Table altered.
SQL> select * from example_l;
C0L1
10
1
SQL> alter table example_l disable constraint pk_01;
Table altered.
SQL> insert into example_l values (1);
1 row created.
SQL> alter table example_l enable constraint pk_01
2 exceptions into exceptions;
alter table example_l enable constraint pK_01
*
ERROR at line 1:
ORA-02437: cannot enable (SCOTT.PK01) - primary key violated
(не удается активировать (SCOTT.PK_01) — нарушен первичный ключ)
SQL> desc exceptions
Name Null? Type
ROW ID '
OWNER
TABLE NAME
CONSTRAINT
SQL> select e.row id,
2 from exceptions e,
3 where e.row id = a,
R0W_ID
AAAAvGAAGAAAAPWAAB
AAAAvGAAGAAAAPWAAD
a.coll
example 1 a
,rowi d;
COL1
1
1
ROWI DO
VARCHAR2I30)
VARCHAR2(30)
VARCHAR2(30)
К этому моменту мы идентифицировали ROWID строк-нарушителей в
таблице EXAMPLE_1, для которых не выполняется ограничение первичного
ключа. Эти ROWID можно использовать либо для модификации значения
одной из этих строк, либо для удаления одной из двух строк, чтобы сохранить
уникальность первичного ключа. В будущем, для того чтобы облегчить себе
процесс повторной активации ограничений, постарайтесь не загружать в
столбец, для которого были отключены ограничения, никакие данные, которые
нарушали бы правила этих ограничений.
Удаление ограничений
Обычно нет причин, по которым ограничения могли бы препятствовать
своему удалению, если, конечно, вы являетесь владельцем таблицы или вам
предоставлены для этой операции соответствующие полномочия. При удалении
ограничения автоматически удаляются все ассоциированные с этим
ограничением индексы (если, конечно, они имеются). Вот пример подобного удаления:
МИДЯН! SQL> alter table employee drop unique (govt_id) ;
Table altered.
SQL> alter table employee drop primary key cascade;
Table altered.
SQL> alter table employee drop constraint ck__employee_01;
Table altered.
При попытке отключить или удалить ограничения not null можно
столкнуться с аномалией. Нельзя отключить ограничение не-NULL как таковое —
столбец либо принимает значения NULL, либо не принимает их. Следовате-
Создание объектов базыданных Oracle
171
льно, во всех ситуациях, когда должны быть добавлены или удалены
ограничения не-NULL, можно использовать фразу alter table modify. А вот и
пример:
ВВД«ВИ8Я SQL> alter table employee modify (lastname null);
Table altered.
SQL> alter table employee modify (lastname not null);
Table altered.
Удаление родительских таблиц со ссылками
на ограничения внешнего ключа
Точно так же, как отключение ограничения первичного ключа может стать
проблемой в тех случаях, когда на него имеются ссылки из внешних ключей
дочерних таблиц, может стать проблемой и удаление самой родительской
таблицы, если в деле оказываются замешаны дочерние таблицы. Если мы желаем
удалить из отношения "родитель-потомок" родительскую таблицу
DEPARTMENT, внешний ключ дочерней таблицы EMPLOYEE может стать
для нас помехой. Посмотрим, что при этом происходит:
е83Ш2Э SQL> drop table department;
drop table department
*
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys
(на уникальные/первичные ключи таблицы ссылается внешние ключи)
Когда в других таблицах имеются ограничения, ссылающиеся на таблицу,
которую мы желаем удалить, можно использовать в операторе drop table
фразу cascade constraints. При этом вместе с таблицей, которую мы
желаем удалить, будут удалены и ссылающиеся на нее ограничения:
*^&<^иа SQL> drop table department cascade constraints,-
Table dropped.
Совет Вместо этого вы можете использовать для отмены или удаления
внешнего ключа из дочерней таблицы до того, как будет удалена
родительская таблица, описанный ранее в этой главе оператор alter table drop
constraint.
Отложенность ограничений в Oracle
Когда в таблицу базы данных добавляются записи, Oracle немедленно
выполняет проверку передаваемых на вход записей на соответствие всем
ограничениям, имеющимся для этого столбца таблицы. Если данные не соответствуют
критериям ограничения, Oracle немедленно возвратит сообщение об ошибке.
Однако можно так модифицировать это поведение по умолчанию, что Oracle
перестанет немедленно возвращать вам сообщение об ошибке. Вместо этого
можно предложить Oracle не сообщать об ошибке до тех пор, пока не будет
полностью завершена транзакция. Вспомните, в предыдущих обсуждениях мы
использовали термин "транзакция" для обозначения ряда выданных в рамках
сеанса пользователя операторов изменения данных, составляющих
логическую единицу работы. Позже, в главе 6, вы познакомитесь с обработкой
транзакций более подробно. Концепция вынуждения Oracle не возвращать
ошибок, связанных с нарушением ограничений, до завершения транзакции
называется откладыванием ограничений.
Для того чтобы начала работать отложенность ограничений, необходимо
определить ограничение как отложенное, используя синтаксис deferrable
initially deferred. Для ограничений первичного ключа и уникальности
это означает, что Oracle использует для хранения значений первичного ключа
неуникальный индекс вместо уникального. Неуникальный индекс дает
возможность временно хранить данные в столбце первичного ключа, пока не
будет завершена транзакция и можно будет сообщить о допущенных ошибках.
Если вы используете другую опцию отложенности — deferrable initially
172
Глава 5
immediate, Oracle по-прежнему для поддержки первичного ключа создает
неуникальный индекс, но приводит в действие первичный ключ уже при вводе
данных, не дожидаясь завершения транзакции. Тот же эффект будет
достигнут, если просто опустить обе эти фразы. Да, и не забудьте, пожалуйста, что
слово deferrable пишется с двумя буквами R, а не с одной.
Среди имеющихся в нашем распоряжении опций для активации и
отключения откладываемых транзакций следует назвать enable validate и
enable novalidate. Если вы попытаетесь активировать ограничение, не
специфицируя ни одну из этих опций, по умолчанию Oracle будет
использовать опцию enable validate. Использование при активации ограничений
этой опции заставляет Oracle проводить проверку всех данных в столбце с
наложенным ограничением, чтобы убедиться, что они удовлетворяют
критериям ограничения. Таково поведение по умолчанию, если только не указано
что-то другое. Команда enable validate приводит к такому же эффекту,
что и просто enable, — validate является поведением по умолчанию. Однако
Oracle также дает возможность использовать опцию enable novalidate, если
вы намерены проверять выполнение ограничений для вновь введенных
данных, не обращая внимания на те данные, что были введены ранее и уже
имеются в таблице.
Взглянем на пример. Предположим, что для хранения номенклатуры
продукции, продаваемой компанией, используется таблица PRODUCTS.
Приведенный ниже блок кода показывает, как создавать, отключать и активировать
откладываемое ограничение первичного ключа, используя для этого
выделенные полужирным шрифтом синтаксические конструкции:
/ЖЮШВ SQL> create table products
2 (product* numbed,
3 product_name varchar2(15),
4 quantity number,
5 color varchar2(10),
6 prod_size varchar2(10));
Table created.
SQL> Insert into products values
2 (1, 'FLIBBER', 34, 'GREEN', 'XXL');
1 row created.
SQL> insert into products values
2 (2, 'blobber', 4, 'GREEN', 'P');
1 row created.
SQL> select * from products;
PRODUCT* PRODUCT_NAME QUANTITY COLOR PROD_SIZE
1 FLIBBER3 34 GREEN XXL2
2 ЫоЬЬег4 4 GREEN P
SQL> alter table products add
2 (constraint pk_products_01 primary key (product*)
3 deferrable Initially deferred) ;
Table altered.
SQL> alter table products disable primary key;
Table altered.
SQL> update products set product* - 1
2 where product_name - 'blobber';
1 row updated.
SQL> commit;
Commit complete.
SQL> alter table products enable validate primary key;
alter table products enable validate primary key
*
ERROR at line 1:
ORA-02437: cannot enable (SCOTT.PK_PRODUCTS_01) - primay
key violated
(не удается активировать (SCOTT.PK_PRODUCTS_01) - нарушен первичный ключ)
SQL> alter table products enable novalidate primary key;
Table altered.
SQL> select * from products;
PRODUCT* PRODUCT_NAME QUANTITY COLOR PROD_SIZE
1 FLIBBER 34 GREEN XXL
1 blobber 4 GREEN P
Создание объектов базыданных Oracle
173
SQL> insert into products
2 (product#, product_name, quantity, color, prod_size)
3 values (1,"F^OBBER",23,"GREEN","L")
insert into products
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.EK_PRODUCTS_01) violated
(нарушено ограничение по уникальности (SCOTT.PK_PRODUCTS_01))
Совет disable novalidate действует аналогично disable; однако в
Oracle новинкой стала опция disable validate, которая отключает
ограничения, удаляет индексы и не допускает никаких изменений
ограничиваемого столбца. Если не указана опция novalidate, ключевое слово
enable означает validate. В свою очередь, ключевое слово disable означает
novalidate, если не указана явно опция validate.
Закрепление пройденного материала
1. Убедитесь, что можете идентифицировать различия между определением
ограничения как ограничения для таблицы и ограничения для столбца.
Знайте, как определить все пять типов определений для существующих
таблиц и как часть определения новой таблицы. Знайте, почему
определение ограничения не-NULL отличается от определения других типов
ограничений.
2. Знайте, как активировать отключенное ограничение. Убедитесь, что знаете
все оговорки при активации ограничений, а также знаете, как создается и
используется таблица EXCEPTIONS для активации ограничений, если в
таблице содержатся данные, нарушающие эти ограничения.
3. Убедитесь, что можете объяснить концепцию откладывания ограничений и
использование подходящего синтаксиса для определения, активации и
отключения откладываемых изменений.
4. Необходимо понимать, что для поддержки ограничений первичного ключа
и уникальности Oracle создает уникальные индексы. Знайте, что
определяет имена, присваиваемые автоматически создаваемым индексам.
Упражнения
1. У таблицы PROFITS нашей базы данных имеется первичный ключ на базе
столбцов PRODUCT_NAME и SALE_PERIOD. Какой из следующих
операторов не может быть использован для определения этого первичного
ключа?
A. create table profits (product_name varchar2(10),
sale_period varchar2(10), profit number, constraint
pkj>rofits_01 primary key(product_name,
sale_j>eriod));
B. alter table profits add constraint pk_j>rofits_01
primary key (product_name, sale_period) deferrable
initially immediate;
С alter table profits add (constraint pk_profits_01
primary key (product_name, sale_period));
D.create table profits (product_name varchar2(10)
primary key, sale_period varchar2(10) primary key,
profit number);
2. Вы определяете ограничения проверки по списку для таблицы SALES,
состоящей из двух столбцов — PRODUCT_TYPE и UNIT_SALES. Какие из
следующих вариантов ответа являются правильными определениями
ограничения проверки по списку? (Выберите два варианта.)
174
Глава 5
A.alter table sales add constraint ck_sales_01 check
(product_type in ('TOYS', 'HOT DOGS', 'PALM
PILOTS'));
B. alter table sales add constraint ck_sales_01 check
(product_type in (select product_type from
valid_products));
C.alter table sales modify (product_type varchar2(30)
check (product_type in ('TOYS', 'HOT DOGS', 'PALM
PILOTS')));
D. alter table sales add (product_name varchar2(30)
check (product_name 'AK-47'));
3. Используйте для ответа на вопрос следующий блок кода:
SQL> create Cable prices
2 ( product_name varchar2(30),
3 price number (10,4));
Table created.
SQL> alter table prices add constraint pk_prices_01
2 primary key (product_name);
Table altered.
SQL> insert into prices values ('DOGGY',499.99);
1 row created.
SQL> alter table prices disable constraint pk_prices_01;
Table altered.
SQL> insert into prices values ("DOGGY',449.99);
1 row created.
SQL> alter table prices enable novalidate pk_prices_01;
Что произойдет после попытки выполнить этот оператор?
A. Существующие элементы проверяются на предмет нарушений,
активируется ограничение PK_PRICES_01, и Oracle немедленно
проверяет выполнение ограничений для вновь вводимых элементов.
B. Существующие элементы проверяются на предмет нарушений,
ограничение PK_PRICES_01 не активируется, и Oracle не проверяет
немедленно выполнение ограничений для вновь вводимых элементов.
C. Существующие элементы не проверяются на предмет нарушений,
ограничение PK_PRICES_01 активируется, и Oracle немедленно
проверяет выполнение ограничений для вновь вводимых элементов.
D. Существующие элементы проверяются на предмет нарушений,
ограничение PK_PRICES_01 не активируется, и Oracle не проверяет
немедленно выполнение ограничений для вновь вводимых элементов.
4. Ваша попытка отменить ограничение приводит к следующей ошибке:
ORA-02297: cannot disable constraint — dependencies exist (не
удается отключить ограничение - существуют зависимости). Какой из
следующих типов ограничений, вероятно, служит препятствием для отмены
первого ограничения?
A. Проверка по списку
B. Ограничение не-NULL
С Ограничение внешнего ключа
D. Ограничение по уникальности
5. Вы собираетесь отменить ограничение не-NULL для столбца
UNIT_PRICE таблицы SALES. Какой из следующих вариантов выбора
идентифицирует правильный оператор для выполнения этого действия?
A. alter table sales modify (unit_prices null);
B. alter table sales modify (unit_prices not null);
С alter table sales add (unit_prices null);
D. alter table sales add (unit_prices not null);
Создание объектов базыданных Oracle
175
Ответы
1. D. 2. А и D. Ничто в этом вопросе не говорит о том, что вы не можете добавить
новый столбец. 3. В. Вы, конечно, помните, что, если ограничение невозможно активи-
ровать, оно не выполнит свою работу. 4. С. 5. А.
Резюме главы
Мы рассмотрели в этой главе огромный пласт основополагающих материалов.
Вначале мы обсудили, как создаются таблицы базы данных Oracle. Также мы
поговорили о том, как можно изменить описание таблицы. После обсуждения
того, как определяются и изменяются определения таблиц, касающиеся
столбцов, мы уделили много внимания ограничениям базы данных. Мы
познакомились с пятью типами ограничений базы данных, а также с тем, как их
создавать при первоначальном определении таблицы. Кроме того, мы узнали,
как создаются ограничения для существующих таблиц с использованием
команды alter table. Затем мы перешли к обсуждению индексов, которые
могут создаваться ограничениями. Мы рассмотрели вопрос об откладываемо-
сти ограничений и о том, как справляться с проблемами, возникающими, если
данные столбца нарушают установленные для него ограничения, — две
сложные темы, важные для сдачи ОСР.
Двухминутное погружение в пройденное
■ К основным типам отношений данных Oracle относятся первичные ключи
и функциональная зависимость в таблице, а также ограничения внешних
ключей от одной таблицы к другой.
■ Реляционная база данных состоит из объектов, в которых хранятся
данные, объектов, управляющих доступом к данным, и объектов,
повышающих производительность при доступе к данным.
■ Можно создавать таблицы с пятью различными типами ограничений
целостности: PRIMARY KEY, FOREIGN KEY, UNIQUE, not NULL И CHECK.
■ Для обеспечения целостности по ссылкам часто создаются отношения
"родитель-потомок" между двумя таблицами: родителем (таблицей, на
которую ссылаются) и дочерней таблицей (таблицей, из которой делаются
ссылки). Часто для указания на подобную связь оказывается полезным
соглашение об именовании, согласно которому требуется, чтобы дочерние
объекты принимали и расширяли имя родительской таблицы.
■ Для создания столбцов в таблицах доступны следующие типы данных:
CHAR, VARCHAR2, NUMBER, DATE, RAW, LONG, LONG RAW,
ROWID, BLOB, CLOB, NCLOB и BFILE.
■ Изменить или добавить столбец таблицы можно с помощью оператора
alter table.
■ Можно без труда добавлять столбцы, если для них разрешены значения
NULL, используя для этого оператор alter table add (имя_столбца
тип_данных). Если же желательно ввести ограничение не-NULL, следует
добавить столбец, заполнить его данными, а затем отдельно добавить
ограничение не-NULL.
■ Можно без труда увеличить размер типа данных столбца, используя для этого
оператор alter table modify (имя_столбца тип_данных). Можно также
уменьшить размер столбца или вообще изменить его тип данных, но только в
том случае, если в столбце для всех строк содержится значение NULL.
■ Ограничения для столбца могут быть добавлены только в том случае, если
содержащиеся в нем данные не нарушают добавляемого ограничения.
■ Ограничения первичного ключа (primary key) могут быть добавлены как
определения ограничения для таблицы с использованием оператора alter
176
Глава 5
table add (constraint имя_ограничения primary key (имя_стояб-
ца)) или как определения ограничения для столбца с использованием
оператора alter table modify(имя_сголбца constraint имя_ограниче-
ния primary key).
■ Ограничения по уникальности (unique) могут быть добавлены как
определения ограничения для таблицы с использованием оператора alter table
add (constraint имя_ограничения unique (имя_столбца)) или как
определения ограничения для столбца с использованием оператора alter
table modify(имя_столбца constraint имя_ограничения unique).
■ Ограничения внешнего ключа (foreign key) могут быть добавлены как
определения ограничения для таблицы с использованием оператора alter
table add (constraint имя_ограничения foreign key (имя_столб-
ца) references OWNER.TABLE (имя_столбца) [on delete cascade])
или как определения ограничения для столбца с использованием
оператора alter table modify (имя_столбца constraint имя_ограничения
references OWNER.TABLE (имя_столбца) [on delete cascade]).
■ Ограничения проверки по списку (CHECK) могут быть добавлены как
определения ограничения для таблицы с использованием оператора alter
table add (constraint имя_ограничения check (условие_провер-
ки)) или как определения ограничения для столбца с использованием
оператора alter table modify [имя_столбца constraint имя_огра-
ничения check (условие_проверки) ).
■ Условие проверки (check) не может содержать подзапросов, ссылок на
определенные ключевые слова (например, user, sysdate и rowid) или
так называемые псевдостолбцы.
■ Ограничения не-NULL могут быть добавлены с помощью определения
ограничений для столбца с использованием оператора alter table
modify (имя_столбца not NULL).
■ Именованные ограничения primary key, unique, check или foreign key
можно удалить с помощью оператора alter table drop constraint
шля_ограничения. Для удаления ограничения не-NULL используется
оператор alter table modify (имя_столбца NULL).
■ Если удаляется ограничение, которое автоматически создало индекс
(например, ограничение первичного ключа или ограничение уникальности),
соответствующий индекс также удаляется.
■ Если таблица удаляется, вместе с ней удаляются все ассоциированные с
ней ограничения, триггеры и индексы.
■ Для удаления из таблицы всех данных лучше всего использовать команду
truncate, а не оператор delete from table имя_таблицы, потому что
команда truncate сбрасывает в нуль значение "высшей точки" таблицы
и освобождает всю использовавшуюся таблицей внешнюю память, что
существенно повышает производительность операторов типа select
count ( ), заданных после усечения таблицы.
■ Имя объекта можно изменить с помощью оператора rename или
используя синонимы.
■ В связке с ограничениями первичного ключа и уникальности
автоматически создаются индексы. Имена индексам присваиваются в соответствии с
заданными в определении таблицы именами ограничений.
■ Таблицы создаются пустыми и не содержат данных, за исключением
случаев использования оператора create table as select. Эти таблицы
создаются и сразу же заполняются данными из другой таблицы.
Создание объектов базыданных Oracle
177
Вопросы для самопроверки
1. Этот тип ограничений полезен при контроле введенных в столбец данных
по статическому списку значений, заданному как часть определения
таблицы:
2. Этот тип данных используется для уникальной идентификации каждой
строки таблицы:
3. Определение этого объекта может быть сделано доступным любому
пользователю системы. Однако с его содержимым может познакомиться только
пользователь, добавляющий информацию в этот объект в рамках своего
сеанса:
4. Это ключевое слово для активации ограничений указывает, что Oracle не
будет проверять, соответствуют ли данные ограничениям, до тех пор, пока
пользователь не зафиксирует транзакцию:
5. Этот объект базы данных Oracle создается при определении первичного
ключа и удаляется при удалении таблицы:
Вопросы ко всей главе
1. При определении какого из перечисленных ниже ограничений
целостности автоматически создается индекс? (Выберите два.)
A. Внешний ключ
B. Ограничение по уникальности
C. Ограничение не-NULL
D. Первичный ключ
2. Разработчик ANJU выполняет следующий оператор: create table
animals as select * from master, animals;. Каким будет результат
выполнения этого оператора?
A. В схеме MASTER будет создана таблица ANIMALS с теми же
данными, что и в таблице ANIMALS, которой владеет ANJU.
B. В схеме ANIMALS будет создана таблица ANJU с теми же данными,
что и в таблице ANIMALS, которой владеет MASTER.
C. В схеме ANJU будет создана таблица ANIMALS с теми же данными,
что и в таблице ANIMALS, которой владеет MASTER.
D. В схеме ANIMALS будет создана таблица MASTER с теми же
данными, что и в таблице ANJU, которой владеет ANIMALS.
3. Между таблицами формально не существует никакой связи. Какой из
приведенных ниже вариантов ответа является самым сильным
индикатором того, что между этими таблицами существует отношение
"родитель-потомок"?
A. Эти две таблицы базы данных называются VOUCHER
и VOUCHERJTEM соответственно.
B. Эти две таблицы базы данных называются EMPLOYEE и PRODUCTS
соответственно.
C. Эти две таблицы базы данных были созданы в один и тот же день.
D. Эти две таблицы базы данных не содержат одинаковых столбцов.
4. Какие из приведенных ниже вариантов являются допустимыми типами
данных Oracle? (Выберите три варианта.)
A. CHAR
B. VARCHAR2
178
Глава 5
С BOOLEAN
D. NUMBER
E. NUMERIC
F. ROWNUM
Какая из строк следующего оператора приведет к появлению ошибки?
A. create table GOODS
B. (GO0DN0 number,
C. GOOD_NAME varchar2(20) check(GOOD_NAME in (select
NAME from AVAIL_GOODS)) ,
D. constraint PK_GOODS_01
E. primary key (GOODNO));
F. В этом операторе нет ошибок.
Вы добавляете столбцы в таблицу Oracle. Какой из следующих вариантов
указывает на то, что вы собираетесь увеличить число столбцов таблицы,
принимающих значения NULL?
A. Используйте оператор alter table.
B. Убедитесь, что для всех строк значения всех столбцов есть NULL.
C. Сначала увеличьте размеры смежных столбцов, а затем добавьте
новый столбец.
D. Добавьте столбец, заполните его значениями, а затем добавьте
ограничение не-NULL.
Пользователь задает оператор select count (*) from employee. Запрос
выполняется необычно долгое время и возвращает нулевое значение
счетчика. Что будет наиболее эффективным решением этой проблемы?
A. Сделать апгрейд оборудования.
B. Произвести усечение таблицы.
C. Обновить версию Oracle.
D. Удалить указатель высшей точки.
Как часть логической модели данных вы создаете несколько таблиц базы
данных. У какого из следующих ограничений появится ассоциированный с
ним автоматически сгенерированный Oracle индекс?
A. Ограничение по уникальности
B. Внешний ключ
C. Проверка по списку
D. He-NULL
Все приведенные ниже утверждения относительно ссылочной
целостности, кроме одного, справедливы. Укажите ошибочное утверждение.
A. Осуществляющий ссылку столбец дочерней таблицы должен
соответствовать первичному ключу в родительской таблице.
B. Все значения ссылочного столбца родительской таблицы должны
присутствовать в осуществляющем ссылку столбце дочерней таблицы.
C. Тип данных ссылочного столбца родительской таблицы должен быть
идентичен типу данных осуществляющего ссылку столбца дочерней
таблицы.
D. Все значения в осуществляющем ссылку столбце дочерней таблицы
должны присутствовать в ссылочном столбце родительской таблицы.
Создание объектов базыданных Oracle
179
10. Вы управляете ограничениями для таблицы Oracle. Какой из следующих
вариантов корректно определяет условия, присущие ограничениям
проверки по списку?
A. Значения должны быть получены из таблицы поиска.
B. Значения должны быть частью фиксированного набора,
определенного в операторе create table или alter table.
C. Значения должны использовать зарезервированные слова типа
SYSDATE или USER.
D. Столбец не может содержать значений NULL.
Ответы на вопросы для самопроверки
1. Проверка по списку
2. ROWID
3. Глобальная временная таблица
4. novalidate
5. Индекс
Ответы на вопросы ко всей главе
1. В и D. Ограничения по уникальности и первичные ключи
Объяснение Каждое вводящее уникальность ограничение для помощи при
выполнении этого процесса создает индекс. Два ограничения целостности,
которые принудительно вводят уникальность, — это ограничения по
уникальности и первичные ключи. Остальные ограничения целостности, типа
проверки по списку, не-NULL и внешнего ключа, не используют индексов для
введения целостности данных.
2. С. В схеме ANJU будет создана таблица ANIMALS с теми же данными, что
и в таблице ANIMALS, которой владеет MASTER.
Объяснение Вопрос требует пристального рассмотрения использованного
оператора create table и кое-каких знаний о создании таблиц. Во-первых,
таблица всегда создается в схеме создающего ее пользователя. Во-вторых,
поскольку использована фраза create table as select, варианты В и D
автоматически становятся некорректными, потому что оба они наряду с другими
вещами идентифицируют создаваемую таблицу, как нечто отличное от
таблицы ANIMALS. Вариант А идентифицирует схему, в которой будет создана
таблица ANIMALS как MASTER, что также некорректно по уже приводившимся
причинам. Дополнительную информацию можно найти в обсуждении
вопросов создания таблиц.
3. А. Эти две таблицы базы данных называются VOUCHER и VOUCHER_
ITEM соответственно.
Объяснение Этот вариант подразумевает использование соглашения об
именовании, аналогичного обсуждавшемуся в этой главе, в котором таблицам,
связанным соотношением внешнего ключа, присваиваются схожие имена. И
хотя полной гарантии того, что эти таблицы связаны, дать нельзя, именно этот
случай обеспечивает самую высокую вероятность. Вариант В подразумевает
использование того же самого соглашения об именовании, но поскольку
имена двух таблиц непохожи друг на друга, вероятность того, что они связаны
хотя бы каким бы то ни было образом, невелика. Вариант С некорректен,
потому что дата создания таблицы не имеет абсолютно никакого отношения к
той функции, которую эта таблица выполняет в базе данных. Вариант D
некорректен, поскольку две таблицы не могут быть связаны, если у них не
имеется общих столбцов. Отсылаем вас к обсуждению создания таблиц с исполь-
180
Глава 5
зованием ограничений целостности, соглашений об именовании и
построения модели данных.
4. А, В и D. CHAR, VARCHAR2 и NUMBER
Объяснение Единственным недопустимым типом данных в приведенном
списке является BOOLEAN. Хотя BOOLEAN является допустимым типом
данных в PL/SQL, в базе данных Oracle такой тип данных отсутствует.
Следовательно, нельзя создать столбец таблицы, который использовал бы данные
этого типа. Вернитесь к обсуждению разрешенных типов данных в
определениях столбцов.
5. С. G00G_NAME varchar2(20) check(G00D_NAME in (select NAME from
AVAIL_G00DS)),
Объяснение Ограничение проверки по списку не может содержать ссылки
на другую таблицу, а также не может ссылаться на виртуальный столбец типа
ROWID или SYSDATE. Все остальные строки оператора create table
синтаксически верны.
6. А. Используйте оператор alter table.
Объяснение Оператор alter table — это единственный из предлагаемых
вариантов, позволяющий увеличить число столбцов таблицы. Вариант В
некорректен, поскольку установка значений всех строк столбца в NULL делает только это
(установку) и ничего больше. Вариант С некорректен, так как увеличение
смежных столбцов всего лишь увеличивает их размер, а вариант D некорректен,
потому что перечисленные в нем шаги показывают, как добавить столбец с
ограничением не-NULL, — совершенно не то, о чем идет речь в вопросе.
7. В. Произвести усечение таблицы.
Объяснение Варианты А и С могут работать, но апгрейд аппаратных средств
и программного обеспечения, конечно, стоит намного больше, чем усечение
таблицы. Вариант D отчасти корректен, потому что изменение указателя
высшей точки — это именно то, что нам нужно. Однако такое изменение только
сбросит указатель высшей точки, а не устранит его полностью, поэтому мы
рекомендуем использовать команду truncate table.
8. А. По уникальности
Объяснение Только ограничения по уникальности и ограничения
первичного ключа требуют от Oracle генерировать индексы для поддержания
обязательной уникальности значений столбца. Ограничения внешнего ключа,
проверки по списку и не-NULL не требуют для своей работы наличия индексов.
Следовательно, варианты В, С и D некорректны.
9. В. Все значения ссылочного столбца родительской таблицы должны
присутствовать в осуществляющем ссылку столбце дочерней таблицы.
Объяснение Ссылочная целостность направлена от дочерней таблицы к
родительской, а не наоборот. В родительской таблице может иметься много
значений, которые не представлены в записях дочерней таблицы, но дочерняя
таблица должна соответствовать одной из записей в родительской таблице.
Поэтому правильным ответом в нашем случае будет ответ В.
10. В. Значения должны быть частью фиксированного набора, определенного
в операторе create table или alter table.
Объяснение Ограничения проверки по списку могут использовать только
фиксированные выражения, определенные вами при создании или изменении
таблицы с помощью определения ограничений. Использовать
зарезервированные слова типа SYSDATE и USER, а также значения из поисковой
таблицы не разрешается. Поэтому варианты А и С некорректны. И наконец,
значения NULL в столбце ограничиваются с помощью ограничения не-NULL,
относительно несложной формы ограничения проверки по списку.
Следовательно, вариант D также некорректен.
ГЛАВА 6
Манипулирование данными
Oracle
182
Глава 6
этой главе мы рассмотрим следующие вопросы, связанные с
манипулированием данными Oracle:
И Добавление новых строк в таблицу
И Выполнение изменений данных в существующих
строках
Ш Удаление данных из базы данных Oracle
■ Слияние данных в таблице Oracle
И Значение управления транзакциями
В предыдущих главах нам уже приходилось время от времени сталкиваться
с различными операциями манипулирования данными. И всякий раз мы
обещали рассказать, что означают эти операторы, но позже. И вот это время
настало. В этом разделе мы познакомим вас со всеми формами
манипулирования данными, приводящими к их изменению. В базах данных Oracle три типа
операторов манипулирования данными для их изменения занимаются
обновлением, удалением и вставкой данных. Собирательное название этих
операторов — язык манипулирования данными Oracle, или, как его чаще называют,
DML (сокращение английского названия — data manipulation language).
Совокупность операторов DML, образующих логическую единицу работы,
называется транзакцией. Мы рассмотрим также обработку транзакций — так
называется механизм, предоставляемый базой данных Oracle для облегчения
действий по изменению данных. Без развитого механизма обработки
транзакций Oracle не мог бы гарантировать, что изменения, производимые
различными пользователями, не будут накладываться друг на друга или что в результате
выборки данных они не будут получать данные, находящиеся в стадии их
изменения другим пользователем.
Добавление новых строк в таблицу
Первой мы собираемся обсудить операцию манипулирования данными,
приводящую к их изменению, которая представляет собой операцию по вставке в
таблицу новых строк. Как известно, сразу после создания таблицы данные в
ней отсутствуют, если только таблица не была создана и заполнена данными,
выбранными из другой таблицы. Но даже в этом случае данные должны
откуда-то взяться. Это самое "откуда-то" и есть пользователи, которые вводят
данные в таблицы с помощью операторов insert. Синтаксис оператора insert
отличается от синтаксиса оператора select. В самом общем случае синтаксис
оператора insert имеет следующий вид: insert into имя_таблицы (спи-
сок_стрлбцов) values (список_значений). Здесь имя_табльщы — это имя
той таблицы, в которую вы хотите вставить данные, список_столбцов — это
перечень столбцов, для которых вы хотите определить значения из
вставляемой записи, а список_значений — это перечень тех значений, которые вы
желаете определить. Тип данных, которые используются вами в качестве
значений в операторе insert, должен соответствовать типу данных для столбца,
определенного в соответствующем месте списка столбцов. Давайте с помощью
следующего блока кода вспомним состав определенной нами в главе 5
таблицы EMPLOYEE:
SQL> deso
Name
EMPID
LASTNAME
FIRSTNAME
SALARY
HIRE DATE
DEPT
employee
Null?
NOT NULL
NOT NULL
Type
VARCHAR2(5)
VARCHAR2 (25)
VARCHAR2(25)
NUMBER(10,4)
DATE
VARCHAR2(10)
Совет Мы решили иметь дело со своей собственной таблицей EMPLOYEE,
которую создали в главе 5, чтобы не изменять постоянно содержимое
таблицы ЕМР, поставляемой в каждом комплекте базы данных Oracle.
Манипулирование данными Oracle
183
Ниже приводятся три примера использования оператора insert для вставки
новых значений в эту таблицу:
«СИЯЯЕЯЖ SQL> insert into employee (empid, lastname, firstname,
2 salary, dept, hire_datej
3 values ('39334', 'SMITH', 'GINA', 75000, null, ■15-MAR-97■);
1 row created.
SQL> insert into employee (empid, lastname, firstname, salary,
2 dept, hire_date)
3 values ('49539', 'LEE', 'QIAN', 90000, '504A', '25-MAY-99');
1 row created.
SQL> insert into employee (empid, lastname, firstname, salary,
2 dept, hire_date)
3 values ('60403', 'HARPER', 'ROD', 45000, '504A', '30-APR-79');
1 row created.
Совет Если вы желаете работать с собственной базой данных, помните,
что ранее при обсуждении ограничений нами было создано несколько
различных версий таблицы EMPLOYEE. Поэтому нужно убедиться, что ваша
версия таблицы содержит все столбцы, перечисленные в приведенном выше
операторе describe, и использовать для нее все необходимые операторы al ter
table, прежде чем начать вставлять в нее данные.
Каждый из предшествующих операторов insert состоит из двух частей. В
первой части определяется таблица, в которую будут вставляться данные,
вместе с теми столбцами таблицы, куда будут вставлены значения. Во второй
части оператора определяются реальные значения данных для вводимой строки.
Эта часть оператора обозначается ключевым словом values. Обратите
внимание, как каждое значение из списка значений позиционно соответствует
определенному в списке столбцов столбцу. А если вы вспомните информацию,
описывающую таблицу, то заметите, что тип данных каждого из вводимых
значений соответствует тем типам данных, которые Oracle ожидает получить
для данного столбца. Проверьте также, не забыли ли вы заключить в
одиночные кавычки символьные данные и даты.
Вариации на тему
Oracle имеет возможность обрабатывать несколько вариаций оператора insert.
К примеру, вовсе не обязательно явно определять список столбцов таблицы.
Это необходимо делать только в тех случаях, когда вы не планируете
заполнить данными все столбцы вставляемой записи. Давайте взглянем на пример,
где мы не определяем столбцы явно, потому что намерены определить
значения для каждого столбца, имеющегося в таблице EMPLOYEE:
tfffftffifl8? SQL> insert into employee values
2 ('02039', 'WALLA', 'RAJENDRA', 60000, '01-JAN-96', '604B');
1 row created.
SQL> insert into employee values
2 ('49392', 'SPANKY', 'STACY', 100000, null, '604B');
1 row created.
SQL> insert into employee values
2 ('49394', 'SMITH', 'BOB', 50000, sysdate, '604B'),-
1 row created.
Совет Обратите внимание, как мы использовали NULL для того, чтобы
вставить во входные данные для пользователя SPANKY значение NULL
столбца HIKEDATE. Мы должны были поступить так, потому что Oracle
ожидала от нас явно определенных значений для каждого столбца таблицы.
Позиция, позиция, позиция
Как Oracle узнает, какие столбцы следует заполнять и какими данными? Ответ
простой — расположение. Расположение может влиять на таблицы в базе
данных Oracle; расположение данных в операторе insert должно соответствовать
расположению столбцов таблицы. Пользователь может определить порядок
размещения столбцов в таблице, используя команду describe или выходные
184
Глава 6
mssm
мтт
данные словарного представления USER_TAB_COLUMNS, упорядоченные
по столбцу COLUMN_ID с помощью фразы order by. Порядок, в котором
перечислены столбцы команды describe, — это тот порядок, в котором
должны быть расположены значения, подлежащие вставке в таблицу, если не
были явно указаны имена столбцов таблицы. Взгляните сами:
SQL> select column_name, column_id
2 from user_tab_columns
3 where table_name - 'EMPLOYEE'
4 order by column_id;
COLUMN NAME COLUMN ID
EMPID
LASTNAME
FIRSTNAME
SALARY
HIRE DATE
DEPT
SQL> describe
Name
EMPID
LASTNAME
FIRSTNAME
SALARY
HIRE DATE
DEPT
1
2
3
4
5
6
employee
Null?
NOT NULL
NOT NULL
Type
VARCHAR2(5)
VARCHAR2(25)
VARCHAR2(25)
NUMBER(10,4)
DATE
VARCHAR2(10)
Нельзя не отметить, что вставить в требующийся столбец данные
требующегося типа, используя совпадение положения значения в списке значений с
положением столбца в списке столбцов, не так легко, как кажется. Если тип
добавляемых в столбец данных не совпадает с типом данных, определенным
для таблицы, Oracle возвратит сообщение об ошибке. Посмотрим, что
получится, если мы попытаемся включить в столбец типа NUMBER текстовую
информацию:
SQL> insert into emp (empno, ename, sal)
2 values ('SMITHERS','7444, 900);
values ('SMITHERS',7444,900)
*
ERROR at line 2:
ORA-01722: invalid number
(недопустимое число)
К счастью, Oracle извещает нас о несовпадении типов данных, так что мы
можем выполнить корректировку вводимых данных. Но не всегда мы
оказываемся такими счастливчиками, особенно в тех случаях, когда тип вводимых
данных совпадает с тем типом, который Oracle ожидает для этого столбца, но
сами данные тем не менее некорректны. Вот еще один пример, в котором мы
случайно добавляем в таблицу ЕМР новую запись, где информация о работе
ошибочно помещается в столбец ENAME:
SQL> insert into emp (empno, ename, job, sal)
2 values (7444, 'LACKEY', 'SMITHERS', 900);
1 row created.
Мы с вами знаем, что LACKEY не является именем этого служащего, а его
(или ее) должность никоим образом не называется SMITHERS. Однако Oracle
не выработает сообщения об ошибке, так что если вы не будете внимательны,
вы постоянно будете загружать в свои таблицы массу никому не нужной
информации. Итак, мораль этой истории такова: будьте внимательны при
включении в таблицу новых записей, чтобы избежать ошибок, но будьте трижды
внимательны, чтобы избежать проблем при включении данных, которые не
вызывают ошибки, но при этом неверны контекстуально.
Еще одна вариация
Еще одной вариацией на тему оператора insert является опция,
позволяющая заполнять таблицу данными, полученными из другой таблицы с помощью
Манипулирование данными Oracle
185
оператора select. Подобный метод заполнения таблицы данными
аналогичен методу, используемому в операторе create table as select. В этом
случае можно полностью опустить фразу values. Однако правила
относительно положения столбцов вставляемых данных остаются применимыми и в этой
ситуации. Это значит, что, если вы можете выбрать данные для всех столбцов
таблицы, куда собираетесь вставить данные, вам не нужно перечислять их во
фразе insert into. Ниже приведен пример:
fajfff^lfS? SQL> insert into sgott.employee (select * from master.employee);
Совет Для того чтобы помещать данные в таблицу, требуется
специальная привилегия, предоставляемая владельцем таблицы тому пользователю,
которому требуется выполнить операцию insert. Более подробное
обсуждение объектных привилегий можно найти в главе 8.
Можно ли одновременно делать вставку данных
в несколько таблиц?
Иногда новичкам Oracle кажется, что поскольку имеется возможность с
помощью одной команды insert вставлять в одну таблицу несколько строк, то,
Наверняка, в Oracle имеется возможность, задав только одну команду insert,
вводить данные в несколько таблиц. Однако это было бы слишком запутанно
и для Oracle, и для вас. Всегда требуется явно указывать Oracle, какие данные в
какую таблицу вставляются. Так или иначе, но в подобных случаях всегда
проще задать два отдельных оператора insert. Следовательно, команду insert
можно использовать для добавления данных только в одну таблицу. Однако
имеется возможность добавления данных из другой таблицы, и мы с вами уже
видели, как выполняется подобная работа.
Вставка данных и ограничения целостности
Нельзя вставить в таблицу данные, если значение одного из столбцов
добавляемой записи нарушает установленные для этой таблицы ограничения
целостности. К примеру, если для создания таблицы ЕМР, которую мы
использовали в предыдущих обсуждениях, применяется сценарий utlsampl. sql, Oracle
построит для столбца EMPNO ограничение первичного ключа, чтобы
принудительно обеспечить уникальность значений этого столбца. Следующий блок
кода показывает, как отреагировал бы Oracle, если бы мы попытались вставить
в ЕМР строку для служащего SMITHERS, используя для него значение
EMPNO, уже определенное для служащего SMITH:
ГдЯ'УВг SQL> insert into emp (empno, ename, job)
2 values (7369, 'SMITHERS', 'LACKEY');
insert into emp (empno, ename, job)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_EMP) violated
Таким образом, при попытке добавить в таблицу новые данные,
нарушающие ограничения целостности для таблицы, Oracle возвращает сообщение об
ошибке. К тому же не забудьте, что ошибочная запись в базу данных при этом
не включается. Из следующего примера можно получить подтверждение, что
запись для служащего SMITHERS не была добавлена в базу данных и никоим
образом не перекрыла существующую запись для служащего SMITH:
fsffffiOTS SQL> select empno, ename, job
2 from emp
3 where empno ■* 7369;
EMPNO ENAME JOB
369 SMITH CLERK
Совет Для того чтобы вставить запись в таблицу с ограничением
внешнего столбца, необходимо сначала вставить новую строку в родительскую
таблицу, а уж затем вставлять новые строки в дочернюю(ие) таблицу(ы).
186
Глава 6
Явное специфицирование значений по умолчанию
Вспомните, что в главе 5 мы рассказали, что столбцы таблицы можно
определять вместе со значениями по умолчанию. Если в операторе insert для
конкретного столбца не указано вводимое значение, Oracle может заполнить этот
столбец, используя для этой цели определенное ранее значение столбца по
умолчанию. Чтобы напомнить, как все это работает, мы предлагаем
следующий пример, в котором мы определим таблицу, используя значения столбца
по умолчанию, затем введем в эту таблицу новую строку, естественно,
пропустив этот самый столбец, а затем посмотрим, что у нас получилось:
SQL> create table sample
2 (coll number,
3 col2 varchar2(30) default "YOU FORGOT MEM;
Table created.
SQL> insert into sample (coll) values (1);
1 row created.
SQL> select * from sample;
C0L1 C0L2
1 YOU FORGOT ME
Из предыдущего блока кода видно, что Oracle автоматически заполняет
столбец, для которого мы "забыли" ввести значение. Можно использовать эту
функцию явно, указав в операторе insert ключевое слово default. Взгляните
на следующий пример и сразу поймете, что и как нужно для этого сделать:
КЖИДИК SQL> insert into sample (coll, col2) values (2, default);
1 row created.
SQL> select * from sample;
C0L1 C0L2
1 YOU FORGOT ME
2 YOU FORGOT ME
Закрепление пройденного материала
Вспомните, как записывается оператор для помещения новых записей в базу
данных Oracle. А как записываются известные вам производные формы этого
оператора?
Упражнения
1. Вы добавляете данные в таблицу PRODUCTS базы данных Oracle. В этой
таблице имеются три столбца: PRODUCT_NAME, PRODUCT_TYPE и
PRICE. Какой из нижеследующих вариантов не определяет правильно
оформленный оператор insert для этой таблицы?
A- insert into products (product_name, product_type,
price) ('BARNEY DOLL', 'TOYS', 49.99);
B. insert into products (product_name, product_type,
price) values ('BARNEY DOLL', 'TOYS', 49.99);
C.insert into products values ('BARNEY
DOLL', 'TOYS', 4 9.99);
D. insert into products (select product_name,
product_type, price from master_products);
2. Ознакомьтесь со следующим оператором:
insert into SALES values ('BARNEY DOLL', '31-MAR-93', 29483854.39);
В каком из следующих вариантов приведен оператор, которым нельзя
воспользоваться для проверки того, в надлежащие ли столбцы помещена
введенная информация?
Oracle!)/
■ более поздних
версий
Манипулирование данными Oracle
187
A. select * from sales;
B. select column_name, column_id from all_tab_columns
where table_name = 'SALES';
С describe sales
D. select columrwiame, column_position from
all_ind_columns where table_name = 'SALES';
3. Отсутствие в операторе insert фразы values означает, что этот оператор
содержит .
4. Это ключевое слово позволяет нам дать Oracle явное указание заполнять
столбец его значением по умолчанию: .
Ответы
1. А. 2. Р. 3. подзапрос. 4. default
Выполнение изменений данных
в существующих строках
Манипулирование данными в Oracle не заканчивается после того, как они
были введены в базу данных. Очень часто бывает необходимо изменить
строку с данными таблицы. Для того чтобы произвести подобные
изменения, используется оператор update. Изменения могут быть произведены
для любой строки, за исключением двух случаев. Первый из них — это
отсутствие у вас необходимых привилегий доступа для обновления данных.
Подробнее познакомиться с привилегиями доступа можно будет в главе 8.
Второй случай — это когда ту строку, которую собираетесь изменить вы,
уже изменяет другой пользователь. Об этой ситуации будет подробно
рассказано в разделе "Значение управления транзакциями" в конце настоящей
главы.
Во всех остальных случаях данные можно изменить, используя для этого
оператор update, как это показано в следующем примере:
«а^виа»! SQL> update employee set salary - 99000
2 where lastname ■ 'SPANKY';
1 row updated.
Типичный оператор update состоит из трех фраз:
■ Фраза update, в которой называется подлежащая обновлению таблица.
■ Фраза set, в которой перечисляются все подлежащие обновлению
столбцы и назначаются их новые значения.
■ Фраза where (необязательная), в которой приводится одна или несколько
операций сравнения, определяющих, какие именно строки таблицы будут
обновлены Oracle. При пропуске фразы where в операторе update
изменению будут подвергнуты все имеющиеся на момент выполнения
оператора строки таблицы. Для изменения только определенных строк
необходимо использовать фразу where.
Расширенные возможности изменения данных в Oracle
Имеется возможность, используя только один оператор update, изменять
данные из нескольких столбцов таблицы. Кроме того, в операторе update
можно использовать подзапросы. В следующем блоке кода иллюстрируются
обе эти возможности:
ИЯИИИ SQL> update employee
2 set fizrstname - 'ATHENA', lastname - 'BAMBINA'
3 where empid - '49392';
1 row updated.
168
Глава 6
SQL> update employee
2 set lastname - (select ename from emp where empno = 7844)
3 where empid - '4 9392';
1 row updated.
Можно ли одновременно обновлять данные
из нескольких таблиц?
Как и команда insert, команда update позволяет нам одновременно вносить
изменения в данные только одной таблицы. Причины, главным образом,
остаются теми же. Ведь если бы такая возможность была разрешена, вам
пришлось бы указывать, какие столбцы из каких именно таблиц вы желаете
изменить, и этот дополнительный уровень глубины детализации сделал бы
оператор update слишком обременительным и сложным.
Изменения данных и ограничения целостности
Производимые изменения данных не могут нарушать определенные для
таблицы ограничения целостности. К примеру, нельзя изменить значение,
установленное для столбца EMPNO таблицы ЕМР, если это изменение приведет к
появлению в столбце дублирующих значений. Если вы попытаетесь
выполнить такое изменение, Oracle возвратит сообщение об ошибке и не выполнит
изменение. Однако будьте очень внимательны к вопросам, связанным с
контекстом, о которых мы упоминали в обсуждении команды insert. Кроме
того, если вы собираетесь изменить запись родительской таблицы, для
которой имеются ссылающиеся на нее записи в дочерней таблице, в том случае,
если в результате выполнения этого изменения в дочерней таблице возникнут
так называемые "осиротевшие" записи, Oracle возвратит сообщение об
ошибке и не позволит произвести такое обновление. Необходимо сначала
модифицировать записи в дочерней таблице и только затем переходить к
модификации записей в родительской таблице.
Использование ключевого слова default
Можно воспользоваться ключевым словом default, чтобы сделать значение
столбца равным установленному для него значению по умолчанию. Для этого
достаточно указать имя столбца, значение по умолчанию для которого вы
желаете использовать, в сочетании с ключевым словом default. В следующем
примере мы воспользуемся определенной в одном из предыдущих
обсуждений, связанных с применением ключевого слова default в операторе insert,
таблицей SAMPLE. Взгляните на пример:
fflf*^ftl№ SQL> inseI:t into sample (coll, col2) values (3, 'NO I DID NOT');
1 row created.
SQL> select * from sample;
C0L1 C0L2
1 YOU FORGOT ME
2 YOU FORGOT ME
3 NO I DID NOT
SQL> update sample set col2 ■* default where coll = 3;
1 row updated.
SQL> select * from sample;
C0L1 C0L2
1 YOU FORGOT ME
2 YOU FORGOT ME
3 YOU FORGOT ME
Закрепление пройденного материала
Необходимо знать, как используются для изменения данных в таблицах Oracle
операторы update. Необходимо понимать назначение двух обязательных
фраз — update и set, а также необязательной фразы where. Кроме того, еле-
Манипулирование данными Oracle
189
дует уметь использовать в операторах update ключевое слово default, чтобы
явно заполнить столбец его значением по умолчанию.
Упражнения
1. Вы обновляете данные в таблице Oracle. Какое из следующих утверждений
точнее всего описывает, какие средства можно использовать во фразе
where оператора update?
А- Можно использовать любые выражения, за исключением
однострочных функций.
B. Можно использовать любые выражения, за исключением
подзапросов.
C. Можно использовать любые выражения, за исключением выражений
in.
D. Можно использовать любые выражения без каких бы то ни было
ограничений.
2. Вы обновляете данные в таблице Oracle. Какой из следующих вариантов
ответа определяет ключевое слово, указывающее на столбцы, значения
которых вы желаете изменить?
A- update B. set
С where D. order by
Ответы
1. D. 2. В.
Удаление данных из базы данных Oracle
Удаление данных из базы данных Oracle — это такой же эпизод из жизни
данных, как и помещение их в базу данных. В SQL*Plus для удаления строк
данных из таблиц используется оператор delete. Синтаксис оператора delete
иллюстрируется следующим блоком кода. Обратите внимание, что в этом
примере мы не можем удалить данные из определенных столбцов таблицы; для
этого следует использовать оператор update, причем "удаляемым" столбцам
следует присвоить значение NULL:
&&эшж SQL> delete from employee where lastname - 'TURNER';
1 row deleted.
Как и в случае с обновлением базы данных, в операторе delete
используется фраза where, призванная помочь определить, какие именно строки вы
желаете удалить. Как и в операторах update и select, фраза where оператора
delete может содержать любые типы операций сравнения, операции
диапазона, подзапросы и любые другие операции, являющиеся допустимыми для
фразы where. Подобно оператору update, если в операторе delete
пропущена фраза where, удалению будут подвергнуты все строки таблицы.
Совет Следует очень внимательно относиться к удалению данных.
Восстановление данных, которые были ошибочно удалены из базы данных,
может оказаться довольно дорогим удовольствием. Поэтому привилегии для
удаления информации следует предоставлять только тем пользователям,
которые действительно заслужили право удалять записи из таблицы.
Не забывайте о фразе where!
Сколько бы ни говорили о важности использования в операторе delete
фразы where, это никогда не будет лишним! Если мы пропустим эту фразу, мы
удалим все строки нашей таблицы. Если же эта фраза не будет нами пропуще-
190
Глава 6
на, мы сможем удалить только конкретные строки, удовлетворяющие
заданным в команде критериям. Давайте рассмотрим пример команды delete, где
мы используем фразу where для ограничения удаляемых данных несколькими
конкретными записями:
IWiSHB SQL> delete from emp where deptno - 20;
5 rows (
SQL> se.
EMPNO
7499
7521
7654
7696
7762
7839
7644
7900
7934
9 rows
deleted.
lect empno,
ENAME
ALLEN
WARD
MARTIN
BLAKE
CLARK
KING
TURNER
JAMES
MILLER
selected.
, ename, jc
JOB
SALESMAN
SALESMAN
SALESMAN
MANAGER
MANAGER
PRESIDENT
SALESMAN
CLERK
CLERK
Теперь посмотрим, что произойдет, если в предыдущем примере мы
пропустим в команде delete фразу where:
«ДЯВЗКве SQL> delete from emp;
14 rows deleted.
SQL> select * from emp;
no rows selected ,
Можно ли одновременно удалять данные
из нескольких таблиц?
Удаление данных из базы данных с помощью команды delete может, вообще
говоря, оказаться довольно опасным делом, так как для восстановления того,
что было удалено по ошибке, могут потребоваться значительные усилия и
остановка работы базы данных. По этой причине, равно как и по причинам, о
которых мы уже говорили при рассмотрении операторов insert и update,
Oracle не разрешает в одном операторе delete удалять данные из нескольких
таблиц.
Удаление данных и ограничения целостности
Можно удалять данные из таблицы, не обращая внимания на ограничения
целостности для этой таблицы, с одним небольшим исключением. Нужно быть
очень внимательным при удалении записей из родительской таблицы, на
которую наложено ограничение внешнего ключа. Если удаление вами записей из
родительской таблицы приводит к возникновению в дочерней(их) таблице(ах)
записей-"сирот" (записей, для которых отсутствуют соответствующие им
записи родительской таблицы), Oracle возвращает сообщение об ошибке и не
позволяет провести такое удаление. Необходимо сначала провести удаление
записей в дочерней таблице, а уже потом удалять записи из родительской
таблицы.
Закрепление пройденного материала
Убедитесь, что понимаете, как следует использовать операторы delete для
удаления данных из таблиц Oracle. Кроме того, вспомните, как используется
обязательная фраза delete from и необязательная фраза where.
Упражнения
1. Так называется фраза, с помощью которой в операторе delete
определяются подлежащие удалению строки таблицы:
Манипулирование данными Oracle 191
2. Вы хотели бы удалить данные из столбца PROFITS таблицы SALES для
всех строк, где значение столбца PRODUCTTYPE установлено в TOYS'.
Какой из следующих вариантов ответа верно указывает, как можно
выполнить такое задание?
A- delete from sales where product_type = 'TOYS';
B. delete profits from sales where product_type = 'TOYS';
С update sales set profits = NULL where product_type
= 'TOYS';
D. delete from sales;
Ответы
1. where 2. C.
Слияние данных в таблице Oracle
Рассмотрим следующий сценарий. Скажем, вы управляете кинотеатром,
входящим в состав общенациональной сети кинотеатров. Каждый день из
штаб-квартиры корпорации рассылается информация о репертуаре, которую
необходимо ввести в цифровое информационное табло, установленное в
каждой билетной кассе. В состав этой информации входит перечень всех
фильмов, которые будут показываться в кинотеатре, вместе с расписанием сеансов.
Информация о времени показа фильмов для всех имеющихся фильмов
изменяется ежедневно. Давайте создадим пример, используя приведенный ниже
блок кода:
fa*f>»a^ffa SQL> create table movies
2 (movie_name varchar2(30),
3 showtime varchar2(30),
4 constraint pk_movies primary key (movie_natne));
Table created.
SQL> insert into movies ("GONE WITH THE WIND', "6:00 PM');
1 row created.
SQL> select * from movies;
MOVIE NAME SHOWTIME
GONE WITH THE WIND 6:00 PM
Каждую неделю в подборку добавляются новые кинофильмы и изменяется
расписание показа всех фильмов. В прошлых версиях SQL Oracle было
невозможно справиться с подобной ситуацией. К примеру, если вы пытались
сначала вставить (insert) в таблицу MOVIE новые записи для добавляемых
фильмов, а затем обновить (update) существующие записи, изменяя в них время
показа, Oracle выдавал ошибку либо для команды insert (для существующих
фильмов), либо для команды update (для новых фильмов). Взгляните на
следующий пример, где мы пытаемся добавить новую запись для фильма GONE
WITH THE WIND, даже если эта запись уже существует в нашей таблице:
*&*ея*Ж SQL> insert into movies ('GONE WITH THE WIND', '7:30 PM');
insert into movies ('GDNE WITH THE WIND', '7:30 PM')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_EMP) violated
(нарушено ограничение по уникальности (SCOTT.PK_EMP))
Чтобы избежать ошибок, вам следовало составить программу на PL/SQL. В
этой программе можно было использовать условный оператор для проверки
наличия строки, если нужно было изменить время показа существующего
фильма, или просто добавлять новую строку, если этот фильм ранее не
демонстрировался.
Огас1е9/
и более поздних
версий
192
Глава 6
Команда merge: концепция
Однако теперь, с появлением Огас1е9/, мы можем использовать для
выполнения подобной работы команду merge. Команда merge имеет следующий
синтаксис: merge into иыя_таблицы_1 using имя_таблицы_2 on (усло-
вие_соединения) when matched update set имя_столбца_1 value
when not matched insert (список_столбцов) values (значе-
ния_столбцов). Компоненты оператора работают следующим образом:
1. Во фразе merge into имя_таблицы_1 вы определяете таблицу, в которую
собираетесь обновлять данные из существующих строк или добавлять
новые данные для ранее не существовавших строк.
2. Во фразе using имя_таблицы_2 вы определяете вторую таблицу, из
которой будут браться строки, с помощью которых можно определить, имеются
ли уже данные для обновления. Это может быть та же таблица, что и
иыя_таблицы_1, или другая таблица. Однако, если иыя_таблицы_1
совпадает с имя_таблицы_2 или если у этих таблиц имеются одинаково
называющиеся столбцы, необходимо использовать псевдонимы таблиц и
предварять все ссылки на имена столбцов точным указанием имени таблицы. В
противном случае Oracle возвратит сообщение об ошибке, извещающее о
том, что ссылки на столбцы определены неоднозначно.
3. Во фразе on (условие_соединения) вы определяете условия соединения,
связывающие воедино обе таблицы. Условия соединения подчиняются тем
же требованиям, что и при соединении таблиц (см. главу 3). Это означает,
что вы должны задать как операторы сравнения по равенству, чтобы
избежать возникновения декартовых произведений, так и какие-то
условия-фильтры, чтобы отсеять не требующиеся данные. Если во фразе using
имя_таблицы_2 совпадает с иыя_таблицы_1 из фразы merge into или
если у двух таблиц имеются совпадающие (по имени) столбцы, необходимо
при ссылках на столбцы в условиях соединения или фильтрации
использовать псевдонимы таблиц или синтаксис типа таблица. столбец. В
противном случае Oracle возвратит сообщение об ошибке, извещающее о том, что
ссылки на столбцы определены неоднозначно.
4. Во фразе when matched then update set имя_столбца_1 value
определяется столбец (столбцы), который должен обновить Oracle в первой
таблице, если обнаружено совпадение со второй таблицей. Если во фразе
using имя_таблицы_2 совпадает с иыя_таблицы_1 из фразы merge into
или если у двух таблиц имеются совпадающие (по имени) столбцы,
необходимо при ссылках на столбцы в условиях соединения или фильтрации
использовать псевдонимы таблиц или синтаксис типа таблица.столбец.
В противном случае Oracle возвратит сообщение об ошибке, извещающее о
том, что ссылки на столбцы определены неоднозначно.
5. Во фразе when not matched then insert (список_столбцов) values
(значения_столбцов) вы определяете, что именно Oracle должна
вставить в первую таблицу, если во второй таблице не будет найдено
совпадения. Если во фразе using имя_таблицы_2 совпадает с имя_таблицы_1 из
фразы merge into или если у двух таблиц имеются совпадающие (по
имени) столбцы, необходимо при ссылках на столбцы в условиях соединения
или фильтрации использовать псевдонимы таблиц или синтаксис типа
таблица.столбец. В противном случае Oracle возвратит сообщение об
ошибке, извещающее о том, что ссылки на столбцы определены
неоднозначно.
Совет При использовании команды merge неявно используется концепция
вливания содержимого одной таблицы в другую на основании того,
существуют ли во второй таблице соответствующие значения; тем самым
расширяются принципы соединения таблиц, изложенные в главе 3. В дальнейшем
обсуждении мы будем работать только с одной таблицей, используя
концепцию самосоединения, с которой мы также познакомились в главе 3.
Манипулирование данными Oracle
193
Команда merge: реализация
На первый взгляд эта команда представляется хитрым решением кажущейся
простой проблемы. Давайте рассмотрим пример, как можно было бы
реализовать добавление данных к существующим строкам таблицы MOVIES,
используя оператор merge, показанный в следующем блоке кода:
1№№ВЙ SQL> merge into movies Ml
2 using movies M2 on (M2.movie_name - Ml,movie_name
3 and Ml.movie_name = 'GONE WITH THE WIND')
4 when matched then update set Ml.showtime = '7:30 PM'
5 when not matched then insert (Ml.movie_name. Ml.showtime)
6 values ('GONE WITH THE WIND','7:30 PM");
1 row merged.
SQL> select * from movies;
MOVIE NAME SHOWTIME
GONE WITH THE WIND 7:30 PM
Изучим приведенный выше блок кода более подробно. В первой строке
Oracle получает указание сливать строки в таблице MOVIES. Во второй строке
задается правило проверки совпадения строк с использованием копии
таблицы MOVIES. По сути дела, мы подсказываем Oracle, что для определения того,
существует ли уже в таблице запись о фильме "Gone With The Wind", следует
использовать содержимое второй копии таблицы MOVIES. Если это так (то
есть запись существует), мы желаем, чтобы Oracle изменила время показа на
7:30 РМ. А если нет, наше указание сводится к тому, чтобы Oracle добавила
новую запись для этого фильма с правильным временем показа. Обратите
также внимание, что для избежания неоднозначности мы всюду, где это
необходимо, используем псевдонимы таблиц. А теперь давайте посмотрим, что
произойдет, если мы захотим добавить в таблицу MOVIES данные о фильме,
отсутствующем в таблице:
«мивав* SQL> merge into movies Ml
2 using movies M2 on (M2 .movie^name = Ml.movie_name
3 and M2.movie_name = "LAWRENCE OF ARABIA')
4 when matched then update set Ml.showtime - '9:00 PM'
5 when not matched then insert (Ml.movie_name. Ml.showtime)
6 values ("LAWRENCE OF ARABIA','9:00 PM");
1 row merged.
SQL> select * from movies;
MOVIE NAME SHOWTIME
GONE WITH THE WIND 7:30 PM
LAWRENCE OF ARABIA 9:00 PM
В этом блоке кода ничего не изменилось по сравнению с предыдущим
примером, за исключением того, что мы хотели с помощью Oracle провести
проверку записи для фильма "Lawrence of Arabia" Поскольку запись для этого
фильма отсутствует, Oracle использует операцию insert, которая
специфицирована нами во фразе when no matched для добавления новых записей в
таблицу MOVIES.
Совет Было бы здорово, если бы команда merge позволяла использовать
фразу using как необязательную, что позволило бы упростить вид нашей
команды для ситуаций, когда мы желаем работать только с одной
таблицей. Возможно, в последующих выпусках базы данных Oracle прислушается к
нашим пожеланиям и включит эту опцию. А пока убедитесь, что вы хорошо
разобрались с многотабличной природой этой команды.
Остерегайтесь ошибок в условиях соединения
и фильтрации!
Как и в случае соединения таблиц, в команде слияния много подводных
камней, особенно если во фразе on вы не смогли надлежащим образом
сформулировать условия объединения и фильтрации. Рассмотрим, что произойдет, если
мы специфицируем условия соединения таким образом, что будет пропущен
194
Глава б
фильтр, указывающий, какой фильм следует искать Oracle. Взгляните на
следующий блок кода:
юшакя SQL> merge into movies Ml
2 using movies M2 on (M2.movie_name - Ml.movie_name)
3 when matched then update set Ml.showtime - '9:30 PM'
4 when not matched then insert (Ml.movie_name/ Ml.showtime)
5 values ('THE MUMMY','9:30 PM');
2 row merged.
SQL> select * from movies;
MOVIE NAME SHOWTIME
GONE WITH THE WIND 9:30 PM
LAWRENCE OF ARABIA 9:30 PM
В подобной ситуации мы правильно определили условия соединения,
позволяющие избежать появления в самосоединении декартова произведения.
Однако мы забыли включить фильтрующее условие, указывающее Oracle,
что необходимо проверить, имеется ли в таблице MOVIES запись для
фильма "The Mummy" Следовательно, Oracle идет напролом и заменяет каждую
строку таблицы в соответствии со значениями, заданными во фразе when
matched. Теперь посмотрим, что произойдет, если мы забудем об условии
соединения и включим только условия фильтра:
«ояжьяяз SQL> merge into movies ml
2 using movies m2 on (m2.movie_name - 'THE MUMMY')
3 when matched then update set ml.showtime - '12:00 AM'
4 when not matched then insert (ml.movie_name, ml.showtime)
5 values ('THE MUMMY','12:00 AM');
merge into movies ml
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_MOVIES) violated
На первый взгляд может показаться странным, что Oracle возвращает
сообщение о нарушении ограничений. Ведь, в конце концов, мы пытаемся
добавить строку для фильма "The Mummy", которая не нарушает никаких
ограничений первичного ключа для столбца MOVIE_NAME. На самом деле причина
того, что мы получили это сообщение об ошибке, кроется в том, что мы
пропустили условие соединения двух копий таблицы MOVIES. Поэтому, как
говорится, за кулисами Oracle сформировала декартово произведение, что и
привело к возникновению дублирующих строк для фильма "The Mummy".
Ошибка возникает, когда Oracle пытается вставить дублирующую строку для
фильма "The Mummy" в таблицу MOVIES. А теперь взглянем, что происходит,
когда мы отменяем ограничение первичного ключа для таблицы MOVIES:
EWCT* SQL> alter table movies disable constraint pk_movies;
Table altered.
SQL> merge into movies ml
2 using movies m2 on (m2.movie_name - 'THE MUMMY')
3 when matched then update set ml.showtime - 42:00 AM"
4 when not matched then insert (ml,movie_name, ml.showtime)
5 values ('THE MUMMY','12:00 AM');
2 rows merged.
SQL> select * from movies;
MOVIE NAME SHOWTIME
GONE WITH THE WIND 9:30 PM
LAWRENCE OF ARABIA 9:30 PM
THE MUMMY 12:00 AM
THE MUMMY 12:00 AM
Закрепление пройденного материала
1. Умейте рассказать, какую бизнес-проблему призвана решать команда
merge.
2. Необходимо понимать сложный синтаксис команды merge, в том числе
фразы для соединения таблиц и для определения действий, как в случае
совпадения, так и в случае несовпадения записей.
Манипулирование данными Oracle
195
3. Убедитесь, что можете должным образом использовать команду merge.
Знайте, как исправлять ошибки, вызванные неверными формулировками
условий соединения и (или) фильтрования при соединении таблиц.
Упражнения
1. Изучите следующий блок кода:
SQL> merge into emp el
2 using emp e2 on (e2.ename = 'SMITHERS')
3 when matched then update set el.sal - el.sal *1.1
4 when not matched then insert (el.empno, el.ename, el.sal)
5 values (7999, "SMITHERS", 800);
Какой из следующих вариантов ответа верно определяет строку
предшествующей команды merge, которая послужит причиной того, что Oracle
возвратит ошибку?
A. merge into emp el
B. using emp e2 on (e2.ename 'SMITHERS')
С when matched then update set el.sal el.sal * 1.1
D. when not matched then insert (el.empno, el.ename, el.sal)
E. values (7999, 'SMITHERS', 800);
8. Вы желаете использовать команду Oracle merge. Какое из следующих
утверждений о команде merge является неверным?
A. Команда merge может эффективно работать даже с одной таблицей.
B. Команда merge должна включать ссылки по крайней мере на две
различные таблицы.
С Команда merge должна содержать должным образом определенные
условия соединения^ иначе будет сформировано декартово
произведение.
D. Команда merge должна содержать условия фильтра, определяющие,
присутствует ли строка в таблице.
Ответы
1. В. 2. В. Вспомните, что мы можем использовать две копии одной таблицы, а затем
выполнить операцию самосоединения.
Значение управления транзакциями
На протяжении нескольких последних глав мы внесли огромное количество
изменений в нашу базу данных Oracle. Кое-кто может даже сказать, что мы
превратили наши данные в кашу. Однако ни одно из этих изменений не было
сохранено в базе данных, и ни одно из них не было видно ни одному пользователю
базы данных, кроме вас. Вы спросите: как это может быть? Этим чудесам мы
обязаны имеющимся в Oracle возможностям управления транзакциями!
Одним из самых больших преимуществ, предоставляемых Oracle, является
возможность произвести изменения, а затем принять решение сохранить эти
изменения или отказаться от них. Oracle предоставляет нам возможность
выполнить несколько операторов изменения данных вместе как одну
логическую единицу работы. Эта единица работы называется транзакцией и
прекращается, когда вы принимаете решение сохранить результаты работы или
отказаться от них. Транзакция начинается с первого выполнимого оператора SQL.
К числу преимуществ, предлагаемых обработкой транзакций в Oracle, можно
отнести следующие:
196
Глава б
■ Транзакции позволяют гарантировать всем пользователям базы данных
Oracle согласованность по чтению на момент времени, соответствующий
началу транзакции.
■ Транзакции позволяют нам выполнить предварительный просмотр
изменений, прежде чем сделать их постоянными.
Ш Транзакции позволяют нам группировать логически связанные операторы
SQL в одну логическую единицу работы.
Основные средства управления транзакциями
Обработка транзакций состоит из набора средств управления, позволяющего
пользователям задавать операторы insert, update или delete, чтобы
объявить о начале последовательности операторов изменения данных, которые он
(или она) собирается выполнить. Когда пользователь заканчивает вносить
изменения в базу данных, он может сохранить данные в базе данных, явно
завершая транзакцию. Напротив, если при выполнении транзакции в какой-то
момент была допущена ошибка, пользователь может предложить базе данных
отказаться от сделанных изменений и восстановить данные в том виде,
какими они были перед выполнением транзакции.
В базе данных Oracle транзакции создаются с помощью двух различных
элементов. Первым элементом является набор команд, определяющих начало,
контрольные точки (breakpoints) и окончание транзакции. Вторым элементом
являются специальные механизмы блокировки, предназначенные для того,
чтобы в каждый момент времени изменять информацию в строках таблицы
мог только один пользователь. Обсуждением блокировок мы займемся после
того, как определим команды управления транзакциями. Ниже приводится
перечень команд, определяющих транзакции:
■ set transaction Инициирует начало транзакции и устанавливает ее
основные возможности. Эта команда является необязательной.
Транзакция автоматически запускается при старте SQL*Plus, после фиксации
(commit) или отката (rollback) предыдущей транзакции.
Ш commit Заканчивает текущую транзакцию путем сохранения (фиксации)
в базе данных выполненных изменений и начинает следующую
транзакцию.
■ rollback Заканчивает текущую транзакцию путем отказа от сохранения
в базе данных выполненных изменений и начинает следующую
транзакцию.
■ savepolnt Определяет контрольные точки транзакции, обеспечивая тем
самым возможности частичного отката.
set transaction
Обычно эта команда используется для определения начала транзакции. Если
после задания команды set transaction (но до появления команды
завершения транзакции) будут выполнены какие-либо изменения базы данных, все
сделанные изменения будут рассматриваться как часть транзакции. Оператор
set transaction не является обязательным, поскольку транзакция
автоматически запускается при следующих обстоятельствах:
■ Сразу после того, как вы вошли в Oracle через SQL*Plus и выполнили
первую команду
■ Непосредственно после выдачи команд commit или rollback,
завершающих транзакцию
Ш При выходе пользователя из SQL*Plus
■ В случае отказа системы
Манипулирование данными Oracle
197
■ При появлении команды языка определения данных, например alter
database
По умолчанию транзакция предоставляет доступ для чтения и записи, если
только вы не изменили это правило умолчания, задав команду set
transaction read only. Кроме того, с помощью команды set transaction можно
устанавливать уровень локализации. Команда set transaction isolation
level serializable специфицирует для приводимой в последовательную
форму (serializable) транзакции уровень локализации в соответствии с тем,
как он определен в SQL92. Если такая транзакция содержит операторы DML,
пытающиеся обновить любой ресурс, который, возможно, был обновлен
другой транзакцией, незавершенной к моменту начала текущей транзакции,
оператор DML завершится аварийно. Определением поведения транзакции
Oracle по умолчанию является команда set transaction isolation
level read committed. Если транзакция содержит оператор DML,
требующий блокировки строк, удерживаемых другой транзакцией, этот оператор
переходит в состояние ожидания, пока не будет снята блокировка этих строк.
Ниже приведен пример:
taataaaaiai SQL> SET TRANSACTION READ ONLY;
Transaction set.
SQL> rollback;
Rollback complete.
SQL> SET TRANSACTION READ WRITE;
Transaction set.
SQL> rollback;
Rollback complete.
SQL> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Transaction set.
SQL> rollback;
Rollback complete.
SQL> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Transaction set.
SQL> rollback;
Rollback complete.
Совет Команда set transaction может появиться только как первый
оператор в начале транзакции. Следовательно, мы обязаны каждую
транзакцию завершать явно командой rollback, прежде чем начать
следующую транзакцию с помощью команды set transaction.
commit
В обработке транзакций оператор commit отражает момент времени, когда
пользователь выполнил все изменения, которые он объединил в единую
логическую группу, и, поскольку при этом не было сделано никаких
ошибок, он готов сохранить результаты проделанной работы. Ключевое слово
work является дополнительным словом в синтаксисе оператора commit,
которое добавляется исключительно для удобочитаемости. При выдаче
оператора commit неявно начинается новая транзакция базы данных, так
как этот оператор закрывает текущую транзакцию и запускает новую. При
этом все сделанные в базе данных изменения делаются постоянными.
Предыдущее состояние данных теряется. Теперь все пользователи могут
видеть все данные, а все контрольные точки стираются. Кроме того, важно
понимать, что неявная операция commit происходит в базе данных при
выходе пользователя из SQL*Plus или в том случае, если он выдает
команду DDL, например create table, используемую для создания объектов
базы данных, или alter table, используемую для их изменения. Ниже
приведен пример:
reswear SQL> commit;
Commit complete.
SQL> COMMIT WORK;
Commit complete.
198
Глава б
rollback
Если вы в какой-то момент выдали нежелательный оператор изменения
данных, с помощью оператора rollback можно отказаться от сделанных в базе
данных изменений. В результате выполнения этого оператора
восстанавливается состояние данных, предшествующее началу транзакции. Снимаются
блокировки со всех задействованных строк. Сразу после выдачи оператора
rollback сеанс пользователя неявно начинает следующую транзакцию. В
дополнение к откатам, выполняемым при появлении операторов rollback,
неявные операторы rollback выполняются и в случае аварийного
завершения оператора по любой причине, а также если пользователь прервал
выполнение оператора, нажав на клавиши Ctrl-C. Ниже приведен пример:
ЁШВШ SQL> ROLLBACK;
Rollback complete.
SQL> ROLLBACK WORK;
Rollback complete.
После того как была выдана команда commit, становится невозможно
выполнить откат (rollback) изменений. Это становится ясно из следующего примера:
«ааввия SQL> update emp set sal = 20000 where ename = 'KING';
1 row updated.
SQL> select sal from emp where ename • 'KING';
SAL
20000
SQL> commit;
Commit complete.
SQL> rollback;
Rollback complete.
SQL> select sal from emp where ename = 'KING';
SAL
20000
savepoint
В некоторых случаях, когда, например, транзакция длится достаточно долго
или если в ее рамках выполняется очень большое число изменений данных,
вы, естественно, вовсе не будете в восторге, если потеряете все сделанные
изменения только потому, что оказалось, что в последнем операторе
содержались нежелательные изменения. Контрольные точки — это специальные
операции, позволяющие разбить всю работу транзакции на несколько сегментов.
В этом случае операции отката можно выполнять не до начала транзакции, а
до последней контрольной точки, что позволяет оставить нетронутыми
сделанные ранее изменения. Контрольные точки хороши в ситуации, когда
необходимо восстановить какую-то часть незафиксированной (uncommitted)
транзакции. В силу того что в приведенном ниже блоке кода был выполнен
оператор rollback to savepoint so_far_so_good, при выполнении
оператора commit будут сохранены только те изменения, которые были сделаны до
того, как была установлена контрольная точка:
КттЯЯ SQL> UPDATE products
2 SET quantity - 55
3 WHERE product* = 59495;
1 row updated.
SQL> SAVSPOIHT »o_far_»o_good;
Savepoint created.
SQL> UPDATE spanky.products
2 set quantity = 504;
1 row updated.
SQL> ROLLBACK TO SAVEPOINT »o_far_»o_good;
Rollback complete.
SQL> COMMIT;
Commit complete.
SQL> select quantity from spanky.products
2 where product* = 59495;
QUANTITY
55
Манипулирование данными Oracle
199
Несколько слов о согласованности по чтению
Согласованность по чтению является крайне важной особенностью Oracle,
особенно в связи с тем, что база данных позволяет в одно и то же время
обращаться к ней многим пользователям. Рассмотрим важность согласованности
по чтению на примере. Допустим, с базой данных работают два пользователя.
Пользователь А читает содержимое таблицы ЕМР, чтобы провести изменения
где-то в другом месте базы данных, в то время как пользователь В изменяет ту
запись таблицы ЕМР, которую читает пользователь А. Если пользователь А
получил доступ к изменениям, сделанным пользователем В еще до того, как В
готов зафиксировать (сделать их постоянными) их в базе данных, выполнив
команду commit, пользователь А может прекратить делать изменения в другой
части базы данных на основании ошибочной информации. Следовательно,
все пользователи должны иметь согласованное по чтению представление
данных на протяжении всей транзакции Oracle. Oracle обеспечивает такую
функциональную возможность, и это является крайне важным для предотвращения
конфликтующих изменений данных в базе данных Oracle.
Блокировки
Заключительным аспектом базы данных Oracle, позволяющим пользователям
использовать обработку транзакций, является блокировка — механизм, с
помощью которого Oracle предотвращает одновременное изменение данных
несколькими пользователями. Имеется несколько различных типов блокировок,
каждый из которых имеет свою собственную область действия. Все
имеющиеся в базе данных блокировки могут быть отнесены к одной из двух категорий:
блокировки уровня таблиц и блокировки уровня строк.
Блокировки уровня таблиц позволяют делать изменения в таблице только
одному пользователю, который, как принято говорить, установил блокировку
на эту таблицу. В то время когда таблица заблокирована, никто другой не
может делать в ней никаких изменений. Блокировка таблицы может быть
установлена в нескольких режимах: разделяемая блокировка строки (row share —
RS), исключающая блокировка строки (row exclusive — RX), разделяемая
блокировка (share — S), разделяемая блокировка с исключающей блокировкой
строки (share row exclusive — SRX) и исключающая блокировка (exclusive — X).
Сила накладываемого блокировкой ограничения определяет режимы, в
которых могут быть приобретены и поддерживаться другие блокировки для той же
самой таблицы.
Блокировка уровня строк дает пользователю эксклюзивную
(исключительную) возможность изменять данные одной или нескольких строк таблицы.
Однако любая строка таблицы, не удерживаемая в данный момент
блокировкой, может быть изменена другим пользователем.
Совет Для оператора update требуется особая блокировка уровня строк,
которая называется исключающей блокировкой строк (row-exclusive lock).
Такой уровень блокировки означает, что на время выполнения оператора update
никто из других пользователей не может ни просматривать, ни изменять
данныеэтой строки. То же самое относится и к операциям insert и delete.
Для другого оператора update — он называется select for upda te —
требуется более мягкая блокировка строк, которая называется разделяемой
блокировкой (share lock). Такая блокировка означает, что в то время, пока
оператор update обновляет данные в строках таблицы, никто не может
изменять строки, но пользователи могут просматривать данные строк,
подвергающихся изменению.
Закрепление пройденного материала
1. Убедитесь, что можете дать определение, что такое транзакция. Знайте,
когда начинается и когда заканчивается транзакция. Умейте в процессе
обработки транзакций использовать ключевые слова set transaction,
savepoint, commit и rollback.
200
Глава б
2. Знайте, как блокировки помогают транзакциям, не давая другим
пользователям возможности увидеть данные из таблицы.
Упражнения
1. Вы закончили работу с транзакцией и хотели бы начать другую. Какой из
показанных ниже операторов появляется в начале транзакции и
устанавливает многие ее характеристики?
A. set transaction
В.rollback
С. savepoint
D.commit
2. Вы участвуете в обработке транзакций в базе данных Oracle. Какую
команду можно использовать для определения логических контрольных точек
транзакции?
A. set transaction
В.rollback
C. savepoint
D. commit
3. Этот компонент базы данных не позволяет другим пользователям изменять
данные, которые в настоящий момент изменяются вами:
Ответы
1. А. 2. С. 3. Блокировка
Резюме главы
В этой главе мы рассмотрели, как манипулировать данными с помощью
операторов insert, update и delete и как включиться в обработку транзакций
Oracle. Эта информация составляет всего один пункт программы экзамена
ОСР по SQL. Однако, хотя мы и рассмотрели в этой главе всего один вопрос,
не следует думать, что эта глава не содержит ценного материала. Ведь
материалы этой главы — добавление, изменение и удаление данных с помощью
операторов insert, update и delete, а также управление транзакциями —
составляют 10% экзаменационной программы.
Двухминутное погружение в пройденное
■ Новые строки в таблицу помещаются с помощью оператора insert.
Задавший этот оператор пользователь может добавлять в каждый момент
времени по одной строке, используя один оператор, либо может
выполнять операцию массовой вставки, используя оператор insert into
имя_таблицы (select . . .).
■ Имеющиеся в таблице строки можно модифицировать, используя
оператор update. Этот оператор содержит фразу where, аналогичную по своим
функциям фразе where оператора select.
Ш Имеющиеся в таблице строки можно удалить, используя оператор delete.
В операторе delete также используется фраза where, аналогичная по
своим функциям фразе where операторов select и update.
■ Обработка транзакций управляет изменениями данных в базе данных
Oracle.
Манипулирование данными Oracle
201
■ К средствам управления транзакциями относятся команды,
идентифицирующие начало, контрольные точки и момент завершения транзакции, а
также механизмы блокировок, не позволяющие нескольким
пользователям одновременно делать изменения в базе данных.
Вопросы для самопроверки
1. Эта команда обработки транзакций определяет логическую
контрольную точку транзакции, не являющуюся ее концом:
2. Эта состоящая из пяти слов команда указывает, что транзакция будет
выполнять каждый оператор DML последовательно (то есть друг за другом) и
изолированно, как это определено в SQL92:
Вопросы ко всей главе
1. Пользователь JANKO хотел бы вставить новую строку в таблицу
EMPLOYEE. Таблица состоит из трех столбцов: EMPID, LASTNAME и
SALARY. Пользователь хотел бы ввести данные для EMPID (59694),
LASTNAME (Harris) и не вводить значение заработной платы. Какой из
следующих операторов лучше других справится с этой работой?
A. insert into EMPLOYEE values (59694, 'HARRIS', NULL);
B. insert into EMPLOYEE values (59694, 'HARRIS');
С insert into EMPLOYEE (EMPID, LASTNAME, SALARY)
values (59694, 'HARRIS');
D. insert into EMPLOYEE (select 59694 from 'HARRIS');
2. Какой из приведенных ниже эффектов произведет пропуск фразы where в
операторе delete?
A. Оператор delete закончится аварийно, поскольку не указаны записи
для удаления.
B. Оператор delete предложит пользователю ввести критерии удаления.
С Оператор delete закончится аварийно из-за синтаксической ошибки.
D. Оператор delete удалит из таблицы все записи.
3. Как называется средство управления транзакциями, не позволяющее более
чем одному пользователю обновлять данные из таблицы?
A. lock
В.commit
C. rollback
D. savepoint
4. В базе данных имеются две таблицы для обработки информации о затратах на
содержание служащих: EXPENSES и EXPENSE_ITEMS. Неделю тому назад
для служащего SMITHERS, имевшего пять статей расхода, были добавлены
соответствующие строки под номером 2701 в таблицы EXPENSES и
EXPENSE_ITEMS. Вчера SMITHERS получил компенсацию расходов 2701.
Занимающийся компенсационными выплатами менеджер хочет теперь
избавиться от этих данных. Ниже приводится выдержка из его сеанса SQL*Plus:
SQL> delete from expenses where expense_id = 2701;
Что произойдет далее?
A. Oracle возвратит сообщение об ошибке и не удалит запись.
B. Oracle возвратит сообщение об ошибке, но все-таки удалит запись из
таблицы EXPENSES.
202 v Глава 6
C. Oracle возвратит предупреждение, но все-таки удалит запись из
таблицы EXPENSES.
D. Oracle удалит запись из таблицы EXPENSES без сообщений о
предупреждениях и ошибках.
5. Вы добавляете в таблицу PROFITS новые записи. В следующем блоке кода
приводится выдержка из вашего сеанса SQL*Plus:
SQL> describe profits
Name Null? Type
PR0DUCT_NAME NOT NOLL VARCHAR2(10)
PR0D0CT_ID NUMBER(10)
QTR_END_DATE DATE
SALESPERSON VARCHAR2(10)
PROFIT NUMBER
SQL> insert into profits
2 values ('TURNER', 12345, 'l-MAR-01', 'BARNEY TOY', 54938);
Что произойдет далее?
A. Oracle возвратит ошибку "несоответствие типов" и не добавит новую
запись.
B. Oracle возвратит ошибку "неверное число" и не добавит новую
запись. г
C. Oracle возвратит предупреждение, но все-таки добавит новую запись.
D. Oracle добавит в таблицу новую запись без всяких предупреждений и
сообщений об ошибках.
Ответы на вопросы для самопроверки
1. savepoint
2. set transaction isolation level serializable
Ответы на вопросы к главе
1. A. insert into EMPLOYEE values (596*94, 'HARRIS', NULL);
Объяснение Этот вариант является приемлемым, потому что во фразе values
соблюден позиционный критерий, при котором не требуется специфицировать
порядок столбцов. Один из способов, как можно не задать значение для
конкретного столбца, это вставить для него значение NULL. Вариант В
некорректен, потому что в нем определены значения не для всех столбцов таблицы.
Когда мы используем для заполнения столбцов данными позиционный метод, мы
обязаны указать значения для всех столбцов таблицы. В противном случае
должны быть явно названы все заполняемые данными столбцы. Вариант С
некорректен, потому что, если мы упоминаем имя столбца во фразе insert into,
во фразе values для него обязательно должно быть задано значение. Вариант D
некорректен, потому что использование в подобных ситуациях многострочного
варианта оператора insert с оператором select недопустимо. Вернитесь к
обсуждению операторов insert, где приведена более подробная информация по
этому вопросу.
2. D. Оператор delete удалит из таблицы все записи.
Объяснение Пропуск фразы where может дать только один эффект —
запрашиваемая операция (удаление) будет выполнена для всех строк таблицы.
3. A. Lock
Объяснение Блокировкой называется механизм, не позволяющий нескольким
пользователям одновременно выполнять изменения базы данных. Все другие
варианты ответа описывают команды, обозначающие начало, середину и ко-
Манипулирование данными Oracle
203
нец транзакции. Вернитесь к обсуждению операторов управления
транзакциями, где приведена более подробная информация по этому вопросу.
4. Oracle возвратит сообщение об ошибке и не удалит запись.
Объяснение Когда вы пытаетесь удалить запись из таблицы, имеющей
ограничение внешнего ключа и записи в дочерней таблице, Oracle не даст сделать
этого, если в дочерней таблице возникнут записи-"сироты" Тем самым
становятся некорректными варианты ответа В и С. Вариант D также
некорректен, поскольку Oracle возвратит сообщение об ошибке, указывающее на
существование дочерних записей.
5. D. Oracle добавит в таблицу новую запись без всяких предупреждений и
сообщений об ошибках.
Объяснение Несмотря на то что добавленные данные принесут с собой
некоторые проблемы с контекстом, Oracle не возвратит никакого сообщения об
ошибке и не запретит добавление записи в таблицу. Таким образом, варианты
А, В и С являются некорректными, так как технически в типах данных
добавляемых записей нет ошибок или чего-то еще в том же роде.
ГЛАВА 7
Создание других объектов
базы данных Oracle
Создание других объектов базы данных Oracle
205
этой главе мы познакомимся со следующими вопросами, а
потом и продемонстрируем свои знания по ним:
И Создание представлений
■ Другие объекты базы данных
К этому моменту мы с вами должны уже знать, как выбирать данные из
таблиц, проектировать таблицы базы данных, создавать отношения между
этими таблицами, создавать ограничения для вводимых в таблицы данных и
заполнять эти таблицы данными. Эти функции — краеугольные камни
обеспечиваемых Oracle функциональных возможностей. Однако всем этим
проектирование таблиц не ограничивается. Архитектура Oracle располагает
такими характеристиками, которые позволяют сделать определенные данные
доступными одним пользователям и недоступными для остальных, ускорить
доступ к данным, а также генерировать последовательные номера для
первичных ключей или для других целей. Эти расширенные возможности базы
данных Oracle также являются предметом первого экзамена ОСР.
Рассматриваемый в этой главе материал составляет около 11 % программы экзамена.
Создание представлений
В этом разделе рассматриваются следующие вопросы, касающиеся
представлений:
■ Создание простых представлений
■ Создание представлений для принудительного выполнения ограничений
■ Создание сложных представлений
■ Модификация и удаление представлений
Когда-то было сказано, что глаза — это окна души. И хотя это
высказывание может быть, а может и не быть справедливым, всегда верно то, что именно
глаза помогают нам просматривать данные из таблиц. Для того чтобы всегда
быть уверенным, что каждый сможет увидеть только то, что ему полагается
видеть, можно создать специальные "окна" для данных таблицы. Такие "окна"
называются представлениями. Представления — это хранящиеся в Oracle
запросы, с помощью которых данные динамически собираются в виртуальные
таблицы. Можно трактовать эти виртуальные таблицы, как если бы они были
реальными, как это было со словарными представлениями Oracle в
предыдущей главе. Для использующего представление лица манипулирование
данными из представления полностью аналогично манипулированию данными из
таблицы. В некоторых случаях пользователи даже получают возможность
изменять данные представления, как если бы это представление было таблицей.
После этих слов давайте перейдем к подробному исследованию вопросов
создания и использования представлений и управления ими.
Совет Что касается названий основных тем, мы слегка отклоняемся от
книги Oracle DBA Candidate Guide. И хотя названия отдельных тем и
организация материала отличаются от принятых в книге Candidate Guide, мы
тем не менее охватим всю информацию, требующуюся для сдачи экзамена
ОСР. Также будет дана информация, необходимая для понимания метода
встроенных представлений и анализа "первые N", о которых мы уже
говорили в главе 4 при обсуждении подзапросов во фразе where.
Создание простых представлений
Представления играют роль таблиц в том плане, что они позволяют делать к
себе запросы точно так же, как к таблицам. Однако представления являются
формой логического представления данных, в то время как физически дан-
206
Глааа 7
ные хранятся в таблицах. В представления данные попадают из таблицы, к
которой представление обращается с запросом для получения собственного
содержимого. Представления могут использоваться для ограничения
доступа к данным таблицы. Это связано с тем, что представления используют
запросы для получения и отображения заранее отобранной информации.
Перейдем от слов к делу и рассмотрим простейший пример оператора create
view, использующегося в Oracle для создания представлений, после чего
выполним над созданным представлением несколько простейших действий,
которые возможны для таблиц. В приведенном ниже примере текст оператора
create view выделен полужирным шрифтом:
«аашааи SQL> create view emp_view sa
2 (aelect * from amp
3 Where job = 'ANALYST');
View created.
SQL> describe erap_view
Name Null? Type
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
SQL> select erapnop
EMPNO
7788
7902
ENAME
SCOTT
FORD
NOT
ename from
NULL
emp
NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
view,-
Совет Если указанная вами в качестве базовой таблица не существует,
представление не будет создано. Однако это ограничение можно
преодолеть, если в команде create view использовать ключевое слово force.
Это ключевое слово вынуждает Oracle создать требующееся
представление в любом случае. Тем не менее созданное представление окажется
неработоспособным, так как за ним не стоит никакой таблицы, из которой
можно было бы черпать данные.
Обратите внимание на два основных компонента оператора create view.
В первой части мы идентифицируем имя представления, которое по нашей
просьбе должна создать Oracle. Во второй части оператора в круглых скобках
мы определяем тот запрос, которым должна пользоваться Oracle для
получения тех данных, которыми будет заполнена наша виртуальная таблица.
Таблица, информация которой используется в качестве базиса данных для нашего
представления, называется базовой таблицей. Можно также создавать
представления, базисом для создания которых служат другие представления. После
создания представления с ним можно делать все, что разрешено делать с его
базовой таблицей. В нашем представлении EMPJVIEW все выглядит
точно так же, как и в основополагающей таблице ЕМР, кроме одной маленькой
детали: в представлении EMP_VIEW содержатся только необходимые для
анализа данные! Следовательно, представление может вносить в данные
дополнительные элементы безопасности, позволяя ограничить показываемые
пользователям данные, если им будет разрешено обращаться не к реальной таблице, а к
представлению. Пусть, к примеру, у вас имеется таблица, содержащая данные
для всей корпорации, и вы желаете предоставить сотрудникам конкретных
подразделений доступ только к информации, относящейся к их подразделению.
В таком контексте могут оказаться полезными представления, потому что
можно определить такое представление, в котором будут содержаться данные,
относящиеся только к заданному подразделению, а затем разрешить
служащим этого подразделения делать запросы к созданному представлению, а не
ко всей таблице.
Совет После создания представления можно получить перечень входящих в
него столбцов, используя, как и для таблиц, команду describe.
Создание других объектов базы данных Oracle
207
Только что созданное нами представление относится к типу так
называемых простых представлений. Oracle считает их простыми, потому что при их
создании используются данные только из одной таблицы. Так как
представления содержат оператор select, следует знать кое-что о том, какие виды
операторов select могут содержаться в простых представлениях:
■ Почти все операторы select для одной таблицы, которые могут быть
заданы из SQL*Plus, могут быть использованы для создания простых
представлений. Разрешены базовые запросы к одной таблице, содержащие
такие однострочные операции, как decode ( ), nvl ( ) и тому подобные.
■ Также разрешены операторы запросов, содержащие фразы order by, при
условии, что фразы order by появятся вне круглых скобок. Ниже
приводится поясняющий пример: create view my_view as (select * from
emp) order by empno.
■ Кроме того, в Oracle разрешено использовать в запросах к представлениям
фразы group by, connect by и групповые функции, например count ( ),
при условии, что у каждой функции будет иметься псевдоним.
■ В Oracle разрешены представления, содержащие ключевое слово distinct, в
которых используется синтаксис типа create view my view as (select
distinct (job) as my_jobs from emp.
■ Хотя в запросах, используемых в командах create view, разрешены
ссылки на несколько таблиц, создаваемые при этом представления уже не
будут называться простыми представлениями. Это будут так называемые
сложные представления (которые иногда называют также
представлениями соединения). О них речь пойдет в нашем следующем обсуждении.
Совет Информация об имеющихся в нашей базе данных хранится в словаре
данных в представлении, которое называется USER_VI£WS. Кроме того,
нельзя создать представление, содержащее фразу for update.
Иерархические запросы: краткое отступление
Предупреждение: читать этот раздел следует только в том случае, если наше
замечание относительно представлений, не допускающих запросов,
содержащих фразу connect by, пробудило в вас интерес к типу представлений,
который известен в Oracle под названием иерархических запросов. Этот вопрос
обычно не входит в программу экзамена О СР. Иерархический запрос может
объединять строки таблицы в иерархию. Подобно большинству компаний,
компания, служащие которой перечислены в таблице ЕМР, является
иерархической, где каждый из служащих подотчетен какому-либо другому
служащему, и так далее вплоть до служащего KING, являюшегося'президентом
компании. Можно получить список всех служащих в этой иерархии, используя
иерархический запрос типа того, который приведен ниже:
ПИЯМИ SQL> select empno, ename, job
2 from emp
3 connect by prior empno = mgr;
Совет Как и шекспировский Полоний, мы верим, что "краткость является
душой мудрости ". Поэтому мы не Приводим выходные данные этого запроса,
чтобы не отклоняться от нашей основной цели — представлений и экзамена
ОСР. Однако если вам понравились иерархические запросы и вы желаете
повозиться с ними в свободное время, то в документации по Oracle вы
сможете найти много интересного по этой теме. Желаем вам удачи!
И снова про простые представления
В части того, что представления могут помочь защитить данные от излишне
любопытных глаз, исследуем использование определенных ключевых слов для
обеспечения безопасности данных. Например, рассмотрим служащую нам
верой и правдой таблицу ЕМР. В ней содержится информация о заработных
208
Глава 7
платах служащих — информация, которую в большинстве компаний
предпочитают не афишировать. Чтобы "задраить люки", скрывающие данные SAL и
СОММ из таблицы ЕМР от завистливых и любопытных глаз служащего
SCOTT (раздраженного тем, что, по его мнению, ему недоплачивают),
рассмотрим следующий блок кода:
ЙЯДЯЙ SQL> create or replace view emp_view аз
2 ( select empno, ename, job, mgr, hiredate,
3 dacoda(«nama, uaar, aal, 'KING', sal, 0) as aal,
4 dacoda(«nama, uaar, coon, 'KING', sal, 0) as coon,
5 deptno from emp);
View created.
SQL> select ename, sal from emp_view
2 where job - 'ANALYST';
ENAME SAL
SCOTT 3000
FORD 0
Отметим некоторые моменты, касающиеся выделенных полужирным
шрифтом элементов предыдущего примера. Мы использовали функцию
decode ( ) для того, чтобы определить, что именно возвращать вместо
информации SAL и СОММ, что, как мы знаем, разрешено синтаксисом. Заметьте
также: для того чтобы понять, чью информацию о зарплате и комиссионных
мы показываем и для кого из пользователей, мы использовали ключевое слово
user, являющееся функцией, определяющей имя пользователя, под которым
он зарегистрировался при входе в систему. Обратите также внимание, что мы
включили некую функциональность, позволяющую служащему по фамилии
KING видеть заработные платы всех служащих компании (в конце концов, он
ведь является президентом компании). Затем обратите внимание, что мы
создали для этого столбца псевдоним, чтобы Oracle было известно, как в
выходных данных назвать этот столбец нашей виртуальной таблицы. Помимо того
что они необходимы для создания представления, псевдонимы, как вы,
конечно, помните, упрощают то имя столбца, которое сформировал бы Oracle с
использованием примененной однострочной функции, не будь этого псевдонима.
И наконец, обратите внимание на использование в этом примере
синтаксиса create or replace view EMP_VIEW. Раньше мы просто писали create
view emp_view, но в нашем случае создание (create) представления
закончилось бы аварийно, так как представление EMP_VIEW уже существует, если бы
не были добавлены ключевые слова or replace. Эти ключевые слова бывают
полезны, когда мы желаем переопределить существующее представление, исходя
из новых нужд или критериев. Вы спросите: а почему бы просто не
использовать команду alter view? Потому что единственная работа, которую может
выполнить команда alter view, это повторная компиляция неработающего
представления. Более подробно мы поговорим о команде alter view в конце
раздела, посвященного приложениям.
Изменение данных в основных таблицах посредством
простых представлений
Теперь попробуем сделать нечто совершенно другое. Скажем, засекречивание
данных о зарплатах других сотрудников от любопытных глаз служащего SCOTT
оказалось недостаточно, чтобы уговорить его прекратить держать зло на
компанию за свою "нищенскую" зарплату. Сейчас SCOTT настолько раздражен, что
готов взять дело в собственные руки и, вопреки всем правилам компании,
повысить себе зарплату. Допустим, что SCOTT не знает об основной таблице
ЕМР, и посмотрим, удастся ли ему каким-либо образом изменить информацию
в этой таблице, используя, например, представление EMP_VIEW:
SQL> update emp_view set sal - 6000
2 where ename - 'SCOTT';
update emp_view set sal - 6000
*
ERROR at line 1:
ORA-01733: virtual column not allowed here
(здесь не разрешено использовать виртуальный столбец)
Создание других объектов базы данных Oracle
209
Очевидно, ему не удалось сделать это. Помните, в нашем представлении
мы не использовали для SAL и СОММ простые ссылки на имена столбцов.
Вместо этого мы обращались к ним через функцию decode ( ), в результате
чего в представлении EMPVIEW были созданы виртуальные столбцы,
содержащие информацию о зарплате и комиссионных служащего, обновлять
которые нельзя. Вам могло показаться, что это был всего лишь простой
технический прием, а не средство повышения безопасности, и вы, вероятно,
правы. Тем не менее этот простой прием расстроил попытку служащего
SCOTT ввести в заблуждение компанию. Однако допустим, что сейчас
SCOTT разозлился не на шутку и готов пойти на что угодно, чтобы свести
счеты с компанией, даже если для этого придется при всем честном народе
назвать президента компании дураком, что и показано в приведенном ниже
блоке кода:
ВЖИВИ! SQL> update emp_view set ename = ' FOOL! '
2 where job - 'PRESIDENT';
1 row updated.
SQL> select ename from emp
2 where job - 'PRESIDENT';
ENAME
FOOL!
Конечно, SCOTT смог назвать президента компании дураком, так как он
модифицировал таблицу ЕМР путем обновления представления EMP_VIEW,
хотя, без сомнения, ему придется за все заплатить, когда KING обнаружит
деструктивные действия служащего SCOTT.
Изменение данных в основных таблицах посредством
простых представлений: ограничения
А теперь попробуем экстраполировать общее правило. С помощью простых
представлений можно вставлять, обновлять или удалять информацию из
основных таблиц при условии выполнения следующих ограничений:
Ш Все ограничения, определенные для основных таблиц, применимы и к
модификации данных через представления. Так, например, нельзя добавить
в основную таблицу данные с помощью представления, нарушающего
ограничение первичного ключа.
Ш Если на столбцы основной таблицы, не появляющиеся в нашем
представлении, наложено ограничение не-NULL, вероятно, у вас возникнут
проблемы, если вы попытаетесь вставить данные в представление. Эту
проблему можно разрешить, если при определении таблицы использовать
для столбца (ов) не-NULL значения по умолчанию.
Ш Вообще говоря, удалять записи из основной таблицы, используя
представление, можно даже в тех случаях, когда в представлении не содержатся все
столбцы или строки, представленные в основной таблице.
■ Нельзя с помощью простых представлений обновлять данные в столбце
основной таблицы, если столбец был определен посредством
однострочной функции или функциональных ключевых слов типа user или
sysdate. Можно обновлять данные в столбце основной таблицы, если при его
определении не использовались однострочные функции.
■ Нельзя вставлять, обновлять или удалять данные для таблицы,
являющейся базовой для простого представления, если оператор select,
использованный для создания представления, содержит фразу group by,
групповую функцию или фразу distinct.
■ Нельзя модифицировать данные представления, если используется
ключевое слово псевдостолбца ROWNUM или если столбцы определены
выражениями.
210
Глава 7
Совет Если вы работаете со своей базой данных и мечтаете о
приключениях, попытайтесь создать простое представление, которое не нарушало
бы этих ограничений, но во всем остальном вытворяло бы странные вещи.
Затем проверьте, можете ли вы добавлять, обновлять и удалять строки из
базовой таблицы. Ниже приведен пример, поясняющий, о чем мы ведем речь.
Попытайтесь вставить строку в таблицу ЕМР с помощью созданного
следующим образом представления: create view my_view as (select ro-
wid as row_id, empno from emp). Если в ваших поисках вы столкнетесь
с любыми ограничениями помимо перечисленных нами в приведенном выше
перечне, пошлите электронной почтой письмо по адресу: jcouchman@mindsp-
ring.com, и мы обещаем обязательно упомянуть ваше имя в нашей следующей
книге.
Закрепление пройденного материала
1. Необходимо понимать, что является, а что не является представлением.
Представлением называется оператор select, динамически
генерирующий содержимое виртуальной таблицы. Хотя представления ведут себя
подобно таблицам, данные таблицы в них фактически не содержатся.
2. Знайте базисный синтаксис для создания представлений в Oracle.
Представляйте себе виды запросов, которые можно использовать в
представлениях. В основном их можно использовать практически все.
3. Умейте идентифицировать ситуации, когда можно и когда нельзя
добавлять в таблицу данные с помощью представлений.
Упражнения
1. Служащий SCOTT создает на базе таблицы ЕМР представление, используя
для этого следующий блок кода:
SQL> create or replace view emp_view as
2 ( select empno, ename, job, mgr, hiredate,
3 decode(ename, user, sal, 'KING', sal, 0) as sal,
4 decode(ename, user, comm, 'KING1, sal, 0) as comm,
5 deptno from emp) ;
View created.
Какой из приведенных ниже операторов DML успешно внесет изменения
в данные таблицы ЕМР?
A. insert into emp_view values (2345,
'SMITHERS', 'MANAGER', 7839, 4500, 0, 10);
B. update emp_view set job 'CLERK', comm 0 where
ename 'TURNER';
С delete from emp_view where ename 'SMITH';
D. update emp_view set comm comm*1.3 where ename
'TURNER';
2. Используйте показанное в предыдущем блоке кода представление для
ответа на следующий вопрос. Пользователь SCOTT регистрируется в Oracle
и задает следующий запрос:
SQL> select ename, sal from emp_view
2 where job - 'ANALYST';
ENAME SAL
SCOTT 3000
FORD 0
Затем в базе данных регистрируется пользователь TURNER и задает тот же
самый запрос. Каков будет результат, показанный в выходных данных
запроса пользователя TURNER для пользователя SCOTT?
Создание других объектов базы данных Oracle
211
А. О В. 1500
C. 3000 D. 6000
3. Пользователь SCOTT создает представление, используя для этой цели
следующий блок кода:
SQL> create or replace view my_view as
2 (select user as orcluser, rowld as row_id, empno
3 from emp
4 where ename => user)
5 order by empno;
View created.
После этого SCOTT издает следующий оператор DML: insert into
my_view values ('JASON', 'weraqwetrqwer', 3421);. Какой из
следующих вариантов ответа правильно описывает реакцию Oracle и почему?
A. Oracle возвратит сообщение об ошибке, потому что нельзя выполнять
операторы DML над представлениями, созданными с помощью
фразы order by.
B. Oracle возвратит сообщение об ошибке, потому что нельзя добавлять
данные в столбец, определенный с использованием ключевого слова
user.
С Oracle возвратит сообщение об ошибке, потому что нельзя добавлять
данные в столбец, определенный с использованием псевдостолбца
ROWID.
D. Oracle вставит в базовую таблицу новую строку, потому что в
операторе не содержится ошиблк.
4. Используйте блок кода, определенный при создании представления
MY_VIEW из предыдущего примера, для ответа на следующий вопрос: в
Oracle задается следующий оператор: delete from my_view where
orcluser = ' SCOTT •,-. Как много строк будет удалено из таблицы ЕМР?
А. 0 В. 1
C. 2 D. 14
Ответы
1. С. 2. А. 3. В. 4. В.
Создание представлений для принудительного
введения ограничений
На таблицы, лежащие в основе представлений, часто накладываются
ограничения, сужающие круг данных, которые можно в эту таблицу ввести. Как
упоминалось ранее, представления не позволяют добавлять в основную таблицу
данные, нарушающие наложенные на такую таблицу ограничения. Однако
можно определить такие представления, которые еще сильнее ограничивают
возможности пользователей изменять данные в основных таблицах,
эффективно размещая особое ограничение на манипулирование данными через
представление. Такое дополнительное ограничение говорит о том, что
заданные для представления операторы insert или update не могут создавать
такие'строки, которые впоследствии нельзя было бы выбрать оператором
select. Другими словами, если, после того как было сделано изменение,
приложение будет не в состоянии выбрать измененную строку, приложение не
позволит вам провести подобное изменение. Это ограничение на возможность
создания представлений конфигурируется при определении представления,
для чего в оператор create view добавляются ключевые слова with check
option. Для пояснения сказанного приведем пример:
212
Глава 7
SQL> create or replace view emp_view as
2 (select empno, ename, job, deptno
3 from emp
4 where deptno = 10)
5 with chack option constraint «np_vi«w_con»traint;
View created.
SQL> update emp_view set deptno - 20
2 where ename - 'KING';
update emp_view set deptno - 20
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
(нарушение фразы where представления WITH CHECK OPTION)
Совет Для некоторых систем в подобном контексте можно не получить
сообщения об ошибке ORA-01402. Вместо подобного сообщения Oracle скупо
проинформирует вас о том, что обновлено 0 строк.
Во-первых, обратите внимание на выделенную полужирным шрифтом часть
кода, где определяется ограничение возможности создания представлений. Мы
со всей определенностью заявляем здесь, что никто из пользователей не может в
рамках нашего представления внести в таблицу ЕМР такое изменение, которое
не позволило бы представлению выбрать полученную в результате строку. После
задания представления мы проверяем его, пытаясь обновить строку для
президента компании KING: изменить значение столбца DEPTNO с 10 на 20. Но
полученная в результате такого изменения строка была бы не видна представлению
и, следовательно, не могла бы быть выбрана впоследствии. Как мы уже видели,
Oracle предохраняет от проведения подобного изменения, выдавая сообщение об
ошибке ORA-01402. Кроме того, взгляните на фразу constraint в этой же
строке. Эта необязательная фраза позволяет нам определить имя создаваемого нами
ограничения. Если опустить эту фразу, Oracle сам сгенерирует имя этого
ограничения. Однако, если пользователь сам назовет ограничение, это поможет
впоследствии легко идентифицировать его в словаре данных с помощью словарных
представлений, содержащих информацию об ограничениях, например
в USER_CONSTRAINTS. В следующем примере приводятся листинг выходных
данных представления USER_CONSTRAINTS, содержащего и наше
ограничение на создание представлений:
SQL> select constraint_name, constraint_type
2 from user_constraints;
CONSTRAINT NAME С
SYS_C00905 P
SYS_C00903 С
PK_EMPLOYEE_01 P
SYS_C00921 С
CK_EMPLOYEE_01 С
EMP_VIEW_CONSTRAINT V
PK_01 P
PK_PRICES_01 P
Совет В столбце CONSTRAINTJTYPE представлений
USERJCONSTRAINTS и ALLjCONSTRAlNTS отображается первый
символ первого слова, наилучшим образом описывающего каждый из имеющихся
в Oracle типов ограничений: первичного ключа (primary key — Р), внешнегр
ключа (foreign key — F), проверки (check — С), не-NULL (not NULL — N), no
уникальности (unique key — U) или возможности создания представлений
(viewability — V).
Создание простых представлений, которые не могут изменять
данные в основных таблицах
Иногда могут возникнуть ситуации, когда вы хотите создать представление, не
позволяющее пользователям изменять данные в основных таблицах. В таком
случае можно использовать фразу with read only. Эта фраза не позволит
пользователям делать в базовой таблице никаких изменений. Допустим, после
Создание других объектов базы данных Oracle
213
того как KING (президент) сделал служащему SCOTT строгий выговор за то,
что тот обозвал его дураком, он хочет полностью перекрыть пользователям
возможность вносить любые изменения в таблицу ЕМР с помощью
представления EMP_VIEW. Ниже показано, как это можно сделать:
ИШИШ SQL> create or replace view erap_view
2 as (select * from emp)
3 with read only;
В следующий раз, когда SCOTT попытается назвать KING дураком,
произойдет следующее:
1%ЭДЭ№« SQL> update emp_view set enaroe = 'FOOL!'
2 where enarae ■« 'KING';
where ename - 'KING'
*
ERROR at line 2:
ORA-01733: virtual column not allowed here
(здесь недопустим виртуальный столбец)
Закрепление пройденного материала
1. Убедитесь, что понимаете, как работают налагаемые на представления
ограничения возможности создания представлений и как используются
фразы with check option и constraint в операторах create view для
создания этого типа ограничений.
2. Следует понимать, как с помощью фразы with read only пользователи
лишаются возможности вносить изменения в базовые таблицы через
представления для этих таблиц.
Упражнения
1. Используйте приведенный ниже блок кода для ответа на следующий
вопрос:
SQL> create or replace view erap_view as
2 (select empno, ename/ job, deptno
3 from emp
4 where job - 'MANAGER')
5 with check option;
View created.
SQL> select * from erop_view;
EMPNO ENAME JOB DEPTNO
7566 JONES MANAGER 20
7698 BLAKE MANAGER 30
7782 CLARK MANAGER 10
Какое из следующих ниже изменений данных для этого представления ие
будет принято Oracle?
A. update emp set job 'ANALYST' where job
'MANAGER' and empno 7566;
B. update emp set ename = 'BARNEY' where job
'MANAGER' and ename 'JONES';
С update emp set empno 7999 where job 'MANAGER'
and deptno 10;
D. update emp set deptno 30 where job = 'MANAGER'
and empno = 7782;
2. Используйте содержание приведенного ниже блока кода для ответа на
следующий вопрос:
SQL> create or replace view emp_view as
2 (select empno# ename, job, deptno
3 from emp
4 where job - 'MANAGER')
5 with check option;
214
Глава 7
view created.
SQL> select constraint_name, constraint_type
2 from user_constraints;
CONSTRAINT NAME С
SYS_C00905 P
SYS_C00903 С
SYS_C00921 С
SYS_C00929 V
Какое из следующих ограничений является ограничением на создание
представлений, созданным для поддержки представления EMP_VIEW?
A. SYS_C00905 В. SYS_C00903
С. SYS_C00929 D. SYS_C00921
3. Используйте для ответа на приведенный ниже вопрос следующий блок
кода:
SQL> create or replace view empview as
2 (select empno, ename, job, deptno
3 from emp
4 where job - "MANAGER")
5 with read only;
view created.
Какой из приведенных ниже вариантов оператора изменения данных будет
принят Oracle для внесения изменений в основную таблицу?
A. insert into emp_view values (2134,
'SMITHERS', 'MANAGER', 10);
B. update emp_view set ename = 'JOHNSON' where empno 7844;
C. delete from emp_view where ename 'KING';
D. Ни один из перечисленных выше
Ответы
1. А. 2. С. 3. D.
Создание сложных представлений
Как мы упоминали ранее, можно создавать представления, в которых
объединены данные более чем из одной таблицы. Такие представления принято
называть сложными представлениями. Сложные представления обеспечивают
усложненные модели данных, где в одну виртуальную таблицу соединены
данные из нескольких базовых таблиц. Давайте познакомимся со сложным
представлением, в котором соединяется содержимое таблиц ЕМР и DEPT, чтобы
образовать единую виртуальную таблицу:
вюзиваж SQL> create view emp_dept_view as
2 (select empno, ename, job, dname, loc
3 from emp e, dept d
4 where e.deptno - d.deptno
5 and job in ("ANALYST", "CLERK', 'MANAGER'));
View created.
Ниже приводится содержимое этого представления:
«ramsrea SQL> select * from emp_dept_view;
EMPNO
7782
7934
7369
7566
7876
7902
7788
7698
7900
ENAME
CLARK
MILLER
SMITH
JONES
ADAMS
FORD
SCOTT
BLAKE
JAMES
JOB
MANAGER
CLERK
CLERK
MANAGER
CLERK
ANALYST
ANALYST
MANAGER
CLERK
DNAME
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
LOC
NEW YORK
NEW YORK
DALLAS
DALLAS
DALLAS
DALLAS
DALLAS
CHICAGO
CHICAGO
Создание других объектов базы данных Oracle
215
Совет Те же самые типы операторов select, которые были разрешены
для определения простых представлений, обычно оказываются приемлемы и
для сложных представлений. Если вы желаете, можно вернуться к списку
приемлемых для простых представлений операторов select, чтобы
облегчить переход к сложным представлениям. При определении сложных
представлений можно использовать даже операторы внешнего соединения (+).'
Обновление базовых таблиц сложных представлений
По большей части сложные представления не дают нам возможности
изменять данные в любой из базовых таблиц, если только мы не определили
должным образом отношения внешних и первичных ключей между
соединяемыми таблицами с использованием соответствующих ограничений
целостности Oracle. Попробуем разобраться в том, что стоит за этим
утверждением. Словарное представление USER_UPDATABLE_COLUMNS может
подсказать нам, какие столбцы сложного представления могут быть
модифицированы. Изучим его: •
SQL> create or replace view emp_dept_view as
2 (select empno, ename, job, loc
3 from emp *, dept d
4 where e.deptno -» d.deptno);
view created.
SQL> select column_name, updatable
2 from user_updatable_columns
3 where table_name = ,EMP_DEPT_VIEW1;
COLUMN NAME UPD
EMPNO NO
ENAME NO
JOB NO
LOC NO
Однако, после того как мы правильно определим между таблицами ЕМР и
DEPT отношения внешнего и первичного ключей, можно будет создать
сложное представление, которое позволит провести частичную модификацию
данных в базовых таблицах с помощью этого представления. Давайте рассмотрим
пример такого представления, которое называется обновляемым
представлением с соединением (updatable join view) или модифицируемым представлением с
соединением (modifiable join view). Представление с соединением — это всего
лишь еще одно название сложного представления, которое имеет под собой
почву, поскольку сложные представления содержат операции соединения.
Познакомимся со следующим кодом:
lsas™jai SQL> alter table emp add constraint pk_emp_01
2 primary key (empno);
Table altered.
SQL> alter table dept add constraint pk_dept_01
2 primary key (deptno);
Table altered.
SQL> alter table emp add constraint fk_emp_01
2 foreign key (deptno) references dept (deptno);
Table altered.
SQL> create or replace view emp_dept_view as
2 (select empno, ename, job, loc
3 from emp e, dept d
4 where e.deptno =■ d.deptno);
View created.
SQL> select column_name, updatable
2 from user_updatable_columns
3 where table_name - 'EMP_DEPT_VIEW';
COLUMN NAME UPD
EMPNO YES
ENAME YES
JOB YES
LOC NO
216
Глава 7
Совет Представления, содержащие внешние соединения, обычно не
содержат таблиц с сохраняемыми ключами (key-preserved tables), если только
внешнее соединение не генерирует значений NULL. Но даже в таком случае
способность к обновлению (updatability) зависит от ваших данных, так что
для всех целей и намерений следует считать, что представления с внешними
соединениями обновлять нельзя.
Это уже лучше. Теперь, если мы зададим для представления
EMP_DEPT_VIEW оператор update, модифицирующий столбцы EMPNO,
ENAME или JOB, Oracle позволит нам произвести изменения. Тем не менее
обратите внимание, что мы по-прежнему не можем обновлять один из
столбцов. Чтобы понять, почему так происходит, мы должны поговорить о
концепции таблиц с сохраняемыми ключами. Таблицей с сохраняемыми ключами
называется таблица в сложном представлении, столбец первичного ключа
которой включен в представление, и все значения которого в представлении
уникальны и не пусты (not NULL). Это означает, что первичный ключ для
таблицы с сохраняемыми ключами можно рассматривать как первичный ключ
для данных, входящих в представление. В некоторых случаях многие таблицы
сложного представления могут быть таблицами с сохраняемыми ключами,
если первичный ключ представления является первичным ключом в
нескольких из соединенных таблиц. Через сложное представление можно
модифицировать только столбцы из таблиц с сохраняемыми ключами. Столбцы из
таблиц с несохраняемыми ключами (non-key-preserved tables) нельзя
модифицировать с помощью сложных представлений. В нашем случае
примером такого столбца служит LOC из DEPT. В заключение добавим, что над
сложным представлением можно выполнять операторы изменения данных,
если выполняются следующие условия:
■ Оператор должен влиять только на одну из участвующих в соединении
таблиц.
■ Для операторов обновления все изменяемые столбцы должны быть
выбраны из таблицы с сохраняемыми ключами. В дополнение, если
представление создано с использованием фразы with check option, не могут стать
частью обновляемого набора те столбцы, по которым производится
соединение, а также столбцы, упоминающиеся в представлении более одного
раза.
■ Для операторов delete в соединении может присутствовать только одна
таблица с сохраняемыми столбцами. Такая таблица может присутствовать
в представлении более одного раза, за исключением случая, когда
представление было создано с фразой with check option.
Ш Для операторов insert все столбцы, в которые вставляются значения,
должны быть из таблицы с сохраняемыми ключами, а само представление
не должно быть создано с фразой with check option.
■ Сложное представление не должно содержать групповых функций,
выражений group by, операций надмножествами, ключевого слова distinct,
фраз start with или connect by, а также псевдостолбца ROWNUM.
Псевдостолбцами называются виртуальные столбцы таблицы, в которые
нельзя добавлять данные или изменять их.
Совет К операциям над множествами относятся ключевые слова UNION,
union all, intersect u minus, которые используются для объединения
выходных данных одного оператора select с выходными данными другого
оператора. К примеру, оператор select empno from emp UNION select
sal from emp является операцией над множествами. Обычно подобные
операторы не входят в программу экзамена ОСР, поэтому подробного их
разбора в этой книге сделано не будет.
Создание других объектов базы данных Oracle
217
Закрепление пройденного материала
1. Умейте определять значение сложного представления или, как его еще
называют, представления с соединением. Знайте, чем сложные
представления отличаются от простых. Убедитесь, что умеете определять типы
операторов select, допустимых при определении сложного представления.
В. Знайте факторы, ограничивающие вашу способность вносить изменения в
базовые таблицы сложного представления. В частности, понимайте всю
важность ограничений в базовых таблицах для укрепления связи между
двумя таблицами, а также концепцию таблиц с сохраняемыми ключами.
3. Убедитесь, что можете перечислить все элементы, которых не может
содержать сложное представление, для которого вы желаете модифицировать
базовые таблицы.
Упражнения
1. База данных с информацией о продажах состоит из четырех таблиц:
PROFITS содержит размер прибыли от продаж каждого из продуктов
компании, сгруппированной по имени и типу продукта, региону продажи и
кварталу; в таблице PRODUCT_TYPE перечислены все типы продукции,
продаваемой компанией; в таблице PRICES собрана вся информация о
ценах и именах продуктов, а в таблице UNITSALES для каждого продукта
приводятся его объемы продаж по кварталам. Используя приведенный
ниже блок кода, вы создаете для этой базы данных представление:
SQL> create or replace view profits_view as
2 (select a.product_name, a.product_type, b.product_desc,
3 c.product_price,
4 d.unit_sale, a.quarter
5 from profits a, product_types b, prices c, unit_sales d
6 where a.product_type = b.product_type
7 and a.product_name - c.product_name
8 and a.product_name - d.product_name
9 and a.quarter — d.quarter);
View created.
Какая из перечисленных ниже таблиц базы данных не является таблицей с
сохраняемыми ключами, если предположить, что для таблиц имеют место
все необходимые ограничения целостности:
A. PROFITS
B. PRODUCTJTYPES
C. PRICES
D. UNIT_SALES
2. Вы проектируете в Oracle сложные представления. Какой из приведенных
ниже вариантов ответа идентифицирует элемент, который нельзя
включить в запрос, определяющий представление, если вы намерены позволить
пользователям обновлять соединенные в представлении таблицы с
сохраняемыми ключами?
A. avg( ) В. decode( )
С nvl( ) D. to_char( )
3. У таблиц с сохраняемыми ключами это является общим с выходными
данными определяемого ими сложного представления:
Ответы
1. В. 2. А. 3. Первичный ключ
218
Глава 7
Модификация и удаление представлений
Заметьте, что в некоторых случаях мы изменяли определение уже
существующих в базе данных представлений. Однако при этом мы не подчинялись тем
правилам, которые применяются для других объектов Oracle, например для
таблиц, когда мы желаем модифицировать их. Это связано с тем, что
представления не подчиняются синтаксическим соглашениям для других объектов
базы данных. Хотя в Oracle имеется оператор alter view, он используется
для перекомпиляции или для подтверждения существующего представления.
Познакомьтесь с примером:
««аийтай SQL> alter view emp_dept_view compile;
View altered.
Если же мы желаем изменить данные, используемые при определении
представления, мы используем оператор create or replace view. При
задании оператора create or replace view Oracle игнорирует ошибку,
возникающую вследствие того, что уже существует представление с таким именем, и
заменяет старое определение представления новым. Следующий ниже блок
кода служит иллюстрацией использования оператора create or replace из
первого упражнения предыдущей темы:
IEEQE29S SQL> craata or raplaca view profita_viav aa
2 (select a.product_name, a.product_type, b.product_desc,
3 c.product_price,
4 d.unit_sale, a.quarter
5 from profits a, product__types b, prices c, unit_sales d
6 where a.product_type = b.product_type
7 and a.product^name = c.product_name
8 and a.product_name -» d.product_name
9 and a.quarter = d.quarter);
view created.
Совет Если вы желаете поработать с приведенным выше примером в
собственной базе данных, необходимо создать собственную версию каждой из
четырех таблиц, используя для этого все, что о них известно. Когда будете
делать это, убедитесь, что определения типов данных общих столбцов
PRODUCT_NAME, PRODUCTJTYPE и QUARTER в этих таблицах
совпадают. Кроме того, убедитесь, что не забыли внести все необходимые
ограничения целостности для первичных и внешних ключей этих таблиц. Сценарии
автоматического создания этих таблиц отсутствуют. Мы полагаем, что это
очень важно для успешной сдачи экзамена ОСР — иметь практический опыт
разработки сложных представлений.
Из последней строки примера следует, что Oracle создала это
представление без ошибок. Если мы желаем проверить статус этого представления, его
можно найти в представлении USEROBJECTS, как это показано в
следующем примере:
"3SMeslra,B SQL> column object_name format a20
SQL> select object_name, status
2 from user_objecte
3 where object_name - ' PROFITS^VIEW ;
OBJECT NAME STATUS
PROFITS_VIEW VALID
Совет В представлении USER_VIEWS статус действительности вашего
представления не содержится. Запомните, как говорится,
крепко-накрепко, что статус всех созданных пользователями объектов базы данных
можно найти в представлениях USER_OBJECTS и ALLJOBJECTS.
Теперь давайте удалим таблицу PRICES, которая, как вы помните,
является одной из базовых таблиц представления PROFITS_VTEW. Обратите
внимание, что произойдет с PROFITS_VIEW:
«зааваиаа SQL> drop table prices;
Table dropped.
Создание других объектов базы данных Oracle
219
SQL> select object_name, status
2 from user_objects
3 where object_name - 'PROFITS_VIEW ;
OBJECT NAME STATUS
PROFITS_VIEW INVALID
Как видите, при разрушении базовой таблицы Oracle не удаляет
представление из базы данных. Она просто помечает его как недействительное. Это
служит указанием, что зависимость объектов, имевшая место между PRICES и
PROFITS_VIEW, нарушена. А вот что происходит при попытке получить
данные с помощью PROFITS_VIEW:
*38ШШИ SQL> select * from profits_view;
select * from profits_view;
*
ERROR at 1ine 1:
ORA-04063: view "SCOTT.PROFITS_VIEW" has errors
(ошибки в представлении 'SCOTT.PROFITS_VIEW)
Способ разрешения подобной проблемы состоит в повторном создании
таблицы PRICES и перекомпиляции представления PROFITS_VIEW, как это
сделано в следующем блоке кода. В случае успешной перекомпиляции
представления мы снова имеем возможность использовать его для получения данных:
f¥ftSiSii?ift SQL> create table prices
2 (product_name varchar2(10) primary key,
3 product_price number (10,4));
Table created.
SQL> alter view profits_yiew compile;
View altered.
Совет И наоборот, для исправления представления, ставшего
недействительным вследствие переопределения или удаления таблицы, являющейся
для него базовой, следует модифицировать представление, прибегнув к
оператору create or replace view.
Удаление представлений
Возможно, когда-то вам потребуется удалить представление. Для выполнения
этой функции в Oracle имеется оператор drop view. He существует никаких
каскадных сценариев, о которых должно быть известно лицу, удаляющему
представление, за одним исключением, когда удаляется представление,
служащее базовой таблицей для другого представления. В этом случае остающееся
представление просто помечается как недействительное. Оператор drop view
удаляет из базы данных определение представления. Удаление представлений
не сказывается на таблицах, по которым строится представление. Следующий
пример служит иллюстрацией использования оператора drop view для
удаления представлений из базы данных:
t£££SS£3& SQL> drop view prof its_view;
View dropped.
Закрепление пройденного материала
1. Знайте, как использовать оператор alter view для перекомпиляции
представлений и оператор create or replace view для повторного
определения запроса представления.
2. Знайте, что объектной зависимостью называется ситуация, когда один
объект базы данных зависит от информации из другого объекта базы данных.
У представлений имеется такая зависимость от базовых таблиц. Знайте, что
происходит со статусом представления, когда удаляется его базовая
таблица, а также что нужно сделать для исправления ситуации.
220
Глава 7
Упражнения
1. Вы только что восстановили базовую таблицу представления, которая была
непредумышленно удалена. Какие два из следующих операторов могут
быть использованы для того, чтобы за один шаг обновить статус
представления? (Выберите два ответа.)
A. create view
B. create or replace view
С alter view
D. drop view
8. Какой термин используется для описания зависимости между
представлением и его базовой таблицей (два слова)?
3. Вы хотели бы определить статус представлений в базе данных. Какое из
следующих словарных представлений можно использовать для этой цели?
A. USER_VIEWS
B. USER_TAB_COLUMNS
С USER_OBJECTS
D. USER_TABLES
Ответы
1. В и С. 2. Объектная зависимость. 3. С.
Другие объекты базы данных
В этом разделе мы коснемся следующих тем, связанных с другими объектами
баз данных Oracle:
■ Обзор других объектов базы данных
■ Использование последовательностей
■ Использование индексов
■ Использование общедоступных и частных синонимов
Вы получили некоторое представление о небольшом числе типов объектов,
доступных для использования в базах данных Oracle. В этом разделе мы дадим
обзор множества других важных объектов, имеющихся в Oracle. Вы получите
представление о ручном создании последовательностей в базах данных Oracle
и об их использовании. После этого мы познакомим вас с индексами —
объектами, повышающими производительность баз данных Oracle. И наконец, мы
познакомим вас с использованием в базах данных Oracle общедоступных и
частных синонимов.
Обзор других объектов базы данных
Ниже перечислены некоторые из объектов, являющихся частью выпускаемой
корпорацией Oracle реляционной базы данных, которые используются для
выполнения перечисленных выше функций:
■ Таблицы, представления и синонимы Используются для хранения данных
и доступа к ним. Основными структурными единицами хранения в Oracle
являются таблицы. Представления логически соответствуют
подмножествам данных из одной или нескольких таблиц. Синонимы обеспечивают
альтернативные имена объектов базы данных.
■ Индексы н РСУБД Oracle Используются для ускорения доступа к
данным.
Создание других объектов базы данных Oracle 221
■ Последовательности Используются для генерации чисел для различных
целей.
■ Триггеры и ограничения целостности Используются для поддержания
допустимости вводимых данных.
■ Привилегии, роли и профили Используются для управления доступом к
базе данных и ее использованием.
■ Пакеты, процедуры и функции Прикладные коды PL/SQL, используемые
в базах данных.
Совет Это далеко не полный список имеющихся в Oracle различных типов
объектов. На самом деле имеются десятки типов объектов, о которых не
будет идти речь в этой книге. Но для успешной сдачи первого экзамена ОСР
вам не требуется ничего знать о том, как создавать и использовать не
упомянутые в этой книге типы объектов. Однако вы должны знать, что собой
представляют перечисленные выше объекты: мы либо уже говорили о них,
либо обсудим их по ходу изложения.
Закрепление пройденного материала
Убедитесь, что способны назвать различные типы объектов баз данных Oracle,
перечисленные выше. Все они обсуждались или будут обсуждены в настоящей
книге. В базах данных Oracle существуют и другие объекты, однако они не
входят в состав экзамена ОСР.
Упражнения
1. Этот объект базы данных, содержащий хранящийся в базе данных код
PL/SQL, предназначен для выполнения некоторых программных задач:
S. Этот объект базы данных, спроектированный для принудительного
выполнения правил достоверности для данных, добавляемых в базу данных, не
использует код PL/SQL:
3. Этот объект базы данных используется для генерации чисел в
определенном порядке:
Ответы
1. Пакет (другие допустимые ответы: процедура или функция). 2. Ограничение. 3.
Последовательность.
Использование последовательностей
Последовательностью называется объект базы данных, генерирующий целые
числа в соответствии с правилами, определенными в момент создания
последовательности. Последовательность автоматически генерирует уникальные
числа и может совместно использоваться несколькими различными
пользователями Oracle. В системах баз данных у последовательностей имеется
множество назначений, и наиболее часто применяемым является автоматическая
генерация первичных ключей таблиц. Однако ничто не ограничивает
применение последовательностей только первичными ключами таблиц, так
как в некотором смысле — это также совместно используемый объект.
Подобная задача является распространенной в ситуациях, когда первичный ключ не
используется для доступа к данным таблицы. У общепринятого использования
последовательностей для генерации первичных ключей имеется один главный
недостаток. Поскольку первичный ключ является просто числом, то и он сам,
и создаваемый по нему индекс представляются до некоторой степени
бессмысленными. Однако, если этот ключ требуется только для гарантирования
уникальности и вас не беспокоит, что вы создаете ключ-нонсенс, лучше этой
процедуры ничего придумать нельзя. Последовательности создаются с помо-
222
Глава 7
щыо оператора create sequence. Ниже приводится объяснение каждой
фразы оператора:
Ш start with л Позволяет создателю последовательности указать первое
значение генерируемой последовательности. После создания
последовательность будет генерировать специфицированное во фразе start with
значение при первом упоминании NEXTVAL — виртуального столбца
последовательности. Если фраза start with не специфицирована, по
умолчанию Oracle выбирает в качестве начального значения 1.
■ increment by л Определяет число, на которое будет увеличена
последовательность при каждом последующем упоминании виртуального столбца
последовательности NEXTVAL. Значение по умолчанию для этой фразы
равно 1 и используется в том случае, если фраза не была явно
специфицирована. Значение л может быть выбрано положительным (в таком случае
последовательность будет возрастающей) или отрицательным (в этом
случае последовательность будет убывающей или, иначе,
последовательностью в обратном направлении).
■ minvalue л Определяет минимальное значение, которое может быть
выработано последовательностью. Если фраза не специфицирована, Oracle
по умолчанию будет использовать значение nominvalue (минимальное
значение отсутствует).
■ maxvalue л Определяет максимальное значение, которое может быть
выработано последовательностью. Если фраза не специфицирована,
Oracle по умолчанию будет использовать значение nomaxvalue (максимальное
значение отсутствует).
Ш cycle Дает последовательности возможность повторять значения,
вырабатываемые после достижения пороговых значений maxvalue или
minvalue. Если такое повторение значений (зацикливание) нежелательно
или не специфицировано явно, Oracle предполагает использование
значения по умолчанию, nocycle. Значение cycle не может быть
специфицировано в сочетании с nominvalue или nomaxvalue. Если вы желаете
зациклить последовательность, обязательно нужно специфицировать
значение maxvalue для возрастающих последовательностей или minvalue для
убывающих последовательностей.
Ш cache л Позволяет последовательности для повышения
производительности кэшировать указанное количество значений. Если кэширование не
требуется или не специфицировано явным образом, Oracle принимает
значение по умолчанию (кэширует 20 значений).
Ш order Позволяет последовательности назначать значения в том порядке,
в котором были получены запросы к последовательности. Если порядок
нежелателен или не специфицирован явным образом, Oracle принимает
значение по умолчанию, noorder.
А теперь рассмотрим пример определения последовательности. Целые
числа, специфицированные для последовательности, могут быть как
положительными, так и отрицательными. В приведенном ниже примере используется
убывающая последовательность. Начальное целое значение (фраза start
with) в этом примере является положительным, но приращение (фраза
increment by) сделано отрицательным, что служит явным указанием
генерировать убывающую, а не возрастающую последовательность. При достижении
нулевого значения последовательность должна снова начать обратный отсчет
с начального значения. Такая последовательность может оказаться полезной в
программах, где требуется вести обратный отсчет до тех пор, пока не
произойдет событие. Далее следует обещанный пример:
IWffWW SQL> CREATE SEQUENCE COUntdown_20
2 START WITH 20
3 INCREMENT BY
4 MAXVALUE 20
5 MINVALUE 0
Создание других объектов базы данных Oracle
223
6 CYCLE
7 ORDER
8 CACHE 2;
Sequence created.
Совет К числу применений последовательностей в реальной жизни
относится автоматическая генерация сопроводительных номеров, номеров
счетов и прочей числовой информации.
После того как последовательность создана, на нее можно ссылаться,
используя псевдостолбцы CURRVAL и NEXTVAL. Пользователи базы данных
могут видеть текущее значение последовательности, используя оператор
select. Аналогично следующее значение последовательности также может быть
сгенерировано в операторе select. Поскольку последовательности не
являются таблицами — они всего лишь объекты для генерации целых чисел путем
использования виртуальных столбцов — роль "виртуальной" таблицы, из
которой извлекаются данные виртуальных столбцов, играет таблица DUAL. Как
отмечалось ранее, в последовательность нельзя поместить значение, из
последовательности можно только извлекать значения.
Приведенный ниже пример показывает, как происходит зацикливание
последовательности COUNTDQWN_20 при достижении значения minvalue:
Ш&&ЯЯЯ SQL> select countdown_20.nextval from dual;
NEXTVAL
SQL>
20
/
NEXTVAL
SQL>
19
/
NEXTVAL
SQL>
1
/
NEXTVAL
SQL>
0
/
NEXTVAL
20
Совет Ссылки на последовательности не могут быть использованы в
подзапросах операторов select (в том числе с фразой having),
представлениях, операторах select, использующих операции надмножествами
(например, union и minus), или любых операторах select, в которых требуется
сортировка.
После ссылки на столбец NEXTVAL значение столбца CURRVAL
обновляется, чтобы оно соответствовало значению из NEXTVAL, а предыдущее
значение CURRVAL теряется. Это иллюстрируется следующим блоком кода:
ИИВЯЯв SQL> select countdown_20.currval from dual;
CURRVAL
20
SQL> select countdown_20.nextval from dual;
NEXTVAL
19
SQL> select countdown_20.curxval from dual;
CURRVAL
19
Совет CURRVAL устанавливается равным значению start with до тех
nop, пока не произойдет первой после создания последовательности ссылки
на NEXTVAL. После этого CURRVAL устанавливается равным NEXTVAL.
При каждой ссылке на NEXTVAL изменяется и значение CURRVAL. Инте-
224
Глава 7
ресно отметить, что, когда происходит первая ссылка на NEXTVAL, это
значение также устанавливается равным значению start with, так что
фактически значение CURRVAL не изменяется!
Ссылки на последовательности при изменении данных
Генерацию значений последовательности можно включить непосредственно в
изменения данных, выполняемые с помощью операторов insert и update.
Именно такое прямое использование последовательностей в операторах
insert и update является наиболее общераспространенным видом их
использования в базах данных. В том случае, если последовательность используется для
генерации первичных ключей для всех новых строк, вводимых в таблицу базы
данных, на нее, скорее всего, будет сделана прямая ссылка из оператора
insert. Однако заметьте, что в тех случаях, когда на последовательность
ссылаются триггеры, такой подход может закончиться аварийно. Поэтому лучше
ссылаться на последовательности из пользовательского интерфейса или из
хранимых процедур. Следующие операторы иллюстрируют прямое
использование последовательностей в изменениях, производимых над таблицами:
тяшвлж SQL> INSERT INTO expense (expense_no, empid, amt, submit_date)
2 VALUES(countdown_20.nextval, 59495, 456.34, '21-NOV-99■);
1 row inserted.
SQL> UPDATE product
2 SET product_num - countdown_20.currval
3 WHERE serial_num - 34938583945;
1 row updated.
Совет Эти тривиальные примеры блоков кода созданы как для таблиц, с
которыми мы сталкивались ранее, так и для тех, с которыми нам ранее
сталкиваться, а значит, и обсуждать их не приходилось. Вы можете
сформулировать свои собственные последовательности и использовать их
аналогичным образом для таблиц, с которыми уже работали ранее, или для
созданных самостоятельно таблиц.
Модификация определения последовательности
Может наступить такое время, когда придется тем или иным образом
изменить правила формирования последовательности базы данных. К примеру,
может потребоваться изменить декремент последовательности
COUNTDOWN_20. Для изменения любого параметра последовательности
достаточно задать оператор alter sequence. Далее следует пример:
«ияиич SQL> select countdown_20 .nextval from dual;
NEXTVAL
16
SQL> alter sequence countdown_20
2 increment by -4;
Sequence altered.
SQL> select countdown_20.nextval from dual
2 ;
NEXTVAL
12
SQL> /
NEXTVAL
8
Эффект проявляется немедленно. В этом примере оператор alter sequence
изменит последовательность COUNTDOWN_20 таким образом, чтобы ее
декремент стал равен 4 вместо 1.
Любой параметр последовательности, не определенный явно в операторе
alter sequence, остается неизменным. Следовательно, если мы изменим
последовательность таким образом, чтобы в ней вместо cycle использовался
параметр nocycle, то в следующем листинге мы вынудим последовательность
Создание других объектов базы данных Oracle
225
COUNTDOWN20 выполнить только один проход — от 20 до 0. После того
как будет сгенерировано значение 0, все последующие обращения к
COUNTDOWN_20 запрещаются:
ияаяяаа» SQL> alter sequence countdown_20
2 nocycle;
Sequence altered.
SOL> select countdown_20.nextval from dual;
NEXTVAL
4
SQL> /
NEXTVAL
0
SQL> /
select countdown_20.nextval from dual
*
ERROR at line 1:
ORA-08004: sequence COUNTDOWN_20.NEXTVAL goes below MINVALUE and cannot be
instantiated
(последовательность COUNTDOWN_20.NEXTVAL опускается ниже значения MINVALUE и ей не
может Сыть приписано значение)
Опасайтесь эффектов модификации последовательностей
Модификация последовательностей — это простой процесс. Однако влияние
этих изменений может быть сложным и зависеть от того, как приложение
использует эти последовательности. Основное беспокойство, связанное с
изменением последовательностей, — это мониторинг влияния, оказываемого на
таблицы или другие процессы, использующие сгенерированные
последовательностями значения.
К примеру, совершенно нетрудно выполнить сброс величины,
возвращаемой последовательностью, со значения 1150 в 0. Однако если эта
последовательность используется для генерации первичных ключей таблицы
и для этой таблицы уже было сгенерировано несколько значений ключа в
диапазоне от 0 до 1150, то нам придется столкнуться с проблемой, когда
последовательность снова начнет генерировать значения для операторов
insert в качестве первичных ключей для этой же таблицы. Эта проблема
проявляется не тогда, когда мы изменяем параметры последовательности.
Неожиданно при последующем выполнении операторов insert возникнет
нарушение ограничения первичного ключа для этой таблицы. Единственный
способ решения этой проблемы (конечно, если не считать полного удаления
всех имеющихся в таблице записей и их повторного ввода) — это еще раз
изменить последовательность. При этом могут возникнуть дыры в значениях
первичных ключей.
Удаление последовательностей
Если последовательность более не нужна, ее можно удалить. Для этого АБД
или владелец последовательности может задать оператор drop sequence.
Удаление последовательности переводит ее виртуальные столбцы CURRVAL
и NEXTVAL в статус неиспользуемых. Однако, если последовательность
использовалась для генерации первичных ключей таблицы, все сгенерированные
ею значения ключей продолжают свое существование в базе данных. Про это
говорят, что при удалении последовательности отсутствуют каскадные
эффекты. Проиллюстрируем сказанное примером:
tXWSKt SQL> DROP SEQUENCE countdown_20;
Sequence dropped.
SQL> select countdown_20.currval from dual;
select countdown_20.currval from dual
ERROR at line 1:
ORA-02289: sequence does not exist
(последовательности не существует)
226
Глава 7
Совет Информацию о созданных вами или доступных вам
последовательностях можно найти в словарных представлениях USER_SEQUENCES и
ALLSEQUENCES соответственно. Кроме того, последовательности не
"привязаны"к определенным таблицам. Вообще, последовательности
следует называть с учетом их использования (по назначению); однако
использовать их можно в любых целях, независимо от имени.
Пропуски в последовательности
Хотя генераторы последовательностей и выдают последовательные числа без
промежутков, это действие происходит независимо от выполняемых в базе
данных операторов rollback (откат) или commit (фиксирование).
Следовательно, если будет откачен оператор, содержавший обращения к
последовательности, все сгенерированные числа будут потеряны. Еще одно событие,
которое может привести к возникновению пропусков в последовательности, — это
полный отказ системы. Если последовательность кэшировала
вырабатываемые значения в памяти, эти значения будут потеряны при отказе системы. И
наконец, поскольку, как мы уже говорили, последовательности не привязаны
к таблицам, может получиться так, что одна и та же последовательность будет
использована для нескольких таблиц. Если вы поступите подобным образом,
то каждая из таблиц будет содержать пропуски в последовательных номерах.
Закрепление пройденного материала
1. Убедитесь, что вы твердо знаете, что последовательность — это объект,
генерирующий числа в заданной вами последовательности. Можно
использовать последовательности для разных целей, но наиболее часто они
используются для генерации уникальных чисел для столбцов первичных
ключей.
2. Знайте, как используются операторы create sequence, alter sequence
и drop sequence. Кроме того, проверьте, можете ли вы идентифицировать
содержащуюся в псевдостолбцах CURRVAL и NEXTVAL информацию
последовательности, а также сказать, что произойдет при выборке значений
из этих псевдостолбцов.
3. Помните различные способы обращения к последовательностям с
помощью операторов select, insert и update. Знайте, как используются
последовательности в сочетании с таблицей DUAL.
Упражнения
1. В этом псевдостолбце последовательности содержится самое последнее по
времени сгенерированное значение, выработанное последовательностью:
2. В этом псевдостолбце последовательности содержится самое последнее
значение, выработанное последовательностью:
Ответы
1. NEXTVAL. 2. CURRVAL.
Использование индексов
Индексами называются объекты базы данных, обеспечивающие
отображение всех значений столбца таблицы вместе со значениями ROWID для всех
строк таблицы, содержащих это значение столбца. ROWID — это
уникальный идентификатор строки таблицы базы данных Oracle. У индексов базы
данных Oracle имеется множество назначений. Индексы можно
использовать для гарантии уникальности в базе данных, кроме того, они значительно
повышают производительность при поиске записей в таблице. Индексы
используются сервером Oracle для ускорения выборки строк с помощью указа-
Создание других объектов базы данных Oracle
227
телей. Увеличение производительности достигается в тех случаях, когда в
критерии поиска данных в таблице включены ссылки на индексированный
столбец или столбцы. В Oracle индексы могут быть созданы для любого
столбца таблицы, за исключением столбцов типа LONG. Разница между еле
волочащими ноги приложениями, не использующими индексы, и
эффективно работающими приложениями с индексированными таблицами
становится особенно очевидной для больших таблиц. Однако, прежде чем принять
окончательное решение о создании индекса, следует взвесить многие
соображения. Если случайным образом набросать в таблицу несколько индексов,
это, скорее всего, не приведет к повышению производительности. Индексы
могут сократить использование дискового ввода/вывода, используя для
быстрого определения расположения данных методы быстрых путей доступа к
данным. Использование и сопровождение индексов выполняется сервером
Oracle в автоматическом режиме. Создание индексов выполняется
автоматически или вручную.
Структура двоичного дерева индексов
Традиционные индексы в Oracle базируются на использовании весьма
передового алгоритма сортировки данных, который называется двоичным (бинарным)
деревом (B-tree). Данные в двоичном дереве размещены на нескольких уровнях
порядка ветвления сверху вниз, напоминая перевернутое корнем вверх дерево.
Средняя точка всего списка в целом размещается на самом верху дерева и
называется корневым узлом. Средние точки каждого из двух получившихся в
результате списков помещаются на следующем уровне индекса и так далее, как
это показано на рис. 7.1.
За счет использования алгоритма разбивки для структурирования и поиска
данных конкретное значение в столбце отыскивается всего за несколько
перемещений по дереву, что, конечно, не идет ни в какое сравнение с
несколькими тысячами операций последовательного чтения при просмотре всего
списка. Однако традиционные индексы хорошо работают в тех случаях, когда в
столбце имеется большое число различных (distinct) значений или когда
значения столбца являются уникальными.
{Терминальные!
узлы (листья) I
Tuggle "> (Williams)
rowidAcrowidJ
228
Глава 7
Алгоритм работает следующим образом:
1. Сравните разыскиваемое значение со значением, находящимся на равном
расстоянии от обоих концов списка. Если отыскиваемое значение больше,
отбросьте левую (нижнюю, то есть содержащую младшие значения)
половину списка. Если отыскиваемое значение меньше, отбросьте правую
(верхнюю, то есть содержащую старшие значения) половину списка.
2. Повторяйте шаг 1 для оставшейся части списка до тех пор, пока не будет
найдено искомое значение или не будет исчерпан список.
Вместе со значениями данных столбца в каждом индивидуальном узле
индекса также хранится порция информации о том, где именно на диске
хранятся значения столбца. Эта важная для поиска данных информация называется
ROWID. Значение ROWID для значения столбца непосредственно указывает
Oracle дисковый адрес строки таблицы, соответствующей искомому значению
столбца. С помощью ROWID идентифицируется адрес строки в блоке данных
записанного на диск файла данных. Используя эту информацию, Oracle может
затем отыскать все связанные со строкой таблицы данные.
Совет ROWID для таблицы — это адрес строки на диске. С помощью
ROWID Oracle может быстро отыскать на диске все данные.
Структура битового индекса
Эта тема считается довольно трудной, так что считайте себя
предупрежденными. Другим доступным в Oracle типом индексов является битовый (bitmap)
индекс. Попытайтесь концептуализировать (осмыслить) битовый индекс, как
будто это "хитрая" таблица соответствия, состоящая из строк,
соответствующих всем уникальным значениям данных в подлежащем индексированию
столбце. Следовательно, если индексированный столбец содержит всего три
различных значения, можно представить себе, что битовый индекс содержит
три строки. Каждая строка индекса состоит из четырех столбцов. В первом
столбце содержится уникальное индексируемое значение столбца. Далее
следует значение начального ROWID всех строк таблицы. В третьем столбце
содержится значение конечного ROWID всех строк таблицы. В четвертом
столбце содержится битовый образ, в котором каждой строке таблицы
соответствует ровно один бит. Следовательно, если подлежащая
индексированию таблица содержит 1000 строк, последний столбец битового индекса будет
иметь длину 1000 бит. Каждый бит битового индекса может принимать
значение 0 (выключено) или 1 (включено) в зависимости от того, содержит
соответствующая строка таблицы это значение столбца или нет. Другими словами,
если значение индексируемого столбца для этой строки совпадает с
уникальным значением из первого столбца индекса, этот бит устанавливается в 1;
в противном случае он устанавливается в 0. На рис. 7.2 показан битовый
индекс, содержащий три различных значения.
Каждая строка индексируемой таблицы добавляет к общему размеру
битового образа всего один бит, так что увеличение размеров таблицы не слишком
сильно влияет на размер битового индекса. Однако каждое новое значение
добавляет к индексу еще одну строку, содержащую весь битовый образ (то есть
по одному биту на каждую строку таблицы). Будьте внимательны при
добавлении новых значений в столбец, для которого имеется битовый индекс, так как
подобные индексы лучше работают для столбцов с небольшим количеством
уникальных значений. Классическим примером использования битовых
индексов является запрос к таблице, в которой содержатся фамилии
сотрудников и столбец GENDER, содержимое которого разделяет сотрудников по
половому признаку. Информация о сотруднике в столбце меняется весьма редко
и может принимать всего два различных значения, так что традиционный
бинарный индекс практически бесполезен. Однако это и есть тот самый случай,
когда применение битового индекса может резко поднять
производительность. Следовательно, битовые индексы позволяют поднять
производительность в ситуациях, когда не помогают традиционные индексы.
Создание других объектов базы данных Oracle
229
Схема битового
индекса
Битовый индекс по столбцу TYPE таблицы APPLES
Granny Smith
Red Delicious
Macintosh
AAAAvQAAGAAAA3yAAA
AAAAvQAAGAAAA3yAAA
AAAAvQAAGAAAA3yAAA
AAAAvQAAGZZZZ3yZZZ
AAAAvQAAG77773yZZZ
AAAAvQAAGZZZZ3yZZZ
100...
010...
001...
Cart
Weight
Count
Type
\J
_ Число битов=
числу строк
Таблица APPLES
Совет В один двоичный индекс можно включить до 32 столбцов таблицы, в
то время как битовый индекс может содержать не более 30 столбцов
таблицы.
Создание индексов
Уникальный двоичный индекс по столбцу можно создать вручную, используя
оператор create index (name) on table (column), содержащий ключевое
слово unique. Этот процесс является ручным эквивалентом создания для
таблицы ограничения по уникальности или ограничения первичного ключа.
Вспомните, что для поддержки таких ограничений автоматически создаются
уникальные индексы.
Можно также создать индекс для столбца, содержащего пустые (NULL)
или повторяющиеся значения. Для этого достаточно удалить ключевое слово
unique. Кроме того, можно создавать так называемые составные индексы,
включающие в себя сразу несколько именованных столбцов. В индексах с
реверсивными (обратными) ключами содержимое индекса соответствует
реверсированному (то есть прочтенному справа налево) набору данных
индексируемого столбца. Допустим, если вы индексируете столбец LASTNAME таблицы
EMPLOYEE, то строка, которая в этом столбце содержит значение
"COUCHMAN", будет иметь в реверсированном , индексе значение
"NAMHCOUC" Индексы с реверсированными ключами часто применяются
для повышения производительности параллельных запросов в средах Oracle
Parallel Server. И наконец, можно создавать битовые индексы, если в
определении индекса заменить ключевое слово unique на bitmap. Ниже приводятся
примеры таких определений:
SQL> — unique indexes
2 CREATE UNIQUE INDEX emp_empno_01
3 ON erap (empno);
Index created.
SQL> — nonunique indexes
2 CREATE INDEX emp_sal_01
3 ON emp (sal) ;
Index created.
SQL> — composite indexes
2 CREATE UNIQUE INDEX employee_empno_ename_indx_01
3 ON emp (empno, ename);
Index created.
SQL> — reverse key indexes
2 CREATE INDEX emp_ename_reverse_indx
3 ON emp (ename) REVERSE;
Index created.
230
Глава 7
SQL> bitmap indexes
2 CREATE BITMAP INDEX emp_deptno_indx_01
3 ON emp (deptno);
Index created.
Совет Можно создать все приведенные выше индексы для таблицы
ЕМР, которой мы широко пользовались на протяжении всей книги. С
другой стороны, можно использовать приведенные выше образцы как
шаблоны для создания индексов для самостоятельно спроектированных
вами таблиц.
Для того чтобы создавать индексы в своей собственной схеме, необходимо
иметь привилегию CREATE TABLE. Для создания индексов в любой схеме
требуется привилегия CREATE ANY INDEX или привилегия CREATE TABLE
для той таблицы, по которой создается этот индекс.
Для того чтобы заменить определение индекса, необходимо полностью
удалить индекс и заново его создать. Информацию об индексе можно
получить несколькими различными способами. Словарное представление
ALL_INDEXES отображает информацию о хранении индексов, а также
имена таблиц, с которыми они ассоциированы. Словарное представление
ALL_OBJECTS отображает объектную информацию об индексах, в том
числе их статус. Представление ALL_IND_COLUMNS показывает
информацию обо всех индексированных столбцах базы данных. Это последнее
представление особенно полезно для определения порядка столбцов в
составных индексах.
Создание функциональных индексов
Для того чтобы создать в собственной схеме функциональный (function-based)
индекс для собственной таблицы, необходимо иметь системные привилегии
create index или query rewrite. Для создания индекса в другой схеме или
для таблицы из другой схемы необходимо иметь привилегии create any
index и global query rewrite. Кроме того, владелец таблицы должен иметь
объектную привилегию на использование функций, на базе которых строится
функциональный индекс.
Функциональным индексом называется новый в Oracle тип индекса,
спроектированный для повышения производительности запросов за счет
использования индексов в тех случаях, когда во фразе where вашего запроса
используются операции над столбцами. Традиционные бинарные индексы нельзя
использовать, если во фразе where запроса содержатся столбцы, принимающие
участие в операциях или функциях. Предположим, что у нас имеется таблица
ЕМР с четырьмя столбцами: EMPID, LASTNAME, FIRSTNAME и SALARY.
Для столбца SALARY создан традиционный бинарный индекс. Но если будет
задан запрос select * from ЕМР where (SALARY*1.08) > 63000, РСУБД
проигнорирует индекс и вместо поиска по индексу проведет полное
сканирование таблицы. Функциональные индексы были специально разработаны для
использования в подобных ситуациях. Ниже приводится пример определения
функционального индекса:
*&ч№в&№ sql> create index ixd_emp_0l
2 ON emp(SAL*1.0B) ;
Index created.
За счет использования подобных индексов удается оптимизировать
производительность запросов, содержащих во фразе where функциональные
операции над столбцами, как в приведенном выше примере. Если только
специфицированная вами функция является повторяемой (repeatable), на ее базе можно
строить функциональные индексы. Повторяемой функцией называется такая
функция, результаты выполнения которой для одного и того же набора
входных данных всегда будут одинаковыми. Например, 2 + 2 всегда будет равно 4.
Другими словами, мы надеемся, что не настанет такой день, когда в результате
этого сложения мы получим 5. Следовательно, операция сложения является
Создание других объектов базы данных Oracle
231
повторяемой. Чтобы активировать использование функциональных индексов,
необходимо задать два оператора alter session, как это показано ниже:
№^^Ж SQL> alter session set query_rewrite_enabled -= truer-
Session altered.
SQL> alter session set query_rewrite_integrity = trusted;
Session altered.
Совет Битовые индексы также можно сделать функциональными, а
функциональные индексы могут быть секционированными (partitioned).
Удаление индексов
Если какой-либо индекс в базе данных перестает быть нужным, разработчик
может удалить его с помощью команды drop index. После удаления индекса
он перестает влиять на производительность запросов на поиск для столбца
(или столбцов), содержавшихся в удаленном индексе. Также в словаре данных
исчезнут все упоминания об этом индексе. Однако нельзя удалить индекс,
используемый в качестве первичного ключа.
Синтаксис оператора drop index всегда одинаков вне зависимости от
типа удаляемого индекса (уникальный, битовый или бинарный). Если вы
желаете как-то переработать индекс, то необходимо сначала удалить старый
индекс, а затем создать новый. Проиллюстрируем сказанное примером:
fcasaaatas SQL> DROP INDEX employee_last_first_indx_01;
Index dropped.
Соображения по созданию индексов
Хотя самое большое повышение производительности можно получить при
создании индекса по столбцу, содержащему только уникальные значения,
неплохое повышение производительности можно получить и для столбцов,
содержащих дубликаты (повторяющиеся значения) и неопределенные значения
(NULL). Следовательно, индекс для столбца может быть создан даже в том
случае, если содержащиеся в нем данные не являются уникальными. Имеются
некоторые соображения, выполнение которых послужит достаточной
гарантией получения желаемого повышения производительности при создании
традиционного индекса. Руководящие принципы оценки повышения
производительности при использовании традиционных индексов и некоторые
соображения о непроизводительных расходах, связанных с
производительностью и памятью при создании таких индексов, будут представлены позже в
этом разделе главы.
Использование для поиска информации в таблицах индексов может
обеспечить невероятный выигрыш в производительности по сравнению с поиском
информации в неиндексированных столбцах. Однако следует быть
осторожным при выборе правильного индекса. Хотя предпочтительными при
создании бинарных индексов являются полностью уникальные столбцы,
неуникальные столбцы будут работать почти так же хорошо, если одинаковые
значения будут примерно у 10% строк таблицы. А вот столбцы
переключателей (флаговые столбцы) типа тех, в которых хранится пол служащих,
совершенно не подходят для создания бинарных индексов. Также не годятся для
этого столбцы, в которых хранится всего лишь несколько различных
значений, или столбцы, хранящие символические значения типа
действителен/недействителен, активен/неактивен, да/нет или любые другие подобные типы
величин. Для таких типов столбцов гораздо более подходят битовые индексы.
Наконец, индексы с инвертированными ключами обычно используются в
ситуациях, когда установлен и работает Oracle Parallel Server и необходимо
довести до максимума параллелизм в работе базы данных. В таблице 7.1
суммируются некоторые полезные эмпирические правила, связанные с одним
вопросом: когда создавать индекс, а когда — нет.
232
Глава 7
Совет Степень уникальности значений в столбце принято называть
кардинальностью. Уникальные столбцы и столбцы, в которых имеется много
различных значений, имеют высокую кардинальность, в то время как столбцы с
небольшим числом различных значений имеют низкую кардинальность.
Следует использовать бинарные индексы для столбцов с высокой кардинальностью,
а битовые индексы — для столбцов с низкой кардинальностью. Хроме того, в
представлении словаря данных USER_INDEXES содержится имя индекса и
его уникальность. Представление USER_IND_COLUMNS содержит имя
индекса, имя таблицы и имя столбца.
Таблица 7.1. Создавать или не создавать индексы: за и против
Создавать индексы Не создавать индексы
Если у вас большая таблица Если у вас маленькая таблица
Если таблица используется главным обра- Если пользователь часто выполняет изме-
зом для запросов нения DML
Если поиск в таблице, как правило, вы- Если результаты вашего запроса содержат су-
полняется для нахождения одного или не- щественную часть реально хранящихся в таб-
скольких значений лице данных
Если в столбце имеется большое число Если таблица часто обновляется
значений NULL
Закрепление пройденного материала
1. Знайте, что такое индекс и как его создать. Понимайте разницу между
уникальным и неуникальным индексами. Кроме того, убедитесь, что умеете
создавать бинарные, битовые и составные индексы, а также индексы с
реверсированными ключами.
2. Убедитесь, что вы понимаете, что для уникальных индексов, содержащих
более одного столбца, уникальность строки определяется уникальностью
комбинации всех столбцов индекса.
3. Вспомните, что подразумевается под кардинальностью. Знайте, когда
для повышения производительности лучше использовать бинарный
индекс, а когда — битовый. Кроме того, помните, что информацию об
индексах можно найти в представлениях USER_INDEXES и
USER_IND_COLUMNS.
Упражнения
1. Вы желаете создать индекс, который повысил бы производительность
отчетов о заработной плате. Запрос должен определить, какой станет
заработная плата, если пользователю будет предложено 12%-ное повышение.
Какая из предлагаемых команд create index может помочь в этой ситуации?
A. create index my_idx_l on employee (salary * 1.12);
B. create unique index my_idx_l on employee (salary);
С create bitmap index my_idx_l on employee (salary);
D. create index my_idx_l on employee (salary) reverse;
2. Требуется создать индекс по столбцу LASTNAME для таблицы, в которой
содержится информация о фамилиях и номерах телефонов для штатов
Калифорния, Нью-Йорк и Техас. Какой из приведенных ниже индексов
окажется полезнее других для повышения производительности?
A.create unique index my_idx_l on people_phone (lastname);
B. create index my_idx_l on peoplejihone (lastname);
С create bitmap index my_idx_l on people_phone (lastname);
D. create index my_idx_l on peoplejihone (lastname) reverse;
Создание других объектов базы данных Oracle 233
3. Вы создаете индекс по столбцу SS_NUM для таблицы US_GOVT_SS из
приложения, реализующего правительственную программу социального
обеспечения. Какой из следующих вариантов ответа содержит оператор,
который следует использовать для этого столбца?
A. create index my_idx_l on US_govt_SS (ss_num);
B. create bitmap index my_idx_l on US_govt_SS (ss_num);
С create unique index my_idx_l on US_govt_SS (ss_num);
D. create index my_idx_l on US_govt_SS (ss_num)reverse;
4. Это слово описывает степень уникальности значений индексируемого
столбца:
Ответы
1. А. 2. В. 3. С. 4. Кардинальность.
Использование общедоступных
и частных синонимов
Создаваемые в Oracle объекты являются доступными только в вашей схеме,
если только вы явно не предоставили доступ к ним другим пользователям.
Привилегии и доступ пользователей мы обсудим в следующем разделе.
Однако, даже если вы предоставили другим пользователям разрешение на доступ,
границы, устанавливаемые правами владения схемой, вынуждают других
пользователей использовать в качестве префикса имени объекта при обращении
к вашим объектам имя вашей схемы. К примеру, таблицей ЕМР владеет
пользователь SCOTT. Если пользователь TURNER желает обратиться к таблице
ЕМР пользователя SCOTT, он должен обратиться к ней как к SCOTT. ЕМР.
Если же TURNER не сделает этого, произойдет следующее:
ifiS SQL> connect turner/ike
Connected.
SQL> SELECT * FROM emp
2 WHERE empno - 7844;
SELECT * FROM emp
*
ORA-00942: table or view does not exist,
(таблицы или представления не существует)
Совет О том, как создать идентификатор пользователя (IB) TURNER
и привилегии, ассоциируемые с доступом к таблице, мы расскажем в
следующем разделе. А сейчас сосредоточимся на вопросах владения схемой.
Итак, пользователь TURNER не может даже просмотреть свои
собственные данные служащего — по сути дела, Oracle напрямую сообщает, что
таблицы ЕМР не существует (какое коварство, не правда ли?). Но как только
TURNER присоединит к имени таблицы ЕМР префикс (имя владельца —
SCOTT), ему откроется целый океан информации:
ИВВ SQL> connect turner/ike
SQL> SELECT empno, ename, sal FROM SCOTT.emp
2 «HERE empno - 7844;
EMPNO ENAME SAL
7844 TURNER 1500
Чем могут помочь синонимы
Если слишком сложно вспомнить, какой таблицей владеет тот или иной
пользователь, то для достижения прозрачности базы данных для схемы можно
использовать синонимы. Синонимами называются альтернативные имена,
создаваемые как объекты базы данных Oracle для обозначения таблиц и
представлений. На таблицу, которой владеет другой пользователь, можно со-
234
Глава 7
слаться, используя синонимы. Создание синонимов устраняет необходимость
квалифицировать имя объекта именем схемы и предлагает вам
альтернативные имена для таблиц, представлений, последовательностей, процедур или
других объектов. Кроме того, синонимы используются для сокращения
слишком длинных имен объектов. В Oracle имеется два типа синонимов: частные
синонимы и общедоступные синонимы. Частные синонимы можно
использовать в рамках своей собственной схемы для обращения к таблице или
представлению по их альтернативному имени. Частные синонимы — это именно
то, что стоит за таким названием: они являются частными для вашей схемы, и
поэтому пользоваться ими можете только вы сами. Имя, являющееся частным
синонимом, должно отличаться от имен всех других объектов, которыми
владеет этот пользователь.
О частных синонимах можно сказать, что это не более чем прозвища (или,
если угодно, уменьшительные имена) объектов базы данных Oracle. А вот
общедоступные синонимы можно использовать, чтобы позволить всем
пользователям Oracle обращаться ко всем объектам, которыми вы владеете, не
приписывая к имени объектов имени вашей схемы. Концепция возможности
обращаться к объектам базы данных, не задумываясь над тем, частью какой
схемы они являются, известна как концепция прозрачности схемы.
Общедоступные синонимы открыты для всех пользователей Oracle; однако для
создания общедоступных синонимов необходимы специальные привилегии. О
привилегиях для создания общедоступных синонимов мы поговорим в
следующем разделе. А сейчас приведенный ниже блок кода покажет нам, как
создаются частные и общедоступные синонимы:
SQL> create synonym all_my_empa for emp;
Synonym created.
SQL> create public synonym emp for scott.emp;
Synonym created.
Совет Ни общедоступные, ни частные синонимы не изменяют деталей
определения таблиц или представлений. Они всего лишь играют роль их
альтернативных имен.
Теперь, когда у пользователя SCOTT появился свой собственный частный
синоним для таблицы ЕМР, он может начать обращаться к таблице ЕМР по ее
прозвищу:
SQL> connect scott/tiger
Connected.
SQL> select empno, ename, sal
2 from all_my_emps
3 where empno -* "7369;
EMPNO ENAME SAL
7369 SMITH 800
В то же время пользователю TURNER более не требуется обращаться к
таблице ЕМР, используя в качестве префикса имени таблицы имя схемы
(SCOTT). Он может теперь называть ее просто ЕМР, что он и делает в
следующем примере:
SQL> connect turner/ike
Connected.
SQL> select empno, ename, sal
2 from emp
3 where empno ■■ 7844;
EMPNO ENAME SAL
7844 TURNER 1500
Обратите внимание на еще одну интересную вещь, касающуюся частных
синонимов. Если для пользователя TURNER не существует общедоступного
синонима, которым можно пользоваться для обращения к таблице ЕМР без
использования в качестве префикса имени схемы SCOTT, пользователь
TURNER может создать для объекта свой собственный частный синоним, как
это показано ниже:
Создание других объектов базы данных Oracle
235
SQL> connect turner/ike
Connected.
SQL> create synonym emp for scott.emp;
Synonym created.
SQL> select empno* ename, sal
2 from emp
3 where empno - 7844;
EMPNO ENAME SAL
7844 TURNER 1500
Совет Синонимы не дают вам доступа к данным в таблице, к которой у
вас не было доступа раньше. Это могут сделать только привилегии.
Синонимы всего лишь позволяют обращаться к таблице, не указывая в качестве
префикса имени схемы. При разрешении имени таблицы базы данных Oracle
вначале проверяет, имеется ли эта таблица в вашей схеме. Если таблица не
найдена, Oracle ищет частный синоним. Если и здесь ничего не найдено,
Oracle приступает к поиску общедоступного синонима.
Удаление синонимов
Для удаления синонимов используется команда drop synonym, как это
показано в следующем блоке кода:
ЙШВЯЖЖ SQL> connecr turner/ike
Connected.
SQL> drop synonym emp;
Synonym dropped.
SQL> connect scott/tiger
Connected.
SQL> drop public synonym emp;
Synonym dropped.
SQL> drop synonym all_my_emps;
Synonym dropped.
Закрепление пройденного материала
1. Следует знать, как синонимы используются для облегчения прозрачности
схемы.
S. Знайте разницу между общедоступными и частными синонимами. Знайте,
что частные синонимы может использовать только тот пользователь,
который их создал, в то время как на общедоступные синонимы могут
ссылаться все пользователи Oracle.
Упражнения
1. Пользователь DAVIS хотел бы обратиться к таблице PROFITS, которой
владеет пользователь WATTERSON, не используя в качестве префикса
имени владельца схемы. Предположим, что решены все необходимые
вопросы с привилегиями. Какие из приведенных ниже вариантов не решают
вопроса прозрачности схемы? (Выберите два варианта.)
A. create synonym profits for watterson.profits;
(выдан пользователем WATTERSON)
B. create public synonym for watterson.profits;
(выдан пользователем WATTERSON)
С create synonym profits for watterson.profits;
(выдан пользователем DAVIS)
D. create synonym profits for profits;
(выдан пользователем DAVIS)
S. Этот тип синонима доступен каждому пользователю базы данных Oracle
(два слова):
236
Глава 7
3. Этот тип синонима доступен только тому пользователю базы данных Oracle,
который его создал (два слова): ;
Ответы
1. А и Р. 2. Общедоступный синоним. 3. Частный синоним.
Резюме главы
В этой главе был рассмотрен большой объем информации, необходимой для
знакомства с другими объектами базы данных Oracle. Мы начали главу с
продолжительного обсуждения того, как определяются простые и сложные
представления. Мы научились модифицировать данные из базовых таблиц,
используя для этого представления, и узнали, что иногда это невозможно сделать
для сложных представлений. Затем мы перешли к обсуждению того, как
используются индексы в базе данных Oracle. Мы узнали о различных типах
индексов в базах данных Oracle и о том, как эти индексы в них используются. Затем
мы перешли к вопросам использования последовательностей для генерации в
Oracle чисел для разнообразных целей. И наконец, мы поговорили об
использовании синонимов для достижения прозрачности схемы в базе данных.
Двухминутное погружение в пройденное
Ш Представлением называется виртуальная таблица, созданная с помощью
оператора select.
И Представления могут вычищать из таблиц данные, которые могут
оказаться неподходящими для некоторых пользователей, и они1 могут скрывать
технологические сложности получения данных путем соединения
нескольких таблиц. Кроме того, можно замаскировать сложности,
возникающие при выполнении большого числа однострочных и групповых
операций над данными, возвращаемыми в результате выполнения
запроса, формирующего представление.
Ш Имеется два типа представлений — простые и сложные.
Ш Простыми представлениями называются представления, построенные на
базе одной таблицы.
Ш Сложными представлениями называются представления, построенные на
базе двух или более объединенных вместе таблиц.
■ В простые представления можно вставлять (insert) данные, за
исключением следующих случаев:
■ Если используется фраза with check option, пользователь не может
вставлять (insert), удалять (delete) или обновлять (update) данные в
базовой таблице простого представления, если в результате этой
операции представление не сможет выбрать (select) эти данные для
пользователя.
■ Пользователь не может вставлять (insert), удалять (delete) или
обновлять (update) данные в базовой таблице простого представления, если
в создающем представление операторе select содержатся фразы
group by, order by или однострочные операции.
■ Нельзя вставлять данные в простые представления, содержащие
ссылки на любые виртуальные столбцы типа ROWID, CURRVAL,
NEXTVAL и ROWNUM.
■ Нельзя вставлять данные в простые представления, созданные с
помощью опции read only.
Создание других объектов базы данных Oracle
237
■ В сложные представления можно вставить данные, если выполняются все
перечисленные ниже условия:
■ Оператор оказывает воздействие только на одну из соединяемых
таблиц.
■ Для операторов update все изменяемые столбцы выбраны из таблицы
с сохраняемыми ключами. Кроме того, если представление было
создано с фразой with check option, то соединяемые столбцы и
столбцы из таблиц, на которые в представлении имеется несколько ссылок,
не являются частью обновляемых данных.
■ Для операторов delete в соединении может участвовать только одна
таблица с сохраняемыми ключами. Эта таблица может встречаться в
соединении более одного раза, если только таблица не была создана с
помощью фразы with check option.
■ Для операторов insert все столбцы, в которые вставляются данные,
должны происходить из таблиц с сохраняемыми ключами, а само
представление не должно быть создано с помощью фразы with check
option.
■ При создании представления фраза with check option дает такому
простому представлению возможность ограничивать данные, которые можно
вставить в базовую таблицу или изменить любым другим способом,
требуя, чтобы эти измененные данные можно было впоследствии выбрать с
помощью этого же представления.
■ Для модификации данных, отбираемых представлением, требуется заново
создать это представление с помощью оператора create or replace
view или сначала удалить (drop) представление, а затем повторно создать
его с помощью оператора create view.
■ Если имеющееся представление вследствие объектных зависимостей по
каким-либо причинам стало недействительным (invalid), его можно
заново откомпилировать, используя оператор alter view.
■ Для удаления представления используется оператор drop view.
■ Последовательность генерирует целые числа на базе правил,
определенных при ее создании.
■ К числу опций, которые можно задать при создании последовательностей,
относятся первое генерируемое число последовательности, максимальное
и минимальное значения последовательности, возможность повторения
чисел последовательности и возможность кэширования (хранения в
памяти) чисел последовательности для повышения ее производительности.
■ Обращение к последовательностям проводится путем выборки из
виртуальных столбцов NEXTVAL и CURRVAL.
■ В столбце CURRVAL содержится текущее значение последовательности.
■ При выборке из NEXTVAL происходит очередное изменение
последовательности, а значение CURRVAL заменяется значением, порожденным
NEXTVAL.
■ Используемые последовательностью для генерации чисел правила могут
быть изменены с помощью оператора alter sequence.
■ Можно удалить последовательность, используя оператор drop sequence.
■ Некоторые индексы создаются в базе данных автоматически, например
для поддержки в таблице ограничений первичного ключа или
уникальности.
■ Другие индексы создаются вручную для поддержки увеличенной
производительности базы данных.
238
Глава 7
Ш Индексы, создаваемые вручную, часто создаются для неуникальных
столбцов.
■ Бинарные индексы лучше работают для столбцов с высокой
кардинальностью, то есть для столбцов, содержащих большое число различных
(distinct) значений и мало дубликатов.
Ш Бинарные индексы повышают производительность путем занесения
данных в двоичном дереве поиска и последующего поиска значений в этом
дереве с использованием методологии декомпозиции, как было описано в
тексте этой главы.
■ Битовые индексы повышают производительность для столбцов с низкой
кардинальностью, то есть для столбцов, которые содержат мало различных
значений и много дубликатов.
■ Для изменения содержимого индексов необходимо удалить их, а затем
заново создать индекс.
■ Для удаления индексов используется команда drop index.
Ш Модель безопасности баз данных Oracle состоит из двух частей:
ограничение доступа пользователей путем их аутентификации с помощью паролей
и контроль использования объектов с помощью системы привилегий.
■ К числу имеющихся в Oracle привилегий относятся системные
привилегии (для сопровождения объектов базы данных) и объектные привилегии
(для доступа к данным из объектов базы данных и манипулирования ими).
Ш Изменение пароля можно выполнить с помощью оператора alter user
identified by.
■ Предоставление объектных и системных привилегий выполняется с
помощью команды grant.
■ Для отзыва системной или объектной привилегии используется команда
revoke.
■ Для создания синонимов используется команда create public synonym.
Вопросы для самопроверки
1. Для создания прозрачности схемы в базах данных Oracle используется этот
тип объектов базы данных:
8. Для получения текущего значения последовательности без реального
изменения ее значения следует сделать ссылку на этот псевдостолбец Oracle:
3. Представление, содержащее данные из двух и более базовых таблиц,
данные из которых пользователь может изменять, называется
4. Этот тип индекса базы данных применяется для выполнения
повторяющихся программных операций над всеми значениями столбца:
5. Этот тип ограничения автоматически создает один из основных индексов
базы данных:
6. Эта фраза позволяет представлению принудительно вводить правило,
согласно которому, если представление неспособно "увидеть" данные после
изменения, это изменение не разрешается:
7. Для получения нового значения последовательности следует сделать
запрос к этому псевдостолбцу Oracle:
Создание других объектов базы данных Oracle 239
Вопросы ко всей главе
1. Какой из перечисленных ниже эффектов окажет удаление таблицы на
созданный для нее неуникальный индекс?
A. Никакого эффекта.
B. Индекс будет удален.
С Индекс будет переведен в состояние "недействительный".
D. В индексе будут содержаться только значения NULL.
2. Какое из приведенных ниже утверждений об индексах является справедливым?
A. Столбцы с низкой кардинальностью хорошо обрабатываются с
помощью бинарных индексов.
B. Столбцы с низкой кардинальностью плохо обрабатываются с
помощью битовых индексов.
С Столбцы с высокой кардинальностью хорошо обрабатываются с
помощью бинарных индексов.
3. Какой из следующих шагов необходимо выполнить, чтобы увеличить
число столбцов, отбираемых представлением?
A. Добавить столбцы в базовую таблицу.
B. Задать оператор alter view.
C. Использовать в сочетании с представлением коррелированный
подзапрос.
D. Удалить и заново создать представление, указав в нем большее
количество выбираемых столбцов.
4. Вы создаете последовательность для базы данных Oracle. Какой из
приведенных ниже параметров является допустимым при создании последовательности?
A. identified by
B. using temporary tablespace
С maxvalue
D. on delete cascade
5. Задан следующий оператор базы данных Oracle:
create view EMP_VIEW_01
as select E.EMPID, E.LASTNAME, E.FIRSTNAME, A.ADDRESS
from EMPLOYEE E, EMPL_ADDRESS A
where E.EMPID - A.EMPID
with check option;
Какая из строк приводит к возникновению ошибки?
A. create view EMP_VIEW_01
B. as select E.EMPID, E.LASTNAME, E.FIRSTNAME, A.ADDRESS
С from EMPLOYEE E, EMPL_ADDRESS A
D. where E.EMPID = A.EMPID
E. with check option;
F. В этом операторе не содержится ошибок.
6. Вы работаете в Oracle с последовательностями. Что произойдет со
значением псевдостолбца CURRVAL после обращения к NEXTVAL?
A. Будет увеличено на 1.
B. Станет равным значению PREWAL.
C. Станет равным значению NEXTVAL.
D. Останется без изменения.
240
Глава 7
7. В таблице EMP_SALARY имеются два столбца: EMP_USER и SALARY.
Столбец EMP_USER устанавливается равным значению имени
пользователя Oracle. Для поддержки пользователя MARTHA (администратор
заработной платы) с помощью следующего оператора создается представление:
CREATE VIEW EMP_SAL_VW
AS SELECT EMP_USER, SALARY
FROM EMP_SALARY
WHERE EMP_USER 'MARTHA';
Предполагается, что с помощью этого представления пользователь MARTHA
способна видеть и обновлять заработную плату всех служащих компании,
кроме своей. Какую из следующих фраз необходимо добавить к оператору
создания представления, чтобы реализовать эту функциональность?
A. with admin option
B. with grant option
С with security option
D. with check option
8. У таблицы INVENTORY имеются три столбца: UPC_CODE, UNITS и
DELIV_DATE. Через представление в таблицу ежедневно добавляются новые
данные. Представление было создано с использованием следующего кода:
CREATE VIEW DAY_INVENTORY_VW
AS SELECT UPC_C0DE, UNITS, DELIV_DATE
FROM INVENTORY
WHERE DELIV_DATE - SYSDATE
WITH CHECK OPTION,-
Что произойдет, если вы попытаетесь вставить запись с повторяющимся
значением столбца UPC_CODE?
А.Оператор закончится аварийно из-за присутствия фразы with check
option.
B. Оператор будет успешно выполнен.
C. Оператор закончится аварийно из-за нарушения ограничения
первичного ключа.
D. Оператор вставит все, кроме значения даты.
9. Вы очищаете данные в базе данных Oracle. Какой из следующих
операторов избавит вас от всех использовавших таблицу представлений и
одновременно удалит таблицу из базы данных?
A. drop view
B. alter table
C. drop index
D. alter table drop constraint
10. С помощью следующего оператора создается представление:
CREATE VIEW BASEBALL_TEAM_VW
AS SELECT B.JERSEY_NUM, B.POSITION, B.NAME
FROM BASEBALLJTEAM В
WHERE B.NAME - USER;
Что произойдет, если пользователь JONES попытается сделать листинг
данных для пользователя SMITH?
A. Оператор select получит сообщение об ошибке.
B. Оператор select завершится успешно.
С Оператор select получит от Oracle сообщение об ошибке NO ROWS
SELECTED.
D. Оператор select добавит данные только в BASEBALLJTEAM.
Создание других объектов базы данных Oracle
241
Ответы на вопросы для самопроверки
1. Синоним
2. CURRVAL
3. Обновляемое представление с соединением
4. Функциональный индекс
5. Первичный ключ (допустимым ответом является также:
ограничение по уникальности)
6. with check option
7. NEXTVAL
Ответы на вопросы ко всей главе
1. В. Индекс будет удален.
Объяснение Точно так же, как и автоматически генерируемые индексы,
ассоциируемые с первичными ключами таблицы, создаваемые вручную для
повышения производительности индексы будут удалены при удалении самой
таблицы. Следовательно, варианты А, С и D оказываются
недействительными, поскольку описанные в них эффекты в приведенном контексте не имеют
места.
8. С. Столбцы с высокой кардинальностью хорошо обрабатываются с
помощью бинарных индексов.
Объяснение Столбцы с низкой кардинальностью являются бичом для
бинарных индексов, что сразу исключает вариант А. Далее, битовые индексы
используются в первую очередь для получения выигрыша в производительности
для столбцов с низкой кардинальностью, а это отвергает вариант В.
Правильным ответом является вариант С. Для получения дополнительной
информации рекомендуем вернуться к обсуждению того, как работают бинарные
индексы.
3. D. Удалить и заново создать представление, указав в нем большее
количество выбираемых столбцов.
Объяснение Вариант А неверен, поскольку при добавлении столбцов в
базовую таблицу столбцы к представлению не добавляются; напротив, эта
процедура, вероятно, приведет к тому, что представление станет недействительным.
Вариант В является неверным, потому что оператор alter view просто
перекомпилирует имеющееся определение представления, в то время как для
настоящего разрешения поставленной перед нами задачи требуется изменить
действующее определение представления. Вариант С не подходит.потому, что
применение коррелированного подзапроса, вероятно, ухудшит
производительность. Это еще раз подчеркивает реально стоящую перед нами
проблему — добавление столбца к представлению. Вернитесь к обсуждению
изменения определения представления.
4. С. maxvalue
Объяснение Опция maxvalue является допустимой опцией при создании
последовательностей. Варианты А и В являются частями оператора create user,
в то время как вариант D является частью определения ограничения в
операторах alter table или create table. Вернитесь к обсуждению создания
последовательностей.
5. F. В этом операторе не содержится ошибок.
Объяснение Хотя включение фразы with check option и является
неуместным, если учесть, что для сложных представлений операции insert
запрещены, при компиляции этого оператора не будет сгенерировано никаких оши-
242
Глава 7
бок. Следовательно, ошибки в представлении отсутствуют. Это невозможно
просто выучить, для этого нужно своими руками поработать с Oracle.
6. С. Станет равным значению NEXTVAL.
Объяснение При каждой ссылке на псевдостолбец NEXTVAL
последовательность наращивает существующее целое число (CURRVAL) и делает его
равным значению NEXTVAL. Более подробно об этом говорилось при
обсуждении последовательностей.
7. D. with check option
Объяснение Подходящей является фраза with check option. Эту фразу
можно включить в оператор create view, чтобы представление не позволяло
добавлять в базовую таблицу строки, которые затем не будут отобраны в
представление. Фразы with {admin | grant) option используются для
назначения пользователям административных возможностей, а также для
предоставления им привилегий. Следовательно, варианты ответа А и В неверны. А
фраза with security option вообще является фикцией — такой фразы в
Oracle просто не существует. Следовательно, вариант ответа С также является
неверным.
8. С. Оператор закончится аварийно из-за нарушения ограничения
первичного ключа.
Объяснение Совершенно очевидно, что оператор завершится аварийно,
весь вопрос в том — почему. Причина аварийного завершения оператора
кроется в ограничении первичного ключа для столбца UPC_CODE. Как только
вы попытаетесь добавить дублирующую запись, таблица отвергнет такую
добавку. А вот фраза with check option, хотя она и специфицирована,
приведет к аварийному завершению оператора insert в тех случаях, когда вы
попытаетесь добавить запись для любой даты, кроме сегодняшней.
9. A. drop view
Объяснение При удалении таблицы Oracle удаляет и все связанные с
таблицей объекты, например триггеры, ограничения и индексы, кроме
представлений. Представления же рассматриваются как отдельные объекты, и хотя
представления не могут нормально функционировать после удаления базовой
таблицы, после удаления таблицы Oracle сохраняет представление "под
рукой".
10. С. Оператор select получит от Oracle сообщение об ошибке NO ROWS
SELECTED.
Объяснение Хотя запрос будет успешным (поясним: это означает, что вы не
получите сообщения об ошибке), вы должны побороть в себе желание выбрать
вариант ответа В. Лучшим ответом является вариант С, потому что он более
точно идентифицирует, что произойдет в действительности при задании
подобного оператора. Oracle будет вести себя так же, как и в любом операторе
select, в котором вы задали во фразе where такие критерии поиска, которым
не соответствуют данные, — возвратит сообщение NO ROWS SELECTED. Это
нельзя считать ошибочным состоянием, но в то же время нельзя назвать и
успешным поиском данных. Следовательно, варианты ответа А и В ошибочны.
И наконец, оператор select никогда не добавляет в таблицу данные.
Следовательно, ошибочен и вариант ответа D.
ГЛАВА 8
Управление доступом
пользователей в Oracle
244
Глава 8
этой главе мы познакомимся со следующими вопросами,
связанными с управлением доступом пользователей и
привилегиями в базах данных Oracle, а потом и продемонстрируем свои
знания по ним:
■ Создание пользователей
■ Предоставление и отзыв объектных привилегий
■ Использование ролей для управления доступом к базе
данных
Наиболее хорошо защищенной базой данных является база данных, у
которой нет пользователей, но попробуйте отнять у базы данных пользователей, и
вместе с ними пропадет весь смысл существования базы данных. Для того
чтобы решить в Oracle проблемы безопасности, необходимо поддерживать очень
точный баланс между обеспечением доступа к требующимся данным и
функциям и предотвращением ненужного доступа. Oracle предлагает средства,
позволяющие делать это в рамках модели безопасности, состоящей из
нескольких опций для ограничения возможностей подключения к базе данных и для
контроля за тем, что могут и что не могут видеть пользователи после
установления соединения. Безопасность базы данных включает в себя безопасность
системы и безопасность данных. Безопасность системы специфицирует
использование базы данных на системном уровне (включая имена пользователей,
пароли и выделение пользователям дискового пространства). Безопасность
данных специфицирует использование объектов базы данных и действия,
которые пользователи могут выполнять над ними. В этом разделе мы
сконцентрируем внимание на безопасности базы данных Oracle — от создания
пользователей и администрирования паролей до администрирования безопасности
индивидуальных объектов базы данных. В этой главе мы коснемся 7%
экзаменационных материалов первого экзамена ОСР.
Создание пользователей
Базовая система безопасности базы данных Oracle состоит из двух частей. В
состав первой части входит аутентификация паролей всех пользователей базы
данных Oracle. Аутентификация паролей возможна как напрямую с сервера Oracle,
так и средствами операционной системы, поддерживающей базу данных Oracle.
Если используется собственная система аутентификации Oracle, информация о
паролях хранится в Oracle в зашифрованном формате. Для целей первого
экзамена ОСР мы сосредоточимся только на собственном механизме аутентификации
Oracle. Вторая часть модели безопасности Oracle включает в себя контроль над
тем, к каким объектам базы данных может обращаться пользователь, контроль
уровня его доступа к этим объектам и того, имеет ли пользователь полномочия
размещать новые объекты в базе данных Oracle. На самом высоком уровне эти
средства управления принято называть привилегиями. Далее в этом разделе мы
поговорим о привилегиях.
Совет У модели безопасности Oracle имеются дополнительные
компоненты, в том числе такие характеристики, как детальный контроль доступа,
аутентификация на базе сертификатов и расширенные функции управления
паролями типа ротации сроков окончания действия паролей и верификации
сложности. Однако эти возможности экстенсивно проверяются во втором
экзамене ОСР, а не в первом. Oracle9i обещает предоставить
пользователям еще большее число возможностей безопасности, например Oracle Label
Security.
Как создавать пользователей
Давайте начнем наше обсуждение создания пользователей с примера. В
прошлых примерах мы обращались к пользователю TURNER. Он является
разведенным коммивояжером, работающим на нашу компанию, который привык
иметь связи с Голливудом. Только привилегированные пользователи Oracle
Управление доступом пользователей в Oracle
245
(например, АБД) могут создавать других пользователей. Представим себе
теперь, что пользователь SCOTT является АБД. С помощью команды create user
он (SCOTT) создает в Oracle идентификатор пользователя (user ID) TURNER.
Для того чтобы иметь возможность создавать других пользователей,
необходимо самому иметь системную привилегию CREATE USER. Простейшая версия
команды для создания пользователей определяет только пользователя,
которого вы желаете создать, и его пароль, как это видно из следующего примера:
Юааажая SQL> connect scott/tiger
Connected.
SQL> create user turner identified by ike;
User created.
Совет К этому моменту созданный пользователь не имеет привилегий.
Позже АБД может предоставить ему требующиеся привилегии. Привилегии
определяют действия, которые пользователь может выполнять над
объектами базы данных. Добавим, что имя пользователя может содержать до 30
символов и содержать наряду с буквенно-цифровыми символами такие
символы, как $, # и _.
Создание пользователей, аутентифицированных
хост-системой
Аутентификация хост-системой используется Oracle не слишком часто, но она
имеет место. Аутентификация хост-системой означает, что вы создаете в
Oracle пользователя, чей пароль подтверждается базовой хост-системой. Когда
пользователь регистрируется на хосте с правильным паролем, Oracle доверяет
этой аутентификации и предоставляет пользователю доступ к Oracle, не требуя
предъявления другого пароля. Имя пользователя, идентифицирующее его в
Oracle, должно совпадать с тем именем, под которым он вошел в хост-систему,
с проставленным перед ним префиксом OPS$, что проиллюстрировано
следующим примером:
tat&smm SQL> create user OPSSharvey identified externally;
User created.
Позже, когда HARVEY пожелает подключиться к Oracle из строки
приглашения хост-системы, он сможет задать следующую команду и ему не придется
задавать дополнительный пароль:
is^smeas C:\windows c:\oracle\ora81\bin\sqlplus /
Совет Чтобы работала аутентификация на хост-системе, сначала
необходимо непосредственно подключиться к хост-системе (через Telnet для
UNIX или из строки приглашения в DOS).
Обнаружение информации о пользователях
После того как в Oracle созданы пользователи, можно обратиться к
представлению ALL_USERS для получения основной информации о них, в том числе
имени пользователя и даты его создания. Взгляните на следующий блок кода:
SQL> select
USERNAME
SYS
SYSTEM
OUTLN
DBSNMP
РОВ
*
from
all
users;
AURORASORBSUNAUTHENTICATED
JASON
STUDENT2
STUDENT1
SPANKY
JAS0N2
SCOTT
JAS0N3
USER_ID
0
5
11
18
26
23
27
46
45
43
48
52
49
CREATED
23-
23-
23-
23-
17-
23-
18-
30-
30-
30-
31-
19-
16-
-JUN-
-JUN-
-JUN-
-JUN-
-JUL-
-JUN-
-JUL-
-OCT-
-OCT-
-OCT-
-OCT-
-MAR-
-NOV-
-99
-99
-99
-99
-ОС
-99
-00
-00
-00
-00
-00
-01
-00
246
Глава 8
JASON10 50 1B-NOV-00
GIANT 51 06-DEC-00
TURNER 53 21-MAR-01
Совет Словарное представление USERUSERS также предоставляет
важную информацию об идентификаторе пользователя, относящуюся к
расширенным возможностям управления паролями, имеющимися в Oracle (не входят в
программу первого экзамена ОСР). Взгляните на это представление и
попытайтесь разобраться, что в нем содержится, прежде чем переходить к
упражнениям, приведенным в конце этого обсуждения.
Пользователи начинают получать системные привилегии
Теперь, когда SCOTT создал пользователя TURNER, пусть он же поможет ему
начать работать: попросим АБД SCOTT предоставить пользователю TURNER
некоторые привилегии. Вы помните: привилегии являются второй частью
базовой модели безопасности Oracle. Привилегией называется право выполнять
конкретные операторы SQL. Администратор базы данных — это пользователь
высокого уровня, имеющий возможность предоставлять пользователям доступ
к базе данных и ее объектам. Все, что вы можете делать в базе данных Oracle,
регулируется привилегиями. В Oracle имеется два типа привилегий: объектные
привилегии и системные привилегии. Объектные привилегии регулируют в
Oracle доступ к таким объектам базы данных, как выполнение запросов или
изменение данных в таблицах или представлениях, создание ограничений
внешних ключей и индексов для таблиц, выполнение программ на PL/SQL и
множество других действий. В Oracle можно предоставить не более десяти
объектных привилегий, так что их легко запомнить. Об объектных
привилегиях речь будет идти в следующем обсуждении. Системные привилегии управляют
каждым из остальных видов деятельности в Oracle типа подключения к базе
данных, создания таблиц, последовательностей, представлений и многими
другими видами деятельности.
Совет Всего можно насчитать более 100 различных предоставляемых в
Oracle привилегий, причем большинство из них являются системными
привилегиями. Мы сосредоточим свое внимание только на тех системных и
объектных привилегиях, которые нужны для первого экзамена на ОСР.
Привилегии даются пользователям с помощью команды grant
(предоставить), а отнимаются с помощью команды revoke (отозвать). Возможности
предоставлять привилегии другим пользователям возлагаются базой данных
на тех пользователей, которые могут администрировать привилегии. Владелец
объекта базы данных может администрировать объектные привилегии,
связанные с этим объектом, в то время как АБД могут администрировать
системные привилегии. Мы будем продолжать считать, что пользователь SCOTT
является АБД нашей системы, и рассмотрим некоторые команды grant,
дающие пользователю TURNER возможность работать с базой данных.
ЯШИН SQL> connect scott/tiger
Connected.
SQL> grant create session to turner;
Grant succeeded.
SQL> grant create table to turner;
Grant succeeded.
SQL> grant create sequence to turner;
Grant succeeded.
SQL> grant create procedure to turner;
Grant succeeded.
Теперь, если пользователь TURNER попытается подключиться к Oracle и
выполнить некоторые работы, он сможет сделать это:
SQL> connect turner/ike
Connected.
SQL> create table my_table
2 (my_column number);
Table created.
Управление доступом пользователей в Oracle
247
Совет С помощью одной команды grant можно предоставить много
различных привилегий, например grant select, update on emp to ELMO или
grant create session, create table to ELMO.
Как отнять системные привилегии
Теперь предположим, что руководство нашей компании решило
распрощаться со служащим TURNER. Президент ICING вручил TURNER уведомление об
увольнении, и TURNER вернулся к своему рабочему месту, чтобы очистить
свой стол. Теперь администратору SCOTT требуется вычистить TURNER из
Oracle, но предположим, что сегодня он слишком занят, чтобы выполнить всю
работу. SCOTT может просто отозвать привилегии TURNER создавать
сеансы, используя следующую команду:
«виадвие SQL> connect scott/tiger
Connected.
SQL> revoke create session from turner;
Revoke succeeded.
Как вы легко можете понять, TURNER весьма недоволен своим
увольнением. Он долгое время проработал в компании и выдержал несколько
серьезных испытаний. Очищая свой стол, TURNER принял решение свести счеты
со своим нанимателем, совершив "диверсионный акт" с данными Oracle. Но
поскольку SCOTT уже отозвал возможность TURNER создавать сеанс с базой
данных, с ним произойдет примерно следующее:
HfrffiSKffl SQL> connect turner/ike
ERROR:
ORA-01045: user TURNER lacks CREATE SESSION privilege; logon denied
(у пользователя TURNER отсутствует привилегия CREATE SESSION; в регистрации отказано)
Совет Несмотря на то что у пользователя TURNER больше нет привилегии
на создание сеанса базы данных, все остальные его привилегии все еще
считаются предоставленными ему.
Системные привилегии, которые необходимо знать для ОСР
С каждым объектом связано несколько категорий системных привилегий. Эти
категории определяют тот круг возможностей, который образуется у
получателя привилегий. В этом разделе мы перечислим классы системных привилегий.
Обратите внимание на то, что во всех следующих подтемах категория сама по
себе дает пользователю возможность выполнять действие по отношению к
своему собственному объекту, а ключевое слово any (любой) перед категорией
описывает возможность выполнять действие по отношению ко всем объектам
данного типа в базе данных Oracle.
Доступ к базе данных Эти привилегии контролируют, кто обращается к базе
данных, когда он (или она) может обращаться к базе данных, а также что он
(или она) может делать в части управления своим собственным сеансом.
Привилегии: create session, alter session и restricted session.
Пользователи Эти привилегии используются для управления
пользователями базы данных Oracle. Обычно такие привилегии резервируются для АБД или
администраторов безопасности. Привилегии: create user, become user, alter user
и drop user.
Таблицы Вы уже знаете, что таблицы используются в базах данных Oracle
для хранения данных. Эти привилегии управляют тем, какие пользователи
могут создавать и сопровождать таблицы. Привилегии: create table, create
any table, alter any table, backup any table, drop any table, lock
any table, comment any table, select any table, insert any table,
update any table и delete any table. Привилегии create table или
create any table также позволяют удалять (drop) таблицы. Привилегия
create table дополнительно предоставляет возможность создавать для
таблицы индексы и выполнять для нее команду analyze. Чтобы иметь возмож-
248
Глава 8
ность произвести усечение (truncate) таблицы, необходимо иметь привилегию
drop any table.
Индексы Вы уже знаете, что индексы используются для повышения
производительности операторов SQL для таблиц с большим количеством строк с
данными. Привилегии: create any index, alter any index и drop any
index. Следует знать, что привилегии create index не существует. Еще раз
напомним, что привилегия create table также дает вам возможность
изменять и удалять индексы, которыми вы владеете и которые ассоциированы с
таблицей.
Синонимы Синонимом называется объект базы данных, позволяющий вам
ссылаться на другой объект по альтернативному имени. Термин
"общедоступный синоним" означает, что синоним доступен каждому из пользователей
базы данных. Привилегии: create synonym, create any synonym, drop
any synonym, create public synonym и drop public synonym.
Привилегия create synonym также позволяет изменять и удалять синонимы,
которыми вы владеете.
Представления Вы уже знаете, что представлением называется объект,
содержащий оператор SQL, который ведет себя аналогично таблице Oracle, за
исключением того, что в нем не хранятся данные. Привилегии: create view,
create any view и drop any view. Привилегия create view также
означает, что вы имеете возможность изменять и удалять любые представления,
которыми сами владеете.
Последовательности Вы уже знаете, что последовательность — это объект
Oracle, генерирующий числа в соответствии с правилами, которые могут
определять сами пользователи. Привилегии: create sequence, create any
sequence, alter any sequence, drop any sequence И select any
sequence. Привилегия create sequence также позволяет вам удалять
последовательности, которыми вы сами владеете.
Роли Ролями называются объекты, которые могут быть использованы для
упрощения управления привилегиями. Вы создаете роль, назначаете ей
привилегии, а затем предоставляете эту роль другим пользователям. Привилегии:
create role, drop any role, grant any role и alter any role.
Совет Подробнее о ролях мы поговорим далее в этой главе.
Транзакции Эти привилегии предназначаются для разрешения
сомнительных (не завершенных по причине недоступности координирующего ее
сервера) распределенных транзакций, обрабатываемых в базах данных Oracle.
Привилегии: force transaction и force any transaction.
PL/SQL В Oracle имеется много различных типов блоков PL/SQL.
Подобные привилегии позволяют создавать и выполнять эти различные типы блоков
и управлять ими. Привилегии: create procedure, create any procedure,
alter any procedure, drop any procedure и execute any procedure.
Привилегия create procedure также позволяет изменять и удалять блоки
PL/SQL, которыми вы владеете.
Триггеры Триггером в Oracle называется блок PL/SQL, который
выполняется в тех случаях, когда над таблицей, с которой этот триггер ассоциирован,
производится определенный тип действий DML. Привилегии: create
trigger, create any trigger, alter any trigger и drop any trigger.
Привилегия create trigger также позволяет изменять и удалять триггеры,
которыми вы владеете.
Использование словарных представлений
для показа привилегий
Для показа привилегий, связанных с пользователями и ролями, можно
использовать следующие представления:
Управление доступом пользователей в Oracle
249
■ USER_SYS_PRTVS Показывает все системные привилегии, связанные с
пользователями
■ SESSIONPRTVS Показывает все имеющиеся у данного сеанса привилегии
Изменение паролей
Безопасность базы данных — это очень серьезный вопрос, поэтому
пользователи должны хранить свои пароли в тайне. В большинстве малых организаций
заниматься вопросами безопасности базы данных поручают АБД, но в более
крупных организациях для этих целей используют специальных
администраторов безопасности. Однако в зависимости от среды, от разработчиков, АБД и
даже от конечных пользователей может потребоваться понимание опций,
имеющихся в модели безопасности Oracle для той версии Oracle, которая
используется в их организации.
На пути к установлению в компании более надежной безопасности от
пользователя SCOTT как от АБД потребовали, чтобы он изменил свой пароль на
что-нибудь не столь очевидное. Это нужно сделать, потому что SCOTT
опасается, что TURNER попытается войти в Oracle, используя его идентификатор
пользователя и пароль. Как и в именах таблиц, пароли могут содержать
буквенно-цифровые символы, а также символы #, $ и _. Посмотрим, что должен
сделать SCOTT, чтобы командой alter user изменить свой пароль:
*»—мчь SQL> connect scott/tiger
Connected.
SQL> alter user scott identified by l#secure_pw;
User altered.
Совет В командах create user и alter user имеется несколько других
опций. Однако для целей экзамена ОСР требуются только элементарные
определения создания пользователя и его пароля. Если вы заинтересовались
вопросами управления паролями, можно ознакомиться с документацией
Oracle, где вы узнаете, какие еще опции имеются у этих команд. На более
продвинутом уровне вопросы управления паролями изучаются в рамках
второго экзамена ОСР для АБД.
Закрепление пройденного материала
1. Убедитесь, что можете назвать два основных компонента модели
безопасности Oracle: аутентификация с помощью паролей и администрирование
привилегий.
S. Знайте, как с помощью команды create user создается пользователь вместе
с его паролем. Кроме того, убедитесь, что знаете, как с помощью команды
alter user можно изменить пароль.
3. Необходимо понимать, как искать в словаре данных информацию о
пользователях.
4. Убедитесь, что знаете, что такое системные и объектные привилегии и как
использовать команды grant и revoke для предоставления и отзыва
привилегий.
Упражнения
1. Пользователь IMADBA желает предоставить вновь принятому служащему
DAVIS, который сегодня начал работу, возможность создавать таблицы в
базе данных Oracle. Какой из следующих вариантов ответа
идентифицирует шаг, который не должен происходить перед тем, как DVIS может начать
создавать таблицы?
A. create user davis identified by new_employee;
B. grant create session to davis;
250
Глава 8
C. grant create table to davis;
D. grant create public synonym to davis;
S. Так называется привилегия, необходимая для подключения к базе данных
Oracle:
3. Так называется привилегия, необходимая для создания общедоступных
синонимов:
4. Так называется фраза, используемая в операторе alter user для
изменения паролей:
Ответы:
1. Р. 2. create session 3. create public synonym 4. identified by
Предоставление и отзыв объектных привилегий
Как упоминалось ранее, каждый возможный вид деятельности в Oracle
управляется привилегиями. Мы уже рассмотрели системные привилегии, а теперь
поговорим о привилегиях объектных. Все предоставления объектных
привилегий выполняются с помощью команды grant. Для того чтобы предоставить
объектную привилегию, тот, кто ее предоставляет, должен либо владеть
объектом, либо сам получить передаваемую привилегию с фразой with grant
option. Чтобы предоставить объектную привилегию, передающее ее лицо
должно определить требующийся пользователю уровень доступа к объекту. Затем
привилегию требуется предоставить. Объектной привилегией называется
привилегия или право выполнять конкретное действие над конкретной таблицей,
представлением, последовательностью или процедурой. Каждый из объектов
имеет конкретный набор разрешенных для предоставления привилегий.
Допустимые объектные привилегии
Объектные привилегии для любого объекта базы данных принадлежат
создавшему этот объект пользователю. Объектные привилегии могут быть
предоставлены другим пользователям для того, чтобы дать им возможность
обращаться к объекту и манипулировать им. К числу объектных привилегий
относятся следующие:
■ select Позволяет получателю объектной привилегии обращаться к
данным из таблицы, представления, последовательности или моментального
снимка (snapshot).
Ш insert Позволяет получателю объектной привилегии вставлять данные
в таблицу, а в некоторых случаях и в представления. Эта привилегия
может быть ограничена конкретными столбцами таблицы.
Ш update Позволяет получателю объектной привилегии обновлять данные
в таблице или представлении. Эта привилегия может быть ограничена
конкретными столбцами таблицы.
■ delete Позволяет получателю объектной привилегии удалять данные из
таблицы или представления. Эта привилегия может быть ограничена
конкретными столбцами таблицы.
Ш alter Позволяет получателю объектной привилегии изменять только
определения таблицы или последовательности; все остальные привилегии
типа alter (то есть привилегии для всех остальных типов объектов базы
данных) относятся к разряду системных привилегий.
Ш index Позволяет получателю объектной привилегии создавать индексы
для ранее определенных таблиц.
И references Позволяет получателю объектной привилегии создавать или
изменять таблицы, чтобы создать ограничения внешнего ключа по
данным из справочной таблицы.
Управление доступом пользователей в Oracle
251
Ш execute Позволяет получателю объектной привилегии выполнять
хранимую процедуру или функцию.
Совет В Oracle имеется не более десяти объектных привилегий. А вот
системных привилегий, напротив, имеется несколько дюжин. Если требуется
легкий способ различать эти категории привилегий, попытайтесь
запомнить объектные привилегии. После этого будет естественно
предположить, что любая не являющаяся объектной привилегия, с которой вы
столкнулись в ходе экзамена ОСР, относится к системным привилегиям.
Предоставление системных привилегий в Oracle
К административным возможностям в части объектных привилегий относится
возможность предоставлять привилегию любому лицу или отзывать ее, а также
возможность предоставлять объектную привилегию другому пользователю с
административными возможностями над этими привилегиями. В продолжение
нашей серии примеров предположим, что KING пересмотрел свое
опрометчивое решение относительно TURNER и позволил ему вернуться с
испытательным сроком. И вот теперь SCOTT должен обеспечить TURNER доступ к
таблице ЁМР:
fffi№>S№ SQL> GRANT select, update, insert ON erap TO turner;
Grant succeeded.
SQL> GRANT references ON emp.empno TO turner;
Grant succeeded.
SQL> GRANT select, update, insert ON erap TO turner;
Grant succeeded.
Открытость для PUBLIC
Другой аспект привилегий и доступа к базе данных включает особого
пользователя базы данных. Этот пользователь называется PUBLIC. Если системная
или объектная привилегия предоставляется пользователю PUBLIC, это
означает, что привилегия становится доступной всем пользователям базы данных.
Обычно не рекомендуется, чтобы АБД предоставляли много привилегий или
ролей пользователю PUBLIC, потому что, если отзывается привилегия или
роль, приходится перекомпилировать каждую хранимую процедуру, функцию
или пакет. Взгляните на пример:
SQL> GRANT select, update, insert ON emp TO public-
Grant succeeded.
Совет Пользователю PUBLIC могут быть назначены и роли. Мы поговорим
о ролях в следующем обсуждении.
Предоставление объектных привилегий "все сразу"
В качестве консолидированного метода для предоставления объектных
привилегий, связанных с таблицей, можно использовать ключевое слово all.
Обратите внимание, что в этом контексте all не является привилегией; это просто
сокращенная спецификация всех объектных привилегий для объекта базы
данных. Ниже показано, как используется спецификация all:
SQL> GRANT ALL ON emp TO turner;
Grant succeeded.
Предоставление вместе с привилегиями административных
возможностей
Когда некий пользователь предоставляет вам привилегию, вы получаете
возможность впоследствии выполнять ту задачу, которую позволяет полученная
привилегия. Однако обычно при этом вы не имеете возможности передать эту
привилегию кому-нибудь другому или отказаться от прав на эту привилегию
252
Глава 8
без помощи того пользователя, который предоставил ее.лЕсли требуются
какие-то дополнительные возможности администрирования предоставленных
вам привилегий, предоставивший их вам пользователь должен передать вам
административный контроль над переданными привилегиями. Допустим, что
на сегодняшний день KING абсолютно доверяет пользователю TURNER
управление созданием таблиц (системная привилегия) и желает предоставить
ему доступ к таблице ЕМР (объектная привилегия). Поэтому KING дает
указание SCOTT предоставить TURNER административный контроль над
обеими этими привилегиями:
•аиваам sql> GRANT CREATE TABLE TO turner WITH ADMIN OPTION;
Grant succeeded.
SQL> GRANT SELECT, UPDATE, ON turner TO SPANK* WITH GRANT OPTION;
Grant succeeded.
Совет Опция GRANT OPTION недействительна при предоставлении
объектных привилегий роли. О ролях мы поговорим подробнее в этой главе.
Системная привилегия или роль может быть предоставлена с фразой ADMIN
OPTION. Лицо, получившее привилегию с этой опцией, имеет несколько
дополнительных возможностей. Он (или она) может предоставить или отозвать
системную привилегию или роль любому пользователю или роли базы данных.
Однако пользователь не может отозвать роль у самого себя. Лицо, получившее
привилегию, может передать системную роль или привилегию с помощью фразы
ADMIN OPTION. Получатель роли может изменить или удалить роль.
Фраза with admin option дает TURNER возможность предоставлять
другим пользователям или отзывать системную привилегию create table.
Фраза with grant option дает ему ту же самую возможность для объектных
привилегий select и update над таблицей ЕМР. Кроме того, TURNER может
делать других пользователей администраторами этих привилегий.
Совет Наконец, если роль предоставлена с фразой with edmin option,
получатель может изменить роль или даже удалить ее. Подробнее о ролях
мы поговорим в последующих обсуждениях.
Привилегии INSERT, UPDATE или REFERENCES могут быть
предоставлены для отдельных столбцов таблицы.
Отзыв объектных привилегий в Oracle
Предположим, что KING в очередной раз изменил свое мнение и снова
уволил служащего TURNER. Для отзыва объектных привилегий используется
команда revoke. Если вы желаете отозвать системную или объектную
привилегию, предоставленную с фразой with admin option или объектную
привилегию, предоставленную с фразой with grant option, то для этого не
требуется никакого дополнительного Синтаксиса. Просто отзовите
предоставленную ранее привилегию, и вместе с ней окажется отозванной и
возможность администрировать эту привилегию. Предлагаем познакомиться с
некоторыми примерами использования команды revoke для объектных
привилегий:
Д— SQL> revoke select, update, Insert ON emp from turner;
Revoke succeeded.
SQL> revoke references ON emp.empno from turner;
Revoke succeeded.
SQL> revoke select, update, insert on emp from turner;
Revoke succeeded.
Совет Когда специфицирована опция CASCADE CONSTRAINTS, удалЯ'
ются любые определенные в настоящий момент ограничения внешнего
ключа, использующие отзываемую привилегию REFERENCES.
Эффекты каскадирования при отзыве системных привилегий
Рассмотрим следующую ситуацию, связанную с эффектом каскадирования
системных привилегий. Пользователь SCOTT дает пользователю TURNER
Управление доступом пользователей в Oracle
253
возможность создавать таблицы и возможности их администрирования, а
TURNER в свою очередь предоставляет точно такую же привилегию
служащему FORD, стареющему работнику автомобильного завода, решившему
переключиться на программирование:
tWf"*"8$ff SQL> connect scott/tiger
Connected.
SQL> grant create table to turner with admin option;
Grant succeeded.
SQL> connect turner/ike
Connected.
SQL> create table my_table
2 (my_column number) ;
Table created.
SQL> grant create table to ford;
Grant succeeded.
SQL> connect ford/henry
Connected.
SQL> create table my_table
2 (my_column number);
Table created.
SCOTT обнаруживает, что TURNER передал привилегию create table
FORD, которому было разрешено только разрабатывать программы на
PL/SQL. SCOTT приходит в бешенство от самовольства TURNER и отзывает
у него привилегию create table вместе с административными
возможностями:
tHWiflffiii SQL> connect scott/tiger
Connected.
SQL> revoke create table from turner;
Revoke succeeded.
Останется ли после этого у FORD возможность создавать таблицы?
Давайте посмотрим:
миваак SQL> connect ford/henry
Connected.
SQL> create table my_table_2
2 (my_column number);
Table created.
Как видно, FORD по-прежнему имеет возможность создавать таблицы,
несмотря на то что TURNER (если вы уже забыли, это тот парень, который
предоставил такую возможность FORD) уже не может делать этого. Это означает, что
при отзыве у пользователей системных привилегий каскадный эффект не имеет
места. У FORD остается возможность создавать таблицы, да и созданная
TURNER таблица MY_TABLE никуда не исчезает. Если вы желаете отозвать у
пользователя системную привилегию, вы должны в явном виде отозвать эту
привилегию конкретно у данного пользователя и так же явно удалить все
объекты, созданные им за то время, пока он обладал этой привилегией.
Эффекты каскадирования при отзыве объектных привилегий
Рассмотрим аналогичную ситуацию, но на этот раз попробуем отозвать
объектную привилегию. Пусть SCOTT предоставил TURNER доступ к таблице ЕМР
с административными возможностями, а тот в свою очередь предоставил его
FORD. Изучите следующий блок кода:
*tfWfM? SQL> connect scott/tiger
Connected.
SQL> grant select on emp to turner with grant option;
Grant succeeded.
SQL> connect turner/ike
Connected.
SQL> select ename, job from scott.emp
2 where empno = 7944;
ENAME JOB
TURNER SALESMAN
254
Глава 8
SQL> grant select on scott.emp to ford;
Grant succeeded.
SQL> connect ford/henry
Connected.
SQL> select ename, job from scott.emp
2 where empno = 7369;
ENAME JOB
SMITH CLERK
Затем SCOTT обнаруживает, что сделал TURNER, и отзывает у него
привилегию:
SQL> connect scott/tlger
Connected.
SQL> revoke select on emp from turner;
Revoke succeeded.
Останется ли у FORD возможность обращаться к таблице ЕМР? Давайте
посмотрим:
Ч/Чч^ят SQL> connect ford/henry
Connected.
SQL> select ename, job
2 from scott.emp
3 where empno = 7360;
from scott.emp
ERROR at line 2:
ORA-00942: table or view does not exist
(таблицы или представления не существует)
Итак, когда у лица, предоставлявшего объектную привилегию другим
пользователям, отзывается объектная привилегия, вместе с ним ее лишаются все
получатели этой привилегии. Однако в тех случаях, когда объектная
привилегия относилась к операторам update, insert или delete и последующие
получатели этой привилегии, пользуясь ею, внесли в данные изменения, строки,
в которые были внесены изменения, не могут каким-то магическим образом
вернуться к первоначальному состоянию.
Что нужно запомнить о предоставлении и отзыве объектных
привилегий
Для успешной сдачи экзамена ОСР необходимо запомнить следующие факты,
касающиеся предоставления и отзыва объектных привилегий:
■ Если привилегия была предоставлена для двух индивидуальных столбцов,
она не может быть отозвана только для одного из них. Поэтому
привилегия должна быть отозвана для обоих столбцов, а затем повторно
предоставлена одному из них.
■ Если пользователь получил привилегию references и воспользовался ею
для создания внешнего ключа в другой таблице, то для отзыва этой
привилегии следует использовать фразу cascade constraints, так как в
противном случае операция отзыва завершится аварийно:
REVOKE REFERENCES ON emp FROM spanky CASCADE CONSTRAINTS.
■ Привилегии insert, update и references могут быть предоставлены для
индивидуальных столбцов таблицы (объекта базы данных). Однако, если у
пользователя имеется привилегия insert не на всю таблицу, а только на
ее отдельные столбцы, администратор привилегий должен убедиться, что
в таблице отсутствуют столбцы, объявленные при создании таблицы как
not-NULL, на которые не распространяется действие привилегии insert.
Это необходимо для того, чтобы при вставке значений не нарушалось
ограничение not NULL.
■ Если пользователь имеет возможность выполнить хранимую процедуру,
принадлежащую другому пользователю, и эта процедура обращается к не-
Управление доступом пользователей в Oracle
255
которым таблицам, требующиеся для доступа к этим таблицам привилегии
должны быть предоставлены владельцу процедуры, а вовсе не тому лицу,
которому была предоставлена привилегия execute. Более того,
привилегия должна быть предоставлена не через роль, а непосредственно
пользователю.
■ В зависимости от того, что именно предоставляется или отзывается, эти
действия начинают сказываться в различное время. Все операции
grant/revoke для привилегий (системных и для объектов схемы) для
пользователей, ролей и пользователя PUBLIC проявляются немедленно. Все
операции grant/revoke для ролей для пользователей, ролей и пользователя
PUBLIC проявляются только после того, как в рамках текущего сеанса
пользователя будет выдан оператор SET ROLE для повторной активации
роли после выполнения grant/revoke, или когда после выполнения
grant/revoke будет инициирован новый сеанс пользователя.
Закрепление пройденного материала
1. Убедитесь, что можете идентифицировать все объектные привилегии и
использовать команды grant и revoke для предоставления пользователям
привилегий и их отзыва.
2. Знайте, что происходит, когда вы предоставляете объектные привилегии
пользователю PUBLIC. Знайте, когда и как при предоставлении
пользователю объектных привилегий на таблицу используется ключевое слово all.
3. Умейте вместе с предоставлением пользователю привилегий передавать
ему административные возможности для этих привилегий. Помните
синтаксические отличия между предоставлением системных привилегий с
фразой with admin option и предоставлением объектных привилегий с
фразой with grant option.
4. Убедитесь, что понимаете разницу между системными и объектными
привилегиями в отношении каскадного эффекта при отзыве этих привилегий.
5. Проверьте, понимаете ли вы все, что было специально оговорено про
особые условия в отношении предоставления и отзыва объектных привилегий.
Упражнения
1. Вы хотите предоставить пользователю TIMOTHY возможность обновлять
данные в таблице ЕМР, а также возможность администрировать доступ к
ней других пользователей. Какую команду необходимо для этого задать?
A. grant update to timothy;
B. grant update on emp to timothy;
С grant update on emp to timothy with grant option;
D. grant update on emp to timothy with admin option;
2. Пользователь REED может администрировать привилегию create ses s i-
on. Он предоставляет точно такую же привилегию пользователю MANN,
используя фразу with admin option. Затем MANN предоставляет эту
привилегию пользователю SNOW. REED обнаруживает, что MANN
передал привилегию SNOW, и отзывает у MANN привилегию. Кто теперь
может подключаться к Oracle?
A. Только REED
B. Только SNOW и MANN
С REED, MANN и SNOW
D. Только REED и SNOW
3. Пользователь SNOW владеет таблицей SALES и передает привилегию
delete пользователю REED, используя при этом фразу with grant
256
ГлаваВ
opt i on. Затем REED передает эту привилегию для таблицы SALES
пользователю MANN. SNOW обнаруживает у MANN эту привилегию и отзывает
ее у REED. Кто из следующих пользователей теперь может удалять записи
из таблицы SALES?
A. Только MANN
B. Только SNOW
С Только SNOW и MANN
D. Только REED и MANN
4. Если привилегия имеется у этого пользователя, она имеется и у всех
пользователей:
5. При удалении привилегий references после того, как, используя эту
привилегию, пользователь построил ограничение внешнего ключа, необходимо
использовать эту фразу (два слова):
Ответы
1. С. 2. D. 3. В. 4. Общедоступная. 5. cascade constraints
Использование ролей для управления доступом
к базе данных
Если в вашей базе данных имеется много таблиц, система объектных
привилегий может стать неповоротливой и трудно управляемой. Для упрощения
управления привилегиями можно использовать объект базы данных,
называемый ролью. Роль может играть в базе данных (извините за каламбур) две
роли. Во-первых, она может выступать как локальный объект для
группировки привилегий, связанных с выполнением определенных задач. Во-вторых,
роль может выступать как виртуальный пользователь базы данных, которому
могут быть предоставлены все объектные привилегии, требующиеся для
выполнения конкретной должностной функции, например для ввода данных,
контроля менеджеров, пакетной обработки и т.д. На рис. 8.1 показано, как с
помощью ролей можно управлять привилегиями. Процесс управления
привилегиями с использованием ролей состоит из четырех шагов:
1. Необходимо логически сгруппировать определенные типы пользователей в
соответствии с привилегиями, требующимися им для выполнения своих
должностных обязанностей.
2. Необходимо определить роль (или роли) для каждого типа пользователей.
3. Необходимо предоставить подходящий набор привилегий каждой из
ролей.
4. И наконец, необходимо предоставить роли конкретным пользователям
каждого типа.
Управление
привилегиями с
помощью ролей
Объекты базы данных
Привилегии
*'*!И»Я!Ш»В-иЩи«И«.
Роль
Пользователи
Управление доступом пользователей в Oracle
257
Создание ролей, соответствующих типам пользователей
Первый из упомянутых выше шагов является процессом, происходящим вне
базы данных. Ролевой механизм может быть использован для предоставления
авторизации. Одному лицу или группе лиц может быть предоставлена роль
или группа ролей. Одна роль может быть в свою очередь предоставлена другим
ролям. За счет определения различных типов ролей администратор может
намного легче управлять привилегиями доступа. Вы просто садитесь и начинаете
обдумывать, как много различных целей может быть у пользователей,
обращающихся к этому приложению? По завершении этого шага можно создать
роли, требующиеся для управления привилегиями, необходимыми для
выполнения должностных функций. Предположим, что у лиц, обращающихся к
таблице ЕМР, имеются две различные должностные роли: те, кто может делать
запросы к таблице, и те, кто может только вводить в нее данные. На
следующем шаге создаются роли, соответствующие каждому из видов деятельности.
Подобная архитектура использования ролей как промежуточного уровня для
предоставления привилегий значительно упрощает администрирование
привилегий пользователей. Посмотрим, как создаются роли:
ИИНИИВ SQL> connect scott/tiger
Connected.
SQL> create role rpt_writer;
Role created.
SQL> create role data_changer;
Role created.
Совет Для создания ролей необходимо иметь системную привилегию
CREATE ROLE.
Модификация ролей
После того как мы создали наши роли, мы поняли, что изменение данных
в таблице ЕМР — это серьезное дело. Для того чтобы создать
дополнительную защиту от ошибочного введения кем-то данных в таблицу ЕМР, можно,
используя оператор alter role identified by, изменить роль
DATA_CHANGER, чтобы для нее требовался пароль. Любое лицо, желающее
модифицировать данные в таблице ЕМР с помощью полномочий, полученных
через роль DATA_CHANGER, должно сначала предъявить пароль. Код для
изменения роли показан ниже:
SQL> alter role data_changer
2 Identified by highlyfsecure;
Role altered.
Предоставление привилегий ролям
На следующем шаге ролям предоставляются привилегии. Для выполнения этой
задачи мы можем воспользоваться той же командой, с помощью которой мы
предоставляли привилегии непосредственно пользователям, — командой grant.
Ниже демонстрируется, как предоставить привилегии обеим нашим ролям:
SQL> grant select on erap to rpt_writer;
Grant succeeded.
SQL> grant update, delete, insert on emp to data_changer;
Grant succeeded.
Совет Отзыв привилегий для ролей работает точно так же, как и для
пользователей. Системные привилегии предоставляются с помощью ролей точно
так же, как и для пользователей.
Предоставление ролей пользователям
После того как роль создана и ей предоставлены привилегии, она может быть
предоставлена пользователям. Этот шаг выполняется с помощью команды
grant Посмотрим, как это работает:
258
Глава 8
УУЧЗДдУ! SQL> grant rpt_writer to turner;
Grant succeeded.
SQL> grant data_changer to ford;
Grant succeeded.
Совет Если уже назначенной пользователю роли позже предоставляется
другая привилегия, эта дополнительная привилегия становится доступной
пользователю немедленно. То же самое можно сказать и про отзыв
привилегий у уже назначенных пользователям ролей.
Определение пользователям ролей по умолчанию
Теперь пользователь TURNER может выполнять все привилегии, переданные
ему с помощью роли RPTJWRITER, а пользователь FORD может делать то же
самое за счет привилегий роли DATACHANGER. Или не может? Вспомните,
мы специфицировали, что для DATA_CHANGER требуется пароль, чтобы
использовать свои привилегии. Мы слегка изменим идентификацию
пользователя FORD, чтобы установить этот статус:
P^^fiSffiW SQL> alter user ford default role none;
User altered.
Совет Для определения роли по умолчанию для пользователей в команде
alter user default role можно использовать следующие ключевые слова:
all, all except имя_роли и попе. Обратите внимание, что
пользователи не могут самостоятельно задавать команду alter user default
role, чтобы изменить свои роли по умолчанию. Сделать это для них может
только привилегированный пользователь, например АБД.
По умолчанию при предоставлении пользователю роли она становится его
ролью по умолчанию. Выполнив предыдущий код, мы изменили роль
пользователя FORD таким образом, чтобы у FORD вообще не было роли.
Посмотрим, как скажутся наши действия, когда FORD попытается модифицировать
содержимое таблицы ЕМР:
еШ22ЭЙ SQL> connect ford/henry
Connected.
SQL> insert into scott.emp (empno, ename, job)
2 values (1234, •SMITHERS', 'MANAGER');
insert into scott.emp (empno, ename, job)
ERROR at line 1:
ORA-00942: table or view does not exist
(таблицы или представления не существует)
Совет Роли могут быть предоставлены другим ролям!
Активация текущей роли
Пользователь FORD знает, что он способен выполнить эту задачу, так как он
владеет ролью DATA_CHANGER. Затем он вспомнил, что у его роли должен
быть пароль. FORD может использовать команду set role для активации
роли DATA_CHANGER следующим образом:
икясвгея SQL> set role data_changer identified by highly#secure;
Role set.
Теперь FORD может выполнять требующиеся ему изменения:
t^ffitWii SQL> insert into scott.emp (empno, ename, job)
2 values (1234, 'SMITHERS', 'MANAGER');
1 row created.
Совет Упоминаемая в команде SET ROLE роль предварительно должна
быть предоставлена пользователю. Кроме того, можно заблокировать все
роли оператором SET ROLE NONE.
Управление доступом пользователей в Oracle
259
Отзыв и удаление ролей
Наконец, роль может отозвать ее владелец или привилегированный
административный пользователь, используя для этого оператор revoke, что во многом
похоже на отзыв привилегий:
fWJHW SQL> connect scott/tiger
Connected.
SQL> revoke rpt_writer from turner;
Revoke succeeded.
SQL> revoke data_changer from ford;
Revoke succeeded.
Удалить роли из базы данных можно, используя команду drop role. При
удалении роли отзываются и все ассоциированные с этой ролью привилегии
пользователей. Смотрите пример:
«и»айм{ SQL> connect scott/tiger
Connected.
SQL> drop role rpt_writer;
Role dropped.
SQL> drop role data_changer;
Role dropped.
Некоторые предварительно определенные в Oracle роли
Пользователям базы данных доступны некоторые особые роли. Эти роли
появились в Oracle, начиная с версии Огас1е7. Они становятся доступны
пользователям сразу же после создания базы данных. К их числу относятся
такие роли, как CONNECT, RESOURCE, DBA, EXP_FULL_DATABASE,
а также IMP_FULL_DATABASE. Впоследствии Oracle добавил к их числу
роли DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE,
SELECT_CATALOG_ROLE и многие другие. К числу предварительно
определенных ролей, которые нужно знать для успешной сдачи первого
экзамена ОСР, относятся следующие роли:
■ CONNECT В рамках своих схем пользователям предоставляются
обширные возможности ведения разработки, включая возможность выполнения
операторов create table, create cluster, create session, create
view, create sequence и многих других операторов. Привилегии,
предоставляемые этой ролью, зависят от платформы, следовательно, в роли
может содержаться различное число привилегий, но, как правило, эта
роль никогда не разрешает создания хранимых процедур.
■ RESOURCE Предоставляет пользователям умеренные возможности
ведения разработки в рамках своей схемы, включая возможность выполнения
операторов create table, create cluster, create trigger и create
procedure. Привилегии, предоставляемые этой ролью, зависят от платформы,
следовательно, в роли может содержаться различное число привилегий.
■ DBA Позволяет пользователям администрировать и использовать все
системные привилегии.
Словарные представления для ролей
В следующих представлениях, которые можно найти в словаре данных Oracle,
содержится информация о ролях:
■ USER_ROLE_PRTVS Идентифицирует предоставленные пользователям
роли
■ ROLE_ROLE_PRTVS Идентифицирует роли, предоставленные в базе
данных другим ролям
■ ROLE_TAB_PRTVS Идентифицирует объектные привилегии,
предоставленные ролям
260
Глава В
■ ROLE_SYS_PRIVS Идентифицирует системные привилегии,
предоставленные ролям
■ SESSION_ROLES Идентифицирует роли, доступные текущему сеансу
Закрепление пройденного материала
1. Знайте, что такое роль и чем она помогает при управлении привилегиями в
Oracle. Помните о четырех шагах, требующихся для управления
привилегиями, если вы желаете использовать роли.
2. Знайте, как использовать команды create role, alter role identified
by, alter user default role, set role и drop role. Кроме того,
необходимо понимать, как по отношению к ролям используются команды
grant и revoke.
3. Если у роли имеется ассоциированный с ней пароль, не следует
предоставлять его пользователям как роль по умолчанию. Предоставляя
пользователю роль как роль не по умолчанию, вы тем самым вынуждаете получателя
роли активировать ее с помощью команды set role identified by. Этот
дополнительный шаг позволяет добиться перехода на новый, более
высокий уровень защищенности, когда пользователю требуется применить
предоставляемые такой ролью привилегии.
4. Знайте о словарных представлениях, содержащих информацию о ролях.
Упражнения
1. Пользователю THOMAS была предоставлена роль SALES_ANALYZER,
дающая ей доступ к таблице SALES для написания отчетов. Однако, когда
она попыталась воспользоваться своими привилегиями, она получила
следующее сообщение об ошибке:
ORA-00942: table or view does not exist,
(таблицы или представления не существует)
Какой из следующих операторов она должна задать для разрешения
возникшей проблемы?
A. alter user thomas default role sales_analyzer;
B. set role sales_analyzer;
С grant select on sales to sales_analyzer;
D. grant sales_analyzer to thomas;
2. Пользователь FRANKLIN владеет таблицей PROFITS и ролью
SALES_ANALYZER, которая уже предоставлена пользователю DAVIS.
FRANKLIN предоставляет привилегию select для таблицы PROFITS
роли SALES_ANALYZER. В какой момент эти привилегии станут
доступными для DAVIS?
A. При следующей регистрации DAVIS в Oracle
B. В момент следующей передачи роли SALES_ANALYZER
пользователем FRANKLIN пользователю DAVIS
C. В момент, когда пользователь FRANKLIN в следующий раз
предоставит привилегию роли SALES_ANALYZER
D. Сразу же после того, как привилегия будет предоставлена роли
SALES_ANALYZER
3. Вы определяете для пользователя роли по умолчанию. При каких
обстоятельствах (из числа перечисленных ниже) эта роль не станет для
пользователя ролью по умолчанию?
A. Если роли были предоставлены объектные привилегии
B. Если роли были предоставлены системные привилегии
Управление доступом пользователей в Oracle
261
C. Если роли был назначен пароль
D. Если роли была назначена другая роль
4. Это словарное представление может идентифицировать доступные вам роли
в рамках текущего подключения к Oracle:
I
Ответы
1. В. 2. D. 3. С. 4. SESSION ROLES.
Резюме главы
В этой главе мы рассмотрели большой объем необходимой информации о
контроле доступа пользователей в базах данных Oracle. Мы начали главу с
рассмотрения того, как в Oracle создаются пользователи. Затем мы рассмотрели
привилегии: что это такое и как они используются для контроля доступа к
информации в базах данных Oracle. Мы узнали, что доступ ко всему, что
хранится в базе данных, управляется привилегиями. Кроме того, мы обсудили, как
для более эффективного управления привилегиями используются роли.
Двухминутное погружение в пройденное
■ Модель безопасности базы данных Oracle состоит из двух частей:
ограничения доступа пользователей посредством аутентификации паролями и
контроля использования объектов с помощью привилегий.
■ Имеющиеся привилегии Oracle делятся на системные привилегии,
используемые для сопровождения объектов базы данных, и объектные
привилегии, используемые для доступа к данным из объектов базы данных и
манипулирования ими.
■ Изменение пароля может быть выполнено пользователем с помощью
оператора alter user identified by.
■ Для предоставления объектных и системных привилегий используется
команда grant.
■ Для отзыва объектных и системных привилегий используется команда
revoke.
■ Создание синонима осуществляется с помощью команды create public
synonym.
Вопросы для самопроверки
1. Этот тип объекта может играть роль промежуточного объекта для
консолидации предоставляемых пользователям привилегий по должностным
функциям:
2. Эта команда используется в Oracle для активации роли по умолчанию:
3. Эта фраза используется для определения пароля пользователя:
4. Эта команда используется для предоставления привилегий пользователям:.
5. Эта команда используется для отзыва привилегий у пользователей:
Вопросы ко всей главе
1. Вы предоставляете привилегии на таблицу другому пользователю. Какая
объектная привилегия позволит этому пользователю создавать свою собственную
таблицу с ограничением внешнего ключа по столбцу вашей таблицы?
262
Глава 8
A. references
B. index
C. select
D. delete
2. Какое из приведенных ниже утверждений о ролях является справедливым?
(Выберите три ответа.)
A. Роли можно назначать другим ролям.
B. Ролям могут быть назначены привилегии.
C. Роли могут быть предоставлены пользователям.
D. Роли могут быть предоставлены синонимам.
3. Вы желаете подключиться к базе данных Oracle. Какой из следующих
вариантов определяет метод, не требующийся вам для подключения?
A. Предоставление привилегии create session
B. Предоставление роли CONNECT
С Задание оператора create user
D. Предоставление привилегии create table
4. Пользователь JACOB конфигурирован в Oracle таким образом, что он
может создавать некоторые таблицы. Пользователь ESAU конфигурирован
так, что он может вставлять некоторые данные в таблицы JACOB и имеет
для них административные возможности. Затем JACOB отзывает у ESAU
все привилегии на вставку данных. Какой из следующих вариантов
определяет, какое событие произойдет, если АБД отзовет у ESAU привилегии
insert?
A. ESAU будет в состоянии вставлять данные в таблицы JACOB.
B. Записи, вставленные в таблицы JACOB пользователем ESAU, будут
удалены.
C. Все пользователи, которым ESAU предоставил привилегии на доступ
для вставки данных в таблицы JACOB, потеряют эти привилегии.
D. Эти привилегии останутся у всех пользователей, которым ESAU
предоставил привилегии на доступ для вставки данных в таблицы
JACOB.
5. Вы пытаетесь предоставить привилегию create table с
административными возможностями пользователю TABLEMAKER. Какой из
приведенных ниже вариантов ответа определяет подходящую фразу with для этой
цели?
A. with admin option
B. with grant option
C. with check option
D. with summary as
Ответы на вопросы для самопроверки
1. ROLE
2. set role
3. identified by
4. grant
5. revoke
Упрввление доступом пользователей в Oracle
263
Ответы на вопросы ко всей главе
1. A. references
Объяснение Привилегия references дает пользователю возможность
сделать обратную ссылку на вашу таблицу, чтобы посредством внешнего ключа
связаться с ней из своей таблицы. Вариант В неверен, поскольку привилегия
index позволяет пользователю создать для таблицы индекс, и вариант С
неверен, поскольку привилегия select позволяет ему делать запросы к таблице. И
наконец, вариант D не проходит, потому что привилегия insert всего лишь
позволяет вставлять в таблицу данные.
2. А, В и С.
Объяснение Единственной опцией, непригодной для управлений ролями,
является вариант D. Роли не могут быть назначены синонимам. Вернитесь к
обсуждению ролей и привилегий в этой главе.
3. D. Предоставление привилегии create table
Объяснение Для того чтобы подключиться к базе данных Oracle,
привилегия create table не требуется. Вариант А ошибочен, так как привилегия
create session необходима для подключения к Oracle. Вариант В является
ошибочным, так как роли CONNECT назначена привилегия create session,
необходимая для подключения к Oracle. Вариант С тоже ошибочен, потому что
перед подключением пользователя к Oracle необходимо сначала его создать.
4. С. Все пользователи, которым ESAU предоставил привилегии на доступ для
вставки данных в таблицы JACOB, потеряют эти привилегии.
Объяснение В Oracle при отзыве объектных привилегий имеют место
эффекты каскадирования. Если пользователь, которому были предоставлены
административные привилегии, предоставит эти привилегии другим
пользователям, а они затем отзовут объектную привилегию, то все пользователи,
которым эта привилегия была предоставлена, также потеряют ее. Вариант А
некорректен, поскольку ESAU больше не имеет возможности вставлять
данные в таблицы пользователя JACOB. Вариант В некорректен, так как любая
запись, добавленная ESAU к таблицам JACOB, будет удалена. Ответ D
некорректен, поскольку является логической противоположностью правильного
ответа — варианта С.
5. A. with admin option
Объяснение Фраза with admin option используется для предоставления
системных привилегий типа создания таблицы с административными
возможностями. Фраза with grant option используется для предоставления
объектных привилегий типа insert с административными возможностями, что делает
ошибочным вариант ответа В. Вариант С ошибочен, так как фраза with check
option используется для принудительного введения более высокого уровня
безопасности данных в таблицах при их изменении с помощью созданных для
них представлений. Наконец, вариант D неверен, так как фраза with summary
as используется для устранения избыточности в подзапросах.
ЧАСТЬ II
Практические
экзаменационные
материалы для ОСА
ОгасШ SQL
ГЛАВА 9
Первый экзамен ОСА: введение
в SQL
Первый экзамен ОСА: введение в SQL
267
ервый экзамен на ОСР в области АБД Oracle (Oracle DBA track)
охватывает концепции и практические моменты, относящиеся к
использованию команд SQL. Для сдачи этого экзамена
необходимо продемонстрировать понимание основных конструкций
SQL, имеющихся в Oracle, включая встроенные функции.
Кроме того, вы должны понимать базовые концепции реляционной системы
управления базами данных (РСУБД). В новых редакциях первого экзамена
ОСР акцент делается на полное понимание языка программирования SQL.
Кроме того, исследуются появившиеся в Огас1е9/ новые возможности, так что
следует удостовериться, что эти новые возможности вам понятны.
Первый комплект экзаменационных вопросов
1. Вы формулируете оператор SQL для выборки данных из Oracle. Какой из
следующих операторов SQL неверен?
A. select NAME, JERSEY_NO where Jersey_No 6;
B. select NAME, JERSEY_NO from PLAYERS;
С select * from PLAYERS where JERSEY_NO = 6;
D. select JERSEY_NO from PLAYERS;
2. В рамках сеанса SQL*Plus вы как часть одной транзакции обрабатываете
некоторые изменения данных. Какой из следующих вариантов обычно не
означает конца транзакции?
A. Задание оператора update
B. Задание оператора commit
С Задание оператора rollback
D. Завершение сеанса
3. Вы только что удалили из таблицы 1700 строк. Какой из приведенных ниже
операторов используется, чтобы сохранить в базе данных сделанные вами
изменения?
A. savepoint
В.commit
С rollback
D. set transaction
4. Какое из словарных представлений является наиболее подходящим для
идентификации столбцов, которые индексируются исключительно
вследствие включения столбцов в ограничение?
A. USERJQMDEXES
B. USER_TAB_COLUMNS
С USER_COLUMNS
D. USER_CONS_COLUMNS
5. Как часть логической модели данных вы создаете таблицы базы данных.
Какое из следующих ограничений может быть создано только как
ограничение для столбца (то есть не как ограничение для таблицы) при создании
или изменении таблицы?
A. По уникальности
B. Внешнего ключа
С Проверки по списку
D. He-NULL
268
Глава 9
6. У вас имеется таблица с тремя ассоциированными индексами, двумя
триггерами, двумя ссылками на эту таблицу из других таблиц и одним
представлением. Вами задан оператор drop table cascade constraints. Какие
из следующих объектов останутся в базе данных после выполнения
оператора?
A. Триггеры
B. Индексы
С Внешние ключи в других таблицах
D. Представления
7. Вы выполняете в Oracle операции SQL. За исключением одной, все
приведенные ниже функции для работы с датами возвращают тип данных DATE.
Какой именно?
A. NEW_TIME
B. LAST_DAY
С ADD_MONTHS
D. MONTHS_BETWEEN
8. Вы задаете оператор select для таблицы BANK_ACCT, содержащей
фразу order by. Какой из приведенных ниже вариантов использования
фразы order by приведет к возникновению ошибки?
A. order by acctno DESC;
B. order by 1;
С order by sqrt(l);
D. order by acctno ASC;
9. Вы выполняете запрос select 5 + 4 from DUAL. До этого момента вам не
приходилось вставлять данные в таблицу DUAL. Какое из следующих
утверждений лучше других описывает таблицу DUAL?
A. Словарное представление, содержащее имена двух схем
B. Таблица с одним столбцом и одной строкой, используемая в
различных операциях
C. Словарное представление, содержащее имена двух индексов
D. Таблица с двумя столбцами и без строк, используемая в различных
операциях
10. Вами задан следующий оператор:
SELECT DECODE(ACCTNO, 123456, "CLOSED', 654321, 'SEIZED', 590395, 'TRANSFER',
'ACTIVE') FROM BANK_ACCT;
Какую информацию отобразит этот оператор, если значение ACCTNO
равно 503952?
A. ACTIVE
B. TRANSFER
С SEIZED
D. CLOSED
11. Вы ввели в таблицу BANK_ACCT несколько десятков строк. Какой из
следующих операторов позволяет выполнять его снова и снова, вводя во
время выполнения оператора различные значения переменных?
A. insert into BANK_ACCT (ACCTNO, NAME) VALUES
(123456, 'SMITH');
B. insert into BANK_ACCT (ACCTNO, NAME) VALUES (VAR1, VAR2);
Первый экзамен ОСА: введение в SQL
269
C. insert into BANK_ACCT (ACCTNO, NAME) VALUES (&VAR1,
'&VAR2');
D. insert into BANK_ACCT (select ACCTNO, NAME from
EMP_BANC_ACCTS) ;
12. Вы выполняете следующий оператор SQL: select add_months
(' 28-APR-97', 120) from DUAL. Что возвратит Oracle?
A. 28-APR-03 B. 28-APR-07
С 28-APR-13 D. 28-APR-17
13. В понедельник 26 июня 2037 г. в 10:30 утра вы задали следующий оператор
к базе данных Oracle:
ALTER SESSION SET NLS_DATE_FORMAT -
■DAK MONTH DD, YYYY: HH:MIAM';
Затем вы задали следующий оператор:
SELECT SYSDATE FROM DUAL;
Что возвратит Oracle?
A. 26-JUN-37
B. June 26, 2037, 22:30
С 26-JUN-2037
D. MONDAY JUNE 26, 2037:10:30PM
14. Вы желаете объединить данные из двух таблиц А и В в один
результирующий набор и показать этот набор в своем сеансе. Таблицы А и В имеют
один общий столбец, который в обеих таблицах называется С. В каком из
следующих вариантов приведена именно та фраза where, которую следует
использовать в том случае, если вы желаете видеть данные из таблицы А,
для которых значение столбца С равно 5, даже в том случае, если такое
значение в таблице В отсутствует?
A. where А.С = 5 AND А.С В.с;
B. where А.С = 5 AND А.С = В.С (+);
С where А.С 5 AND А.С (+) = В.С (+);
D. where А.С 5;
15. Каждое из приведенных ниже утверждений относительно
ассоциированных столбцов и типов данных справедливо, за исключением одного.
Какого?
A. Столбцу, проектируемому для хранения данных в таблице, при
определении должен быть назначен тип данных, достаточный по
размеру для хранения значений этого столбца.
B. При создании составных первичных ключей типы данных всех
входящих в них столбцов должны быть одинаковыми.
С При создании ограничений по целостности на уровне ссылок между
двумя таблицами тип данных столбца родительской таблицы, на
который делается ссылка, должен быть идентичен ссылающемуся
столбцу дочерней таблицы.
D. При создании переменных записи, предназначенных для хранения
данных строк, тип данных каждого элемента записи должен быть
достаточно велик для хранения значения ассоциированного с этим
элементом столбца таблицы.
16. Имеется группа значений столбца таблицы, и вы хотели бы выполнить над
ними групповую операцию. Каждая из следующих функций, кроме одной,
действует на данные всех строк группы. Назовите эту одну функцию.
270
Глава 9
A. avg ( ) В. sqrt ( )
С count( D. stddev( )
17. Вы столкнулись с ситуацией, в которой вам нужно использовать функцию
nvl ( ). Все следующие утверждения относительно функции nvl ( ), за
исключением одного, являются верными. Назовите неверное
утверждение.
A. Функция nvl ( ) возвращает второе переданное ей значение, если
первое значение NULL.
B. Функция nvl ( ) обрабатывает значения многих различных типов
данных.
C. Функция nvl ( ) возвращает значение NULL, если значение первого
параметра равно значению второго параметра.
D. Оба значения, передаваемые функции nvl ( ), должны иметь один и
тот же тип данных.
18. С помощью приведенных ниже операторов вы создаете
последовательность:
CREATE SEQUENCE MY_SEQ
START WITH 394
INCREMENT BY 12
NOMINVALUE
NOMAXVALUE
NOCACHE
NOCYCLE;
Пользователь три раза задает оператор SQL для получения nextval, а
затем четыре раза задает оператор SQL, получающий значение currval.
Каким будет текущее значение последовательности?
А. 406 В. 418
C. 430 D. 442
19. В таблице ЕМР содержится 17394430 строк. Вы задаете оператор delete
from ЕМР, вслед за которым следует оператор commit. Затем вы задаете
оператор select count (*), чтобы определить, сколько строк содержится
в таблице. Через несколько минут Oracle возвращает ноль. Почему Oracle
потребовалось так много времени для получения этой информации?
A. Таблица была не пустой.
B. Высшая точка (счетчик максимального числа строк в таблице) не
была сброшена.
С После выполнения оператора commit Oracle всегда работает
медленно.
D. Не существовало табличных данных для подсчета.
20. После создания представления обнаружилось, что были пропущены два
столбца. Какой из следующих операторов необходимо задать для
добавления в представление дополнительных столбцов?
A. alter view
B. create or replace view
С insert into view
D. create view
21. Вы выполняете тестирование точности и полезности нескольких
операторов SQL. Выполнение какого из следующих операторов SQL приводит к
появлению декартова произведения?
A. Оператор соединения (join) без фразы where
B. В результате операции sum ( )
Первый экзамен ОСА: введение в SQL
271
С select * from DUAL
D. В результате операции avg ( )
23. Какой метод следует использовать для того, чтобы соответствующим
образом изменить информацию из NLS_DATE_FORMAT, используемую в
вашем сеансе SQL'Plus?
A. Установить предпочтения в соответствующей опции меню
B. Создать подходящим образом файл login. sql
С Задать оператор alter user
D. Задать оператор alter table
33. У таблицы EMP_SALARY имеется два столбца: EMP_USER и SALARY.
Столбец EMP_USER сделан равным значению имени соответствующего
пользователя Oracle. Для того чтобы пользователь MARTHA,
администратор заработной платы, могла видеть только собственную зарплату, с
помощью следующего оператора было создано представление:
CREATE VIEW EMP_SAL_VW
AS SELECT EMP_USER, SALARY
FROM EMP_SAIARY
WHERE EMP_USER - 'MARTHA';
Впоследствии вы приняли решение развернуть это представление и для
других пользователей. Какой из следующих вариантов определяет те
изменения, которые необходимо провести, чтобы это представление не давало
пользователям возможности видеть информацию о чьей бы то ни было
заработной плате, кроме своей собственной?
A.create or replace view emp_sal_vw as select
emp_user,_salary from emp_salary where emp_user user;
B. create or replace view emp_sal_vw as select
emp_user,_salary from emp_salary where emp_user = user;
С create or replace view emp_sal_vw as select
emp_user,_salary from emp_salary where emp_user 'MARTHA1;
D. create or replace view emp_sal_vw as select
emp_user,_salary from emp_salary where emp_user in select
emp_user from emp_salary where emp_user 'MARTHA');
24. Вы пытаетесь записать данные в таблицу Oracle. В Oracle можно хранить
любой из перечисленных ниже скалярных типов данных, кроме одного.
Какого именно?
A. CHAR
B. RAW
С DATE
D. INTEGER
25. В процессе сеанса SQL*PLus вы выполняете некоторые операции
преобразования. Какую из следующих функций следует использовать для
преобразования значения даты в строку символов?
A. CONVERT
B. TO_CHAR
С TO_NUMBER
D. TO_DATE
26. Ваша попытка прочесть код триггера, хранящийся в представлении
ALL_TRIGGERS словаря данных Oracle, выливается в проблему.
Содержимое столбца TRIGGER_BODY оказывается обрезанным в конце, так
272
Глава 9
что получается, что текст кода виден не полностью. С помощью какой из
перечисленных ниже мер мы сможем справиться с этой проблемой?
А.Предоставить самому себе необходимые привилегии select для
представления ALL_TRIGGER.
В. Увеличить размер выделяемой пользователю памяти с помощью
оператора alter user.
С Используя команду set, увеличить максимальный размер столбца
LONG.
D. Удалить представление ALL_TRIGGERS и создать его заново.
27. Вы задаете для базы данных Oracle следующий оператор update:
UPDATE BANK_ACCT SET NAME - 'SHAW';
Какие записи будут обновлены в этой таблице?
A. Только первая запись
B. Все записи
С Только последняя запись
D. Ни одной записи
28. Вы создали таблицу, но вскоре поняли, что вам требуется добавить в нее
еще несколько столбцов. Какой из следующих операторов следует
выполнить, чтобы добавить требующиеся столбцы?
A. create or replace table
B. alter table
С create table
D. truncate table
29. Вы занимаетесь созданием таблиц для выбранной логической модели
данных. Для создания какого ограничения требуется наличие привилегии
references?
A. по уникальности (unique)
B. внешнего ключа (foreign key)
С проверки по списку (check)
D. не-NULL (not NULL)
30. У таблицы INVENTORY имеется три столбца: UPC_CODE, UNITS и
DELIVDATE. Вы намерены ежедневно добавлять в нее новые записи,
используя для этого представления. При создании представления следует
использовать следующий код:
CREATE VIEW DAY_INVENTORY-VW
AS SELECT UPC_C0DE, UNITS, DELIVJ3ATE
FROM INVENTORY
WHERE DELIVJ3ATE - SYSDATE
ORDER BY UPC_C0DE;
Что произойдет, когда вы попытаетесь создать это представление?
A. Oracle возвратит сообщение об ошибке, в котором сообщается, что
фраза order by не разрешена для использования в представлениях.
B. Oracle возвратит сообщение об ошибке, в котором сообщается, что
для создания подобного представления требуется фраза with check
option.
С Oracle возвратит сообщение об ошибке, в котором сообщается, что
оператор select должен быть заключен в скобки.
D. Представление будет успешно создано Oracle.
Первый экзамен ОСА: введение в SQL
273
31. Вам требуется выполнить поиск текстовых данных в столбце, но вы
помните только часть этой строки. Какая из следующих операций SQL
позволяет использовать сравнения с групповыми символами?
A. in В. exists
С between D. like
38. У вас имеется сценарий, который планируется выполнять, используя
SQL*Plus. В нем используется один оператор SQL для вставки данных в
одну из таблиц. Какой из следующих ниже вариантов предлагает
простейший способ специфицировать значения переменных в сценарии один раз
и таким образом, чтобы не требовалось взаимодействия с пользователем
через строку приглашения SQL*Plus?
A. Использовать для сбора данных команду define.
B. Использовать для сбора данных при каждом прогоне команду
accept.
С Использовать для спецификации данных для оператора в
исполнительном периоде символ &.
D. Использовать в операторе жестко закодированные значения.
33. Вы соединяете данные из двух таблиц — EXPNS и ЕМР — в один
результирующий набор данных и показываете этот набор в своем сеансе. У этих
таблиц имеется общий столбец, который называется EMPID. В каком из
перечисленных ниже вариантов ответа верно записана фраза where,
обеспечивающая отбор данных из таблицы ЕМР, где значение столбца EMPID
равно 39284, но только в том случае, если в таблице EXPNS появляется
соответствующее значение?
A.where ЕМР.EMPID = 39284 AND ЕМР.EMPID = EXPNS.EMPID;
B.where ЕМР.EMPID = 39284 (+) AND EMP.EMPID = EXPNS.EMPID;
С where EMP.EMPID = EXPNS.EMPID;
D.where EMP.EMPID = 39284 AND EMP.EMPID = EXPNS.EMPID ( + );
34. Рассмотрите следующий протокол сеанса SQL*Plus:
INSERT INTO INVENTORY (UPC_CODE, PRODUCT )
VALUES (503949353, "HAZELNUT COFFEE');
INSERT INTO INVENTORY (UPC_CODE, PRODUCT)
VALUES (593923506, 'SKIM MILK');
INSERT INTO INVENTORY (UPC_CODE, PRODUCT)
VALUES (402392340, 'CANDY BAR');
SAVEPOINT INV1;
UPDATE INVENTORY SET UPC_CODE - 50393950
WHERE UPC_C0DE - 402392340;
UPDATE INVENTORY SET UPC_CODE - 4104930504
WHERE UPC_C0DE - 402392340;
COMMIT;
UPDATE INVENTORY SET PRODUCT - (
SELECT PRODUCT FROM INVENTORY
WHERE UPC_CODE -50393950)
WHERE UPC_CODE - 593923506;
ROLLBACK;
Каким из следующих кодов UPC в результате этой серии операций не
будут соответствовать записи в таблице INVENTORY?
А. 593923506 В. 503949353
С 4104930504 D. 50393950
35. Вы удаляете из базы данных Oracle таблицу. Что произойдет с каждым из
представлений, которые могут иметь с этой таблицей объектные
зависимости, если для нее выполнить оператор drop table?
А. Представления автоматически удаляются вместе с таблицей.
274
Глава 9
B. Автоматически удаляются представления из той же схемы, к которой
принадлежит таблица, но внешние по отношению к ней
представления не удаляются.
C. Автоматически удаляются все представления из той базы данных,
которой принадлежит таблица, но представления, обращающиеся к
нашей таблице по связи базы данных, не удаляются.
D. Представления с объектной зависимостью от удаляемой таблицы
автоматически переводятся в недействительное состояние, но не
удаляются.
36. Вы желаете объединить данные из четырех таблиц в один результирующий
набор данных и показать этот набор в сеансе. У таблицы А имеется общий
столбец с таблицей В, у таблицы В — с таблицей С, а у таблицы С — с
таблицей D. Вы хотели бы еще более 01раничить данные, возвращаемые
запросом, поставив условие, чтобы в выходной набор попадали только те строки
с данными, где общий столбец таблиц А и В равен 5. Сколько условий
должно быть задано во фразе where оператора select?
А. Два В. Три
С Четыре D. Пять
37. Вы пытаетесь объяснить новому администратору безопасности модель
безопасности Oracle. Что является двумя компонентами модели
безопасности базы данных Oracle?
A. Аутентификация с помощью паролей и предоставление привилегий
B. Аутентификация с помощю паролей и создание объектов базы
данных
C. Создание объектов базы данных и пользователей
D. Создание пользователей и аутентификация с помощью паролей
38. Имеется сценарий, который вы планируете выполнять, используя SQL'Plus.
Этот сценарий содержит несколько операторов SQL, управляющих
запасами молока в нескольких таблицах, исходя из различных фрагментов
информации. Вы хотели бы, чтобы выходные данные попали в файл для
последующего ознакомления с ними. Какую команду следует использовать для
этого?
A. prompt В. echo
С. spool D. define
39. Имеется таблица с именем TEST_SCORE, в которой хранятся результаты
тестирования, сгруппированные по идентификационным номерам
студентов, местам сдачи теста и дате сдачи теста. В этой таблице хранятся
тесты, сданные в разных городах страны. Если студенту не удается пройти
тестирование с первого раза, следующая сдача разрешается ему не ранее чем
через 30 дней. Для этого в приложение включена специальная проверка,
не позволяющая студенту сдавать тест в том же городе второй раз до
истечения 30 дней с момента первой сдачи. Не так давно кому-то пришло в
голову, что студенты могут обойти это "правило 30 дней", повторно сдавая
тест в другом городе. Какой из приведенных ниже операторов SQL был бы
полезен для выявления студентов, которые пытались это сделать?
A. select A. STUDENT_ID, A.LOCATION, В.LOCATION from
TEST_SCORE A, TEST_SCORE В where A.STUDENT_ID
B.STUDENT_ID AND A.LOCATION B.LOCATION AND
trunc(A.TEST_DATE)+30 <= trunc(B.TEST_DATE) AND
trunc(A.TEST_DATE)-30 >= trunc(B.TEST_DATE) ;
B. select A.STUDENT_ID, A.LOCATION, B.LOCATION from
TEST_SCORE A, TEST_SCORE В where A.STUDENT_ID
B.STUDENT ID AND A.LOCATION О В.LOCATION AND
Первым экзамен ОСА: введение в SQL
275
trunc(A.TEST_DATE)+30 >= trunc(В.TEST_DATE) AND
trunc(A.TEST_DATE)-30 <= trunc(B.TEST_DATE);
C. select A.STUDENT_ID, A.LOCATION, B.LOCATION from
TEST^SCORE A, TEST_SCORE В where A.STUDENT_ID =
B.STUDENT_ID AND A.LOCATION B.LOCATION AND
trunc(A.TEST_DATE)+30 >= trunc(B.TEST_DATE) AND
trunc(A.TEST_DATE)-30 <= trunc(B.TEST_DATE);
D. select A.STUDENT_ID, A.LOCATION, B.LOCATION from
TEST_SCORE A, TEST_SCORE В where A.STUDENT_ID
B.STUDENT_ID AND A.LOCATION О В.LOCATION AND
trunc(A.TEST_DATE)+30 <= trunc(B.TEST_DATE) AND
trunc(A.TEST_DATE)-30 >= trunc(B.TESTJDATE);
40. В приложении, занимающемся обработкой расходов, вы выполняете в
таблице EMPLOYEE поиск информации, соответствующей номеру
имеющегося счета. В таблице INVOICE имеется столбец EMPID, являющийся
первичным ключом таблицы EMPLOYEE. Какой из следующих вариантов
годится для получения данных из таблицы EMPLOYEE с использованием
конкретного номера счета?
A. select * from EMPLOYEE where empid Sempid;
B. select * from EMPLOYEE where empid 69494;
C. select * from EMPLOYEE where empid (select empid from
invoice where invoice_no 4399485);
D. select * from EMPLOYEE;
41. Какой из следующих вариантов не описывает подходящего
использования фразы having?
A. Для возвращения данных в отсортированном порядке
B. Для исключения определенных групп данных на основании
известных критериев
C. Для включения определенных групп данных на основании
неизвестных критериев
D. Для включения определенных групп данных на основании известных
критериев
42. Вы управляете доступом к данным для приложения, в котором
задействовано 163 таблицы и которое обслуживает 10000 пользователей. Какой из
следующих объектов должен помочь в доступе к этому приложению за
счет группирования привилегий в объекте, который можно немедленно
предоставить пользователю?
А. Последовательности В. Таблицы
С. Индексы D. Роли
43. После первого входа в Oracle для доступа к таблице ЕМР пользователю
SNOW было предложено изменить свой пароль. Какой из следующих
операторов поможет ему сделать это?
A. alter user В. alter table
С. alter role D. alter index
44. Пользователь SNOW выполняет следующий оператор: select * from
ЕМР. Оператор был выполнен успешно, и пользователь может
просмотреть его выходные данные. Владеет таблицей ЕМР пользователь REED.
Что требуется для того, чтобы произошел именно такой сценарий?
А. Пользователю SNOW требуется роль для просмотра таблицы ЕМР.
276
Глава 9
В. Пользователю SNOW требуется привилегия для просмотра таблицы
ЕМР.
С Пользователю SNOW требуется синоним для таблицы ЕМР.
D. Пользователю SNOW требуется пароль для таблицы ЕМР.
45. Вы задаете в Oracle следующий оператор:
SELECT * FROM ЕМР WHERE DEPT IN
(SELECT DEPT FROM VALID_DEPTS
WHERE DEPT_HEAD - 'SALLY'
ORDER BY DEPT);
Какой из следующих вариантов лучше других соответствует реакции Oracle
на этот оператор SQL?
A. Oracle возвратит отобранные данные.
B. Oracle возвратит данные из ЕМР, но не из VALID_DEPTS.
C. Oracle возвратит данные из VALID_DEPTS, но не из ЕМР.
D. Oracle возвратит сообщение об ошибке.
46. В SQL*Plus кодируются операторы SQL. Какой из приведенных ниже
операторов является допустимым оператором SQL?
A. select nvl(sqrt(59483)) from dual;
В.select to_char(nvl(sqrt(59483), 0)) from dual;
С select to_char(nvl(sqrt(59483), 'VALID')) from
dual ;
D. select (to_char(nvl(sqrt(59483), '0')) from dual;
47. Ниже приведены выходные данные некоторого сеанса SQL*Plus:
select PLAY_NAME II И AUTHOR play_table from PLAYS;
My Plays and Authors
Midsummer Night's Dream, SHAKESPEARE
Waiting For Godot, BECKETT
The Glass Menagerie, WILLIAMS
С помощью какой команды SQL*Plus получены эти выходные данные?
A. column PLAY_TABLE alias "My Plays and Authors"
B. column PLAY_TABLE format al2
С column PLAY_TABLE heading "My Plays and Authors"
D. column PLAY_TABLE as "My Plays and Authors"
48. Вы создаете представление для таблицы с помощью следующего
оператора:
CREATE VIEW BASEBALL_TEAM_VW
AS SELECT B.JERSEY_NUM, B.POSITION, B.NAME
FROM BASEBALLJTEAM В
WHERE B.NAME - (SELECT UNAME FROM MY_USERS);
Ниже приведено содержимое таблицы MY_USERS:
UNAME
JONES
SMITH
FRANK
JENNY
Кто из перечисленных ниже людей не будет назван, если запрос к
представлению сделает пользователь JONES?
A. JONES
B. SMITH
Первый экзамен ОСА: введение в SQL
277
CBABS
D. JENNY
49. При попытке прочесть код для создания представления, хранящийся в
словаре данных Oracle, возникает проблема. Код представления
получается обрезанным с конца. Какая из перечисленных ниже мер поможет
разрешить эту проблему?
A. Увеличить размер словарного представления.
B. Увеличить размер выделяемого пользователю пространства с
помощью команды alter user.
C. Использовать оператор set long.
D. Использовать оператор set nls_date_format.
50. Изучите следующий оператор SQL:
SELECT FARM_NAME, COW_NAME,
COUNT (CARTON) AS NUMBER_OF_CARTONS
FROM COW_MILK
GROUP BY COW_NAME;
Какая из следующих строк содержит ошибку?
A. select FARMJNAME, COW_NAME,
B. count(CARTON) as NUMBER_OF_CARTONS
С from COW_MILK
D. group by COW_NAME;
E. В этом операторе нет ошибок.
51. Изучите следующий оператор SQL:
SELECT COW_NAME,
MODfCARTOI», FILL_STATUS)
FROM COW_MILK
GROUP BY COW_NAME;
Какая из следующих строк содержит ошибку?
A. select C0W_NAME,
B. mod(CARTON, FILL_STATUS)
С from C0W_MILK
D. group by C0W_NAME;
E. В этом операторе нет ошибок.
52. Вы пишете запросы к базе данных Oracle. В каком из следующих запросов
использованы преимущества встроенных представлений?
A. select * from EMP_VW where EMPID = (select EMPID
from INVOICE where INV_NUM = 5506934);
B.select A.LASTNAME, B.DEPT_NO from EMP A, (select
EMPID, DEPT_NO from DEPT) В where A.EMPID B.EMPID;
С select * from EMP where EMPID IN (select EMPID from
INVOICE where INV_NUM 23) ;
D. select 'select * from EMP_VW where EMPID is not NULL;'
from USERJTABLES;
53. У вас имеются несколько индексов для таблицы, которые требуется
удалить. Однако вы желаете избежать удаления индексов, ассоциированных с
ограничениями. Каждый из приведенных ниже операторов (кроме одного)
удаляет индекс, ассоциированный с ограничением. Какой из вариантов не
удаляет индекс, ассоциированный с ограничением?
278
Глава 9
A. drop index
В.alter table drop primary key cascade
С alter table drop constraint
D. drop table
54. Вы управляете ограничениями для таблицы Oracle. Какой из следующих
вариантов корректно определяет ограничения первичного ключа?
A. Каждое значение первичного ключа должно быть уникальным.
B. Ни одно из значений первичного ключа не может быть пустым
(NULL).
С Каждое значение первичного ключа должно быть уникальным, и ни
одно из них не может быть пустым (NULL).
D. Каждое значение столбца первичного ключа должно иметь тот же тип
данных, что значения других столбцов таблицы.
55. Изучите следующий оператор:
CREATE TABLE FOOBAR
( MOO VARCHAR2(3),
BOO NUMBER);
В этой таблице насчитывается 60 000000 строк. Вы задаете для нее
следующий оператор:
SELECT MOO, BOO FROM FOOBAR WHERE MOO - 'ABC
Это значение является уникальным для столбца МОО, но для выполнения
запроса требуется несколько минут. Как наилучшим образом объяснить,
почему так происходит?
A. Oracle не использует существующий индекс по первичному ключу.
B. Оператор select, не использующий представления, обычно
выполняется дольше.
С У таблицы FOOBAR нет первичного ключа, и поэтому нет индекса по
столбцу МОО.
D. Таблица была удалена и затем создана заново.
56. Вы создали таблицу с именем ЕМР и первичным ключом ЕМР_РК_01. В
каких словарных представлениях и характеристиках вы будете искать
объекты, которые ассоциированы с этой таблицей и ее первичным ключом?
A. USERSEQUENCES — последовательности, созданные в одно и то
же время
B. USER_TABLES — таблицы с одинаковым количеством столбцов
С USER_IND_COLUMNS — ограничения с тем же именем, что и у
таблицы
D. USERJNDEXES — индексы с тем же именем, что и у ограничения
57. Вы проектируете свою базу данных и пытаетесь определить наилучший
метод индексирования таблиц. В каком из приведенных ниже утверждений
указано главное преимущество использования в базах данных битовых
индексов?
A. Повышение производительности столбцов с большим числом
уникальных значений
B. Повышение производительности столбцов с малым числом
уникальных значений
С Повышение производительности столбцов, содержащих только
уникальные значения
Первый экзамен ОСА: введение в SQL
279
D. Повышение производительности последовательностей, содержащих
только уникальные значения
58. Пользователь HARRIS хотел бы изменить строку таблицы EMPLOYEE, в
которой имеется три столбца: EMPID, LASTNAME и SALARY.
Пользователь хотел бы изменить данные о заработной плате для служащего с
номером 59694. Какой из операторов подойдет для этой цели лучше других?
A. update employee set salary = 5000 where empid = 59694;
B. update employee set empid = 45939 where empid 59694;
С update employee set lastname 'HARRIS' where empid =
59694;
D. update employee set salary = 5000 where lastname =
'HARRIS';
59. Вы желаете предоставить пользователю TIMOTHY возможность обновлять
данные из таблицы ЕМР, а также возможность администрировать доступ к
ней для других пользователей. Какую из приведенных ниже команд
следует для этого задать?
A. grant update to timothy;
B. grant update on emp to timothy;
С grant update on emp to timothy with grant option;
D. grant update on emp to timothy with admin option;
60. Пользователь REED может администрировать привилегию create
session. Используя соответствующую фразу, он предоставляет эту же
привилегию пользователю MANN. Тот в свою очередь предоставляет ее SNOW.
Пользователь REED обнаруживает, что MANN задал эту привилегию для
SNOW, и отзывает ее у пользователя MANN. Кто теперь имеет
возможность подключаться к Oracle?
A. Только REED
B. Только SNOW и MANN
С REED, MANN и SNOW
D. Только REED и SNOW
Второй комплект экзаменационных вопросов
1. Вы объединяете данные из двух таблиц COW_MILK (С) и
CARTON_CRATE (C1) в один результирующий набор и просматриваете
его в рамках сеанса. У обеих таблиц имеется общий столбец, который
называется CARTON_NUM. Вы желаете посмотреть данные таблицы
COW_MILK для коровы по кличке BESS, а также всю соответствующую
информацию из таблицы CARTON_CRATE, но если значение в столбце
CARTON_NUM отсутствует, вы не хотите просматривать данные из
COW_MILK. В каком из следующих вариантов ответа приводится
правильная фраза where, которую необходимо использовать в подобном случае?
A. where C.COW_NAME 'BESS' AND С.CARTON_NUM
ci.carton_num;
B. where С.CARTON_NUM = CI.CARTON_NUM;
C. where C.COW_NAME 'BESS'
D. Where C.COW_NAME 'BESS' AND С.CARTON_NUM =
ci.carton_num;
E. where C.COW_NAME 'BESS' AND C.CARTON_NUM =
CI.CARTON NUM (+);
280
ГлвваЭ
&. Вы создаете таблицу с первичным ключом, который заполняется с
помощью оператора insert путем вставки значений последовательности. Затем
вы вставляете в эту таблицу несколько сотен строк. После этого вы
удаляете последовательность и с помощью того же самого кода создаете ее заново.
Внезапно у ваших пользователей возникают проблемы, связанные с
нарушением ограничений. Какое из приведенных ниже объяснений лучше
других подходит к данной ситуации?
A. При удалении последовательности удаляются и связанные с ней
значения первичных ключей.
B. Остались неиспользованными все значения, которые были
кэшированы в момент удаления последовательности.
С Таблица открыта только для чтения.
D. В операторе insert содержатся дублирующие данные, так как
повторяются значения созданной заново последовательности.
3. Вы разрабатываете операторы SQL для приложения. Какая из следующих
операций SQL требует использования подзапроса?
A. in
B. exists
С between
D. like
4. Изучите следующий протокол сеанса SQL*Plus:
SELECT CEIL(4093.505) FROM DUAL;
Е1Ц4093.505)
4094
Какая из приведенных ниже однострочных функций не может быть
использована для получения значения 4093 из переданного на вход функции
ceil ( ) значения?
A. round( ) В. trunc( )
С floor( ) D. abs( )
5. У вас имеется сценарий, который вы планируете выполнить, используя
SQL*Plus. В нем имеется несколько операторов SQL, обновляющих по
имени клиента банковскую информацию в нескольких таблицах. Поскольку
сценарий изменяет информацию только для одного лица, вы хотите иметь
возможность ввести имя клиента только один раз, а затем использовать его
на протяжении всего сценария. Что лучше всего сделать, чтобы вам не
приходилось модифицировать сценарий перед каждым его прогоном?
A. Использовать define для получения значения имени перед каждым
прогоном.
B. Использовать accept для получения значения имени перед каждым
прогоном.
С Использовать символ & для спецификации лексических подстановок
в именах во время исполнения.
D. Жестко кодировать имена во всех операторах SQL и изменять эти
значения перед каждым прогоном.
6. Вам требуется отменить некоторые изменения данных. Какие из
следующих изменений данных нельзя отменить, используя команду rollback?
A. update B. truncate
С delete D. insert
Первый экзамен ОСА; введение в SQL
2В1
7. Вы разрабатываете программу для управления обработкой транзакций.
Каждый из следующих элементов, кроме одного, означает начало новой
транзакции. Что это за элемент?
A. savepoint B. set transaction
С Открытие нового сеанса D. commit
8. Следующий оператор SQL является ошибочным:
SELECT PRODUCT, BRAND
WHERE UPC_CODE - '650-35365656-34453453454-45';
Какую из перечисленных ниже фраз оператора следует изменить, чтобы он
стал правильным?
A. select
B. from
C. where
D. order by
9. Вы находитесь в начальной точке текущей транзакции и желаете сделать так,
чтобы в результате ее выполнения данные в базе данных не изменились.
Какой оператор следует использовать для того, чтобы не позволить ни одному
оператору текущей транзакции внести изменения в базу данных?
A. set transaction
В.rollback
С commit
D. savepoint
10. Ваше приложение ищет в таблице ЕМР базы данных данные в способном
принимать пустые (null) значения столбце, который указывает, является
данное лицо мужчиной или женщиной. Для повышения
производительности вы принимаете решение о создании индекса таблицы. Таблица
содержит более 2000000 строк, а в столбце имеется несколько значений
NULL. Какой из перечисленных ниже индексов будет наиболее
подходящим для этого столбца?
A. Неуникальный бинарный индекс
B. Уникальный бинарный индекс
С Битовый индекс
D. Индекс первичного ключа
11. Ваше приложение для обработки расходов служащих хранит информацию
для счетов в одной таблице. Каждый счет может содержать несколько
элементов, которые хранятся в другой таблице. Каждый счет может иметь
один или несколько элементов или вообще не иметь элементов, но
каждый из элементов должен соответствовать только одному счету. Какой из
следующих вариантов лучше других описывает связь между таблицами
INVOICE и INVOICEJTEM?
A. Родительская таблица с дочерней
B. Таблица подробностей с главной
С Первичный ключ с внешним ключом
D. Внешний ключ с первичным ключом
18. Вы задали следующий оператор:
SELECT DECODE(UPC_C0DE, 40390, 'DISCONTINUED', 65421, "STALE",
90395, "BROKEN", "ACTIVE") FROM INVENTORY;
282
Глава 9
Какая информация будет получена при выполнении этого оператора, если
UPC_CODE имеет значение 20395?
A. DISCONTINUED
B. STALE
C. BROKEN
D. ACTIVE
13. Вы разрабатываете расширенные запросы к базе данных Oracle. Какой из
следующих вариантов фразы where позволяет логически проверять
значения по набору возвращаемых данных, даже если заранее (до выполнения
запроса) неизвестно, каким будет этот набор?
A. where COL_A = 6
B. where COL_A in (6,7,8,9,10)
С where COL_A between 6 AND 10
D. where COL_A in (select NUM from TAB_OF_NUMS)
14. Вы разрабатываете многострочный запрос для управления сложными и
динамичными операциями сравнения на Олимпиаде. В этом запросе
используются две таблицы. В таблице CONTESTANT перечислены все участники
соревнований из каждой страны, а в таблице MEDALS — все страны и
количества завоеванных ими золотых, серебряных и бронзовых медалей.
Если страна не завоевала медалей какого-либо вида, в соответствующем
столбце будет стоять нуль. Следовательно, запрос всегда возвратит данные,
даже для стран, не завоевавших медалей. Какой из следующих запросов
покажет только спортсменов из стран, завоевавших более 10 медалей любого
достоинства?
A.select NAME from CONTESTANT C, MEDALS M where
С.COUNTRY = M.COUNTRY
В.select NAME from CONTESTANT where COUNTRY С in
(select COUNTRY from MEDALS M where С COUNTRY
M.COUNTRY)
С select NAME from CONTESTANT where COUNTRY С
(select COUNTRY from MEDALS M where С COUNTRY
M.COUNTRY)
D. select NAME from CONTESTANT where COUNTRY in
(select COUNTRY from MEDALS where NUM_GOLD
+NUM_SILVER + NUM_BRONZE 10)
15. В сеансе SQL*Plus вы задаете следующий запрос:
SELECT NAME, AGE, COUNTRY FROM CONTESTANT
WHERE (COUNTRY, AGE) IN (SELECT COUNTRY, MIN(AGE)
FROM CONTESTANT GROUP BY COUNTRY);
Какой из следующих вариантов идентифицирует тип запроса и ожидаемый
результат из базы данных Oracle?
A. Однострочный подзапрос, самый молодой участник из одной страны
B. Многострочный подзапрос, самый молодой участник из всех стран
С Многостолбцовый подзапрос, самый молодой участник из всех стран
D. Многостолбцовый подзапрос; Oracle возвратит ошибку, так как
вместо in должно использоваться =
16. Ниже приведено содержимое таблицы CONTESTANTS:
NAME AGE COUNTRY
BERTRAND
GONZALEZ
HEINRICH
TAN
24
29
22
39
FRANCE
SPAIN
GERMANY
CHINA
Первый экзамен ОСА: введение в SQL
283
SVENSKY 30 RUSSIA
SOO 21
Вы задаете к этой таблице следующий запрос:
SELECT NAME FROM CONTESTANT
WHERE(COUNTRY, AGE) IN ( SELECT COUNTRY, MIN(AGE)
FROM CONTESTANT GROUP BY COUNTRY);
Кто из перечисленных участников соревнований не появится в выходных
данных этого запроса?
A.SOO
В. HEINRICH
С BERTRAND
D. GONZALEZ
17. Этот объект Oracle содержит много столбцов, являющихся
функционально зависимыми от ключевого столбца объекта. Для него требуется, чтобы
составляющие его сегменты хранились вне области словаря базы данных.
Как называется такой объект?
A. Синоним
B. Таблица
С Последовательность
D. Представление
18. Для целей отчетности необходимо вычислить 7V-мерную кросс-табуляцию
выходных данных вашего оператора SQL. Какая из следующих фраз может
быть использована для этого?
A. having
B. cube
С rollup
D. trim( )
19. Вы индексируете данные Oracle в приложении. Индекс будет создан по
столбцу, содержащему последовательные числа, имеющие, по крайней
мере, семь значащих цифр. Большинство, а может быть даже все, значения
столбца начинаются с цифры 1. Какой из следующих индексов будет
наилучшим образом подходить для решения этой задачи?
A. Бинарные индексы
B. Индексы с инвертированными ключами
С Битовые индексы
D. Индексы по убыванию
80. Необходимо хранить в Oracle большие блоки текстовых данных. Эти блоки
имеют длину около 3500 символов. Какие типы данных следует
использовать для хранения подобных больших объектов?
A.VARCHAR2
B. CLOB
C. BLOB
D. BFILE
81. Какой эффект оказывает удаление таблицы на неуникальный индекс,
созданный для этой таблицы?
A. Никакого эффекта.
B. Индекс удаляется.
284
Глава9
С Индекс переводится в недействительное состояние.
D. Индекс будет содержать значения NULL.
22. Какое из следующих утверждений об индексах верно?
A. Столбцы с низкой кардинальностью хорошо управляются бинарными
индексами.
B. Столбцы с низкой кардинальностью плохо управляются битовыми
индексами.
С Столбцы с высокой кардинальностью хорошо управляются
бинарными индексами.
23. Какой из следующих методов следует использовать для увеличения числа
столбцов, отбираемых представлением?
A. Добавить столбцы в базовую таблицу.
B. Задать оператор alter view.
С Использовать в сочетании с представлением коррелированный
подзапрос.
D. Удалить и заново создать представление, ссылающееся на большее
количество столбцов.
24. Какой из следующих параметров используется при создании
последовательностей?
A. identified by
B. using temporary tablespace
С maxvalue
D. on delete cascade
25. Каждая из приведенных ниже строк является строкой оператора SQL для
базы данных Oracle. Какая из этих строк содержит ошибку?
A. create view EMP_VIEW_01
В.as select E.EMPID, E.LASTNAME, E.FIRSTNAME, A.ADDRESS
С from EMPLOYEE E, EMPL_ADDRESS A
D. where E.EMPID = A.EMPID
E. with check option;
F. Этот оператор не содержит ошибок.
26. Вы предоставляете привилегии на свою таблицу другим пользователям.
Какая из объектных привилегий позволяет пользователям создавать свои
собственные таблицы с внешними ключами по столбцу вашей таблицы?
A. references
B. index
С select
D. delete
27. Какие из следующих утверждений о таблицах верны? (Выберите три.)
A. Можно назначить роли другим ролям.
B. Можно назначить ролям привилегии.
C. Можно назначить роли пользователям.
D. Можно назначить роли синонимам.
28. Что произойдет со значением псевдостолбца CURRVAL после обращения
к NEXTVAL?
Первый экзамен ОСА: введение в SQL
285
А- Увеличится на 1.
В. Станет равным значению PREWAL.
С Станет равным значению NEXTVAL.
D. Останется без изменения.
29. В таблице EMP_SALARY имеется два столбца: EMPJUSER и SALARY.
Столбец EMP_USER устанавливается равным значению имени
пользователя Oracle. Для поддержки пользователя MARTHA (администратор
заработной платы) с помощью следующего оператора создается
представление:
CREATE VIEW EMP_SAL_VW
AS SELECT EMP_USER, SALARY
FROM EMP_SALARY
WHERE EMP_USER 'MARTHA1;
Предполагается, что с помощью этого представления MARTHA способна
видеть и обновлять данные о заработной плате всех служащих компании,
кроме себя самой. Какую из следующих фраз необходимо добавить к
оператору создания представления, чтобы реализовать эту функциональность?
A. with admin option
B. with grant option
С with security option
D. with check option
30. У таблицы INVENTORY имеется три столбца: UPC_CODE, UNITS и
DELIVDATE Через представление в таблицу ежедневно добавляются
новые данные. Представление было создано с использованием
следующего кода:
CREATE VIEW DAY_INVENTORY_VW
AS SELECT UPC_C0DE, UNITS, DELIV_DATE
FROM INVENTORY
WHERE DELIV_DATE - SYSDATE
WITH CHECK OPTION;
Что произойдет, если вы попытаетесь вставить запись с повторяющимся
значением столбца UPC_CODE?
A. Оператор закончится аварийно из-за присутствия фразы with check
option.
B. Оператор будет успешно выполнен.
С Оператор закончится аварийно из-за нарушения ограничения
первичного ключа.
D. Оператор вставит все, кроме значения даты.
31. Вы очищаете данные в базе данных Oracle. Какой из следующих
операторов одновременно с удалением таблицы из базы данных избавит вас от
всех представлений, использовавших эту таблицу?
A. drop view
B. alter table
С drop index
D. alter table drop constraint
32. С помощью следующего оператора создается представление:
CREATE VIEW BASEBALL_TEAM_VW
AS SELECT B.JERSEY_NUM, B.POSITION, B.NAME
FROM BASEBALLJTEAM В
WHERE B.NAME - USER;
286
Глава 9
Что произойдет, если пользователь JONES попытается сделать листинг
данных для пользователя SMITH?
A. Оператор select получит сообщение об ошибке.
B. Оператор select завершится успешно.
C. Оператор select получит от Oracle сообщение об ошибке NO ROWS
SELECTED.
D. Оператор select добавит данные только в BASEBALL_TEAM.
33. Какие из следующих ограничений целостности при своем определении
автоматически создают индекс? (Выберите два варианта.)
A. Ограничения внешнего ключа
B. Ограничения по уникальности
С Ограничения не-NULL
D. Ограничения первичного ключа
34. В каком из словарных представлений имеется информация о положении
столбца в первичном ключе?
A. ALL_PRIMARY_KEYS
B. USER_CONSTRAINTS
С ALL_IND_COLUMNS
D. ALL.TABLES
35. Разработчик ANJU выполняет следующий оператор: create table
ANIMALS as select * from MASTER.animals;. Каким будет результат
выполнения этого оператора?
A. В схеме MASTER будет создана таблица ANIMALS с теми же
данными, что и в таблице ANIMALS, которой владеет ANJU.
B. В схеме ANIMALS будет создана таблица ANJU с теми же данными,
что и в таблице ANIMALS, которой владеет MASTER.
С В схеме ANJU будет создана таблица ANIMALS с теми же данными,
что и в таблице ANIMALS, которой владеет MASTER.
D. В схеме ANIMALS будет создана таблица MASTER с теми же
данными, что и в таблице ANJU, которой владеет ANIMALS.
36. Пользователь JANKO хотел бы вставить новую строку в таблицу
EMPLOYEE. Таблица состоит из трех столбцов: EMPID, LASTNAME и
SALARY. Пользователь хотел бы ввести данные для EMPID (59694),
LASTNAME (Harris) и не вводить значение заработной платы. Какой из
следующих операторов лучше других справится с этой работой?
A. insert into EMPLOYEE values (59694, 'HARRIS', NULL);
B. insert into EMPLOYEE values (59694, 'HARRIS');
С insert into EMPLOYEE (EMPID, LASTNAME, SALARY) values
(59694, 'HARRIS');
D. insert into EMPLOYEE (select 59694 from 'HARRIS');
37. Формально между таблицами не существует никакой связи. Какой из
приведенных ниже вариантов ответа является самым сильным индикатором,
что между этими таблицами существует отношение "родитель-потомок''?
A. Эти две таблицы базы данных называются VOUCHER и
VOUCHERJTEM соответственно.
B. Эти две таблицы базы данных называются EMPLOYEE и PRODUCTS
соответственно.
Первый экзамен ОСА: ваедение в SQL
287
С Эти две таблицы базы данных были созданы в один и тот же день.
D. Эти две таблицы базы данных не содержат одинаковых столбцов.
38. Какие из приведенных ниже вариантов являются допустимыми типами
данных Oracle? (Выберите три варианта.)
A. CHAR В. VARCHAR2
С BOOLEAN D. NUMBER
39. К какому из перечисленных ниже эффектов приведет пропуск фразы
where оператора delete?
A. Оператор delete завершится аварийно, потому что не были
предложены записи для удаления.
B. Оператор delete предложит пользователю ввести критерии удаления.
С Оператор delete завершится аварийно из-за синтаксической
ошибки.
D. Оператор delete удалит из таблицы все записи.
40. Каждая из следующих строк представляет строку оператора. Какая из них
приведет к появлению ошибки?
A. create table GOODS
B. (GOODNO number,
CGOOG_NAME varchar2 (20) check (GOOD_NAME in (select NAME
from AVAIL_GOODS)),
D. constraint PK_GOODS_01
E. primary key (GOODNO));
F. В этом операторе нет ошибок.
41. Что из приведенного ниже является средством управления транзакциями,
которое не позволяет нескольким пользователям одновременно обновлять
данные таблицы?
A. Блокировки
B. Операторы commit
С Операторы rollback
D. Контрольные точки
42. Вы добавляете столбцы в таблицу Oracle. Какой из следующих вариантов
указывает на то, что вы собираетесь увеличить число столбцов таблицы,
принимающих значения NULL?
A. Используйте оператор alter table.
B. Убедитесь, что для всех строк значения всех столбцов есть NULL.
С Сначала увеличьте размеры смежных столбцов, а затем добавьте
новый столбец.
D. Добавьте столбец, заполните его значениями, а затем добавьте
ограничение не-NULL.
43. Пользователь задает оператор select count (*) from employee. Запрос
выполняется необычно долгое время и возвращает нулевое значение
счетчика. Что будет наиболее эффективным решением этой проблемы?
A. Сделать апгрейд оборудования.
B. Произвести усечение таблицы.
С Обновить версию Oracle.
D. Удалить указатель высшей точки.
288
Глава 9
44. Как часть логической модели данных вы создаете несколько таблиц базы
данных. Для какого из следующих ограничений появится
ассоциированный с ним автоматически сгенерированный Oracle индекс?
A. По уникальности
B. Внешнего ключа
C. Проверки по списку
D. He-NULL
45. Все приведенные ниже утверждения относительно ссылочной
целостности, кроме одного, справедливы. Укажите ошибочное утверждение.
A. Осуществляющий ссылку столбец дочерней таблицы должен
соответствовать первичному ключу в родительской таблице.
B. Все значения ссылочного столбца родительской таблицы должны
присутствовать в осуществляющем ссылку столбце дочерней таблицы.
С Тип данных ссылочного столбца родительской таблицы должен быть
идентичен осуществляющему ссылку столбцу дочерней таблицы.
D. Все значения в осуществляющем ссылку столбце дочерней таблицы
должны присутствовать в ссылочном столбце родительской таблицы.
46. Вы управляете ограничениями для таблицы Oracle. Какой из следующих
вариантов корректно определяет условия, присущие ограничениям
проверки по списку?
A. Значения должны быть получены из таблицы поиска.
B. Значения должны быть частью фиксированного набора,
определенного в операторе create table или alter table.
С Значения должны использовать зарезервированные слова типа
sysdate или user.
D. Столбец не может содержать значений NULL.
47. Какая из следующих функций не является групповой функцией?
A. avg( ) В. sqrt( )
C. sum( ) D. шах ( )
48. Какие критерии должны выполняться для того, чтобы можно было
провести внешнее соединение?
A. Общие столбцы соединения не обязаны иметь общих значений.
B. Таблицы, участвующие в соединении, должны иметь общие столбцы.
С Общие столбцы соединяемых таблиц могут иметь общие значения
или не иметь таких значений.
D. Общие столбцы соединяемых таблиц должны иметь общие значения.
49. Как долго остается определенной переменная, после того как она была
определена в сеансе SQL*Plus?
A. До момента закрытия базы данных
B. До момента закрытия экземпляра
C. До конца выполнения оператора
D. До конца сеанса
50. Вы желаете изменить приглашение, используемое Oracle для получения от
пользователей входной информации. Какие из предложенных вариантов
ответа подходят для этого? (Выберите два варианта ответа.)
A. Измените параметр prompt файла config.ora.
B. Измените фразу prompt команды accept.
Первый экзамен ОСА: введение в SQL
289
C. Введите новое приглашение в файл login. sql.
D. В Oracle невозможно изменить приглашение.
51. Для таблицы EMPLOYEE неизвестен критерий поиска. Какие из
следующих опций являются подходящими для использования в операторах
сравнения в таком случае? (Выберите две.)
A. select * from EMPLOYEE where EMPID = Sempid;
B.select * from EMPLOYEE where EMPID 69494;
С select * from EMPLOYEE where EMPID (select empid from
invoice where INVOICE_NO 4399485);
D. select from EMPLOYEE;
52. Какой из перечисленных ниже символов является принятым по
умолчанию символом для специфицирования подстановочных переменных в
операторах select?
А. Амперсанд В. Эллипсис
С. Кавычки D. Звездочка
53. Пользователь создает оператор соединения для таблиц EMPLOYEE и
DEPT. В таблице EMPLOYEE имеются некоторые служащие, записи о
которых пользователь обязательно хочет увидеть в выходных данных
запроса, хотя для этих пользователей до сих пор не заполнено поле "начальник
отдела". Какой оператор select больше всего подходит такому
пользователю?
A. select e.empid, d.head from EMPLOYEE e, dept d;
B. select e.empid, d.head from EMPLOYEE e, dept d where
e.dept# d.dept#;
C. select e.empid, d.head from EMPLOYEE e, dept d where
e.dept# d.dept# ( + ) ;
D.select e.empid, d.head from EMPLOYEE e, dept d where
e.dept* (+) d.dept#;
54. Какое из следующих вариантов использования фразы having является
правильным? (Выберите три варианта.)
A. Для возвращения выходных данных в отсортированном виде
B. Для исключения некоторых групп данных на основании известных
критериев
C. Для включения некоторых групп данных на основании неизвестных
критериев
D. Для включения некоторых групп данных на основании известных
критериев
55. Что из приведенного ниже лучше всего описывает декартово произведение?
A. Групповая функция
B. Результат оператора select с соединением с отсутствующей фразой
where
C. Результат нечеткой логики
D. Специальная характеристика сервера Oracle
56. Какой из следующих методов используется для изменения принятого по
умолчанию символа, определяющего переменные исполнительного
периода?
A. Модификация файла init.ora
B. Модификация файла login. sql
290
Глава 9
С Задание команды define имя_переменной
D. Задание команды set define
57. Пользователю THOMAS была предоставлена роль SALES_ANALYZER,
дающая ей доступ к таблице SALES для написания отчетов. Однако при
попытке воспользоваться своими привилегиями она получила следующее
сообщение об ошибке: ORA-00942: table or view does not exist
(таблицы или представления не существует). Какой из следующих операторов
она может задать для решения возникшей проблемы?
A.alter user thomas default role sales_analyzer;
B. set role sales_analyzer;
С grant select on sales to sales^analyzer;
D. grant sales_analyzer to thomas;
58. Пользователь FRANKLIN владеет таблицей PROFITS и ролью
SALES_ANALYZER, которая уже предоставлена пользователю DAVIS.
FRANKLIN предоставляет привилегии select для таблицы PROFITS роли
SALES_ANALYZER. В какой момент времени эти привилегии станут
доступными для DAVIS?
A. При следующей регистрации DAVIS в Oracle
B. В момент следующей передачи роли SALES_ANALYZER
пользователем FRANKLIN пользователю DAVIS
C. В момент, когда пользователь FRANKLIN в следующий раз
предоставит привилегию роли SALES_ANALYZER
D. Сразу же, после того как привилегия будет предоставлена роли
SALES_ANALYZER
59. Пользователь IMADBA желает предоставить возможность создавать
таблицы в базе данных Oracle вновь принятому служащему DAVIS, который
начал работу сегодня. Какой из следующих вариантов ответа
идентифицирует шаг, который не должен происходить перед тем, как DAVIS может
начать создавать таблицы?
A. create user davis identified by new_employee;
B. grant create session to davis;
С grant create table to davis;
D. grant create public synonym to davis;
60. Вы занимаетесь предоставлением привилегий для базы данных Oracle.
Какой из следующих вариантов называет системную привилегию,
позволяющую подключаться к базе данных?
A. CONNECT
B. RESOURCE
C. create session
D. references
Третий комплект экзаменационных вопросов
1. В Oracle задается следующий оператор select:
SQL> select e.empno, e.ename, d.loc
from emp e, dept d
3 where e.deptno - d.deptno
4 and substr(e.ename,1,1| » ' S';
Первый экзамен ОСА: ваедение в SQL
291
Какой из приведенных ниже операторов является эквивалентным
оператором, соответствующим синтаксическим требованиям ANSI, разрешенным к
использованию в базах данных Oracle?
A. Select empno, ename, loc from emp join dept on emp.deptno
= dept.deptno where substr(emp.ename,1,1) = 'S';
B. select empno, ename, loc from emp, dept on
emp.deptno = dept.deptno where
substr(emp.ename,1,1) 'S';
С select empno, ename, loc from emp join dept where
emp.deptno = dept.deptno and substr(emp.ename,1,1) 'S';
D. select empno, ename, loc from emp join dept on
emp.deptno dept.deptno and substr(emp.ename,1,1) 'S';
2. Вы пытаетесь манипулировать данными в базе данных Oracle. Какое из
следующих утверждений определяет возможности операторов select и не
требует использования подзапросов?
A. С помощью оператора select можно изменять данные в Oracle.
B. С помощью оператора select можно удалять данные в Oracle.
C. С помощью оператора select в Oracle можно создавать таблицы с
таким же содержимым, что и у другой таблицы.
D. С помощью оператора select в Oracle можно производить усечение
таблиц.
3. Вы задаете в Oracle запрос. Какой из перечисленных ниже вариантов не
идентифицирует компоненту запроса, если вы собираетесь задать запрос для
выполнения математической операции над определенными пользователем
статическими выражениями?
A. Фраза column
B. Фраза table
С Таблица DUAL
D. Фраза where
4. Вы манипулируете данными в Oracle. Что из приведенного ниже не
является командой Oracle?
A. select * from dual;
B. set define ?
C. update emp set empno 6543 where ename = 'SMITHERS';
D.create table employees (empid varchar2(10) primary key);
5. Вы определяете запросы в Oracle. Какие из перечисленных ниже объектов
базы данных не могут быть непосредственно упомянуты в операторе
select?
A. Таблицы
B. Последовательности
С Индексы
D. Представления
6. Вам требуется отфильтровать возвращаемые вашим запросом к таблице
PROFITS данные по значениям столбца PRODUCT_NAME. Какая из
следующих фраз SQL-запроса будет содержать ссылку на подходящий
критерий фильтрации?
A. select
B. from
292
Глава 9
С. where
D.having
7. В следующем блоке кода показана часть выходных данных для таблицы
PROFITS:
PRODUCT NAME PRODUCT TYPE QTR END DATE PROFIT
BARNEY DOLL TOY 31-MAR-2001 6575430.30
GAS GRILL APPLIANCE 31-MAR-2001 1234023.88
PENCIL OFFICE 30-JUN-2001 34039.99
Какой из следующих вариантов определяет подходящую фразу where для
запроса, вычисляющего полную прибыль от продажи приборов за шесть
месяцев начиная с 1 января 2001 г.?
A. where product_name 'GAS GRILL' and qtr_end_date between
'01-JAN-2001' and '01-JUL-2001';
B. where product_type 'APPLIANCE' and product_name 'GAS
GRILL' and qtr_end_date = '31-JAN-2001' or '30-JUN-2001' ;
C. where product_type = 'APPLIANCE' and qtr_end_date between
■01-JAN-2001* and '01-JUL-2001';
D. where product_name 'GAS GRILL' and qtr_end_date
'01-JAN-2001' or '30-JUN-2001';
Используйте показанное ниже содержимое таблицы ЕМР в последующих
восьми вопросах:
EMPNO ENAME JOB MGR HIREDATE SAL СОММ DEPTNO
7369
7499
7521
7566
7654
7698
77В2
77В8
7839
7844
7В76
7900
7902
7934
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
17-DEC-80
20-FEB-81
22-FEB-81
02-APR-81
28-SEP-81
01-MAY-81
09-JUN-81
09-DEC-82
17-NOV-81
08-SEP-81
12-JAN-82
03-DEC-81
03-DEC-81
23-JAN-82
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
300
500
1400
0
20
30
30
20
30
30
10
20
10
30
20
30
20
10
8. Какой из следующих вариантов определяет значение, которое будет
возвращено следующим запросом: select sum(sal) + sum(comm) from emp
where job = 'ANALYST' or ename like 'J%'?
A. 6000 B. 9925
С 9975 D. NULL
9. Какой из следующих вариантов определяет значение, которое будет
возвращено следующим запросом: select count (mgr) from emp where
deptno = 10;
А. Один В. Два
С Три D. NULL
10. Какой из следующих вариантов определяет значение, которое будет
возвращено, если будет задан следующий запрос: select count (*) from
emp where mgr = 7700-2?
А. Пять В. Шесть
С Семь D. NULL
11. Какой из следующих вариантов указывает на третьего сверху служащего в
выходных данных следующей команды SQL: select ename, sal from
emp where job = 'SALESMAN' order by empno desc?
Первый экзамен ОСА; введение в SQL
293
A. ALLEN В. MARTIN
С TURNER D. WARD
12. Какой из следующих вариантов указывает на третьего сверху служащего в
выходных данных следующей команды SQL: select ename, job from
emp where job = 'SALESMAN' order by 1 desc?
A. ALLEN B. MARTIN
С TURNER D. WARD
13. Какой из следующих вариантов определяет значение, которое будет
возвращено после задания следующего запроса: select substrljob, 1,3)
from emp where ename like upper(' ar%')?
A. ANA B. CLE
С MAN D. SAL
14. Какой из следующих вариантов определяет, какое значение будет
возвращено после задания следующего запроса: select trunc (months_betwe-
en(min(hiredate), max(hiredate))) from emp?
A. 24 B. 25
С -24 D. -25
15. Какой из следующих вариантов определяет значение, которое будет
возвращено, если будет задан следующий запрос: select * from emp where
hiredate > ' 23-JAN-82'? (Выберите два варианта.)
A. ADAMS В. MILLER
С SCOTT D. SMITH
16. Таблица TEST состоит из двух столбцов: TESTCOL, определенного как
NUMBER(IO), и TESTCOL_2, определенного как VARCHAR2(10). Вы
задаете следующий оператор Oracle: insert into test (testcol, test-
col_2) values (null, 'FRANCIS ')• Затем вы задаете следующий запрос
к этой таблице: select nvl (testcol, 'EMPTY') as testcol from test
where testcol_2 = 'FRANCIS'. Какой из следующих вариантов
правильно определяет результат выполнения запроса?
A. Oracle возвратит 0.
B. Oracle возвратит EMPTY.
С Oracle возвратит NULL.
D. Oracle возвратит ошибку.
17. Вы желаете получить данные из таблицы ORDERS с тремя столбцами:
CUSTOMER, ORDER_DATE и ORDER_AMT. В каком из ответов
приводится правильный вариант задания фразы where запроса к таблице
ORDERS, если вы желаете увидеть строки таблицы заказов, относящиеся
к заказчику по фамилии LESLIE, объем которых превышает 2700
долларов?
A. where customer =■ 'LESLIE';
B. where customer 'LESLIE' and order_amt < 2700;
С where customer = 'LESLIE' or order_amt > 2700;
D. where customer 'LESLIE' and order_amt > 2700;
18. Используйте приведенные ниже выходные данные для ответа на вопрос (в
предположении, что показанная ниже информация получена из таблицы
ЕМР, которую мы постоянно используем в этой главе):
ENAME
SMITH-dog-
ALLEN-dog-
WARD-dog-d
294
Глава 9
JONES-dog-
MARTIN-dog
BLAKE-dog-
CLARK-dog-
SCOTT-dog-
KING-dog-d
TURNER-dog
ADAMS-dog-
JAMES-dog-
FORD-dog-d
MILLER-dog
В каком из вариантов ответа записан тот оператор SQL, с помощью
которого были получены приведенные выше выходные данные?
A. select trim(trailing '-dog' from ename) as ename from emp;
B. select rpad(ename, 10, '-dog') as ename from emp;
С select substr(ename, 1, 10) as ename from emp;
D. select lpadfename, 10, '-dog') as ename from emp;
19. Используйте для ответа на вопрос следующий блок кода:
SQL> select (-45) as output from dual;
OUTPUT
-45
Какой из перечисленных ниже вариантов указывает на однострочную
функцию, которая не могла сгенерировать показанные выше выходные
данные?
A. abs( )
B. ceil ( )
C. floor ( )
D. round( )
20. Столбец, содержащий данные типа VARCHAR2, в одной из строк
содержит значение SMITHY, к которому приложение добавляет семь пробелов.
Какое значение будет возвращено при обработке этого значения
функцией length( )?
А. 6 В. 13
С 30 D. 60
21. Вы записали следующий оператор SQL*Plus:
SQL> select ceil(-97.342),
2 floor(-97.342),
3 round(-97.342,0),
4 trunc(-97.342),
5 from dual;
Какой из вариантов ответа указывает на функцию, которая не возвратит в
качестве результата число —97?
A. ceil()
B. floor ( )
С round( )
D. trunc ( )
22. Вы ввели в SQL*Plus следующий оператор:
SQL> select ceil(256.342),
2 floor(256.342),
3 round(256.342,0),
4 trunc(256.342)
5 from dual;
Первый экзамен ОСА: введение a SQL
295
Какой из вариантов ответа указывает на функцию, которая не возвратит в
качестве результата число 256?
A. ceil ( )
B. floor ( )
C. round ( )
D. trunc( )
23. Вы задаете в Oracle следующий запрос:
SQL> select months_betweenС15-MAR-83', '15-MAR-97') from dual;
Что возвратит Oracle?
А. 14 В. -14
С 168 D. -168
24. Вы хотите использовать для информации о датах в Oracle маску формата. В
какой из перечисленных ниже ситуаций эта маска формата будет
неприменима:
A. to_date( )
В.to_char( )
C. alter session set nls_date_format
D. to_number( ) t
25. В базе данных имеются две таблицы: PRODUCT и STORAGE_BOX.
Индивидуальные продукты описываются в таблице своим уникальным
идентификационным номером (ID), названием продукта и номером коробки, в
которой этот продукт хранится. Коробки индивидуального хранения
(отождествляемые по номерам), на которые имеются ссылки из другой
таблицы, могут содержать несколько различных продуктов, но каждая
коробка может находиться только в одном месте. Какой из приведенных
ниже операторов корректно отобразит ID продукта, его название и место
нахождения коробки с этим продуктом для всех продуктов, носящих
гордое имя "штуковина" (widget) в этой базе данных?
A.select p.prod_id, p.prod_name, Ь.Ьох_1ос from product p,
storage_box b where p.prod_id = b.prod_id and prod_name =
'WIDGET';
B.select p.prod_id, p.prod_name, b.box_loc from product p,
storage_box b where prod_name 'WIDGET';
С select p.prod_id, p.prod_name, b.box_loc from product p,
storage_box b where p.stor_box_num = b.stor_box_num and
p.prod_name 'WIDGET•;
D. select prod_id, prod_name, box_loc from product,
storage_box where stor_box_num = stor_box_num and
prod_name = 'WIDGET';
26. Как часть процесса составления отчета вы собираетесь соединить
информацию из трех таблиц. Эти таблицы называются EMP, DEPT и
SALGRADE. Для служащих с разрядом заработной платы, превышающим
10, требуются записи, содержащие имя служащего, адрес размещения
отдела и размер его заработной платы. Сколько операций сравнения
потребуется для такого запроса?
А. Две В. Три
С. Четыре D. Пять
27. Вы желаете соединить содержимое двух таблиц: PRODUCT и STORAGE,
чтобы перечислить места нахождения всех коробок. В таблице PRODUCT
имеется три столбца: ID, NAME и ВОХ#. В таблице STORAGE имеется два
296
Глава 9
столбца: ВОХ# и LOC. Какой из следующих вариантов ответа является
неправильным?
A.select product.id, product.name, storage.loc from
product, storage where product.box# storage.box#;
B. select product.id, product.name, storage.loc from product
join storage on product.box# storage.box#;
С select product.id, product.name, storage.loc from product
natural join -storage on product.box# = storage.box#;
D. select product.id, product .name, storage.loc from
product natural join storage;
28. Вы определяете оператор внешнего соединения. Какой из следующих
вариантов верен по отношению к операторам внешнего соединения?
A. Поскольку операции внешнего соединения позволяют иметь в одной
из таблиц значения NULL, вам не требуется определять сравнения на
равенство для соединения таких таблиц.
B. Во внешнем соединении таблиц А и В вы определяете правое
внешнее соединение, если желаете получить все строки таблицы А,
даже если отсутствуют соответствующие записи в таблице В.
C. Во внешнем соединении таблиц А и В вы определяете левое внешнее
соединение, если желаете получить все строки таблицы В, даже если
отсутствуют соответствующие записи в таблице А.
D. Несмотря на то что операции внешнего соединения позволяют иметь
в одной из таблиц значения NULL, вы должны определять сравнения
на равенство для соединения таких таблиц.
29. В базе данных имеются две таблицы: PRODUCT и STORAGE_BOX.
Индивидуальные продукты описываются в таблице их уникальными
идентификационными номерами (ID), названием продукта и номером
коробки, в которой он хранится. Коробки индивидуального хранения
(отождествляемые по номерам), на которые имеются ссылки из другой
таблицы, могут содержать несколько различных продуктов, но каждая
коробка может находиться только в одном месте. Какой из приведенных
ниже операторов корректно отобразит ID продукта, его название и
место нахождения коробки с этим продуктом для всех продуктов, носящих
гордое имя "штуковина" (widget) в этой базе данных, для которых
назначена или не назначена коробка хранения?
A.select p.prod_id, p.prod_name, b.box_loc from product p
left outer join storage_box b on p.stor_box_num
b.stor_box_num where p.prod_name = 'WIDGET' (+);
B. select p.prod_id, p.prod_name, b.box_loc from product p
left outer join storage_box b on p.stor_box_num
b.stor_box_num where p.prod_name = 'WIDGET';
С select p.prod_id, p.prod_name, b.box_loc from product p
right outer join storage_box b where b.stor_box_num
p.stor_box_num (+) and p.prod_name 'WIDGET';
D.select p.prod_id, p.prod_name, b.box_loc from product p
full outer join storage_box b on p.stor_box_num b.
stor_box_num where b.stor_box_num is NULL;
30. Вы задали в Oracle следующую команду:
SQL> select e.ename, a.street_address, a.city, a.state, a.post_code
from emp e, addr a
3 where e.empno = a.empno
4 and a.state = 'TEXAS';
В каком из следующих вариантов приведен эквивалентный оператор
ANStylSO?
Первый экзамен ОСА: введение в SQL
, 297
A.select e.ename, a.street_address, a.city, a.state,
a.post_code from emp e outer join addr a on e.empno
a.empno where a.state 'TEXAS';
B. select e.ename, a.street_address, a.city, a.state,
a.post_code from emp e left outer join addr a on e.empno
= a.empno where a.state 'TEXAS';
Cselect e.ename, a.street_address, a.city,
a.state, a.post_code from emp e right outer join
addr a on e.empno - a.empno where and a.state = 'TEXAS';
D.select e.ename, a.street_address, a.city,
a.state, a.post_code from emp e right outer join
addr a where e.empno = a.empno (+) and a.state 'TEXAS';
31. Изучите следующие выходные данные SQL*Plus:
PRODUCT. ID PRODUCT.КАМЕ BOX. LOCATION
578-X WIDGET IDAHO
TENNESSEE
456-Y WIDGET
Какой из следующих вариантов идентифицирует тип запроса, который,
вероятно, породил эти результаты?
A. Полное внешнее соединение
B. Левое внешнее соединение
С Правое внешнее соединение
D. Объединение по эквивалентности
32. Вы разрабатываете запрос к таблице PROFITS, в которой хранится
информация о доходах компании по регионам, по типам продуктов и по
кварталам. Какой из следующих операторов SQL отобразит кросс-табуляцию
выходных данных, показывающих прибыли в разбивке по регионам, типам
продуктов и по времени?
A. select region, prod_type, time, sum(profit) from profits
group by region, prod_type, time;
B. select region, prod_type, time from profits group by
rollup (region, prod_type, time);
С select region, prod_type, time from profits group by cube
(region, prod_type, time);
D.select region, prod_type, time, sum(profit) from profits
group by cube (region, prod_type, time);
33. Какой из следующих вариантов выбора идентифицирует запрос group by,
который не вызывает ошибки Oracle для базы данных при своем
выполнении?
A. select deptno, job, sum(sal) from emp group by job,
deptno;
B. select sum(sal), deptno, job from emp group by job,
deptno;
Cselect deptno, job, sum (sal) from emp;
D.select deptno, sum(sal), job from emp group by job,
deptno;
34. Изучите следующий оператор SQL:
SQL> select a.deptno, a.job, b.loc, sum(a.sal)
2 from emp a, dept b
3 where a.deptno ■• b.deptno
298
Глава9
4 group by a.deptno, a.job, b.loc
5 order by sum(a.sal);
Какой из следующих вариантов указывает столбец, по которому будут
упорядочены выходные данные запроса?
A. A.DEPTNO В. АЛОВ
С B.LOC D. sum (А. SAL)
35. Вы разрабатываете запрос к таблице PROFITS, в которой хранится
информация о доходах компании по регионам, по типам продуктов и по
кварталам. Какой из следующих вариантов ответа идентифицирует запрос, после
которого можно получить средние доходы, превышающие 100000
долларов, в разбивке по типам продуктов, регионам и по времени?
A.select region, prod_type, period, avg(profit) from
profits where avg(profit) > 100000 group by region,
prod_type, period;
B. select region, prod_type, period, avg(profit) from
profits where avg(profit) > 100000 order by region,
prod_type, period;
С select region, prod_type, period, avg (profit) from
profits group by region, prod_type, period having
avg(profit) < 100000;
D.select region, prod_type, period, avg(profit) from
profits group by region, prod_type, period having
avg(profit) < 100000;
36. В компании имеется приложение для расчета затрат на содержание
наемного работника с двумя таблицами. В одной таблице, которая называется
ЕМР, содержатся все данные о сотрудниках. В другой, носящей имя
EXPENSE, размещены оправдательные документы по расходам для
каждого служащего компании. Какой из следующих запросов получит
идентификатор (ID) и фамилию служащего для всех служащих, расходы
которых в совокупности превышают их жалованье?
A.select e.empno, e.ename from emp e where e.sal < (select
sum(x.vouch_amt) from expense x) and x.empno e.empno;
B.select e.empno, e.ename from emp e where e.sal < (select
x.vouch_amt from expense x where x.empno e.empno);
С select e.empno, e.ename from emp e where sal < (select
sum (x.vouch_amt) from expense x where x.empno e.empno);
D.select e.empno, e.ename from emp e where exists (select
sum(x.vouch_amt) from expense x where x.empno e.empno);
37. Взгляните на следующий оператор:
SQL> select ename
2 from emp
3 where enpno in
4 ( select empno
5 from expense
6 where vouch_amt > 10000);
Какой из следующих вариантов определяет оператор SQL, способный
создавать те же выходные данные, что и в предыдущем примере, но с
помощью оператора exists?
A. select e.ename from emp e where exists(select x.empno from
expense x where x.vouch_amt > 10000) and x.empno = e.empno;
B. select e.ename from emp e where exists (select x.empno
from expense x where x.vouch_amt > 10000 and x.empno =
e.empno);
Первый экзамен ОСА: введение в SQL
299
С select e.ename from emp e where x.emprio e.empno and
exists (select x.empno from expense x where x.vouch_amt >
10000);
Deselect e.ename from emp e, expense x where x.empno
e.empno and x.vouch_amt > 10000 and exists (select
x.empno from expense x where x.vouch_amt > 10000);
38. Используйте для ответа на вопрос следующий блок кода:
SQL> select deptno, job, avg(sal)
2 from emp
3 group by deptno, job
4 having avg(sal)
5 (select sal
6 from emp
7 where ename - 'MARTIN');
Как называется использованный в предыдущем операторе тип подзапроса:
A. Однострочный подзапрос
B. Многострочный подзапрос
С Подзапрос с фразой from
D. Многостолбцовый запрос
39. В базе продаж компании имеются две таблицы. В первой из них,
PROFITS, хранятся размеры прибыли по продуктам, проданным
различными региональными отделениями корпорации в различные кварталы. Во
второй таблице, REGIONS, хранится информация о названии каждого
регионального подразделения, адрес штаб-квартиры корпорации в этом
регионе, а также фамилия регионального вице-президента корпорации. С
помощью какого из следующих запросов можно получить размер полной
прибыли, полученной от продажи игрушек в регионах, возглавляемых
менеджерами SMITHERS, FUJIMORI и LAKKARAJU?
A. select sum(profit) from profits where region in (select
region from regions where reg_head in ('SMITHERS',
'FUJIMORI', 'LAKKARAJU')) and product = 'TOYS';
B.select sum(profit) from profits where region in (select
region from regions where reg_head in ('SMITHERS',
'FUJIMORI', 'LAKKARAJU') and product 'TOYS');
С select sum(profit) from profits where region (select
region from regions where reg_head in ('SMITHERS',
'FUJIMORI', 'LAKKARAJU')) and product = 'TOYS';
D. select sum(profit) from profits where region in (select
region from regions where reg_head in ('SMITHERS',
•FUJIMORI', 'LAKKARAJU')) and product = 'TOYS';
40. Следующий блок кода представляет собой запрос с подзапросом:
SQL> select dname, avg(sal) as dept_avg
2 from emp, dept
3 where emp.deptno =- dept.deptno
4 group by dname having avg(sal)
5 (select avg(sal) *l/4
6 from emp, dept
7 where emp.deptno - dept.deptno)
8 order by avg(sal);
B каком из следующих вариантов указана фраза, которая может помочь
переопределить запрос с целью устранения избыточного выполнения
групповых функций в подзапросе и в главном запросе?
A. group by В. order by
С with D. having
300
Глава9
41. Используйте для ответа на приведенный ниже вопрос выходные данные
следующего блока кода:
SQL> select e.deptno, e.ename, e.job, e.sal
2 from emp e
3 where e.sal =
4 (select max (e2.sal)
5 from emp e2
6* where nvl(e.deptno,99) - nvl(e2.deptno,99));
ENAME
BLAKE
CLARK
SCOTT
KING
FORD
JOB
MANAGER
MANAGER
ANALYST
PRESIDENT
ANALYST
SAL
2B50
2450
3000
5000
3000
С помощью какого из следующих запросов можно отобразить значение 99
в столбце DEPTNO приведенного выше выходного набора данных?
A.select nvl(e.deptno,99), e.ename, e.job, e.sal from emp e
where (e.deptno, e.sal) (select max(e2.sal) from emp e2
where nvl(e.deptno,99) = nvl(e2.deptno,99));
B. select nvl(e.deptno,99), e.ename, e.job, e.sal from emp e
where e.sal (select max(e2.sal) from emp e2 where
nvl(e.deptno,99) nvl(e2.deptno,99));
С select nvl (e.deptno,99), e.ename, e.job, e.sal from emp e
where (e.deptno, e.sal) (select e2.deptno, max(e2.sal)
from emp e2 where nvl(e.deptno,99) = nvl(e2.deptno,99));
D.select nvl(e.deptno,99), e.ename, e.job, e.sal from emp e
where (e.deptno, e.sal) (select e2.deptno, max(e2.sal)
from emp e2 where nvl(e.deptno,99) = nvl(e2.deptno,99)
group by e2.deptno);
42. База данных по продажам вашей компании состоит из одной таблицы,
PROFITS, в которой хранятся прибыли в разбивке по названию продукта,
географическим регионам и кварталам финансового года компании. Если
вам требуется получить список пяти продуктов, которые лучше других
продавались за всю историю компании, то каким оператором SQL лучше
всего для этого воспользоваться?
A.select p.prod_name, p.profit from (select
prod_name, profit from profits order by profit desc)
where rownum <= 5;
B. select p.prod_name, p.profit from (select
prod_name, sum(profit) from profits group by
prod_name order by sum(profit) desc) subq where
p.prod_name subq.prod_name;
С select prod_name, profit from (select prod_name,
sum(profit) from profits group by prod_name order
by sum(profit) desc) where rownum <= 5;
D.select prod_name, profit from (select prod_name,
sum(profit) from profits order by sum(profit) desc)
where rownum <= 5;
43. База данных о продажах состоит из одной таблицы PROFITS, в которой
содержатся данные о прибылях по каждому проданному компанией типу
продукции в разбивке по кварталам и географическим регионам. Вам
необходимо разработать отчет, который пользователи будут запускать
интерактивно, чтобы увидеть прибыли от продажи игрушек (toys) в данном
квартале. Вы знаете, что пользователи неоднократно выражали
недовольство по поводу удобочитаемости и удобства использования ваших отчетов.
Первый экзамен ОСА: введение в SQL
301
Какой из приведенных ниже вариантов сценария следует использовать в
отчете, чтобы покончить с упреками пользователей?
A.select profit from profits where prod_type => 'TOYS'
and time_period '&v_period';
B.define v_periodselect profit from profits where
prod_type = 'TOYS' and time_period = 'Sv_period';
С accept v_period prompt 'Enter the time period =>
'select profit from profits where prod_type =
'TOYS' and time_period = 'Sv_period';
D.accept v_periodselect profit from profits where
prod_type = 'TOYS' and time_period = '&v_period';
44. Изучите следующий блок кода, в котором воспроизводится содержание
сценария, называющегося dates. sql:
accept v_hiredate prompt 'enter hire date -
select empno, ename, job
from emp
where trunc(hiredate) = trunc('Sv_hiredate');
Какой из перечисленных ниже аспектов сценария следует изменить,
чтобы он заработал соответствующим образом?
A. Переменную v_hiredate следует изменить, чтобы она могла
принимать информацию типа DATE.
B. Следует удалить из запроса функцию trunc ( )
C. Фраза prompt в команде accept является необязательной.
D. Ничего, сценарий и так работает правильно.
45. Вы создаете в Oracle таблицы базы данных. В каком из следующих
вариантов содержится недопустимый оператор создания таблицы?
A.create table cats (c_name varchar2(10), c_weight
number, c_owner varchar2(10));
B. Create table my_cats as select * from cats where
owner 'ME';
С create global temporary table temp_cats (c_name
varchar2(10), c_weight number, c_owner varchar2(10));
D.create table cats-over-5-lbs as select c_name,
c_weight from cats where c_weight 5;
46. Ваша попытка создания таблицы Oracle завершается выдачей сообщения
ORA-00955 - name is already used by an existing object (имяуже
используется существующим объектом). Какой из следующих вариантов
не подходит для адекватного разрешения сложившейся ситуации?
A. Создать этот объект как другой пользователь.
B. Удалить существующий объект с таким же именем.
С Изменить имена столбцов в создаваемом объекте.
D. Переименовать существующий объект.
47. Столбец PROFITS в составе таблицы SALES объявлен как
NUMBER(10,2). Какое из следующих значений нельзя будет записать в
этот столбец?
А. 5392845.324 В. 871039453.1
С 75439289.34 D. 60079829.25
48. Служащий KING был принят на работу 17 ноября 1981 г. Вы задали
следующий запрос к базе данных Oracle: select vsize (hiredate) from emp
302
Глава 9
where ename 'KING';. Какой из следующих вариантов ответа будет'
правильным?
А. 4 В. 7
С. 9 D. 17
49. Вы определили в таблице SALES столбец PRODUCT_NAME, задав его тип
как CHAR(40). Позже вы добавили в эту таблицу одну строку со
значением столбца PRODUCT_NAME, равным CAT_TOYS. Затем вы набрали
следующую команду: select vsize (product_name) from sales. Какой j
из следующих ниже вариантов ответа лучше других описывает возвращен-'
ный результат?
А. 8 В. 12
С 40 D. 4000
5Q. Таблица JOB состоит из трех столбцов: JOB_NAME, JOB_DESC и
JOB_WAGE. В таблицу JOB вставляется новая строка с использованием
следующей команды:
SQL> insert into job (job_name, job_desc)
2 values ('LACKEY', 'MAKES KOFFEE');
Затем вы задаете запрос к этой таблице и получаете следующие результаты:
SQL> select * from job where job_narae - 'LACKEY';
JOB NAME JOB DESC JOB WAGE
LACKEY MAKES COFFEE 35
Какой из следующих вариантов ответа правильно объясняет, каким
образом были переданы данные в значение JOBWAGE?
A. Строка таблицы JOB для значения LACKEY существовала ранее, и
значение столбца JOB_WAGE было равно 35.
B. При создании таблицы для столбца JOBWAGE была использована
фраза default, определяющая присваиваемое столбцу по умолчанию
значение.
С Во фразе values оператора insert содержится скрытое значение,
добавляемое при вставке строки.
D. Единственным возможным объяснением является следующее: после
создания таблицы и добавления к ней интересующей нас строки был
выполнен оператор update, который и добавил значение
JOB_WAGE.
51. Вы желаете уменьшить размер не-NULL столбца (то есть столбца, среди
значений которого имеются отличные от NULL), описанного как
NUMBER(IO), до NUMBER(6). Какой из следующих шагов должен быть
выполнен после выдачи соответствующей команды alter table?
A. Скопировать записи столбца во временную память.
B. Задать для всех строк столбца NUMBER значения NULL.
С Создать временную память для хранения значений данных типа
NUMBER.
D. Скопировать записи столбца из временной памяти обратно в главную
таблицу.
52. Вы задаете оператор: alter table sales drop column profit;. Какой
из следующих вариантов определяет, когда в действительности столбец
будет удален из Oracle?
A. Немедленно после выполнения этого оператора.
B. После того как будет задана команда alter table drop unused
columns.
Первый экзамен ОСА: введение в SQL
303
С После того как будет задана команда alter table set unused
column.
D. После того как будет задана команда alter table modify.
53. Вы желаете увеличить размер не-NULL столбца, описанного как
VARCHAR2(5), до VARCHAR2(10). Какой их следующих шагов следует
выполнить после выполнения соответствующей команды alter table?
A. Установить этот столбец VARCHAR2 на NULL для всех его строк.
B. Создать временную память для хранения данных VARCHAR2.
С Скопировать записи столбца из временной памяти обратно в
основную таблицу.
D. Ничего. Операция выполняется автоматически.
54. Вы хотите увеличить размер столбца PRODUCTJTYPE таблицы SALES,
объявленного как столбец VARCHAR2(5), до VARCHAR2(10). Какая из
следующих команд может оказаться для этого полезной?
A.alter table sales add (product_type varchar2 (10));
B.alter table sales modify product_type varchar2(10));
С alter table sales set unused column product_type
varchar2(10));
D. alter table sales drop column product_type;
55. В базе данных Oracle удаляется таблица, являющаяся родительской
таблицей отношения "родитель-потомок". Какой из следующих объектов не
будет удален из базы данных после удаления родительской таблицы?
A. Ассоциированные ограничения
B. Столбец-потомок
С Ассоциированные триггеры
D. Ассоциированные индексы
56. У таблицы PROFITS нашей базы данных имеется первичный ключ на базе
столбцов PRODUCT_NAME и SALE_PERIOD. Какой из следующих
операторов не может быть использован для определения этого первичного
ключа?
A.create table profits (product_name varchar2(10),
sale_period varchar2(10), profit number, constraint
pk_profits_01 primary key(product_name, sale_period));
B.alter table profits add constraint pk_profits_01 primary
key (product_name, sale_period) deferrable initially
immediate;
С alter table profits add (constraint pk_profits_01 primary
key (product_name, sale_period));
D.create table profits (product_name varchar2(10) primary
key, sale_period varchar2(10) primary key, profit
number);
57. Вы определяете ограничения проверки по списку для таблицы SALES,
состоящей из двух столбцов: PRODUCTJTYPE и UNIT_SALES. Какие из
следующих вариантов ответа являются правильными определениями
ограничения проверки по списку? (Выберите два варианта.)
A.alter table sales add constraint ck_sales_01 check
(product_type in ('TOYS', 'HOT DOGS', 'PALM PILOTS'));
304
Глава 9
В. alter table sales add constraint ck_sales_01 check
(product_type in (select product_type from
valid_products));
С alter table sales modify (product_type varchar2(30) check
(product_type in ('TOYS', 'HOT DOGS', 'PALM PILOTS')));
D.alter table sales add (product_name varchar2(30) check
(product_name 'AK-47'));
58. Используйте следующий блок кода для ответа на вопрос:
SQL> create table prices
2 ( product_name varchar2(30),
3 price number (10,4));
Table created.
SQL> alter table prices add constraint pk_prices_01
2 primary key (product_name);
Table altered.
SQL> insert into prices values ('DOGGY', 499.99);
1 row created.
SQL> alter table prices disable constraint pk_prices_01;
Table altered.
SQL> insert into prices values ('DOGGY', 499.99);
1 row created.
SQL> alter table prices enable novalidate constraint pk_prices_01;
Что произойдет после попытки выполнить этот оператор?
A. Существующие элементы проверяются на предмет нарушений,
активируется ограничение PK_PRICES_01, и Oracle немедленно
проверяет выполнение ограничений для вновь вводимых элементов.
B. Существующие элементы проверяются на предмет нарушений,
ограничение PK_PRICES_01 не активируется, и Oracle не проверяет
немедленно выполнение ограничений для вновь вводимых элементов.
С Существующие элементы не проверяются на предмет нарушений,
ограничение PK_PRICES_01 активируется, и Oracle немедленно
проверяет выполнение ограничений для вновь вводимых элементов.
D. Существующие элементы проверяются на предмет нарушений,
ограничение PK_PRICES_01 не активируется, и Oracle не проверяет
немедленно выполнение ограничений для вновь вводимых элементов.
59. Ваша попытка отменить ограничение приводит к следующей ошибке:
ORA-02297: cannot disable constraint-dependencies exist (не
удается отключить ограничения — существуют зависимости). Какой из
следующих типов ограничений, вероятно, служит препятствием для
отмены первого ограничения?
A. Проверка по списку
B. Ограничение не-NULL
С Ограничение внешнего ключа
D. Ограничение по уникальности
60. Вы собираетесь отменить ограничение не-NULL для столбца
UNIT-PRICE таблицы SALES. Какой из следующих вариантов выбора
идентифицирует правильный оператор для выполнения этого действия?
A. alter table sales modify (unit_prices null);
B. alter table sales modify (unit_prices not null);
С alter table sales add (unitjprices null);
D.alter table sales add (unit_prices not null);
Первый экзамен ОСА: введение в SQL
305
Ответы на первый комплект экзаменационных
вопросов
1. A. select NAME, JERSEY_N0 where JERSEY_N0 = 6;
Объяснение Операторы select в Oracle должны иметь фразу from. У
оператора SQL может отсутствовать фраза where; в таком случае будут
возвращены все строки таблицы. Однако, если в операторе select отсутствует фраза
from, Oracle не знает, откуда (из какой таблицы) он должен выбирать данные.
Вспомните, что в ситуациях, когда отсутствует необходимость в выборке
данных из таблицы, а вы желаете всего лишь манипулировать выражениями,
используется особая таблица DUAL. (Тема 2.1)
2. А. Задание оператора update
Объяснение Единственный вариант оператора, который не приводит к
завершению транзакции, это тот оператор, который ее продолжает, а именно
оператор update. Оператор commit указывает Oracle, что вы желаете сохранить
в базе данных сделанные изменения и завершить транзакцию. Оператор
rollback указывает Oracle отменить сделанные изменения данных и
завершить транзакцию. Закрытие SQL*Plus или любое другое завершение сеанса
обычно трактуется как неявное задание оператора commit и также завершает
транзакцию. (Тема 8.3)
3. В. commit
Объяснение Для того чтобы сохранить сделанные в Oracle изменения,
обычно используется команда commit. Команда savepoint просто означает
логическую точку прерывания транзакции, используемую для разбивки
сложных единиц работы. Команда rollback отменяет все изменения, сделанные
после выполнения последнего оператора commit. Наконец, команда set
transaction создает транзакцию базы данных Oracle в режиме "только для
чтения" (Тема 8.6)
4. D. USER_CONS_COLUMNS
Объяснение Словарное представление USER_CONS_COLUMNS
показывает все столбцы всех принадлежащих пользователю таблиц, которые
являются частью индексов, используемых для принудительного выполнения
ограничений. Вариант USERJNDEXES неверен, поскольку в этом представлении
отображается только информация о самих индексах, а не о входящих в них
столбцах. Представление USER_TAB_COLUMNS отображает все столбцы
всех таблиц, принадлежащих пользователю. Наконец, представление
USER_COLUMNS вообще не существует в базе данных Oracle. (Тема 12.2)
5. D. He-NULL
Объяснение Ограничения целостности не-NULL могут быть объявлены
только как ограничения для столбцов. Это означает, что синтаксическое
выражение для определения ограничения должно появиться сразу же за
ограничиваемым столбцом, а не в конце списка столбцов. Варианты А, В и С
определяют ограничения для всей таблицы или для столбца. (Тема 10.2)
6. D. Представление
Объяснение При удалении таблицы с опцией cascade constraints Oracle
удаляет из других таблиц все связанные с ними индексы, триггеры и
ограничения, ссылающиеся на удаляемую таблицу. Однако Oracle не удаляет
представления, использующие эту таблицу. Их необходимо удалять вручную,
используя оператор drop view. (Тема 11.2)
7. D. MONTH_BETWEEN
Объяснение Каждый из вариантов принимает в качестве входных данных
тип данных DATE и, за одним исключением, возвращает тот же тип данных.
Функция MONTH_BETWEEN возвращает целое число, указывающее, сколь-
306
Глава 9
ко месяцев проходит между двумя переданными на ее вход данными.
Количество месяцев отображается с десятичными знаками после точки, которые по
вашему желанию могут быть округлены. (Тема 3.2)
8. С order by sqrt(l);
Объяснение Содержащаяся во фразе select оператора select фраза order
by дает возможность указывать столбец, по значениям которого мы хотим
упорядочить таблицу либо по его имени, либо по его порядковому номеру в
таблице. Однако вы не можете выполнять никаких сортировок по числовым
функциям от порядкового номера столбца таблицы. Во фразе order by
допустимы оба ключевых слова: asc и desc, которые обозначают сортировку по
возрастанию (по умолчанию) или по убыванию соответственно. (Тема 2.2)
9. В. Таблица с одним столбцом и одной строкой, используемая в различных
операциях
Объяснение Таблица DUAL является особой таблицей Oracle,
используемой для удовлетворения требований фразы from операторов SQL. В ней
имеются одна строка и один столбец данных. Это не словарное представление,
скорее, это реальная таблица. Таблицу DUAX можно использовать при
арифметических действиях, когда нет необходимости выбирать реальные данные из
базы данных. Ни при каких обстоятельствах нельзя вставлять данные в
таблицу DUAL. (Тема 3.2)
10.А. ACTIVE
Объяснение Функция decode ( ) используется как оператор case, в
котором Oracle проверяет значение столбца, определенное первым параметром (в
нашем случае — ACCTNO). Если это значение равно второму параметру,
возвращается третий параметр; если это значение равно четвертому параметру,
возвращается пятый параметр и так далее. Если не находится параметра,
равного по величине значению столбца, возвращается используемое по умолчанию
значение, заданное в последнем параметре. В нашем случае это значение равно
ACTIVE. Значение TRANSFER было бы возвращено, если бы ACCTNO было
равно 590395, SEIZED - если ACCTNO было бы равно 654321, a CLOSED -
если ACCTNO было бы равно 123456. (Тема 3.2)
11. С. insert into BANK_ACCT (ACCTNO, NAME) VALUES (&VAR1, ' &VAR2');
Объяснение Для того чтобы обеспечить повторное использование
оператора путем ввода значений "на лету", следует использовать в качестве
переменных исполнительного периода так называемые лексические ссылки. Перед
этими ссылками записывается символ амперсанда (&), как это сделано в
правильном ответе. Несмотря на то, что вы можете использовать в операторах
insert вложенные подзапросы, их использование производит эффект
вставки нескольких строк за один раз, не требующий ввода данных пользователем.
(Тема 7.1)
12. В. 28-APR-07
Объяснение Для ответа на этот вопрос вам не придется серьезно
задумываться. Функция ADDMONTH добавляет число месяцев, заданное вторым
параметром, к значению заданной в первом параметре даты. Значение второго
параметра, равное в нашем случае 120, эквивалентно 10 годам, так что мы
должны прибавить 10 к году, указанному в первом параметре, в результате
чего у нас должно получиться 28-APR-07, что и является правильным ответом.
Во время сдачи экзамена постарайтесь не тратить слишком много времени на
подобные "головоломки" (Тема 3.2)
13. D. MONDAY JUNE 26, 2037:10:30PM
Объяснение Первый оператор из данного вопроса изменяет формат даты
сеанса SQL*Plus. Второй оператор возвращает текущую дату и время уже в
новом формате. В нашем случае формат даты/времени следующий: день недели,
за которым следует название месяца года и год, а также время в формате
Первый экзамен ОСА: введение в SQL
307
А.М./Р.М. (до полудня/после полудня). Поэтому правильным ответом будет
MONDAY JUNE 26, 2037: 10:30РМ. (Тема 3.2)
14. В. where А.С = 5 AND А.С = В.С ( + );
Объяснение Правильный ответ иллюстрирует использование функции
внешнего соединения Oracle. В вопросе указывается, что вы желаете видеть
данные из таблицы А вне зависимости от того, существуют соответствующие
данные в таблице В или нет. Следовательно, необходимо поместить операцию
внешнего соединения (напомним, она выглядит следующим образом: а (+))
непосредственно за ссылкой на столбец С таблицы В. Если удалить операцию
внешнего соединения, Oracle возвратит только те данные таблицы А, для
которых имеются соответствующие данные в таблице В. Если операция
внешнего соединения используется для обеих таблиц, вы получите сообщение о
синтаксической ошибке. Если же удалить оператор соединения, сравнивающий
значения таблицы А с таблицей В, Oracle возвратит декартово произведение
данных, запрошенных нами из таблицы А, со всеми данными таблицы В.
(Тема 4.2)
15. В. При создании составных первичных ключей типы данных всех
входящих в них столбцов должны быть одинаковыми.
Объяснение Не существует ограничения на тип данных, входящих в
составной ключ, которое требовало бы, чтобы все столбцы первичного ключа имели
один тип данных. Вариант А не проходит, поскольку при создании столбца вы
должны убедиться, что предназначаемые для хранения значений столбца
переменные достаточно велики по размеру. Вариант D не годится практически
по аналогичным причинам. И наконец, вариант С не проходит, поскольку
Oracle требует, чтобы столбец дочерней таблицы имел в точности тот же
самый тип данных, что и в родительской. (Тема 10.2)
16. В. Sqrt ( )
Объяснение На групповую функцию указывают все варианты ответа, кроме
функции sqrt ( ). Функция sqrt ( ) — это однострочная функция,
индивидуально действующая на каждое значение каждого столбца строки. Функция
avg ( ) обрабатывает данные многих строк столбца таблицы и вырабатывает
единственный результат: среднее значение всех обработанных строк. Функция
count ( ) обрабатывает все значения столбца (или столбцов) и подсчитывает
число строк в этом столбце (или столбцах). Функция stddev ( ) получает на
входе все значения строк столбца и вычисляет для этого набора данных сред-
неквадратическое отклонение. (Тема 5.1)
17. С. Функция nvl ( ) возвращает значение NULL, если значение первого
параметра не равно значению второго параметра.
Объяснение Единственное утверждение, не являющееся верным, состоит в
том, что функция nvl ( ) возвращает значение NULL, если значение первого
параметра не равно значению второго параметра. Функция nvl ( )
специально предназначена для того, чтобы избежать возврата значения NULL для
столбца и вместо него возвращать специально выбранное значение,
передаваемое как второй параметр функции nvl ( ) Эта функция может работать со
многими типами данных, причем оба передаваемых функции значения
должны быть одного типа. (Тема 3.3)
18. В. 418
Объяснение Как высоко вы ни оценивали бы свои знания Oracle,
единственный способ узнать, как Oracle делает что-то, — поэкспериментировать.
Три запроса к NEXTVAL из последовательности MYSEQ еще не означают,
что каждый из них увеличит значение последовательности, поскольку первый
запрос к NEXTVAL возвратит ее начальное значение. Взгляните:
SQL> create sequence myseq
2 start with 394
3 increment by 12
4 nominvalue
308
Глава 9
5 nomaxvalue
6 nocycle
7 nocache;
Sequence created.
SQL> select my_seq.nextval from dual;
NEXTVAL
394
SQL> /
NEXTVAL
406
SQL> /
NEXTVAL
418
SQL> select my_seq.currtval from dual;
CORRVAL
416
SQL> /
CURRVAL
418
SQL /
CURRVAL
416
SQL /
CURRVAL
418
Следовательно, значение последовательности было увеличено всего дважды,
так что ответ равен 418. (Тема 12.1)
19. В. Высшая точка (счетчик максимального числа строк в таблице) не была
сброшена.
Объяснение Для выполнения оператора select count (*) требуется много
времени, потому что для получения значения счетчика строк Oracle
необходимо проверить всю таблицу, даже несмотря на то, что в настоящий момент
таблица пуста. Чтобы избежать подобной ситуации для больших таблиц,
рекомендуется вместо оператора delete использовать оператор truncate. При
выполнении оператора truncate происходит сброс высшей точки таблицы,
что сокращает время, необходимое Oracle для выполнения операций select
count (*). (Тема 9.5)
SO. В. create or replace view
Объяснение Определения столбцов представления можно изменить только
в том случае, если повторно создать представление с помощью команды
create or replace view. Команда alter view используется только для
перекомпиляции представления. Оператор insert into view вообще не
является допустимым оператором Oracle. Хотя технически оператор create view
и будет работать, вы должны сначала удалить представление, которое желаете
создать повторно, а это будет уже два оператора вместо одного. Поэтому
наиболее точным из предлагаемых вариантов является вариант с create or
replace. (Тема 11.2)
81. А. Оператор соединения (join) без фразы where
Объяснение Декартовы произведения возникают в результате выполнения
операторов select, содержащих плохо сформированные фразы where.
Операции avg ( ) и sum ( ) являются групповыми функциями и не приводят к
появлению декартовых произведений. Выборка данных из таблицы DUAL также
не приводит к появлению декартовых произведений, так как в этой операции
участвует только одна таблица, причем, таблица с одним столбцом и одной
строкой! (Тема 4.1)
82. В. Создать подходящим образом файл login. sql
Первый экзамен ОСА: введение в SQL
309
Объяснение Файл login. sql убедительно свидетельствует об общих
корнях SQL*Plus и UNIX-систем. Этот файл используется для определения
установок, используемых вашим сеансом. Файл login. sql автоматически
запускается после того, как вы зарегистрируетесь в Oracle. В SQL*Plus для Windows
отсутствует меню Preferences, так что выбор А отвергается автоматически.
Кроме того, не следует использовать для этой цели варианты alter table и
alter user. (Тема 7.3)
S3.В. create or replace view emp_sal_vw as select emp_user, salary
from emp_salary where emp_user = user;
Объяснение В команде создания представления для варианта выбора В
правильно определено создание такого представления, которое позволит
каждому пользователю увидеть в базовой таблице сведения только о
собственной заработной плате. Вариант А неверен, поскольку определенное в нем
представление покажет информацию для всех пользователей, за
исключением пользователя, задавшего запрос. Варианты С и D также неверны, так как
отображают информацию для всех пользователей, за исключением
пользователя MARTHA. (Тема 11.2)
24. D. INTEGER
Объяснение Хотя в блоках PL/SQL можно объявлять переменные типа
INTEGER, данные этого типа нельзя хранить в таблицах Oracle. Все
остальные типы данных — CHAR, RAW и DATE — можно хранить в базе данных
Oracle. (Тема 9.3)
25. В. TO_CHAR
Объяснение Функция TO_CHAR используется для преобразования
значений даты (DATE), чисел и прочих форматов в текстовые строки. Операция
CONVERT используется для преобразования текстовых строк из одного
набора символов в другой. Операция TO_NUMBER используется для
преобразования последовательностей цифровых символов в настоящие числовые
значения. Функция TO_DATE используется для преобразования должным образом
отформатированной строки в значение типа DATE. (Тема 3.3)
26.С. Используя команду set, увеличить максимальный размер столбца
LONG.
Объяснение Столбец TRIGGER_BODY в представлении ALLJTRIGGERS
определен как столбец типа LONG, и, скорее всего, именно поэтому SQL*Plus
обрезает данные на выходе. Вариант А неверен, поскольку в вопросе
говорится, что мы можем видеть только часть запроса, а не полный его текст. Вариант
В неверен, поскольку выделение памяти (дисковой!) не имеет ничего общего с
заявленной в вопросе проблемой. И наконец, вариант D неверен, поскольку с
представлением ALLJTRIGGERS все в порядке. Проблема заключается в том,
как в данное время сконфигурирован SQL*Plus для показа столбцов типа
LONG. (Тема 7.2)
27. В. Все записи
Объяснение Поскольку в операторе update не содержится фразы where,
изменению будут подвергнуты все записи таблицы. Корректно обновить только
первую или только последнюю запись таблицы невозможно. Ни одна запись
таблицы не будет обновлена только в том случае, если с оператором update
что-то не в порядке, например если неправильно указаны имена столбцов.
(Тема 8.3)
28. В. alter table
Объяснение Оператор alter table позволяет вам легко добавлять
столбцы после создания таблицы, оказывая при этом минимальное воздействие на
систему. В отличие от случаев, когда вы желаете изменить представление, вы
не используете ключевое слово or replace, что сильно огорчает тех
пользователей, которые лучше знакомы с представлениями, чем с лежащими в их осно-
310
Глава 9
ве таблицами. Конечно, можно использовать для этой цели и оператор create
table, но тогда придется для удаления исходной таблицы сначала выполнить
оператор drop table. (Тема 9.4)
29. В. внешнего ключа (foreign key)
Объяснение Связь по внешнему ключу требует, чтобы вы предоставили
привилегию references для таблицы тому пользователю, который создает связь
по внешнему ключу между своей и вашей таблицами. Для создания
ограничений по уникальности (unique), проверки по списку (check) или не-NULL (not
NULL) не требуется наличия никаких других привилегий, кроме привилегии
create table.(Тема 10.2)
30. D. Представление будет успешно создано Oracle.
Объяснение Если вы зададите команду create view, показанную в
вопросе, Oracle успешно создаст представление. Можно создавать представления,
используя фразу order by, что делает неверным вариант ответа А. Не
требуется заключать в скобки оператор select, входящий в состав вашей команды
create view, как это предлагается сделать в варианте С. Наконец, вариант
ответа В неверен, потому что при создании представлений фраза with check
option не является обязательной. (Тема 11.2)
31.D. like
Объяснение В ситуациях, когда вы желаете использовать для поиска
групповые символы, Oracle предлагает оператор сравнения like. Этот оператор
позволяет отыскивать текстовые строки, похожие (like) на те, которые вы
ищете. Оператор in специфицирует набор значений, одному из которых
должно быть равно сравниваемое значение. Оператор exists позволяет
использовать подзапрос как тест достоверности поиска некоей частички
информации. Оператор between указывает диапазон сравнения, например between
1 and 5. (Тема 2.1)
32. А. Использовать для сбора данных команду define.
Объяснение При выполнении сценария в SQL*Plus можно использовать для
определения переменной и назначения ей значения команду define. Это
бывает полезно, когда вы выполняете в пакетном режиме ряд операторов SQL.
Хотя аналогичные функции способна выполнить и команда accept,
ключевым фактором, который делает этот ответ ошибочным, является упоминание в
вопросе отсутствия взаимодействия с пользователем. Будут работать и жестко
закодированные значения, но в этом случае сценарий практически перестает
быть повторно используемым. И наконец, хотя лексические ссылки,
использующие знак амперсанда (&), за которым следует метка, также обеспечат
возможность повторного использования, пользователям придется вводить
значения при обработке каждого оператора, содержащего лексические ссылки.
(Тема 7.1)
ЭЗ.А. where EMP.EMPID 39284 AND EMP.EMPID
expns.empid;
Объяснение Поскольку вы желаете получить только те данные из обеих
таблиц, для которых имеются соответствующие данные в другой таблице, вы
выполняете нормальное соединение или операцию объединения по
эквивалентности. В Oracle вы не должны использовать для этой цели оператор внешнего
соединения (+). Тем самым отбрасываются оба варианта ответа, содержащие
оператор внешнего соединения. (Тема 4.1)
34. С. 4104930504
Объяснение Единственной записью, которой не будет в базе данных после
выполнения этой серии операторов, будет запись с кодом 4104930504,
поскольку к моменту задания соответствующего оператора код UPC 402392340
отсутствовал в базе данных..Он к этому времени был уже заменен кодом
50393950, поэтому оператор, пытающийся заменить его кодом 4104930504, за-
Первый экзамен ОСА: введение в SQL
311
кончится аварийно. Чтобы получить правильный ответ, вы должны в течение
длительного времени внимательно читать этот вопрос, а это значит, что и на
экзамене вы потратите на него много времени. Помните, что, если вы не
будете внимательны, этот вопрос может отнять у вас слишком много времени.
(Тема 8.2)
35. D. Представления с объектной зависимостью от удаляемой таблицы
автоматически переводятся в недействительное состояние, но не удаляются.
Объяснение При удалении базовых таблиц Oracle не удаляет
построенных для них представлений. Вместо этого Oracle помечает их как
недействительные. Следовательно, поскольку варианты А, В и С так или иначе
подразумевают, что представление будет удалено, все эти три варианта
неверны. (Тема 11.3)
36. С. Четыре
Объяснение Общее эмпирическое правило гласит, что, если вы желаете
объединить п таблиц ( в нашем случае — четыре), вам необходимо иметь во
фразе where n— 1 операций сравнения, объединенных оператором AND (в
нашем случае — три). Кроме того, в вопросе утверждается, что вы желаете еще
сильнее ограничить возвращаемые данные по значениям из первой таблицы.
Следовательно, во фразе where должно содержаться четыре условия, и она
может выглядеть примерно таким образом:
WHERE
A.C0LUMN1 - 5 AND
A.C0LUMN1 - B.C0LUMN1 AND
B.C0LUMN2 - C.C0LUMN2 AND
C.C0LUMN3 - D.C0LUMN3
(Тема 4.1)
37. А. Аутентификация с помощью паролей и предоставление привилегий
Объяснение Хотя для получения доступа к базе данных вы должны создать
привилегии пользователей, двумя фактическими компонентами модели
безопасности Oracle являются аутентификация с помощью паролей и
предоставление привилегий. При создании пользователей они не смогут подключаться к
базе данных Oracle, пока им не будет предоставлена соответствующая
привилегия (create session), и, если даже они смогут подключиться, они
по-прежнему не смогут ничего увидеть в базе данных, пока кто-то не
предоставит им этих привилегий с помощью команды grant. (Тема 13.1)
38. С. spool
Объяснение Команда spool позволяет SQL*Plus ввести запись информации
в выходной файл, в котором будет содержаться вся информация,
наработанная транзакциями в рамках сеанса, начиная с того момента, когда была
выдана команда spool (включен режим спулинга) и был идентифицирован этот
файл, и до того момента, когда был отключен режим спулинга либо был
завершен сеанс. Команда prompt заставляет SQL*Plus подсказать пользователям,
что необходимо ввести данные с помощью специального сообщения.
Использование команды echo приведет к появлению ошибки, так как эта команда не
является допустимой командой SQL*Plus. Наконец, команда define
используется для определения и назначения значений переменных в сценариях
SQL'Plus. (Тема 1.3)
39.В. select A.STUDENT_ID, A.LOCATION, В.LOCATION from TEST_SCORE
A, TEST_SCORE В where A.STUDENT_ID =
B.STUDENT_ID AND A.LOCATION B.LOCATION AND
trunc(A.TEST_DATE)+30 >= trunc(B.TEST_DATE) AND
trunc(A.TEST_DATE)-30 <= trunc(B.TEST_DATE) ;
Объяснение Вариант В является правильным ответом, поскольку в нем
гарантируется, что экзамен сдавался одним и тем же студентом, что даты сдачи
экзамена нарушают принятое "правило 30 дней" и что места сдачи экзамена
312
Глава 9
различны. Этот вопрос, скорее всего, является самым трудным среди вопросов
экзамена. Даже если у вас имеется некоторый опыт работы с SQL, этот вопрос
потребует времени для ответа на него. Мы еще раз советуем вам при сдаче
экзамена отложить такие канительные вопросы напоследок. Лучший способ не
дать таким вопросам "съесть" все ваше время — это отказаться от него и
перейти к решению следующего вопроса, если не удалось найти ответ за 30
секунд. Наверняка, вы сможете найти некоторое время в конце экзамена, чтобы
вернуться к пропущенным вопросам. (Тема 4.3)
40.С. select * from EMPLOYEE where empid (select empid from
invoice where invoice_no 4399485);
Объяснение Общее правило: если можно использовать подзапросы,
обязательно используйте их. Подзапрос имеется только в одном варианте ответа,
так что именно он и должен быть правильным. Все остальные варианты ответа
зависят от предлагаемого EMPID и не используют номер счета. (Тема 6.2)
41. А. Для возвращения данных в отсортированном порядке
Объяснение Фраза having используется для включения в выходные данные
запроса или исключения определенных групп данных, а вовсе не для
возвращения данных в отсортированном виде. Для этой цели используется фраза
order by. (Тема 2.2)
42. D. Роли
Объяснение Роли позволяют группировать привилегии в один объект и
одновременно предоставлять все содержащиеся в этом объекте привилегии
пользователю как единое целое. С индексами не связываются никакие другие
привилегии, кроме привилегий доступа к ассоциированным таблицам. И
таблицы, и последовательности требуют, чтобы пользователю или роли были
предоставлены привилегии; они никоим образом не упрощают действия по
управлению привилегиями. (Тема 13.2)
43. A. alter user
Объяснение Оператор alter user с фразой identified by используется
для изменения пароля пользователя. Оператор alter role используется для
модификации действующего объекта роли и влияет на пользователей только в
том случае, если ему была предоставлена эта роль. Что касается остальных
предложенных вариантов, то, хотя пользователь SNOW, вероятно, сможет
выполнить некоторые из них (это зависит от имеющихся у него привилегий), ни
один из вариантов не поможет ему выполнить поставленную задачу, то есть
изменить пароль. (Тема 13.1)
44. С. Пользователю SNOW требуется синоним для таблицы ЕМР.
Объяснение Пользователю SNOW требуется синоним, чтобы ссылаться на
таблицу, которой он не владеет, не указывая при этом имени владельца схемы
в качестве префикса. Не обладая привилегиями, SNOW вообще не увидел бы
этих данных, но даже если ему будут предоставлены соответствующие
привилегии, ему все равно придется использовать перед именем таблицы префикс,
содержащий информацию об имени схемы, если в этой схеме отсутствуют
синонимы для таблицы. Если синонимы отсутствуют, SNOW будет вынужден
писать перед именем таблицы ЕМР префикс REED, то есть следующим
образом: REED.ЕМР. У таблиц в отличие от баз данных пароли отсутствуют, так
что совершенно очевидно, что этот выбор ошибочен. (Тема 12.3)
45. D. Oracle возвратит сообщение об ошибке.
Объяснение В этой ситуации в подзапросе нельзя использовать фразу
order by. Oracle возвратит сообщение об ошибке. Следовательно, никакие
данные не будут возвращены из какой бы то ни было таблицы, так что все
остальные варианты ошибочны. (Тема 6.4)
Первый экзамен ОСА: введение в SQL
313
46. В. select to_char(nvl(sqrt(59483), 0)) from dual;
Объяснение Оператор select to_char(nvl (sqrt (59483) , 0)) from dual;
является допустимым оператором. Оператор select nvl (sqrt (59483)) from
dual; не передает в функцию nvl ( ) достаточного числа параметров. В
операторе select to_char (nvl(sqrt(59483), 'VALID')) from dual; нарушено
то правило, что оба параметра функции nvl ( ) должны быть одного типа.
В операторе select (to_char (nvl (sqrt (59483), '0')) from dual;
пропущена закрывающая скобка после '0'. (Тема 1.2)
47. С. column PLAY_TABLE heading "My Plays and Authors"
Объяснение В SQL*Plus фраза heading команды column играет ту же роль,
что и псевдоним column в SQL: она модифицирует выходные данные запроса,
чтобы в них использовался спроектированный вами заголовок столбца.
Несмотря на их сходство, фраза heading совсем не то же самое, что псевдоним в
SQL. Следовательно, варианты, использующие фразу alias и ключевое слово
as, являются неверными. Точно так же следует отказаться и от варианта,
использующего фразу format. (Тема 1.3)
4в. С. BABS
Объяснение Поскольку пользователь BABS не был перечислен в
содержимом таблицы MY_USERS, JONES не сможет увидеть BABS при выполнении
запроса к представлению. Варианты А, В и D определяют пользователей,
которые были перечислены в представлении MY_USERS, и, следовательно,
JONES сможет их увидеть, когда он выполнит запрос к BASEBALL_
TEAM_VW. (Тема 11.3)
49. С. Использовать оператор set long.
Объяснение Команда set long используется для согласования выходных
данных SQL*Plus, созданных для словарных представлений с длинными
столбцами. Представление, содержащее программный код для создания
представления, имеет в своем составе длинный столбец, так что урегулирование
того, как SQL*Plus отображает эту информацию, должно решить эту
проблему. Выбор А некорректен, поскольку невозможно изменить размер словарного
представления. Вариант D неверен, так как оператор alter user никоим
образом не изменяет распределения памяти для представления. Наконец, NLS_
DATE_FORMAT управляет форматированием дат, а вовсе не длинных
столбцов. (Тема 1.3)
50. D. group by COW_NAME;
Объяснение Когда фраза column содержит смесь групповых и негрупповых
выражений, все негрупповые выражения должны быть перечислены слева от
групповых выражении (то есть перед ними). Кроме того, все негрупповые
выражения, упомянутые во фразе column, должны быть перечислены и во фразе
group by. В противном случае Oracle возвратит сообщение об ошибке,
указывающее на проблему с выражением group by, что делает вариант D
правильным ответом. (Тема 5.3)
51.D. group by COW_NAME;
Объяснение Функция mod ( ) не является групповой функцией, так что в
этом запросе не требуется наличия фразы group by. Следовательно,
корректным ответом является вариант D. (Тема 5.3)
5S.B. select A.LASTNAME, B.DEPT_NO from EMP A, (select EMPID,
DEPT_NO from DEPT) В where A.EMPID = B.EMPID;
Объяснение Встроенным представлением называется подзапрос,
появляющийся во фразе table главного SQL-запроса. Поскольку вариант В
является единственным запросом, где подзапрос содержится во фразе from, он
является единственным вариантом, содержащим встроенное представление,
и единственным правильным ответом. Варианты А и С неверны, потому что
подзапросы использованы в них во фразе where. Вариант D неверен, потому
314
Глава 9
что подзапрос, имеющийся во фразе column, на самом деле представляет
собой статическую текстовую строку, которая будет включена в выходные
данные столько раз, сколько строк имеется в представлении USER_TABLES.
(Тема 11.5)
53. A. drop index
Объяснение Индекс, ассоциированный с ограничением, нельзя удалить с
помощью команды drop index. Следовательно, вариант А является
единственным правильным ответом. Все остальные операторы указывают на методы,
которые могут быть использованы для удаления индексов, ассоциированных с
ограничениями. Ограничения могут быть удалены вместе с таблицей или
явно. (Тема 12.2)
54. С. Каждое значение первичного ключа должно быть уникальным, и ни
одно из них не может быть пустым (NULL).
Объяснение Вариант С является единственным ответом, в котором
инкапсулированы все ограничения на данные для столбцов первичного ключа,
поэтому он и является единственным правильным ответом. Хотя в каждом из
вариантов А и В идентифицируются некоторые дополнительные ограничения на
хранящиеся в столбце первичного ключа данные, ни один из этих вариантов
не является правильным ответом. Вариант D вообще не идентифицирует
никаких ограничений на данные из первичного ключа, так что от этого варианта
можно отказаться сразу же. (Тема 10.1)
55. С. У таблицы FOOBAR нет первичного ключа и поэтому нет индекса по
столбцу МОО.
Объяснение Поскольку при создании таблицы FOOBAR не был определен
первичный ключ, последующие запросы к этой таблице не могут использовать
для ускорения доступа к данным этой таблицы никаких уникальных индексов
по столбцу МОО. Следовательно, правильным является ответ С. Вариант А
неверен, так как у нас нет информации, подтверждающей наличие первичного
ключа, вариант В неверен, потому что ничто не подтверждает предположения
о том, что запросы к таблицам выполняются дольше, чем к представлениям,
скорее, уж, верно обратное утверждение. Наконец, вариант D ошибочен,
потому что у нас нет информации, указывающей на удаление и последующее
восстановление таблицы. (Тема 10.1)
56. D. USERJNDEXES — индексы с тем же именем, что и у ограничения
Объяснение Объектом, ассоциированным с таблицей и с первичным
ключом, является индекс, а в словарном представлении USER_INDEXES
содержится список всех индексов, которыми владеет текущий пользователь. Можно
сделать запрос к этому представлению, чтобы найти индексы с тем же именем,
что и у ограничения, идентифицированного в тексте вопроса, что делает
вариант D правильным ответом. Вариант А неверен, потому что в представлении
USERSEQUENCES содержится информация о последовательностях, о
которых не идет речь в нашем вопросе. В представлении USERTABLES
содержится информация о таблицах, что тоже не совпадает с предметом нашего
вопроса. Поэтому ошибочен и вариант В. Наконец, в представлении USER_
IND_COLUMNS содержится информация об индексированных столбцах,
которые не являются отдельными от таблицы или ограничения объектами, что
делает неверным и вариант С. В последнее время Oracle отменил на этом
экзамене вопросы о словарных представлениях, так что, если вы знаете
правильный ответ, считайте это своим бонусом. (Тема 12.2)
57. В. Повышение производительности столбцов с малым числом уникальных
значений
Объяснение Битовые индексы были спроектированы для повышения
производительности столбцов с малым числом уникальных значений.
Традиционные, или бинарные, индексы разрабатывались для столбцов с большим
числом уникальных значений (или для полностью уникальных столбцов),
Первый экзамен ОСА: введение в SQL
315
что сразу отсекает варианты А и С. Последовательностям не требуются
индексы, в результате чего можно считать неверным и ответ D. Вопросы
относительно битовых индексов могут появиться, а могут и не появиться на
экзамене на ОСР, так что если вы знаете правильный ответ, то считайте это
своим бонусом. (Тема 12.2)
58. A. update employee set salary = 5000 where empid = 59694;
Объяснение Вариант А правильно идентифицирует оператор, который
соответствует всем заявленным в вопросе требованиям, как следует изменить
информацию о заработной плате для служащего с номером 59694. Вариант В
неверен, так как предложенный оператор update изменяет значение столбца
EMPID, а не SALARY. Вариант С также не годится, так как в нем изменяется
содержимое столбца LASTNAME, а не SALARY. Наконец, вариант D не
проходит, так как хотя в нем и изменяется значение столбца SALARY, но
делается это на основании информации из столбца LASTNAME, а не из EMPID.
(Тема 8.3)
59. С. grant update on emp to timothy with grant option;
Объяснение Оператор из варианта С используется для передачи объектных
привилегий другим пользователям вместе с возможностью их последующей
передачи третьим лицам. Вариант D ошибочен, поскольку фраза with admin
option используется для предоставления административных возможностей
другим пользователям. Вариант А является неправильно сформулированной
командой grant для объектных привилегий, что делает этот ответ неверным.
Вариант В неверен по той причине, что, хотя привилегия была передана
TIMOTHY, административные возможности при этом переданы не были.
(Тема 13.3)
60. D. Только REED и SNOW
Объяснение SNOW не потеряет возможности создавать сеансы с Oracle
только потому, что REED отозвал привилегию у пользователя MANN,
поскольку для системных привилегий в Oracle отсутствует опция каскадного
отзыва. Таким образом, REED по-прежнему имеет эту привилегию, поскольку
никто не отозвал у него ее, a SNOW продолжает иметь привилегию, поскольку
в Oracle отсутствует каскадный отзыв. (Тема 13.1)
Ответы на второй комплект экзаменационных
вопросов
1. D. where C.COW_NAME 'BESS' AND C.CARTON_NUM
ci.carton_num;
Объяснение В фразе where должны быть два компонента — фраза join и
нечто, отбирающее из таблицы COW_MILK записи только для коровы по
кличке BESS. Поэтому правильным ответом будет where C.COW_NAME
' bess ' and с. carton_num = ci. carton_num,\ Еще один ответ очень похож
на этот, но так как в нем для получения информации только для BESS
используется фраза со знаком неравенства (<>), этот вариант нам не подходит.
Остальные варианты являются неполными и поэтому ошибочны. (Тема 2.1)
2. D. В операторе insert содержатся дублирующие данные, так как
повторяются значения созданной заново последовательности.
Объяснение Правильный ответ заключается в том, что в операторе insert
содержатся дублирующие данные, так как повторяются значения созданной
заново последовательности. Когда вы сбрасываете последовательность и
создаете ее заново с помощью ее первоначального кода, вы восстанавливаете
исходное значение последовательности. Последующие операторы insert
затем пытаются добавить в таблицу строки, в которых значения первичных
ключей будут дублировать уже имеющуюся в таблице информацию. В вопросе не
316
Глава 9
содержится информации относительно статуса "только для чтения", поэтому
ответ, в котором ссылаются на статус таблицы, неверен. При удалении
последовательности с первичным ключом таблицы ничего не происходит — между
ними не существует никаких зависимостей. И наконец, хотя справедливо
утверждение, что все ее значения, находившиеся в момент удаления
последовательности в кэше, остаются неиспользованными, этот вопрос не имеет
никакого отношения к рассматриваемому нами вопросу. (Тема 12.1)
3. В. exists
Объяснение Коррелированный подзапрос необходимо использовать только
в тех случаях, когда используется оператор exists. Хотя подзапрос можно
использовать и вместе с in, это требование не является обязательным, так как
вместо подзапроса может быть использован просто набор значений. Ключевое
слово between означает выборку из диапазона значений и не требует
использования подзапроса. Ключевое слово like используется для сравнений с
применением групповых символов, и в нем также не требуется использовать
подзапрос. (Тема 2.1)
4. D. abs ( )
Объяснение Все функции, за исключением abs ( ), дадут вам результат
4093, если им на вход будет передано значение 4093.505. Функция abs ( )
возвращает абсолютное значение (модуль) переданного ей на вход числа.
Функция round ( ) может возвратить значение 4093, если во втором ее
параметре указать требующуюся точность округления. Функция trunc ( ) вернет
4093, не требуя второго аргумента. Функция floor ( ) даст вам результат
4093, так как она является логической противоположностью функции ceil ( ).
(Тема 3.2)
5. В. Использовать accept для получения значения имени перед каждым
прогоном.
Объяснение Наилучшим вариантом в этой ситуации является команда
accept. Хотя для назначения значений переменной можно применить команду
define, которая будет затем использоваться в сценарии, только accept
позволяет динамически вводить значения таких переменных. Лексические
подстановки, определяемые с помощью символа &, будут действовать только для
текущего оператора; это значит, что значение, присвоенное в одном операторе,
нельзя будет использовать в последующих, пока вы повторно не зададите его.
(Тема 7.3)
6. В. truncate
Объяснение После завершения операции truncate обратного хода нет —
изменения сделаны и зафиксированы. Это связано с тем, что операция
truncate не является операцией DML, выполняемой как часть транзакции.
Команда truncate является операцией DDL, и поэтому с ней связана
неявная (подразумеваемая) команда commit, выполняемая сразу же по ее
завершении. Если вы захотите после усечения таблицы вернуть данные назад, вам
понадобится восстанавливать их. Что касается других перечисленных в качестве
ответов на поставленный вопрос вариантов операций — insert, update и
delete — Oracle позволяет отказаться от сделанных в них изменений,
используя команду rollback. (Тема 9.5)
7. A. savepoint
Объяснение Операции savepoint просто играют роль логических
контрольных точек транзакции. Они не побуждают Oracle сохранять данные или
отказываться от внесенных изменений, но просто играют роль тех отметок, до
которых впоследствии можно будет выполнить частичный откат транзакции.
Команды set transaction и commit означают начало новой транзакции.
Создание нового сеанса связи с Oracle неявно означает начало новой
транзакции. (Тема 8.6)
Первый экзамен ОСА: введение в SQL
317
8. В. Фраза from
Объяснение Не может быть оператора SQL без фразы from. Именно по
этой причине Oracle предлагает пользователям таблицу DUAL, чтобы можно
было выполнять арифметические операции над выражениями, а не над
данными из таблиц и чтобы при этом не нарушались синтаксические
конструкции. Поскольку в приведенном операторе уже имеется фраза select, ее не
требуется добавлять. Фраза where является необязательной, но поскольку она
уже имеется в операторе, не нужно добавлять еще одну. И наконец, нашему
оператору не требуется фраза order by. (Тема 1.2)
9. A. set transaction
Объяснение Команда set transaction используется для определения
статуса транзакции "только для чтения" (read-only). Операторы rollback и
commit используются для завершения транзакции. Команда savepoint
обозначает логические контрольные точки транзакции. (Тема 8.6)
10. С. Битовый индекс
Объяснение Битовые индексы хорошо работают в ситуациях, когда данные
столбца статичны. В нашем случае в столбце содержится информация о поле
служащего, которая изменяется очень редко. К тому же у этого столбца
имеется всего два возможных значения. Следовательно, он является плохим
кандидатом для применения бинарных индексов любого рода, но великолепно
подходит для битовых индексов. Помните, что бинарные индексы хорошо
работают со столбцами с высоким значением кардинальности (или с большим
числом различных значений относительно общего числа элементов столбца).
(Тема 12.2)
11. А. Родительская таблица с дочерней
Объяснение В вопросе описывается отношение между таблицами INVOICE
и INVOICE_ITEM, а подходящим ответом будет отношение типа
"родитель-потомок". Это связано с тем, что описываемая связь между счетами и
элементами счетов является необязательной. Это означает, что у счетов может
не быть элементов, но все элементы счетов обязательно должны иметь
соответствующий счет. (Тема 10.2)
12. D. ACTIVE
Объяснение Функция decode ( ) играет роль оператора case. Первый
параметр указывает на столбец, значения которого мы хотели бы декодировать.
Если значение столбца равно параметру 2, функция возвращает значение
параметра 3. Если значение столбца равно параметру 4, функция возвращает
значение параметра 5 и так далее. Если значение столбца не равно ни одному
из заданных параметров, функция decode ( ) возвращает значение
последнего заданного параметра. Поэтому с учетом того, что среди параметров
функции decode ( ) не удалось отыскать значение столбца, возвращенное
значение будет равно значению по умолчанию — active. (Тема 3.2)
13. D. where COL_A in (select NUM from TAB_OF_NUMS)
Объяснение Фраза where в варианте D является великолепным примером
определения подзапроса, являющегося ответом на поставленный вопрос.
Вариант А не является операцией сравнения значения столбца с набором
значений, так как сравнение ведется только с одним значением. В варианте В
значения столбца сравниваются с набором значений, но этот набор статичен
и определяется во время формулирования запроса. Вариант С представляет
собой операцию сравнения по диапазону (один из подвариантов варианта В)
и поэтому также ошибочен. Только вариант D позволяет динамически
генерировать список значений, с которым будет сравниваться столбец COL_A.
(Тема 6.2)
318
Глава 9
14.D. select NAME from CONTESTANT where COUNTRY in
(select COUNTRY from MEDALS where NUM_GOLD +
NUM_SILVER + NUM_BRONZE > 10)
Объяснение Запрос в варианте D корректен, потому что он содержит
подзапрос, корректно возвращающий подмножество стран, имеющих участников
соревнований, завоевавших десять или более медалей любого достоинства.
Выбор А некорректен, потому что содержит операцию соединения, а не
подзапрос. Вариант В представляет собой просто переписанный вариант запроса А,
где использован многострочный подзапрос; однако он не заходит настолько
далеко, чтобы ограничить отбираемые данные, и поэтому некорректен.
Вариант С является однострочным подзапросом, выполняющим в основном те же
действия, что и вариант В, и поэтому тоже некорректен. (Тема 6.4)
15. С. Многостолбцовый подзапрос, самый молодой участник из всех стран
Объяснение Поскольку главный запрос сравнивает результаты из двух
столбцов, возвращенных подзапросом, он является многостолбцовым
подзапросом, возвращающим фамилию самого молодого участника соревнований
из каждой страны. Этот многостолбцовый подзапрос является в то же время и
многострочным подзапросом, но так как определяющим фактором является
наличие двух столбцов, мы должны главное внимание уделить именно этому
факту, а не тому, что возвращается несколько строк. Именно благодаря этому
становится возможным отбросить варианты А и В, хотя подзапрос и
возвращает несколько строк. Кроме того, следует обратить внимание на тот факт, что в
главном запросе должна использоваться фраза in, а не знак равенства (=), что
позволяет отбросить и вариант D. (Тема 6.3)
16. A. SOO
Объяснение Правильным ответом является SOO, потому что
специфицированные во фразе in действия подзапроса неявно игнорируют значения NULL.
Следовательно, так как для участника SOO страна не была определена, эта
строка не будет отобрана как часть подзапроса. В результате участник SOO не
будет перечислен в выходных данных как самый молодой из участников.
(Тема 6.4)
17. В. Таблица
Объяснение Упоминаемый объект называется таблицей. У таблицы имеется
много столбцов, каждый из которых функционально зависим от ключевого
столбца. Вариант В неверен, так как синоним — это просто другое имя,
которым можно пользоваться при ссылке на таблицу, а не сама таблица.
Последовательностью в Oracle называется генератор чисел, для которого совершенно
не требуется хранить данные в других сегментах, кроме словарных, так что
неверен и вариант ответа С. Наконец, представление похоже на таблицу тем, что
также имеет много столбцов, каждый из которых функционально зависим от
ключевого столбца. Однако в представлении не содержатся данные, так что
отпадает необходимость хранить их в сегментах. Поэтому неверен и ответ D.
(Тема 9.1)
18. В. cube
Объяснение Ключевое слово cube, включенное во фразу group by
оператора SQL в Oracle8/, позволяет выполнять JV-мерную кросс-табуляцию в базах
данных Oracle, непосредственно возвращая результирующий набор клиенту.
Это ключевое слово полезно в запросах к хранилищам данных. Вариант ответа
С неверен, так как, хотя ключевое слово rollup также можно добавлять к
запросам SQL в Oracle8i, это ключевое слово поддерживает вычисление
промежуточных и общих сумм для группированных данных. Хотя возможно
использование в групповых операциях выражения having, вариант А все-таки
неверен, так как для использования операции cube или rollup фраза having
не требуется. Наконец, вариант D также неверен, поскольку функция trim ( )
объединяет возможности функций ltrim ( ) и rtrim( ). (Тема 5.3)
Первый экзамен ОСА: введение в SQL
319
19. В. Индексы с инвертированными ключами
Объяснение Индексами с инвертированными ключами называются такие
индексы, в которых содержимое индексируемого столбца инвертировано (то
есть записано справа налево). Это позволяет обеспечить более высокую
начальную селективность (избирательность), чем это мог бы сделать прямой
бинарный индекс, поскольку кардинальность корневого узла бинарного дерева
прямого индекса была бы низкой. Базируется это заключение на имеющемся в
вопросе указании, что большинство записей начинается с цифры 1 (вернитесь к
тексту вопроса, если вам непонятно, о чем идет речь). В то же время
инвертированный индекс будет иметь более высокую кардинальность. Остерегайтесь
выбрать вариант А, так как, хотя кардинальность индекса в целом будет
достаточно высока, выбор В обеспечивает более высокую производительность. Вариант
С неверен, поскольку битовые индексы были спроектированы специально для
записей с низкой кардинальностью, типа статуса или пола служащих. Наконец,
вариант D указывает на тип индекса, который не подходит к этой ситуации.
(Тема 12.2)
20. A. VARCHAR2
Объяснение Поскольку блоки текстовых данных укладываются в границы,
отведенные Oracle8i для типа данных VARCHAR2, то для простоты для
скалярных данных лучше использовать именно этот тип данных, а не большие
o6beKTbi(LARGE OBJECTS). Если бы размер блоков данных превышал 4000
байт, тогда лучше было бы использовать CLOB, но поскольку это требование
не выполняется, выбор С будет ошибочным. Тип данных BLOB следует
использовать для хранения больших двоичных объектов, что делает ошибочным
вариант В. Наконец, как сказано в тексте вопроса, текстовые блоки должны
храниться в Oracle, а не во внешнем файле (это прямое указание на
невозможность использования типа данных BFILE), что делает ошибочным и вариант
ответа D. (Тема 9.3)
21. В. Индекс удаляется.
Объяснение Подобно автоматически генерируемым индексам, связанным с
первичными ключами таблиц, создаваемые вручную для повышения
производительности запросов к таблице индексы также будут удалены при удалении
таблицы. Поэтому варианты ответов А, С и D неверны. (Тема 12.2)
22. С. Столбцы с высокой кардинальностью хорошо управляются бинарными
индексами.
Объяснение Столбцы с низкой кардинальностью являются бичом для
бинарных индексов, что сразу отбрасывает вариант А. Далее, битовые индексы
используются в первую очередь для получения выигрыша в
производительности для столбцов с низкой кардинальностью, а это исключает вариант В.
(Тема 12.2)
23. D. Удалить и заново создать представление, указав в нем большее
количество выбираемых столбцов.
Объяснение Вариант А неверен, поскольку при добавлении столбцов в
базовую таблицу столбцы к представлению не добавляются; более того,
добавление столбцов, вероятно, приведет к тому, что представление станет
недействительным. Вариант В является неверным, потому что оператор alter view
просто перекомпилирует имеющееся определение представления, в то время
как для решения поставленной перед нами задачи требуется изменить
действующее определение представления. Вариант С не подходит потому, что
применение коррелированного подзапроса, вероятно, ухудшит
производительность. Это еще раз подчеркивает реально стоящую перед нами проблему —
добавить столбец к представлению. (Тема 11.2)
24. С. maxvalue
Объяснение Опция maxvalue является допустимой опцией при создании
последовательностей. Варианты А и В являются частями оператора create user,
320
Глава 9
в то время как вариант D является частью определения ограничения в
операторах alter table или create table. (Тема 12.1)
25. F. В этом операторе не содержится ошибок.
Объяснение Хотя включение фразы with check option и является
неуместным, если учесть, что для сложных представлений операции insert
запрещены, при компиляции этого оператора не будет сгенерировано никаких
ошибок. Следовательно, ошибки в представлении отсутствуют. Это невозможно
выучить. Для этого нужно своими руками поработать с Oracle. (Тема 11.4)
26. A. references
Объяснение Привилегия references дает пользователю возможность
сделать обратную ссылку на вашу таблицу, чтобы посредством внешнего ключа
связаться с ней из своей таблицы. Вариант В неверен, поскольку привилегия
index позволяет пользователю создать для таблицы индекс. Вариант С
неверен, поскольку привилегия select позволяет ему делать запросы к таблице. И
наконец, вариант D не проходит потому, что привилегия delete всего лишь
позволяет вставлять в таблицу данные. (Тема 13.3)
27. А, В и С. Роли могут быть предоставлены другим ролям, привилегии могут
быть предоставлены ролям, а роли могут быть предоставлены
пользователям.
Объяснение Единственным вариантом, непригодным для управления
ролями, является вариант D. Роли не могут быть назначены синонимам.
(Тема 13.2)
28. С. Станет равным значению NEXTVAL.
Объяснение При каждой ссылке на псевдостолбец NEXTVAL
последовательность наращивает существующее целое число (CURRVAL) и делает его
равным значению NEXTVAL. (Тема 12.1)
29. D. with check option
Объяснение Подходящей является фраза with check option. Эту фразу
можно включить в оператор create view, чтобы представление не позволяло
добавлять в базовую таблицу строки, которые впоследствии нельзя будет
отобрать в представление. Фразы with admin option и with grant option
используются для назначения пользователям административных возможностей,
а также для предоставления им привилегий. А фраза with security option
вообще является фикцией, поскольку такой фразы в Oracle просто не
существует. (Тема 11.4)
30. С. Оператор закончится аварийно из-за нарушения ограничения
первичного ключа.
Объяснение Совершенно очевидно, что оператор завершится аварийно.
Причина аварийного завершения оператора кроется в ограничении
первичного ключа для столбца UPC_CODE. Как только вы попытаетесь добавить
дублирующую запись, таблица отвергнет такую добавку. А вот фраза with check
option, хотя она и специфицирована, приведет к аварийному завершению
оператора insert в тех случаях, когда вы попытаетесь добавить запись для
любой даты, кроме сегодняшней. (Тема 10.2)
31. A. drop view
Объяснение При удалении таблицы Oracle удаляет и все связанные с
таблицей объекты, например триггеры, ограничения и индексы, кроме
представлений. Представления же рассматриваются как отдельные объекты, и, хотя
представления не могут нормально функционировать после удаления базовой
таблицы, после удаления таблицы Oracle сохраняет представление "под
рукой". (Тема 11.2)
32.С. Оператор select получит от Oracle сообщение об ошибке NO ROWS
SELECTED.
Первый экзамен ОСА: введение в SQL
321
Объяснение Хотя запрос будет успешным (поясним: вы не получите
сообщения об ошибке), вы должны побороть в себе желание выбрать вариант
ответа В. Вариант С является лучшим ответом, потому что он более точно
идентифицирует, что в действительности произойдет при задании подобного
оператора. Oracle будет вести себя так же, как и для любого оператора select,
в котором вы задали во фразе where такие критерии поиска, которым не
соответствуют данные: возвратит сообщение no rows selected. Это нельзя
считать ошибочным состоянием, но в то же время нельзя назвать и успешным
поиском данных. Следовательно, варианты ответа А и В ошибочны. И наконец,
оператор select никогда не добавляет в таблицу данные. (Тема 1.2)
33. В и D. Ограничения по уникальности и первичные ключи
Объяснение Каждое вводящее уникальность ограничение создает индекс
для помощи при выполнении этого процесса. Два ограничения целостности,
принудительно вводящие уникальность, — это ограничения по уникальности
и первичные ключи. (Тема 10.2)
34. С. ALL_IND_COLUMNS
Объяснение Это представление является единственным из перечисленных,
в котором имеется информация о положении столбцов в индексе. Поскольку
для первичного ключа всегда создается индекс, в этом представлении будет
содержаться и информация об индексе для первичного ключа. Вариант А
ошибочен, потому что в Oracle отсутствует представление
ALL_PRIMARY_KEYS. Вариант В ошибочен потому, что, хотя в
представлении USER_CONSTRAINTS и содержится информация об ограничениях
базы данных, в нем отсутствует информация об индексах, создаваемых для
первичного ключа. Вариант D отпадает, так как в представлении
ALL_TABLES не содержится информация, связанная с положением столбца
в индексе. (Тема 12.2)
35.С. В схеме ANJU будет создана таблица ANIMALS с теми же данными, что
и в таблице ANIMALS, которой владеет MASTER.
Объяснение Вопрос требует пристального рассмотрения использованного
оператора create table и кое-каких знаний о создании таблиц. Во-первых,
таблица всегда создается в схеме создающего ее пользователя. Во-вторых,
поскольку использована фраза create table as select, варианты В и D
автоматически становятся некорректными, потому что оба они
идентифицируют создаваемую таблицу как нечто отличное от таблицы ANIMALS. Вариант
А идентифицирует схему, в которой будет создана таблица ANIMALS как
MASTER, что также некорректно по уже приводившимся причинам.
(Тема 9.2)
36.А. insert into EMPLOYEE values (59694, 'HARRIS',
NULL);
Объяснение Этот вариант является приемлемым, потому что во фразе values
соблюдены требования позиционного критерия, в соответствии чс которыми
не требуется специфицировать порядок столбцов. Один из способов, как
можно не задать значение для конкретного столбца, — вставить для него значение
NULL. Вариант В некорректен, потому что в нем определены значения не для
всех столбцов таблицы. Когда мы используем для заполнения столбцов
данными позиционный метод, мы обязаны указать значения для всех столбцов
таблицы. В противном случае должны быть явно названы все заполняемые
данными столбцы. Вариант С некорректен, потому что, если мы упоминаем
имя столбца во фразе insert into, во фразе values для него обязательно
должно быть задано значение. Вариант D некорректен, потому что
использование в подобных ситуациях многострочного варианта оператора insert с
оператором select недопустимо. (Тема 8.2)
37.А. Эти две таблицы базы данных называются VOUCHER и VOUCHER_
ITEM соответственно.
322
Глава 9
Объяснение Этот вариант подразумевает использование соглашения об
именовании, аналогичного обсуждавшемуся ранее, в котором таблицам,
связанным соотношением внешнего ключа, присваиваются схожие имена. И хотя
нет гарантии, что эти таблицы связаны, именно этот случай обеспечивает
самую высокую вероятность такой связи. Вариант В подразумевает
использование того же самого соглашения об именовании, но поскольку имена двух
таблиц непохожи друг на друга, вероятность того, что они связаны хоть каким бы
то ни было образом, невелика. Вариант С некорректен, потому что дата
создания таблицы не имеет абсолютно никакого отношения к той функции,
которую эта таблица выполняет в базе данных. Вариант D некорректен, поскольку
две таблицы не могут быть связаны, если у них не имеется общих столбцов.
(Тема 10.1)
38. А, В и D. CHAR, VARCHAR2 и NUMBER
Объяснение Единственным недопустимым типом данных в приведенном
списке является BOOLEAN. Хотя BOOLEAN является допустимым типом
данных в PL/SQL, в базе данных Oracle такой тип данных отсутствует.
Следовательно, нельзя создать столбец таблицъцкоторый использовал бы данные
этого типа. (Тема 9.3) ^^
39. D. Оператор delete удалит из таблицы все записи.
Объяснение Пропуск фразы where может дать только один эффект —
запрашиваемая операция (удаление) будет выполнена для всех строк таблицы.
(Тема 8.4)
40. С. GOOD_NAME VARCHAR2(20) check (G00D_NAME in
(select NAME from AVAIL_G00DS)),
Объяснение Ограничение проверки по списку не может содержать ссылки
на другую таблицу, а также не может ссылаться на виртуальный столбец типа
ROWID или SYSDATE. Все остальные строки оператора create table
синтаксически верны. (Тема 10.2)
41. A. Locks
Объяснение Блокировкой называется механизм, не позволяющий
нескольким пользователям одновременно выполнять изменения базы данных. Все
другие варианты ответа описывают команды, обозначающие начало, середину
и конец транзакции. Помните, что ключевые слова commit и rollback
заканчивают текущую транзакцию и начинают следующую, в то время как
ключевое слово savepoint отмечает логическую контрольную точку в транзакции.
(Тема 8.6)
42. А. Используйте оператор alter table.
Объяснение Оператор alter table — это единственный из предлагаемых
вариантов, позволяющий увеличить число столбцов таблицы. Вариант В
некорректен, поскольку установка значений всех строк столбца в NULL делает
только это (установку) и ничего больше. Вариант С некорректен, так как
расширение смежных столбцов всего лишь увеличивает их размер. Вариант D
некорректен, потому что перечисленные в нем шаги показывают, как добавить
столбец с ограничением не-NULL, а это совершенно не то, о чем говорится в
вопросе. (Тема 9.4)
43. В. Произвести усечение таблицы.
Объяснение Варианты А и С могут работать, но апгрейд аппаратных средств
и программного обеспечения, конечно, стоит намного больше, чем усечение
таблицы. Вариант D отчасти корректен, потому что изменение указателя
высшей точки — это именно то, что нам нужно. Однако такое изменение только
сбросит указатель высшей точки, а не устранит его полностью, поэтому мы
используем команду truncate table. (Тема 9.5)
44. А. По уникальности
Первый экзамен ОСА: введение в SQL
323
Объяснение Только ограничения по уникальности и ограничения
первичного ключа требуют от Oracle генерировать индексы для поддержания
обязательной уникальности значений столбца. Ограничения внешнего ключа,
проверки по списку и не-null не требуют для своей работы наличия индексов.
(Тема 10.1)
45.В. Все значения ссылочного столбца родительской таблицы должны
присутствовать в осуществляющем ссылку столбце дочерней таблицы.
Объяснение Ссылочная целостность направлена от дочерней таблицы к
родительской, а не наоборот. В родительской таблице может иметься много
значений, которые не представлены в записях дочерней таблицы, но запись
дочерней таблицы обязательно должна соответствовать одной из записей
родительской таблицы. Поэтому правильным ответом в нашем случае будет
следующий: все значения ссылочного столбца родительской таблицы должны
присутствовать в осуществляющем ссылку столбце дочерней таблицы.
(Тема 10.1)
46. В. Значения должны быть частью фиксированного набора, определенного
в операторе create table или alter table.
Объяснение Ограничения проверки по списку могут использовать только
фиксированные выражения, определенные вами при создании или изменении
таблицы с помощью определения ограничений. Не разрешается использовать
зарезервированные слова типа SYSDATE и USER, а также значения из
поисковой таблицы, что делает применяющие их варианты некорректными. И
наконец, значения NULL в столбце ограничиваются с помощью ограничений
не-NULL, относительно несложной формы ограничений проверки по списку.
(Тема 10.1)
47. Ь. sqrt (
Объяснение Операция извлечения квадратного корня выполняется над
значением одного столбца. (Тема 3.2)
48. В. Участвующие в соединении таблицы обязаны иметь общие столбцы.
Объяснение Возможно, операция соединения не сгенерирует ни одного
возвращаемого значения так же, как это может оказаться возможным для
любого оператора select. Варианты А, С и D представляют спектр
возможностей для общих значений, которые могут присутствовать, а могут и не
присутствовать в общих столбцах. Однако само по себе соединение невозможно, если
у таблиц нет общих столбцов. (Тема 4.1)
49. D. До момента завершения сеанса
Объяснение Определенная пользователем во время сеанса SQL*Plus
переменная будет оставаться определенной либо до конца сеанса, либо до тех пор,
пока пользователь явно не объявит ее неопределенной. (Тема 1.3)
50. В и С. Изменить фразу prompt команды accept и ввести новое приглашение
в файл login. sql.
Объяснение Вариант D должен быть отброшен немедленно, после чего
остается сделать выбор между ответами А, В и С. Ответ А некорректен,
поскольку файл config.ora имеет непосредственное отношение к сетевому
коммуникационному продукту Oracle для реализации архитектуры клиент/сервер.
Вариант С справедлив, поскольку мы можем использовать в файле login. sql
команду set sqlprompt. Это специальный файл, который автоматически
конфигурирует такие аспекты сеанса SQL*Plus, как используемый по
умолчанию редактор текстов, формат столбцов, форматы дат по NLS и другие
элементы. (Тема 7.1)
51.А и С. select * from EMPLOYEE where EMPID &empid;
и select * from EMPLOYEE where EMPID (select empid
from invoice where INVOICE_NO = 4399485);
324
Глава 9
Объяснение Вариант А детализирует применение переменных
исполнительного периода, которые могут быть использованы для обеспечения ввода
пользователем подходящего критерия поиска уже после начала обработки
оператора. Вариант С детализирует применение подзапроса, который
позволяет пользователю выбрать из базы данных неизвестный критерий поиска,
используя известные методы получения данных. Вариант В неверен, так как в
нем просто предлагается известный критерий поиска; вариант D некорректен,
поскольку в нем вообще отсутствует критерий поиска. (Тема 7.1)
52. А. Амперсанд
Объяснение По умолчанию для определения переменных исполнительного
периода используется символ амперсанда (&). (Тема 7.1)
53.С. select e.empid, d.head, from EMPLOYEE e, dept d where
e.deptf = d.dept# (+);
Объяснение Выбор С описывает операцию внешнего соединения наиболее
подходящим для целей пользователя способом. Внешней таблицей этого
соединения является таблица DEPT, на что указывает маркер (+), размещенный
сразу же после имени столбца DEPT# в операторе сравнения, определяющем
соединение. (Тема 4.2)
54.В, С и D. Для исключения некоторых групп данных на основании
известных критериев, для включения некоторых групп данных на основании
неизвестных критериев, для включения некоторых групп данных на
основании известных критериев
Объяснение Все действия по исключению или включению
сгруппированных строк обрабатываются с помощью фразы having оператора select.
Выбор А нам не подходит, потому что в операторе select порядок сортировки
задается во фразе order by. (Тема 5.4)
55.В. Результат оператора select с соединением и с отсутствующей фразой
where
Объяснение Декартово произведение представляет собой результирующий
выходной набор оператора select, в котором возвращаемыми являются все
данные из обеих таблиц. В числе причин, приводящих к возникновению
декартова произведения, можно назвать отсутствие фразы where для оператора
select с соединением. (Тема 4.1)
56. D. Задание команды set define
Объяснение Вариант А неверен, поскольку в результате изменения файла
init.ora изменяются параметры, используемые Oracle при запуске
экземпляра базы данных. Вариант В некорректен, так как, хотя файл login.sql
может определять многие свойства сеанса SQL*Plus, символ, означающий
переменные исполнительного периода, не относится к их числу. Вариант С
неверен, так как команда define используется для определения
переменных, применяемых на протяжении всего сеанса, а не в отдельном операторе.
(Тема 1.3)
57. В.set role sales_analyzer;
Объяснение Вероятно, проблема возникает потому, что SALES_ANALYZER
не была ролью, назначенной пользователю THOMAS по умолчанию. Она
может активировать эту роль, используя команду set role, в результате чего
можно признать правильным вариант ответа В. Поскольку все необходимые
привилегии были уже предоставлены THOMAS через роль, нет необходимости
еще раз использовать команду grant, что делает ошибочными варианты С и
D. Наконец, вариант А некорректен, потому что пользователь не может
изменить свои собственные установки, используя команду alter user для
изменения информации о роли; эту команду можно использовать только для
изменения собственного пароля. (Тема 13.2)
Первый экзамен ОСА: введение в SQL
325
58.D. Сразу же, после того как роли SALES_ANALYZER будет предоставлена
привилегия
Объяснение Доступ к объектам, который обеспечивается предоставлением
соответствующей роли соответствующих привилегий, вступает в силу
немедленно. Пользователю DAVIS не требуется повторно входить в Oracle, так что
вариант А некорректен. Вариант В также некорректен, потому что не
требуется еще раз предоставлять пользователю DAVIS роль SALES_ANALYZER.
Наконец, ошибочность варианта С в том, что не требуется еще раз назначать
привилегию роли SALES_ANALYZER. (Тема 13.3)
59. D. grant create public synonym to davis;
Объяснение Для того чтобы пользователь DAVIS мог создавать таблицы,
ему не требуется иметь возможность создавать общедоступные синонимы.
Следовательно, верным является вариант ответа D. А вот создать
идентификационные параметры для пользователя DAVIS пользователю IMADBA
действительно необходимо, так что вариант А ошибочен. Кроме того, пользователю
DAVIS также требуется иметь возможность регистрироваться в Oracle,
используя привилегии, идентифицированные в варианте В, и возможность создавать
таблицы, используя привилегии из варианта С. Так что и эти два варианта
некорректны. (Тема 12.3)
60. С. create session
Объяснение Привилегия create session позволяет вам подключаться к
базе данных Oracle, что делает С правильным ответом. В вариантах А и В
идет речь о созданных Oracle ролях, которые уже имеют соответствующие
привилегии для входа в Oracle, но помните, что это роли, а не сами
привилегии. Наконец, вариант D неверен, так как привилегия references является
объектной привилегией, которая не дает вам возможности подключаться к
Oracle. (Тема 13.3)
Ответы на третий комплект экзаменационных
вопросов
1. A. select empno, ename, loc from emp join dept on emp.deptno
dept.deptno where substr
(emp.ename,1,1) 'S'
Объяснение Вариант А определяет правильный синтаксис для создания
соединения таблиц, соответствующий стандарту ANSI. Вариант В неверен,
потому что ключевое слово on можно использовать только при наличии
ключевого слова join, которое отсутствует в предлагаемом синтаксисе. Вариант С
неверен, поскольку условие соединения должно быть идентифицировано как
часть фразы on, если указано ключевое слово j oin. Наконец, вариант D
ошибочен, так как указание того, что первый символ столбца ENAME равен S, не
является условием соединения, это условие фильтрации. Следовательно, это
условие должно быть включено не во фразу on, а, скорее, во фразу where.
(Тема 4.1)
2. С. С помощью оператора select в Oracle можно создавать таблицы с
таким же содержимым, что и у другой таблицы.
Объяснение Вариант С справедлив, потому что в команду create table as
select входит оператор select, не использующийся в качестве подзапроса.
Варианты А и В неверны, поскольку для того, чтобы использовать команду
select для удаления или изменения данных, она должна быть включена в
соответствующие операторы в качестве подзапроса. Наконец, в команду
truncate вообще нельзя включить подзапрос. (Тема 6.1)
326
Глава 9
3. D. Фраза where
Объяснение Если оператор select используется для выполнения
математических операций над статическими выражениями, нет необходимости
использовать в нем фразу where. Вариант А неверен, так как во фразу column
запроса должны быть включены статические выражения и математические
операции. Вариант В ошибочен, поскольку фраза from обязана
присутствовать во всех операторах SQL. Наконец, вариант D неверен, потому что статья
from нашего запроса должна ссылаться на таблицу DUAL. (Тема 2.1)
4. В. set define ?
Объяснение В Oracle команда set не является командой SQL. Скорее, это
команда инструментов Oracle, образ действия которой зависит от конкретного
инструмента. Для SQL*Plus команда set позволяет определить различные
аспекты операционной среды SQL. Варианты А и С неверны, поскольку
команды select и update являются неотъемлемой частью DML — языка
манипулирования данными SQL. Вариант D ошибочен, так как команда create
table является частью DDL — языка определения данных SQL. (Тема 1.3)
5. С. Индекс
Объяснение Непосредственно ссылаться на индекс в команде SQL не
разрешается, но при некоторых обстоятельствах Oracle может использовать их за
кулисами для повышения производительности. Вариант А неверен, потому
что команда select позволяет запрашивать Oracle о содержимом таблицы.
Непосредственно из оператора select можно обращаться к
последовательностям, что указывает на ошибочность ответа В. И наконец, вариант В также
ошибочен, потому что в операторах select можно непосредственно
обращаться к представлениям. (Тема 12.2)
6. С. where
Объяснение Условия отбора (фильтрации) всегда помещаются во фразу
where запроса SQL. Вариант А неверен, поскольку имена столбцов, которые
вы желаете увидеть в выходных данных, перечисляются во фразе select.
Вариант В ошибочен, потому что имена таблиц, к которым обращен запрос,
указываются во фразе from. И наконец, вариант D неверен, так как фраза having
обычно играет роль дополнительного фильтра в тех случаях, когда вы желаете
увидеть только те выходные данные, которые удовлетворяют условиям
фильтра при использовании фразы group by. (Тема 2.1)
7. С. where product_type 'APPLIANCE' and qtr_end_date between
'01-JAN-2001' and ' 01-JUL-2001';
Объяснение Поскольку желательно получить валовую прибыль для всех
устройств (appliances) за первые 6 месяцев 2001 г., наилучшим ответом будет
вариант С, так как используемые в нем фильтры базируются именно на этих
критериях для столбцов PRODUCTJTYPE и QTR_END_DATE. Вариант А
неверен, так как в нем во фразе where использован фильтр по столбцу
PRODUCT_NAME, и хотя газовый гриль, несомненно, относится к
устройствам, в таблице PROFITS могут быть перечислены другие устройства, которые
не являются газовыми грилями, но которые мы тем не менее желали бы
включить в вычисление валовой прибыли. Вариант В ошибочен по той же причине:
перечень устройств не ограничивается газовыми грилями. Наконец, вариант
D неверен по той причине, что в нем отсутствует условие отбора по столбцу
PRODUCTJTYPE, а условие отбора по столбцу QTR_END_DATE
сформулировано с ошибками. (Тема 2.1)
8. D. NULL
Объяснение Этот трудный вопрос проверяет ваши знания того, как
групповые функции реагируют на получение ими информации NULL. Еще раз
взгляните на содержимое столбца СОММ таблицы ЕМР. Многие ее строки
содержат в этом столбце значение NULL. Когда на вход групповой функции
подаются значения NULL, результатом всегда будет NULL. Поэтому, хотя на
Первый экзамен ОСА: введение в SQL
327
самом деле сумма заработной платы и комиссионных для аналитиков и всех
служащих, фамилии которых начинаются с буквы J, равна 9925, Oracle
возвратит в качестве ответа значение NULL. (Тема 5.2)
9. В. Два
Объяснение И снова этот трудный вопрос проверяет ваши знания того, как
групповые функции реагируют на получение ими информации NULL. Хотя
значение 10 в столбце DEPTNO имеют трое служащих, Oracle не учтет запись
для служащего KING, поскольку в столбце MGR у него содержится NULL.
Следовательно, вариант С неверен. (Тема 5.2)
10. А. Пять.
Объяснение Если от 7700 отнять 2, получится 7698. У пятерых служащих в
графе MGR содержится значение 7698, так что правильным ответом будет А.
Все остальные варианты неверны. Целью этого вопроса является проверка,
понимаете ли вы, что в запросы SQL можно включать математические
операции над статическими выражениями. (Тема 1.3)
11. D. WARD
Объяснение Прочтите еще раз текст вопроса и попытайтесь пересказать его
своими словами. Во-первых, вам предлагается отобрать тех служащих,
которые являются продавцами (salesmen). Во-вторых, предлагается организовать
выходные данные в убывающем порядке по значениям столбца EMPNO, то
есть первым должен быть указан служащий с самой высокой заработной
платой, вторым — служащий со второй по величине заработной платой и так
далее. В нашем случае перечень будет иметь следующий вид: TURNER,
MARTIN, WARD и ALLEN. И наконец, нас просят указать, кто из служащих
значится в этом списке под номером три. Именно поэтому правильным
ответом будет D. (Тема 2.2)
12. В. MARTIN
Объяснение Прочтите еще раз текст вопроса и попытайтесь пересказать
своими словами. Во-первых, вам предлагается понять, кто из служащих
является продавцом. Во-вторых, предлагается организовать выходные данные в
убывающем порядке по значениям первого столбца выходных данных —
столбца ENAME. В нашем случае перечень будет иметь следующий вид:
WARD, TURNER, MARTIN и ALLEN. И наконец, нас просят указать, кто из
служащих значится в этом списке под номером три. Именно поэтому
правильным ответом будет В. (Тема 2.2)
13. С. MAN
Объяснение Вспомните, что, когда используется ключевое слово like,
Oracle использует для идентификации данных путем сравнения с шаблоном
групповые символы _ и %. Символ _ означает, что эта буква в текстовой
строке может быть любой, в то время как символ % означает, что произвольным
может быть предыдущий или последующий текст строки. В нашем случае мы
ищем строку таблицы, в столбце ENAME которой содержится текстовая
строка, первые два символа которой могут быть любыми, вслед за ними будут
следовать символы AR, а далее — произвольный текст. Этому критерию
соответствует только одна фамилия из списка — CLARK. Значение столбца JOB для
служащего CLARK равно MANAGER, а три первых символа этой
должности — MAN. Таким образом, правильным ответом будет вариант С. (Тема 3.2)
14. С. -24
Объяснение Так как создаваемый Oracle при задании этого запроса результат
равен —24, правильным ответом будет ответ С. Результат будет отрицательным,
потому что Oracle вычитает максимальную (то есть самую позднюю) дату
приема на работу из минимальной (то есть самой ранней). Следовательно, варианты
А и В ошибочны. Вариант D также ошибочен, поскольку функция trunc ( )
328
Глава 9
усекает значения справа от десятичной точки и возвращает значение —24, а не
-25. (Тема 3.2)
15. А и С. ADAMS и SCOTT
Объяснение Oracle возвратит только те строки, значение столбца
HIREDATE которых больше (то есть более позднее), чем 23 января 1982 г.
Этому критерию соответствуют только две строки. Это строки, указанные в
вариантах А и С. Оба варианта В и D неверны, поскольку указанные в них
даты приема на работу (столбец HIREDATE) меньше, чем 23 января 1982 г.
(Тема 1.2)
16. D. В результате Oracle возвратит ошибку
Объяснение Любое подстановочное значение, определенное
использованием функции nvl ( ), должно иметь тот же тип данных, что и у столбца,
специфицированного в вызове этой функции. Следовательно, так как столбец
TESTCOL объявлен с типом данных NUMBER, a 'EMPTY1 — это текстовая
строка, Oracle возвратит вам ошибку. Если бы мы вместо столбца TESTCOL
специфицировали в нашем вызове функции nvl ( ) столбец TESTCOL_2, то
правильным выбором был бы вариант В. (Тема 3.2)
17. D. where customer 'LESLIE' and order_amt > 2700;
Объяснение Чтобы увидеть информацию о заказах для заказчика LESLIE, в
которых сумма заказа превышает две тысячи семьсот долларов, необходимо
задать именно фразу where, записанную в варианте D. Вариант А неверен, так
как в таком случае Oracle без разбора возвратит все размещенные LESLIE
заказы. Ошибка варианта В заключается в том, что Oracle возвратит только те
заказы LESLIE, для которых сумма заказа меньше двух тысяч семисот долларов. И
наконец, вариант С ошибочен, потому что Oracle возвратит все заказы LESLIE
и все заказы, для которых сумма заказа больше двух тысяч семисот долларов,
даже если они были размещены не LESLIE, а любым другим пользователем, то
есть, слишком много информации. (Тема 2.1)
18. В. select rpad(ename, 10, '-dog') as ename from emp;
Объяснение Каждая фамилия служащего дополняется справа текстом -dog,
повторяющимся снова и снова, пока не будут заполнены все 10 позиций
строки. Таким образом, нам следует использовать функцию rpad( ). Вариант А
некорректен, так как функция trim ( ) удаляет специфицированный в ней
текст из переданной в функцию строки. Вариант С неверен, потому что
функция substr ( ) возвращает текстовую подстроку переданной на ее вход
строки. Наконец, вариант D ошибочен, так как функция lpad ( ) дополняет
переданную на вход строку пробелами слева, чтобы общая длина получающейся в
результате строки составила 10 символов. (Тема 3.2)
19. A. abs ( )
Объяснение Функция abs ( ) возвращает абсолютное значение числа,
определяемое как расстояние от нуля до этого числа. Абсолютное значение
всегда является положительным, следовательно, эта функция не могла бы
сгенерировать выходные данные, идентифицированные в вопросе. Варианты В, С и
D являются некорректными, так как функции ceil ( ), floor ( ) и round ( )
вполне могли бы создать заданное значение. (Тема 3.2)
20. В. 13
Объяснение При определении общей длины текстовой строки учитываются
и пробелы. Поскольку в строке содержится шесть значащих символов
(SMITHY) и семь пробелов, функция length ( ) возвратит в качестве длины
строки значение 13. Вариант А неверен, так как в приведенном значении не
учтены добавленные к тексту пробелы. Вариант D был бы справедлив в том
случае, если бы столбец был определен как CHAR(60), а не как
VARCHAR2(60). И наконец, для указания в качестве ответа числа 30 не имеет-
Первый экзамен ОСА: введение в SQL
329
ся никаких логических оснований, так что вариант С должен быть немедленно
отброшен. (Тема 3.2)
21. В. floor ( )
Объяснение Функция f loor ( ) всегда округляет переданный на вход
параметр (обычно это число с десятичной точкой) до ближайшего меньшего
целого, а так как -98 меньше, чем —97.342, функция fioor ( ) возвратит именно
этот результат. Варианты А, С и D некорректны, так как функции ceil ( ),
round ( ) и trunc ( ), в результате выполнения подобного запроса возвратят
результат —97. (Тема 3.2)
22. A. ceil( )
Объяснение Функция ceil ( ) всегда округляет переданный на вход
параметр (обычно это число с десятичной точкой) до ближайшего большего
целого, а так как ближайшим целым числом, превышающим заданное, является
257, функция ceil ( ) возвратит именно этот результат. Варианты В, С и D
некорректны, так как функции floor < ), round ( ) и trunc ( ) в результате
выполнения подобного запроса возвратят именно 256. (Тема 3.2)
23. D. -168
Объяснение В результате этого запроса Oracle возвратит значение —168,
поскольку с 15 марта 1983 г. до 15 марта 1997 г. пройдет именно 168 месяцев.
Результат будет отрицательным, потому что 1983 меньше, чем 1997, а также
потому, что Oracle вычитает второе значение из первого, а не наоборот. Если бы
передаваемые в функцию months_between ( ) даты можно было поменять
местами, правильным ответом был бы ответ С. Варианты ответа А и В явно
некорректны. (Тема 3.2)
24. D. to_number( )
Объяснение Хотя информация о датах хранится в базах данных Oracle в
числовом виде, функцию to_number ( ) нельзя использовать для
преобразования даты в обычное число, что Делает необязательным и даже ошибочным
использование маски формата с функцией to_number ( ). Варианты А, В и С
указывают на функции или ситуации, где использование маски формата
вполне допустимо. (Тема 3.3)
25.С. select p.prod_d, p.prod_name, b.box_loc from
product p, storagejbox b where p.storjbox_num
b.stor_box_num and p.prod_name = 'WIDGET';
Объяснение Условия соединения и отбора, требующиеся для этого запроса,
корректно представлены в варианте С, потому что соединение выполнено по
общему столбцу обеих таблиц, а условие отбора для всех "штуковин" по
столбцу PROD_NAMES выражено корректно. Вариант А некорректен, так как
общим столбцом таблиц PRODUCT и STORAGE_BOX является не столбец
PRODUCTJD, а столбец STOR_BOX_NUM. Вариант В неверен, поскольку в
этом случае у двух таблиц отсутствует условие соединения, что приведет к
возникновению выходных данных в виде декартова произведения. Наконец,
вариант D ошибочен, потому что условие соединения неоднозначно ссылается
на столбцы STOR_BOX_NUM в обеих таблицах. (Тема 4.1)
26. В. Три
Объяснение Для получения требующегося в этом вопросе результата
необходимо задать п— 1 условие соединения, где п равно числу соединяемых
таблиц. Поскольку у нас имеются три таблицы, нам потребуются два условия
соединения плюс условие отбора, то есть три операции сравнения. (Тема 4.1)
27.С. select product.id, product.name, storage.loc from
product natural join storage on product.box#
storage.box#;
330
Глава 9
Объяснение При выполнении естественных соединений не требуется
идентифицировать условия соединения, потому что Oracle предполагает, что
соединение будет выполнено по общим столбцам обеих таблиц. Следовательно,
фраза on из варианта С является необязательной и приведет к ошибке.
Вариант А идентифицирует традиционный способ определения соединения в
Oracle, в то время как вариант В идентифицирует способ определения
соединения по стандарту ANSI/ISO. Наконец, вариант D некорректен, поскольку
должным образом определяет, как следует специфицировать естественные
соединения в Oracle. (Тема 4.1)
28. D. Несмотря на то что операции внешнего соединения позволяют иметь в
одной из таблиц значения NULL, для соединения таких таблиц вы должны
определять сравнения на равенство.
Объяснение Вариант D является логической противоположностью варианта
А и поэтому будет правильным ответом. По этой причине можно считать ответ
А неверным. Вариант В ошибочен, так как для того, чтобы видеть все строки
таблицы А даже в том случае, если в таблице В отсутствуют соответствующие
им записи, вы определяете левое соединение. Наконец, вариант С неверен,
поскольку для того, чтобы видеть все строки таблицы В даже в том случае,
если в таблице А отсутствуют соответствующие им записи, вы определяете
правое соединение. (Тема 4.2)
29.В. select p.prod_id, p.prod_name, Ь.Ьох_1ос from
product p left outer join storage_box b on
p.stor_box_num b.stor_box_num where p.prod_name
'WIDGET';
Объяснение Вариант В является единственным оператором, который
правильно определяет внешнее соединение, отвечающее критериям,
специфицированным в вопросе. Варианты А и С являются первыми кандидатами на
отбрасывание, поскольку синтаксис внешних соединений по ANSI/ISO
сочетается в них с традиционным синтаксисом Oracle, а это не разрешено в
базах данных Oracle. Если вы попытаетесь реализовать такой смешанный
синтаксис, Oracle возвратит сообщение об ошибке. Вариант D некорректен,
поскольку он специфицирует полное внешнее соединение всех строк обеих
таблиц, в том числе тех, которые не были бы включены в выходные данные, если
бы было выполнено соединение по эквивалентности. (Тема 4.2)
30.С. select e.ename, a.street_address, a.city,
a.state, a.post_code from emp e right outer join
addr a on e.empno a.empno where a.state = 'TEXAS';
Объяснение Правильным является вариант С, поскольку оператор
внешнего соединения Oracle появляется справа от операции сравнения для
соединения. Это означает, что необходимо выполнить правое внешнее соединение,
используя синтаксис ANSVISO. Вариант А некорректен, так как в операторе
пропущено ключевое слово left (левое) или right (правое). Вариант В
ошибочен, потому что при левом внешнем соединении записи из таблицы ЕМР
будут возвращены даже в том случае, если в таблице ADDR отсутствуют
соответствующие им записи. Вариант D неверен, потому что в нем в одном
операторе традиционный синтаксис внешних соединений Oracle неправомочно
смешивается с синтаксисом ANSI/ISO. (Тема 4.2)
31. А. Полное внешнее соединение
Объяснение Выходные данные этого вопроса четко указывают на ситуацию,
в которой пользователю требуются записи как из таблицы PRODUCT, так и из
таблицы BOX, даже если соответствующие друг другу записи в них
отсутствуют. Это именно та функциональность, которую призвано обеспечивать полное
внешнее соединение. Варианты В и С некорректны, так как полные внешние
соединения возвращают записи как из правого, так и из левого внешнего
соединения. Наконец, вариант D ошибочен, поскольку операция сравнения по
Первый экзамен ОСА: введение в SQL
331
эквивалентности не возвратит вторую или третью запись из числа
перечисленных в выходных данных запроса. (Тема 4.2)
32.D. select region, prod_type, time, sum(profit) from
profits group by cube (region, prod_type, time);
Объяснение Когда вам встречается вопрос, связанный с тем, что выходные
данные запроса должны создать кросс-табуляцию информации, вы должны,
не задумываясь, вспомнить, что требуемый результат создается ключевым
словом cube. Вариант А идентифицирует должным образом сформированную
фразу column, содержащую групповую функцию, требующуюся для фразы
group by, но не содержит обязательного ключевого слова cube, поэтому и
является неверным. Вариант В неверен, поскольку во фразе column не
содержится групповая функция. Вариант С неверен по той же причине. (Тема 5.2)
33. A. select deptno, job, sum(sal) from emp group by job, deptno;
Объяснение Приведенный в варианте А оператор верен, потому что в нем
содержатся ссылки на групповую функцию. Фраза group by корректна, даже
несмотря на то, что перечисленные в ней столбцы размещены в другом
порядке, чем во фразе column запроса, что является допустимым при условии, что
все негрупповые (то есть не входящие в выражение group by) столбцы
перечисляются перед групповым выражением. Вариант В ошибочен, поскольку в
нем групповое выражение приведено перед негрупповыми, что неминуемо
вызывает сообщение об ошибке. Вариант С неверен, потому что в нем вообще
отсутствует фраза group by, что также приводит к ошибке. Наконец, вариант
D некорректен, так как в нем групповое выражение указано слева от
негруппового, что приводит к ошибке. (Тема 5.2)
34. D. sum(A.SAL)
Объяснение Когда в запросе присутствует фраза order by, Oracle
перечисляет выходные данные в соответствии с выражением, включенным во фразу
order by. В противном случае Oracle сортирует выходные данные по
столбцам, включенным во фразу group by. Следовательно, варианты А, В и С
некорректны. (Тема 5.1)
35. С. select region, prod_type, period, avg(profit) from
profits group by region, prod_type, period having avg(profit)
100000;
Объяснение Вариант С содержит правильно построенные фразы column и
group by и использует фразу having для отбора результатов в соответствии с
идентифицированным в вопросе критерием. После тщательного изучения
варианта D мы можем отвергнуть его, поскольку записанная в нем фраза having
отбирает результаты, в которых средняя прибыль меньше ста тысяч долларов,
а не превосходит эту сумму. Варианты А и В — это попытка негодными
средствами использовать фразу where для отбраковки нежелательных данных.
(Тема 5.4)
36. С. select e.empno, e.ename from emp e where e.sal (select
sum(x.vouch_amt) from expense x where x.empno e.empno);
Объяснение Чтобы получить правильный результат, необходимо заставить
Oracle вычислять общие расходы, размещенные каждым пользователем,
перечисленным в таблице ЕМР, и только в варианте С правильно используется
коррелированный подзапрос, требующийся для решения этой задачи. Вариант
А показывает сумму всех расходов из таблицы EXPENSE, которая, конечно,
будет выше, чем заработная плата любого из служащих. Вариант В неверен,
так как он, скорее всего, приведет к ошибке, связанной с тем, что в результате
выполнения подзапроса, который изначально задумывался как
однострочный, будет возвращено несколько строк. Вариант D ошибочен, поскольку
оператор exists не является подходящим сравнением между родительским
запросом и подзапросом, если требуется выдать список сотрудников, у которых
332
Глава 9
оправдательные документы по расходам превышают их заработную плату.
(Тема 6.4)
37.В. select e.ename from emp e where exists (select x.empno from
expense x where x..vouch_amt > 10000 and x.empno = e.empno);
Объяснение Оператор из варианта В является правильным, потому что в
нем должным образом используется оператор exists и формируется
коррелированный подзапрос, требующийся для получения тех же результатов,
которые дает показанный в вопросе запрос. Вариант А неверен, потому что ссылка
на таблицу EXPENSE в родительском запросе размещена за пределами
видимости (зоны действия) этой таблицы. Вариант С неверен по той же причине.
Наконец, фраза where, формирующая соединение и использующая операцию
exists, в варианте D является избыточной и потому ошибочной. (Тема 6.2)
38. А. Однострочный подзапрос
Объяснение Чтобы определить, что за тип подзапроса показан в этом
запросе, нужно определить, каков объем данных, создаваемых запросом. Поскольку
значение 'MARTIN' в столбце ENAME содержит только одна запись таблицы
ЕМР, этот подзапрос должен возвратить только одну строку и поэтому
является однострочным подзапросом. Вариант В некорректен именно по этой
причине. Вариант С неверен, поскольку фраза from подзапроса точно такая же,
как и во встроенном представлении, а во фразе from запроса отсутствует
подзапрос. Наконец, вариант D ошибочен, поскольку в подзапросе отсутствует
ссылка на несколько столбцов. (Тема б.З)
39. A. select sum(profit) from profits where region in (select
region from regions where reg_head in ('SMITHERS', 'FUJIMORI',
'LAKKARAJU')) and product = 'TOYS';
Объяснение Для получения корректного результата вам потребуется
многострочный подзапрос, получающий листинг регионов, возглавляемых
указанными в тексте вопроса руководителями. Кроме того, в качестве условия
отбора данных мы хотим использовать условие для столбца PRODUCT,
возвращающее нам только игрушки. Вариант А обеспечивает нам выполнение
всех этих условий. Вариант В неверен, так как в подзапрос включено
некорректное условие отбора, действующее на таблицу REGIONS, тогда как оно
должно действовать на таблицу PROFITS. Вариант С ошибочен: сравнение по
равенству между столбцом REGION и значениями, возвращаемыми из
подзапроса, приведет к ошибке, так как подзапрос, который, как этого ожидает
родительский запрос, должен быть однострочным, на самом деле возвратит
несколько строк. Наконец, вариант D не подходит по той же самой причине, что
и вариант В, а также потому, что в нем пропущены скобки в конце запроса.
(Тема 6.1)
40. С. with
Объяснение Фразу with можно использовать для определения итогового
набора данных, чтобы избежать избыточности как в родительском запросе,
так и в подзапросе. По этой причине вы не будете использовать фразу group
by, что отвергает вариант А, а также фразу order by, что отвергает вариант В.
Наконец, не стоит использовать и фразу having (вариант D). (Тема 6.1)
41.В. select nvl(е.deptno,99), e.ename, e.job, e.sal from emp e
where e.sal = (select max(e2.sal) from emp e2 where
nvl(e.deptno,99) = nvl(e2.deptno,99));
Объяснение Даже эксперты по SQL отнесут этот вопрос к числу требующих
напряжения всех сил. Вам предлагается определить, какой из предложенных
операторов возвратит в столбце DEPTNO значение 99, хотя в настоящее время
в выходном наборе, показанном в вопросе, в этом столбце содержится
значение NULL. Сразу хочется ответить, что следует выбрать вариант, содержащий
функцию nvl ( ) для столбца DEPTNO во фразе column. Проблема же
заключается в том, что функция nvl ( ) для столбца DEPTNO во фразе columns со-
Первый экзамен ОСА: введение a SQL
333
держится во всех предложенных вариантах ответа. Следовательно, нам
необходимо пойти дальше этого очевидного факта и поискать другую путеводную
нить, причем лучшее, что мы сможем сделать, это найти причины, по которым
можно отказаться от неправильных ответов, а не пытаться определить, какой
из ответов является правильным. Первым нам приходит на помощь вариант Л,
в котором фраза where из родительского запроса подсказывает, что
родительский запрос ожидает получить многостолбцовый подзапрос, но не получает
его, что сразу относит вариант А к числу ошибочных. Далее следует обратить
внимание, что в варианте С для группового выражения в подзапросе требуется
фраза group by, отсутствующая в нем, что делает ошибочным и этот вариант.
Выделив эти моменты, мы уже сузили круг кандидатов на правильный ответ
до двух, доведя свои шансы до 50/50. Если теперь мы вспомним, что в столбце
DEPTNO хранится не значение 99 и что групповые функции по умолчанию
игнорируют значение NULL, мы сможем отвергнуть вариант D, после чего у
нас останется только один кандидат на правильный ответ — вариант В.
(Тема 6.1)
42. С. select prod_name, profit from (select prod_name, sum(pro-
fit) from profits group by prod_name order by sum(profit)
desc) where rownum <= 5;
Объяснение Вариант С правильно указывает на запрос, содержащий
встроенное представление, который представляет собой список пяти продуктов,
лучше других продававшихся за всю историю компании. Вариант А ошибочен,
потому что в нем прибыли сгруппированы не за всю историю компании по
названию продукта, а по кварталам, что приводит к неверному результату.
Вариант В неверен, поскольку нам не требуется соединять содержимое таблицы
PROFITS со встроенным представлением. Более того, в варианте В ничего не
сделано для того, чтобы отобрать пять продуктов, которые лучше других
продавались за всю историю компании. Наконец, встроенное представление из
варианта D не содержит фразы group by, что приводит к ошибке вследствие
присутствия во фразе column встроенного представления групповой функции,
в результате чего вариант становится ошибочным. (Тема 6.3)
43.С. accept v_period prompt 'Enter the time period 'select
profit from profits where prod_type 'TOYS' and time_period
= ' &v_j?eriod';
Объяснение Поскольку в вопросе упоминается, что пользователи жалуются
на неудобства в процессе взаимодействия с запросом, вы должны строить свой
ответ на базе варианта, обеспечивающего интерактивное определение
временного интервала и делающего это с помощью понятной подсказки. Этим
требованиям удовлетворяет вариант С. Вариант D близок к тому, чтобы обеспечить
понятную подсказку, но только близок, поэтому этот вариант не является
ответом на поставленный вопрос. Вариант А неверен, поскольку та подсказка,
которую по умолчанию будет использовать Oracle, не отвечает требованиям
понятности. Вариант В ошибочен, так как использование команды define
ограничивает взаимодействие между SQL*Plus и пользователем. (Тема 7.1)
44.А. Переменную vhiredate следует изменить, чтобы она могла принимать
информацию типа DATE.
Объяснение Когда в SQL*Plus переменные определяются с помощью
команды accept, Oracle по умолчанию назначает им тип данных CHAR.
Поэтому, если мы хотим принять не символьную (non-CHAR) информацию, мы
должны назначить этой переменной какой-либо тип ладных. Следовательно,
правильным ответом является вариант А. Вариант В некорректен, потому что
функция trunc ( ) вполне уместна в этом запросе. Вариант С неверен,
поскольку нет никакой необходимости удалять из запроса фразу prompt.
Наконец, вариант D ошибочен, потому что в том виде, как он представлен, запрос
работать не будет. (Тема 7.1)
45.D. create table cats-over-5-lbs as select c_name, c_weight
from cats where c_weight > 5;
334
Глава 9
Объяснение Так как в имя любой таблицы Oracle нельзя включать дефисы
или черточки, правильным ответом будет вариант D. Вариант А нельзя считать
ошибочным, так как в нем задается абсолютно правильная команда create
table. В варианте В задается абсолютно правильная команда create table
as select. А вариант С нельзя считать ошибочным, так как в нем задается
абсолютно правильная команда create global temporary table. (Тема 9.2)
46. С. Изменить имена столбцов в создаваемом объекте.
Объяснение Изменение имен столбцов таблицы в том случае, если в Oracle
уже существует объект с таким именем таблицы, не поможет избежать
повторного появления подобной ошибки. Напротив, вам может помочь любое
из следующих действий: создание таблицы от имени другого пользователя, а
также удаление или переименование существующего объекта. Поэтому
правильным ответом является вариант С, а все остальные варианты ошибочны.
(Тема 9.4)
47. В. 871039453.1
Объяснение Поскольку столбец был определен как имеющий тип данных
NUMBER(10,2), Oracle позволяет размещать в этом столбце таблицы только
числа, имеющие слева от десятичной точки не более восьми знаков.
Следовательно, правильным является вариант ответа В, так как в заданном в нем
числе содержится девять знаков перед десятичной точкой. Оба варианта С и D
определяют подходящие для хранения в столбце числа. Заданное в варианте А
число также может быть записано в этот столбец, но при этом Oracle
произведет неявное округление числа до сотых (в соответствии с типом данных
NUMBER(10,2)). (Тема 9.3)
48. В. 7
Объяснение Функция vsize( ) возвращает значение 7 для всех столбцов,
имеющих тип данных DATE независимо от того, какие данные фактически
содержатся в этих столбцах. Информация о конкретной дате приема на работу
служащего KING была приведена только для того, чтобы попытаться сбить
вас с толку. (Тема 3.3)
49. С. 40
Объяснение Функция vsize( ) всегда возвращает значение, эквивалентное
размеру столбца типа CHAR независимо от того, какое фактическое значение
хранится в этом столбце. Это связано с тем, что Oracle дополняет пробелами
любое значение, специфицированное для хранения в столбце типа CHAR, до
размера, указанного в определении столбца. Если бы столбец был определен
как VARCHAR2, правильным был бы ответ А. Все остальные ответы
достаточно легко отбросить, если вы понимаете типы данных Oracle. (Тема 3.3)
50. В. При создании таблицы для столбца JOB_WAGE была использована
фраза default, определяющая значение, присваиваемое столбцу по
умолчанию.
Объяснение Целью фразы default является специфицирование значения
по умолчанию столбца в тех случаях, когда пользователи не определили явно
значение, призванное заполнить столбец для добавляемой в таблицу строки.
Вариант А некорректен, потому что оператор insert не используется для
заполнения столбцов существующих строк значениями. Вариант С ошибочен,
поскольку вы не можете скрывать значения во фразе values оператора
insert. Наконец, вариант D неверен, так как изменение столбца JOB_WAGE
с помощью последующего оператора update не является единственным
способом добавить в таблицу требующееся значение. (Тема 9.3)
51. D. Скопировать записи столбца из временной памяти обратно в главную
таблицу.
Объяснение Если перед тем, как выбрать ответ, еще раз тщательно изучить
все варианты, вы непременно обратите внимание, что некоторые шаги про-
Первый экзамен ОСА: введение в SQL
335
цесса, требующегося для выполнения поставленной в вопросе задачи,
перечислены в этом списке. Предлагаем вам самостоятельно расположить их в
требующемся порядке. Если вы расположили эти шаги в порядке С, А, В, D, вы
поступили абсолютно правильно. Затем в вопросе вам предлагается завершить
шаг, определенный вариантом В. Следовательно, вы должны выполнить шаг,
указанный в варианте D. (Тема 9.4)
52. А. Немедленно после выполнения этого оператора
Объяснение Oracle удалит столбец PROFIT сразу же после того, как будет
выполнен указанный в вопросе оператор. Варианты В и С идентифицируют
другие способы удаления столбцов из Oracle с помощью фраз set unused
column и drop unused columns. Однако в вопросе ничего не сказано об
использовании этих опций, так что подобные ответы неправомочны. И наконец,
мы не можем удалит, столбец, используя команду alter table modify.
(Тема 9.4)
53. D. Ничего. Операция выполняется автоматически.
Объяснение После того как для увеличения размера столбца вы задали
соответствующий оператор alter table, считайте, что выполнение этой задачи
закончено. Oracle автоматически увеличит размер столбца. Варианты же А, В и
С идентифицируют шаги, требующиеся либо для уменьшения размера
столбца, либо для изменения типа данных этого столбца, и потому являются
неподходящими. (Тема 9.4)
54. В. alter table sales modify product_type varchar2(10);
Объяснение Для увеличения размеров столбца используется команда alter
table modify, показанная в варианте В. Вариант А некорректен, поскольку
он без всякой к тому нужды добавляет в таблицу еще один столбец. Варианты
С и D не годятся, потому что идентифицируют шаги процесса удаления из
таблицы столбца, чего не требуется в поставленном вопросе. (Тема 9.4)
55. В. Столбец-потомок
Объяснение При удалении родительской таблицы общий столбец дочерней
таблицы не удаляется. Поэтому правильным будет ответ В. Вариант А
некорректен, потому что ассоциированные ограничения для родительской таблицы,
скорее всего, будут также удалены при удачснии родительской таблицы.
Кроме того, при удалении родительской таблицы автоматически удаляются
триггеры и индексы для родительской таблицы, что делает ошибочными варианты
ответа С и D. (Тема 9.5)
56.D. create table profits (product_name varchar2(10) primary
key, sale_period varchar2(10) primary key, profit number);
Объяснение Фраза primary key, в которой ограничения первичного ключа
определяются как ограничения для столбца для обоих столбцов таблицы сразу
(PRODUCT_NAME и SALE_PERIOD), как это сделано в варианте D, не
разрешена для баз данных Oracle. Во всех других вариантах показаны допустимые
определения составных ключей. (Тема 10.2)
57.В. alter table sales add constraint ck_sales_01 check (pro-
duct_type in (select product_type from valid_products));
Объяснение При определении допустимых значений для ограничений
проверки по списку не разрешается использовать подзапросы — нее значения
должны быть статическими. Варианты А, С и D идентифицируют
ограничения проверки по списку со статическими значениями и являются
разрешенными в базах данных Oracle. (Тема 10.2)
58. В. Существующие элементы не проверяются на предмет нарушений,
ограничение PK_PRICES_01 активируется, и Oracle немедленно проверяет
выполнение ограничений для вновь вводимых элементов.
336
Глава 9
Объяснение Oracle игнорирует ключевое слово novalidate, поскольку
ограничение не было определено в вопросе как допускающее задержку. Oracle
проверяет на предмет нарушения имеющиеся элементы и находит их.
PK_PRICES_01 не активировано, и Oracle не делает проверку будущих
нарушений, поскольку ограничение не активировано. По этой же причине
ошибочны варианты А, С и D. (Тема 10.2)
59. С. Ограничение внешнего ключа
Объяснение Ограничение внешнего ключа создает зависимости в дочерних
таблицах, что приводит к трудностям при последующем отключении
ограничений первичного ключа в родительских таблицах. Вариант А некорректен,
поскольку ограничение проверки по списку не может создавать отношений
между таблицами. По той же причине не годится и вариант В. И наконец,
ограничение по уникальности также непригодно для создания отношений
между таблицами и потому вариант D не проходит. (Тема 10.1)
60. A. alter table sales modify (unit_prices null);
Объяснение Синтаксис для удаления из таблицы ограничения не-NULL
правильно показан в варианте А. Вариант В некорректен, потому что в нем
определяется, а не удаляется ограничение не-NULL. В вариантах С и D
идентифицирован неподходящий синтаксис для определения возможности появления в
столбцах Oracle значений NULL. (Тема 10.2)
ЧАСТЬ III
Подготовка к экзамену
"Основы администрирования
базы данных ОСА Г9
Глава 9
Ниже приводится перечень заданий по темам и подтемам, включенным в
"Основы администрирования базы данных ОСА I":
1. Компоненты архитектуры Oracle
1.1. Описать архитектуру Oracle и ее основные компоненты.
1.2. Перечислить структуры, которые включает в себя
соединение пользователя с экземпляром Oracle.
2. Oracle Server
2.1. Назвать основные средства администрирования,
имеющиеся в распоряжении администратора базы данных.
2.2. Назвать свойства Oracle Universal Installer (OUI).
2.3. Объяснить преимущества оптимально гибкой архитектуры
(OFA).
2.4. Задать идентификацию файла паролей.
2.5. Перечислить основные компоненты Oracle Enterprise
Manager (OEM) и их применение.
3. Управление экземпляром Oracle
3.1. Создать файлы параметров инициализации и
осуществитьуправление ими.
3.2. Сконфигурировать файл, управляемый Oracle (OMF).
3.3. Запустить и выключить экземпляр.
3.4. Проконтролировать использование диагностических файлов.
4. Создание базы данных
4.1. Описать предварительные условия, необходимые для
создания базы данных.
4.2. Создать базу данных с помощью Oracle Database
Configuration Assistant.
4.3. Создать базу данных вручную.
5. Содержание и использование словаря данных
5.1. Назвать основные компоненты словаря данных.
5.2. Дать определение содержанию и применению словаря
данных.
5.3. Обратиться к словарю данных.
6. Поддержка управляющего файла
6.1. Объяснить, для чего нужен управляющий файл.
6.2. Перечислить содержимое управляющего файла.
6.3. Мультиплексирование и управление управляющим
файлом.
6.4. Управление управляющим файлом с помощью OMF.
6.5. Получить информацию об управляющем файле.
7. Поддержка файлов журнала базы данных
7.1. Объяснить, для чего нужны файлы журнала базы данных.
7.2. Описать структуру оперативных файлов журнала базы данных.
7.3. Ключи управления и контрольные точки журналов.
7.4. Мультиплексирование и поддержка оперативных файлов
журнала базы данных.
7.5. Обеспечить управление оперативными файлами журнала
базы данных с помощью OMF.
8. Управление табличных пространств и файлов данных
8.1. Описать логическую структуру базы данных.
8.2. Создать табличное пространство.
8.3. Изменить размер табличных пространств.
8.4. Выделить место для временных сегментов.
8.5. Изменить состояние табличного пространства.
8.6. Изменить параметры памяти табличных пространств.
8.7. Реализация OMF.
Подготовка к экзамену "Основы администрирования базы данных ОСА Г 339
9. Структура памяти и связи
9.1. Описать логическую структуру базы данных.
9.2. Перечислить типы сегментов и их применение.
9.3. Перечислить ключевые слова, контролирующие
использование пространства блока.
9.4. Получить из словаря данных информацию о структурах
памяти.
9.5. Перечислить критерии разделения сегментов.
10. Управление данными отката
10.1. Объяснить, для чего нужны данные отката.
10.2. Обеспечить автоматическое управление откатом.
10.3. Создать и сконфигурировать сегменты отмены.
10.4. Получить из словаря данных информацию о сегментах
отмены.
11. Описание различных методов хранения данных
11.1. Описать различные типы хранения данных.
11.2. Описать типы данных Oracle.
11.3. Объяснить разницу между расширенным
и сокращенным идентификаторами строки (ROWID).
11.4. Описать структуру строки.
11.5. Создать постоянную и временную таблицы.
11.6. Обеспечить управление структурами хранения в
пределах таблицы.
11.7. Реорганизовать, выполнить усечение и удалить таблицу.
12. Управление индексами
12.1. Перечислить различные типы индексов и их применение.
12.2. Создать различные типы индексов.
12.3. Реорганизовать индексы.
12.4. Удалить индексы.
12.5. Получить из словаря данных информацию об индексах.
12.6. Проконтролировать использование индекса.
13. Поддержание целостности данных
13.1. Установить ограничения на целостность данных.
13.2. Обеспечить поддержку ограничений на целостность.
13.3. Получить из словаря данных информацию об
ограничениях.
14. Управление безопасностью с помощью паролей и управление
ресурсами
14.1. Обеспечить управление паролями с помощью профилей.
14.2. Обеспечить администрирование профилями.
14.3. Проконтролировать использование ресурсов с помощью
профилей.
14.4. Получить из словаря данных информацию о профилях,
управлении паролями и ресурсах.
15. Управление пользователями
15.1. Создать нового пользователя базы данных.
15.2. Внести изменения в существующего пользователя базы
данных и удалить его.
15.3. Проконтролировать информацию о существующих
пользователях.
16. Управление привилегиями
16.1. Описать системные и объектные привилегии.
16.2. Назначить и отменить привилегии.
16.3. Описать возможности аудита.
17. Управление ролями
17.1. Создать и изменить роли.
340
Глава 9
17.2. Обеспечить управление доступностью ролей.
17.3. Удалить роли.
17.4. Использовать предопределенные роли.
17.5. Вывести из словаря данных на экран информацию
о роли.
18. Применение поддержки глобализации
18.1. Выбрать набор символов базы данных и набор
национальных символов для базы данных.
18.2. Задать поведение, отражающее специфику языка,
с помощью параметров инициализации, переменных
окружения и команды alter session.
18.3. Использовать различные типы параметров поддержки
национального языка (NLS).
18.4. Объяснить влияние специфики языка на поведение
приложения.
18.5. Получить информацию о поддержке глобализации.
ГЛАВА 10
Основы архитектуры базы
данных Oracle
342
Глава 10
этой главе мы познакомимся со следующими областями, а
потом и продемонстрируем свои знания по ним:
■ Компоненты архитектуры Oracle
■ Запуск сервера Oracle
■ Управление экземпляром Oracle
■ Создание базы данных Oracle
Чтобы быть хорошим администратором базы данных Oracle и сдать
экзамен "Основы АБД I", необходимо четко представлять себе архитектуру базы
данных Oracle. Действующая база данных Oracle состоит из нескольких
элементов, включая структуры памяти, специальные процессы, которые
ускоряют работу, и механизмы восстановления, которые позволяют администратору
восстанавливать системы после кажущихся неисправимыми ошибок. В
данной главе рассматриваются все свойства Oracle. Тщательно изучите ее,
поскольку приведенные в ней положения закладывают основы для усвоения
материала из оставшейся части книги, экзамена ОСР и работы в качестве
администратора. Данная глава содержит около 20% материала, знание
которого проверяется на экзамене "Основы АБД I"
Компоненты архитектуры Oracle
В данном разделе рассматриваются следующие темы, относящиеся к
архитектуре Oracle:
■ Архитектура сервера Oracle
■ Структуры, которые соединяют пользователей с серверами Oracle
I Этапы обработки запросов, внесения изменений и фиксации транзакций
Сервер базы данных Oracle состоит из многих компонентов. Одни
являются структурами памяти, другие — фоновыми процессами, выполняющими
определенные вспомогательные задачи. Существуют также дисковые ресурсы
с данными для приложений, отслеживающих данные для всей организации в
целом, и специальные ресурсы для восстановления данных из-за различных
ошибок: от неправильного ввода до сбоя диска. Структуры памяти и фоновые
процессы образуют экземпляр Oracle, а экземпляр Oracle вместе с остальными
структурами образует базу данных Oracle. В данном разделе описываются все
компоненты базы данных Oracle, а также действия Oracle, когда пользователь
вводит запросы, операторы модификации данных или операторы языка
манипулирования данными (DML) и сохраняет результаты своей работы в Oracle с
помощью команд commit.
Архитектура сервера Oracle
На рис. 10.1 показаны различные компоненты экземпляра Oracle, в том числе
диск, память и пользовательские процессы. Каждая база данных Oracle, or
самого маленького приложения Oracle, работающего в карманном компьютере,
до информационных хранилищ объемом в несколько терабайт, которые
работают на универсальных ЭВМ и суперкомпьютерах, имеет эти средства, которые
вместе управляют данными. Они позволяют различным приложениям, от
приложений сетевой диалоговой обработки запросов (OLTP) до приложений
7V-уровня для информационных хранилищ, эффективно обрабатывать данные.
Системная глобальная область (SGA): основной компонент
памяти Oracle
Сначала сосредоточимся на компонентах памяти экземпляра Oracle. В Oracle
существует две основные структуры памяти. Первая и самая важная —
системная глобальная область (System Global Area, SGA). Когда администраторы БД
Основы архитектуры базы данных Oracle
343
Рис. 10.1.
Архитектура базы
данных Oracle
Процессы
пользователей
Процесс
прослушивания д
по SQL'Net
-►
Многопоточный
сервер
'Программная глобальная
область
говорят о том, что связанно с памятью, они обычно подразумевают SGA. SGA
включает в себя: буферный кэш, разделяемый пул и буфер журнала базы
данных, а также несколько других элементов, которые мы рассмотрим позже в
этом разделе. Следующие подразделы посвящены первичным компонентам
Oracle SGA.
344
Глава 10
Совет Хотя это и не акцентируется на экзамене ОСР, вы должны знать,
что пул Java и большой пул также являются частями
Oracle SGA.
Буферный кэш Эта структура памяти состоит из буферов, каждый из
которых равен размеру блоку базы данных и в которых хранятся данные,
необходимые для команд языка структурированных запросов (Structured
Query Language, SQL), которые вводятся пользовательскими процессами.
Представьте себе буферный кэш в виде улья, в котором каждая ячейка —
буфер, и все они одного размера. Именно поэтому размер буферного кэша
указывается в файле параметра как число буферов, а не в байтах. Блок базы
данных — неделимый модуль хранения информации в Oracle, в котором
может разместиться несколько строк данных таблицы. У буферного кэша две
цели: повышать производительность повторяемых впоследствии команд
выбора относительно тех же самых данных и позволять пользователям
Oracle быстро изменять данные в памяти. Эти изменения данных Oracle
записывает на диск позже.
Разделяемый пул Разделяемый пул Oracle имеет две обязательные
структуры и одну необязательную. Первый из необходимых компонентов —
библиотечный кэш, который используется для хранения анализируемого текста
команды SQL и плана выполнения команды при многократном
использовании. Второй компонент — словарный кэш, иногда называемый кэшем
строки, который используется для хранения информации, недавно
запрошенной из словаря данных Oracle, например определения таблицы и столбца,
имена пользователя, паролей и привилегий. (Если вы не знаете, что такое
"словарь данных", см. раздел "Дополнительные введения: SYS, SYSTEM и
словарь данных" ниже в этой главе.) Эти два компонента предназначены
для повышения общей производительности Oracle в
многопользовательских средах. Структура дополнительного разделяемого пула содержит
информацию сеанса о пользовательских процессах, относящихся к Oracle.
Когда этот дополнительный компонент будет включаться в SGA? Скоро вы
узнаете об этом.
Буфер журналов базы данных Этот компонент SGA временно сохраняет в
памяти информацию о повторе, которая генерируется командами языка DML,
выполняемыми в пользовательских сеансах, пока Oracle не запишет эту
информацию на диск. К командам языка DML относятся команды update,
delete и insert, выполняемые пользователями. Что такое повтор? Это
небольшое количество информации, создаваемой и хранимой Oracle для
восстановления или повторного выполнения изменений, произведенных в
базе данных с помощью команд insert, update, delete, create, alter и
drop. Если происходит какой-либо сбой, администратор БД может
использовать, информацию о повторе для восстановления базы данных Oracle в
состоянии на момент сбоя.
Программная глобальная область (PGA):
область памяти пользователя Oracle
Второй структурой памяти в экземпляре Oracle является программная
глобальная область (Program Global Area, PGA). PGA поддерживает выполнение
пользовательских процессов, сохраняя информацию, например значения
переменных связывания, области сортировки, и другие аспекты управления
курсором. Почему пользователям нужна своя собственная область для
выполнения? Даже если информацию о синтаксическом анализе для SQL или
процедурного языка/языка структурированных запросов (PL/SQL) можно
получить в библиотечном кэше разделяемого пула, значения, относительно
которых пользователь хочет выполнить команду select или update, не могут
использоваться совместно. PGA нужна для хранения реальных значений
вместо переменных связывания для выполнения команд SQL.
Основы архитектуры базы данных Oracle
345
Чтение данных с диска для пользователей:
серверный процесс
Теперь перейдем к краткому рассмотрению фоновых процессов фона Oracle. В
Oracle постоянно работает несколько типов процессов. Это фоновые, серверные
и сетевые процессы. С точки зрения пользователя самый важный из них —
серверный процесс. Этот процесс выполняет за пользователя перемещение
данных Oracle с диска в буферный кэш, где пользователь может управлять
ими. Существуют два способа установки Oracle, производимой
администраторами БД, для выполнения серверных процессов: с использованием
разделенных серверов и специализированных серверов. В следующих подразделах
рассматриваются основные различия между этими двумя конфигурациями.
Совет Представьте, что серверный процесс Oracle — это джинн из сказки
про Аладдина, потому что ваше желание получить данные Oracle является
приказом для серверного процесса!
Выделенные серверы: один джинн, один хозяин При такой установке
каждый отдельный пользователь, подключившийся к Oracle, получит
собственного джинна, который будет управлять извлечением данных с диска в буферный
кэш. Если к Oracle подключатся 150 пользователей, на них будет приходиться
150 джиннов, которые будут забирать данные с диска и помещать их в
буферный кэш для этих пользователей. Установка с такой архитектурой означает,
что запросы каждого пользователя на поиск данных будут осуществляться
немедленно. Это также означает, что возникнут непроизводительные издержки
дополнительной памяти и процессора компьютера, на котором работает база
данных Oracle, а каждый выделенный серверный процесс будет в зависимости
от рабочей нагрузки и метода доступа простаивать большую часть времени. Но
все же, если аппаратные ресурсы легко доступны, многие администраторы БД
предпочитают именно такую установку из-за высокой общей
производительности.
Разделяемые серверы: один джинн, много хозяев При такой установке
имеется небольшой пул серверных процессов, работающих в Oracle, которые
выполняют запросы на поиск данных от большого числа пользователей.
Несколько пользователей обслуживаются одним серверным процессом. Oracle
управляет этим использованием с помощью сетевого процесса, который
называется диспетчером (dispatcher). Пользовательские процессы назначаются
диспетчеру, диспетчер помещает пользовательские запросы на данные в одну
очередь, а разделяемые серверные процессы выполняют все запросы в данный
момент времени. Это не означает, что во всей базе данных будет только один
процесс диспетчера. Вы сможете сконфигурировать базу данных так, чтобы в
ней было много диспетчеров и много серверных процессов. Такая
конфигурация может уменьшить нагрузку на память и процессор компьютера, на
котором установлена Oracle, а также ограничить время простоя серверного
процесса. И наоборот, в режиме выделенного сервера пользовательскому процессу
требуется время на создание выделенного серверного процесса для каждого
подключения, тогда как в режиме разделяемого сервера они экономят время,
поскольку обслуживаются существующим диспетчерским процессом и
серверным процессом. Именно поэтому в случаях, когда в базе данных большое
число пользователей, а также когда большое число пользователей
устанавливает соединение и разъединяется с базой данных (Internet-базы данных),
предпочтителен многопоточный сервер (multithreaded server, MTS).
Совет Помимо серверных процессов Oracle использует фоновые процессы
для большого числа операций. К ним относятся: процесс записи в базу данных
(DBW0), процесс записи в журнал (LGWR), контрольнная точка (СКРТ),
системный монитор (SMON), монитор процесса (PMON) и др. Мы обсудим
функциональные возможности этих фоновых процессов, поскольку они
касаются других компонентов базы данных и знание этих процессов проверяется
на экзамене "Основы АБД1".
346
Глава 10
Локализация информации о пользовательском сеансе:
разделяемый пул или PGA?
Вернемся к сути поднятого ранее вопроса о дополнительном компоненте
разделяемого пула, в котором хранится информация о пользовательском сеансе в
Oracle. Oracle хранит информацию о сеансе в разделяемом пуле, только если
администратор БД конфигурирует Oracle так, чтобы для обработки
пользовательских запросов на поиск данных использовались разделяемые серверы. Эта
опция известна как архитектура MTS. В противном случае при использовании
выделенных серверов информация о пользовательском сеансе размешается в
PGA.
Закрепление пройденного материала
1. Убедитесь, что понимаете разницу между экземпляром Oracle и базой
данных Oracle.
S. Знание структуры основной памяти в Oracle. Убедитесь, что можете
перечислить ее компоненты для ОСР. Кроме того, необходимо понимание
компонентов PGA.
3. Понимание назначения фоновых процессов в базе данных Oracle. В этом
разделе необходимо назвать по крайней мере два процесса и описать их
функции. LGWR записывает информацию о повторе на диск в фоновом
режиме, a DBW0 периодически записывает блоки данных с буферного
кэша на диск.
Упражнения
1. Вы управляете базой данных Oracle. Какой из следующих вариантов
правильно описывает разницу между экземпляром Oracle и базой данных Oracle?
A. Экземпляр Oracle — сохраненная версия Oracle на диске, тогда как
база данных — работающая версия сервера Oracle.
B. Экземпляр Oracle — фоновые процессы сервера Oracle, тогда как база
данных — выделенная серверу память.
C. Экземпляр Oracle — память и фоновые процессы работающего
сервера Oracle, тогда как база данных состоит из экземпляра и
файлов на диске.
D. Термин "экземпляр Oracle" — синоним термина "база данных
Oracle."
8. Вы управляете базой данных Oracle. Что из следующего перечня не
является компонентом разделяемой памяти сервера Oracle при использовании
выделенных серверов?
A. Буферный кэш
B. Разделяемый пул
С Буфер повтора
D. PGA
3. Вы управляете базой данных Oracle. Какой из следующих вариантов
идентифицирует фоновый процесс, который управляет периодической записью
блоков данных на диск?
A. LGWR В. СКРТ
C. DBWO D. S000
4. Вы конфигурируете базу данных Oracle для пользовательской
деятельности. Какой из следующих вариантов указывает место хранения
информации о пользовательском сеансе при использовании MTS?
Основы архитектуры базы данных Oracle 347
A. Разделяемый пул
B. PGA
C. Буферный кэш
D. Буфер журнала базы данных
Ответы
1. С. 2. D. 3. С. 4. А.
Структуры для установления соединений пользователей
с серверами Oracle
Потратим еще немного времени на рассмотрение нескольких важных сетевых
процессов в Oracle. Первый из них называется прослушивающим процессом
(listener process). Прослушивающий процесс Oracle делает только одно —
прослушивает пользователей, которые пытаются установить соединение с базой
данных Oracle через сеть. Как только пользователь установит соединение с
хост-машиной базы данных Oracle, прослушивающий процесс произведет
одно из следующих действий. Если используются процессы выделенного
сервера, прослушивающий процесс дает Oracle указание сгенерировать новый
выделенный сервер, а затем назначает на этот выделенный сервер
пользовательский процесс. Если используется MTS, прослушивающий процесс отсылает
пользовательский процесс другому процессу, который называется
диспетчерским процессом и о котором уже шла речь. Как только прослушивающий
процесс передаст пользовательское подключение выделенному серверу или
диспетчеру, он больше не задействуется в этом подключении. Он вернется к
обслуживанию новых входящих соединений.
На самом деле термин "запрос от пользователя" (request from a user) более
точен, чем это кажется. Это единственный запрос программного интерфейса,
который является частью команды SQL пользователя. Если база данных
работает в режиме MTS, то когда пользователь делает запрос, диспетчер,
обслуживающий пользовательский процесс, помещает запрос в очередь запросов
(request queue), откуда он забирается следующим доступным процессом
разделяемого сервера. Очередь запросов находится в SGA и совместно
используется всеми диспетчерскими процессами экземпляра. Процессы
разделяемого сервера проверяют общую очередь запросов на поступление новых запросов
и забирают новые запросы по принципу "первым пришел — первым
обслужен" Один процесс разделяемого сервера забирает один запрос из очереди и
делает все обращения к базе данных, необходимые для выполнения этого
запроса. После выполнения запроса сервер помещает ответ в ответную очередь
на вызов диспетчера. Каждый диспетчер имеет свою собственную ответную
очередь в SGA. Затем диспетчер возвращает выполненный запрос в
соответствующий пользовательский процесс. Вот как происходит волшебство
обработки запросов в сервере Oracle, который работает в режиме MTS.
Совет Ниже приводится краткий обзор серверных, фоновых и сетевых
процессов. Серверный процесс обрабатывает пользовательские запросы о
данных. Фоновые процессы — процессы Oracle, которые неявно управляют
некоторыми аспектами работы базы данных. Сетевые процессы используются
для обеспечения сетевой связи между пользовательскими процессами,
работающими на других машинах, и серверными процессами, работающими на
машине, на которой установлена база данных Oracle.
Закрепление пройденного материала
1. Убедитесь, что понимаете разницу между фоновыми, серверными и
сетевыми процессами, которые работают с базой данных Oracle.
348
Глава 10
S. Убедитесь, что понимаете, что при использовании выделенного сервера
или архитектуры MTS различные соединения пользователей с серверами
Oracle устанавливают процедуры.
3. Необходимо знать о производительности при использованиии
разделяемого или выделенного сервера. Необходимо понимать, где следует
использовать сервер MTS, а где — Овыделенный сервер.
4. Необходимо понимать, что потеря прослушивающего процесса не
затрагивает существующие соединения с базой данных, но все же это не позволяет
новым пользователям устанавливать соединения, пока прослушивающий
процесс не будет перезапущен.
Упражнения
1. Вы конфигурируете использование серверов в своей базе данных Oracle.
Какая из следующих команд описывает происходящее после того, как
прослушивающий процесс обнаруживает пользователя, пытающегося
соединиться с Oracle при использовании выделенных серверов?
A. Слушатель порождает новый процесс сервера.
B. Слушатель передает запрос диспетчеру.
С Слушатель передает запрос к LGWR.
D. Слушатель передает запрос к DBW0.
S Вы конфигурируете MTS в своей базе данных Oracle. Какая из следующих
команд описывает происходящее после того, как прослушивающий
процесс обнаруживает пользователя, пытающегося установить соединение с
Oracle при использовании MTS?
A. Прослушивающий процесс порождает новый серверный процесс.
B. Прослушивающий процесс передает запрос диспетчеру.
С Слушатель передает запрос LGWR.
D. Слушатель передает запрос DBW0.
3. Закончите следующее предложение: При сбое прослушивающего процесса
(А) пользователи не смогут (В) с базой данных
Oracle, тогда как (С) пользователей сбой прослушивающего
процесса не коснется.
4. Вы конфигурируете архитектуру сервера своей базы данных Oracle. Какой
из следующих вариантов идентифицирует ситуацию, когда архитектура
MTS предназначается для более эффективного управления, чем
архитектура выделенного сервера?
A. Конфигурации базы данных небольшой рабочей группы
B. Конфигурации Internet базы данных
С Однопользовательские конфигурации
D. Конфигурации на системах с большим объемом доступной памяти
Ответы
1. А 2. В. 3. (А) новые; (В) соединиться; (С) существующих (уже подключенных). 4. В.
Стадии обработки запросов,
изменения и команды commit
Теперь, когда вам известно, как Oracle соединяет пользовательский процесс с
серверным процессом, пора узнать, как Oracle ведет себя, когда пользователю
что-нибудь нужно от сервера, например выборку данных Oracle. Вам уже из-
Основы архитектуры базы данных Oracle
349
вестно большинство основных "игроков", включая серверный процесс,
пользовательский процесс, кэш буфера и библиотечный кэш разделяемого пула.
То есть вам известны все, кроме системы управления реляционными базами
данных Oracle (РСУБД). SQL — функциональный язык программирования, в
противоположность процедурному языку, наподобие COBOL или С. Вы
пишете код, имея в виду желаемый результат, а не процесс, с помощью которого
Oracle должен добиться его. РСУБД транслирует полученный код,
выраженный в командах SQL, в процесс, посредством которого Oracle добьется
желаемого результата.
Этапы обработки запросов
Теперь, когда у нас есть все компоненты обработки запросов Oracle,
посмотрим, как Oracle обрабатывает запросы. Есть несколько способов обработки
команды select в Oracle. Операции, вовлеченные в выполнение как команды
select, так и команд языка DML, относятся к общему шаблону, который
представлен на рис. 10.2. При обработке команды select выполняется
следующий ряд операций:
1. Поиск разделяемого пула. Сначала РСУБД попытается определить,
существует ли копия этой анализируемой команды SQL в библиотечном кэше.
9. Проверка правильности команды. РСУБД выполняет этот шаг, проверяя
синтаксис команды SQL.
3. Проверка правильности источников данных. РСУБД гарантирует наличие
всех столбцов и таблиц, на которые есть ссылки в этой команде.
4. Запрос на блокировку. РСУБД запрашивает блокировку синтаксического
анализа для объектов, на которые есть ссылки в этой команде, чтобы их
определения не изменились во время анализа команды.
Шаги, выполняемые
в Oracle при обработке
команды SQL
Открыть
курсор
I
Анализировать
команду
^ЗГяга^нТЧЩ^?
Выполнить
команду
-—»|
-.#.■%**■ *н$$
Выбрать
значения
из курсора
Выполнено
350
Глава 10
5. Проверка привилегий. РСУБД гарантирует, что у пользователя,
пытающегося выполнить эту команду SQL, достаточно привилегий в базе данных для
ее выполнения.
6. Синтаксический анализ команды. РСУБД создает для этой команды дерево
синтаксического анализа или план выполнения и помещает его в
библиотечный кэш, в основе которого то, что Oracle считает оптимальным
методом выполнения данной команды SQL. Это список операций, которые
РСУБД использует для получения данных. Если для этой команды дерево
синтаксического анализа уже существует, РСУБД может опустить этот шаг.
7. Выполнение команды. РСУБД производит всю обработку данных для
выполнения команды select. Здесь серверный процесс извлекает данные с
диска в буферный кэш.
8. Выборка значений из курсора. Сразу после выполнения команды select все
данные, возвращенные из Oracle, сохраняются в курсоре. Затем эти данные
помещаются в переменные связывания, строка за строкой, и возвращаются
в пользовательский процесс.
По завершении и план выполнения команды, и данные в блоках,
извлеченные с диска, не уходят из библиотечного кэша и буферного кэша
соответственно в течение переменного промежутка времени просто на тот случай, если
тот или иной пользователь захочет выполнить ту же самую команду select. В
многопользовательских средах прикладной системы выигрыш в
производительности достигается каждый раз, когда пользовательские процессы
выполняют ту же самую команду select, потому что РСУБД тратит меньше времени,
анализируя эту команду, а серверный процесс тратит меньше времени,
восстанавливая данные.
Стадии обработки команд языка DML
В этот момент в обработке транзакции в Oracle появляется еще один
дополнительный элемент — сегмент отмены (undo segment). Сегмент отмены является
объектом базы данных в Oracle, который сохраняет старые версии данных,
изменяемых командами языка DML, введенными пользовательским процессом.
Сегменты отмены хранят только старые значения, а не новые; новые значения
хранятся в самих объектах.
Помня это, возвращаемся к обработке команд языка DML. Существует
несколько различий между тем, как Oracle обрабатывает команды select и как
она обрабатывает команды языка DML, например update, Insert и delete.
Хотя вовлеченные в выполнение команд языка DML операции относятся к
тому же самому общему шаблону, что и команды select (см. рис. 10.2), при
обработке команд языка DML выполняется следующий ряд операций:
1. Синтаксический анализ команды. РСУБД создает для этой команды дерево
синтаксического анализа или план выполнения и помещает его в
библиотечный кэш. Это список операций, которые РСУБД использует для
обработки изменений в данных. Если для этой команды дерево
синтаксического анализа уже существует, РСУБД может опустить этот шаг.
S. Выполнение команды. РСУБД производит всю обработку для выполнения
команды языка DML. Для обновления или удаления команды серверный
процесс извлечет данные с диска в буферный кэш, неявно запросит
блокировку данных, подлежащих изменению, а затем изменит указанные данные
в буферном кэше. Блокировка (lock) — это внутренний ресурс Oracle,
который один пользовательский процесс запрашивает перед обновлением или
удалением существующих данных, чтобы другие пользователи не могли
сделать то же самое. Для команд insert серверный процесс извлекает блок с
диска, на котором достаточно места для размещения новой строки данных,
и помещает эту новую строку в блок. Кроме того, выполнение команды
языка DML включает в себя запись старых и новых версий данных в
сегмент отмены (undo segment), запрошенный для этой транзакции. Блоки-
Основы архитектуры базы данных Oracle
351
ровку необходимо запросить в сегменте отмены, чтобы изменения были
также записаны в сегмент отмены.
3. Генерация информации об отмене. Вспомним из предыдущего урока, что в
буфере журнала базы данных хранится информация об отмене или
изменении данных в результате выполнения команд языка DML, вводимых в
пользовательских сеансах. После ввода команд языка DML пользовательский
процесс должен записать элемент отмены в буфер журнала базы данных.
Таким образом, Oracle может восстановить изменение данных, если
впоследствии на диске окажутся поврежденными файлы, содержащие данные
Oracle.
Совет Запрос на блокировку — это как будто бы один пользователь Oracle
сказал остальным пользователям: "Эй! Руки прочь от этих данных! Сейчас
я изменяю их, значит, вы не можете получить их, пока я не сниму
блокировку!" Блокировки могут устанавливаться на уровне строки с помощью
неявных методов, описанных ниже.
Перенос изменений данных из памяти на диск
После выполнения команды языка DML нет необходимости выбирать
значения из памяти, как это делалось для команды select. Однако, как и с
командами select, план выполнения для команд языка DML не уходит из
библиотечного кэша в течение переменного промежутка времени на тот
случай, если другой пользователь попытается выполнить ту же самую команду.
Измененные блоки в буферном кэше теперь считаются недействительными
(dirty), потому что версии в буферном кэше и на диске больше не идентичны.
Эти недействительные блоки также не уходят из буфера, но их необходимо
скопировать на диск, чтобы Oracle не потеряла изменения данных. Кроме
того, в результате изменений данных с помощью команд языка DML новая
информация появляется в буфере журнала базы данных. Выполняя все
изменения данных в памяти, Oracle способна продемонстрировать
быстродействие при выполнении команд языка DML. Это достигается благодаря тому,
что в памяти можно быстрее изменять данные и управлять ими, чем на диске.
Пользователю не приходится ждать, пока измененные данные будут
записаны на диск. Oracle делает это с помощью двух фоновых процессов, DBWO
и LGWR, которые записывают изменения данных из буферного кэша и
буфера журнала базы данных на диск; эти процессы являются асинхронными,
т.е. они происходят уже после того, как пользователь фактически внес
изменения. В следующих разделах мы объясним роль каждого из фоновых
процессов.
Роль DBWO Фоновый процесс DBWO, называемый процессом записи в базу
данных (database writer), записывает недействительные блоки данных из
буферного кэша на диск. Исторически этот процесс называют DBWR, но в более
свежих версиях Oracle этот термин является устаревшим, потому что Oracle
теперь поддерживает работу более чем одного процесса DBWO. Запись
производится в следующих случаях:
Ш Когда серверному процессу требуется создать место в буферном кэше,
чтобы считывать необработанные данные для пользовательских процессов.
И Когда DBWO дается указание записать данные на диск с помощью
процесса LGWR.
■ Каждые три секунды простоя.
И Когда число недействительных буферов достигает порогового значения.
Событие, в результате которого LGWR дает указание DBWO произвести
запись на диск, называется контрольной точкой (checkpoint). Подробнее о
контрольных точках вы узнаете в главе 11. Поскольку Oracle позволяет работать на
хост-машине нескольким процессам DBWO, процесс записи в базу данных
называется DBWO, где 0 может быть любой цифрой между нулем и девятью, по-
352
Глава 10
тому что в Oracle может работать один из нескольких процессов DBWO. Oracle
допускает максимум десять процессов DBWO на один экземпляр.
Роль LGWR Фоновый процесс LGWR, называемый процессом записи в
журнал (log writer), записывает элементы ввода в журнал базы данных из
находящегося в памяти буфера журнала базы данных в оперативные файлы журналов
базы данных на диске. LGWR имеет некоторые другие специализированные
функции, связанные с управлением информации о повторах, о которых вы
узнаете в главе 11. LGWR также дает DBWO указание записывать
недействительные буферы на диск в контрольных точках, о чем упоминалось выше. Буфер
журнала базы данных производит запись в файл журнала базы данных в
следующих ситуациях:
■ Когда фиксируется транзакция
■ При заполнении буфера журнала базы данных на одну треть
■ Когда объем изменений, зарегистрированных в буфере журнала базы
данных, превышает 1 Мбайт
■ Прежде чем DBWO допишет измененные блоки из кэша буфера базы
данных к файлам данных
Этапы обработки команд commit
Ввод команды фиксации транзакции commit завершает текущую транзакцию,
делая постоянными любые изменения данных, которые пользовательский
процесс, возможно, ввел в базу данных Oracle. Команда отката rollback
отменяет изменения данных, возвращая их в то состояние, в котором они
находились до изменения. Сегмент отмены — вот что Oracle предлагает для этой
функциональной возможности. Сохраняя копию старых данных в сегменте
отмены на протяжении транзакции, Oracle может отказаться от любого
изменения, произведенного этой транзакцией, пока не введена команда commit.
Прежде чем переходить к следующим разделам, убедитесь, что вам понятен
следующий важный момент— ввод commit не означает, что измененные
пользовательским процессом данные благополучно записываются на диск
процессом DBWO. Только запрошенные пользователем контрольная точка, время
ожидания или потребность в участке памяти в буферном кэше для блоков
заставят DBWO записать недействительные блоки на диск. Помня об этом,
можно спросить, а из чего именно состоит обработка команды commit? Эти
компоненты приводятся ниже:
■ Отмена блокировки таблицы/строки, запрошенной транзакцией. Команда
commit снимает все блокировки строки (или даже блокировки таблицы,
если они запрашивались), удерживаемые пользовательской транзакцией,
которая вводит команду commit. После этого другие пользователи могут
изменить строки (или таблицы), ранее блокированные этим пользователем.
■ Отмена блокировки сегмента отмены, запрошенной транзакцией. Механизм
блокировки для сегмента отмены тот же, что и для других объектов. Как
только изменение зафиксировано, пространство в сегменте отмены, в
котором находились старая и новая версии данных для этой транзакции,
становится доступным для транзакции другого пользователя. Однако Oracle
ленится и на самом деле не сбрасывает и не удаляет информацию из
сегмента отмены. Вместо этого Oracle просто перезаписывает содержимое
сегмента отмены, когда пространство требуется для другой транзакции.
■ Генерация повтора для зафиксированной транзакции. Как только
происходит фиксация, пользовательский процесс генерирует элемент ввода
повтора, означающий, что все изменения, связанные с этой транзакцией, теперь
зафиксированы пользователем. Фиксация также приводит к переносу
содержимого буфера журнала базы данных (зафиксированных, а также
незафиксированных команд) в файлы журнала базы данных.
Основы архитектуры базы данных Oracle
353
Возникает интересный вопрос: откуда Oracle известно соотношение между
элементами повтора в команде языка DML и транзакциями? Ответ: системные
номера изменении (System Change Numbers, SCN). SCN — это
идентификатор, генерируемый Oracle для каждой используемой пользовательским
процессом транзакции. Каждый элемент ввода повтора указывает выполненное
изменение данных и SCN, с которым связано это изменение. Для команды
commit элемент ввода повтора также идентифицирует SCN и просто отмечает,
что этот SCN был зафиксирован. Таким образом, через SCN Oracle может
легко следить за состоянием каждой транзакции.
Закрепление пройденного материала
1. Вы должны понимать, что SQL позволяет пользователям получать свои
данные через требуемые характеристики этих данных, а не через
процедуру, которую Oracle должна использовать для получения данных. У Oracle
есть свои собственные основные механизмы поиска данных — убедитесь,
что понимаете механизмы OCR.
2. Необходимо знать, в какой момент серверные процессы Oracle фактически
извлекают данные из буферного кэша.
3. Проверьте, можете ли вы описать функцию и назначение сегментов
отмены, блокировок и SCN в Oracle.
4. Убедитесь, можете ли вы описать процесс, выполняемый сервером Oracle
для поддержания изменения данных с помощью языка DML, включая
следующее: как изменения фактических данных и элементы ввода повтора
перемещаются из памяти на диск.
Упражнения
1. Пользователь вводит команду select для базы данных Oracle. Какой из
следующих вариантов описывает шаг, выполняемый Oracle в поддержку
этой команды?
A. Устанавливает блокировку таблицы, в отношении которой сделан запрос.
B. Генерирует повтор для команды.
C. Выбирает данные с диска в память.
D. Записывает изменения на диск.
2. Пользователь вводит команду insert для базы данных Oracle. Какой из
следующих вариантов описывает шаг, выполняемый Oracle в поддержку
этой команды?
A. Вносит изменения в блок данных в памяти.
B. Анализирует команду, если дерево синтаксического анализа уже
существует в разделяемом пуле.
C. Записывает измененные записи в сегмент отмены.
D. Записывает повтор для транзакции в файл данных.
3. Пользователь вводит команду commit для базы данных Oracle. Какой из
следующих вариантов указывает то, что Oracle должна сделать после этого?
A. Сохранить изменения, внесенные в данные в файле данных.
B. Ждать обратной связи от пользователя, чтобы записать повтор на диск.
С Убрать блок данных из буферного кэша, чтобы освободить место для
новых изменений.
D. Записать повтор для указания, что транзакция зафиксирована.
Ответы
1. С. 2. А. 3. D.
354
Глава 10
Запуск сервера Oracle
В этом разделе будут рассмотрены следующие темы, связанные с запуском с
сервера Oracle:
■ Общие административные инструментальные средства базы данных
Ш Универсальный инсталлятор Oracle (Oracle Universal Installer, OUI)
■ Оптимальная гибкая архитектура (Optimal Flexible Architecture, OFA) и ее
преимущества
■ Установка идентификации файла пароля
■ Использование компонентов администратора предметной области Oracle
(Oracle Enterprise Manager, OEM)
За последние несколько лет резко возросло использование
административных инструментальных средств для баз данных Oracle. Эти
инструментальные средства предназначены для упрощения многих аспектов
администрирования базы данных Oracle, включая управление табличным
пространством, экземпляром, памятью, объектом, резервным
копированием^ восстановлением резервной копии. Однако при сертификации ОСР по
Огас1е9 не делалось акцента на использовании административных
инструментальных средств. Вместо этого внимание уделялось важности понимания
внутренней организации сервера, например представлений V$ и ввода
команд из командной строки. Хотя важность этих компонентов Oracle нельзя
недооценить, административные инструментальные средства, например
OEM, сформировались, увеличили свои функциональные возможности и
заняли важное место в деятельности каждого администратора базы данных.
Кроме того, они существенно упрощают вашу работу. Поэтому будьте готовы
столкнуться с некоторыми вопросами, касающимися административных
инструментальных средств на экзамене "Основы АБД I"
Общие административные инструментальные средства
базы данных
Самые общие из административных инструментальных средств базы данных,
которыми вы воспользовались бы как администратор БД в базе данных
Oracle!?/, это различные утилиты конфигурации (configuration assistant). Эти
утилиты используются для создания базы данных, конфигурации работы с сетями
Oracle и повышения версии базы данных до Огас1е9/. Как будет показано в
следующих главах, утилита Database Configuration Assistant используется для
создания шаблонов базы данных и базы данных. Шаблоны являются
определениями баз данных, которые можно создавать и сохранять, а позднее
использовать для создания аналогичных баз данных. Этот инструмент был
усовершенствован и определяет практически все, что нужно для создания базы
данных.
Сетевая утилита конфигурации (Network Configuration Assistant) — еще
один инструмент, который используется для конфигурации и управления
работой Oracle в сетях. Этот инструмент помогает создать файлы listener, ога
и tnsnames. ога. Миграционная утилита (Oracle Migration Assistant)
используется для повышения версии базы данных до Огас1е9/. По возможности мы
будем рассматривать применение этих инструментальных средств в дополнение
к опциям командной строки, которые могут понадобиться для выполнения
административных задач.
И последние из инструментальных средств, которые используются
администраторами базы данных для управления базой данных Oracle,— это
OEM, Oracle DBA Studio и SQL*Plus. Эти инструментальные средства
используются для общих адл'иаистративных задач. Кроме того, SQL*Plus может
применяться конечными пользователями для обращения к базе данных
Oracle и управления данными в ней. В основном мы будем уделять
внимание выполнению общих административных задач в рамках SQL*Plus, испо-
Основы архитектуры базы данных Oracle
355
льзуя команды интерфейса командной строки (Command-Line Interface,
CLI), а не процессы графического интерфейса пользователя (Graphical User
Interface, GUI).
Закрепление пройденного материала
1. Проверьте, можете ли вы назвать административные инструментальные
средства, используемые администратором БД для управления базой
данных Oracle.
2. Помните, что основными административными инструментальными
средствами для решения общих административных задач, стоящих перед
администратором БД, являются OEM (графический пользовательский
интерфейс) и SQL*Plus (интерфейс командной строки).
Упражнения
1. Вы управляете базой данных Oracle. Какое из следующих
инструментальных средств вы использовали бы для управления базой данных через
команды, введенные в командной строке?
A. Database Configuration Assistant
B. SQL*Plus
С Network Configuration Assistant
D. Enterprise Manager
2. Назовите инструмент управления базой данных, позволяющий создать
новую базу данных^ помощью шаблона: .
3. Назовите файл, которым можно управлять через Oracle Network
Configuration Assistant: .
Ответы.
1. В. 2. Database
Configuration Assistant 3.
или tnsnames.ога, или sqlnet.ora
listener
ora.
OUI
OUI — универсальный инструмент Oracle, позволяющий сделать инсталляцию
программного обеспечения Oracle простой, интерактивной и осуществить ее с
помощью мастера. Интерфейс OUI одинаков на всех платформах
операционных систем, так как использует оперативные средства Java, позволяющие
применять его на многих платформах.
Первое, что вы, несомненно, заметите при инсталляции базы данных
Oracle, — множество версий Oracle для различных хост-систем, которые теперь
входят в OUI. На рис. 10.3 показано, как OUI работает в окружении Windows.
Однако важно отметить, что та же версия Oracle Universal Installer и Packager,
используемая в окружении Windows, выглядит и работает точно так же на
других платформах операционных систем.
Совет На первом экзамене по основам ОСР DBA, по-видимому, будет
мало вопросов по OUI, но все равно вы должны представлять себе его
возможности.
Свойства OUI
Ниже приводится перечень свойств OUI:
■ С Oracle Universal Installer и Packager приятно работать, и они могут
помочь при установке программного обеспечения Oracle на любом шаге это-
356
Глава 10
Установка Oracle с
помощью Oracle
Universal Installer
и Packager
File Locations
source...
Ente; the *ull path of Ле file tepressntmg the produces) you wwt to irstall
Path: DlSTAGE\PR DUCTS JAF
B-owse
Destination...
Enter or select an Otarle Home пггге and its full path
Name ц _ORACLE_HOME
Path: c ^£169,
Browse
^
Айои! Oracle Universal installer
D
Ext
I Help mm
laswasw
го процесса. Некоторые из новых свойств этого интерфейса включают в
себя возможность автоматической инсталляции ПО базы данных Oracle,
клиентского ПО, а также ПО управления и интеграции.
Ш OUI не только устанавливает ПО базы данных, но и предоставляет
возможность создавать разные типы баз данных с помощью утилит
конфигурации. Это будет рассмотрено подробнее в последующих разделах.
Ш Допускает автоматическую инсталляцию ПО,если вы определите
ответный файл для неинтерактивной установки продуктов Oracle на
компьютере. Ответный файл содержит информацию и изменяемые параметры,
которые требуются ОШ для завершения инсталляции ПО Oracle.
■ Отслеживает собственную работу в системном журнале, в котором
указываются все операции Oracle Universal Installer и Packager.
Инсталляция программного обеспечения Oracle9i
Следует иметь представление о некоторых вопросах, касающихся
инсталляции. ПО Oracle9i — большое приложение, которое поставляется на трех
компакт-дисках и требует не менее 1 ГБайт на жестком диске только для
прикладного программного обеспечения. Кроме того, в системах UNIX придется
многократно выполнять команды mount и unmount для устройства чтения
компакт-дисков, поскольку Oracle при инсталляции переходит с одного
компакт-диска на другой. В брошюре, прилагаемой к дистрибутивным
компакт-дискам с ПО Огас1е9/, разъясняется, как выполнить этот процесс.
Например, следующий блок кода показывает, как эта команда используется для
нескольких операционных систем:
# HP-UX
nohup /usr/sbin/pfs_mountd 6
nohup /usr/sbin/pfsd ь
/usr/sbin/pfs_mount -t rrip -x unix /def/dsk/c5t2dO/SD_CDROM
# IBM AIX
mount -r -v cdrfs /dev/cdO /cdrom
t SuSE Linux
mount -t iso9660 /dev/cdrom /cdrom
# SPARC/Solaris
mount -r -F hsfs /dev/dsk/c0t6d0s2 /cdrom
Основы архитектуры базы данных Oracle
357
Кроме того, необходимо иметь представление о следующих шагах, чтобы
демонтировать устройство чтения компакт-дисков для выброса текущего
диска и его замены следующим по требованию Oracle:
1. Для возвращения к подсказке оболочки нажмите RETURN в окне telnet
или xterm.
2. Для возвращения в корневой каталог напечатайте cd /.
3. Напечатайте su и нажмите RETURN. Это даст вам привилегии root,
необходимые для демонтирования устройства чтения компакт-дисков перед
выбросом компакт-диска. Вам понадобится пароль для root, чтобы стать
привилегированным пользователем. Если в вашей организации у вас еще
нет этой привилегии, обратитесь к системному администратору.
4. Напечатайте unmount/cdrom, чтобы демонтировать устройство чтения
компакт-дисков. Если вы пробуете сделать это, будучи
зарегистрированным как oracle, то, вероятно, получите сообщения об ошибке,
указывающие, что устройство занято. Тогда возвращайтесь к шагу 3.
5. Выньте текущий компакт-диск из устройства чтения компакт-дисков и
замените его диском, запрошенным OUI.
6. Введите команду mount, соответствующую вашей системе
в предыдущем блокеО кода.
7. Вернитесь в OUI и нажмите ОК для продолжения.
Пользователям Oracle в Windows не придется волноваться, так как в этих
окружениях смена компакт-дисков при инсталляции обычное дело. Как и для
всех баз данных Oracle, необходимо иметь по крайней мере три отдельных
дисковода, выделенные под ресурсы Oracle. Для инсталляций больших
предметных областей потребуется по крайней мере 6 или 7, а возможно, и 20—30
дисководов в зависимости от того, для какого рода работ предназначается база
данных Oracle.
Установка Огас1е9/ Enterprise Edition на менее мощные машины может
оказаться затруднительной из-за ограничений памяти, даже если выполнять
рекомендации Oracle о наличии 128 Мбайт оперативной памяти (RAM) как
минимум. В действительности на хост-машине должно быть доступно 256—512
Мбайт оперативной памяти, и даже тогда процесс инсталляции будет
медленным, так как OUI работает полностью в окружении Java Virtual Machine.
Однако позднее вы можете изменить конфигурацию Oracle для минимизации
объема памяти, требуемого базой данных.
Для сокращения числа проблем при инсталляции Огас1е9/ на менее
мощных машинах предлагаем несколько дополнительных советов. На экране
мастера можно включить переключатель Minimal Installation для указания
желаемого типа инсталляции Огас1е9/, требующего меньшего объема памяти.
Это хороший выбор для установки Огас1е9/ на машинах с объемом
оперативной памяти 256—384 Мбайт. Иначе при выполнении типовой инсталляции
придется увеличить реальную память машины, на которой установлена база
данных Oracle как минимум до 512 Мбайт RAM. При запуске OUI
происходит следующее:
■ Вас спросят, хотите ли вы установить ПО Enterprise или Standard Edition
или предпочитаете установку компонентов программного обеспечения по
выбору пользователя.
■ Затем вас спросят, хотите ли вы установить только ПО, или выполнить
общую инсталляцию (установить ПО и предварительно
сконфигурированную базу данных), или выполнить инсталляцию с определенным типом
базы данных. Базы данных создаются во время инсталляции с помощью
инструмента Configuration Assistant.
Ш Вам зададут вопросы о том, куда установить ПО, и если вы хотите создать
базу данных, то запросят название базы данных и местоположение файлов
базы данных.
358
Глава 10
■ Если выбрана опция Custom Installation, вас попросят выбрать
компоненты, которые вы хотите установить. Убедитесь, что не забыли выбрать OUI.
■ Будет вызван Database Configuration Assistant, который поможет в
создании базы данных. Затем будет вызван Oracle Network Configuration
Assistant, который создаст необходимые файлы сетевой конфигурации и
запустит прослушивающий процесс. Если вы устанавливаете в окружение
UNIX, вас попросят запустить файл root. sh для обработки.
Журнал инсталляции
OUI создает каталог oralnventory в первый раз, когда он запускается для
"инвентаризации" устанавливаемых им продуктов. ОШ создает в этом каталоге
файл installActions.log, в котором хранится журнал недавней
инсталляции. В UNIX местонахождение этого каталога хранится в файле orainst. loc.
Неинтерактивная инсталляция
Вы можете выполнить неинтерактивную инсталляцию ПО Oracle9/, снабдив
OUI ответным файлом. OUI использует информацию из ответного файла для
ответов на вопросы Installer и выполняет инсталляцию. Подробнее об этом
см. в документации по инсталляции Oracle, которая поставляется с
дистрибутивами.
Совет Информация для установки Oracle, относящаяся к определенной
операционной системе, на экзамене ОСР не проверяется. Однако, прежде
нем сдавать первый экзамен ОСР DBA Fundamentals, следует попытаться
установить Oracle9i хотя бы один раз, чтобы получить практический
опыт, необходимый для администрирования базы данных.
Закрепление пройденного материала
1. Необходимо понимать назначение OUI и его отличия от версий Oracle
Installer, которые Вы, возможно, использовали в Огас1е8/ или более ранних
выпусках базы данных Oracle.
2. Убедитесь, что вам понятны ведущие системные требования,
предъявляемые Огас1е9/ к вашей организации, прежде чем повышать версию до
Oracle9/.
3. Необходимо знать основные компоненты OUI, требуемые для
неинтерактивной инсталляции, и где искать информацию, которую Oracle вносит в
журнал во время инсталляции.
Упражнения
1. Назовите каталог, который OUI использует для хранения журнала
инсталляции: .
2. Закончите следующее предложение: OUI работает в рамках
(три слова).
3. Назовите файл, который вы использовали бы, если бы хотели, чтобы ОШ
работал в автоматическом режиме инсталляции: (два
слова).
Ответы
1. oralnventory. 2. Java Virtual Machine 3. Ответный файл.
Основы архитектуры базы данных Oracle
359
Преимущества оптимальной гибкой архитектуры (OFA)
Как уже говорилось в этой главе, базы данных Oracle состоят из многих
различных файлов, постоянно находящихся в пределах хост-системы. Некоторые
из этих файлов относятся к прикладному программному обеспечению, другие
используются для сохранения фактических данных в базе данных. Остальные
используются для управления базой данных. Поскольку Oracle входит в
сложный и мощный программный продукт, администраторы БД сталкиваются с
многочисленными проблемами при определении оптимального способа
компоновки ПО Oracle, базы данных и административных файлов в хост-системах
для эффективного администрирования баз данных Oracle. В ответ на это
корпорация Oracle опубликовала спецификацию, идентифицирующую
стандартную конфигурацию файловой системы, которую администраторы БД могли
бы использовать для размещения файлов рабочей системы базы данных
Oracle. Основная идея заключалась в том, что, если бы администраторы БД
следовали этим стандартам для каждой базы данных, используемой в организации,
другим было бы намного проще найти, где находятся компоненты файловой
системы, и им не пришлось бы выискивать каждый компонент. В результате
появился стандарт Oracle, названный оптимальной гибкой архитектурой
(Optimal Flexible Architecture, OFA). А теперь рассмотрим OFA более подробно.
Что такое OF А?
OFA — промышленный стандарт, определяющий установку ПО Oracle и базы
данных. OFA обеспечивает максимальную гибкость при поддержке
многочисленных версий ПО Oracle и предоставляет отдельный прослушивающий
процесс для поддержки экземпляров Oracle, способных работать под различными
версиями ПО Oracle. Так мы подходим к понятию ORACLE_HOME.
ORACLE_HOME соответствует окружению, в котором работают продукты
Oracle. Окружение могло бы быть местоположением установленных файлов
продуктов (/uOl/app/oracle/product/9.0.1 для UNIX или C:\oracle\ora90 в
Windows) или переменной PATH, указывающей на местоположение двоичных
файлов, и в случае Windows NT — на элементы системного реестра, сервисные
имена и группы программ. На рис. 10.4 приводится пример каталогов
файловой системы, расположенной в соответствии с OFA.
/и02/
oradata/
dbOl/
systemOl .dbf
controlOl.ctl
redoOl 01 .rdo
db02/
systemOl .dbf
controlOl.ctl
redo0101.rdo
/u03/
oradata/
dbOl/
usersOl.dbf
control02.ctl
redo0102.rdo
db02/
toolsOl .dbf
control02.ctl
redo0102.rdo
Некоторые преимущества использования OFA
OFA стала спасением для многих администраторов БД, стремящихся свести к
минимуму головную боль, которую доставляет поддержка. Разберемся, почему
Рис. 10.4.
0FA
360
Глава 10
мы стали бы использовать OF А, а не просто придумывать свои собственные
организационные стандарты для размещения базы данных:
■ OFA предназначена для организации большого числа файлов данных базы
данных и программного обеспечения Oracle на дисках для улучшения
работы базы данных и сокращения конкуренции за устройства ввода-вывода
среди дисков, на которых размещена база данных.
■ OFA предназначена для обеспечения достаточной гибкости, облегчающей
рост баз данных.
■ OFA поддерживает непротиворечивые соглашения об именах файлов базы
данных. Это дает возможность администратору БД четко отличать файлы
данных, управляющие файлы и другие файлы, которые принадлежат
одной базе данных, от других. OFA также помогает в связывании файлов
данных с соответствующими им табличными пространствами.
Ш Сохраняя отдельно содержимое табличного пространства, OFA снижает
фрагментацию и конкуренцию при вводе-выводе. Возьмем, например,
разделение таблиц и индексов в разные табличные пространства. Это
обеспечивает гибкость перемещения табличного пространства на
различные дисководы в случае возрастания конкуренции за ввод-вывод.
Ш OFA поддерживает несколько местоположений ORACLE_HOME. Это
позволяет выполнять несколько версий Oracle одновременно. Например,
можно иметь экземпляр базы данных, работающий на версии 8.1.7, и
одновременно еще один экземпляр базы данных, работающий на версии
9.0.1, что не будет причиной сбоя по отношению друг к другу.
■ OFA позволяет иметь один прослушивающий процесс, порождающий
подключения к базам данных из нескольких начальных каталогов с
программным обеспечением Oracle.
■ OFA отдельно хранит информацию администрирования каждой базы данных.
Закрепление пройденного материала
1. Убедитесь, что можете дать определение OFA и объяснить ее преимущества
для администратора БД и вашей организации.
2. Необходимо знать, что означает ORACLE_HOME касательно окружений,
в которых работает база данных Oracle.
Упражнения
1. Вы реализуете Oracle в своей организации. Какой из следующих вариантов
идентифицирует свойство OFA?
A. OFA собирает воедино программное обеспечение, базу данных и
административные файлы в одной области, и поэтому
администраторам БД легко определить их местонахождение.
B. Использование OFAl позволяет администраторам БД определить
собственную компоновку файловой системы, используя соглашения
об именовании для упрощения управления базами данных Oracle.
С Использование OFA упрощает поддержку, стандартизируя
компоновки файловой системы для всех инсталляций Oracle.
D. OFA собирает все объекты базы данных, например таблицы и
индексы, в одно табличное пространство, поэтому администраторам
БД легче управлять ими.
2. Закончите следующее предложение: Использование OFA является
при создании, конфигурации и управлении базами данных
Oracle.
Основы архитектуры базы данных Oracle
361
3. Закончите следующее предложение: При конфигурации базы данных
Oracle на хост-системе OFA минимизирует конкуренцию (А) ,
потому что разные (В) могут размещаться на разных (С)
Ответы
1. С. 2. необязательным 3. (А) ввода-вывода; (В) табличные пространства; (С) дисках
Настройка аутентификации
с помощью файла паролей
То, как вы планируете поддерживать создаваемую базу данных Oracle, в
значительной степени определяет настройку Oracle для управления
аутентификацией администраторов. Аутентификация требует, чтобы администратор БД
обеспечил для выполнения административных задач пароль на вход в
компьютер, на котором установлена БД Oracle, сама база данных или они обе.
Существуют два метода обеспечения аутентификации администраторов:
аутентификация с помощью операционной системы и с помощью файла паролей.
Если вы планируете устанавливать соединение с хостом БД Oracle через
telnet, xterm или клиент Windows, например Citrix Metaframe, для
управления базой данных, вам подойдет аутентификация с помощью операционной
системы. Но если вы планируете управлять сайтом с помощью программного
обеспечения на настольном компьютере, например Enterprise Manager,
следует установить аутентификацию с помощью файла паролей.
Еще одна приятная особенность файла паролей заключается в том, что он
позволяет нескольким администраторам управлять базами данных, причем у
всех будут разные уровни управления. Например, в такой организации
младший администратор БД занимается резервными копиями и созданием
пользователей, а не запуском и выключением экземпляра. Файлы паролей дают
возможность организации иметь группу администраторов БД с разным уровнем
управления на машине.
Новые знакомые: SYS, SYSTEM и словарь данных
Итак, нам предстоят новые знакомства: SYS и SYSTEM — пользователи,
которые создаются Oracle при установке базы данных. Каждый имеет свой
собственный пароль по умолчанию. Заданный по умолчанию пароль для SYS —
change_on_install, а для SYSTEM — manager. He забудьте защитить
пароли для обоих этих пользователей, изменив их после установки Oracle. Эти два
привилегированных пользователя могут управлять большинством свойств
базы данных Oracle. SYS важнее SYSTEM, так как от SYS зависит обладание
всеми системными таблицами Oracle, из которых получается словарь данных.
Словарь данных Oracle — это системный ресурс с информацией о базе
данных, начиная с принадлежности объектов пользователям до параметров
настройки, параметров инициализации, контроля производительности и т.д..
Существуют две основные категории представлений базы данных Oracle:
показывающие информацию об объектах базы данных и отражающие
производительность. Представления, дающие информацию об объектах, — это
представления словаря данных. Представления, дающие информацию о
производительности, — это представления производительности. Установка и
использование словаря данных подробно рассмотрены в главе 11.
Аутентификация с помощью операционной системы
Для давних приверженцев UNIX аутентификация с помощью операционной
системы окажется старым знакомым, наподобие текстового редактора vi и
оболочки Когп. Поэтому основной темой обсуждения этого способа
аутентификации станет прежде всего ее реализация в UNIX. В действительности, та-
362
Глава 10
кая аутентификация имеет мало реальных преимуществ и много недостатков
по сравнению с методом аутентификаци и с помощью файла паролей. Ее
основное преимущество — простая регистрация в Oracle с помощью черты с
наклоном вправо (/), как показано ниже:
««авав» UNIX(r) SYSTEM V TTYP01 (23.45.67.98)
Login: bobcat
Password:
User connected. Today is 12/17/99 14:15:34
[companyx] /home/bobcat/> sqlplus /
SQL*PLUS Version 8.1.7.0.0
(c) 2001 Oracle Corporation(c) All rights reserved.
Connected to Oracle9i Enterprise Edition 9.0.1 Production
With the Java option.
SQL>
Аутентификация с помощью операционной системы имеет много
недостатков. С одной стороны, чтобы использовать Oracle, необходимо иметь
регистрационное имя на компьютере. Когда это может стать проблемой?
Например, вы не намерены делать приглашение на ввод команды на
хост-машине доступным для вашей базы промышленной системы, насчитывающей
свыше 10000 пользователей. Однако аутентификация с помощью
операционной системы может прекрасно подойти для среды разработки и
испытательной среды.
Чтобы использовать такую аутентификацию, до установки ПО Oracle в
операционной системе следует создать специальную группу с именем dba.
Затем, после установки и конфигурации Oracle, можно регистрироваться в
операционной системе через Telnet как пользователь, принадлежащий группе dba
(например, владелец ПО Oracle). Оттуда вы запускаете SQL'Plus в режиме
строки и после ввода имени соединения в виде команды sysdba и
соответствующего пароля выполняете операции запуска и отключения. Ключевое слово
sysdba обозначает набор привилегий, используемых для администрирования
баз данных Oracle, включая возможность запуска и выключения базы данных.
В приведенном ниже блоке демонстрируется его простое применение:
ЁШВ^Ш SQL> connect sys as sysdba
Password:
Connected.
Совет Администраторам базы данных Oracle старой закалки, знакомым с
командой connect internal, следует знать, что она больше не
поддерживается в Отас1е9. Вместо нее следует использовать sysdba.
Во время инсталляции UNIX Oracle создает определенные роли
операционной системы. Эти роли — osoper и osdba. Их следует предоставлять тем
пользователям операционной системы, которые являются операторами базы
данных (OSOPER) или администраторам и базы данных (OSDBA). База
данных эти роли операционной системы не предоставляет. Однако существуют
две эквивалентные привилегии Oracle, обеспечивающие те же самые
функциональные возможности. Это sysoper и sysdba. Они предоставляются от базы
данных Oracle.
Существует ряд небольших различий между osoper и sysoper, а также
между osdba и sysdba, которые вы сможете использовать в своих интересах-
для выполнения ролей и обязанностей администратора базы данных. Роль
osoper и привилегия sysoper позволяют запускать и останавливать
экземпляр, монтировать и открывать базу данных, копировать ее,
инициализировать архивирование журналов базы данных, инициализировать
восстановление базы данных и сводить обращение к базе данных к режиму сеанса с
ограничениями. Sysoper и sysdba предлагают такие привилегии, как
osoper и sysoper, и добавляют возможность выполнять все привилегии
системы Oracle и управлять ими, включая привилегию create database, и все
привилегии, необходимые для синхронизируемого неполного
восстановления базы данных. Очевидно, что в конечном счете osoper или sysoper
предоставляется администратору БД для того, чтобы он мог отвечать за работу
базы данных.
Основы архитектуры базы данных Oracle
363
Совет Реализация аутентификации с помощью операционной системы в
Oracle зависит в значительной степени от используемой операционной
системы. Поскольку на первом экзамене по основам ОСР DBA нет вопросов,
связанных с использованием определенной операционной системы, здесь они
не рассматриваются. Если вы хотите узнать больше об аутентификации с
помощью операционной системы, обратитесь к соответствующему
руководству для администратора Oracle no определенной операционной системе.
Некоторые параметры инициализации, которые следует знать
для аутентификации с помощью операционной системы
Чтобы сконфигурировать аутентификацию с помощью операционной
системы, после первоначального создания базы данных необходимо задать
REMOTE_LOGIN_PASSWORDFILE = NONE. Это позволит только
запускать и останавливать базу данных в сеансе работы с терминалом на машине,
фактически являющейся хостом базы данных Oracle, или с консоли этой
машины. В Огас1е9/ этот параметр по умолчанию задается как NONE.
Специальные примечания для пользователей Windows
При установке аутентификации с помощью операционной системы в Windows
следует выполнить следующие дополнительные шаги:
1. Создайте новую местную группу пользователей Windows NT с именем
ORA_iS7D_DBA и QTHA_SID_QYER, соответствующую определенному
экземпляру, или ORA_DBA и ORA_OPER, которая не привязана к
определенному экземпляру.
2. Добавьте к этой группе пользователя операционной системы Windows NT.
При обращении к этому домену автоматически подтверждается, что вы —
санкционированный администратор базы данных.
3. Убедитесь, что файле sqlnet. ora есть следующая строка:
SQLNET.ADTHENTICATION_SERVICES = (NTS).
4. Задайте параметр REMOTE_LOGIN_PASSWORDFILE в файле init. ora
как NONE.
5. Установите соединение с базой данных, имея привилегию sysdba или
sysoper:
SQL> CONNECT JASON AS SYSDBA
Password:
Connected.
Аутентификация с помощью файла паролей
Oracle предлагает еще один метод подтверждения администраторов базы
данных — файл пароля. Для первого экзамена знание этой опции гораздо важнее,
чем знание аутентификации с помощью операционной системы.
Администратор БД создает файл паролей, и в нем хранятся пароли для всех остальных,
допущенных к управлению Oracle. Файл паролей создается утилитой ORAPWD.
Название этого исполняемого файла зависит от операционной системы.
Например, в UNIX и Windows он называется orapwd.
Выполняя ORAPWD, вы передаете три параметра: FILE, PASSWORD и
ENTRIES. Чтобы определить, что задать для FILE, файл паролей обычно
помещается в $ORACLE_HOME/dbs и называется orapwsid.pwd, т.е. имя
вашей базы данных заменяется на sid. В отношении PASSWORD следует знать,
что, задавая пароль для файла пароля, вы одновременно назначаете пароль для
входа в Oracle как SYS. Позднее, если администратор БД установит
соединение как SYS и введет alter user name, указанное командой password,
пароль для SYS и файл паролей изменяются. Параметр ENTRIES определяет
число пользовательских входов, допустимое для файла паролей. Будьте
внимательны, потому что впоследствии не сможете ничего добавить, не удалив или
364
Глава 10
не обновив файл паролей, что довольно рискованно. Фактическое
выполнение ORAPWD из командной строки Windows может выглядеть следующим
образом:
ВМДДИ D:\oracle\bin\orapwd FILE=D:\oracle\dbs\orapworgdb01.pwd
PASSWORD-jason ENTRIES-5
В UNIX это может выглядеть так:
/home/oracle orapvd \
FILE-/u01/app/oracle/product/9.О.1/dbs/orapwdorgdbOl.pwd
PASSWORD-jason ENTRIES-5
Чтобы обеспечить административный доступ к базе данных, после создания файла
пароля необходимо выполнить еще ряд действий. Сначала задайте значение для
параметра REMOTE_LOGIN_PASSWORDFILE в файле параметров initsidora. Этот
параметр принимает значения попе, shared и exclusive. Значение попе означает,
что база данных не позволит устанавливать привилегированные сеансы поверх
незащищенных подключений. При аутентификации с помощью операционной системы
REMOTE_LOGIN_PASSWORDFILE задается как попе, что предотвращает удаленное
администрирование базы данных. Задание REMOTELOGINPASSWORDFTLE как
shared означает, что только SYS может войти в Oracle для удаленного выполнения
административных функций. И наконец, задание REMOTE_LOGrN_PASSWORDFILE
как exc lu s ive означает существование файла паролей, и любая комбинация
пользователь/пароль из файла пароля может удаленно регистрироваться в Oracle и управлять
этим экземпляром. Если задано это значение, администратор БД может использовать в
Oracle команду create user для создания пользователей, добавляемых к файлу
паролей, и предоставления им системных привилегий sysoper и sysdba. После этого
пользователи могут регистрироваться в базе данных под своим именем со всеми
привилегиями администратора. Кроме того, EXCLUSIVE указывает, что только один
экземпляр может использовать файл паролей и что файл паролей содержит названия,
отличные от SYS. SHARED указывает, что несколько экземпляров могут использовать
файл пароля. Единственным пользователем, который распознается файлом пароля,
является SYS.
После создания файла паролей с помощью утилиты ORAPWD и
присвоения параметру REMOTE_LOGIN_PASSWORDFILE значения exclusive для
удаленного управления базой данных администратор БД может установить
соединение с базой данных как пользователь с привилегиями sysdba, как
показано ниже:
юм,*а SQL> CONNECT ays AS SYSDBA;
Password:
Connected.
Совет В отношении файлов паролей следует помнить два важных
момента. Во-первых, чтобы узнать, какие пользователи находятся в файле
паролей базы данных, используйте представление производительности
V$PWFILE_USERS (подробнее словарь данных рассмотрен в главе 11).
Во-вторых, любой объект, созданный всеми, кто зарегистрировался как
sysdba или sysoper, будет принадлежать SYS.
Местоположения по умолчанию для файла паролей
То, где файл паролей находится по умолчанию, зависит от операционной
системы на машине, являющейся хостом для базы данных Oracle. В UNIX файлы
пароля обычно расположены в каталоге $ORACLE_HOME/dbs. В Windows файл
пароля обычно расположен в каталоге %ORACLE_HOME%\DATABASE.
Местоположение не по умолчанию для файла паролей можно указать в системном
реестре Windows с ключом ora_sid_pwfile. Опция установки по выбору
(Custom Installation) позволяет установить пароль во время инсталляции.
Закрепление пройденного материала
1. Следует помнить о существовании двух методов аутентификации
администраторов в Oracle: с помощью операционной системы и файла пароля.
Основы архитектуры базы данных Oracle
365
Надо знать, как установить и использовать аутентификацию с помощью
файла паролей.
Я. Учтите, что на первом экзамене в основном проверяется умение
использовать аутентификацию с помощью файла паролей.
3. Помните, что параметр REMOTE_LOGIN_PASSWORDFILE из файла
init.ora используется для конфигурации аутентификации с помощью
файла паролей, а утилита ORAPWD — для фактического создания файла
паролей.
4. Необходимо понимать, что такое пользователи SYS и SYSTEM и каково их
назначение в архитектуре базы данных Oracle.
Упражнения
1. Вы конфигурируете применение файла паролей для управления базой
данных Oracle. Вы хотите установить его так, чтобы администраторы БД,
перечисленные в файле пароля, смогли управлять одной базой данных.
Какой из следующих вариантов указывает соответствующую установку
REMOTE_LOGIN_PASSWORDFILE в файле init.ora?
A. NONE В. SHARED
C. EXCLUSIVE D. ORAPWD
2. Вы создаете файл паролей в Oracle. Какой из следующих вариантов
указывает, как задать эту команду, если вы хотите.чтобы ваш файл пароля огар-
wdORCL.pwd, расположенный в каталоге /uOl/app/oracle/database,
позволил подключаться и управлять базой данных максимум ста другим
администраторам БД?
A.orapwd directory=/u01/app/oracle/database
file=orapwdORCL.pwd
B. orapwd file=/u01/app/oracle/database/orapwdORCL.pwd
password=oracle entries=100
С orapwd file=/u01/app/oracle/database/orapwdORCL.pwd
entries=100
D. orapwd file=orapwdORCL.pwd password=oracle
entries=100
3. Вы выполняете утилиту ORAPWD, чтобы сгенерировать файл пароля в
Oracle, установив password=f iitz26. Какой из следующих пользователей
получит пароль, заданный как f ritz26?
A. OUTLN
B. SYS
С SYSTEM
D. Ни один, параметр PASSWORD не используется для идентификации
пользователя, выполняющего ORAPWD для создания файла паролей
Ответы
1. С. 2. В. 3. В.
Компоненты OEM
OEM представляет собой набор программ приложений, позволяющих
управлять вашей базой данных Oracle в графическом интерфейсе пользователя
(GUI). Почти все, что вы можете сделать из SQL'Plus, делается из этого
интерфейса при условии, что вы настроили файл паролей на удаленное админи-
366
Глава 10
стрирование базы данных. Подробнее о том, как это сделать, говорится в
следующем разделе. Если вам не устанавливали файл пароля для удаленного
управления базой данных Oracle, вы не можете запустить и выключить базу
данных Oracle с помощью OEM, но можете практически все остальное.
Администрирование базы данных — вещь непростая, но использование
доступных в OEM административных инструментальных средств может многое
упростить в управлении базой данных. OEM обычно запускается с рабочего
стола. Допустим, вы используете Windows, тогда есть разные варианты поиска
компонентов OEM после нажатия кнопки "Пуск" Цепочка поиска Пуск |
Программы | Oracle | Enterprise Manager позволяет указать имеющиеся в вашем
распоряжении инструменты как часть OEM. На рис. 10.5 показана консоль
OEM с кнопочной панелью Applications для обращения к любому из
административных приложений, доступных в OEM. Ниже перечислены приложения,
доступные для OEM, наряду с кратким описанием их использования:
■ Мастера баз данных (Database Wizards) Используются для резервного
управления, организации данных, анализа и т.д.
■ Пакет управления изменениями (Change Management Pack) Содержит
инструментальные средства для управления изменениями
Консоль OEM
Пакет приложений базы данных (Database Applications Pack) Этот пакет
содержит инструментальные средства поддержки приложений базы данных,
самым важным из которых является SQL*Plus Worksheet — графическая
версия популярного инструмента SQL*Plus.
Диагностический пакет (Diagnostic Pack) Этот пакет содержит
инструментальные средства диагностики таких проблем, как блокировки
контроля, сеансы высокого уровня, SQL высокого уровня и т.д.
Сервисный пакет управления (Service Management Pack) Содержит Net
Manager, являющийся инструментом работы с сетями Oracle для создания
файлов сетевой конфигурации.
Стандартный пакет управления (Standard Management Pack) Этот пакет
содержит инструментальные средства Change Manager и Performance Manager.
ш
в
Oracle Enterprise Manager
Oracle Enterprise Manager is
a management framework which you can
use to:
» Administer the complete Oracle
environment, including databases, IAS
servers, applications, and services.
► Diagnose, modify, and tune multiple
databases.
» Schedule tasks on multiple systems at
varying time intervals,
t Monitor database conditions throughout
the network.
» Administer multiple network nodes and
services from many locations.
» Share tasks with other administrators.
» Croup related services together to
facilitate administration tasks.
► Launch integrated Oracle and third-
party tools.
, ОмадПпи»»» M»W«MI
•■>£:'■■ ■
To team more about the Console,
click the Quick Tour button.
Основы архитектуры базы данных Oracle
367
Пакет оптимизации (Tuning Pack) Этот пакет содержит
инструментальные средства настройки базы данных.
Архитектура OEM
OEM является трехуровневой моделью. Первый уровень состоит из консоли, в
основе которой лежит Java, и интегрированных приложений, которые могут
быть установлены или запущены из web-браузера. Компонент второго уровня
OEM — сервер управления Oracle (Oracle Management Server, OMS). Основная
функция OMS — обеспечение интеллектуального и распределенного
управления между клиентами и управляемыми узлами, которые обрабатывают
системные задачи и управляют ими. Возможно также совместное использование
репозитория. OMS использует репозиторий OEM в качестве своей постоянной
серверной памяти. Этот репозиторий поддерживает системные данные,
данные прикладной программы и состояние управляемых объектов,
распределенных в окружении. OEM позволяет нескольким пользователям обращаться и
совместно использовать данные репозитория для систем с разделением
обязанностей. Третий уровень состоит из целевых объектов, например баз
данных, узлов или других управляемых сервисов. Intelligent Agent функционирует
как исполнитель заданий и событий, посланных OMS.
Добавление базы
данных к дереву
OEM Console
Сначала вы можете попробовать воспользоваться консолью OEM Console. У
этой программы есть методы, позволяющие запускать и использовать другие
упомянутые компоненты. Когда вы воспользуетесь консолью в первый раз,
она попросит установить сервер управления и репозиторий. Затем вас
попросят добавить базу(ы) данных в дерево базы данных, которое является
древовидной структурой, перечисляющей несколько баз данных, которыми можно
управлять с консоли OEM. На рис. 10.6 показано, как добавить к дереву базу
данных.
SQL*Plus Worksheet
SQL'Plus Worksheet — одно из наиболее широко используемых
инструментальных средств. Этот инструмент довольно удобен: его можно запустить
кнопкой "Пуск" в Windows или с консоли OEM. После запуска инструмента и
регистрации в Oracle вы должны увидеть два окна: главное окно, в котором
вводятся команды SQL, как обычно в SQL*Plus; нижнее окно, в котором пока-
Add O.il.ibdsei I о Iiee
* Add a database rpanuaity
fcjostname jvikatakavi
Port Number
SID
[1521
[DB1
Net Service Name |dbi
<~ Add selected databases from your local tnsnames o/a tile
located m С \oracletora9mNETWORK\ADMIN
'•<- - *\x
& D31
('"ok"
Cancel
Help
368
Глава 10
зываются выходные данные, сгенерированные Oracle в ответ на ваш запрос
SQL. В Windows NT следует поэкспериментировать, чтобы определить,
можете ли вы обратиться к SQL*Plus Worksheet из OEM Console, находясь в
Database Applications. Стандартный SQL*Plus находится в Пуск | Программы | Oracle |
Applications Development.
OEM
С помощью OEM можно управлять практически всеми аспектами базы
данных Oracle. Oracle9/ дает новый внешний вид и новое ощущение от
использования OEM, но общие функциональные возможности сохранены. В OEM
Огас1е9/ вы увидите, что все инструментальные средства базы данных, или
управляющие программы, представлены в виде дерева, как в Проводнике
Windows. Управляющая программа экземпляра (Instance Manager) позволяет
управлять экземпляром, например запускать и выключать базу данных,
редактировать параметры инициализации, контролировать длинные транзакции и
т.д. На рис. 10.7 представлен Instance Manager. Schema Manager позволяет
управлять объектами базы данных, например таблицами и индексами. С
помощью этого инструментального средства можно создавать, удалять и
изменять объекты. Security Manager службы позволяет управлять
пользователями, ролями и конфигурациями. Вы можете предоставлять привилегии и роли,
а также создавать, изменять и удалять пользователей, роли и конфигурации.
Storage Manager позволяет управлять объектами, например табличными
пространствами, сегментами отката, файлами данных и журналами базы данных.
Есть также и другие инструментальные средства, например Replication
Manager, Java Virtual Machine и Workspace.
Рис. 10.7.
instance Manager
Закрепление пройденного материала
1. Убедитесь, что вам понятно назначение OEM, а именно помогать
администраторам базы данных поддерживать базу данных Oracle,
обеспечивая графический пользовательский интерфейс для решения важнейших
административных задач.
• • Oiacte ЕЫорак Maaagei Сопяще St<»Mone
Ч» Ы»»3»»г оыгй' Jw» АИЙЧ>!*<*-вчЦ
Eli
1
6^ Network
^KlIDatabases
&&DB1 - system AS SYSCJ
фф Instance
t*r--J Sessions
•^ Locks
Qin-DouotTransacf
QResource Consul
FJHJResource Plans
-^Resource Plan CjJ
ffi^Scttema
I TiaSecurity
fpSstorage
({^Replication
<фМН
{^Workspace
^Bsaag'
1я^л***!*У^я0КШ~г
Instance State
' _ "aiuwAJ State»
QaUbase and Instance Info malion
' Host Name vwctawm
OS Name, OBI
DB Version" OracleS Enterprise Edition Release 3 0.1.1.1 - Pro
With the Partitioning, and ibiei.ts options
instance Name. cbi
" instance StartTime:- 04-AOT-200210.53.09 AM
Restricted Moee (ncj^ _j».
Archive Los «рое. NOARCHWELOG
Read Only Mode' I
I A!) Inltafeat л Parameters..
ft
A
a=sd"
^'•jrW.^
Основы архитектуры базы данных Oracle
369
2. Необходимо знать, что обеспечивают различные категории
инструментальных средств OEM. На экзамене не важно знать, как они
используются, но надо уметь идентифицировать наличие инструментальных
средств, рассмотренных нами.
3. Необходимо уметь описать роль, которую QMS играет в OEM.
Упражнения
1. Инструментальное средство Manager помогает запускать и
выключать сервер Oracle.
8. Инструментальное средство Manager позволяет создавать такие
объекты базы данных, как таблицы и индексы.
3. Инструментальное средство (два слова) используется
для получения полного представления обо всех базах данных Oracle в
организации.
Ответы
1. Instance 2. Schema 3. OEM Console
Управление экземпляром Oracle
В этом разделе будут рассмотрены следующие темы, связанные с запуском и
выключением образца:
■ Создание файла параметров и управление им
■ Конфигурирование файлов под управлением Oracle
(Oracle-Managed Files, OMF)
■ Запуск и выключение базы данных
■ Контроль регистрационных и диагностических файлов базы данных
После установки программного обеспечения Oracle администратор базы
данных должен овладеть управлением экземпляром Oracle. Для управления
экземпляром Oracle необходимо выполнить несколько важных шагов еще до
того, как вы задумаетесь о настройке базы данных Oracle. Необходимо
ответить на важные вопросы об аутентификации, а также разработать файл
параметров и управлять им. Многие администраторы БД, как правило, называют
файл параметров initsid. ora. Запуск и выключение экземпляра, а также
открытие и закрытие базы данных — ключевые области и до и после создания
базы данных. И наконец, в этом разделе рассматриваются управление
сеансами и места, где надо искать информацию о действующем экземпляре Oracle.
Создание и управление файлом
параметров инициализации
Хорошо работает ваша база данных или плохо, в значительной степени
зависит от того, как вы конфигурируете экземпляр Oracle. Экземпляр
конфигурируется динамически, когда вы запускаете его с помощью файла параметров.
Обычно администраторы БД называют файл параметров initsid. ora. В
действительности название файла параметров для вашей базы данных
произвольно и полностью зависит от вас; однако, когда вы установите Oracle и создадите
свою первую базу данных, Oracle сгенерирует файл параметров, названный по
имени базы данных, если для ее создания вы воспользуетесь Oracle Database
Configuration Assistant. Таким образом, если ваша база данных называется
ORGDB01, то имя по умолчанию для файла initsid. ora будет init-
ORGDB01. ora. В этой книге файл параметров называется init. ora или
initsid. ora.
370
Глвва10
Можно создать файл параметров с нуля, но к чему беспокоиться, если
Oracle создаст его за вас? Файл параметров, созданный Oracle, будет содержать
несколько различных опций для наиболее важных параметров
инициализации, которые следует включить в него при создании новой базы данных.
Однако Oracle имеет сотни параметров инициализации, описанных и нет. В
следующем блоке кода представлен типовой файл параметров при использовании
в небольшой базе данных Oracle, работающей под UNIX. Он был создан
автоматически, когда Oracle Database Configuration Assistant создала базу данных, и
позднее был изменен вручную. Знак "решетка" (#) используется в файле
параметров для обозначения комментария.
tttttttttttntttttHttttttntitttnttnttmtiHntttttt
# Авторское право (с) 1991, 2001 принадлежит корпорации Oracle
1***1*******************************1*******************
t Кэш и ввод-вывод
ttttttttttttttitttittttttttttlttttttlttttttttttttttttitt
db_block_slze - 8192
db_cache_size - 20971520
########################################################
# Курсоры и библиотечный кэш
########################################################
open_cursors 300
##############################################################
# Диагностические и статистические данные
##############################################################
background_dump_dest-/u01/app/oracle/product/9.0.1/admin/oracle/bdump
user_dump_dest=/u01/app/oracle/product/9.0.1/admin/oracle/udump
core_dump_dest=/u01/app/oracle/product/9.0.1/admin/oracle/core
# timed_statist±cs TRUE
#############################################################
# Распределенность, тиражирование и моментальный снимок
#############################################################
db_domain = " "
remote_login_passwordfi ...1 0e = EXCLUSIVE
#############################################################
# Конфигурация файлов
#############################################################
control_f±l ...e 0s ("/u01/oradata/oracle/control01.ctl",
"/u02/ofadata/oracle/control02.ctl",
"/u03/oradata/oracle/control03.ctl")
#############################################################
# Многопоточный сервер
#############################################################
dispatchers="(PROTOCOL=TCP) (SER=MODOSE)", "(PROTOCOL=TCP)
(PRE=oracle.aurora.server.GiopServer)", "(PROTOCOL=TCP)
(PRE=oracle.aurora.server.SgiopServer)"
#############################################################
# Прочее
#############################################################
compatible = 9.0.0
db_name = oracle
#############################################################
# Регистрация в сети
#############################################################
instance name = ORCL
Основы архитектуры базы данных Oracle
371
# Пулы
#############################################################
java_pool_size 10485760
large_pool_s±ze 1048576
shared_pool_size = 31457280
# Процессы и сеансы
#############################################################
processes 15
#############################################################
# Журнал базы данных и восстановление
#############################################################
fast_start_mttr_target = 300
#############################################################
# Resource Manager
#############################################################
resource_manager_plan SYSTEM_PLAN
#############################################################
# Сортировка, случайные объединения, битовые индексы
#############################################################
sort_area_s±ze 524288
#############################################################
# Сегменты отмены и отката, управляемые на уровне системы
#############################################################
undo_management AUTO
undo_tablespace=UNDOTBS
#############################################################
# Другие параметры базы данных
#############################################################
utl_file_d±r /u01/oradata/oracle/misc
Вообще, работая с файлами параметра, лучше не создавать их с нуля.
Воспользуйтесь файлом по умолчанию Oracle или позаимствуйте его у другого
администратора БД. Однако убедитесь, что изменение параметров в файле
отражает вашу собственную базу данных, включая DB_NAME, DB_BLOCK_SIZE,
CONTROL_FILES "и другие. Следует помнить местоположение файлов
параметров на хост-компьютере базы данных Oracle. He оставляйте
многочисленные копии в различных каталогах; это может привести к тому, что в один вы
внесете изменение, а в другой — нет, а затем запустите экземпляр из старого
файла параметров, что породит проблемы. Однако полезно иметь несколько
различных копий файла параметров для различных административных задач,
например: один для промышленного окружения, другой для запуска базы
данных в ограниченном режиме для операций обслуживания, выполняемых
администратором БД.
По умолчанию на машине, работающей под UNIX, указатель на файл
init.ora в согласованном с OFA административном каталоге ad-
min/siD/pfile (где SID заменяется названием вашей базы данных Oracle)
находится в каталоге $ORACLE_HOME/dbs. В Windows файл init. ora
расположен в каталоге %ORACLE_HOME%\database. Если init.ora не находится в
месте, заданном по умолчанию, он должен определяться явно во время
создания базы данных. Если этого не сделать, Oracle сделает запрос.
372
Глава 10
После запуска экземпляра вы сможете получить задаваемые при
инициализации экземпляра значения несколькими способами. Первый и наименее
эффективный из способов просмотра значений параметров в вашей базе
данных состоит в проверке файла initsid.ora. Этот вариант не даст все
параметры, и, более того, параметры в вашем файле параметров, возможно, уже
изменились с того момента, как вы в последний раз запускали Oracle. Гораздо
лучший способ получения значений параметров — выбрать их из
специального представления V$PARAMETER. Еще более эффективный способ
получения значений параметров в Oracle — использование SQL*Plus. Команда show
parameter перечислит все параметры экземпляра. И наконец, для отображения
параметров экземпляра можно использовать OEM Instance Manager, как
показано на рис. 10.8. Вы можете угадать, откуда Instance Manager и SQL*Plus берут
информацию о параметрах инициализации? Если вы назвали
VSPARAMETER, то были правы!
Совет Некоторые другие важные представления VS из базы данных Огас-
le9i, о которых нужно знать, включают в себя VSFIXEDJTABLE, VSSGA,
VSPARAMETER, VSOPTION, VSPROCESS, VSSESSION, VSVERSION,
V$INSTANCE, VSTHREAD, VSCONTROLFILE, VSDATABASE,
VSDATAFILE, V$DATAFILE_HEADER и VSLOGFILE.
Параметры задаются одним из двух способов. Безусловно, самый
эффективный способ задания параметров базы данных состоит в добавлении
названий параметров и значений к файлу.initsid. ога в вашем экземпляре. После
этого выключите и запустите экземпляр, используя файл initsid. ora. К
сожалению, в мире многопользовательских сред базы данных администраторы
базы данных не всегда имеют возможность "дергать" базу данных всякий раз,
когда хотят. Но всегда можно внести работы такого вида в план или, если
необходимость не является срочной, подождать до выходных. Другой способ
задания параметров — использовать команды alter system, alter session
или alter system deferred. Раньше это были неэффективне методы
изменения параметров, потому что не все параметры инициализации можно было
изменить с помощью этих команд, но в Oracle9? положение изменилось с
введением файлов серверных параметров, которые мы вскоре рассмотрим.
Рис. 10.8. Е
Параметры 1
экземпляра в Instance
Manager
. . _. _
..
. fcdit Database . Configuration - syslem@DUl ;
All Parameters цИВД^^ЯЯ
_
—
-
-
—
Parameter Name |
07_DICTIONARY_ACCESSIBILITY
actJve_instance_count
aq_tm_processes
archrvejagjtarget
audit_trail
background_core_dump
background_dump_dest
backup_tape_io_slavee
bitmap_merge_area_stze
blank_lrimming
buffer_poolJ<eep
buffer_pooU,ecycle
circuits
cluster_database
cluster_database_lnstances
clusterjnterconnects
bi — ~*.__ ——.*. -._,_.
<L.
.. _.:. _ , „ _ _ „
■\ * i* " .* * '
Value
FALSE
0
0
NONE
partial
Eloracleladmi...
FALSE
1048576
FALSE
L170
FALSE
1
i' /, - ..i
j^ufl^B
_ ..--..'i- -.~
»«—' * *iift
.••■i,2i"vM'".
Default 'Dynamic
v
v'
v
V
v-*-\
V
\T
v'
*
*
v'
v'
*
V
_ — -
\-
- -
i4 1 Save As...
- v. VT-- '■-•T'.i.V"-- Wi
Category
Security and Auditing
Cluster Database
Miscellaneous
Miscellaneous
Security and Auditing
Diagnostics and Statistics
Diagnostics and Statistics
Backup and Restore
Sort, HashJoins, Bitmap indexes
ANSI Compliance
Cache and 1ГО
Cache and VO
MTS
Miscellaneous
Miscellaneous
Miscellaneous
_ ... tf^C3uE3L^L1:. -j
[ Description 1 Cancel Y Help
., .._ _ „j . «•<*•: '
F
i
'i
:
■
:
f
-.
i
Основы архитектуры базы данных Oracle
373
Совет Обратитесь к представлению V$PARAMETER или
V$SYSTEM_PARAMETER, чтобы получить информацию об измененном
параметре. Обратите особое внимание на булевы переменные в столбцах
ISMODIFIED, ISDEFAULT, ISADJUSTED, ISSYS_MODIFIABLE
и ISSES_MODIFIABLE. Они могут использоваться для выяснения, какое из
значений параметра было изменено — по умолчанию или изменяемое — и
морено ли изменять это значение с помощью команд alter system или alter
session соответственно.
Закрепление пройденного материала
1. Вы должны знать назначение файла init. ога в Oracle и некоторые
способы получения набора значений для параметров на работающей базе
данных.
2. Необходимо уметь использовать команды alter system, alter session и
alter system deferred для изменения значений, заданных для
параметров после создания и запуска экземпляра.
3. Убедитесь, что знаете, где найти фактические копии файлов init. ога и
где находятся ссылки на фактические копии файлов init.ога в вашей
базе данных Oracle.
Упражнения
1. Вы конфигурируете параметры инициализации в базе данных Oracle.
Какой из следующих вариантов указывает на файл, в котором могут быть
определяться значения параметра?
A. init.ога
B. Instance Manager
C. SQL*Plus
D. controlOl.ctl
2. Вы управляете базой данных Oracle. Какой из следующих вариантов
правильно указывает, когда Oracle читает содержание файла init. ога?
A. Когда экземпляр запущен
B. Когда база данных смонтирована
С Когда база данных открыта
D. Когда база данных закрыта
3. Вы управляете базой данных Oracle. Какой из следующих вариантов
указывает на представление VS, содержащее набор значений, заданных в файле
init.ога для экземпляра Oracle, активного в настоящее время?
A. V$SESSION В. VSPARAMETER
С V$DATABASE D. V$VERSION
Ответы
1. А. 2. А 3. В
Конфигурация OMF
Раньше администраторы БД Oracle, решая административные задачи базы
данных, всегда сталкивались с головоломкой. Мало того что
администрирование базы данных требует обширных знаний о работе Oracle, оно также требует
уверенного понимания принципов работы базовой операционной системы.
374
Глава 10
Почему это так? Потому что администраторам БД часто приходится
выполнять административные задачи очистки после важных операций по
управлению базой данных.
Это становится наиболее очевидным при создании и удалении файлов
данных, относящихся к управлению табличным пространством. Подробнее о
создании табличного пространства мы поговорим в главе 11, а пока поОпробуйте
понять, что табличные пространства — это логические области, где
содержатся объекты базы данных, например таблицы и индексы. Основой логического
понятия табличных пространств является физический файл данных или
файлы данных, где фактически хранятся биты и байты. Как предполагает
последнее утверждение, в Oracle табличное пространство может состоять из одного
или несколько файлов данных. В предыдущих версиях Oracle, когда
администратор БД удалял табличное пространство из Oracle с помощью
соответствующей команды (которой, между прочим, .является drop tablespace, но здесь
мы забегаем вперед), все, что на самом деле делал администратор БД, — это
удаление из словаря данных Oracle ссылок на файлы данных, образующих это
табличное пространство. Реальные файлы данных все же существовали на
хост-системе, из-за чего администратору БД приходилось отыскивать файлы
данных и удалять их вручную, используя какую-либо подходящую для этого
команду в зависимости от конкретной операционной системы. Если
администратор БД забывал удалять такие файлы данных, диск мог заполниться
файлами данных, не используемыми в Oracle, из-за чего могли возникнуть
неожиданные административные проблемы.
OMF — новое средство, встроенное в Огас1е9/'для упрощения
администрирования базы данных касательно файлов базы данных. В предыдущих версиях
Oracle, когда с помощью соответствующей команды (create tablespace, но
мы снова забегаем вперед) создавались новые табличные пространства, Oracle
предполагала, что вы определите местонахождение файловой системы и имя
файла для всех файлов данных, используемых наряду с сохранением
информации в этом табличном пространстве. В Огас1е9« с OMF вместо этого вы
определили бы Одва простых компонента:
■ Местоположение своего каталога файлов OMF в файле in it. ora с
помощью параметра
Ш Имя создаваемого файла данных и его размер
С этого момента Oracle позаботится о создании файла данных в
соответствующем месте с заданным именем. Благодаря этому свойству администраторы
БД снимают с себя обязанность удалять файлы данных после удаления
табличного пространства. Вместо вас их удалит Огас1е9/.
Реализация OMF — параметры инициализации
Как уже отмечалось, реализация OMF происходит в два этапа. Сначала вы
определяете местоположение каталогов OMF, устанавливая соответствующие
параметры в файле init. ora. Вы можете определить местоположение
каталогов с помощью двух параметров. Первый — DB_CREATE_FILE_DEST, он
используется для идентификации местоположения файловой системы, которую
Oracle будет использовать для автоматического создания файлов данных. Если
каталог файловой системы не определен ни в одной команде, с помощью
которой Oracle должна создать файл для завершения, будет использоваться этот
каталог. Определяемый вами каталог должен существовать до того, как вы
назначите его этому параметру в качестве значения. Если каталог не существует,
Oracle не создаст его за вас. Пример задания DB_CREATE_FILE_DEST
показан в следующем блоке кода:
ГЙМЙЙВ DB_CREATE_FILE_DEST -/uOl/oradata/oracle
Второй задаваемый параметр — DB_CREATE_ONLINE_LOG_DEST_N,
где N задается как некоторое численное значение. Этот параметр
используется для задания местоположения каталога оперативных журналов базы
данных для всех ваших журналов базы данных. Для повышения отказоустойчи-
Основы архитектуры базы данных Oracle
375
вости и производительности Oracle рекомендует задавать как минимум два
местоположения. Такой пример для окружения UNIX показан в следующем
блоке кода:
tmmm DB_CREATE_0NLINE_L0G_1 - /u02/oradata/oracle
DB_CREATE_0NLINE_L0G_2 - /u03/oradata/oracle
Совет В обоих экземплярах каталог, указанный для одного из этих
параметров OMF, доложен задаваться так, чтобы пользователь вашей
хост-системы, которому принадлежит все ПО Oracle, имел привилегии чтения и
записи для этого каталога.
OMF в действии
Теперь, когда заданы соответствующие параметры, можно опустить указание
местоположения файловой системы в командах, в которых раньше
приходилось указывать местоположение файловой системы, например create table-
space. Мы рассмотрим некоторые примеры работы OMF, когда будем
обсуждать вопросы создания удаления табличных пространств и файлов данных в
главе 11.
Совет Если местоположение журналов базы данных указывается
соответствующими параметрами, Oracle автоматически управляет за вас
настройкой мультиплексирования оперативных журналов базы данных.
Подробнее о мультиплексировании см. в главе 11.
Закрепление пройденного материала
1. Необходимо знать, что такое Oracle-Managed Files (OMF). Вы должны
также знать, какие функции предоставляет OMF.
2. Убедитесь, что знаете, какие из параметров файла init. ога задаются как
часть OMF, включая параметры для файлов данных и оперативных
журналов базы данных.
Упражнения
1. Вы вводите следующую команду в Oracle: create tablespace BOBTBS
datafile <\#34bob01.dbf<\#34> size 2M; более поздние запросы в
базе данных показывают, что табличное пространство расположено в
каталоге /uOl/oradata/oracle. Какой из следующих вариантов соответствует
тому, как Oracle, вероятно, решила, в какой каталог поместить bobOl. dbf ?
A. DB_CREATE_FILE_DEST
B. DB_CREATE_ONLINE_LOG_l
С DB_CREATE_ONLINE_LOG_2
D. Каталог является значением по умолчанию в Oracle, которое зависит
от конкретной операционной системы и не может определяться или
изменяться вручную.
2. Вы сконфигурировали OMF в своей системе базы данных Oracle. После
тщательного анализа вы решаете, что следует удалить табличное пространство
из базы данных. Какой из следующих вариантов соответствует тому, как
OMF может помочь вам в этом?
A. OMF автоматически обновит словарь данных, чтобы удалить ссылку
на файлы данных табличного пространства.
B. OMF автоматически удалит базовые файлы данных из
хост-окружения.
С OMF даст Oracle указание автоматически прекратить использование
файлов данных, связанных с этим табличным пространством.
376
Глава 10
D. Ни один из предыдущих вариантов не указывает на функциональные
возможности, предоставляемые OMF.
Выберите соответствующий вариант, чтобы завершить следующее
утверждение: Если вы хотите использовать OMF для управления определением
местоположения журналов базы данных, необходимо определить по
крайней мере пунктов назначения, которые Oracle будет
использовать через определение параметров init.ora, относящихся к OMF.
А. Один В. Два
С Три D. Четыре
Ответы
1. А 2. В 3. В.
Запуск экземпляра
Ранее мы установили важное различие между экземпляром Oracle и базой
данных Oracle. Напомним, что база данных Oracle — это набор таблиц, индексов,
процедур и других объектов, используемых для сохранения данных. Точнее,
база данных Oracle, идентифицируемая по имени базы данных (DBNAME),
представляет собой физические структуры и состоит из файлов операционной
системы. Хотя можно использовать имя базы данных, которое отличается от
имени экземпляра, для упрощения администрирования следует использовать
то же самое имя. С другой стороны, экземпляр Oracle представляет собой
структуры памяти, фоновые процессы и дисковые ресурсы, которые
совместно работают над выполнением пользовательских данных запросов и
изменений данных.
Помня об этом различии, рассмотрим запуск экземпляра Oracle. Его
необходимо сделать до создания новой базы данных или разрешения доступа к
существующей базе данных. Чтобы запустить экземпляр, выполните следующие
шаги:
1. В командной строке на хост-машине запустите SQL*Plus и
зарегистрируйтесь как sysdba:
[ oracle : orgdbuxOl ] > sqlplus
Oracle SQL*Plus Release 8.1.7.0.0 Production
(c) Copyright 2000, Oracle Corporation. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to an idle instance.
SQL>
Совет Пароль для пользователя sys при регистрации в качестве sysdba
обычно устанавливается по умолчанию как Oracle. Очевидно, вам захочется
задать иной, чем по умолчанию, пароль во избежание проблем защиты от
хорошо осведомленных администраторов БД!
2. Для запуска экземпляра из SQL*Plus используйте команду
start_option [dbname]. Для start_option существуют
несколько опций, включая nomount, mount, open и open force.
Если Oracle не может найти файл init. ora, где она
предполагает найти его ($ORACLE_HOME/dbs в UNIX и
X:\%ORACLE_HOME%\admin\SrD\pfile в Windows), для точной
идентификации файла initsid.ora file, который вы хотите
использовать, следует применить параметр PFILE. Пример
startup nomount показан в следующем блоке кода:
SQL> startup nomount
ORACLE instance started.
T6tal System Global Area 227174560 bytes
Fixed Size 42764 bytes
Variable Size 93999104 bytes
Основы архитектуры бвзы данных Oracle
377
Database Buffers 81920000 bytes
Redo Buffers 51208192 bytes
SQL>
Опции запуска Oracle
Вы можете также запустить базу данных с помощью OEM Instance Manager.
Все опции, рассмотренные для SQL*Plus, имеются и в Instance Manager, за
исключением GUI. Стоит отметить, что запуск базы данных Oracle в Windows
не обязательно управляется с помощью SQL*Plus или даже OEM, вместо
этого он может управляться как сервис (service). Сервис в Windows аналогичен
демону (daemon) в UNIX. Обе эти операционные системы функционируют
таким образом, чтобы Oracle могла запускаться автоматически при загрузке
машины. (Здесь мы немного отклоняемся от темы, но если вы хотите узнать
больше, обратитесь к руководству Oracle?/' Installation Guide for Windows NT,
которое поставляется вместе с дистрибутивом Oracle.) Существует несколько
различных опций запуска экземпляров Oracle, с открытием базы данных или
без открытия.
startup namount Эта опция запускает экземпляр без монтирования базы
данных. Это значит, что все структуры памяти и фоновые процессы находятся
на месте, но база данных к экземпляру не присоединяется. ВыФоспользуетесь
этой опцией позже для создания базы данных Oracle. Эту опцию можно
указывать, указывая файл ini tsid. ога или без его указания. Если вы не укажете
PFILE, Oracle проверит несколько мест по умолчанию, чтобы найти файл
инициализации. Для UNIX Oracle проверяет каталог $ORACLE_HOME/dbs,
для Windows Oracle проверяет каталог X:\%ORACLE_HOME%\ad-
min\SID\pfile. Если Oracle не находит файл инициализации, а вы не задали
точное значение для PFILE, Oracle не запустит вашу базу данных. Говоря
коротко, запуск экземпляра без монтирования базы данных включает
следующие задачи:
■ Чтение файла параметров init. ога
■ Выделение SGA
■ Запуск фоновых процессов
■ Открытие файла журнала предупреждающих сообщений ALERT и
трассировочных файлов.
Учтите, что ни управляющие файлы, ни файлы базы данных в этом режиме
не открываются.
startup mount Эта опция запускает экземпляр, читает управляющий файл
и присоединяет базу данных, но не открывает ее. Вы не можете смонтировать
базу данных, которая еще не создана. Эта' опция полезна в ситуациях, когда
приходится перемещать физические файлы базы данных в хост-машине базы
данных Oracle или когда требуется восстановление базы данных Oracle. Эту
опцию можно задать для параметра PFILE с указанием файла initsid.ora
или без него. Если вы не укажете PFILE, Oracle проверит несколько мест по
умолчанию, чтобы найти файл инициализации. Для UNIX Oracle проверяет
каталог $ORACLE_HOME/dbs, для Windows Oracle проверяет каталог
X:\%ORACLE_HOME%\admin\SID\pffle. Если Oracle не находит файл
инициализации, а вы не задали точное значение для PFILE, Oracle не запустит
вашу базу данных. Если экземпляр уже запущен, но база данных не
смонтирована, используйте вместо этого alter database mount. Говоря коротко,
монтирование базы данных включает следующие задачи:
■ Привязка базы данных к ранее запущенному экземпляру
■ Обнаружение и открытие управляющих файлов, указанных в файле
параметров
■ Чтение управляющих файлов для извлечения имен и статуса файлов
данных и файлов журналов базы данных
378
Глава 10
startup open Эта опция запускает экземпляр, присоединяет базу данных и
открывает ее. Это опция по умолчанию для запуска Oracle, она используется,
если вы хотите, чтобы база данных была доступной для пользователей. Вы не
можете открыть базу данных, которая еще не создана. Эту опцию можно
задать для параметра PFILE с указанием файла initsid. ога или без него. Если
вы не укажете PFILE, Oracle проверит несколько мест по умолчанию, чтобы
найти файл инициализации. Для UNIX Oracle проверяет каталог
$ORACLE_HOME/dbs, для Windows Oracle проверяет каталог
X:\%ORACLE_HOME%\admin\ SID\pffle. Если Oracle не находит файл
инициализации, а вы не задали точное значение для PFILE, Oracle не запустит
вашу базу данных. Если экземпляр уже запущен, но база данных не
смонтирована, используйте вместе этого alter database. Если при вводе команды
startup опустить ключевое слово, предполагается startup open. Запуск
экземпляра данных включает следующие задачи:
И Открытие файлов оперативных данных
В Открытие оперативных файлов журнала базы данных
й*а8ИВ«К SQL> startup open
ORACLE instance started.
Total System Global Area
Fixed Size
Variable Size
Database Buffers
Redo Buffers
Database mounted.
Database opened.
startup force Эта опция принудительно запускает экземпляр и открывает
базу данных. Она используется в ситуациях, когда другие опции запуска
выполнены с сообщениями об ошибке от Oracle и создается впечатление, что не
работает ни одна из опций выключения. Эта опция дает последний шанс, и, в
целом, нет причин использовать ее, если можно запустить базу данных с
какой-либо другой опцией. Эту опцию можно определить с указанием файла
initsid.ога для параметра PFILE или без него. Если PFILE не определен,
Oracle проверяет заданные по умолчанию места в поисках файла
инициализации. Для UNIX Oracle проверяет каталог $ORACLE_HOME/dbs. Для Windows
Oracle просматривает каталог Х:\% ORACLE_HOME %\admin\SID^pшe. Если
Oracle не найдет файл инициализации, а вы не укажете явное значение для
PFILE, Oracle не запустит вашу базу данных.
Два других случая запуска базы данных — startup recover для
управления восстановлением базы данных и startup restrict для открытия базы
данных, при которых из всех пользователей только администраторы БД имеют
доступ к объектам базы данных.
Совет Oracle9i предоставляет новый режим работы, называемый
"замораживанием " (quiescing). Когда база данных переводится в "замороженное "
(quiesced) состояние, разрешается выполнять только транзакции, запросы
или команды PL/SQL, введенные администратором БД. Это делается с
помощью команды alter system quiesce restricted.
OEM Console или Instance Manager позволяют администратору БД
изменять и просматривать параметры инициализации. Они могут храниться в
местном файле параметра или в репозитории OEM с помощью сохраненных
конфигураций. При использовании сохраненных конфигураций, чтобы
получить доступ к репозиторию, администратор БД должен устанавливать
соединение посредством OMS. В более ранних версиях OEM (1.x) параметры
инициализации сохранялись локально в системном реестре Windows NT.
Другие режимы работы базы данных
Огас1е9/ предоставила по крайней мере еще два режима работы базы данных.
База данных может быть переведена в состояние "замораживания", в котором
148808972 bytes
70924 bytes
40566784 bytes
108093440 bytes
77824 bytes
Основы архитектуры базы данных Oracle
379
разрешается выполнять только транзакции, запросы или команды PL/SQL,
введенные администратором БД. Это делается с помощью команды alter
system quiesced restricted. Это состояние является наиболее
подходящим для администраторов БД при проведении текущего обслуживания.
Oracle^' также может приостанавливать и возобновлять работу базы данных.
Приостановка базы данных остановит весь ввод в файлы данных и в управляющие
файлы и вывод из них, но позволит завершить все операции ввода-вывода,
существовавшие до этого. Новые обращения к базе данных переводятся в
состояние с организацией очереди. Команда alter system приостанавливает
работу базу данных, а команда alter system resume возобновляет ее.
Совет Если приостанавливать работу базы данных из приглашения
SQL*Plus, зарегистрировавшись sysdba, единственная команда, которую
можно ввести после alter system suspend, это команда alter system
resume. Ввод любой другой команды приведет к зависанию сеанса.
Автоматический запуск базы данных
Большинство администраторов БД хотят, чтобы их база данных запускалась
автоматически всякий раз, когда перезагружается хост-машина. В окружении
Windows база данных может открываться при запуске сервиса OracleService-
SID. Это сервис создается для экземпляра базы данных SID при инсталляции
Oracle на окружении Windows. Для автоматического запуска базы данных
необходимо, чтобы параметр oka_sid_autostart в системном реестре Windows
был установлен как TRUE. Более подробно об этом см. в руководстве по
установке программного обеспечения Oracle для конкретной операционной
системы Windows. В UNIX автоматизация запуска и выключения базы данных
управляется записями в файле oratab в каталоге /var/opt/oracle. Более
подробно об этом см. в руководстве по установке программного обеспечения
Oracle для такой операционной системы UNIX, как Solaris.
Режим базы данных ''только для чтения"
Любая база данных может быть открыта в режиме "только для чтения'', если
только она уже не открыта в режиме чтения — записи. Это свойство особенно
полезно для передачи обработки запроса в резервную базу данных в целях
разгрузки производственной базы данных. Если для запроса требуется временное
табличное пространство, например для сортировки дисков, текущий
пользователь должен иметь локально управляемое табличное пространство,
назначенное как заданное по умолчанию временное табличное пространство, иначе
запрос не будет выполнен. Для пользователя SYS требуется локально
управляемое табличное пространство.
Закрепление пройденного материала
1. Убедитесь, что понимаете разницу между запуском экземпляра Oracle и
открытием базы данных Oracle для использования. Требуется знать команды
для каждого варианта.
2. Необходимо знать, почему Oracle имеет так много различных режимов
запуска экземпляра и открытия базы данных, а не делает это просто путем
использования одной команды.
Упражнения
1. Вы управляете запуском экземпляра Oracle. Какой из следующих
вариантов соответствует названиям инструментальных средств, которые могут
использоваться для запуска экземпляров Oracle и баз данных?
A. Schema Manager
B. Server Manager
380
Глава 10
C. SQL*Plus
D. Network Configuration Assistant
2. Вы управляете экземпляром базы данных Oracle. Какой из следующих
вариантов соответствует команде, используемой для того, чтобы Oracle
временно прекратила работу базы данных?
A. startup nomount
B. alter database open read only
С alter system suspend
D,alter system resume
3. Завершите следующее предложение: При вводе команды startup nomount
экземпляр Oracle (А) , а база данных (В) открывается.
Ответы
1. С. 2. С. 3. (А) запускается; (В) не.
Выключение экземпляра
Выключение экземпляра Oracle происходит почти так же, как и его запуск.
Необходимо зарегистрироваться в Oracle как пользователь с привилегиями
sysdba. Это можно сделать из SQL*Plus или OEM Instance Manager или как
сервис Windows. Для выключения базы данных Oracle из SQL*Plus
выполняются следующие шаги:
1. Из командной строки на хост-машине запустите SQL*PIus и
зарегистрируйтесь как sysdba:
[ oracle : orgdbuxOl ] > sqlplus
Oracle SQL*plus Release 8.1.7.0.0 Production
(c)Copyright 2000, Oracle Corporation. All Rights Reserved.
Enter user-name: sys as sysdba
Password:
Connected to an idle instance.
2. В SQL*Plus воспользуйтесь командой выключения shutdown_option,
которая выключит экземпляр. Существует ряд опций для shutdown_option,
включая immediate, normal или abort. Пример немедленного
выключения shutdown immediate показан в следующем блоке кода:
SQL> shutdown immediate
ORA-01507: database not mounted
ORACLE instance shut dovn.
Опции останова Oracle
Существуют четыре определяемых администратором БД приоритета для
выключения базы данных. Это shutdown normal (нормальное), shutdown
immediate (немедленное), shutdown abort (аварийное) и shutdown
transactional (с транзакциями). В следующих четырех подразделах мы рассмотрим
каждую из этих опций и приведем примеры соответствующего использования.
shutdown normal Это выключение с самым низким приоритетом. Если
ввести shutdown normal, Oracle дождется, пока пользователи выйдут из
системы, и только после этого действительно выключит экземпляр и закроет базу
данных. Во время выполнения shutdown normal Oracle соблюдает три
правила. Во-первых, Oracle не дает новым пользователям обращаться к базе данных.
Во-вторых, Oracle не заставляет выходить из системы уже зарегистрированных
пользователей, чтобы завершить выключение. В-третьих, это самый
постепенный из всех вариантов завершения. Поэтому, если база данных будет
выключена таким способом, Oracle не придется восстанавливать экземпляр при его
последующем запуске.
Основы архитектуры базы данных Oracle
381
—"™""™" SQL> shutdown normal
Database closed.
Database dismounted.
ORACLE instance shut down.
shutdown immediate Это выключение имеет более высокий приоритет и
может использоваться администратором БД, когда shutdown normal
занимает слишком много времени. Команда shutdown immediate выключает базу
данных следующим образом. После ввода этой команды новые пользователи
не смогут подключиться к базе данных. Oracle не будет ждать, пока
пользователи выйдут из системы, как это делается для shutdown normal; вместо этого
она немедленно отключает пользователей и производит откат
незафиксированных транзакций. Немедленное выключение базы данных, хотя и более
решительное, чем shutdown normal, все же не требует восстановления
экземпляра. Результат работы для команды shutdown immediate приводится в
начале ее рассмотрения.
shutdown abort Эта команда выключения базы данных имеет самый
высокий приоритет. Во всех экземплярах, где используется этот приоритет, база
данных выключается немедленно. Все соединения со всеми пользователями
немедленно разрываются, откат транзакций не производится, и при новом
запуске базы данных потребуется восстановление данных, хранимых на
носителе. Эту опцию следует использовать только при сбое данных, хранимых на
носителе, или сбое диска на хост-машине базы данных Oracle.
«аашаге sql> shutdown abort
ORACLE instance shut down.
shutdown transactional Выключение с транзакциями позволяет
клиентам сохранить результаты работы. Команда shutdown transactional
выполняется со следующими условиями: клиенты не могут запускать новые
транзакции на этом конкретном экземпляре, соединение с клиентом разрывается
после завершения происходящей транзакции клиента, а после завершения
всех транзакций происходит shutdown immediate. При следующем запуске
восстановление экземпляра не потребуется.
*aw*^tate SQL> shutdown transactional
Database closed.
Database dismounted.
ORACLE instance shut down.
Закрепление пройденного материала
Надо знать команды выключения экземпляра Oracle и закрытия базы данных.
Проверьте, можете ли назвать четыре различных приоритета выключения
базы данных.
Упражнения
1. Вы должны выключить базу данных Oracle по срочному уведомлению.
Какой из следующих вариантов соответствует команде, которую вы
использовали бы, если были быО готовы дать Oracle восстановить экземпляр при
следующем открытии базы данных?
A. shutdown abort
B. shutdown transactional
С shutdown normal
D. shutdown immediate
2. Вы выключаете базу данных Oracle. Если для этого будет использована
команда shutdown без указания приоритета, с каким приоритетом Oracle
выключит вашу базу данных?
382
Глава 10
A. abort
B. transactional
C. normal
D. immediate
Ответы
1. A 2. С.
Контроль использования диагностических файлов
Есть много ситуаций, когда администратору БД хотелось бы узнать
поподробнее о том, какие вспомогательные действия выполняет Oracle, чтобы
отнести к ним вопросы, связанные с ее работой. Существует два способа
сделать это: догадаться или использовать диагностические файлы. В целях
регистрации Oracle рекомендует использовать диагностические файлы. Есть
два типа диагностических файлов с типичной конфигурацией Oracle,
которые Oracle будет использовать во время запуска и работы базы данных:
системные журналы (log files) и трассировочные файлы (trace files). Рассмотрим их
поподробнее.
Трассировочные файлы
Фоновые процессы генерируют трассировочные файлы всякий раз, когда в
работе фонового процесса что-нибудь не ладится. Сетевые процессы генерируют
трассировочные файлы также всякий раз, когда они дают сбой. Кроме того,
сетевые процессы позволяют указать, что для поиска неисправностей вам
нужны трассировочные файлы, генерируемые по требованию.
Имя трассировочного файла фонового процесса, как правило,
содержит имя фонового процесса, связанного со значением INSTANCE_NAME
в файле init.ora. Любой сгенерированный Oracle трассировочный файл
будет иметь расширение .trc. Трассировочные файлы, сгенерированные
фоновыми процессами, хранятся в каталоге, указанном параметром
BACKGROUND_DUMP_DEST в файле параметров. Если хотите,
повторите материал по файлам init. ora, приводимый выше в этой главе, там
есть пример файла init.ora. Там вы найдете и пример
BACKGROUND_DUMP_DEST с набором значений каталога. Имя
трассировочного файла также указывает, какой из фоновых процессов создал
его. Они содержат подробные сведения о том, что вызвало сбой фонового
процесса. Полезно проверять эти трассировочные файлы, когда база
данных ведет себя необычно или создает аварийную ситуацию. Они главным
образом содержат информацию, которую может расшифровать только
Oracle. Чтобы точно установить источник проблем, отдел поддержки
Oracle неоднократно будет просить вас предоставить им эти трассировочные
файлы.
Другие процессы, например прослушивающий процесс, могут также время
от времени генерировать трассировочные файлы. Эти трассировочные файлы
сохраняются в местоположениях, указанных в соответствующих файлах
конфигурации. Например, файл конфигурации прослушивающего процесса —
listener.ora. Детализация сведений в этих трассировочных файлах может
регулироваться. Они чрезвычайно полезны при поиске неисправностей,
связанных с проблемами использования Oracle в сети. Однако убедитесь, что они
выключены, если в них нет необходимости, поскольку они могут очень быстро
заполнить весь диск.
Совет Серверные процессы, управляющие данными от имени пользователей
Oracle, могут также создавать трассировочные файлы, если вы запросите
их. Эти трассировочные файлы можно найти в каталоге, указанном в
USER_DUMP_DEST. Как правило, Oracle называет трассировочные файлы
Основы архитектуры базы данных Oracle
383
пользовательского сеанса по номеру ID процесса, генерируемому в фоновом
режиме для работы серверного процесса от имени пользователя. Обычно
приходится "продираться " через трассировочные файлы пользовательского сеанса,
в таком случае смотрите на дату и время создания файла, чтобы понять,
что к чему.
Системные журналы
Второй тип создаваемых Oracle диагностических файлов — системные
журналы. Наиболее важный системный журнал, о котором вы должны знать и
который нужно часто просматривать, это файл журнала предупреждающих
сообщений (ALERT log file). Файл журнала предупреждающих сообщений
автоматически создается Oracle, как только вы создаете экземпляр. Он также
сохранен в местоположении, указанном параметром
BACKGROUND_DUMP_DEST в файле init.ora. Имя этого файла —
alert_SJD.log или slDALRT.log, где SID — имя, указанное параметром
INSTANCE_NAME в файле init.ora.
Файл журнала предупреждающих сообщений хранит информацию,
которая чрезвычайно полезна для того, чтобы иметь представление о степени
исправности базы данных. Она записывает информацию обо всех запусках и
остановках баз данных, о создании новых файлов журнала базы данных (что
происходит каждый раз, когда включается журнал), о созданий табличных
пространств, добавлении новых файлов данных к табличному пространству и,
что самое важно, об ошибках, которые генерируются Oracle. Этот файл чаще
всего требуют в отделе поддержки Oracle. С течением времени этот файл имеет
тенденцию разрастаться. Необходимо регулярно удалять или архивировать
части этого файла.
Хорошо, если администратор БД будет периодически просматривать этот
файл в поисках любых сообщений об ошибке (обычно они начинаются с
ORA-). Еще лучше иметь автоматизированный сценарий, который
просматривает этот файл через равномерные промежутки времени и передает сообщения
на пейджер администратора БД, если находит в файле любые случаи ORA-.
Другие процессы, например сетевые процессы Oracle, также генерируют
системные журналы. Они дают достаточно информации, чтобы оценить степень
исправности Oracle и ее сетевых процессов. Главное различие между
системными журналами и трассировочными файлами в том, что системные журналы
нужны администратору БД постоянно, т.к. в них содержится только важная
информация. Трассировочные файлы необходимы для поиска
неисправностей. В трассировочных файлах Oracle сообщает гораздо больше информации,
чем в системных журналах.
Совет Если в базе данных начинают возникать действительно
сверхъестественные ошибки, а в журнале предупреждающих сообщений содержится
ошибка ORA-00600, следует какможно скорее обратиться в отдел
поддержки Oracle и начинать просматривать каталоги USER_DUMP_DEST
и BACKGROUND_DUMP_DEST!
Закрепление пройденного материала
1. Убедитесь, что понимаете разницу между трассировочными файлами и
системными журналами. Необходимо знать типы файлов, а также
процессы, которые могут генерировать те файлы, которые хранятся в
каталоге, указанном параметрами BACKGROUND_DUMP_DEST и USER_
DUMP_DEST.
2. Необходимо понимать, когда фоновые процессы генерируют
трассировочные файлы, а также знать, что хранится в файле журнала
предупреждающих сообщений. Знайте, что это — первое, куда надо смотреть, если ваша
база данных завершает работу нештатно.
384
Глава 10
Упражнения
1. Следующий фрагмент трассировочного файла был взят из базы данных
Oracle:
Tue Jul 18 17:04:33 2000
alter database dismount
Completed: alter database dismount
archiving is disabled
Dump file c:\Oracle\admin\orcl\bdump\orclALRT.LOG
Tue Jul IB 17:05:00 2000
ORACLE V9.0.1.0.0 Production vsnsta-0
vsnsql-d vsnxtr=3
Windows NT V4.10, OS V192.0, CPU type 5B6
Starting up ORACLE RDBMS Version: 9.0.1.0.0.
System parameters with non-default values:
processes = 59
shared_pool_size - 1572B640
java_pool_size = 20971520
disk_asynch_io - FALSE
control_files - c:\Oracle\ORADATA\or\control01.ctl,
c:\Oracle\ORADATA\orcl\control02.ctl
db block buffers
db block size
compatible
log buffer
log checkpoint interval
log_checkpoint_timeout
- 200
- 204B
- 9.0.1.0.0
- 8192
- 10000
- 0
Какой из следующих вариантов соответствует наиболее вероятному имени
этого трассировочного файла?
A. orclDBWO.trc
В.orclLGWR.trc
С orclALRT.trc
D.orcll3095.trc
8. Вы пытаетесь установить местонахождение трассировочного файла,
сгенерированного прослушивающим процессом. Где следует искать эту
информацию?
A. init.ora
B. BACKGROUND_DUMP_DEST
С listener.ога
D. USER_DUMP_DEST
Э. Вы исследуете трассировочные файлы фонового процесса для процесса
LGWR. При каком из следующих сценариев вы нашли бы трассировочный
файл, сгенерированный для этого процесса?
A. По определенному запросу пользователя
B. Когда база данных закрыта
C. Когда база данных дает сбой
D. Когда Oracle не может произвести запись в журнал предупреждающих
сообщений
Ответы
1. С. 2. С. 3. С.
Создание базы данных Oracle
В этом разделе будут рассмотрены следующие темы, связанные с созданием
базы данных Oracle:
Основы архитектуры базы данных Oracle
385
■ Необходимые предпосылки создания базы данных
■ Создание баз данных с помощью Oracle Database Configuration Assistant
■ Создание базы данных вручную
Операция по созданию базы данных — это всего лишь создание физической
базы данных. Прежде чем будет создана физическая база данных,
проектировщики базы данных проектируют логическую базу данных, используя
диаграмму отношений логических объектов (Entity-Relationship Diagram, ERD). ERD
отражает отношения между таблицами, столбцами, которые они содержат,
ограничения и другую информацию. Администратор БД переводит этот
логический проект в физический, отображая, где необходимо создать таблицы, в
каких табличных пространствах они должны постоянно находиться,
насколько большими они должны быть и тд. Точно так же, как при инсталляции
программного обеспечения Oracle, администратор БД должен решать много задач
до и после создания базы данных. На первом экзамене основное внимание
уделяется задачам, необходимым для создания физической базы данных. В
этом разделе мы рассмотрим, как выполняются задачи, предшествующие
инсталляции, как происходит создание базы данных с помощью Database
Configuration Assistant под управлением мастера Oracle, а затем как происходит
создание базы данных вручную.
Предпосылки создания базы данных
Перед созданием базы данных вы должны выполнить на уровне операционной
системы ряд шагов. Поскольку все операционные системы отличаются друг от
друга, здесь будут представлены общие положения с целью подготовки к
экзамену. Если у вас еще останутся вопросы, обратитесь к руководству по
установке Oracle для конкретной операционной системы, которое поставляется с
дистрибутивами ПО. Некоторые из этих шагов должны быть известны со
времени инсталляции ПО Oracle на хост-машине, в то время как другие могут
подождать, пока вы не будете готовы ввести команду create database.
Вообще, следует убедиться, что машина имеет достаточную производительность,
чтобы работать с Oracle. Во всяком случае, удостоверьтесь, что имеются по
крайней мере три отдельно управляемых дисковых ресурса.
Конфигурирование некоторых параметров настройки окружения — важная задача,
выполняемая на этом этапе наряду с инсталляцией Oracle на хост-машине другой базы
данных Oracle и требующая выключения и резервного копирования баз
данных Oracle, работающих на данном хосте. И наконец, при необходимости
убедитесь, что на машине установлены обновления операционной системы,
рекомендуемые Oracle. Более подробно каждый из этих пунктов
рассматривается ниже:
■ Убедитесь, что машина имеет достаточную производительность, чтобы
работать с Oracle. Почти любая современная машина имеет достаточную
производительность, чтобы на ней можно было успешно установить
Oracle. Однако полнофункциональное приложение базы данных Oracle
Enterprise может работать не на каждой машине. Перед созданием окружения
Oracle оцените, хватит ли на вашей хост-машине процессора, памяти и
дискового пространства для работы базы данных Oracle в
многопользовательской среде.
■ Убедитесь, что имеются по крайней мере три отдельно управляемых
дисковых ресурса. В работающей базе данных Oracle есть много самостоятельно
работающих компонентов. Часто эти компоненты работают
одновременно. Размещение всех ресурсов Oracle на одном и том же жестком диске —
рецепт низкой производительности при любых настройках баз данных,
кроме самых маленьких однопользовательских баз данных. Oracle
рекомендует три отдельно управляемых дисковых ресурса. Инсталляция
производственной базы данных Oracle Enterprise может потребовать более 20
таких ресурсов. Еще раз подумайте, прежде чем создавать базу данных.
386
Глава 10
■ Сконфигурируйте некоторые параметры окружения. Возможно, до
создания базы данных потребуется сконфигурировать несколько переменных
окружения, например ORACLE_BASE, ORACLE_HOME, ORACLE_SID,
ORA_NLS33, LD_LIBRARY_PATH и другие. Это элементы, которые
настраиваются в машинных или пользовательских файлах конфигурации.
По возможности следует соблюдать требования OFA. Эта директива
рекомендуется Oracle для путей доступа к каталогам файловой системы, и ее
соблюдение поможет отделу поддержки Oracle найти файлы, когда вы
обратитесь к ним в случае необходимости поддержки продукта в аварийной
ситуации.
■ Закройте и создайте резервные копии других баз данных Oracle, работающих
на хосте. Никогда не инсталлируйте базу данных Oracle на машине,
которая уже является хостом для Oracle, не выключив эту другую базу данных и
не создав ее резервную копию, хотя, возможно, вам нравится сидеть
часами в вычислительном центре, трудясь над восстановлением данных.
Ключевое слово reuse в команде create database, а также параметр
CONTROL_FILES в файле initsid.ога позволяют записывать одну базу
данных Oracle поверх файлов другой базы данных на той же самой
машине. Этой проблемы можно избежать, потратив время на резервное
копирование данных и размещение файлов разных баз данных Oracle в разные
каталоги.
■ Установите на машине рекомендуемые Oracle обновления операционной
системы. Этот заключительный этап — вопрос не столько инсталляции
программного обеспечения Oracle, сколько создания базы данных. Поскольку
точная версия операционной системы и требуемые обновления
изменяются в зависимости от операционной системы, конкретные особенности
следует искать в руководстве по установке Oracle, поставляемом вместе
программным обеспечением, но не забывайте, что для надлежащей работы
Oracle могут потребоваться обновления операционной системы.
■ Выполните специальные задачи для UNIX. Только для UNIX отредактируйте
файл oratab, чтобы включить в него имя создаваемой базы данных, ее
ORACLE_HOME и необходимость автоматического выключения
экземпляра, запуска или выключения системы. Эта задача не является
обязательной для работы Oracle, но необходима для многих задач
администрирования.
Использование OFA
Реализация стандарта OFA, возможно, самое важное, что следует сделать,
чтобы администрирование было простым и чтобы удалось избежать различных
проблем. Мы уже подробно обсудили OFA в предыдущих разделах этой главы.
Удостоверьтесь, что создан каталог администрации под ORACLE_BASE (вы
конфигурируете каталог.для ORACLE_BASE, например домашний каталог
владельца ПО Oracle, в рамках конфигурирования параметров окружения) для
хранения административных и диагностических файлов базы данных. Если
файлы данных создаваемой базы данных хранятся в своих собственных
каталогах, как рекомендуется в OFA, тогда обеспечьте создание каталогов. В UNIX
эти файлы данных не создаются, пока не будут созданы каталоги.
Подготовка файла параметров
Файл параметров уже рассматривался, поэтому теперь сосредоточимся на
значениях, которые следует задавать для создания новой базы данных Oracle. Как
уже говорилось, Oracle поставляет родовую копию файла параметров
initsid. ога на дистрибутивах ПО, используемого для инсталляции сервера
Oracle на хост-машине базы данных Oracle. Как правило, администратор БД берет
этот универсальный файл параметров и изменяет некоторые параметры в
соответствии со своей ситуацией. Несколько параметров следует изменить в
Основы архитектуры базы данных Oracle
387
рамках инсталляции новой базы данных. В следующих подразделах
рассматриваются и описываются параметры, требующие изменения.
DB_NAME Это локальное имя базы данных на хост-машине базы данных
Oracle и один из компонентов уникального имени базы данных в сети. Если
значение этого параметра совпадает с именем другой базы данных Oracle,
работающей на хосте, создание такой базы данных может стать причиной
постоянного повреждения данных. Старайтесь, чтобы это имя не превышало
восьми символов. Не оставляйте имя DEFAULT. Есть имя базы данных, а есть имя
экземпляра, и они должны быть одинаковыми. Для создания базы данных
требуется DBNAME, и оно должно быть уникально среди всех баз данных
Oracle, работающих в вашей организации.
DB_DOMAIN В имени базы данных это указание на местоположение
домена в сети. Это второй компонент уникального имени базы данных в сети.
Обычно он задается как WORLD или имя домена в адресе электронной почты
вашей организации, например EXAMPILOT.COM.
DB_BLOCK_SIZE Это размер в байтах блоков данных в пределах системы.
Это стандартный размер блока данных в Огас1е9/. Блоки данных являются
неделимыми компонентами файлов данных, в которых Oracle размещает
необработанные данные из индексов и таблиц. Это единственный параметр, который
нельзя изменить после создания базы данных. Огас1е9/ поддерживает
несколько размеров блока. Стандартный размер блока определяется параметром
DB_BLOCK_SIZE, и он поддерживает дополнительно четыре нестандартных
размера блока. Стандартный размер блока используется для табличного
пространства SYSTEM, в то время как нестандартный размер блока можно задать
при создании табличных пространств.
CONTROL_FILES Это имя или перечень имен управляющих файлов базы
данных. Управляющие файлы документируют местоположение всех дисковых
файлов, используемых Oracle. Если указанные для этого параметра имена не
соответствуют имеющимся в настоящее время именам файлов, Oracle создаст
новый управляющий файл для базы данных при запуске только тогда, когда вы
создадите новую базу данных. В противном случае Oracle просто сообщает, что
запуск не начнется, потому что она не может найти управляющие файлы,
необходимые для открытия существующей базы данных. Только во время создания
новой базы данных Oracle перезапишет содержимое файла с тем же именем, как
у управляющего файла, заданного в файле initsid. ora, с физическим
размещением создаваемой базы данных. Будьте осторожны с этим свойством,
поскольку оно может привести к перезаписи управляющего файла в существующей
базе данных, если создается вторая база данных, которая будет работать на той
же самой машине.
DB_CACHE_SIZE DB_BLOCK_BUFFERS все еще существовует в Огас1е9/,
но используется для обратной совместимости. В отличие от DB_BLOCK_
BUFFERS, определяющего число буферов, равных по размеру блоку данных,
которые могут храниться в SGA, Oracle9i предоставляет новый параметр,
DB_CACHE_SIZE, используемый для определения размера буферного кэша в
Oracle SGA. Он определяет размер заданного по умолчанию буферного пула
для буферов со стандартным размером блока (как определено в параметре
DB_BLOCK_SIZE). В отличие от DB_BLOCK_BUFFERS, который задается
как число буферов, этот новый параметр задается в байтах.
LOG_BUFFER Это размер буфера журнала базы данных в байтах. Как уже
говорилось, буфер журналов повторов позволяет хранить записи журнала базы
данных в памяти, пока LGWR не сможет записать их в оперативный журнал
на диске. Подробнее об этом см. в главе 11.
UNDO_MANAGEMENT Этот параметр задается как AUTO, т.е. Огас1е9/
автоматически берет на себя управление сегментом отмены. Сегмент
отмены — это то же, что и сегмент отката. Начиная с Огас1е9/ вам больше не
придется создавать сегмент отката вручную.
388
Глава 10
UNDO_TABLESPACE Этот параметр задается как имя табличного
пространства, в котором будут размещаться сегменты отмены, генерируемые и
управляемые автоматически Oracle. Убедитесь, что вы определяете и
используете табличное пространство, в котором размещаются только сегменты
отмены.
PROCESSES Это число процессов, которые могут устанавливать
соединение с Oracle в любое время. Это значение включает в себя фоновые процессы
(которых имеется по крайней мере пять) и серверные процессы. Необходимо
задать его достаточно высоким во избежание ошибок, не дающих
пользователям устанавливать соединения.
Свойство "Файл параметров сервера" в Oracle9/
Файл параметров сервера (Server Parameter File) — новое свойство в Огас1е9/.
Оно позволяет освободиться от хлопот, связанных с постоянным обновлением
файла init. ora своими силами всякий раз, когда вы решите, что следует
изменить параметр инициализации. Это очень приятно, учитывая, что Огас1е9<
также позволяет изменять почти все параметры инициализации, которые вам
когда-либо хотелось изменить динамически, пока база данных находится в
оперативном режиме и доступна для пользователей. Oracle способна также в
значительной степени самонастраиваться благодаря способности
динамически управлять своими настройками параметров инициализации. Кроме того,
свойство "файл параметров сервера" позволяет Огас1е9/ запоминать
настройки для параметров инициализации, которые были динамически изменены во
время сеансов.
Файлы параметров сервера создаются из стандартных файлов init.ora.
Они размещаются в базе данных Oracle, поэтому, очевидно, они будут
доступны только после создания базы данных. Файл параметра сервера можно
создать следующим способом:
1. Вы определяете настройки, желательные для начальной конфигурации Огас-
1е9/ базы данных. Конфигурация до фактического создания базы данных
осуществляется с использованием рекомендаций, о которых уже шла речь, путем
создания файла init.ora. Можно воспользоваться тем, который у вас уже
есть, пока не будут внесены изменения, о которых мы уже говорили.
2. Затем вы создаете базу данных.
3. Когда база данных уже существует, вы вводите команду create spf ile,
которая создаст файл серверных параметров следующим образом:
SQL> create spfile from
2 pfile - '/uOl/app/oracle/admin/oracle/pfile/init.ora';
В этой точке Oracle9i создаст файл параметров сервера на хост-машине
базы данных Oracle. Oracle9/ сможет обновлять этот файл каждый раз, когда
вы используете команду alter system set init_parm = value для
динамического изменения настроек. Oracle 9/ будет также считывать этот файл при
каждом запуске экземпляра в дополнение к файлу init.ora, чтобы определить,
какие настройки использовать первоначально при запуске экземпляра. В
команде alter system теперь есть новая фраза scope, которая помогает
указать, нужно ли Oracle обновлять свой файл параметров сервера новыми
настройками или нет. Фраза scope имеет три настройки: SPFILE, MEMORY или
BOTH. Если задать область динамического изменения параметров как SPFILE
или MEMORY, то Огас1е9/ изменит настройку параметра в файле параметров
сервера или только существующую конфигурацию памяти экземпляра
соответственно. Если использовать BOTH, то Огас1е9/ задаст новое значение
параметра в файле параметров сервера и изменит текущий экземпляр. Следующий
блок кода содержит соответствующий синтаксис для всех трех настроек:
КДЯЙЙ5№ alter system set shared_pool_size ~ 104B5760 scope = spfile;
alter system set shared_pool_size = 104B5760 scope - memory;
alter system set shared_pool_size - 104B5760 scope - both;
Основы архитектуры базы данных Oracle
389
Совет Вы можете также экспортировать содержание вашего файла
параметров сервера в традиционный файл init.ora с помощью команды
create pfile from spfile.
Закрепление пройденного материала
1. Необходимо знать о существовании определенных параметров файла
init.ora, которые следует изменить, чтобы создать новую базу данных,
например CONTROL_FILES, DB_NAME и DB_BLOCK_SIZE, особенно
если вы скопировали файл init.ora из другого местоположения базы
данных. Если этим параметрам не присвоено значение, соответствующее
новой базе данных, а на хост-машине есть существующая база данных,
можно повредить эти существующие базы данных.
8. Необходимо знать о новом свойстве SPFILE, предоставляемом Огас1е9/для
динамической конфигурации параметров экземпляра, управления и
оптимизации.
Упражнения
1. Вы готовитесь создать базу данных Oracle. Какой из следующих параметров
файла init. ora следует изменить, чтобы создать новую базу данных,
которая не будет сталкиваться ни с какими существующими базами данных
Oracle на хост-машине, если скопировать для использования в ней файл
init.ora одной из тех других баз данных?
A. CONTROL_FILES
B. DB_BLOCK_SIZE
С DB_DOMAIN
D. SHARED_POOL_SIZE
2. Вы конфигурируете файл init .ora для создания новой базы данных.
Какой из следующих параметров является более новой версией параметра
DB_BLOCK_BUFFERS?
A. DB_CACHE_SIZE
B. SHARED_POOL_SIZE
С LARGE_POOL_SIZE
D. JAVA_POOL_SIZE
3. Это — название свойства, которое позволяет Oracle динамически управлять
своими собственными настройками init. ora (три слова): .
Ответы
1. А 2. А. 3. Файлы параметров сервера
Создание баз данных с помощью
Database Configuration Assistant
Oracle Database Configuration Assistant — одно из многих инструментальных
средств фафического пользовательского интерфейса, предлагаемых Oracle для
поддержки вашей базы данных Oracle. Database Configuration Assistant
используется для создания базы данных и проделывает много сложной работы
дополнительно, так что вы не должны ее делать. С Database Configuration Assistant вы
легко сможете выполнять следующие задачи:
■ Создавать базу данных можно с нуля, определяя всю информацию,
необходимую для ее создания. Вы можете или указать инструментальное сред-
390
Глава 10
ство для создания базы данных, после того как определите информацию,
или создать сценарии, необходимые для создания базы данных вручную,
или хранить информацию в шаблоне, который будет использован позднее
для создания других баз данных. Именно последнее свойство делает этот
инструмент очень полезным для администраторов БД. Вы узнаете об этом
больше из следующих разделов.
Ш Можно удалить существующую базу данных.
Ш Можно клонировать существующую базу данных с данными и без них.
Можно также перепроектировать шаблон существующей базы данных.
Совет Database Configuration Assistant использует стандарты OFA, поэтому
файлы базы данных, административные файлы и файлы параметров
соответствуют стандартам именования и размещения, принятым в OFA.
Шаблоны Database Configuration Assistant
Понятие шаблона возникло в Oracle9i. Шаблон — это определение базы
данных. Oracle предусматривает набор предопределенных шаблонов, a Database
Configuration Assistant позволяет вам создавать специальные шаблоны для
ваших собственных нужд. При создании шаблона вы можете определять все что
угодно, например местоположения файлов управления, файла журнала базы
данных, файлов баз данных, размер вашего SGA, местоположения
административных файлов, параметры в файле init.ora и многое другое. Database
Configuration Assistant был создан еще более простым и позволяющим
определить переменные, обычно определяемые как часть конфигурирования
окружения Oracle. Например, если вы знакомы с UNIX, эти настройки окружения
— это то, что раньше находилось, например в файле profile. Эти
переменные, например ORACLE_BASE, SID и другие, могут использоваться в именах
файлов и т. п. для их замены информацией, относящейся конкретно к
создаваемому вами экземпляру.
Совет Даже учитывая, что Database Configuration Assistant в версии Oracle8i
предлагал основной способ создания базы данных, он ограничивался только
созданием баз данных несколькими простыми способами. Теперь Database
Configuration Assistant — законченный продукт, способный определять
практически любой аспект ваших баз данных, используемых для различных целей,
включая базы данных обработки транзакций, системы поддержки решения,
информационные хранилища и гибридные базы данных.
Для создания базы данных можно выбрать существующий шаблон,
предлагаемый Oracle, или создать шаблон, созданный для удовлетворения ваших
потребностей. Если у вас есть шаблон базы данных, который довольно близок к
тому, что вы создаете, воспользуйтесь этим шаблоном, измените кое-что и
используйте его для создания своей базы данных. Это инструмент, экономящий
время администраторов БД.
Создание базы данных с помощью
Database Configuration Assistant
Database Configuration Assistant может создать базу данных из
предопределенных шаблонов, предлагаемых Oracle, либо из созданных вами
специализированных шаблонов или может просто создать базу данных без каких-либо
шаблонов. Мастер Database Configuration Assistant показывает те же самые окна,
которые используются при создании шаблона, и собирает необходимую
информацию для создания базы данных. В качестве заключительного шага вы
могли бы просто создать базу данных, или просто создать базу данных и
сохранить сценарии создания базы данных, или просто сохранить сценарии.
Можно выбрать последнюю опцию, чтобы посмотреть сценарии и выполнить их
вручную для создания базы данных.
Основы архитектуры базы данных Oracle
391
Закрепление пройденного материала
1. Необходимо знать основное применение Oracle Database Configuration
Assistant; убедитесь, что можете описать преимущества использования этого
инструмента по сравнению с созданием базы данных Oracle вручную.
2. Необходимо понимать концепцию шаблона базы данных. Убедитесь, что
можете описать преимущества, предлагаемые шаблонами базы данных.
3. Необходимо знать, что любая база данных, созданная Database
Configuration Assistant, будет совместима с OFA в отношении размещения ее
каталога и файлов.
Упражнения
1. Вы создаете базы данных Oracle в хост-системе. Какой из следующих
вариантов указывает, что для этого лучше использовать Database Configuration
Assistant, а не создавать базу данных вручную?
A. Database Configuration Assistant упрощает многие из вспомогательных
задач, которые иначе пришлось бы выполнять вам.
B. С Database Configuration Assistant вы можете лучше контролировать
размещение некоторых файлов данных.
С Интерфейс Database Configuration Assistant управляется мастером и
поэтому сложен.
D. Database Configuration Assistant упрощает создание баз данных Oracle,
создавая базы данных, подходящие только для одной цели.
S. Вы используете Database Configuration Assistant для конфигурации базы
данных Oracle. Какой из следующих терминов относится к созданию
объекта, на котором может основываться создание других баз данных?
А. Клон В. Копия
C. Шаблон D. Терминал
Ответы
1. А. 2. С.
Создание базы данных вручную
Конечно, у вас также есть возможность создания базы данных
самостоятельно, вручную. Кроме того, есть некоторые убедительные причины поступить
именно так. Во-первых, вы сохраняете контроль над нюансами создания базы
данных. Использование сценариев для создания базы данных также
предоставляет вам шаблон сортировок, на которых может основываться создание
других баз данных. Сценарии могут пригодиться, если вы хотите создать базу
данных на удаленной машине и не имеете доступа к графическому рабочему
столу удаленной машины для запуска на ней Database Configuration Assistant.
Команда create database создает базу данных Oracle. Перед созданием базы
данных выполняются следующие шаги:
1. Убедитесь, что файл init.ora существует и записи в нем ссылаются на
правильное имя базы данных. Вы можете выполнить операцию
глобального поиска и замещения, чтобы идентифицировать и исправить
несоответствия в любом текстовом редакторе, но убедитесь, что контролируете
каждую ситуацию вручную, чтобы не допустить случайной ошибки. Теперь
пора проверить в последний раз точность указания в этом файле
местоположения управляющих файлов.
2. Убедитесь, что каталоги, указанные для BACKGROUND_DUMP_DEST,
USER_DUMP_DEST, CORE_DUMP_DEST, UTL_FILE_DIR и любых
392
Глава 10
других административных каталогов, используемых Oracle, на самом деле
существуют в файловой системе. Если их нет, процесс создания новой
базы данных может потерпеть неудачу при запуске экземпляра.
3. Запустите SQL'Plus и установите соединение с базой данных как sys как
sysdba.
4. Запустите экземпляр в режиме nomount, чтобы для этого экземпляра
нельзя было смонтировать существующую базу данных.
5. Выполните команду create database для создания базы данных,
напечатав ее в SQL*Plus или выполняя сценарий, содержание которого
аналогично блоку кода с командой create database, как показано ниже:
CONNECT SYS AS SYSDBA
CREATE DATABASE orgdbOl
CONTROLFILE REUSE
LOGFILE
GROUP 1 C/u01/oradata/oracle/redola.log',
'/u02/oradata/oracle/redolb.log') SIZE 5M,
GROUP 2 C/u02/oradata/oracle/redo2a.log',
,/u01/oradata/oracle/redo2b.log') SIZE 5M
MAXLOGFILES 40
DATAFILE '/u03/oradata/oracle/sys01.dbf'
SIZE 50M AUTOEXTEND ON NEXT 30M MAXSIZE 150M
MAXDATAFILES 240
CHARACTERSET WE8IS08859P1;
EXIT;
6. Если процесс создания базы данных прошел успешно, можно монтировать
только что созданную базу данных с помощью команды alter database
mount, а затем открыть ее с помощью команды alter database open.
Теперь база данных содержит одно табличное пространство SYSTEM с одним
или более файлами данных.
7. Затем создайте табличное пространство для сегментов отмены,
пользователей, временных и других данных. Мы рассмотрим некоторые примеры
команды create tablespace в главе II.
8 В версиях Oracle до Огас1е9/ затем вы создали бы сегменты отмены и
перевели их в оперативный режим. В Огас1е9/, однако, надо всего лишь создать
табличное пространство отмены — Oracle создает свои собственные
сегменты отмены.
9. И наконец, выполните предлагаемые Oracle сценарии создания словаря
данных (также называемого каталогом, Catalog) и других объектов базы
данных, необходимых для администрирования базы данных.
Что происходит при выполнении команды
create database
При создании базы данных в режиме nomount Oracle считывает файл
init.ora, который используется для выяснения, где создать управляющие
файлы. Oracle также использует настройки для параметров из этого файла,
чтобы определить размер SGA, где разместить системные журналы и
трассировочные файлы и другую важную информацию. На основании этой
информации она создает SGA в памяти и фоновые процессы.
■ При выполнении команды create database создаются управляющие
файлы, как это определено в файле init. ora, и файлы журнала базы
данных, и табличное пространство SYSTEM, как это определено в самой
команде.
■ Создаются учетные записи SYS и SYSTEM. Единственный сегмент
отмены создается в табличном пространстве SYSTEM.
Основы архитектуры базы данных Oracle
393
Файлы данных табличного пространства SYSTEM
Файлы, созданные как часть фразы dataf ile команды create database, —
это файлы данных табличного пространства SYSTEM. Табличное пространство
(tablespace) — это логическая совокупность дисковых файлов, совместно
используемых для хранения данных. Табличное пространство SYSTEM можно
сравнить с корневым каталогом файловой системы машины. В табличном
пространстве SYSTEM размещаются таблицы, составляющие основу словаря
данных Oracle, а также сегменты отмены на системном уровне. Таблицы
словаря данных и сегменты отмены на системном уровне будут принадлежать
пользователю SYS. При создании базы данных Oracle создает один сегмент
отмены на системном уровне в табличном пространстве SYSTEM, который
требуется Oracle при запуске базы данных. Без этого сегмента отмены на
системном уровне база данных не запустится. В интересах сохранения
целостности базы данных Oracle администратор БД должен сделать так, чтобы в
табличном пространстве SYSTEM находились только словарь данных и сегмент
отмены на системном уровне. Никакие объекты данных, принадлежащие
любому пользователю, кроме пользователя SYS, не должны размещаться в
табличном пространстве SYSTEM. Вместо этого вы создадите другие табличные
пространства для хранения таких объектов базы данных. Подробнее
табличные пространства и файлы данных рассматриваются в главе 11.
Минимум две группы оперативных журналов
базы данных
Журналы базы данных создаются с помощью фразы logfile. Журналы базы
данных — это записи изменений данных, произведенных в базе данных. Для
новой базы данных следует создать как минимум две группы журналов базы
данных, в каждой должен находиться минимум один член. В базе данных, созданной
в предыдущем блоке кода, первая группа журналов базы данных состоит из двух
членов, называемых logla. dbf и loglb. dbf соответственно. Если любой файл,
указанный в KOMaHnecreate database, в настоящее время существует в
системе и используется ключевое слово reuse, Oracle перезапишет файл. Будьте
осторожны при многократном использовании файлов во избежание случайной
перезаписи файлов в существующей базе данных на хост-машине. Подробнее
журналы базы данных рассматриваются в главе 11.
Другие элементы команды create database
Другой набор опций, задаваемых при создании базы данных, включает в себя
maxdatafiles Hmaxlogfiles. Опция maxdatafiles используется для
указания максимального числа файлов данных, которые можно открыть, когда
открыта база данных. Установка этого числа определяет размер, сохраняемый в
управляющем файле для хранения информации о файлах данных. Например,
если задать эту опцию как 100, но создать только десять файлов данных, Oracle
создаст управляющий файл, который будет способен хранить информацию
для 100 файлов данных. Параметр инициализации DB_FILES также
определяет максимальное число файлов данных, которые являются доступными для
базы данных. Если попытаться добавить больше файлов, чем определено в
maxdatafiles, но меньше, чем в параметре инициализации DB_FILES, то
Oracle автоматически расширит управляющий файл, чтобы подогнать под рост
файлов.
Опция maxlogf iles определяет максимальное число групп журналов базы
данных, а опция maxlogmembers определяет максимальное число членов
группы журналов базы данных, которое может быть создано в базе данных.
Эти настройки определяют объем пространства, сохраняемого в управляющем
файле для хранения информацию о группах журналов базы данных и членах
групп.
При определении файлов данных можно воспользоваться опцией autoex-
tend. Если использовать эту опцию, при заполнении файлов данных им авто-
394
Глава 10
матически выделяется дополнительное место вплоть до общего размера,
указанного ключевым словом maxsize. Однако придется позаботиться, чтобы
Oracle не пыталась расширить файл данных на большее пространство, чем
доступно в файловой системе.
characterset — это заключительный компонент команды create
database, который используется для идентификации набора символов,
используемого в базе данных Oracle для хранения информации. Еще одна опция,
которую можно использовать в командах create database, это archivelog. Если
она используется, Oracle архивирует созданные файлы журнала базы данных.
И наконец, команда create database использует несколько параметров
инициализации, заданных в файле initsid.ora при создании базы данных. К
ним относятся DB_BLOCK_SIZE и некоторые настройки окружения
поддержки национального языка (National Language Support, NLS).
Закрепление пройденного материала
1. Необходимо знать процесс создания базы данных вручную с помощью
команды create database. Убедитесь, что можете идентифицировать
различные фразы, используемые в рамках этой команды.
2. Убедитесь, что понимаете, что любые созданные командой create
database файлы данных будут принадлежать табличному пространству
SYSTEM. Кроме того, в рамках этого процесса вы должны создать
минимум два оперативных журнала базы данных.
3. При создании базы данных Oracle вручную следует знать, что ваш
экземпляр должен быть запущен, но нельзя иметь никакой другой базы данных,
уже смонтированной для этого экземпляра.
Упражнения
1. Вы собираетесь вручную создать базу данных в Oracle. Какая из следующих
команд startup подошла бы для экземпляра в этом контексте?
A. startup nomount
B. startup mount^
С Startup open
D.startup force
2. Вы только что создали базу данных Oracle с помощью команды create
database. К какому из следующих табличных пространств будет
принадлежать файл данных, идентифицируемый в рамках фразы datafilt
команды create database?
A. DATA
B. INDEX
C. UNDO_TBS
D. SYSTEM
Ответы
1. A. 2. D.
Резюме главы
Эта глава охватила несколько важных тем, которые надо подготовить к
первому экзамену. Первой из рассмотренных тем было теоретическое обоснование
архитектуры базы данных Oracle. Вы узнали о структурах памяти, дисковых
файлах и фоновых процессах, используемых вместе с Oracle, и подробно разо-
Основы архитектуры базы данных Oracle
395
брали каждую из этих областей. Мы также рассмотрели, как Oracle
подключает пользователей к базе данных для доступа к данным и работе с ними. Затем
мы обсудили, с чего должен начать администратор БД системы Oracle. Была
рассмотрена инсталляция Oracle с помощью Oracle Universal Installer (OUI) и
были перечислены административные компоненты Oracle, которые поставля
ются вместе с базой данных. Мы также вкратце рассмотрели Oracle Enterprise
Manager (OEM), графический инструмент Oracle для обработки многих
стандартных административных задач. Мы также описали создание файлов
паролей. После этого мы сосредоточились на управлении экземпляром Oracle. В
этой главе мы несколько раз указывали на различие между экземпляром Oracle
и базой данных. Вы узнали о том, как запустить и выключить выполняющийся
экземпляр, и о различных методах открытия и выключения базы данных. Мы
много говорили о параметрах инициализации, а также о файлах параметров.
Было рассмотрено использование системных журналов и трассировочных
файлов, связанных с администрированием базы данных Oracle, — очень
важное положение, знание которого проверяется на первом экзамене. Было также
рассмотрено до некоторой степени новое свойство Oracle9/ — Oracle-Managed
Files (OMF). И наконец, мы сосредоточились на понимании процесса
создания базы данных с помощью Database Configuration Assistant под управлением
мастера, вручную с помощью сценариев и командой create database. Это
важная глава, охватьшающая приблизительно 20% материала, проверяемого
на первом экзамене.
Двухминутное погружение в пройденное
Ш Для подключения пользователей к серверам Oracle используются
несколько структур. Это структуры памяти, например системная глобальная
область (SGA) и программная глобальная область (PGA); сетевые процессы,
например прослушивающие процессы и диспетчеры, разделяемые или
выделенные серверные процессы; а также фоновые процессы, например
процесс записи в базу данных (DBW0) и процесс записи в журнал
(LGWR).
Ш SGA состоит из буферного кэша для хранения блоков данных, к которым
обращались в последнее время, буфера журнала базы данных для хранения
записей о повторах, пока их нельзя записать на Одиск, и разделяемого пула
для хранения анализируемой информации о недавно выполненном SQL
для совместного использования кода.
Ш Основополагающий модуль памяти в Oracle — блок данных.
Ш Команды SQL select обрабатываются следующим образом: открывается
курсор или адрес в памяти, анализируется команда, создаются
переменные связывания, выполняются команды и выбираются значения.
Ш Такие команды SQLDML, как update, delete и insert, обрабатываются
следующим образом: открывается курсор или адрес в памяти, команда
анализируется и выполняется.
Ш Способностью Oracle записывать данные из буферного кэша и буфера
журнала базы данных в соответствующие области на диске управляют
несколько фоновых процессов. Это DBW0, поддерживающий запись данных
между диском и буферным кэшем, и LGWR, поддерживающий запись
полей между буфером журнала базы данных и диском для входа в сеть, на
котором записываются оперативные повторы.
Ш DBW0 пишет данные на диск в трех случаях. Эта запись производится
каждые три секунды (когда возникает простой) по указанию LGWR (в
течение контрольной точки), или когда заполнился буферный кэш, или
когда серверному процессу необходимо место для буферов, требуемых
пользовательскими процессами.
396
Глава 10
■ Серверные процессы похожи на джинна из сказки про Аладцина, потому
что извлекают данные с диска в буферный кэш по команде пользователя.
■ Существуют две конфигурации серверных процессов: разделяемые и
выделенные серверы. В выделенных серверах, прослушивающий процесс
слушает пользователей, устанавливающих соединение с Oracle. Когда он
слышит пользователя, то дает Oracle указание создать выделенный сервер.
У каждого пользовательского процесса есть свой собственный серверный
процесс, доступный для извлечения данных с диска.
I При конфигурации разделяемого сервера (также называемой
конфигурацией многопоточного сервера [multithreaded server, MTS])
пользовательский процесс пытается установить соединение с Oracle. Прослушивающий
процесс слушает соединение и передает пользовательский процесс
процессу диспетчера. Диспетчер контролирует ограниченное число серверных
процессов, каждый из которых обрабатывает запросы нескольких
пользователей, и назначает пользовательские процессы на разделяемый сервер
на основании того, у какого из этих процессов минимальная нагрузка во
время пользовательского подключения.
■ Команда commit может запустить в Oracle запись измененных данных из
буферного кэша на диск, но не обязательно. Она только создает запись в
буфере журнала базы данных, в которой говорится, что все связанные с
конкретной транзакцией измененные данные теперь зафиксированы.
I Universal Installer (OUI) — это написанная на языке Java программа
установки ПО Oracle, работающая на нескольких платформах.
Ш OUI обеспечивает автоматизированную, неинтерактивную программную
инсталляцию с помощью файлов наводящих сообщений.
■ При установке Oracle?// на некоторых платформах необходимо убедиться,
что программное обеспечение устанавливается в отдельный домашний
каталог. Это требуется в новой версии OUI.
Ш OUI может установить для вас предварительно сконфигурированную базу
данных, минимально взаимодействуя с пользователем. В этом случае все
сценарии, например catalog. sql и catproc. sql, выполняются
автоматически, а несколько основных табличных пространств, например DATA,
INDEX и UNDOTBS, создаются со следующей информацией:
■ SID — ORCO ИЛИ ORCL.
■ пароль SYS — change_on_install.
■ пароль SYS как SYSDBA — Oracle.
■ пароль SYSTEM — manager.
I Oracle?// позволяет динамически изменять большинство параметров
экземпляра, в то время как база данных доступна для использования. Например,
параметры SGA могут быть изменены так, что можно производить
изменения в разделяемой памяти Oracle?//, в то время как база данных работает
в оперативном режиме.
Ш Свойство server parameter file в Oracle?// позволяет создать файл параметров
сервера, который Oracle?// может динамически изменять для поддержки
изменений в конфигурации вашего экземпляра.
Ш Файлы параметров сервера создаются с помощью команды create spf ile
from 'filename'.
Ш Если команда alter system используется в Oracle9/для изменения
настроек параметров экземпляра, можно применить новую фразу scope,
чтобы указать, где Oracle должна изменить параметры экземпляра:
Основы архитектуры базы данных Oracle
397
■ SPFILE Огас1е9/ изменяет значение параметра только в файле
параметров сервера.
■ MEMORY Oracle9/ изменяет значение параметра только для текущего
экземпляра.
■ BOTH Oracle9/ изменяет значение параметра для файла параметров
сервера и текущего экземпляра.
Ш В Oracle существуют два метода аутентификации пользователя:
аутентификация с помощью операционной системы и с помощью Oracle.
■ Администраторам БД необходимы две привилегии для выполнения своих
задач в базе данных. В окружениях, где используется аутентификация с
помощью Oracle, они называются sysdba и sysoper.
■ Чтобы использовать аутентификацию с помощью Oracle, администратор
БД должен создать файл паролей, используя утилиту ORAPWD.
■ Чтобы запускать и выключать базу данных, администратор БД должен
установить соединение как internal или sysdba.
■ Инструментальным средством, применяемым для запуска и выключения
базы данных в Огас1е9/, является SQL*Plus.
Ш Еще одно инструментальное средство, применяемое администрацией для
управления базой данных, — Oracle Enterprise Manager (OEM). OEM
имеет много административных инструментальных средств, включая
Daemon Manager, Instance Manager, Replication Manager, Schema Manager,
Security Manager, SQL Worksheet, Storage Manager, Net8 Assistant и
Software Manager.
■ Существует несколько опций запуска базы данных:
■ startup nomount Запускает экземпляр и не устанавливает базу
данных
■ startup mount Запускает экземпляр и монтирует, но не открывает
базу данных
■ startup open Запускает экземпляр, монтирует и открывает базу
данных
■ startup restrict Запускает экземпляр, монтирует и открывает
базу данных, но ограничивает доступ для тех пользователей, которым
предоставлена привилегия restricted session.
■ startup recover Запускает экземпляр, оставляет базу данных
закрытой и начинает восстановление по сценарию "Сбой диска"
■ startup force Осуществляет запуск экземпляра, у которого
проблемы с запуском или остановкой.
■ Когда база данных открыта, любой пользователь с регистрационным
именем, паролем и привилегией create session может зарегистрироваться в
базе данных Oracle.
■ Закрытие или выключение базы данных должны производиться
администратором БД из SQL*Plus и во время соединения администратора БД с
базой данных как sysdba.
Ш Существует четыре опции выключения базы данных:
■ shutdown normal Никакие новые подключения не разрешаются,
но существующие сеансы могут продолжаться столько, сколько им
необходимо для завершения работы.
398
Глава 10
■ shutdown immediate Никакие новые подключения не разрешаются,
существующие сеансы прекращаются, а их транзакции откатываются
назад.
■ shutdown transactional Никакие новые подключения не
разрешаются, существующим сеансам разрешается завершить текущую
транзакцию, затем их разъединяют.
■ shutdown abort Никакие новые подключения не разрешаются,
существующие сеансы прекращаются, откат для транзакций не
производится.
■ После shutdown abort требуется восстановление экземпляра.
■ Значения параметров инициализации можно получить из нескольких
источников:
■ V$PARAMETER представление производительности
■ Команда show parameter в SQL*Plus
■ Административное инструментальное средство OEM Instance Manager
■ На хост-машине с базой данных Oracle существует несколько важных
системных журналов, функционирующих во время работы базы данных. У
каждого фонового процесса, например LGWR и DBW0, в случае ошибки в
их работе будет трассировочный файл, а у экземпляра есть специальный
трассировочный файл, называемый журналом предупреждающих
сообщений. Трассировочные файлы записываются всякий раз, когда у фонового
процесса возникают проблемы с выполнением. Журнал
предупреждающих сообщений записывается при каждом запуске юга выключении
экземпляра, при каждом изменении структуры базы данных и всякий раз,
когда в базе данных происходит ошибка.
■ Трассировочные файлы и журнал предупреждающих сообщений находятся
в каталоге, на который указывает параметр BACKGROUND_DUMP_DEST
в файле initsid.ora.
■ Перед созданием базы данных следует оценить несколько моментов на
уровне операционной системы:
■ Достаточно ли индивидуальных дисковых ресурсов для работы Oracle
без узких мест в отношении ввода-вывода?
Ш Достаточно ли мощности процессора, памяти и дискового
пространства для обработки Oracle?
Ш Находятся ли дисковые ресурсы для различных баз данных Oracle на
одном и том же хосте в отдельных каталогах?
■ Правильно ли заданы настройки окружения для создания базы данных?
■ Первый шаг при создании базы данных — резервное копирование всех
уже существующих баз данных на хост-машине.
■ Второй шаг при создании базы данных — создание администратором БД
файла параметров с уникальными значениями для нескольких
параметров, включая следующее:
■ DB_NAME Локальное имя базы данных
■ DB_DOMAIN Местоположение базы данных в сети
■ DB_BLOCK_SIZE Размер каждого блока в базе данных
■ DB CACHE_SIZE Размер буферного кэша базы данных
■ PROCESSES максимальное число доступных в базе данных
процессов
Основы архитектуры базы данных Oracle
399
■ UNDO_MANAGEMENT и UNDOJTABLESPACE Определяет, как
Oracle должна обработать конфигурацию и управлять сегментами
отмены
Ш После создания файла параметров администратор БД выполняет команду
create database, которая создает файлы данных для табличного
пространства SYSTEM, первоначального сегмента отмены, пользователей
SYS и SYSTEM и журналов базы данных. База данных создается и
открывается на основании команды create database.
■ Пароль по умолчанию для SYS — change_on_install.
■ Пароль по умолчанию для SYSTEM — manager.
Ш Число файлов данных и журнала базы данных, созданных в течение срока
службы базы данных, может быть ограничено с помощью опций maxdata-
files и maxlogfiles команды create database.
■ Размер файла данных устанавливается при его создании, если только не
используется опция autoextend.
Ш Размер файла управления непосредственно связан с числом файлов
данных и журнала базы данных в базе данных.
Вопросы для самопроверки
1. Параметр инициализации, используемый для указания имени базы данных
Oracle: : .
2. Для увеличения размера файла данных можно использовать эти ключевые
слова, чтобы Oracle могла при необходимости автоматически добавлять
дополнительное место: .
3. После создания базы данных можно изменять размер блока базы данных со
следующей частотой: .
4. Из всех опций database shutdown для этой требуется восстановление
экземпляра, когда база данных будет запущена в следующий раз: .
5. Утилита, которая поддерживает идентификацию файла паролей, создавая
файл пароля, — это .
Вопросы ко всей главе
1. Пользователь выполняет команду select. Какой из следующих фоновых
процессов получит данные с диска для пользователя?
A.DBW0
B. LGWR
C. SERVER
D. USER
E. DISPATCHER
2. Чтобы решать административные задачи в базе данных с помощью
аутентификации по паролю Oracle, администратор БД должен иметь следующие
две привилегии:
A. sysdba или sysoper
B. CONNECT или RESOURCE
С restricted session или create session
3. В каком из компонентов SGA хранятся проанализированные команды SQL,
используемые для разделения процесса?
400
Глава tO
A. Буферный кэш
B. Частная область SQL
С Буфер журнала базы данных
D. Библиотечный кэш
E. Кэш строки
4. Какой из следующих вариантов не соответствует аспекту архитектуры
обработки с помощью разделяемого сервера?
A. Каждый пользователь получает свой собственный серверный процесс
для поиска данных.
B. Привлекается процесс диспетчера.
С Привлекается прослушивающий процесс.
D. Серверный процесс редко простаивает.
5. Какой из следующих вариантов является параметром initsid. ora,
указывающим на размер каждого буфера в буферном кэше?
A. DB_BLOCK_BUFFERS
B. BUFFER_OSIZE
С DB_BLOCK_SIZE
D. ROLLBACK_SEGMENTS
6. Для какого из следующих компонентов базы данных указываемые в
команде create database файлы данных используются как память?
A. Табличное пространство SYSTEM
B. Файл initsid.ora
С Член группы журналов базы данных
D. Журнал предупреждающих сообщений
7. Для какого из следующих вариантов изменится пароль при изменении
пароля для управления файлом пароля?
A. SYSTEM
B. RPT_BATCH
С CONNECT
D. SYS
8. Какой из следующих вариантов является заданным по умолчанию паролей
для пользователя SYS?
A. change_on_install
B. NO_PASSWORD
С manager
D. ORACLE
E.NULL
9. Администраторы БД, планирующие удаленно управлять базой данных,
должны использовать все следующие варианты, за исключением какого?
A.ORAPWD
B. REMOTE_LOGIN_PASSWORDFTLE, заданный как shared
C. OS_AUTHENT_PREFIX, заданный как OPS$
D. Файл паролей
10. Через 2 минуты на машине, где работает Oracle, произойдет отключение
питания, а пользователь JASON уехал в этот день, хотя все еще подключен
Основы архитектуры базы данных Oracle
401
к Oracle. Его рабочая станция заблокирована, поэтому его нельзя
выгрузить из системы на рабочем столе. Как администратор БД должен
выключить экземпляр?
A. shutdown normal
В.shutdown immediate
С shutdown abort
D.shutdown force
E.shutdown recover
11. Какое из следующих административных инструментальных средств в
OEM можно использовать, чтобы посмотреть настройки параметров
инициализации для Oracle?
A. Schema Manager
B. Instance Manager
C. Security Manager
D. Data Manager
E. Software Manager
12. Какие два из следующих вариантов необходимы для аннулирования
пользовательского сеанса?
A. Username
B.SID
С Serial number
D. Password
13. Вы используете Universal Installer и Packager для инсталляции Огас1е8/ на
сервере, который уже является хостом базы данных Огас1е7. Какой из
следующих вариантов не должен выполняться при инсталляции Огас1е8/ или
Oracle9i на машине, являющейся хостом для более ранней версии базы
данных Oracle?
A. Выключение сетевого прослушивающего процесса.
B. Выключение базы данных.
C. Резервное копирование существующих баз данных.
О. Инсталляция ПО Огас1е8/ в тот же каталог, который используется для
ПО Огас1е7.
Ответы на вопросы для самопроверки
1. DB_NAME
2. AUTOEXTEND ON
3. НИКОГДА
4. ABORT
5. ORAPWD
Ответы на вопросы ко всей главе
1. С. SERVER
Объяснение Серверный процесс управляет доступом к данным и
извлечением с диска для всех пользовательских процессов, соединенных с Oracle.
Вариант A, DBW0, перемещает блоки данных между диском и буферным кэшем,
402
Глава 10
и поэтому неправильный. Вариант В, LGWR, копирует записи повторов из
буфера журнала базы данных в оперативные файлы журнала базы данных на
диске, и поэтому неправильный. Вариант D, USER, является процессом,
который поддерживается серверным процессом. Вариант Е, DISPATCHER,
используется в архитектуре Oracle MTS и направляет пользовательские процессы
на сервер, но не управляет чтением данных с диска от имени
пользовательского процесса.
2. A. sysdba или sysoper
Объяснение Варианты В и С неправильны. Каждая из перечисленных
привилегий имеет некоторое отношение к доступу, но ни одна из них не
позволяет администрировать. См. выбор метода аутентификации.
3. D. Библиотечный кэш
Объяснение Вариант А неправильный, потому что буферный кэш — это то
место, где хранятся блоки данных для недавно выполненных запросов.
Вариант В неправильный, потому что частная область SQL находится в PGA, где
хранятся фактические значения, возвращенные из запроса, а не информация
анализа для запроса. Вариант С неправильный, потому что записи о повторах
хранятся в буфере файлов журналов базы данных временно, пока LGWR не
сможет записать их на диск. Вариант Е неправильный, потому что кэш строки
хранит информацию строки словаря данных для быстрого доступа
пользователей и Oracle. См. обсуждение архитектуры Oracle.
4. А Каждый пользователь получает свой собственный серверный процесс для
поиска данных.
Объяснение Разделяемый сервер или архитектура MTS использует
несколько элементов, которые соответствуют данным вариантам. Процесс диспетчера
назначает пользователей на разделяемый сервер, а прослушивающий процесс
направляет пользовательские процессы или непосредственно на сервер в
случае обработки на выделенном сервере, или на диспетчер в MTS. Последний
вариант, D, указывает на преимущества архитектуры MTS. Поскольку один и
тот же серверный процесс используется многими пользователями, он будет
простаивать не так часто, как при архитектуре выделенного сервера. Вариант
А указывает только на архитектуру выделенного сервера и является
правильным ответом на вопрос.
5. С. DB_BLOCK_SIZE
Объяснение Поскольку каждый буфер в буферном кэше соответствует
одному блоку данных, размер буферов в буферном кэше блоков базы данных
будет таким же, как у блоков, которые в них хранятся. Размер блоков в базе
данных указывается в DB_BLOCK_BUFFERS. См. параметры инициализации,
изменяемые во время создания базы данных.
6. А. Табличное пространств SYSTEM
Объяснение Поскольку файлы данных могут быть только частью табличного
пространства (подробнее см. об этом в главе 11), все другие варианты следует
сразу исключить. Еще одна причина исключения, по крайней мере, вариантов
В и D — ни файл initsid. ora, ни журнал предупреждающих сообщений не
создаются в команде create database. Поэтому, если вы знаете, что
журналы базы данных включают в себя записи оперативного журнала базы данных, а
табличное пространство, например SYSTEM, состоит из файлов данных, у вас
не будет никаких проблем, если на экзамене вам достанется такой вопрос.
7. D. SYS
Объяснения Вариант А неправильный, потому что пароль SYSTEM не
имеет никакого отношения к паролю для файла паролей, a SYS имеет. Выбор В
неправильный, потому что RPT_BATCH не тот пароль, который создается
Oracle в команде create database. Выбор С неправильный, потому что
CONNECT — это роль, а не пользователь.
Основы архитектуры базы данных Oracle
403
8. A. change_on_install
Объяснение Это — классический пример мелочей, касающихся Oracle.
Запомните это наряду с паролем SYSTEM, которым, кстати, является manager.
Все это замечательно для ОСР, но и другие ухе, возможно, тоже запомнили
это. Не дайте хакеру воспользоваться этой информацией против вас.
Убедитесь, что изменили заданные по умолчанию пароли для SYS и SYSTEM после
создания базы данных.
9. С. OS_AUTHENT_PREFIX, заданный как OPS$
Объяснение Администратор БД должен использовать аутентификацию с
помощью файла паролей, если планирует удаленное управление базой данных.
При этом используются файл пароля, утилита ORAPWD и установка параметра
REMOTE_LOGIN_PASSWORDFILE как shared. Параметр
OS_AUTHENT_PREFIX используется для изменения префикса, который
Oracle требует для пользователей Oracle, когда используется аутентификация с
помощью операционной системы. Разумеется, это не нужно для
аутентификации с помощью пароля Oracle.
10 В. shutdown immediate
Объяснение Отключение электричества может повредить экземпляр Oracle,
если он работает в момент отключения питания. Однако выбор С чересчур
решителен при условии, что вы в основном решаете эту проблем, как если бы
требовалось восстановление носителей данных. В конце концов, вы знаете,
что пользователь JASON не выполняет транзакцию, поэтому никакого
дополнительного времени на откат транзакции перед выключением не потребуется.
Вариант А тоже не делает этого, потому что при shutdown normal придется
ждать JASON всю ночь, чтобы войти в систему и выгрузиться. Вариант В —
логичный выбор. Варианты D и Е — неправильные опции выключения базы
данных.
■ 11. В. Instance Manager
Объяснение Инструментальное средство Instance Manager решает все
задачи, связанные с экземпляром, включая показ и изменение заданных в файле
initsid. ora параметров инициализации. Schema Manager решает все задачи,
связанные с созданием объекта базы данных и его изменением, что исключает
вариант A. Security Manager управляет пользовательскими привилегиями и
ролями, что исключает вариант С. Data Manager обрабатывает загрузку и
выгрузку данных из двоичного формата EXPORT или формата однородного файла,
что исключает выбор D. И наконец, Software Manager управляет
развертыванием ПО Oracle Enterprise, исключая вариант Е.
12. В и С. SID и серийный номер
Объяснение Чтобы разъединить пользователя с базой данных с помощью
команды alter system kill session, необходимо иметь SID и серийный
номер. Эти данные для сеанса, который необходимо аннулировать, можно
найти в представлении словаря V$SESSION. Для установления соединения
необходимы только регистрационное имя и пароль, что исключает варианты А
hD.
13. D. Инсталляция ПО Oracle8/ или Огас1е9/ в том же каталоге, который
используется для ПО Огас1е7.
Объяснение Применяя Univeisal Installer и Packager, вы не можете
инсталлировать Огас1е8/ или Огас1е9/ в том же каталоге, который содержит
предыдущую версию Oracle, установленную с помощью более ранней версии Oracle
Installer. Следует выключить любые существующие версии, баз данных и
прослушивающие процессы, а также выполнить резервное копирование
существующей базы данных перед установкой новой версии Oracle на машине, уже
являющейся хостом для базы данных Oracle.
ГЛАВА 11
Управление физическими
структурами базы данных
Управление физическими структурами базы данных 405
этой главе мы познакомимся со следующими областями, а
потом и продемонстрируем свои знания по ним:
■ Представления словаря данных и стандартные пакеты
■ Работа с управляющим файлом
■ Поддержание файлов журнала базы данных
В этой главе будут подробно рассмотрены физические дисковые ресурсы
Oracle. Дисковые ресурсы Oracle делятся на две категории: физические и
логические. Физические дисковые ресурсы Oracle включают в себя управляющие
файлы, файлы данных и файлы журнала базы данных. Логические дисковые
ресурсы, которые включают в себя табличные пространства, сегменты,
экстенты и блоки Oracle, будут рассмотрены в следующей главе. Прочитав эту
главу, вы поймете, как управляющие файлы, файлы журнала базы данных и
файлы данных работают с фоновыми процессами, для получения рабочей
базы данных. Эти основные положения помогут вам лучше понять остальные
темы этой книги. Кроме того, вы ознакомитесь с важной информацией,
хранящейся в табличном пространстве SYSTEM, — словарем данных.
Содержание и использование
словаря данных
В этом разделе будут рассмотрены следующие разделы, касающиеся
представлений словаря и стандартных пакетов:
■ Ключевые компоненты словаря данных
■ Содержание словаря данных и его использование
■ Как обратиться в представления словаря данных
Словарь данных — это первый набор объектов базы данных, который
администратор БД должен создать после ввода команды create database.
Словарь данных Oracle определенным образом отслеживает каждый объект
базы данных. Вообще, Oracle создает словарь данных без какого-либо
вмешательства со стороны администратора БД во время создания базы данных с
помощью сценариев catalog.sql и catproc. sql. Если для создания базы
данных используется Database Configuration Assistant, он сам позаботится о
выполнении этих сценариев. Если база данных создается вручную, обеспечьте
запуск этих сценариев сразу же после создания базы данных. Этот раздел
посвящен созданию словаря данных с помощью этих сценариев, компонентам
словаря данных и использованию словаря данных.
Построение представлений словаря данных
Первый сценарий, catalog, sgl, используется для создания объектов,
включающих в себя словари данных. Словарь данных обеспечивает виртуальную
поддержку всех аспектов работы базы данных Oracle — от обнаружения
информации об объектах до оптимизации производительности всего, что
находится между ними.
Для создания словаря данных в SQL'Plus запускается сценарий
catalog, sql, все это происходит во время соединения при наличии
административной привилегии sysdba. Этот сценарий исполняет длинный список
команд create view, а также выполняет ряд других сценариев для создания
других представлений словаря данных в специальных областях и специальных
общедоступных синонимах для этих представлений. В сценарии catalog. sql
существуют обращения к нескольким другим сценариям, которые
перечислены ниже:
■ cataudit.sql Создает таблицу словаря SYS.AUD$, которая отслеживает
всю информацию контрольного следа, сгенерированную Oracle при
использовании свойства базы данных аудит (auditing).
406
Глава 11
■ catldr.sql Создает представления, используемые для инструмента
SQL*Loader, который применяется для обработки объемных загрузок
данных из одной системы в другую.
■ catexp.sql Создает представления, используемые утилитами
IMPORT/EXPORT.
■ catpart.sql Создает представления, поддерживающие опцию разбивки
на разделы (partitioning) в Огас1е9/.
■ catadt. sql Создает представления, поддерживающие определяемые
пользователем типы и компоненты объектов в объектных свойствах Oracle9i.
■ standard, sql Создает пакет STANDARD, в котором хранятся все
скалярные или простые типы данных Oracle, например VARCHAR2 и BLOB;
STANDARD также содержит встроенные функции SQL, например decode
() и другие.
Важно помнить, что catalog, sql вызывает другие сценарии
автоматически. Все сценарии можно найти в каталоге rdbms/admin под домашним
каталогом программного обеспечения Oracle. Следующий блок кода
демонстрирует команды, необходимые для выполнения файла catalog, sql в UNIX:
msefSSttm ♦ cd $ORACLE_HOME/rdbm ...s 0/admin
♦ sqlplus
Oracle SQL*Plus Release 9.0.1.0.1 Production
(c)Copyright 2001, Oracle Corporation. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to:
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
With the Partitioning and Objects options
SQL> Scatalog
Второй сценарий, catproc.sql, создает процедурные опции и утилиты
для PL/SQL. Существуют два различных типа сценариев, запускаемые catp-
roc. sql. Если посмотреть в сценарий, там можно увидеть ссылки на другие
сценарии в каталоге rdbms/admin, например dbmsutil. sql и dbmssql.sql.
Эти сценарии с расширением . sql являются спецификациями пакета для
различных серверных пакетов Oracle. Спецификация пакета содержит процедуру,
функцию, тип и описания констант, имеющихся в пакете, но не фактический
код. Другой тип сценария — сценарии .plb, например prvtutil.plb
и prvtpipe .plb. Это расширение обозначает код PL/SQL, зашифрованный с
помощью программы-упаковщика (wrapper), чтобы вы не могли видеть логику
кода приложения.
Важно помнить, что catproc. sql вызывает другие сценарии
автоматически. Все сценарии можно найти в каталоге rdbms/admin под домашним
каталогом ПО Oracle. Следующий блок кода демонстрирует команды,
необходимые для выполнения файла catproc.sql в UNIX:
PttMSSB /home/oracle/app/oracle/product/9.0.1 cd rdbms/admin
/home/oracle/app/oracle/product/9.0.1/rdbms/admin sqlplus
Oracle SQL*Plus Release 0 В.1.7.0.0 Release - Production
(c) Copyright 2000, Oracle Corporation. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to:
Oracle9i Enterprise Edition Release 9.0.1.0.0 Production
With the Partitioning and Objects options
SQL> @catproc
Невозможно создать представления словаря, если сначала не была создана
база данных. Поскольку сценарии работают во время соединения,
установленного вами как пользователь sys as sysdba, пользователю SYS больше не
принадлежат объекты базы данных, включающие в себя словарь данных, и эти
объекты хранятся в табличном пространстве SYSTEM, ни один из них не
будет существовать, пока не будет введена команда create database. Помимо
этих двух сценариев существуют другие сценарии, выполняемые для создания
Управление физическими структурами базы данных
407
различных опций. Мы рассмотрим их, поскольку они входят в
экзаменационные вопросы "Основы АБД 1" Полный список сценариев можете найти в
документации Oracle.
Закрепление пройденного материала
1. Словарь данных отслеживает все аспекты базы данных — от создаваемых
таблиц до информации о производительности базы данных.
2. Выполнение сценариев catalog. sql и catproc. sql сразу после создания
базы данных создает словарь данных.
3. Словарь данных принадлежит SYS, а создается в табличном пространстве
SYSTEM.
Упражнения
1. Вы определяете, когда создать словарь данных Oracle. Какой из следующих
вариантов соответствует наиболее подходящему для этого времени?
А- До создания базы данных
B. До создания пакетов Oracle
C. До создания табличного пространства SYSTEM
D. До предоставления пользователям доступа к базе данных
2. Вы собираетесь создавать пакеты Oracle для использования с базой данных.
Какой из следующих сценариев является наиболее подходящим для этого?
A. catproc.sql
B. catalog.sql
С.catldr.sql
D.catexp.sql
3. Вы собираетесь создавать словарь данных Oracle для использования с базой
данных. Какого из следующих пользователей вы соединили бы с базой
данных для этой цели в Oracle9i и более поздних выпусках?
A. SYSTEM
B. OUTLN
С INTERNAL
D. SYS
Ответы
1. В. 2. А. 3. D.
ся устаревшим
Пользователь INTERNAL в
Oracle9i и
более
поздних выпусках
являет-
Ключевые компоненты словаря данных
и содержание
Словарь данных Oracle состоит из двух компонентов — базисных таблиц и
доступных для пользователя представлений. Далее будут рассмотрены
различия между ними. Не забывайте об использовании доступных для
пользователя представлений в словаре данных Oracle. Никогда не обращайтесь
непосредственно к базисным таблицам. А теперь рассмотрим другие аспекты
компонентов словаря данных, знание которых необходимо для экзамена
"Основы АБД Г.
408
Глава 11
Базисные таблицы
Данные в словаре данных хранятся в наборе таблиц, создаваемых в течение
начальных этапов создания базы данных. Эти таблицы называются базисными
(base tables). Это таблицы Х$, создаваемые в табличном пространстве
SYSTEM, чье единственное назначение — хранить базисные таблицы словаря
данных. Эти таблицы создаются при выполнении сценария catalog. sql.
Только пользователь SYS имеет привилегии, необходимые для
непосредственного обращения к этим таблицам. По возможности следует избегать регистрации
в Oracle как SYS, чтобы не повредить базисные таблицы словаря, и никогда не
предоставлять другим пользователям базы данных Oracle прямого доступа к
базисным таблицам.
Доступные для пользователя представления
Одновременно с созданием и заполнением базисных таблиц сценарий
catalog . sql создает набор дружественных представлений, который позволяет
пользователям посредством этих представлений просматривать данные словаря
данных. Следовательно, словарь данных, как мы его обычно называем,— это
набор представлений, а не таблиц. Oracle создает общедоступные синонимы
во многих представлениях словаря данных, так что пользователям удобно
обращаться к ним. Теперь мы сосредоточимся на представлениях, доступных в
словаре данных, а не в базисных таблицах. На экзамене "Основы АБДI" будет
проверяться именно знание словаря данных.
Программное обеспечение Oracle широко использует словарь данных. Он
используется от проверки достоверности устанавливаемых с базой данных
пользовательских соединений до проверки существования таблиц,
запрашиваемых для поиска индексов таблиц в целях повышения производительности
транзакций. В связи с постоянным доступом к словарю данных он кэшируется
в словарном кэше в SGA, что улучшает доступ к нему.
Доступные представления словаря
Информацию об объектах и данных в базе данных с избытком можно
обнаружить в относительно небольшом числе таблиц, принадлежащих специальному
привилегированному пользователю SYS в Oracle. Хотя Oracle не позволяет
просматривать эти таблицы непосредственно, вы можете обратиться за этой
информацией к нескольким доступным вам представлениям. Эти
представления включают в себя свойство, известное в Oracle как словарь данных (data
dictionary).
Представления словаря данных помогают избежать непосредственного
обращения к таблицам словаря данных. Такая защита важна по двум причинам.
Во-первых, это снижает разрешающую способность по данным у
принадлежащих SYS таблиц, в которых хранятся данные словаря. Если с этими таблицами
что-нибудь случится, из-за чего будут потеряны данные или придется удалять
таблицу, это нанесет серьезный ущерб базе данных Oracle, вплоть до того, что
ее нельзя будет использовать! Во-вторых, представления словарей извлекают
суть информации в словаре данных, переводя ее в форматы, которые легко
понимать и использовать.
Значение имени
Вначале рассмотрим пример. Взгляните на следующий блок кода. В нем
представлено содержание представления словаря USERTABLES:
*mMim SQL> select table_name from user_tables;
TABLE NAME
BONUS
DEPARTMENT
DEPT
DUMMY
EMP
Управление физическими структурами базы данных
409
EMPLOYEE
EXAMPLE_1
PRICES
SALGRADE
TESTER
Чтобы получить эту выходную информацию, мы зарегистрировались в
Oracle как пользователь SCOTT, поэтому вы можете видеть, что данные по
этому запросу содержат имена почти всех таблиц, с которыми мы работали.
Обратите внимание на имя представления, которое я использовал, —
USER_TABLES. Само имя подразумевает два чрезвычайно важных аспекта
этого (а в действительности — каждого) словаря данных:
■ Тема представления (в данном случае — таблицы)
■ Область применения представления (в данном случае — таблицы,
принадлежащие пользователю SCOTT)
Совет Область применения и тема представления словаря разделяются
символом подчеркивания.
Определение области применения
представления словаря
Сначала обсудим область применения представления. Представления словаря
делятся на три общие категории, в зависимости от того, сколько связанных
тем запрашивает пользователь базы данных в разрешенном для просмотра
представлении. Эти категории рассматриваются в следующих разделах.
USER Эти представления позволяют видеть принадлежащие вам
релевантные объекты базы данных. У этих представлений самая узкая область
применения, потому что они показывают только находящиеся в вашей схеме
объекты базы данных. Поэтому, если SCOTT имеет таблицу ЕМР, а я
регистрируюсь в Oracle как пользователь JASON, чтобы ввести select * from
usertables, я не увижу ЕМР в выходных данных. Почему? Потому что
таблица принадлежит пользователю SCOTT.
ALL Эти представления позволяют видеть релевантные объекты базы,
которые могут вам и не принадлежать, однако доступны вам. Область применения
этих представлений шире, чем у представлений USER, так как они включают
в в себя все релевантные объекты, к которым можно обращаться, независимо
от их принадлежности. Однако для пользователя область применения все же
ограничена. Возможность обратиться к объекту базы данных появляется, если
истинно одно из трех условий:
■ Вы создавали объект.
■ Владелец объекта предоставил вам доступ к объекту.
Ш Владелец объекта предоставил пользователю PUBLIC привилегии доступа
к объекту.
Совет Пользователь PUBLIC в базе данных — это специальный
пользователь, который представляет привилегии доступа, имеющиеся у каждого
пользователя. Поэтому, когда владелец объекта создает таблицу и
предоставляет пользователю PUBLIC доступ к ней, каждый пользователь в базе
данных имеет привилегии доступа к созданной таблице.
DBA Эти мощные представления позволяют видеть все релевантные
объекты базы данных во всей базе данных независимо от их принадлежности и
доступности. Эти представления чрезвычайно удобны для администраторов БД (а
иногда и для разработчиков), которым требуется информация обо всех
объектах базы данных.
Примечание Можно предоставить пользователям специальную роль
SELECT_CATALOC_ROLE для просмотра представлений DBA.
410
Глава 11
Определение темы представления словаря
Вторая часть любого имени представления словаря указывает на его тему.
Исходя иэ этого, мы знаем, что тема представления USER_TABLES — таблицы, а
тема представления ALLINDEXES — все индексы. Ниже приводятся
представления, соответствующие областям, которые были или будут рассмотрены:
■ USER-OBJECTS, ALL_OBJECTS, DBA_OBJECTS Дают информацию о
различных объектах базы данных, принадлежащих текущему
пользователю, доступных текущему пользователю или всем объектам в базе данных
соответственно.
■ USERJTABLES, ALLJTABLES, DBAJTABLES Отображает информацию
о таблицах, принадлежащих или доступных текущему пользователю
соответственно, или все таблицы в базе данных Oracle.
■ USERJNDEXES, ALLJNDEXES, DBAJNDEXES Отображает
информацию об индексах, принадлежащих или доступных текущему
пользователю соответственно, или все индексы в базе данных Oracle.
■ USER_VIEWS, ALL_VIEWS, DBA_VIEWS Отображает информацию о
представлениях, принадлежащих или доступных текущему пользователю
соответственно, или все представления в базе данных Oracle (включая
представления словаря).
■ USER_SEQUENCES, ALL_SEQUENCES, DBA_SEQUENCES
Отображает информацию о последовательностях, принадлежащих или доступных
текущему пользователю соответственно, или все последовательности в
базе данных Oracle.
■ USER_USERS, ALL_USERS, DBA_USERS Отображает информацию о
текущем пользователе или обо всех пользователях в Oracle соответственно.
■ USER_CONSTRAINTS, ALL_CONSTRAINTS, DBA_CONSTRAINtS
Отображает информацию об ограничениях, принадлежащих или
доступных текущему пользователю соответственно, или все ограничения в базе
данных Oracle.
■ USER_CONS_COLUMNS, ALL_CONS_COLUMNS,
DBA_CONS_COLUMNS Отображает информацию о столбцах таблицы,
которые имеют ограничения, принадлежащих или доступных текущему
пользователю соответственно, или все столбцы таблиц в Oracle, на
которые есть ограничения.
■ USER_IND_COLUMNS, ALL_IND_COLUMNS, DBA_IND_COLUMNS
Отображает информацию о столбцах таблицы, которые имеют индексы,
принадлежащих или доступных текущему пользователю соответственно,
или все столбцы в таблицах Oracle, имеющие индексы.
■ USER_TAB_COLUMNS, ALL_TAB_COLUMNS, DBA_TAB_COLUMNS
Отображает информацию о столбцах в таблицах, принадлежащих или
доступных текущему пользователю соответственно, или все столбцы всех
таблиц в Oracle.
■ USER_ROLES, ALL_ROLES, DBA_ROLES Отображает информацию о
ролях, принадлежащих или доступных текущему пользователю
соответственно, или все роли в базе данных Oracle.
■ USER_TAB_PRTVS, ALL_TAB_PRTVS, DBA_TAB_PRTVS Отображает
информацию об объектных привилегиях на объекты, принадлежащие
пользователю, или все объектные привилегии, доступные всем
пользователям в Oracle.
■ USER_SYS_PRTVS, ALL_SYS_PRTVS, DBA_SYS_PRIVS Отображает
информацию об объектных привилегиях на объекты, принадлежащие
пользователю или доступные текущему пользователю соответственно, или
все системные привилегии, предоставленные всем пользователям в Oracle.
Управление физическими структурами базы данных
411
■ USER_SOURCE, ALL_SOURCE, DBA_SOURCE Отображает исходный
текст для программ PL/SQL, принадлежащих пользователю или
доступных текущему пользователю соответственно, или весь исходный текст
PL/SQL во всей базе данных Oracle.
■ USERJTRIGGERS, ALLJTRIGGERS, DBAJTRIGGERS Отображает
информацию о триггерах, принадлежащих пользователю или доступных
текущему пользователю соответственно, или все триггеры в базе данных
Oracle.
■ ROLE_TAB_PRIVS, ROLE_SYS_PRIVS, ROLE_ROLE_PRIVS
Отображает информацию об объектных привилегиях, системных привилегиях или
ролях, предоставленных ролям в базе данных, соответственно.
■ DBAJTABLESPACES, DBA_TS_QUOTAS Отображает информацию обо
всех табличных пространствах в Oracle, а также о квотах на пространство,
назначенных пользователям в каждом табличном пространстве.
■ DBA_DATAFILES, DBA_SEGMENTS, DBA_EXTENTS, DBA_FREE_SPACE
Отображает информацию о файлах данных в базе данных Oracle, а также о
сегментах, экстентах и свободном пространстве в каждом файле данных
соответственно.
■ DBA_PROFILES Отображает информацию о пользовательских профилях
в Oracle. Для администратора БД профили — это способ ограничить
физические ресурсы хост-системы (например, распределение памяти процесса,
циклов процессора и т.д.), которые пользователи могут использовать в
сочетании с обработкой в Oracle.
Совет Это только некоторые из представлений, доступных в словаре
данных Oracle. Остальные мы обсудим, когда их включат в темы, проверяемые
на экзамене "Основы АБД J".
Представления производительности
Еще одна важная классификация представлений в базе данных Oracle —
представления производительности. В действительности, они не входят в словарь
Oracle, но полезны для управления базо^ данных. Представления
производительности постоянно изменяются, так как Oracle вносит в них важные данные
о работе базы данных. Ниже приводятся некоторые примеры представлений
производительности:
■ VSDATABASE Здесь хранится общая информация о базе данных,
смонтированной для вашего экземпляра.
■ VSSYSSTAT Здесь хранится большая часть информации о
производительности базы данных.
■ VSSESSION, VSSESSTAT Здесь хранится большая часть информации о
производительности для отдельных пользовательских сеансов.
■ V$LOG, VSLOGFILE Здесь можно найти информацию об оперативных
файлах журнала базы данных регистрации.
■ VSDATAFILE Здесь можно найти информацию о файлах данных Oracle.
■ VSCONTROLFILE Здесь можно найти информацию об управляющих
файлах Oracle.
Представления как таковые
Как вам известно, в действительности представления не содержат никаких
данных — это просто команды select, хранящиеся в Oracle как объекты. При
каждом запросе к представлению Oracle динамически выполняет базовую
команду select этого представления и получает содержание этого представ-
412
Глава 11
ления. Определения представления словаря могут быть весьма сложными.
Чтобы можно было оценить эту скрытую сложность, мы приводим следующий
блок кода, где дается определение представления ALLJTABLES в Oracle.
Поскольку это представление содержит столбец TEXT с типом данных LONG,
следует выполнить дополнительное форматирование с помощью команды set
long 9999, благодаря которой вывод приобретет надлежащий вид:
«ааюгея SQL> SET LONG 9999;
SQL> SELECT text FROM all_views WHERE view_name - 'ALLJTABLES';
TEXT
select u.name, o.name, ts.name, со.name _,
t.pctfreeS, t.pctusedS,
t.initrans, t.maxtrans,
s.iniexts * ts.blocksize, s.extsize * ts.blocksize,
s.minexts, s.maxexts, s.extpct,
decode(s.lists, 0, 1, s.lists), decode(s.groups, 0, 1, s.groups),
decode(bitand (t.modified,1), 0, 'Y', 1, 'N1, '?'),
t.rowcnt, t.blkcnt, t.empcnt, t.avgspc, t.chncnt, t.avgrln,
lpad(decode(t.sparel, 0, '1', 1, 'DEFAULT', to_char (t.sparel)), 10),
lpad(decode(mod(t.spare2, 65536), 0, '1', 1, 'DEFAULT',
to_char(mod(t.spare2, 65536))), 10),
lpadldecode(floor(t.spare2 / 65536), 0, 'N', 1, 'Y', 5),
decode(bitand(t.modified, 6), 0, 'ENABLED', 'DISABLED')
from sys.user$ u, sys.ts$ ts, sys.segS s
sys.obj$ со, sys.tab$ t, sys.obj$ о
where o.owner! = u.user!
and o.obj* - t.obj!
and t.clu* - co.obj#
and t.ts# - ts.ts#
and t.file! - s.file# (+)
and t.block! - s.block! (+)
and (o.owner* - userenv ('SCHEMAID')
or o.obj# in
(select oa.objt
from sys.objauthS oa
where grantee! in (select kzsrorol from x$kzsro)
or /* user has system privileges */
exists (select null from v$enabledprivs
where priv_number in (-45 /* LOCK ANY TABLE */,
-47 /* SELECT ANY TABLE */,
-48 /* INSERT ANY TABLE »/,
-49 /* UPDATE ANY TABLE */,
-50 /* DELETE ANY TABLE */)))
Совет Если необходим полный листинг всех представлений словаря данных,
доступных в Oracle, можно выполнить команду select * from
dictionary и Oracle перечислит все представления словаря. В
DICTIONARY также предлагаются комментарии относительно
использования каждого представления словаря. В Oracle есть синонимы
DICTIONARY- это объекты DICT, CATALOG и CAT
Закрепление пройденного материала
1. Необходимо знать, что такое словарь данных. Требуется различать
представления словаря и таблицы, принадлежащие SYS, лежащие в основе этих
представлений.
2. Надо понимать, как идентифицировать тему и область применения
представления словаря по имени этого представления. Убедитесь, что можете
идентифицировать все представления, рассмотренные здесь.
3. Убедитесь, что можете идентифицировать представления словаря данных,
перечисляющие все доступные в базе данных Oracle представления словаря.
Упражнения
1. Вы хотите перечислить все индексированные столбцы для объектов,
принадлежащих вам в базе данных Oracle. Какое из следующих представлений
вы использовали бы?
Управление физическими структурами базы данных 413
A. USER_TAB_COLUMNS
B. ALL_TAB_COLUMNS
С USER_IND_COLUMNS
D. ALL_IND_COLUMNS
2. Вы идентифицируете объекты словаря в базе данных Oracle. Какой из
следующих вариантов является представлением в словаре данных?
A. VSDATABASE
B. DBAJTABLES
C. SYS.AUDS
D. ЕМР
3. Это пользователь, которому принадлежат все объекты словаря данных в
Oracle: .
4. Это объект, к которому вы можете обратиться для получения листинга всех
объектов словаря данных в Oracle: .
5. Какой из следующих вариантов соответствует представлению
производительности в базе данных Oracle?
A. DBA_DATA_FILES
B. DBA_SEGMENTS
С VSDATAFILE
D. DBA EXTENTS
Ответы
1. С. 2. В 3. SYS. 4. CATALOG, CAT, DICTIONARY или PICT. 5. С.
Обращение к словарю данных
Теперь мы рассмотрим ряд примеров обращения к словарю, чтобы вы могли
оценить полезность словарей данных в Oracle. (В этом разделе мы будем
использовать DBA_views, за исключением особо отмеченных случаев). Не
забывайте, что в представлениях словарей данных можно применять команду
describe, как если бы они были таблицами. Следующий блок кода демонстрирует,
что при этом происходит
SQL> describe dba_source
Name Null? Type
OWNER
NAME
TYPE
LINE
TEXT
NOT NULL
NOT NULL
NOT NULL
VARCHAR2(30)
VARCHAR2O0)
VARCHAR2U2)
NUMBER
VARCHAR2(4000)
Представление DBA_INDEXES содержит информацию об индексах
доступных пользователю таблиц. Часть информации, перечисленной в этих
представлениях, уточняет свойства индекса, например, являются ли все
значения в индексированном столбце уникальными. Другие данные в
представлении идентифицируют параметры хранения индекса и место хранения. Ниже
приводится пример:
lffiSff4ifl6S SQL> column owner format alO
SQL> column index_name format al5
SQL> column table_name format al2
SQL> column uniqueness format alO
SQL> select owner, index_name, table_name, uniqueness
2 from dba_indexes
3 where owner - 'SCOTT';
414
Глава 11
OWNER INDEX NAME TABLE_NAME UNIQUENESS
SCOTT PK_01 EXAMPLE_1 UNIQUE
SCOTT SYS_C00905 DEPARTMENT UNIQUE
SCOTT UK_EMPLOYEE_01 EMPLOYEE UNIQUE
Совет Для тех из вас, кто выполняет примеры в своей собственной базе
данных, мы привели несколько полезных команд форматирования для очистки
вывода из этих запросов.
Следующее представление — представление DBA_USERS. Оно
используется, чтобы текущий пользователь базы данных мог получить больше
информации обо всех пользователях, известных базе данных Oracle:
SQL> SELECT username, user_id, created FROM dba_users;
USERNAME USER ID CREATED
SYS
SYSTEM
OUTLN
DBSNMP
AURORA$ORBSUNAUTHENTICATED
JASON
STUDENT2
STUDENT1
SPANKY
JASON2
SCOTT
JASON3
JASON10
GIANT
0
5
11
18
23
27
46
45
43
46
52
49
50
51
23-JUN-99
23-JUN-99
23-JUN-99
23-JUN-99
23-JUN-99
18-JUL-00
30-OCT-00
30-OCT-OO
30-OCT-00
31-oct-oo
19-MAR-01
16-NOV-00
18-NOV-00
08-DEC-OO
Обращение к представлениям словаря за ограничениями
Вот более сложный пример. В соответствии с определенными
ограничениями, установленными в этой главе, следующие представления связаны с
ограничениями. Рассмотрим объединение содержимого двух
представлений: DBA_CONSTRAINTS и DBA_CONS_COLUMNS. Представление
DBA_CONSTRAINTS используется для отображения информации об
ограничениях, определенных в базе данных, a DBA_CONS_COLUMNS
отображает все столбцы в ограничениях целостности в Oracle. Обсудим
следующую ситуацию. Допустим, мы не помним, следовали ли мы совету из
нашей книги давать разделяемым столбцам во множественных таблицах
одно и то же имя. Вызовет ли это проблемы? Только не с Oracle. Словарь
данных на руках! Мы можем определить упомянутые столбцы с помощью
DBA_CONSTRAINTS и DBA_CONS_COLUMNS, как показано в
следующем блоке:
SQL> column table_name format al2
SQL> column column_name format al2
SQL> select a.table_name, b.column_name, c.table_name, с.column_name
2 from DBA_constraints a, DBA_cons_columns b, DBA_cons_columns с
3 where a.constraint_name - b.constraint_name
4 and a.r_constraint_name - c.constraint_name;
TABLE NAME COLUMN NAME TABLE NAME COLUMN NAME
EMPLOYEE DEPARTMENT NUM DEPARTMENT DEPARTMENT NUM
Использование других представлений словаря
Аналогичную информацию о содержимом DBA_CONS_COLUMNS можно
обнаружить в DBA_IND_COLUMNS. Однако в представлении словаря
DBA_IND_COLUMNS будут находиться столбцы, используемые в связанных
с ограничением индексах, а также столбцы, используемые в другом типе
индексов. Проверьте следующий блок кода:
Управление физическими структурами базы данных
415
SQL> create index ix_employee_01 on employee (lastname);
Index created.
SQL> select index_name, table_name, column_name, column_position
2 from DBA_ind_columns
3 where table_name = 'EMPLOYEE';
INDEX NAME TABLE NAME COLUMN NAME COLUMN POSITION
PK_EMPLOYEE_01 EMPLOYEE EMPID 1
UK_EMPLOYEE_01 EMPLOYEE GOVT_ID 1
IX_EMPLOYEE_01 EMPLOYEE LASTNAME 1
Закрепление пройденного материала
Убедитесь, что можете создавать запросы для представлений словаря.
Упражнения
1. Используйте следующий блок кода для ответа на этот вопрос:
TEXT
declare
х varchar2 (10) ;
begin
x :e 'hello world';
dbms_output.put_line(x) ;
end;
Какой из следующих запросов мог бы сгенерировать этот
вывод?
A. DBA_ERRORS
B. DBA_SOUR.CE
C. DBA_VIEWS
D. DBA_TRIGGERS
2. Используйте следующий блок кода для ответа на этот вопрос:
SQL> select text from DBA_views where view_name -
2 'DBAJTABLES';
TEXT
select u.name, o.name,
decode(bitand(t.property, 4194400), 0,.ts.narae, null),
Какой из следующих вариантов соответствует команде форматирования,
которую можно использовать для показа остальной части вывода?
A. set long 9999
B. column text format a9999
С set long 50
D. column text format a50
3. Для идентификации некоторых аспектов обо всех пользователях в базе
данных вы использовали бы это представление: .
Ответы
1. В 2. А 3. DBAJJSERS.
Поддержка управляющих файлов
В этом разделе будут рассмотрены следующие вопросы контроля
управляющих файлов:
Ш Использование управляющих файлов
■ Исследование содержания управляющих файлов
416
Глава 11
■ Контроль управляющих файлов с помощью Oracle-Managed Files
■ Получение информации об управляющих файлах
■ Мультиплексирование управляющих файлов
Для физической структуры базы данных Oracle управляющие файлы
являются тем же, чем словари данных для логической структуры. Управляющие
файлы отслеживают все файлы, которые нужны Oracle, и их местонахождение
на хост-машине. Управляющие файлы также содержат информацию об
именах элементов журнала базы данных и их местонахождении в файлах системы.
Без управляющих файлов сервер базы данных Oracle не смог бы найти свои
физические компоненты. Имена управляющих файлов задаются в файле
init. ora для каждого экземпляра Oracle. В этом разделе мы поговорим о том,
как Oracle использует управляющие файлы, что в них хранится, где можно
получить информацию о своих управляющих файлах и о необходимости
сохранения нескольких копий управляющих файлов на отдельных дисках.
Использование управляющих файлов
Когда вы входите в SQL*Plus, чтобы перевести базу данных в оперативный
режим, Oracle ищет в управляющем файле необходимые для этого компоненты.
Например, если в базе данных управляющий файл имеет три
ассоциированных с ним файла, а доступны только два, Oracle сообщит, что третий файл
отсутствует и не запустит базу данных! После запуска базы данных Oracle
изменит управляющие файлы или будет использовать их в следующих ситуациях:
■ При создании новых физических дисковых ресурсов (например,
табличных пространств)
■ При изменении определенным образом существующего дискового ресурса
(например, при добавлении файла данных к табличному пространству)
■ Когда LGWR прекращает записывать в один оперативный журнал базы
данных и начинает другой (переключение журналов)
Параметр CONTROL FILES
Параметр CONTROL_FILES в файле init.ora определяет местоположение
управляющих файлов на сервере базы данных и указывает, где Oracle будет
наблюдать запуск экземпляра, чтобы найти его управляющие файлы. При
запуске экземпляра до создания базы данных или при переходе от одной версии
Oracle к другой Oracle создает управляющие файлы на основании имен файлов
и местоположений, которые вы указываете в параметре CONTROL_FILES из
файла init. ora. Если при последующих запусках экземпляра Oracle не
найдет управляющие файлы, которые предполагала найти на основании
параметра CONTROLFILES, Oracle не запустится. В следующих разделах вы узнаете,
что, если создать управляющие файлы, управляемые Oracle, параметр
CONTROLFILES не понадобится и Oracle будет искать каталог по
умолчанию или каталоги для управляющих файлов.
По умолчанию в окружении Windows и UNIX Database Configuration
Assistant (DBCA) создаст три файла управления и поместит их в каталог orada-
ta/database_name под домашним каталогом ПО Oracle. DBCA назовет их
controlnn.dbf (хотя иногда DBCA может также использовать расширения
. ctl или . ora), где л — число от 01 до 03 (число может зависеть от
конкретной операционной системы). При определении своих собственных
управляющих файлов можно соблюдать любые соглашения об именовании, которые
вам нравятся. Не существует ограничений и на размещение управляющих
файлов в каталоге $ORACLE_HOME/dbs. Их можно размещать везде, где вам
хочется. По причинам, которые мы вскоре рассмотрим, Oracle рекомендует
использовать несколько управляющих файлов на разных дисках. Убедитесь,
что подключили абсолютное составное имя к местонахождению вашего
управляющего файла при определении значения для параметра CONTROLFILES.
Управление физическими структурами базы данных
417
Закрепление пройденного материала
1. Управляющие файлы используются для отслеживания всех физических
компонентов базы данных, например местонахождения файлов данных,
журнала базы данных, имени базы данных и т.д.
S. Как правило, Oracle предполагает найти управляющие файлы в месте,
обозначенном параметром CONTROL_FILES. Начиная с Огас1е9/, это не так,
если вы используете Oracle-Managed Files (OMF). Исходя из наших задач,
будем считать, что вы используете OMF, однако следует помнить, что в
некоторых экзаменационных вопросах вы можете встретиться с
управляющими файлами.
Упражнения
1. Вы пытаетесь найти управляющие файлы в базе данных Oracle с именем
ORCL. В каком из следующих файлов следует искать эту информацию?
A. controlOl.ctl В. pwdORCL.ога
С catalog.sql D.init.ora
S. Ваши попытки запустить базу данных Oracle потерпели неудачу.
Посмотрев в соответствующем местоположении, вы устанавливаете значение
параметра CONTROL_FILES заданным как /uOl/oradata/orcl/cont-
rolOl.ctl. Какой из вариантов соответствует следующему вероятному
шагу, который вы предприняли бы для отыскания неисправности?
A. Проверить фактическое местоположение каталога файла управления.
B. Проверить аппаратные средства на предмет дефекта карты памяти.
С Проверить фактическое местоположение каталога файла данных
SYSTEM.
D. Проверить, созданы ли два файла журнала базы данных.
3. Вы конфигурируете базу данных Oracle. При использовании какого из
следующих свойств в Oracle вам не пришлось бы конфигурировать параметр
CONTROL_FILES для отдельного экземпляра?
A. При использовании Real Application Clusters
B. При использовании OMF
C. При использовании табличных пространств
Р.При использовании транспортируемых табличных пространств
Ответы
1. D. 2. А. 3. В.
Исследование содержимого
управляющего файла
Управляющие файлы состоят из нескольких компонентов. Однако нельзя
просто так открыть управляющий файл в любимом текстовом редакторе и
увидеть, что в нем находится. Это объясняется тем, что управляющий файл
написан в двоичном коде и только база данных Oracle может понимать его
содержание. Однако не беспокойтесь — мы расскажем, что содержится в
управляющем файле, и вы подготовитесь к экзамену! Содержание
управляющего файла:
■ Информация об имени базы данных и идентификаторе, указанная вами
при создании базы данных.
418
Глава 11
■ Информация о дате и времени создания базы данных, указанная вами при
создании базы данных.
■ Местонахождение файлов данных и журнала базы данных в файловой
системе, указанное вами при создании базы данных и при добавлении файлов
данных или журнала базы данных.
■ Имена табличных пространств и связи между табличными
пространствами и файлами данных, указанные вами при создании табличных
пространств или позднее, при добавлении дополнительных файлов данных к
существующему табличному пространству.
■ Информация о том, когда были приняты архивные журналы. Как правило,
эта информация генерируется Oracle автоматически.
■ Информация о том, когда были приняты резервные копии. Эта
информация генерируется при создании резервных копий.
■ Порядковый номер текущего оперативного файла журнала базы данных.
Как правило, эта информация генерируется Oracle автоматически.
■ Информация о текущей контрольной точке. И эта информация, как
правило, генерируется Oracle автоматически.
Восстановление управляющего файла
Иногда требуется восстановление управляющих файлов для различных целей.
Например, если нужно переименовать базу данных, потому что вы создаете ее
копию на той же машине, которая является хостом первоначальной базы
данных (Oracle не разрешает иметь две базы данных с одинаковым именем в
одной и той же хост-системе). Или если потребуется изменить настройки базы
данных, например maxlogfiles, которые задаются при создании базы данных.
Возможно, вы даже утратили управляющий файл. Какова бы ни была
причина, метод восстановления один и тот же. Введите команду alter database
backup controlfile to trace. Ключевое слово trace в этой команде
указывает, что Oracle сгенерирует сценарий, содержащий команду create
controlfile, и сохранит ее в каталоге trace, указанном в параметре
USER_DUMP_DEST в файле init. ora. Пример сценария создания
управляющего файла, сгенерированного этой командой, приводится в следующем
блоке кода:
юмввв» # Следующие команды создадут новый управляющий файл и используют его
# для открытия базы данных.
# Данные, используемые Recovery Manager, будут утеряны. Могут
# потребоваться дополнительные
# журналы для восстановления носителей автономных файлов данных.
# Используются только, если доступна текущая версия всех оперативных журналов.
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORGDB01" NORESETLOGS
NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 2
MAXDATAFILES 240
MAXINSTANCES 1
MAXLOGHISTORY 113
LOGFILE
GROUP 1 C/oracle/disk_01/logla.dbf
Voracle/disk_02/loglb.dbf') SIZE 30M,
GROUP 2 (,/oracle/disk_03/log2a.dbf',
'/oracle/disk_04/log2b.dbf') SIZE 30M
DATAFILE
' /oracle/disk_05/system01 .dbf,
' /oracle/disk_05/system02 .dbf
# Требуется восстановление, если какие-либо файлы данных являются
Управление физическими структурами базы данных
419
# восстановленными
# резервными копиями, или если последнее выключение не было normal или
# immediate.
RECOVER DATABASE
# Теперь возможно нормальное открытие Сазы данных.
ALTER DATABASE OPEN;
Этот сценарий демонстрирует правильный синтаксис команды create
controlf ile — она прямо перед вами. Например, при желании клонировать
существующую базу просто выполните следующие действия:
1. В SQL*Plus введите команду alter system backup controlf ile to
trace. Oracle генерирует сценарий, содержащий команду create con-
trolfile, аналогичную той, которая показана в предыдущем блоке
кода.
2. В SQL*Plus выключите существующую базу данных с помощью команд
shutdown normal или shutdown immediate. He используйте shutdown
abort.
3. Скопируйте все файлы данных и журнала базы данных в альтернативное
местоположение (желательно с помощью рассмотренных в главе 1
соглашений OFA), используя команды операционной системы.
4. С помощью любимого текстового редактора измените сценарий,
сгенерированный в шаге 1. Потребуется изменить предыдущую фразу "name"
чтобы присвоить базе данных "newname" Также потребуется пересмотреть и
изменить местоположение каждого файла данных файловой системы,
перечисленного во фразе dataf ile команды create controlf ile, для
отображения нового местоположения скопированных файлов. То же самое
придется сделать для оперативных файлов журнала базы данных. Кроме
того, удалите все закомментированные строки, начинающиеся с символа
"решетки" (#). Позднее, на шаге 8 вы, хотя и не обязательно, столкнулись
бы с ошибкой, если бы некоторые файлы данных были скопированы
ненадлежащим образом или если бы Oracle не нашла файлы данных там, где
ожидала найти. Таким образом, очень важно проверить местоположения
файловой системы для всех файлов данных и журнала базы данных в
сценарии, прежде чем переходить к шагу 5. Удалите также команды recover
database и alter database open. Вы выполните эти шаги вручную на
одном из следующих шагов.
5. Скопируйте файл init. ога для существующей базы данных в новое
местоположение. В любимом текстовом редакторе измените набор значений
для параметра CONTROLFILES в файле init. ога на новое
местоположение файловой системы. Кроме того, следует изменить другие настройки
в файле init. ога, например DB_NAME и т.д., как если бы вы создавали
новую базу данных, поэтому для повторения вернитесь назад к главе 1.
Если не выполнить этот шаг, Oracle не позволит переименовывать новую
базу данных и может даже разрушить старую!
6. В SQL*Plus запустите экземпляр Oracle с помощью команды startup no-
mount.
7. Запустите измененный на шагах 4 и 5 сценарий с помощью run или
команды @ в SQL*Plus. На этом шаге будет создан новый управляющий файл.
8. В SQL*Plus смонтируйте новую базу данных с помощью команды alter
table mount.
9. В SQL*Plus откройте новую базу данных с помощью команды alter table
open.
10. В SQL*Plus откройте старую базу данных с помощью команды startup
open.
420
Глава 11
Совет Скорее всего, эта тема по Oracle войдет в материалы экзамена
"Основы АБДII", но ее рассмотрение здесь позволяет ознакомиться с
содержанием управляющего файла и манипуляциями с ним.
Закрепление пройденного материала
1. Управляющие файлы — самые важные файлы базы данных с точки зрения
размещения файловой системы и управления. В них содержится
информация, связанная с физическим местоположением каждого файла данных и
файла журнала базы данных в базе данных.
2. Управляющие файлы создаются в первый раз при создании базы данных
Oracle. Если в указанном в параметре C0NTR0L_F1LES местоположении
еще не существует никакого управляющего файла, то Oracle создаст новый
управляющий файл автоматически при вводе команды create database.
Восстановить управляющий файл для ассоциированной базы данных
можно позднее с помощью команды create control file.
3. Управляющие файлы открываются и считываются каждый раз при
открытии базы данных. Содержание управляющих файлов изменяется каждый
раз, когда изменяется структура базы данных, например при добавлении
табличного пространства, оперативного файла журнала базы данных.
Кроме того, управляющий файл изменяется при архивировании журнала базы
данных, резервном копировании базы данных и всякий раз, когда
происходит переключение на другой журнал.
Упражнения
1. Вы собираетесь создать базу данных Oracle. Какой из следующих вариантов
соответствует компоненту базы данных, который не создается при вводе
команды create database?
A. Файлы паролей
B. Управляющие файлы
C. Файлы журнала базы данных
D. Файлы данных
2. Вы пытаетесь переименовать базу данных Oracle, используя команду
create controlfile. Какой из следующих вариантов соответствует шагу,
который вы, скорее всего, выполнили бы сразу после выключения исходной
базы данных для копирования исходных файлов в их новые
местоположения?
A. Ввести команду alter database backup controlfile to trace.
B. Изменить сценарий, содержащий команду create controlfile,
чтобы он отражал местоположения новой файловой системы для
скопированных файлов.
C. Изменить соответствующие параметры в копии файла init.ora
существующей базы данных.
D. Удалить управляющие файлы в существующей базе данных с
помощью команд операционной системы.
3. БОНУС: Вы выполняете операции с управляющими файлами в базе
данных Oracle. При каком из следующих вариантов содержание управляющего
файла не изменится?
A. При открытии управляющего файла в текстовом редакторе
B. При вводе команды alter tablespace
C. При вводе команды alter database rename file
D. При вводе команды alter database add logf ile
Управление физическими структурами базы данных
421
Ответы
1. А. 2. В. Поскольку вопрос относится к копированию файлов в новые
местоположения, наиболее подходящий следующий шаг — записать новые местоположения
файловой системы в сценарии. 3. А. Хотя команды в вариантах В, С и D вам еще незнако-
мы, этот вопрос не такой уж и хитрый.
Контроль управляющих файлов с помощью свойства
Oracle-Managed Files
В главе 1 была изложена концепция Oracle-Managed Files (OMF). Это новое
свойство в Oracle0-/, предназначенное для минимизации объема работ по
управлению файловой системой, которые администратору БД приходится выполнять
при создании и управлении базой данных Oracle. Продолжим его рассмотрение
относительно контроля управляющих файлов. Если помните, для установки
OMF следует сконфигурировать соответствующие значения для следующих
параметров файла init.ora:
■ DB_CREATE_FILE_DEST Определяет местоположение каталога
файловой системы по умолчанию, где Oracle создаст файлы данных. Следующий
блок кода демонстрирует пример (с соблюдением OFA) задания этого
параметра для базы данных DB1:
DB_CREATE_FILE_DEST - '/uOl/oradata/dbl'
■ DB_CREATE_ONLINE_LOG_DEST_n Определяет местоположение
каталога файловой системы по умолчанию для файлов оперативных файлов
журнала базы данных и создания управляющего файла. Следующий блок
кода демонстрирует пример (с соблюдением OFA) задания этого
параметра для базы DB1:
DB_CREATE_0NLINE_L0G_DEST_1 - '/uOl/oradata/dbl'
DB_ 0CREATE_ 0ONLINE_ 0LOG_ 0DEST_ 02 - ' /u02/oradata/dbl'
Совет При указании параметров OMF, определяющих несколько
местоположений для размещения файлов оперативных файлов журнала базы данных,
Oracle размещает управляющие файлы в каталогах этих файлов журнала
базы данных. Это вызывает мультиплексирование файлов управления.
О мультиплексировании мы расскажем чуть позже в этом разделе.
Изменение настроек OMF впоследствии
Устанавливаемые для этих двух параметров значения могут динамически
изменяться с помощью команды alter system set parameter = value, где
parameter — параметр, чью настройку требуется изменить, a val ие — каталог,
для которого изменяется этот параметр OMF. Следующий блок кода
демонстрирует пример:
ffff^aflS SQL> alter system set DB_CREATE_ONLINE_LOG_DEST_2 - ' /u03/oradata/dbl';
System altered.
Управляющие файлы, управляемые Oracle
во время создания базы данных
Ниже приводятся несколько фактов, которые пригодятся на экзамене
"Основы АБД I". Если вы определили параметр CONTROL_FILES в файле
init. ora, но не указали значения ни для одного из параметров OMF, Oracle
создаст управляющие файлы в местоположениях, указанных параметром
CONTROL_FILES. OMF не будет управлять этими файлами, хотя Oracle будет
автоматически записывать в них любые изменения в структуре базы данных,
как уже пояснялось. И наоборот, если вы решили не определять значение
параметра CONTROL_FILES, а указали значения для параметров OMF, Oracle
создает управляющий файл под управлением OMF в заданном для параметров
OMF местоположении при следующих условиях:
Oracle9/
i более поздних
мрснй
422
Глава 11
■ Если вы определили каталог для DB_CREATE_FILE_DEST, а не для
параметра E>B_CREATE_ONLINE_LOG_DEST_/i, управляющий файл под
управлением OMF помещается в каталог, указанный для
DB_CREATE_FILE_DEST.
■ Если вы определили каталог для DB_CREATE_ONLINE_LOG_DEST_/>, a
не для DB_CREATE_FILE_DEST, Oracle разместит управляющий файл
под управлением OMF во все каталоги, указанные в параметрах
DB_CREATE_ONLINE_LOG_DEST_l и DB_CREATE_ONLINE_LOG_
DEST_2.
Ш Если вы определили каталоги для обоих типов параметров, Oracle
поместит управляющий файл под управлением OMF во все каталоги, указанные
в параметрах DB_CREATE_ONLINE_LOG_DESTJ и DB_CREATE_
ONLINE_LOG_DEST_2.
Соглашения об именовании управляющих файлов под
управлением OMF
При использовании OMF Oracle предоставляется право называть файлы
согласно ее собственным соглашениям. Управляющий файл под управлением
Oracle использует соглашение об именовании по умолчанию из файла
ora_%u. ctl, где %u — созданное Oracle уникальное имя. Это имя не
обязательно связано с именем базы данных или с настройкой параметра в файле
init.ora, например DB_NAME. Еще один пример: ora_cmr3u45r.ctl.
Совет Большинство администраторов БД, вероятно, не будут
использовать ОМРдля производственных систем, так как в целях повышения
производительности многие файлы следует размещать на разных дисках, а при
использовании свойства OMFece они сбрасываются на один и тот же диск.
Однако свойство OMF прекрасно подойдет для организации, только
приступившей к работе с базами данных Oracle, которые необходимо очень
быстро создать и запустить.
Закрепление пройденного материала
1. OMF создаются с указанием в файле initora двух параметров:
DB_CREATE_FILE_DEST и DB_CREATE_ONLINE_LOC_DEST_w.
2. Если задан только один из этих двух типов параметров, управляющие
файлы под управлением OMF создаются в местоположении файловой
системы, указанном в заданном параметре.
3. Если определены оба параметра, управляющие файлы под управлением OMF
создаются в местоположении файловой системы, указанном параметром
DB_CREATE_ONLINE_LOG_DEST_w.
4. Задаваемые для этих параметров значения можно динамически изменять е
помощью команды alter system.
Упражнения
1. Рассмотрите следующий фрагмент файла initora:
DB_CREATE_ONLINE_L0G_DEST_l - /uOl/oradata/dbl
DB_CREATE_ONLINE_L0G_DEST_2 - /u02/oradata/dbl
DB_CREATE_ONLINE_L0G_DEST_3 - /u03/oradata/dbl
DB_CREATE_FILE_DEST - /u04/oradata/dbl
Какой из следующих вариантов не указывает на местоположение, в
котором Oracle разместит файл управления при создании базы данных?
A. /uOl/oradata/dbl
Управление физическими структурами базы данных 423
B. /u02/oradata/dbl
C. /u03/oradata/dbl
D./u04/oradata/dbl
2. Вы используете OMF в сочетании с контролем управляющего файла базы
данных Oracle. Какой из следующих вариантов соответствует аспекту
контроля управляющего файла, который выполняется Oracle независимо от
того, используется ли OMF или нет?
A. Размещение управляющего файла в соответствующем каталоге
B. Мультиплексирование управляющих файлов множественным
адресатам
C. Обновление содержания управляющего файла при добавлении новых
табличных пространств
D. Автоматическое присвоение значений параметру CONTROL_FILES
3. Завершите следующее предложение: Чтобы Oracle знала, где хранятся
управляющие файлы, необходимо указать значение для (А)
или (В) и (С) .
Ответы
1. D. 2. С. 3. (A) CONTROL_FILES; (В) DB_CREATE_FILE_DEST; (С)
DB_CREATE_ONLINE_LOG_DEST_n.
Получение информации об управляющих файлах
Время от времени возникает необходимость получения информади и об
управляющих файлах в базе данных Oracle. Это можно сделать с помощью
нескольких важных представлений производительности и представления
словаря данных, доступных администраторам БД в базе данных Oracle. Рассмотрим
эти представления поподробнее.
Имя и доступность управляющего файла
Основное представление, доступное в словаре данных Oracle для
использования управляющего файла и управления, — это представление
V$CONTROLFILE. В этом представлении только два столбца: STATUS и
NAME. Ниже приводится их содержание:
Ш STATUS Выводит на экран INVALID, если нельзя определить имя
управляющего файла точно; в противном случае NULL.
■ NAME Дает абсолютный путь доступа к местоположению файла на
хост-машине, а также имя управляющего файла.
Информация в представлении VSCONTROLFILE соответствует значениям
параметра инициализации CONTROL_FILES. В следующем блоке кода
приводится команда SQL, используемая для получения информации из
представления VSCONTROLFILE об управляющих файлах для Oracle на машине с
операционной системой Windows, так же как выходная информация:
tt&msass&i SQL> select * from v$controlflie;
STATUS NAME
D \ORACLE\DATABASE\CTLlD704.ORA
E:\ORACLE\DATABASE\CTL2D704.0RA
F:\ORACLE\DATABASE\CTL3D704.ORA
Поиск информации о содержании управляющих файлов
Другую информацию об управляющих файлах можно найти в представлении
VSDATABASE. Это представление производительности содержит информа-
424
Глава 11
цию, которую Oracle обычно также сохраняет в управляющем файле. Пример
использования этого представления можно увидеть в следующем блоке кода,
из которого следует, что несколько столбцов в этом представлении
предоставляют информацию о вашем управляющем файле:
■ CONTROLFILEJTYPE Тип раздела в файле управления
■ CONTROLFILE_CREATED Указывает, когда был создан текущий файл
управления
■ CONTROLFILE_SEQUENCE# Текущий порядковый номер для базы
данных, зарегистрированной в файле управления
■ CONTROLFILE_CHANGE# Текущий системно изменяемый номер для
базы данных, зарегистрированной в файле управления
■ CONTROLFILEJTIME Указывает, когда файл управления изменялся в
последний раз
§!№ШШ SQL> select from v$database;
DBID NAME CREATED RESETLOGS CHANGE* RESETLOGS
PRIOR RESETLOGS CHANGE* PRIOR RES LOG MODE CHECKPOINT CHANGE*
ARCHIVE CHANGE* CONTROL CONTROLFI CONTROLFILE SEQUENCE*
CONTROLFILE CHANGE* CONTROLFI OPEN RESETL VERSION T
16740500680 ORGB01 21-JAN-00 33409 21-JAN-00
1 06-OCT-98 NOARCHIVELOG 736292
716268 CURRENT 21-JAN-00 4412
736292 NOT ALLOWED 21-JAN-00
Более подробная информация
о содержании управляющего файла
И последнее представление, которое может дать информацию об
управляющем файла, - представление V$CONTROLFILE_ RECORD_SECTION.
Рабочий управляющий файл поделен на несколько разделов, в каждом из которых
хранится разная информация о работающей базе данных. Например, в
управляющем файле есть раздел, в котором хранится след порядкового номера
текущего оперативного файла журнала базы данных, раздел, содержащий
информацию о размещении на физическом диске файла базы данных Oracle и т.д.
Данное представление отображает информацию о каждом из этих разделов,
например размер каждой записи в управляющем файле для этого раздела,
общее число записей, назначаемых каждому разделу, и т.д. Следующий код
блокирует вывод выходной информации из этого представления:
BWSSffii SQL> select * from v$controlfile record section where rownum 6;
TYPE
LAST_RECID
DATABASE
RECORD
CKPT PROGRESS
REDO THREAD
0
REDO LOG
5
DATAFILE
20
SIZE
316
2036
22B
72
42B
RECORDS_
TOTAL
30
400
RECORDSJJSED
0
5
IB
FIRST
INDEX
0
0
0
0
0
LAST_INDEX
0
0
0
0
0
Управление физическими структурами базы данных
425
Совет Можно также найти имена управляющих файлов, введя команду
select VALUE from V$PARAMETER, где NAME = ' control_files'
Имя параметра должно быть напечатано в нижнем регистре.
Закрепление пройденного материала
1. Информацию об управляющем файле можно найти в представлениях
производительности VS.
2. V$CONTROL_FILE содержит базовую информацию о состоянии и
местоположении управляющих файлов.
3. Представление V$DATABASE предоставляет информацию о том, когда
создан управляющий файл, дает последний по времени порядковый номер и
записанное в управляющем файле число SCN.
4. V$CONTROLFILE_RECORD_SECTION показывает информацию,
хранимую в различных разделах управляющего файла.
Упражнения
1. Вы хотите выяснить текущий порядковый номер, сохраненный в
управляющем файле для резервного копирования. К каким двум из следующих
представлений вы обратились бы?
A. VSPARAMETER
B. VSDATABASE
С VSCONTROLFILE
D. V$CONTROLFILE_RECORD_SECTION
2. Вы хотите выяснить имена и местоположения всех управляющих файлов в
базе данных. К каким двум из следующих представлений вы обратились
бы?
A. V$PARAMETER
B. V$DATABASE
C. VSCONTROLFILE
D. V$CONTROLFILE_RECORD_SECTION
3. Вы хотите выяснить, когда был создан управляющий файл. К какому из
следующих представлений вы обратились бы за этой информацией?
A. VSPARAMETER
B. VSDATABASE
С VSCONTROLFILE
D. V$CONTROLFILE_RECORD_SECTION
Ответы
1. В и D. 2. А и С 3. В.
Мультиплексирование управляющих файлов
Если у вас несколько дисководов для Oracle, следует сохранять копии
управляющих файлов на разных дисках для минимизации риска утраты этих
важных физических дисковых ресурсов. Если вы предпочитаете создание
управляющих файлов по умолчанию, Oracle рекомендует перенести эти
управляющие файлы на разные дисковые ресурсы и задать параметр
CONTROL_FILES, чтобы Oracle знала, что существует несколько копий
управляющего файла, которые требуется сопровождать. Это называется муль-
426
Глава 11
типлексированием (multiplexing) или зеркальным отображением (mirroring)
управляющего файла. Мультиплексирование управляющего файла снижает
зависимость Oracle от доступности какого-либо из дисков на хост-машине. В
случае сбоя базу данных легче восстановить, так как поддерживалось
несколько копий управляющего файла. Ни в коем случае не следует использовать для
базы данных Oracle только один управляющий файл, поскольку в случае его
утраты трудно восстановить базу данных. Наличие нескольких копий
управляющего файла и файла параметров на разных дисках не даст сбою на диске
нарушить работу базы данных.
Мультиплексирование управляющего файла: реализация
Фактический процесс создания дополнительных копий управляющего файла
и переноса их на разные дисковые ресурсы управляется вне Oracle. Дубликат
управляющего файла можно создать просто с помощью команды копирования
в операционной системе. В Windows это команда сору, а в UNIX — ср.
Однако этим файлом нельзя пользоваться, пока вы не выполните следующие шаги:
1. В SQL*Plus выполните команду shutdown normal, shutdown immediate
или shutdown transactional, чтобы выключить экземпляр и закрыть
базу данных.
2. Скопируйте управляющий файл на другой диск с помощью команды
копирования в вашей операционной системе.
3. Измените параметр CONTROL_FILES в файле init. ora, чтобы включить
дополнительный управляющий файл.
4. В SQL*Plus введите команду startup open для перезапуска экземпляра.
Теперь Oracle будет сопровождать дополнительную копию управляющего
файла.
Совет Указание нескольких управляющих файлов в файле init. ora до
создания базы данных позволит должным образом приступить к
администрированию этой базы данных, упростив сопровождение базы данных.
Резервное копирование управляющего файла
Мы уже рассмотрели резервное копирование управляющего файла с помощью
команды alter database backup controlfile to trace. Как вам известно,
эта команда создает сценарий, который можно использовать для
восстановления управляющего файла, если впоследствии возникнут проблемы. Можно
также использовать команду alter database backup controlfile, которая
скопирует фактический управляющий файл в некое дополнительное
местоположение. Однако после резервного копирования Oracle не будет поддерживать
этот управляющий файл при добавлении нового файла данных, табличного
пространства или журналов базы данных. Таким образом, нельзя просто
создать резервную копию управляющего файла управления, если вы хотите,
чтобы Oracle добавляла в эту копию новую информацию о физической структуре
базы данных. В следующем блоке кода показано, как использовать команду
alter database backup controlfile для создания резервных копий
фактических управляющих файлов управления:
*&*&3>Ж SQL> alter database backup controlfile to '/u05/backup/dbl/control01.ctl';
Database altered.
Закрепление пройденного материала
1. Oracle может поддерживать несколько копий управляющего файла в целях
избыточности. Это называется мультиплексированием.
2. Убедитесь, что все ваши базы данных мультиплексировали файлы
управления, помещенные на различные физические диски. Их местоположение
должно определяться в параметре CONTROLFILES.
Упрввление физическими структурами базы данных
427
3. Для восстановления управляющего файла с помощью команды alter
database backup controlfile можно использовать стандартные
резервные копии фактического управляющего файла или сценарий.
Упражнения
1. Вы осуществляете мультиплексирование управляющего файла. Какой из
следующих вариантов соответствует методу создания поддерживаемых
Oracle копий управляющего файла?
A. Ввод команды alter database backup controlfile to
filename.
B. Копирование управляющего файла при выключенной базе данных.
С Ввод команды alter database backup controlfile to trace.
D. Копирование управляющего файла при работающей базе данных.
2. Вы осуществляете мультиплексирование управляющего файла управления.
Какой из следующих вариантов соответствует тому, что Oracle узнает
местоположения управляющего файла, который следует поддерживать?
A. Значения, указанные для CONTROL_FILES.
B. Значения, указанные для BACKGROUND_DUMP_DEST.
С Значения, указанные в V$DATABASE.
D. Ни один из вышеупомянутых; Oracle автоматически узнает, где
смотреть.
Ответы
1. В. 2. А.
Поддержка файлов журнала базы данных
В этом разделе будут рассмотрены вопросы поддержки файлов журнала базы
данных:
■ Цель и структура оперативных файлов журнала базы данных
■ Управление переключением на другой журнал и контрольными точками
Ш Мультиплексирование и поддержка журналов базы данных
Ш Управление оперативными файлами журнала базы данных с помощью
OMF
Файлы журнала базы данных — это дисковые ресурсы, которые хранят
внесенные пользователями Oracle изменения данных. В этом разделе мы
рассмотрим использование файлов журнала базы данных в Oracle и поиск
информации о состоянии журнала базы данных. Будет рассмотрена специальная роль
фонового процесса LGWR при поддержке журнала базы данных и его
поведение. Мы покажем, как важно поддерживать не менее двух копий каждого
журнала базы данных на машине, аналогично сопровождению управляющих
файлов. И наконец, рассмотрим управление оперативными файлами журнала
базы данных с помощью OMF.
Назначение и структура оперативных файлов журнала
базы данных
Oracle использует файлы журнала базы данных для отслеживания
производимых пользователями изменений данных, например изменения в блоках
сегментов данных в таблицах или индексах. Каждый производящий такое
изменение пользовательский процесс генерирует запись повтора, указывающую на
428
Глава 11
выполненное изменение. Эта запись повтора помещается в область SGA,
называемую буфером журнала базы данных, о котором говорилось в главе 1.
Процесс LGWR записывает эти изменения в файлы на диске, называемые
оперативными файлами журнала базы данных. Oracle предполагает, что
существует минимум два файла журнала базы данных. Каждый из файлов журнала
базы данных называется группой журнала базы данных (redo log group). В целях
надежности Oracle также позволяет создавать зеркальное отображение
каждого из файлов журнала базы данных. Такие зеркалированные (mirrored) файлы
называются членами группы (members of the group).
Совет Это обсуждение касается двух официальных экзаменационных
заданий из перечисленных в руководстве для экзамена "Основы АБДI".
Оперативные файлы журнала базы данных функционируют следующим
образом. Когда буфер журнала базы данных заполняется записями повторов
из пользовательских процессов или если активная транзакция дает команду
commit, LCWR записывает содержание буфера журнала базы данных в
каждый член группы. Иногда это называется скачиванием (flushing) буфера
повторов. Скачивание всего буфера журнала базы данных происходит, даже если
фиксируется одна единственная активная транзакция. Записываемая группа
считается текущей, потому что LGWR в настоящее время пишет в нее. LGWR
вносит записи журнала базы данных в активную группу, пока она не
заполнится, после чего переключается на запись в следующую группу журнала базы
данных. Это называется переключением журналов (log switch). Когда
заполняется и эта группа, LGWR переключается на следующую доступную группу, пока
не достигнет последнего файла журнала базы данных. После его заполнения
LGWR циклически возвращается назад к первой группе и продолжает вносить
записи повторов.
Что происходит с содержимым первой группы?
Ответ на этот вопрос зависит от режима архивирования, в котором работает
база данных Oracle. База данных может работать в режиме ARCHIVELOG или
NOARCHIVELOG. При работе в режиме NOARCHIVELOG LGWR пишет в
каждую из групп журналов, а затем циклически возвращается к первой группе
и перезаписывают ее содержимое. В случае сбоя этот тип режима не может
вернуть базу данных в состояние на момент сбоя. В режиме ARCHIVELOG
процесс архиватора (ARCn) копирует внесенные в группы журналов записи
повторов в различные местоположения. Для ускорения процесса
архивирования можно активизировать более одного процесса архиватора. При работе в
этом режиме базу данных можно восстановить на момент сбоя, применив эти
записи архивных файлов журнала базы данных к восстановленным резервным
копиям.
В этот момент многих менее опытных в управлении Oracle
администраторов БД интересует следующее: если Oracle позволяет восстановиться на
момент сбоя, когда база данных работает в режиме ARCHIVELOG, почему же
тогда кто-то запускает базу данных в режиме NOARCHIVELOG? Ответ прост.
Работающая в режиме ARCHIVELOG база данных Oracle медленнее базы
данных, работающей в режиме NOARCHIVELOG, хотя при оптимальной
настройке базы данных разница в производительности минимальна. Кроме того,
не каждой базе данных Oracle требуется архивировать все ее повторы.
Например, базе данных в режиме "только для чтения", используемой для обращений
к информационному хранилищу, не требуется > работа в режиме
ARCHIVELOG, потому что пользователи не смогут изменить уже
загруженные данные.
Другая ситуация, в которой можно не беспокоиться об архивировании
пользовательских данных, — инструментальные системы. В отличие от
производственных систем везде, где все вносимые пользователем изменения важны,
инструментальные системы используются, как правило, только
разработчиками, создающими коды новых программ или усовершенствующими
существующие системы. Разработчика может волновать только соответствие разраба-
Управление физическими структурами базы данных
429
тываемых структур базы данных производственным базам данных. В
испытательных целях разработчик может заполнять разрабатываемые таблицы
всякой ерундой. Когда испытание закончено, разработчик может удалить все
изменения и начать с нуля. В этом случае архивирование всех внесенных
разработчиком изменений данных было бы ненужным и даже непродуктивным.
Таким образом, Oracle позволяет решать, нужно ли архивировать
информацию о повторах в зависимости от рабочих потребностей системы поддержки
базы данных.
Переключение режимов архивирования
Для переключения между этими двумя режимами необходимо выполнить
следующие шаги:
1. В SQL*Plus выключите базу данных, для которой требуется изменить
режим архивирования с помощью команды shutdown normal или shutdown
immediate.
2. Запустите и смонтируйте экземпляр, но не открывайте базу данных. Для
перевода базы данных в необходимое состояние можно использовать
команду startup mdunt.
3. Измените состояние архивирования базы данных с помощью команды
alter database archivelog или alter database noarchivelog. Эта
команда изменит содержание управляющего файла. Если перезапустить
базу данных с помощью команды startup open, Oracle запустит базу данных
в указанном режиме.
4. Выключите базу данных на этом этапе и произведите полное резервное
копирование в автономном режиме. Если этот шаг останется
невыполненным, а затем возникнет необходимость восстановления базы данных из
файлов данных, резервные копии которых были созданы до изменения
режима архивирования, восстановленная база данных не будет отражать
изменения в режиме архивирования. Кроме того, если переключиться из
режима NOARCHIVELOG в режим ARCHIVELOG и впоследствии не
сделать резервные копии базы данных, нельзя будет восстановить базу
данных на момент сбоя. Причина в том, что используемые для восстановления
файлы данных отражают тот факт, что во время резервного копирования
Oracle работала в режиме NOARCHIVELOG.
5. Повторно откройте базу данных с помощью команды alter database
open.
Закрепление пройденного материала
1. Оперативные файлы журнала базы данных — это физические файлы,
сохраняющие информацию из буфера журнала базы данных в SGA.
2. Изменения, внесенные в блоки данных в базе данных, сохраняются как
записи повторов в буфере журнала базы данных в SGA.
3. После фиксации транзакции или заполнения буфера журнала базы данных
записи повторов скачиваются в оперативные файлы журнала базы данных.
4. Оперативные файлы журнала базы данных могут иметь зеркалированные
файлы. Каждый набор файлов, содержащий те же самые данные,
называется группой журнала базы данных, зеркалированные файлы называются
членами журнала базы данных.
5. Если база данных используется в режиме ARCHIVELOG, то данные в
оперативных файлах журнала базы данных архивируются в файлах архивных
файлов журнала базы данных, как только журнал заполняется. Это можно
сделать вручную или с помощью автоматических процессов
архивирования.
430
Глава 11
6. Если база данных работает в режиме NOARCHIVELOG, то нет
необходимости волноваться об архивировании оперативных файлов журнала базы
данных.
Упражнения
1. Вы анализируете структуру журнала базы данных в базе данных Oracle.
Какой из следующих вариантов соответствует имени фонового процесса,
который записывает изменения из оперативных файлов журнала базы
данных в архивированные копии для поддержки базы данных, работающей в
режиме ARCHIVELOG?
A. LGWR В. СКРТ
C. DBWO D. ARC0
2. Вы переключаете производственную систему из режима NOARCHIVELOG
в режим ARCHIVELOG. Какой из следующих вариантов соответствует
шагу, выполняемому после ввода соответствующей команды alter
database для изменения режима архивирования?
A. Перезапустить экземпляр.
B. Смонтировать, но не открывать базу данных.
С Закрыть базу данных и провести резервное копирование.
D. Открыть базу данных и сделать доступной пользователям.
3. Закончите следующее предложение: После фиксации транзакции Oracle
содержимое буфера повторов на диск.
Ответы
1. D. 2. С. 3. скачивает
Управление переключением журнала
базы данных и контрольными точками
Журнал базы данных записывается последовательно. Поскольку пользователи
Oracle вносят изменения, серверный процесс генерирует повтор для
восстановления изменений, произведенных в пределах пользовательской
транзакции. Повтор записывается в буфер повторов. Из него LGWR записывает
изменения в оперативный файл журнала базы данных. Размер файла журнала базы
данных ограничен. После его заполнения LCWR должен перейти к
следующему. Переключение журналов (log switch) происходит в тот момент, когда LGWR
полностью заполнит группу оперативных файлов журнала базы данных и
переходит на начало записи в следующей группе.
При каждом переключении журналов происходит несколько событий.
Oracle генерирует новый порядковый номер для оперативного файла журнала базы
данных, восстанавливает файл регистрации, в который собирается вносить
записи LGWR. Oracle также исполняет контрольную точку. Контрольная точка
возникает при каждом переключении. Контрольные точки могут также
возникать чаще, чем переключение журналов. Во время контрольной точки фоновый
процесс контрольной точки СКРТ обновляет заголовки всех файлов данных и
управляющих файлов, чтобы отразилось успешное завершение, и дает команду
DBWw на скачивание измененных буферов в файлы данных. Число буферов, в
которые пишет DBWn, определяется параметром FAST_START_IO_TARGET
(или FAST_START_MTTR_TARGET), если он указан. Частота, с которой
возникают контрольные точки, влияет на время, необходимое Oracle для
восстановления экземпляра. При сбое экземпляра измененные, но не записанные на
диск блоки следует восстановить из журнала базы данных. Несмотря на то что
восстановление экземпляра происходит автоматически под управлением
Управление физическими структурами базы данных
431
SMON, необходимое для него время зависит от разницы во времени между
контрольными точками.
При переключении журналов происходят следующие события. Во-первых,
LGWR прекращает запись в заполненный журнал базы данных. Во вторых,
СКРТ дает DBW« указание скачать измененные буферы в файлы данных и,
наконец, СКРТ обновляет управляющие файлы и заголовки файла данных с
помощью информации контрольной точки. После выполнения задач введения
контрольных точек LGWR сможет начать запись в следующую группу журнала
базы данных с новым порядковым номером.
От администратора БД мало что зависит при управлении переключением
журналов. Поскольку пользователи будут всегда изменять данные,
администратор БД может сделать кое-что для предотвращения записи информации о
повторе. Это значит, что можно управлять частотой переключения, изменяя
размер членов оперативных файлов журнала базы данных, или вручную,
принудительно устанавливая переключение журналов с помощью команды alter
system switch logfile. Чем больше файл, тем реже происходит
переключение журналов, а чем меньше файлы члена, тем чаще это происходит.
Контрольная точка возникает не только во время переключения журналов,
но и из-за конфигурации, при которой для СКРТ задаются регулярные
интервалы. В следующем разделе вы узнаете, как это делается. Если
сконфигурировать СКРТ с равномерными интервалами, то контрольные точки будут
возникать равномерно, так же как и переключение журналов.
Определение частоты контрольной точки
Если журналы базы данных очень большие, следует настроить базу данных
так, чтобы контрольные точки возникали чаще, чем в момент
переключения журналов. Параметр LOG_CHECKPOINT_INTERVAL или LOG_
CHECKPOINT_TIMEOUTb файле i nit. о га позволит установить более
частые контрольные точки. Эти два параметра отражают два различных
принципа, на которых основывается частота контрольной точки: интервалы по
объему и интервалы по времени.
LOG_CHECKPOINT_INTERVAL устанавливает интервалы контрольной
точки на основании объема. Когда LGWR записывает столько информации в
журнал базы данных, сколько указано в LOG_CHECKPOINT_INTERVAL,
возникает контрольная точка. Периоды с большим объемом транзакций
требуют более частого скачивания измененного буфера; и наоборот, периоды с
малым объемом транзакций требуют меньшего числа записей в журнал базы
данных и меньшего числа контрольных точек. Эффект от использования
LOG_CHECKPOINT_INTERVAL аналогичен использованию журнала базы
данных меньшего размера, но, кроме этого, устраняет дополнительные
непроизводительные издержки от переключения журнала базы данных, например
архивирование журнала базы данных.
В версиях Oracle ниже Огас1е8/ заданное вами значение LOG_
CHECKPOINT_INTERVAL является числом блоков операционной системы,
которые LGWR должен записать в журнал базы данных (после переключения
журналов базы данных) до возникновения контрольной точки. Однако это
определение несколько изменилось, начиная с Огас1е8/. Когда задается
LOG_CHECKPOINT_INTERVAL, заданная для контрольной точки позиция
не может отставать от конца журнала базы данных более чем на число блоков
журнала базы данных, указанных этим параметром. Это гарантирует, что во
время восстановления экземпляра придется считывать только заданное число
блоков повторов.
Другой способ определения частоты контрольной точки состоит в
использовании временного интервала. Он задается в параметр LOG_
CHECKPOINT_TIMEOUT файла init.ora. Конфигурировать интервалы
контрольной точки на основе времени гораздо проще, чем на основе объема,
хотя в этом случае контрольные точки возникают через одинаковые
интервалы, независимо от объема транзакций в системе. Задание LOG_
CHECKPOINTJTIMEOUT устанавливает позицию контрольной точки в то
432
Глава 11
место в файле журнала, где конец журнала базы данных был несколько секунд
назад. Благодаря этому во время восстановления требуется считать
только число блоков, равное указанному числу секунд. Однако для Огас1е8/
разница заключается только в формулировке. Для отключения контрольных точек
на основе времени установите LOG_CHECKPOINT_TIMEOUT в ноль, а
также не забудьте о новом параметре FAST_START_IO_TARGET. Этот
параметр повышает производительность при восстановлении экземпляра. Чем
меньше значение этого параметра, тем выше производительность при
восстановлении, так как приходится восстанавливать меньшее число блоков.
Если этот параметр установлен, DBW/j скачивает измененные буферы более
энергично.
Единственная проблема, которая может возникнуть при задании
равномерного возникновения контрольных точек, в том, что контрольная точка
может возникнуть как раз перед переключением журналов базы данных. Во
избежание переключения, приводящего к ускорению возникновения
контрольных точек, укажите среднее время, необходимое для заполнения
журнала базы данных, и установите интервал времени, который разлагается на
множители в контрольной точке, возникающей при переключении
журналов базы данных. Для этого рассмотрим трассировочный файл,
сгенерированный LGWR в каталоге, заданном параметром
BACKGROUND_DUMP_DEST.
И наконец, можно принудительно расставить контрольные точки с
помощью принудительного переключения журналов или вызова контрольной точки.
И то и другое можно выполнить с помощью команды alter system. Для
принудительного переключения журналов введите команду alter system switch
logfile. Для принудительного вызова контрольной точки введите команду
alter system checkpoint. Контрольные точки, возникающие без
соответствующего переключения журналов базы данных, называются быстрыми
контрольными точками (fast checkpoints), а контрольные точки с переключением —
полными (full) или завершенными контрольными точками (complete checkpoints).
Закрепление пройденного материала
1. Контрольная точка — регулярное событие в базе данных, дающее процессу
записи в базе данных сигнал скачать измененные буферы в файлы данных
и обновить управляющие файлы и заголовки файла с помощью
информации контрольной точки. Частота контрольной точки — один из факторов,
влияющих на время, требуемое базе данных на восстановление после
неожиданного сбоя.
2. Контрольные точки возникают, как минимум, при переключении
журналов базы данных. Они могут также возникать, если с помощью параметров
файла init .orа устанавливаются более частые интервалы.
3. Если интервал контрольной точки СКРТ превышает размер файла журнала
базы данных, контрольные точки возникают только при переключении
журналов базы данных.
Упражнения
1. Вы управляете базой данных Oracle. Какой из следующих вариантов
соответствует случаю, который имеет место во время контрольной точки?
A. DBW0 записывает измененные буферы на диск.
B. LGWR записывает новую информацию о последовательности
журналов в заголовки файла данных.
C. ARC0 копирует архивированные повторы в дополнительное
местоположение.
D. СКРТ записывает информацию о повторах на диск.
Управление физическими структурами базы данных
433
2. Вы хотели бы уменьшить частоту контрольных точек. Какой из следующих
способов позволяет сделать так, чтобы это не затронуло файл init. ога?
A. Увеличить размер оперативных файлов журнала базы данных.
B. Откорректировать LOG_CHECKPOINT_INTERVAL.
C. Откорректировать LOG_CHECKPOINT_TIMEOUT.
D. Отключить процесс ARC0.
Ответы
1. А. 2. А.
Зеркальное
отображение
оперативных файлов
журнала базы данных
Мультиплексирование и поддержка журнала
базы данных
Есть несколько важных моментов, связанных с конфигурированием файлов
журнала базы данных в базе данных. Важная деталь — значение
мультиплексирования журнала базы данных. Для повышения способности к
восстановлению в случае сбоя диска администратор БД должен сконфигурировать
Oracle для мультиплексирования или хранения каждого члена групп журнала
базы данных на разных дисковых ресурсах. Это означает, что Oracle будет
поддерживать два и более членов для каждой группы журнала базы данных.
Концепция мультиплексирования членов журнала базы данных
представлена на рис. 11.1.
Мультиплексирование членов журнала базы данных позволяет сохранять
множественные копии журнала базы данных, доступные для LGWR. Если у
LCWR возникает проблема с диском, на котором хранится журнал базы
данных (например, при сбое контроллера диска), весь экземпляр продолжает
работать, потому что на другом диске доступен другой член журнала базы
данных. Если в группе журнала базы данных только один член или если
несколько членов оперативных файлов журнала базы данных не
мультиплексированы, а происходит тот же самый сбой, LCWR не сможет внести записи
и в работе экземпляра Oracle возникнет сбой. Это происходит потому, что
LGWR должен переносить записи из журнала базы данных на диск, чтобы
Диск 4
А ■
Первый член
журнала базы
данных
У
Л"
Оперативный
файл журнала
базы данных
Л
Диск 5
Второй член
журнала базы
данных
Диск 6
Третий член
журнала базы
данных
434
Глава 11
очистить пространство в буфере журнала базы данных и позволить
пользовательским процессам продолжать вносить изменения в базу данных. Если
LGWR не может очищать место в памяти переносом записей журнала базы
данных на диск, никакие дальнейшие пользовательские изменения
невозможны.
Мультиплексирование журнала базы данных на разных дисках полезно для
базы данных и в других отношениях. Процесс архиватора (ARCn) управляет
архивированием файлов журнала базы данных автоматически, когда он
включен. Работу ARCn можно настроить, когда база данных работает в режиме
ARCHIVELOG. Во время работы ARCn автоматически перемещает
архивированные файлы журнала базы данных в местоположение архива, указанное
параметром LOG_ARCHIVE_DEST_/j в файле init.ora при каждом
переключении журналов базы данных. Если группы журнала базы данных находятся на
одном диске, во время переключения журналов базы данных может возникать
конкуренция при попытке АЯСл копировать заполненный журнал базы
данных в местоположение архива одновременно с попыткой LGWR писать в
следующую группу журналов базы данных. Если члены журнала базы данных и
местоположение архива находятся на разных дисках, вероятность
конкуренции между ARC» и LGWR небольшая, так как ARCn может работать на одном
диске, a LGWR — на другом.
Добавление и удаление журналов базы данных и членов
Группа журналов базы данных должна иметь по крайней мере один член.
Добавить дополнительные члены позволяет команда alter database add log-
file member 'filename' to group grpnum, где 'filename' — имяфайлас
абсолютным путем, который будет теперь иметь группа, и grpnum — номер
группы, к которой добавляется член. Можно также добавить новые группы
оперативных файлов журнала базы данных с помощью команды alter
database add logfile group grpnum 'filename'. Наконец, при наличии более
двух членов группы можно удалить журналы базы данных, если останется, по
крайней мере, два журнала, а тот, который вы собираетесь удалять, в
настоящее время не пишется процессом LGWR. Для удаления оперативного файла
журнала базы данных из Oracle используется команда alter database drop
logfile group grpnum. Учтите, что удаление группы журналов базы данных
не удаляет с хоста реальный файл. Эти файлы автоматически удаляются из
машины, когда группа журналов базы данных или ее члены удалены.
Совет Информацию о номере группы и ее состоянии для оперативных
файлов журнала базы данных можно получить из V$LOG, как описано выше в
этой главе.
Переименование файлов журнала базы данных
Файлы членов журнала базы данных можно переименовывать. Эту
функциональную возможность можно также использовать для переноса оперативного
файла журнала базы данных на другой дисковод хост-машины базы данных
Oracle. Кроме того, перемещение журнала также приводит к изменениям в
управляющем файле. При отсутствии резервной копии управляющего файла
могут впоследствии возникнуть проблемы при восстановлении этого
изменения в базе данных. Таким образом, перед переименованием журнала базы
данных следует сделать копию базы данных (включая управляющий файл).
Предположим, вы сделали резервную копию, тогда для переименования файла
членов журнала базы данных выполните следующие шаги:
1. Введите команду shutdown. Базу данных, нельзя открыть, пока вы
переименовываете журнал базы данных.
2. Скопируйте файлы журнала базы данных из их старого местоположения в
новое с помощью команды операционной системы.
3. Запустите экземпляр и смонтируйте, но не открывайте базу данных.
Управление физическими структурами базы данных
435
4. В SQL*Plus введите команду alter database rename file, чтобы
предупредить Oracle о новом местоположении журнала. После ввода этой
команды можно удалить копию журнала базы данных из его старого (а не
нового!) местоположения.
5. Откройте базу данных.
6. Сделайте резервную копию нового управляющего файла.
Совет Если база данных сообщает о разрушенном журнале базы данных,
можно повторно инициализировать файл журнала базы данных без
выключения базы данных. Все сделает команда alter database clear logfile
group л.
Закрепление пройденного материала
1. Как и управляющий файл, оперативные файлы журнала базы данных
имеют большое значение для функционирования базы данных. Чтобы не
допустить их случайной утраты, Oracle позволяет создавать зеркальное
отображение журналов базы данных. Зеркальные отображения членов группы
журналов базы данных обязательно следует иметь на различных дисках.
2. При архивировании оперативных файлов журнала базы данных старайтесь
распределять местоположения оперативных групп журнала базы данных по
разным дискам во избежание конкуренции за диск между LGWR и AR.Cn.
3. Когда-нибудь придет пора добавлять группы журналов или члены
журналов, удалять их или даже переименовать файлы журналов. Oracle позволяет
сделать все это с помощью команды alter database.
Упражнения
1. Судя по всему, ваша база данных Oracle зависла. Пользователи ждут, когда
будут обработаны их изменения, а новые пользователи не могут установить
соединение с базой данных. Если бы вы хотели исправить ситуацию без
перезапуска базы данных Oracle, какой из следующих вариантов вы бы
попробовали применить?
A. Ввести команду alter database backup controlf ile to trace.
B. Ввести команду alter database archive log.
C. Ввести команду alter system switch logfile group.
D.Ввести команду alter system set nls_date_format
'DD-MON-RRRR' ; .
2. Вы собираетесь мультиплексировать оперативные файлы журнала базы
данных в Oracle. Какой из следующих вариантов указывает на то, чего вы
хотите достигнуть?
A. Снизить конкуренцию между DBW0 и процессом СКРТ
B. Снизить риск сбоя базы данных из-за отсутствия журнала базы
данных
C. Устранить конкуренцию между записью управляющего файла и
файлов данных
D. Увеличить скорость DBW0 при записи измененных буферов на диск
Ответы
1. С. 2. В.
436
Глава 11
Управление оперативными файлами журнала базы
данных с помощью OMF
Управление журналами базы данных, которые находятся под управлением
Oracle, аналогично управлению управляющими файлами, которые находятся
под управлением Oracle. В обоих случаях используются те же самые параметры
init.ora и ведут они себя одинаково. Подробное рассмотрение этой темы
приведено в предыдущем разделе "Контроль управляющих файлов с помощью
OMF". Мы же обсудим только основные моменты этого управления. Если
помните, файлы журналов базы данных создаются при создании базы данных.
Ввод команды alter database add logfile group позволяет создавать
новые журналы базы данных.
Если база данных сконфигурирована для использования OMF, для чего
задаются любой или оба параметра для OMF из файла init.ora
(DB_CREATE_FILE_DEST и DB_CREATE_ONLINE_LOG_DEST_/j), при
создании базы данных нет никакой необходимости указывать местоположение
или имена журналов базы данных. Oracle позаботится об их создании в
местоположении, указанном в параметрах OMF с соблюдением соглашения об
именовании. То же самое верно и для создания групп или членов журналов базы
данных. Значение п в параметре DB_CREATE_ONLINE_LOG_DEST_n
определяет местоположение для мультиплексной копии оперативных файлов
журнала базы данных или управляющего файла. Можно задать до пяти
мультиплексных копий.
Если определен только параметр DB_CREATE_FILE_DEST, в указанном
параметром каталоге создается член файла журнала базы данных,
управляемый Oracle. Если определены оба параметра DB_CREATE_FILE_DEST и
DB_CREATE_ONLINE_LOG_DEST_h, то более высокий приоритет у
последнего параметра. В то время как остальная часть табличного пространства
файлов данных, управляемых Oracle, создается в указанном с помощью
DB_CREATE_ FILEDEST местоположении, член файла журнала базы
данных, управляемый Oracle, создается в каждом каталоге, указанном в этом
параметре (вплоть до MAXLOGMEMBERS для базы данных).
Размер по умолчанию для файла журнала базы данных, управляемого
Oracle, равен 100 Мбайт. Это значение можно заменить, указав размер журнала
базы данных во фразе logfile в команде create database или alter
database. Имя файла журнала базы данных создается по следующему формату:
ora_%g_%u. log, где %g — номер группы файлов журнала базы данных, а %и —
уникальная строка из восьми символов. Например, имя файла журнала базы
данных может быть таким: /u01/oradata/dbl/ora_l_xyzl2345. log. Каки
в случае с OMF, когда файл оперативных файлов журнала базы данных
удаляется, с хоста автоматически удаляются соответствующие ему файлы,
управляемые Oracle.
Закрепление пройденного материала
1. Оперативные файлы журнала базы данных создаются при создании базы
данных, а впоследствии могут создаваться или удаляться с помощью
команды alter database. Чтобы они были созданы как файлы журнала
базы данных, управляемые Oracle, необходимо задать два параметра в
файле init.ora: DB_CREATE_FILE_DEST и
DB_CREATE_ONLINE_LOG_DEST_n.
2. Если определен только DB_CREATE_FILE_DEST, то все OMF, включая
журналы базы данных, будут созданы в местоположении, указанном этим
параметром. При таком сценарии оперативные файлы журналов базы
данных мультиплексироваться не будут.
3. Если определен параметр DB_CREATE_ONLINE_LOG_ DEST_/i,
независимо от того, определен DB_CREATE_ FILE_DEST или нет, файлы
журнала базы данных будут созданы в местоположении, указанном первым из
них.
Управление физическими структурами базы данных
437
4. Если в параметре DB_CREATE_ONLINE_LOG_DEST_/i задано несколько
местоположений, Oracle создаст зеркальные отображения журналов базы
данных в каждом из них.
Упражнения
1. Вы реализовали свойство OMF для управления журналами базы данных.
Какой из следующих вариантов указывает на имя файла журнала базы
данных, которое могло бы использоваться с включенным OMF?
A. logOl.log
B. logORCL01.log
C. 1_2. log
D. ora_ 1_ asdfl234.log
2. Завершите следующее предложение: Если заданы значения для
инициализации параметров DB_CREATE_ONLINE_LOG_l и DB_CREATE_
ONLINE_LOG_2, Oracle будет журналы базы данных,
которые она создает для вас.
Ответы
1. Р. 2. мультиплексировать.
Резюме главы
В этой главе был рассмотрен ряд чрезвычайно важных для подготовки к
экзамену "Основы АБД I" положений. Сначала вы познакомились со словарем
данных Oracle. Вы научились создавать словарь данных с помощью
предоставляемых Oracle сценариев. Вы также узнали, в чем различие между
представлениями словаря и базисными таблицами и почему важно использовать
представления, а не базисные таблицы. В этой главе были перечислены некоторые
из наиболее важных представлений словаря в Oracle, а также было приведено
описание находящихся в этих представлениях данных. Вы научились
различать представления словаря и представления производительности. Вы также
научились создавать пакеты Oracle с помощью сценариев Oracle.
Затем мы обсудили контроль управляющих файлов в базе данных Oracle.
Вы узнали о назначении управляющих файлов в Oracle, о методах получения
информации из них. Вы также узнали о создании сценариев, содержащих
команду create controlf ile. И наконец, вы узнали об управлении
оперативными файлами журнала базы данных в Oracle. Были рассмотрены
назначение оперативных файлов журнала базы данных, получение данных о файлах
журнала базы данных и управляющих файлах управления из словаря данных.
Мы обсудили также кратко файлы под управлением Oracle (Oracle-Managed
Files, OMF) и их использование по отношению к созданию и обслуживанию
управляющих файлов и оперативных файлов журнала базы данных.
Двухминутное погружение в пройденное
И Словарь данных Oracle содержит хост представлений, о которых следует
знать и которые содержат информацию о содержимом и текущей работе в
базе данных Oracle.
И Некоторые из представлений словаря, о которых следует знать,
перечислены ниже:
■ USER_OBJECTS, ALL_OBJECTS, DBA_OBJECTS Сообщает
данные о различных объектах базы данных, принадлежащих или
438
Глава 11
доступных текущему пользователю, или обо всех объектах базы
данных соответственно.
■ USERJTABLES, ALL.TABLES, DBAJTABLES Отображает
информацию о таблицах, принадлежащих или доступных текущему
пользователю, или обо всех таблицах в базе данных Oracle
соответственно.
■ USER_INDEXES, ALLJNDEXES, DBA_INDEXES Отображает
информацию об индексах, принадлежащих или доступныхО
текущему пользователю, или обо всех индексах в базе данных Oracle
соответственно.
■ USER_VIEWS, ALL_VIEWS, DBA_VIEWS Отображает
информацию о представлениях, принадлежащих или доступных
текущему пользователю, или обо всех представлениях в базе данных
Oracle (включая представление словаря) соответственно.
■ USER_SEQUENCES, ALL_SEQUENCES, DBA_SEQUENCES
Отображает информацию о последовательностях, принадлежащих
или доступных текущему пользователю, или обо всех
последовательностях в базе данных Oracle соответственно.
■ USER_USERS, ALL_USERS, DBAJJSERS Отображает
информацию о текущем пользователе или обо всех пользователях в
Oracle соответственно.
■ USER_CONSTRAINTS, ALL_CONSTRAINTS, DBA_CONSTRAINTS
Отображает информацию об ограничениях, принадлежащих или
доступных текущему пользователю, или обо всех ограничениях в
базе данных Oracle соответственно.
■ USER_CONS_COLUMNS, ALL_CONS_COLUMNS,
DBA_CONS_COLUMNS Отображает информацию о столбцах
таблицы, которые имеют ограничения, принадлежащих или
доступных текущему пользователю, или обо всех столбцах таблицы в
Oracle, которые имеют ограничения на них, соответственно.
■ USER_E4D_COLUMNS, ALL_IND_COLUMNS,
DBA_IND_COLUMNS Отображает информацию о столбцах
таблицы, которые имеют индексы, принадлежащих или доступныхе
текущему пользователю, или обо всех столбцах в таблицах Oracle,
имеющих для них индексы, соответственно.
■ USER_TAB_COLUMNS, ALL_TAB_COLUMNS,
DBA_TAB_COLUMNS Отображает информацию о столбцах в
таблицах, принадлежащих или доступных текущему пользователю,
или обо всех столбцах во всех таблицах в Oracle соответственно.
■ USER_ROLES, ALL_ROLES, DBA_ROLES Отображает
информацию о ролях, принадлежащих или доступных текущему
пользователю, или обо всех ролях в базе данных Oracle
соответственно.
■ USER_TAB_PRIVS, ALL_TAB_PRIVS, DBA_TAB_PRIVS
Отображает информацию об объектных привилегиях для объектов,
принадлежащих пользователю или доступных текущему
пользователю, или обо всех объектных привилегиях объекта,
доступных всем пользователям в Oracle соответственно.
■ USER_SYS_PRTVS, ALL_SYS_PRIVS, DBA_SYS_PRTVS Отображает
информацию об объектных привилегиях на объекты,
принадлежащих пользователю или доступных текущему
пользователю, или обо всех системных привилегиях,
предоставленных всем пользователям в Oracle соответственно.
Управление физическими структурами базы данных 439
■ USER_SOURCE, ALLJSOURCE, DBA_SOURCE Отображает
исходный текст для программ PL/SQL, принадлежащих
пользователю или доступных текущему пользователю, или для всех
исходных текстов PL/SQL> во всей базе данных Oracle
соответственно.
■ USERJTRIGGERS, ALLJTRIGGERS, DBAJTRIGGERS Отображает
информацию о триггерах, принадлежащих пользователю или
доступных текущему пользователю, или обо всех триггерах в базе
данных Oracle соответственно.
■ ROLE_TAB_PRTVS, ROLE_SYS_PRIVS, ROLE_ROLE_PRTVS
Отображает информацию об объектных привилегиях, системных
привилегиях или ролях, предоставленных ролям в базе данных,
соответственно.
■ DBAJTABLESPACES, DBA_TS_QUOTAS Отображает информацию
обо всех табличных пространствах в Oracle, а также квотах на
пространство, назначаемых пользователям в каждом табличном
пространстве.
■ DBA_DATAFILES, DBA_SEGMENTS, DBA_EXTENTS,
DBA_FREE_SPACE Отображает информацию о файлах данных в
базе данных Oracle, а также сегментах, экстентах и свободном
пространстве в каждом файле данных соответственно.
■ DBA_PROFILES Отображает информацию о пользовательских
профилях в Oracle. Профили позволяют администратору БД
ограничивать физические ресурсы хост-системы (например,
распределяя память процесса, циклы процессора и т.д.), которые
пользователи могут использовать в сочетании с обработкой Oracle.
■ Кроме того, существует хост представлений производительности,
содержащий информацию о текущей работе ПО Oracle. Ниже приводятся эти
представления:
■ VSDATABASE Здесь хранится общая информация о базе данных,
смонтированной для вашего экземпляра.
■ VSSYSTEM, VSSYSSTAT Здесь хранится большая часть
информации о производительности базы данных.
■ V$SESSION, VSSESSTAT Здесь хранится большая часть
информации о производительности для отдельных пользовательских
сеансов.
■ V5LOG, VSLOGFILE Здесь можно найти информацию о файлах
оперативных файлов журнала базы данных.
■ V5DATAFILE Здесь можно найти информацию о файлах данных
Oracle.
■ VSCONTROLFILE Здесь можно найти информацию об
управляющих файлах Oracle.
■ Словарь данных создается с помощью сценария catalog, sql. Запустите
его после создания базы данных, пока вы подключены к Oracle как
администратор через SQL*Plus.
■ Часто используемые при разработке PL/SQL пакеты Oracle создаются с
помощью сценария catproc. sql. Запустите его после создания базы
данных, пока вы подключены к Oracle как администратор через SQL*Plus.
■ Необходимо знать все физические дисковые ресурсы Oracle — это
управляющие файлы, файлы журнала базы данных и файлы данных.
440
Глава 11
■ Управляющие файлы сообщают экземпляру Oracle, где найти другие
необходимые для нормальной работы файлы.
Ш Содержание управляющего файла можно найти в создающем его
сценарии, который Oracle генерирует с помощью команды alter database
backup controlfile to trace. Этот файл находится в каталоге,
указанном параметром инициализации USERDUMPDEST.
■ Вы найдете информацию об управляющих файлах, например где они
расположены на хост-машине, в YSCONTROLFILE, V$CONTROLFILE_
RECORD_SECTION и VSDATABASE.
■ Важно мультиплексировать управляющие файлы, так как это уменьшает
зависимость от любого отдельного дискового ресурса хост-машины. Это
делается с помощью параметра CQNTROL_FILES в файле i nit. о га.
■ Архитектура журнала базы данных Oracle состоит из следующих
компонентов: буфера журнала базы данных для хранения записей из
пользовательских процессов, LGWR для перемещения записей из памяти на диск и
оперативных файлов журнала базы данных на диске для хранения записей
о повторах, принятых из памяти.
■ Оперативные файлы журнала базы данных называются группами. Группа
состоит из одного или более файлов, называемых членами, в которые
LCWR вносит записи журнала базы данных. Для запуска экземпляра
Oracle требуются по крайней мере две группы оперативных файлов журнала
базы данных.
■ Контрольные точки — события, в которых LGWR дает указание DBWR
записывать все измененные блоки на диск. Они возникают во время
переключения журналов, которые происходят, когда LGWR прекращает
запись в заполненный файл журнала базы данных и начинает новый. В этот
момент LGWR также запишет изменение порядкового номера файла
журнала базы данных в заголовки файла данных и в управляющий файл.
■ Необходимо знать, что процесс LGWR использует для записи данных
повтора из одного журнала базы данных в другой и обратно, что происходит
при использовании архивирования, какова роль процесса ARCH и как
LGWR может конкурировать с ARCH.
■ Необходимо знать, как мультиплексировать журналы базы данных как с
помощью команды create database, так и с помощью команды alter
database, и почему это так важно.
■ Свойство OMF в Oracle используется для управления размещением
управляющих файлов и журнала базы данных на диске. Следует понимать, как
использовать соответствующие параметры для конфигурирования OMF и
стандартные форматы имени файла Oracle, применяемые при
использовании OMF.
Вопросы ко всей главе
1. Какой из следующих процессов в большей степени влияет на скачивание
измененных буферов из буферного кэша?
A. LGWR
B. SMON
C. ARCH
D. SERVER
2. Как можно уменьшить число возникающих в базе данных контрольных
точек?
Управление физическими структурами базы данных
441
A. Задать LOG_CHECKPOINT_INTERVAL как половину размера
оперативного файла журнала базы данных.
B. Задать LOG_CHECKPOINT_INTERVAL как удвоенный размер
оперативного файла журнала базы данных.
С Задать LOG_CHECKPOINT_TIMEOUT как число байтов
в оперативном файле журнала базы данных.
D. Задать LOG_CHECKPOINT_TIMEOUT как половину числа байтов в
оперативном файле журнала базы данных.
3. Какая из следующих стратегий рекомендуется при настройке
конфигурации журнала базы данных?
A. Сохранять члены журнала базы данных на том же самом диске для
снижения конкуренции ввода-вывод.
B. Выполнять LGWR только ночью.
С Сохранять члены журнала базы данных на различных дисках для
снижения конкуренции ввода-вывод.
D. Выполнять DBW0 только ночью.
4. Как влияет разрешение пользовательским процессам помещать записи в
журнал базы данных в буфер журнала базы данных на конкуренцию
ввода-вывода за диски, которые содержат записи журнала базы данных?
A. Повышает, потому что пользовательским процессам приходится
ждать записи на диск
B. Снижает, потому что пользовательским процессам приходится ждать
записи на диск
С Повышает, потому что пользовательским процессам не приходится
ждать записи на диск
D. Снижает, потому что пользовательским процессам не приходится
ждать записи на диск
5. Какой из следующих вариантов соответствует компоненту базы данных,
используемому для мультиплексирования управляющих файлов?
A. init.ora
B. VSCONTROLFILE
С VSDATABASE
D. DBA_DATAFILES
6. По умолчанию контрольные точки возникают по крайней мере так же
часто, как происходит
A. Переключение журналов базы данных
B. Ввод команды update для базы данных
С Обращение к табличному пространству SYSTEM
D. Объединение свободного пространства в табличном пространстве с
помощью SMON.
7. Если все члены журнала базы данных становятся недоступными в базе
данных,
A. Произойдет сбой экземпляра.
B. Выполнение экземпляра продолжится, но потребуется восстановление
носителей информации.
С База данных останется открытой, но потребуется восстановление
экземпляра.
D. Система будет функционировать, как обычно.
442
Глава 11
Ответы на вопросы ко всей главе
1. A. LGWR
Объяснение В контрольной точке LGWR дает DBW0 указание записать
измененные блоки, хранимые в очереди на запись измененного буфера в
соответствующие файлы данных. Выбор В неправилен, потому что SMON
обрабатывает восстановление экземпляра при его запуске и периодически
объединяет свободное пространство в табличном пространстве. Выбор С
неправилен, потому что ARCH управляет автоматическим архивированием при
переключении журналов базы данных и, даже если при этом возникают
контрольные точки, не управляет всем процессом. Выбор D неправилен, потому
что серверный процесс извлекает данные с диска для поддержки
пользовательских процессов.
2. В. Задать LOG_CHECKPOINT_JNTERVAL как удвоенный размер
оперативного файла журнала базы данных.
Объяснение Остальные три варианта неправильные, потому что каждый
из них фактически увеличивает число контрольных точек, выполняемых
Oracle. Кроме того, выборы С и D указывают, что задаваемые для
LOG_CHECKPOINT_TIMEOUT значения зависят от размера журнала базы
данных в байтах, что не соответствует истине. LOG_CHECKPOINT_TIMEOUT —
численное значение, определяющее установленные для контрольных точек
интервалы. См. обсуждение контрольных точек.
3. С. Хранить члены журнала базы данных на разных дисках для снижения
конкуренции ввода-вывода.
Объяснение Вариант А неправилен, потому что хранение всех членов
журнала базы данных на одном и том же диске повышает конкуренцию
ввода-вывода при переключении журналов базы данных. Варианты В и D
неправильны, потому что DBWR и LGWR всегда должны выполняться для базы данных.
См. обсуждение файлов журнала базы данных.
4. D. Снижает, потому что пользовательским процессам не приходится ждать
записи на диск.
Объяснение Разрешение пользователям вносить записи повторов в буфер
памяти повторов, в то время как LGWR управляет перемещением этих
записей на диск, уменьшает для пользовательских процессов зависимость от
ввода-вывода. Это означает, что вариант D правилен. Варианты В и С
парадоксальные утверждения: как может увеличение времени ожидания привести к
более высокой производительности или наоборот? Вариант А — логическая
противоположность варианту D, т.е. неправилен.
5. A. init.ora
Объяснение Вариант А — файл init.ora, который содержит параметр
CONTROL_FILES. Этот параметр — то, где вы бы указали, надо ли
использовать несколько копий управляющего файла, и где Oracle должна искать их. Все
остальные варианты неправильны. Они ссылаются на места, где можно искать
данные об управляющем файле, но помните: словарь данных может дать
информацию только относительно конфигурации базы данных, но никогда не
изменяет ее.
6. А. Переключение журналов базы данных.
Объяснение Вариант А — единственный, который относится к
контрольным точкам. См. обсуждение контрольных точек. Работа с табличным
пространством SYSTEM и поведение SMON при объединении не имеют ничего
общего с поведением контрольных точек. Можно набрать команду update в
нижнем регистре, но даже и тогда это мало что скажет о том, как происходит
изменение данных: часто или нечасто, легко или тяжело; и это следовало бы
знать при определении интервалов контрольной точки. Кроме того, обновле-
Управление физическими структурами базы данных
443
ние данных не будет определять контрольные точки, если используется
параметр LOG_CHECKPOINT_TIMEOUT. Oracle также гарантирует, что число
блоков повторов между контрольной точкой и последней по времени
записью повтора составляет менее 90% размера меньшего журнала базы данных.
Это гарантирует, что позиция контрольной точки продвинулась вперед к
текущему журналу базы данных прежде, чем тот журнал базы данных
заполнился.
7. А. Произойдет сбой экземпляра.
Объяснение Если становится недоступным диск, содержащий все члены
журнала базы данных, в которые в настоящее время производится запись,
произойдет сбой экземпляра. Остальные варианты неправильны, потому что
они зависят от полной доступности экземпляра, чего не может быть в данной
ситуации. См. обсуждение компонентов журнала базы данных.
ГЛАВА 12
Управление табличными
пространствами
и файлами данных
Управление табличными пространствами и файлами данных
445
Шэтой главе мы познакомимся со следующими областями, а
потом и продемонстрируем свои знания по ним:
■ Описание логической структуры базы данных
■ Создание табличных пространств
■ Изменение размера табличного пространства
различными методами
■ Выделение пространства временным сегментам
■ Изменение состояния табличного пространства
■ Изменение настроек хранения табличного
пространства
■ Реализация OMF для табличных пространств
Управление табличными пространствами с помощью Oracle — отличная
идея, предполагающая соответствие простых старых файлов на диске
хост-системы более абстрактному понятию пространства, в котором база данных
Oracle может хранить информацию. То, что физический и логический
компоненты отображаются совместно, является основой понимания материала этой
главы. В ней вы узнаете о том, что такое табличное пространство, как им
управлять и что администратор БД Oracle должен делать, чтобы переход
происходил гладко с точки зрения управления памятью. Будьте очень
внимательны, потому что на рассматриваемые в этой главе положения приходится 9%
материала экзамена "Основы АБД I".
Описание логической структуры
базы данных
Три основных компонента мира логических дисковых ресурсов Oracle —
табличные пространства, сегменты и экстенты. Табличное пространство
(tablespace) — логическая структура базы данных, предназначенная для
хранения других логических структур базы данных. Oracle представляет
табличное пространство как большую область пространства, в котором Oracle
может размещать новые объекты. Место в табличных пространствах
выделяется в сегментах. Сегмент (segment) — выделение пространства,
используемого для хранения данных таблиц, индексов, сегментов отмены или
временного объекта. Когда объект базы данных исчерпает пространство в
своем сегменте, а ему потребуется добавить данные, Oracle позволит
выделить ему дополнительное пространство в форме экстента. Экстент (extent)
аналогичен сегменту в части хранения информации, относящейся к
таблице, индексу, сегменту отмены или временному объекту. Более подробно
о сегментах и экстентах мы поговорим в следующей главе, посвященной
структурам и соотношениям памяти, а пока сосредоточимся на табличных
пространствах: Когда, зарегистрировавшись в Oracle, вы управляете
факторами памяти, вы делаете это на основании логической организации
табличного пространства.
Другая организация, представленная в базе данных Oracle, та, которая
обеспечивается операционной системой хост-машины. В основе логической
памяти в Oracle лежит физический метод, используемый хост-системой для
хранения данных, краеугольным камнем которых является блок (block).
Сегменты и экстенты состоят из блоков данных, а взятые вместе блоки, в свою
очередь, содержат файл данных (dataftle). Вспомним, что значение параметра
инициализации DB_BLOCK_SIZE задается в байтах. Этот параметр
определил стандартный размер каждого блока Oracle. Как правило, размер блока
кратен размеру блока операционной системы. Блоки Oracle обычно равны 2
Кбайт, 4 Кбайт, 8 Кбайт и иногда 16 Кбайт.
В предыдущих версиях Oracle, выпущенных до Огас1е9/, во всей базе
данных можно было использовать только один размер блока и, указав размер
446
Глава 12
блока для базы данных, впоследствии изменить его было уже нельзя. В
Oracle!)/ можно указать до пяти нестандартных размеров блока для базы данных,
что обеспечивает намного большую гибкость в отношении использования
одной базы данных при выполнении различных задач управления данными
компании. Подробнее о стандартных и нестандартных размерах блока мы
поговорим в следующей главе.
Табличное пространство может состоять из одного или многих файлов
данных, а объекты табличного пространства Oracle может хранить где-нибудь в
многочисленных файлах данных, составляющих табличное пространство.
Хотя у табличного пространства может быть много файлов данных, каждый из
них должен принадлежать только одному табличному пространству. На
рис. 12.1 представлены логическая и физическая дисковая память базы
данных Oracle.
Как Oracle осуществляет управление местом
в табличном пространстве
Управление свободным местом — важная задача, так как без этого Oracle не
знала бы, где размещать таблицы или индексы, когда вам потребуется создать
и изменить их. До Огас1е8/ все табличные пространства создавались как
управляемые словарем табличные пространства (dictionary-managed tablespaces).
Управляемые словарем табличные пространства доверяют Oracle заполнение
размещенных в табличном пространстве SYSTEM таблиц словаря данных в
целях отслеживания использования свободного пространства. Начиная с
Огас1е8/, существует новый тип табличного пространства, называемый
локально управляемым табличным пространством (locally managed tablespace).
Локально управляемые табличные пространства используются для битовых массивов,
которые хранятся в заголовках составляющих табличное пространство файлов
данных, в целях отслеживания использования свободного пространства. Этот
битовый массив представляет каждый блок в файле данных, а каждый бит в
карте показывает, является этот блок свободным или нет.
Внутри табличных пространств Oracle управляет свободным
пространством, объединяя его в непрерывные сегменты. Этим объединением в Oracle
автоматически управляет системный монитор, или фоновый процесс SMON.
При создании новых объектов базы данных Oracle получает необходимый
объем непрерывного пространства в памяти в виде сегмента для нового объекта.
Объем используемого SMON пространства зависит от собственной
конструкции объекта storage, от конструкции default storage для этого
табличного пространства или от назначения однородного экстента,
сконфигурированного для данного табличного пространства. Что касается экзамена "Основы
АБД I", помните, что SMON — процесс, управляющий текущим
объединением свободного пространства в непрерывные участки памяти во время работы
Oracle. Когда SMON объединяет свободное пространство, он или обновляет
таблицы словаря в табличное пространство SYSTEM, чтобы Oracle знала, где в
управляемом словарем пространстве есть свободное место, или это
поддерживает битовый массив в файлах данных табличного пространства, если
используются локально управляемые табличные пространства.
Совет Табличное пространство SYSTEM — всегда управляемое словарем
табличное пространство. Почему? Поскольку файлы словаря в любом случае
находятся в табличном пространстве SYSTEM, локально управляемое
табличное пространство SYSTEM не сможет обеспечить достаточный рост
производительности, если словарь данных уже является локальным по
отношению к табличному пространству!
Почему может потребоваться табличное пространство, управляемое
локально, а не словарем? Локально управляемые табличные пространства
предлагают более высокую производительность, потому что Oracle хранит
информацию о памяти в заголовках файла и битовых массивах, устраняя рекурсивные
операции, необходимые при выделении пространства под управлением
словаря. Начиная с Огас1е9/ для табличных пространств, за исключением таблично-
Управление табличными пространствами и файлами данных
447
Рис. 12.1.
Логические
и физические
представления базы
данных
Логическое
Сегменты, содержащие
несколько блоков Oracle
Первый
сегмент
(первичный
экстент)
Каждый блок Oracle
состоит из нескольких блоков
операционной системы
Первый
экстент
к>о^
го пространства SYSTEM, по умолчанию задается локальное управление
пространством. Однако можно явно указать, что вам требуется создать табличное
пространство, управляемое словарем.
Совет Синтаксис создания локально управляемых и управляемых словарем
табличных пространств будет рассмотрен в одном из последующих
разделов.
Постоянные табличные пространства
и временные табличные пространства
Независимо от конфигурации Oracle для управления пространством в табличном
пространстве само табличное пространство, как правило, конфигурируется для
хранения двух типов сегментов: постоянного и временного. Постоянный сегмент
предназначен для долговременного хранения данных таблицы или другого
объекта. Например, если Oracle используется для управления информацией о
сотрудниках в большой корпорации, вполне вероятно, что данные о сотрудниках
будут находиться в базе данных в течение многих месяцев или лет. Таким
образом, для размещения таких данных в базе данных вы использовали бы
постоянные сегменты. Продолжая рассуждать таким же образом, вы захотели бы
поместить постоянные сегменты в постоянное табличное пространство. Так и есть в
действительности, Oracle требует, чтобы постоянные сегменты находились в
постоянных табличных пространствах.
Напротив, некоторые формы данных в Oracle хранятся только временно, в
течение определенной операции базы данных. Пример такой операции —
дисковая сортировка, когда пользователь обращается к Oracle за очень большим
набором записей, которые следует возвратить пользователю отсортированны-
448
Глава 12
ми в алфавитном порядке. Операция сортировки может временно потребовать
много памяти. Иногда операция сортировки может требовать больше памяти,
чем доступно в Oracle. Чтобы справиться с недостатком памяти, Oracle
начинает размещать записи на диске во временном сегменте. Когда Oracle
закончит сортировку, ей больше не понадобятся данные из временного сегмента,
поэтому Oracle автоматически удалит временный сегмент незаметно для
пользователя и администратора БД. Следует понимать, что постоянное табличное
пространство в Oracle предназначено для размещения временных сегментов в
целях обратной совместимости. Однако назначение и освобождение
необходимого для дисковых сортировок места занимает несколько секунд и может
существенно повредить другим постоянным объектам, размещенным в
табличном пространстве, поэтому Oracle также предлагает специальный тип
табличного пространства — временное табличное пространство (temporary tables-
pace). Временное табличное пространство используется только для
размещения временных объектов. Никакие постоянные объекты базы данных
в нем недопустимы.
Временные табличные пространства по умолчанию
Поскольку любой пользователь может обратиться к Oracle с долговременным
запросом, данные на который следует возвратить отсортированными, каждому
пользователю необходимо назначить табличное пространство, где Oracle
сможет записывать временные сегменты в случае выполнения дисковой
сортировки от имени пользователя. Предыдущие версии Oracle управляли этим
назначением во время создания пользователя с помощью необязательной, но
чрезвычайно рекомендуемой фразы tablespace tablespacename в команде
create user. Теперь же следует знать, что этот подход имеет один
неприятный недостаток. Если не указать в команде фразу temporary, для хранения
временного сегмента Oracle назначит пользователя в табличное пространство
SYSTEM. Это очень плохо, поскольку, как вы помните, назначение памяти
для временного сегмента может повредить хранимым в базе данных
постоянным сегментам. В Oracle9i можно создать временное табличное пространство
по умолчанию при создании базы данных, включив фразу default
temporary tablespace в команду create database. Если его не создать, то SYSTEM
станет временным местоположением хранения по умолчанию. Однако вы
получите предупреждение в журнале предупреждающих сообщений об
отсутствии временного табличного пространства по умолчанию. Теперь быстро
рассмотрим команду create database, с которой мы уже встречались в главе 1;
однако на сей раз мы разберем, как включить в нее временное табличное
пространство по умолчанию:
CREATE DATABASE OrgdbOl
CONTROLFILE REUSE
LOGFILE
GROUP 1 ( VuOl/oradata/oracle/redola. log 0,
'/u02/oradata/oracle/redolb.log') SIZE 5M,
GROUP 2 ('/u02/oradata/oracle/redo2a.log',
'/u01/oradata/oracle/redo2b.log') SIZE 5M
MAXLOGFILES 40
DATAFILE ■/u03/oradata/oracle/sys01.dbf■
SIZE 50M AUTOEXTEND ON NEXT 30M MAXSIZE 150M
MAXDATAFILES 240
CHARACTERSET WE8IS08859P1
DITAULT TEMPORARY TABLBSPACB top
TDfPriLX '/u04/or«d»t»/or«cle/tenp01.dbf' SIZE 100M;
Совет Команда create default temporary tablespace позволяет
выделить временное табличное пространство по умолчанию уже после
создания базы данных.
Закрепление пройденного материала
1. Oracle поддерживает три типа логических дисковых ресурсов — табличные
пространства памяти, сегменты и экстенты. В основе логических структур
Управление табличными пространствами и файлами данных
449
лежат физические структуры на хост-машине, которые составляют
физическую базу данных Oracle: файлы данных и блоки Oracle. Табличные
пространства могут иметь много файлов данных, но каждый файл данных
должен назначаться только одному табличному пространству.
2. Oracle управляет памятью табличного пространства, сохраняя записи в
словаре данных или локально в заголовках каждого файла данных в
табличном пространстве. Это различие порождает два типа табличных
пространств: управляемые словарем и управляемые локально табличные
пространства. Начиная с Oracle9/, Oracle создает табличные пространства,
отличные от табличного пространства SYSTEM, которые по умолчанию
управляются локально.
3. В результате создания удаления объектов базы данных в табличных
пространствах заканчиваются непрерывные участки свободного места,
которые периодически приходится объединять. Об этом заботится SMON.
4. В Огас1е9/ можно создать временное табличное пространство, и это
предотвратит использование табличного пространства SYSTEM в качестве
временного табличного пространства. Временное табличное пространство по
умолчанию создается при создании базы данных.
Упражнения
1. Вы обдумываете логику физического отображения дисковых компонентов
памяти базы данных Oracle. Какой из следующих физических компонентов
базы данных является отображением табличного пространства логического
компонента Oracle?
А. Файл данных В. Сегмент
С. Экстент D. Блок
2. Вы конфигурируете Oracle для решения задач управления пространством.
Какой из следующих фоновых процессов объединяет свободное
пространство в файлах данных при использовании локально управляемых
табличных пространств?
A. PMON В. SMON
С ARCH D. RECO
3. Вы не сконфигурировали управление временной памятью по умолчанию в
базе данных Oracle. Затем вы вводите команду create user smithers
identified by associate с соответствующими привилегиями. Первое,
что делает SMITHERS, — вводит команду select * from emp order by
ename для таблицы ЕМР, содержащей более 8 миллионов строк. Какой из
следующих вариантов указывает место создания временных сегментов?
A. TEMP В. UNDO
С DATA D. SYSTEM
4. Вы конфигурируете управление пространством в базе данных Oracle.
Какой из следующих вариантов соответствует местоположению информации
о свободном пространстве при использовании локально управляемых
табличных пространств?
A. Табличное пространство SYSTEM
B. Заголовки файлов данных в табличном пространстве SYSTEM
C. Локальное табличное пространство
D. Заголовки файлов данных в локальном табличном пространстве
5. Вы конфигурируете локально управляемое табличное пространствоО для
базы данных Oracle. Какой из следующих вариантов соответствует
местоположению информации о свободном месте для табличного пространства
450
Глава 12
SYSTEM при использовании локально управляемого табличного
пространства?
A. Табличное пространство SYSTEM
B. Заголовки файлов данных в табличном пространстве SYSTEM
C. Локальное табличное пространство
D. Заголовки файлов данных в локальном табличном пространстве
Ответы
1. А. 2. В. SMON управляет объединением свободного пространства независимо от кон-
фигурации управления свободным местом в табличном пространстве. 3. Р. 4. Р. 5. А.
Создание табличного пространства
Исторически в Oracle табличное пространство SYSTEM было единственным
табличным пространством, которое можно было создать во время создания
базы данных. Это делалось в явном виде: определялось местоположение файла
данных табличного пространства SYSTEM в команде create database. Все
это можно делать и до сих пор, но, начиная с Огас1е9/, одновременно можно
создавать два других типа табличных пространств. Мы уже рассматривали
пример, где в команде create database создавалось временное табличное
пространство по умолчанию. Другой пример — табличное пространство
сегмента отмены. Тем, кто переходит на Огас1е9/, имея опыт работы
администратором БД в предыдущих версиях Oracle, следует учесть, что отмена (undo) — то
же самое, что откат (rollback). В Огас1е9/ при создании базы данных можно
создать следующие табличные пространства: SYSTEM, временное и UNDOTBS.
Какие табличные пространства могут понадобиться?
В типовой базе данных может потребоваться разнести различные типы данных
по разным табличным пространствам. Как правило, создается следующий
минимальный набор табличных пространств:
■ SYSTEM Каждая база данных должна иметь табличное пространство
SYSTEM. Оно создается во время создания базы данных.
■ DATA Табличное пространство DATA используется для размещения
данных таблиц.
■ INDEX Табличное пространство INDEX используется для размещения
индексов отдельно от других типов объектов.
■ UNDOTBS Табличное пространство UNDOTBS содержит сегменты
отмены (в предыдущих версиях Oracle они назывались сегментами отката).
Их нужно хранить отдельно от других типов объектов из-за непостоянства
назначения экстентов.
■ TEMP Табличное пространство TEMP содержит временные сегменты.
Их также следует хранить отдельно от других типов объектов из-за
непостоянства назначения экстентов.
■ TOOLS Табличное пространство TOOLS содержит объекты,
поддерживающие административные или другие инструментальные средства,
которые могут применяться вместе с базой данных, например Oracle Enterprise
Manager.
Совет До KOfhia этой главы мы будем заниматься вопросами создания
табличного пространства для размещения объектных данных. Учтите, что
создание этих дополнительных типов табличных пространств вручную также
базируется на тех же принципах.
Управление табличными пространствами и файлами данных
451
Создание табличного пространства для хранения
постоянных сегментов
Все дополнительные табличные пространства должны создаваться с помощью
команды create tablespace после создания базы данных. Рассмотрим
пример создания локально управляемого табличного пространства для хранения
табличных данных в базе данных, работающей под Windows. Откуда может
быть известно, что в этом табличном пространстве будут содержаться данные
таблицы? Из-за спецификаций обратите внимание на имя табличного
пространства — DATA. Как правило, это говорит о том, что табличное
пространство будет использоваться для хранения данных таблицы. А теперь
рассмотрим саму команду:
flEWSa^ SQL> CREATE TABLESPACE DATA DATAFILE
2 'E:\oradata\Oracle\daia01.dat' SIZE 20M,
3 'F:\oradata\Oracle\data02.dat' SIZE 30M
4 AUTOEXTEND ON NEXT 10M MAXSIZE 50M
5 MINIMUM EXTENT 150K
6 EXTENT MANAGEMENT LOCAL
7 PERMANENT ONLINE;
Совет На создание табличного пространства может потребоваться
довольно много времени, в зависимости от задаваемого размера файлов данных
табличного пространства. Причина в том, что Oracle должна физически
назначить себя файлу любого размера, задаваемого вами в хост-системе.
Эта операция требует терпения, особенно если задано очень большое
табличное пространство.
Как видим, в команде create tablespace существует несколько
компонентов. Сначала с помощью абсолютных имен путей определяются файлы
данных табличного пространства. (Если база данных работает под UNIX,
убедитесь, что Oracle имеет разрешение на запись в заданные имена путей.)
Учтите, что в одном из файлов данных для этого определена фраза autoex-
tend. Это свойство позволяет файлу данных автоматически выходить за
пределы первоначально определенного размера, чтобы соответствовать росту
данных.
На следующем шаге необходимо определить фразу default storage,
чтобы задать применяемые к созданию объекта базы данных опции, если для
созданного объекта не определены параметры памяти. Если для помещенного в
это табличное пространство объекта задана своя собственная фраза storage,
то настройки фразы storage объекта отменят заданные по умолчанию
настройки фразы storage табличного пространства за одним исключением.
Существует одна опция памяти, которую нельзя отменить, если она определена в
табличном пространстве. Это опция minimum extent обеспечивает кратность
каждого используемого в табличном пространстве размера экстента
целочисленному значению. Вскоре мы рассмотрим параметры default storage
более подробно.
Совет Постоянные табличные пространства, аналогичные созданным в
предыдущем блоке кода, могут содержать постоянные и временные
сегменты. Эта функциональная возможность обеспечивается Oracle для обратной
совместимости. Однако вам следует помещать временные сегменты во
временные табличные пространства.
Обратите также внимание на то, что фраза extent management local
позволяет определить это табличное пространство как локально управляемое. В
версиях Огас1е9/ и выше эта настройка управления пространством для
табличного пространства задается по умолчанию, поэтому нет необходимости
указывать эту фразу, чтобы задать локальное управление экстентом. Если бы
потребовалось определить табличные пространства, управляемые словарем, вместо
этого мы воспользовались бы фразой extent management dictionary.
Можно указать, что табличное пространство содержит постоянные объекты базы с
помощью ключевого слова permanent; однако Oracle предполагает, что
табличное пространство является постоянным, даже если ключевое слово permanent
452
Глава 12
опущено. И наконец, ключевое слово online дает Oracle указание перевести
созданное табличное пространство в оперативный режим. Оперативное
(online) — это задаваемое по умолчанию состояние созданного табличного
пространства. Если в команде create tablespace ключевое слово online
опущено, табличное пространство все равно будет оперативным. Впоследствии его
также можно сделать оперативным, введя команду alter tablespace name
online.
Примечание Если в команде create tablespace нет никаких указаний
на локальное управление или управление словарем, Oracle9i создаст его как
локально управляемое табличное пространство.
Создание табличного пространства
для временных сегментов
Большая часть табличных пространств базы данных будет содержать
постоянные объекты, которые будут Охраниться в базе данных продолжительное
время. Однако потребуется и специальное табличное пространство для
хранения временных сегментов. Если при создании базы данных не было создано
временное табличное пространство по умолчанию, можно создать табличное
пространство для хранения временных объектов. Это необходимо по двум
причинам. Во-первых, следует воспользоваться предоставляемым Oracle
преимуществом более эффективного использования сегментов сортировки по
сравнению с временными сегментами. Во-вторых, нельзя допустить создание
постоянного объекта базы данных, например таблицы или индекса с
данными, в табличном пространстве, используемом для временных сегментов. Не
забывайте о существовании ряда важных ключевых слов для создания
временного табличного пространства. Уделим одну минуту рассмотрению
следующего блока кода, обратив особое внимание на выделенные полужирным
шрифтом ключевые слова:
«Ж8>Ш№а SQL> CREATE TEMPORARY TABLESPACE temp
2 TEMPFILE '/u06/oradata/oracle/temp01.dbf■ SIZE 300M
3 extent management local;
Tablespace created.
Еще один способ создания временного табличного пространства —
вставить ключевое слово temporary в конце команды create tablespace.
Обратите внимание, что при создании временного табличного пространства таким
способом мы используем ключевое слово dataf ile, а не tempf ile. Это
показано в следующем блоке кода:
№ФШЖ SQL> CREATE TABLESPACE temp
2 DMAFILE '/u06/oradata/oracle/temp01.dbf■ SIZE 300M
3 TEMPORARY;
Tablespace created.
Подобно постоянным табличным пространствам, после создания ваше
временное табличное пространство будет автоматически переведено в
оперативное состояние. Состояние временного табличного пространства можно
посмотреть в представлении словаря данных DBA_TEMP_FILES. Столбец
CONTENTS этого представления покажет, является табличное пространство
временным или нет.
Примечание Все табличные пространства в базе данных будет
использовать определенный для базы данных стандартный размер блока.
Стандартный размер блока — размер блока Oracle, определяемый параметром
DB_BLOCK_SIZE. Однако можно также создавать табличное
пространство с нестандартным размером блока. Это может пригодиться при
транспортировке табличного пространства между базами данных с
различным размером блока. Чтобы использовать нестандартные размеры блока,
необходимо сконфигурировать в буферном кэше SGA субкэши для всех пред-
Управление табличными пространствами и файлами данных
453
полагаемых нестандартных размеров блока. Существуют определенные
ограничения, налагаемые платформой, а некоторые платформы могут
вообще не поддерживать это.
Задаваемые по умолчанию опции памяти
Фраза default storage определяет применяемые к вновь созданным
объектам базы данных опции памяти, если они не указаны в команде create. Опции
initial и next определяют размер начального сегмента объекта и следующего
выделяемого экстента соответственно. Если для табличного пространства, в
которое вы помещаете объекты, задан минимальный экстент, а заданное для
следующего объекта базы данных значение меньше минимального экстента,
Oracle округляет значение до следующего наибольшего кратного для
минимального экстента и создает начальный или следующий экстент такого размера.
Это свойство позволяет снижать фрагментацию табличного пространства.
Совет Это действительно старый способ. Назначение локально
управляемых однородных экстентов обеспечит все преимущества новой технологии.
Однако следует знать и старый способ на случай, если вам зададут вопрос
на экзамене "Основы АБДI".
Опции minextents и maxextents определяют минимальное и
максимальное число экстентов, которое объект может назначить в табличном
пространстве. Если задать minextents больше единицы, а в табличном пространстве
будет более одного файла данных, Oracle станет распределять экстенты по
нескольким файлам данных, что может повысить производительность, если эти
файлы данных находятся на разных дисковых ресурсах.
Наконец, pctincrease позволяет определить в процентах увеличение
пространства, назначенного для следующего экстента в объекте. Например,
если next задан равным 200 Кбайт, a pctincrease — 50, размер второго
экстента будет 200 Кбайт, третьего — 300 Кбайт (на 50% больше второго
экстента), четвертого — 450 Кбайт (на 50% больше третьего экстента) и т.д.
Минимальное значение — 0, а заданное по умолчанию — 50. Вычисляемое значение
округляется до следующего блока данных, который равен пятикратному
значению DB_BLOCK_SIZE. Чтобы все экстенты были одного размера, задайте
pctincrease равным 0.
Закрепление пройденного материала
1. Табличные пространства Oracle, за исключением SYSTEM, создаются с
помощью команды create tablespace.
2. Можно задать авторасширение файла данных по мере его роста, а также
определить параметры памяти по умолчанию для создаваемых в нем
объектов. Параметры default storage могут быть размерами начального и
последующего экстентов, а также минимальным и максимальным числом
создаваемых для объекта экстентов.
3. Если в таком табличном пространстве объект создается без опции
storage, то при его создании Oracle берет заданные по умолчанию параметры
памяти табличного пространства.
4. В постоянных табличных пространствах могут храниться постоянные и
временные объекты. Временные табличные пространства, напротив, могут
содержать только временные сегменты.
Упражнения
1. Вы готовитесь создать временное табличное пространство для размещения
определенного типа сегмента. Какой из следующих вариантов
соответствует ключевому слову, с которого начинается фраза, определяющая абсолют-
454
Глава 12
ное имя пути и имена файлов данных, связанных с этим табличным
пространством?
A- permanent B. temporary
C. datafile D. tempfile
2. Вы управляете табличными пространствами, чтобы разместить в них свои
данные. Какое из следующих утверждений является истинным в
отношении табличных пространств в базе данных Oracle?
A. Постоянные табличные пространства могут содержать постоянные и
временные сегменты, а временные табличные пространства — только
временные сегменты.
B. Постоянные табличные пространства могут содержать только
постоянные сегменты, а временные табличные пространства —
только временные сегменты.
С Постоянные табличные пространства могут содержать постоянные и
временные сегменты, и временные табличные пространства могут
также содержать постоянные и временные сегменты.
D. Постоянные табличные пространства могут содержать временные
сегменты, а временные табличные пространства — постоянные
сегменты.
3. Вы вводите следующую команду в базе данных Oracle:
create tablespace tbs_temp
datafile '/u05/oradata/oracle/tbs_temp01.dbf size 600M
extent management dictionary online;
Какой из следующих вариантов правильно описывает только что
созданное табличное пространство?
A. Вы создали локально управляемое временное табличное пространство.
B. Вы создали управляемое словарем временное табличное пространство.
C. Вы создали локально управляемое постоянное табличное пространство.
D.Bbi создали управляемое словарем постоянное табличное пространство.
4. Вы создаете табличные пространства в Oracle. Какое из следующих
ключевых слов или фраз разрешает файлам данных табличного пространства
автоматически расширяться, чтобы вместить растущие данные?
A. default storage
B. extent management
С autoextend
D. datafile
5. Вы создаете табличные пространства в Oracle с помощью команды create
database. Какие три из следующих табличных пространств может создать
эта команда в версиях Oracle9i и выше?
A. SYSTEM
B. DATA
C. UNDO
D. TEMP
Ответы
1. D. 2. А 3. D. Хотя имя подразумевает, что оно временное, в действительности, это
постоянное табличное пространство, потому что были опушены ключевые слова
temporary и tempfile. 4. С. 5. А, С и Р.
Управление табличными пространствами и файлами данных
455
Изменение размера табличного пространства
После создания табличного пространства существует несколько различных
способов изменить его размер. Первый — добавить новые файлы данных в
табличное .пространство. Эта задача решается с помощью команды alter
tablespace add dataf ile. Можно добавить к табличному пространству
столько файлов, сколько нужно, но при соблюдении двух ограничений.
Во-первых, нельзя добавлять файлы данных, если при этом превышается физический
размер дисковых ресурсов (это ограничение довольно очевидно). Рассмотрим
пример увеличения размера табличного пространства путем добавления
файлов данных:
янаиаива SQL> ALTER TABLESPACE data ADD DATAFILE
2 'G:\oradata\Oracle\data03.dat1 SIZE 50M;
Совет Продолжительность времени, необходимого Oracle для завершения
этой операции, зависит непосредственно от размера добавляемого файла
данных.
Другое ограничение касается следующего свойства maxdataf iles. Если
добавлено максимальное число файлов данных, разрешенных для базы
данных в соответствии с этим параметром, а вам все равно не хватает места,
можно увеличить размер существующих файлов данных в табличном
пространстве с помощью ключевого слова resize. При наличии достаточного
пространства в файловой системе изменение размеров файла данных в
большую сторону редко вызывает трудности. Как правило, можно также
уменьшать размеры файла данных, удаляя файлы данных с помощью команды
alter database datafile filename offline drop или изменяя размеры
файла данных в меньшую сторону. Это не всегда безопасно, особенно если
файл данных содержит принадлежащие объектам базы данных сегменты или
экстенты. Пытаясь выполнять такие операции, будьте особенно осторожны.
Изменение размеров файла данных в большую сторону выполняется для
отдельных файлов данных, а не на уровне табличного пространства. Для этого
введите следующую команду:
MMMCTt SQL> ALTER DATABASE DATAFILE
2 'G:\oradata\Oracle\data03.dat'
3 RESIZE 1088M;
Третий способ увеличить размер существующих файлов данных —
использовать свойство autoextend в Oracle. Такой пример мы уже рассматривали.
Как и при изменении размеров файлов данных, свойство autoextend
применяется к индивидуальным файлам данных, а не к табличному пространству,
содержащему этот файл данных. Автоматическое расширение файла данных
выполняется с помощью следующей команды:
*a*5B8raS SQL> ALTER DATABASE DATAFILE
2 'G:\oradata\Oracle\data03.dat'
3 AUTOEXTEND ON NEXT 100M MAXSIZE 198вМ;
Отметим несколько важных свойств фразы autoextend. Во-первых,
определяется размер следующего блока пространства, которое Oracle займет для
файла данных с помощью фразы next. В этом примере мы даем Oracle
указание брать по 100 Мбайт всякий раз, когда потребуется расширить размер фай-
ладанных. Во-вторых, с помощью фразы maxsize мы сообщаем Oracle
максимальный размер, до которого сможет дорасти файл данных. Указанное в этой
фразе значение должно превышать текущий размер файла данных. В этом
примере мы сообщаем Oracle, что требуемый максимальный размер этого
файла данных — 2 Гбайт.
Закрепление пройденного материала
1. Можно увеличивать размер табличного пространства, разрешив
автоматическое расширение файла данных. В результате, когда потребуется про-
456
Глава 12
странство, файл данных вырастет автоматически. Можно указать
максимальный размер файла и максимальный размер приращения.
2. Можно изменять размер табличного пространства в большую или
меньшую сторону.
3. Наконец, можно увеличить размер табличного пространства, добавляя
дополнительные файлы данных.
Упражнения
1. Вы увеличиваете размер табличного пространства. Какой из следующих
вариантов не соответствует команде, которую можно использоваться для
этой цели?
A- alter datafile resize
B. alter datafile autoextend
C. alter database add datafile
D. alter tablespace add datafile
S. Вы изменяете размеры файла данных в базе данных Oracle. Какой из
следующих вариантов соответствует проблеме, с которой можно столкнуться при
таком способе корректировки размера файла данных в меньшую сторону?
A- SMON может впоследствии столкнуться с проблемами при
объединении свободного пространства.
В. Назначенный объекту базы данных сегмент может ограничить операцию.
С В результате слишком частой корректировки размера файла данных
Oracle может удалить файл данных автоматически.
D. Для изменения размера файла в меньшую сторону не существует
никаких ограничений.
3. Вы увеличиваете размер табличного пространства в Oracle, добавляя
дополнительные файлы данных. Какой из следующих вариантов
соответствует ограничению, с которым можно при этом столкнуться?
A. Превышение максимального числа файлов данных, определенных для
базы данных.
B. Исчерпанное пространство на диске, если размер файла данных задан
слишком большим.
С Правильны варианты А и В.
D. Ни один из вышеприведенных.
Ответы
1. С. Фраза add datafile недопустима для команды alter database. 2. В. 3. С.
Назначение пространства временным сегментам
Напомним, что временные сегменты могут размещаться и в постоянном, и во
временном табличном пространстве. Эти функциональные возможности
обеспечиваются для обратной совместимости; однако всегда следует
проектировать базы данных так, чтобы временные сегменты размещались во временных
табличных пространствах, а постоянные сегменты — в постоянных табличных
пространствах. Нельзя поместить постоянный объект базы данных (например,
таблицу) во временное табличное пространство. Можно переводить табличное
пространство то в постоянное, то во временное состояние при условии, что
постоянное табличное пространство не содержит постоянных объектов базы
данных на тот момент, когда его переключают во временное табличное
пространство. Следующий блок кода демонстрирует это:
Управление табличными пространствами и файлами данных
457
аыв SQL> create tablespace testOl datafile 'D:\ORACLE\test01.dat'
2 size 1M default storage ( initial 10K
3 next 10K pctinciease 0
4 minextents 1 maxextents 5 ) temporary;
Tablespace created.
SQL> create table duramyB (dummy varchar2(10)) tablespace testOl;
create table dummy3 (dummy varchar2(10)) tablespace testOl;
ERROR at line 1:
ORA-02195: Attempt to create PERMANENT object in a TEMPORARY
tablespace
SQL> alter tablespace testOl permanent;
Command completed successfully;
SQL> create table dummy3 (dummy varchar2(10)) tablespace testOl;
Table created.
SQL> alter tablespace testOl temporary;
alter tablespace testOl temporary
ERROR at line 1:
ORA-01662: tablespace 'TEST01' is non-empty and cannot be made temporary
Временные сегменты в постоянном
табличном пространстве
Пользователю можно назначить или постоянное, или временное табличное
пространство для сортировки. При необходимости дисковой сортировки
пользователь создает временные сегменты в табличном пространстве для поддержки
команд select, содержащих фразы group by, order by, distinct или union,
или команды create index, как уже говорилось. Для создания временных
сегментов пользователям можно назначить или постоянные, или временные
табличные пространства. Если пользователю назначены постоянные табличные
пространства для создания временных сегментов, временный сегмент будет
создан в то время, когда потребуется дисковая сортировка. После ее завершения
процесс SMON автоматически удаляет временный сегмент, чтобы освободить
пространство для других пользователей. Поскольку это приводит к
существенной фрагментации, желательно создать отдельное временное табличное
пространство и хранить в нем временные сегменты для всех пользователей.
Временные сегменты во временном
табличном пространстве
Временное пространство управляется по-другому во временном табличном
пространстве. Вместо оперативного выделения временных непрерывных
сегментов экземпляр Oracle выделяет один сегмент сортировки для первой
команды, требующей дисковой сортировки. Все последующие пользователи, которым
нужны дисковые сортировки, могут совместно использовать этот сегмент.
Число экстентов, запрашиваемых сегментом сортировки, не ограничивается.
Сегмент сортировки освобождается при выключении экземпляра. Такое
управление временными сегментами повышает производительность двумя способами.
Во-первых, Oracle экономит время, назначая транзакции на предварительно
выделенные временные сегменты. Во-вторых, Oracle не освобождает
первичный временный сегмент сразу по завершении операции сортировки. Скорее,
Oracle просто устраняет экстенты и сохраняет первичный сегмент доступным
для следующей транзакции, требующей сортировки. Все управление
пространством для сегмента сортировки во временном табличном пространстве
осуществляется в новой области SGA, называемой пулом экстентов (sort extent pool)
сортировки. Процесс, нуждающийся в пространстве для дисковых сортировок,
может выделять экстенты на основании информации в этой области.
Использование локально управляемых временных
табличных пространств
Ваше временное табличное пространство должно быть локально
управляемым. Это объясняется тем, что при выполнении дисковой сортировки Oracle
требуется быстрый доступ к информации о свободном пространстве, а также
тем, что дисковые сортировки славятся своей низкой производительностью,
458
Глава 12
нет никакого смысла создавать для словаря данных еще одно узкое место в
процессе. Ниже приводится пример создания локально управляемого
временного табличного пространства:
ТИНУ CREATE TEMPORARY TABLESPACE temp
TEMPFILE •/DISK2/temp_01.dbf' SIZE 500M
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 10M;
Мы уже рассматривали использование ключевых слов tempf He и
temporary для определения временных табличных пространств таким образом.
Однако с фразой uniform extent size вы еще не знакомы. Указание размера
однородных экстентов — свойство, используемое в управлении табличными
пространствами для упрощения выделения экстентов объектам. В отличие от
определения для каждого объекта своего собственного распределения
экстентов с помощью фраз storage или назначения объектов табличным
пространствам при распределении памяти с помощью фразы default storage, uniform
extent management упрощает процесс, назначая каждый объект в табличное
пространство с точно такой же конфигурацией управления экстентами. Когда
объект помещается в табличное пространство с помощью uniform extent
management, настройка табличного пространства uniform extent
management переопределяет любые конфигурации памяти, включенные в команду
создания объекта.
Назначение места во временном табличном пространстве
Временные табличные пространства предлагают повышенную
производительность дисковых сортировок и улучшенное управление пространством для
множественных пользователей. Если для управления размером временных
сегментов и экстентов в этом табличном пространстве используется фраза
default storage, следует знать о специальных правилах определения значений
для этих опций памяти. Поскольку по определению дисковой сортировки
записанные на диск данные будут равны SORT_AREA_SIZE, экстенты должны
быть по крайней мере больше этого значения. Установите размер начального
сегмента сортировки по формуле лшп х SORT_AREA_SIZE + DB_BLOCK_
SIZE, где пит — небольшое число по вашему выбору, используемое как
множитель SORT_AREA_SIZE. Эта формула установления размеров позволяет
хранить в каждом экстенте память заголовка блока, а также данные
многократных сортировок. Далее аналогично сегментам отмены сегменты
сортировки должны запрашивать экстенты одинакового размера и таким образом
задать initial равным next. Кроме того, pctincrease должен быть равен
нулю. И наконец, во временном табличном пространстве не используется
опция памяти maxextents.
Можно также создавать многократные временные табличные пространства
для поддержки различных типов дисковых сортировок, необходимых вашим
пользователям. Например, можно иметь чрезвычайно большое временное
табличное пространство для долговременных команд select order в процессах
группового формирования отчетов или для создания индекса для большой
периодически реорганизуемой таблицы. Кроме того, можно включать меньшее
по размеру временное табличное пространство для дисковых сортировок как
побочного продукта выполняемых пользователями специальных запросов.
Каждое из этих временных табличных пространств может назначаться
пользователям на основании их ожидаемых потребностей в сортировке.
Получение информации о временных сегментах от Oracle
Существует несколько представлений словаря данных, доступных для
получения информации о временных сегментах. Содержание показывающих эту
информацию представлений в словаре базируется или на временных сегментах,
существующих в базе данных, или на информации о производительности
временных сегментов во время выполнения экземпляра. Ниже приводится пере-
Управление табличными пространствами и файлами данных
459
чень представлений, в которых можно посмотреть информацию о временных
сегментах:
■ DBA_SEGMENTS Дает информацию об имени и местоположении
пространства и владельце обоих типов временных сегментов в Oracle.
Обратите внимание, что можно увидеть только информацию относительно
временных сегментов в постоянных табличных пространствах, пока эти
сегменты назначены, а информацию о временных сегментах во временных
табличных пространствах — в течение срока службы экземпляра.
■ V$SORT_SEGMENT Дает информацию о размере временных табличных
пространств, текущем числе экстентов, выделенных для сортировки
сегментов, и информацию о верхней отметке сегментов сортировки.
■ V$SORT_USAGE Дает информацию о сортировках, которые в настоящее
время производятся в базе данных. Это представление часто объединяется
с VSSESSION; это описано выше в настоящей главе.
Можно получить имя, тип сегмента и табличное пространство, в котором
хранятся сегменты сортировки с помощью представления DBA_SEGMENTS.
Учтите, что этот сегмент возникнет только в связи с выполнением первой
дисковой сортировки после запуска экземпляра. Примером служит следующий
блок кода:
ЯИКЧЯЯВ SQL> select owner, segment_name, segment_type, tablespace_name
2 from dba_segments;
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
SYS 13.2 TEMPORARY TEST01
Можно получить размер сегментов сортировки, выделенных во временных
табличных пространствах, обратившись к V$SORT_SEGMENT, что полезно
при текущем определении размеров временных табличных пространств.
Следующий запрос иллюстрирует, как получить информацию о верхней отметке
сегмента сортировки из V$SORT_SEGMENT:
ВВЙЧЭИИ SQL> select tablespace_name, extent_size,
2 total_extents, max_sort_blocks
3 from v$sort_segment;
TABLESPACE_NAME EXTENT_SIZE TOTAL_EXTENTS MAX_SORT_SIZE
TEST01 3147776 14 44068864
И наконец, можно увидеть информацию о текущих сортировках в
экземпляре, объединив данные из представлений V$SORT_USAGE и VSSESSION.
Примером является следующий блок кода:
fflSflffiM SQL> select a.username, b.tablespace,
2 b.contents, b.extents, b.blocks
3 from vSsession a, v$sort_usage b
4 where a.saddr - b.session_addr;
USERNAME TABLESPACE CONTENTS EXTENTS BLOCKS
SPANKY TEST01 TEMPORARY 14 21518
Представления словаря для управления временными
табличными пространствами
Существует два новых представления словаря для управления временными
табличными пространствами:
■ DBA_TEMP_FILES Это представление словаря предоставляет
информацию о каждом файле данных, связанном с временным табличным
пространством.
■ VSTEMPFILE Аналогично DBA_TEMP_FILES это представление
производительности предоставляет информацию о каждом файле данных,
связанном с временным табличным пространством.
460
Глава 12
Закрепление пройденного материала
1. Для выполнения сортировки следует правильно задать размер экстента
временного табличного пространства. Он должен быть кратен
SORT_AREA_SIZE x DB_BLOCK_SIZE, поскольку Oracle всегда
производит сортировку соответственно размерам SORT_AREA_SIZE.
2. Убедитесь также, что все экстенты во временном табличном пространстве
имеют одинаковый размер, приращение в процентах всегда равно нулю и
они не объединяются. Рекомендуется иметь несколько временных
табличных пространств для различных видов сортировки.
3. Oracle предоставляет много представлений словаря данных, из которых
можно узнать о временных сегментах. DBA_SEGMENTS — статическое
представление, a V$SORT_SEGMENT и V$SORT_USAGE предоставляют
динамическую информацию о существующих сегментах сортировки и их
использовании.
4. Информация о временных табличных пространствах предоставляется в
Oracle с помощью представлений DBA_TEMP_FILES и V$TEMPFILE.
Упражнения
1. Вы хотите больше узнать о выделении места для временных сегментов.
Какое из следующих представлений словаря помогло бы в этом?
A. V$SORT_SEGMENT
B. V$TEMPFILE
С DBA_TEMP_FILES
D. DBA_SEGMENTS
2. Вы хотите преобразовать временное табличное пространство в постоянное.
Какое из следующих утверждений истинно в отношении этой операции?
A. Временные табличные пространства можно преобразовать в
постоянные, когда в табличном пространстве хранятся только
временные сегменты.
B. Временные табличные пространства можно преобразовать в
постоянные, когда в табличном пространстве хранятся только
постоянные сегменты.
С Временные табличные пространства можно преобразовать в
постоянные, когда табличное пространство не используется.
D. Временные табличные пространства можно преобразовывать в
постоянные без ограничений.
3. Вы хотите сконфигурировать распределение места во временных
табличных пространствах. Какой из следующих вариантов соответствует свойству
Oracle, при котором сегменты табличного пространства принудительно
назначаются одного и того же размера независимо от распределений памяти,
определенных для объектов, помещенных в табличное пространство?
A. default storage
B. storage
С uniform extent management
D. autoe'xtend
Ответы
1. A 2. С 3. С.
Управление табличными пространствами и файлами данных
461
Изменение состояния табличного пространства
В одном из блоков кода create tablespace из предыдущего урока
описывается, как создать табличное пространство так, чтобы оно было
оперативным и доступным для использования сразу после создания. Напомним
также, что команда alter tablespace name online позволяет сделать
табличное пространство оперативным после его создания. Команда alter
tablespace name offline позволяет сделать табличное пространство
автономным. Возможно, это потребовалось бы при попытке предотвращения
доступа к данным в это табличное пространство при одновременном
сохранении остальной части базы данных в оперативном режиме и доступной для
использования. Отдельные файлы данных можно также переводить в
оперативный и автономный режимы с помощью команд alter database
datafile filename online или alter database datafile filename
offline.
Табличное пространство может перевести в автономное состояние с
одним из нескольких приоритетов, включая normal, temporary и immediate.
В зависимости от используемого для этого приоритета может потребоваться
восстановление носителей информации для этого табличного пространства.
Табличное пространство, переведенное в автономное состояние с
приоритетом normal, не потребует восстановления носителей информации, а
табличное пространство, переведенное с приоритетом immediate, потребует.
Табличное пространство, переведенное в автономное состояние с приоритетом
temporary, не потребует восстановления носителей информации, если ни
один из файлов данных не был автономным до перевода табличного
пространства в автономное состояние. Однако если какой-либо из файлов
данных был автономным до временного перевода табличного пространства в
автономное состояние из-за ошибки чтения или записи, то для его
возвращения в оперативное состояние потребуется восстановление носителя
информации. Следующий блок кода демонстрирует перевод табличного
пространства в автономное состояние с каждым из трех возможных
приоритетов. Учтите, что при отсутствии приоритетов по умолчанию задается
приоритет normal.
HHWHHfc ALTER TABLESPACE data OFFLINE;
ALTER TABLESPACE data OFFLINE NORMAL;
ALTER TABLESPACE data OFFLINE IMMEDIATE;
ALTER TABLESPACE data OFFLINE TEMPORARY;
В некоторых случаях можно также столкнуться с ситуациями, при
которых используется способность Oracle определять табличные пространства
"только для чтения" В следующем блоке кода представлен код,
позволяющий сделать табличное пространство читаемым, но не перезаписываемым, а
затем вернуться к предыдущему состоянию, чтобы его снова можно было
перезаписывать:
ВСТЙаШ ALTER TABLESPACE data READ ONLY;
ALTER TABLESPACE data READ WRITE;
И наконец, если требуется удалить табличное пространство, используйте
команду drop tablespace. Она имеет несколько дополнительных фраз,
например including contents для удаления всех объектов базы данных,
содержащихся в табличном пространстве, а также самого табличного пространства,
и ключевые слова cascade constraints для удаления любых ограничения,
которые могут зависеть от объектов базы данных, хранящихся в удаляемом
табличном пространстве. В следующем блоке кода демонстрируется команда
drop tablespace:
ЯН»ЗВВ DROP TABLESPACE data INCLUDING CONTENTS CASCADE CONSTRAINTS;
Совет Теперь можно использовать ту же самую команду и убирать файлы
данных из операционной системы с помощью команды drop tablespace
name including contents cascade constraints and datafiles.
462
Глава 12
Создание оперативного табличного пространства
"только для чтения"
Напомним, что табличное пространство — это логическое представление
дисковой памяти и что оно может состоять из множества файлов данных. Oracle
использует соглашение об относительной нумерации файлов данных, что
делает номер файла данных уникальным в табличном пространстве, в отличие от
более ранних версий Oracle (до Oracle 8), где номер файла данных абсолютно
уникален по всей базе данных. Табличное пространство "только для
чтения" — то, где никто из пользователей не может внести изменения данных ни
в одном из объектов, хранимых в этом табличном пространстве. Существует
несколько исключений из этого правила. Например, в табличном
пространстве "только для чтения" можно удалять такие элементы, как таблицы и
индексы, потому что эти команды воздействуют только на словарь данных, но
нельзя такие элементы создавать или изменять. Это возможно, потому что команда
drop обновляет только словарь данных, а не составляющие табличное
пространство физические файлы.
Чтобы сделать табличное пространство "только для чтения", следует
выполнить определенные условия. Табличное пространство должно быть
оперативным, не должно содержать активных сегментов отмены и должно быть
в режиме оперативного резервного копирования.
В версиях Oracle до Огас1е8/'для перевода табличного пространства в режим
"только для чтения" надо было обеспечить, чтобы перед вводом команды
alter tablespace read only никто из пользователей не производил
изменения в любом из объектов этого табличного пространства. Если бы данные в
табличном пространстве, которое вы собрались переводить в режим "только
для чтения", обрабатывались в ходе каких-либо активных транзакций,
произошла бы ошибка при вводе команды. В версиях Ьгас1е8/ и выше этого уже не
случится. Вместо этого можно вводить команду alter tablespace read
only, и Oracle дождется завершения всех активных транзакций, а затем
сделает табличное пространство "только для чтения". Пока Oracle ждет завершения
транзакций, табличное пространство переводится в переходный режим только
для чтения", при котором последующие транзакции с записью в это табличное
пространство уже не разрешаются, а существующие транзакции могут
зафиксироваться или сделать откат.
Совет В версиях Oracle8i и выше не требуется ждать завершения
транзакций для перевода табличного пространства в режим "только для
чтения". Кроме того, перед транспортировкой табличного пространства в
другую базу данных его следует сделать "только для чтения ".
Закрепление пройденного материала
1. Табличные пространства могут находиться во многих состояниях. Они
могут быть оперативными или автономными, только для чтения или только
для чтения-записи. В обычных ситуациях, когда табличные пространства
активно используются, они находятся в состоянии "оперативное и
чтение-запись". Однако при некоторых условиях может потребоваться
перевести табличное пространство в автономный режим (чтобы переименовать
файлы данных) или "только для чтения" (чтобы сохранить данные в
табличном пространстве).
2. Существует несколько способов перевода табличного пространства в
автономный режим: normal, immediate и temporary.
3. Чтобы сделать табличное пространство "только для чтения", следует
выполнить определенные условия. Табличное пространство должно быть
оперативным и не должно содержать никаких активных сегментов отмены.
По этой причине табличное пространство SYSTEM никогда не сможет
стать "только для чтения", поскольку содержит сегменты отмены на
системном уровне. Кроме того, табличное пространство не должно быть в
режиме оперативного резервного копирования.
Управление табличными пространствами и файлами данных 463
Упражнения
1. Вы хотите сделать табличные пространства "только для чтения" в базе
данных Oracle. Какое из следующих табличных пространств не может стать
автономным из-за активного сегмента отмены?
A. SYSTEM В. DATA
С. INDEX D. TEMP
2. Вы собираетесь удалить табличное пространство. Какая из следующих
команд может использоваться для удаления табличного пространства,
содержащего родительские таблицы в отношениях с внешним ключом?
A. alter database datafile offline drop
B. alter tablespace offline immediate
C. drop tablespace cascade constraints
D. drop tablespace including contents
Ответы
1. A. 2. С
Изменение параметров памяти
табличного пространства
А теперь еще раз рассмотрим параметры памяти по умолчанию,
устанавливаемые для табличного пространства при его создании. Они не имеют никакого
отношения к самому табличному пространству, но используются как
параметры по умолчанию, когда пользователи вводят команды create table, create
index или create undo segment, в которых нет явного указания параметров
памяти. Параметры по умолчанию для табличного пространства можно
изменить с помощью команды alter tablespace, как показано в следующем
блоке:
РЭДЙМй SQL> ALTER TABLESPACE data DEFAULT STORAGE ( INITIAL 2M NEXT 1M ) ;
Нет необходимости задавать все имеющиеся параметры памяти по
умолчанию — только те, для которых требуется изменить значения. Однако имейте в
виду, что изменение параметров памяти по умолчанию не оказывает никакого
влияния на существующие объекты базы данных в табличном пространстве.
Оно касается только параметров памяти для новых объектов базы данных и
только, если у этих новых объектов базы данных не заданы явно свои
собственные параметры памяти.
Перемещение файлов данных табличного пространства
В зависимости от типа табличного пространства администратор БД может
перемещать файлы данных с помощью одного из двух методов: команды alter
tablespace или команды alter database. Перемещение файлов данных,
лежащих в основе табличного пространства, в Oracle приобретает огромное
значение, например, когда вы пытаетесь устранить горячие точки в базе
данных или более равномерно распределить загрузку ввода-вывода или дисков в
хост-машине. При перемещении или переименовании файлов данных в
пределах одного табличного пространства используйте команду alter tables-
pace, а при перемещении файлов данных для нескольких табличных
пространств используйте команду alter database. В любом случае выполнение
этих команд изменяет только указатели на файлы данных, записанные в
управляющем файле. Они не переименовывают и не перемещают файлы
физически в операционную систему. Фактическое переименование или
перемещение файлов данных следует выполнять на уровне операционной системы.
Ниже мы подробно рассмотрим конкретные шаги по перемещению файлов.
464
Глава 12
Примечание Даже имея возможность переименовывать файлы данных,
лежащие в основе табличного пространства, нельзя использовать команды
Oracle для переименования табличных пространств. Для этого следует
удалить табличное пространство и восстановить его с новым именем.
Перемещение файлов данных с помощью команды
alter database
Чтобы переместить файлы данных с помощью команды alter database,
выполните следующие шаги:
1. Выключите базу данных.
J. Используйте команду операционной системы для перемещения файлов.
3. Смонтируйте базу данных.
4. Выполните команду alter database rename file.
5. Откройте базу данных.
6. Создайте резервную копию базы данных и управляющего файла.
В следующем блоке кода эти шаги представлены в Windows:
D:\ORACLE\DATABASE\ sqlplus
Oracle SQL*Plus Release 9.0.1.0.0 Production
(c)1999, Oracle Corporation. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to:
0racle9i Enterprise Edition Release 9.0.1.0.0 Production
With the Partitioning and Objects options
PL/SQL> Release 9.0.1.0.0 - Production
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> host move tmpljsc.ora tempijsc.ora
1 file(s) moved.
SQL> startup mount pfile™initjsc.ora
Total System Global Area 14442496 bytes
Fixed Size 49152 bytes
Variable Size 13193216 bytes
Database Buffers 1126400 bytes
Redo Buffers 73728 bytes
Database mounted.
SQL> alter database rename file
2> 'D:\0RACLE\DATABASE\TMP1JSC.ORA"
3> to
4> 'D:\0RACLE\DATABASE\TEMP1JSC.ORA';
Statement Processed.
SQL> alter database open;
Statement processed.
Перемещение файлов данных с помощью команды
alter tablespace
Для перемещения файла данных с помощью команды alter tablespace
используется следующий процесс:
1. Переведите табличное пространство в автономный режим.
а. Используйте команду операционной системы для перемещения или
копирования файлов.
3. Выполните команду файла alter tablespace rename dataf ile.
4. Переведите табличное пространство в оперативный режим.
5. Создайте резервную копию базы данных и управляющего файла.
Управление табличными пространствами и файлами данных
465
Ограничения в Oracle9/
Как правило, в 0гас1е9/ можно столкнуться со следующими ограничениями
относительно табличного пространства:
■ Максимальное число табличных пространств в базе данных — 64 000.
Ш Устанавливаемый операционной системой предел на максимальное число
файлов данных в табличном пространстве...,0 как правило, 1023 файла;
однако это число зависит от операционной системы.
Закрепление пройденного материала
1. Если при создании объектов базы данных, например таблиц и индексов, не
указываются параметры памяти, Oracle воспринимает параметры памяти
табличного пространства как значения по умолчанию и использует их для
создания этих объектов.
2. Эти заданные по умолчанию параметры памяти табличного пространства
можно изменить после создания табличного пространства с помощью
команды alter tablespace. Измененные параметры памяти по
умолчанию для табличного пространства вступают в силу только для новых
объектов, которые будут созданы, но не для существующих.
3. Очень часто приходится переименовывать или перемещать файлы данных
табличного пространства. В зависимости от того, сколько файлов данных
необходимо переименовать или переместить, есть две команды Oracle на
выбор: alter tablespace Halter database.
4. При использовании команды alter database следует выключить базу
данных, переместить файлы данных, установить базу данных, ввести
команду Oracle, а затем запустить базу данных.
5. При использовании команды alter tablespace можно выключить
базу данных или перевести табличное пространство в автономный
режим, переместить файлы данных, смонтировать базу данных, ввести
команду Oracle и открыть базу данных.
6. После перемещения или переименования файлов данных настоятельно
рекомендуется создать резервную копию базы данных и управляющего файла.
Упражнения
1. Вы перемещаете файл данных из одного местоположения на диске в
другое. После копирования физического файла в новое местоположение
какой из следующих шагов необходим для продолжения задачи?
А- Перевод табличного пространства в оперативный режим.
B. Перевод базы данных в оперативный режим.
C. Ввод соответствующей команды alter database, которая сообщит
Oracle о перемещении.
D. Ввод соответствующей команды alter system, которая сообщит
Oracle о перемещении.
S. Вы изменяете заданные по умолчанию параметры памяти табличного
пространства в базе данных Oracle, чтобы увеличить размер начальных
экстентов. Какой из следующих вариантов указывает, когда изменение вступит в
силу для уже существующих в этом табличном пространстве таблиц?
A. Изменение вступает в силу немедленно.
B. Изменение вступает в силу после добавления данных к таблице.
C. Изменение вступает в силу после удаления данных из таблицы.
D. Изменение не будет вступать в силу для существующих таблиц.
466
Глава 12
Ответы
1. С. 2. D.
Oracle-Managed Files (OMF)
К настоящему моменту вы встречались с Oracle-Managed Files (OMF) по
крайней мере трижды: один раз во введении к главе 1 и дважды при изучении
системных журналов, управляемых Oracle, и управляющих файлов, управляемых
Oracle. В этом разделе мы не станем тратить слишком много времени на
функциональные возможности этого свойства, за исключением их роли в создании
или удалении табличных пространств. OMF используется не в
производственных системах, а в базах данных для тестирования и разработки, чтобы упростить
управление файлами данных при управлении табличными пространствами.
Чтобы создать управляемые Oracle файлы данных для табличных пространств,
временных файлов или табличных пространств UNDOTBS, следует определить
параметр DB_CREATE_FILE_DEST в файле init. or а. Этот параметр должен
указывать на заданное по умолчанию местоположение, где создаются все
управляемые Oracle файлы данных (файлы данных OMF) или временные файлы.
Ниже приводится пример определения этого параметра в Windows:
кмятат DB_CREATE_FILE DEST - 'C:\Oracle\oradata\DBl'
Создание файлов данных OMF для табличных пространств
Файлы OMF можно создавать для стандартных табличных пространств и
табличного пространства UNDOTBS (см. главу 4). При создании табличного
пространства фраза datafile не является обязательной. Если фраза datafile
включена, то имя файла данных необязательно. Если фраза datafile
опущена полностью или не содержит имени файла, то файл данных создается в
местоположении, определяемом параметром DB_CREATE_FILE_DEST.
Следующий блок кода содержит пример того, как можно создать или изменить файлы
данных OMF:
tmmwisss SQL> show parameter db_create_file_dest
NAME TYPE VALUE
db create_file_dest string C:\oracle\oradata\DBl
SQL> create tablespace data datafile size 25M;
Tablespace created.
SQL> select file_name, tablespace_name, bytes/1024/1024 as megs
2 from dba_data_files
3 where tablespace_name - 'DATA';
FILE S_ ONAME TABLESPACE MEGS
C:\ORACLE\ORADATA\DBl\ORA_DATA_ZVSRKH00.DBF DATA 25
Приведенный выше код продемонстрировал создание табличного
пространства без указания имени или местоположения файла, в котором он
должен создаваться, указан только его размер. При обращении к
местоположению файла данных для созданного табличного пространства вы
обнаружите, что он создан в местоположении, указанном параметром DB_CREATE_
FILE_DEST. Обратите внимание на имя и размер файла. Если удалить
табличное пространство, содержащее управляемые Oracle данные, файлы данных
автоматически удаляются из базовой операционной системы.
Создание временных файлов OMF для временных табличных
пространств
При создании временного табличного пространства с OMF фраза tempf ile
является необязательной. Если она включена в команду, имя файла
необязательно. Если фраза tempf ile или имя файла не указаны, файл данных будет
создан в местоположении, указанном параметром DB_CREATE_FILE_DEST.
Следующий блок содержит пример создания или изменения временных
файлов OMF.
Управление табличными пространствами и файлами данных
467
SQL>- s Ocreate temporary tablespace temptbs;
ТаЫеэрасе created.
SQL> select tablespace_name, contents from dba_tablespaces
2 where tablespace_name « 'TEMPTBS';
TABLESPACE CONTENTS
TEMPTBS TEMPORARY
SQL> select file_nanie( tablespace_name
2 from dba_temp_fi si Oes;
FILE NAME TABLESPACE
C:\ORACLE\ORADATA\DB1\TEMP01.DBF TEMP
C:\ORACLE\ORADATA\DBl\ORA TEMPTBS ZVSRZ200.TMP TEMPTBS
Закрепление пройденного материала
1. Oracle-Managed Files (OMF) — новая особенность Огас1е9/, которая
упрощает администрирование файлов данных для табличных пространств,
управляющих файлов и журнала базы данных. Определение параметра
DB_CREATE_FILE_DEST в файле init. ora активизирует OMF для
табличных пространств. Этот параметр должен указать местоположение на
машине, где OMF файлы данных будут созданы по умолчанию.
8. Если OMF активно, при создании табличных пространств не требуется
указывать фразу dataf ile или даже имя файла данных. То же самое
справедливо и для создания временных табличных пространств, где не обязательно
определение фразы tempf ile. Пропуская эти фразы, Oracle создает файлы
данных в местоположении по умолчанию, указанном предыдущим
параметром файла init. ora. Если имя файла не определено, Oracle использует по
умолчанию соглашение об именовании, которое обеспечивает уникальные
имена файлов.
Упражнения
1. Вы создаете табличное пространство в базе данных, где используется OMF.
Какой из следующих вариантов указывает, как Oracle определяет, каким
будет имя файла?
A. Oracle должна использовать содержимое обязательной фразы
datafile с именем файла.
B. Oracle должна использовать содержимое обязательной фразы
tempf ile с именем файла.
С Во всех случаях Oracle назовет файл согласно своим собственным
параметрам по умолчанию.
D. Если не задана фраза datafile или tempf ile, Oracle назовет файл
согласно своим собственным параметрам по умолчанию.
S. Вы реализуете OMF на базе данных Oracle. Если включено свойство OMF,
для каких из следующих табличных пространств Oracle управляет
созданием и удалением файлов данных из хост-системы?
A. Только табличное пространство SYSTEM
B. Только табличное пространство UNDOTBS
С Только табличное пространство TEMP
D. Все табличные пространства в базе данных
Ответы
1. D 2. D.
468
Глава 12
Резюме главы
В этой главе вы ознакомились с основными положениями Oracle,
относящимися к табличным пространствам и их управлению. Мы рассмотрели физическое
отображение файлов данных и блоков в их логически ассоциированные
аналоги: табличное пространство, сегмент и экстент. Мы также обсудили создание
табличного пространства. Вы узнали о различных типах поддерживаемого
Oracle управления свободным пространством, включая управляемые словарем
табличные пространства и локально управляемые табличные пространства. Вы
также узнали о различиях между постоянными табличными пространствами и
временными табличными пространствами относительно типов сегментов,
которые могут храниться в каждом из них. Вы научились изменять размер
табличного пространства с помощью различных методов, например добавления
дополнительных файлов данных или увеличения размера файлов данных. Были
также рассмотрены некоторые особенности применения свойства autoextend
для файлов данных. Затем мы обсудили временные табличные пространства,
включая различные методы их создания. Вы научились изменять состояние
доступности табличных пространств и заданные по умолчанию параметры
памяти. И наконец, мы рассмотрели реализацию Oracle-Managed Files (OMF)
относительно управления табличными пространствами.
Двухминутное погружение в пройденное
Ш Необходимо понимать взаимосвязь между табличным пространством и
файлами данных. Табличное пространство может иметь много файлов
данных, но каждый файл данных может быть соотнесен только с одним
табличным пространством.
■ При создании базы данных существует одно табличное пространство
SYSTEM. В Огас1е9/ можно также создать заданное по умолчанию
временное табличное пространство для базы данных и табличные пространства
UNDOTBS.
■ Все остальные табличные пространства создаются с помощью команды
create .tablespace.
■ Существует два метода использования Oracle для управления свободным
местом в табличном пространстве. Вся информация о свободном месте в
управляемых словарем табличных пространствах хранится и управляется
через словарь данных Oracle. Информация о свободном месте в локально
управляемых табличных пространствах хранится и управляется в
заголовках файлов данных всех файлов данных табличного пространства.
■ Администратору БД не следует размещать все объекты базы данных в этом
табличном пространстве, потому что их память часто вступает в конфликт
друг с другом. Вместо этого администратор БД должен создать несколько
табличных пространств для различных сегментов базы данных и
размещать эти объекты в таких табличных пространствах.
■ Процесс SMON периодически управляет объединением состоящего из
нескольких несмежных участков свободного места в управляемых словарем
табличных пространствах в большие непрерывные блоки свободного
пространства. Однако в локально управляемых табличных пространствах
объединение не производится.
Ш Постоянные сегменты хранят данные в постоянных объектах базы
данных, например в таблицах.
■ Временные сегменты хранят данные во временных сегментах,
генерируемых всякий раз, когда Oracle производит дисковую сортировку.
■ Временные табличные пространства отличаются от постоянных тем, что
в них могут храниться только временные сегменты. Напротив,
постоянные табличные пространства могут вмещать и постоянные, и временные
Управление табличными пространствами и файлами данных
469
сегменты. Однако в практических целях, как вы узнали из этой главы,
временные сегменты не следует хранить в постоянных табличных
пространствах.
■ Oracle может автоматически переводить табличные пространства в
оперативный режим после того, как они созданы по умолчанию.
■ В Огас1е9/ все табличные пространства по умолчанию используют
локально управляемые экстенты, если во время создания табличного
пространства не указать иное.
■ Временные табличные пространства должны использовать локально
управляемые экстенты для улучшения производительности.
■ Новая область памяти, называемая пулом экстентов сортировки,
управляет тем, как пользовательские процессы распределяют экстенты для
дисковых сортировок во временных табличных пространствах.
■ SMON управляет освобождением временных сегментов в постоянных
табличных пространствах, когда они уже не нужны транзакциям.
Ш Нельзя создавать постоянные объекты базы данных, например таблицы,
во временных табличных пространствах. Нельзя также преобразовывать
постоянные табличные пространства во временные, если только в
постоянном табличном пространстве нет постоянных объектов.
■ Информацию о временных сегментах и сегментах сортировки можно
получить из представлений словаря DBA_SEGMENTS, V$SORT_SEGMENT,
VSSESSION и V$SORT_USAGE.
■ Сегмент сортировки существует во временном табличном пространстве до
тех пор, пока доступен экземпляр. Все пользователи совместно
используют сегмент сортировки.
■ Размер экстентов во временном табличном пространстве следует задавать
кратным SORT_AREA_SIZE плюс один дополнительный блок для
заголовка сегмента, чтобы максимально повысить производительность
дисковой сортировки.
■1 Следует знать, какие представления словаря используются для поиска
информации о структурах памяти, включая DBA_SEGMENTS, DBA_
TABLESPACES, DBA_TS_QUOTAS, VSTABLESPACE, DBA_EXTENTS,
DBA_FREE_SPACE и DBA_FREE_SPACE_COALESCED.
■ Можно изменять состояние доступности табличных пространств с
помощью команды alter tablespace. Перечитайте главу еще раз, чтобы
повторить все существующие состояния.
■ Управление табличными пространствами можно сочетать со свойством
Oracle-Managed Files (OMF). При использовании OMF можно не
определять имя или местоположение файлов данных, связанных с табличными
пространствами, которые вы хотите создать.
Вопросы для самопроверки
1. Фоновый процесс Oracle, управляющий периодическим объединением
свободного места в табличном пространстве, .
2. Состояние табличного пространства сразу после его создания:
3. Это табличное пространство нельзя перевести в автономный режим, пока
база данных открыта .
4. Следует конфигурировать временные сегменты/экстенты как кратные
этому значению параметра из файла init. ora: .
470
Глава 12
Вопросы ко всей главе
1. В каком из следующих вариантов приводится ключевое слово,
предотвращающее создание в табличном пространстве таблицы, отмеченной для
использования, когда вы выполняете select order с помощью команд над
миллионами строк выходных данных?
A. lifespan
В.permanent
C. online
D.offline
E. temporary
F. read only
2. Когда в команде create table не определены никакие опции, что
использует Oracle для конфигурации назначения памяти объектам?
A. Заданные по умолчанию опции, указанные для пользователя в
табличном пространстве
B. Заданные по умолчанию опции, указанные для таблицы в табличном
пространстве
С Заданные по умолчанию опции, указанные для пользователя в базе
данных
D. Заданные по умолчанию опции, указанные для таблицы в базе
данных
3. К какому из следующих представлений может обратиться администратор
БД, чтобы определить выделенное для временных сегментов место?
A. DBAJTABLESPACES
B. DBA_TABLES
С DBA_SEGMENTS
D. DBA_FREE_SPACE
4. В каком из следующих вариантов указан процесс, который самым
непосредственным образом приводит к фрагментации в табличном
пространстве, содержащем временные сегменты, поскольку высвобождает
используемые для дисковых сортировок сегменты?
A. Server B. DBWR
C. SMON D. LGWR
5. Какой из следующих вариантов лучше всего описывает методологию
установления размеров экстентов для сегментов сортировки в вашей базе
данных Oracle?
A. DB_BLOCK_SIZE + 6
B. X * SORT_AREA_SIZE + DB_BLOCK_SIZE
С (avg_row_size - init_row_size) * 100 / avg_row_size
D. 100 - pctfree (avg_row_size * 100)/ avail_data_space
6. Каждый из следующих вариантов идентифицирует событие в
последовательности событий, которые выполняются из SQL*Plus. Если А — первое
событие, a D — последнее, какой из следующих вариантов идентифицирует
случай, который приведет к ошибке?
A.create tablespace TB01 datafile '/oracle/tbOl.dbf'
default storage
B. (initial 10K next 10K pctincrease 0 minextents 4 maxextents 20) temporary;
Управление табличными пространствами и файлами данных
471
C. create table my_tab (my_col varchar2(10)) tablespace TB01;
D. alter tablespace TB01 permanent;
E. create table my_tab (my s_ Ocol varchar2 (10)) tablespace
TB02;
7. Вы пытаетесь определять, сколько дисковых сортировок происходит в базе
данных в данный момент. Какую из следующих таблиц словаря вы
использовали бы в поисках этой информации?
A. VSSESSION В. VSSYSSTAT
С. DBA_SEGMENTS D. V$SORT_USAGE
Ответы на вопросы для самопроверки
1. SMON
8. Оперативное
3. SYSTEM
4. SORT_AREA_SIZE
Ответы на вопросы ко всей главе
1. Е. temporary
Объяснение Oracle принудительно поддерживает предназначенное
использование временного табличного пространства с помощью ключевого слова
temporary. Ключевое слово lifespan не существует, хотя концепция срока
службы очень важна для понимания фрагментации табличного пространства,
что исключает вариант А. Варианты С, D и F неправильны, потому что
состояние доступности табличного пространства не тот фактор, который
проверяется в этой ситуации. И наконец, хотя и существует различие между
постоянными и временными таблицами, при определении табличного пространства
не используется ключевое слово permanent.
5. В. Опции по умолчанию, указанные для таблицы в табличном пространстве
Объяснение Всё параметры default storage для объектов таблицы
определяются как часть команды создания табличного пространства. Для
создаваемого по умолчанию табличного пространства имя может Лыть создано при
создании имени пользователя наряду с максимальным объемом памяти в табличном
пространстве для всех созданных пользователем объектов. Однако не
существует параметров памяти по умолчанию для каждой таблицы в базе данных или для
пользователя. См. обсуждение создания табличного пространства.
3. С. DBA_SEGMENTS
Объяснение Варианты А и D неправильны, потому что они не являются
фактическими представлениями в словаре данных. Вариант В неправилен,
потому что DBATABLES перечисляет информацию только о таблицах в базе
данных, а не о временных сегментах, создаваемых в рамках операции
сортировки. См. обсуждение просмотра информации о памяти в Oracle.
4. С. SMON
Объяснение Процесс SMON автоматически удаляет временные сегменты из
постоянного табличного пространства, как только они больше не нужны
транзакциям. Серверный процесс может только извлекать данные с диска, что
исключает вариант A. DBWR управляет записью на диск, но не удаляет
временный сегмент, что исключает вариант В. Вариант D также неправилен, потому
что LGWR управляет записью журнала базы данных на диск, о чем говорилось
в главе 7.
472
Глава 12
5. В. X * SORT_AREA_SIZE + DB_BLOCK_SIZE
Объяснение Если бы подлежащие сортировке данные были немного меньше
параметра SORT_AREA_SIZE в файле initsid.ora, то сортировка
происходила бы в памяти. Как видим, все дисковые сортировки будут записывать
данные, по крайней мере такого же объема, как SORT_AREA_SIZE, на диск,
следовательно, задавайте размер сегмента сортировки как кратный этому
параметру. Поскольку сегменту сортировки потребуется блок заголовка, к
DB_BLOCK_SIZE необходимо добавить дополнительное место для заголовка.
Варианты С и D — это формулы для определения pctf гее и pctused
соответственно, так что они неправильны. Вариант А используется для указания
необходимого базе данных числа сегментов отмены, что также неправильно.
6. В. create table my_tab (my_col varchar2(10))
tablespace TB01;
Объяснение Поскольку табличное пространство ТВ01 временное, в нем
нельзя создавать постоянный объект, например таблицу, следовательно,
вариант В правильный. Кстати, если бы созданное в варианте А табличное
пространство было постоянным, то вариант С был бы правильным, так как при
попытке преобразовать постоянное табличное пространство во временное
происходит ошибка, если табличное пространство содержит постоянный
объект. Вариант D также мог бы быть правильным при таком сценарии, потому
что таблица MYTAB уже существовала бы.
7. D. V$SORT_USAGE
Объяснение Представление V$SORT_USAGE показывает сеансы,
использующие сегменты сортировки в базе данных. Хотя, возможно, вы захотите
присоединить эти данные к данным в варианте A, VSSESSION, чтобы
посмотреть имя пользователя, соответствующее этому сеансу, само VSSESSION не
дает никакого указания на текущие дисковые сортировки. VSSESSTAT или
DBA_SEGMENTS гоже этого не делают, что исключает эти варианты.
ГЛАВА 13
Структуры памяти и данные
отмены
474
Глава 13
этой главе мы познакомимся со следующими областями, а
потом и продемонстрируем свои знания по ним:
■ Структуры памяти и их взаимоотношения
■ Управление данными отмены
Часть ежедневной работы администратора БД занимает создание
объектов базы данных. Этот особенно справедливо для администраторов БД,
которые управляют базами данных тестирования и разработки. Однако даже
работающие на производственных системах администраторы БД сочтут, что
большая часть их времени уходит на исследование глубины настроек
объектов базы данных. В этой главе вы ознакомитесь с основными структурами
памяти, например, сегментами и экстентами, которые содержат такие объекты
базы данных, как таблицы и индексы в Oracle. Вы также узнаете о сегментах
отмены — важных структурах данных, используемых для управления
транзакциями и согласованности чтения в Oracle. Содержание этой главы
закладывает основу для управления таблицами, индексами и ограничениями
целостности, которые рассматривались в Главе 5. Материал этой главы
составляет приблизительно 14% от материала, выносимого на экзамен
"Основы АБД I"
Структуры памяти и их взаимоотношения
В этом разделе будут рассмотрены следующие темы, касающиеся структур
памяти и их взаимоотношений:
Ш Различные типы сегментов и их использование
■ Применение параметров использования места в блоке
■ Получение информации о структурах памяти
■ Критерии для разделения сегментов
Хранение объектов базы данных в Oracle часто может доставлять
хлопоты, потому что каждый из различных типов объектов базы данных имеет
свои собственные потребности в памяти и типичное поведение. К тому же,
поведение одного типа объекта базы данных часто сталкивается с
поведением других объектов в базе данных. Администратору БД Oracle следует
удостовериться, что все объекты "ладят" друг с другом. Чтобы помочь вам в
подготовке к экзамену "Основы АБД I" и в администрировании базой данных,
мы рассмотрим в этом разделе различные типы сегменты и их
использование. Вы также научитесь контролировать, как Oracle использует экстенты,
управлять пространством на уровне блока, искать информацию о
выделении памяти базы данных и размещать сегменты с учетом фрагментации и
срока службы.
Совет См. обсуждение по теме "Описание логической структуры базы
данных " из раздела " Структуры памяти и их взаимоотношения ",
рассматриваемые в Главе 3. В руководстве "ОСР Candidate Guide for the Oracle9i
DBA ОСР" разбирается та же самая тема, указанная в обоих разделах. В
целях краткости, мы охватим ее только это один раз.
Различные типы сегментов и их использование
В качестве быстрого повторения напомним, что логическая структура базы
данных состоит из следующих компонентов: табличное пространство,
сегменты и экстент. Табличное пространство — это логические структуры,
содержащие объекты базы данных Oracle и состоящие из одного или более файлов
данных. Сегменты — это совокупности физических блоков данных, которые
используются для размещения данных в объектах базы данных (например,
таблица). Когда Oracle исчерпает место в сегменте, используемом для
размещения данных в этом объекте, Oracle запросит другой набор физических бло-
Структуры памяти и данные отмены
475
ков данных, чтобы вместить добавляемые данные. Этот следующий набор
физических блоков данных называется экстентом.
В предыдущей главе, мы говорили, что для хранения различных типов
объектов необходимы различные типы табличного пространства. Oracle,
напротив, обычно создает базу данных только с одним табличным пространством —
табличным пространством SYSTEM. Это табличное пространство может
использоваться только для размещения словаря данных Oracle и сегментов
отмены SYSTEM. Oracle9/ разрешает создавать табличное пространство отмены и
временное табличное пространство при создании базы данных, поэтому, в
дополнение к табличному пространству SYSTEM, у вас будут, как минимум,
отдельные табличные пространства для таблиц, индексов, сегментов отмены и
временных сегментов.
Для понимания различных типов табличных пространств (и почему плохо
даже пытаться хранить все объекты базы данных в табличном пространстве
SYSTEM), вы должны знать различные типы объектов, которые могут
храниться в табличном пространстве. Каждый объект базы данных, например,
таблица или сегмент отмены, в конечном счете, состоит из сегментов и экстентов.
По этой причине, обсуждение сосредотачивается на различных типах
сегментов, доступных в базе данных Oracle и их использовании.
Сегменты таблицы и их использование
Первый тип сегмента — сегмент таблицы. Каждый сегмент содержит блоки
данных, которые хранят данные из строк этой таблицы. Скорость заполненил
и роста таблицы определяется поддерживаемым таблицей типом данных.
Например, если таблица поддерживает компонент приложения, вмещает
большие тома вставок данных (записи о заказах на продажу популярной марки
вина, например), сегмент, в который войдет эта таблица, будет регулярно
заполняться и вряд ли уменьшится в размере. Поэтому администратор БД,
управляющий табличным пространством, в котором хранится этот сегмент,
захочет спланировать регулярный рост. Если, однако, эта таблица
предназначена для хранения небольшого объема данных проверки правильности,
требования к размеру таблицы могут быть не такими динамичными. В этом случае
администратор БД может сосредоточиться на том, как обеспечить полное
соответствие одной таблицы одному сегменту в целях снижения потенциальной
фрагментации, вызываемой назначением экстентов. Еще один фактор,
требующий рассмотрения при планировании сегментов таблиц — собираетесь ли
вы использовать параллельную обработку в базе данных Oracle. В таком случае
вам, фактически, потребовалось бы разделить таблицу на несколько сегментов
и экстентов, или даже использовать разделение. Вскоре мы рассмотрим эту
тему более подробно.
Индексные сегменты и их использование
Другой тип сегмента — индексный сегмент. Аналогично сегментам таблиц,
рост индексного сегмента определяется типом роли, которую индекс
поддерживает в базе данных. Если таблица, с которой связан индекс, предназначена
для объемных транзакций (как в примере с вином, приведенном выше), для
индекса также следует запланировать рост. Однако индекс будет почти
неизменно меньше таблицы в базе данных, потому что в нем находится только
один или несколько столбцов таблицы в формате "удобный для поиска",
наряду с информацией ROWID для ассоциированных строк из таблицы.
Из чего конкретно состоит индекс? Индекс состоит из списка элементов
для определенного столбца (индексированный столбец), в котором можно
легко найти значения, хранимые в столбце. Каждому значению поставлен в
соответствие ROWID для строки таблицы, в которой содержится это значение
столбца. Принцип сопутствующего роста индекса аналогичен росту
соответствующей таблицы. Если индекс связан с редко изменяемой таблицей, размер
индекса может быть относительно статическим. Однако если индекс связан с
таблицей, в которую часто вносятся вставки, следует планировать и рост
индекса. Кроме того, если в базе данных планируется использование параллель-
476
Глава 13
ной обработки, может потребоваться хранить индексные данные в нескольких
сегментах или даже использовать разделение. Вскоре мы обсудим критерии
для разделения индексных сегментов.
Сегменты отмены и их использование
Сегменты отмены отличаются от только что рассмотренных табличных и
индексных сегментов. Сегменты отмены хранят данные о произведенных во
время транзакции изменениях в целях обеспечения согласованности чтения и
параллельности транзакций. Как правило, сегменты, используемые для
хранения данные из таблиц и индексов, предназначены для текущего
использования, т.е. добавленные к табличному или индексному сегменту данные
остаются там на время. Сегменты отмены не похожи на них. Вместо этого, как только
пользовательский процесс произвел изменения в базе данных и зафиксировал
транзакцию, место в сегменте отмены, где хранились данные этого
пользователя, освобождаются для повторного использования в поддержку транзакции
другого пользователя. Архитектура сегментов отмены Oracle разработана так,
чтобы сегмент отмены мог повторно использовать это место. Обычно, у
сегмента отмены есть несколько экстентов, всегда назначаемых ему для хранения
информацию о незафиксированных транзакциях.
По мере роста или уменьшения числа незафиксированных транзакций, то
же самое происходит и с используемым сегментом отмены пространством.
Пробуйте разместить данные незафиксированных транзакций в экстенте,
который уже назначен ему. Например, если сегмент отмены состоит из пяти
экстентов и весь начальный экстент содержит старые данные из
зафиксированных транзакций, сегмент отмены повторно использует этот экстент для
хранения данных из новых или незафиксированных транзакций после
заполнения пятого экстента. Однако если сегмент отмены заполняет пятый экстент
данными из незафиксированной транзакции, а в первом экстенте все еще
находятся данные из незафиксированных транзакций, сегмент отмены должен
назначить новый экстент. Различные долговременные и кратковременные
транзакции в базе данных Oracle могут привести к тому, что сегмент отмены
будет назначать и освобождать множество экстентов и делать многократно в
течение дня, а это может неблагоприятно повлиять на рост других объектов
базы данных из-за фрагментации табличного пространства. Таким образом,
разумнее будет хранить сегменты отмены в их собственном табличном
пространстве отмены.
Совет Табличное пространство отмены можно создать при вводе команды
create database, включив в нее фразу undo tablespace name datafi-
le 'filename' size number [K|M]. Если табличное пространство отмены
не создано при создании базу данных, необходимо это сделать позднее с
помощью команды create tablespace.
Временные сегменты и их использование
Теперь рассмотрим временные сегменты. В соответствии со своим названием,
временный сегмент назначается для хранения временных данных
пользовательской транзакции, которую нельзя полностью сохранить в памяти. Одно самых
распространенных направлений использования временных сегментов в
пользовательских процессах — их применение для сортировки данных в требуемом
порядке. Эти сегменты назначаются оперативно и освобождаются, когда больше
уже не нужны. Использование места в них отмечено короткими периодами
высокой потребности памяти, за которыми следуют периоды отсутствия потребности
в памяти. Поскольку неизвестно, когда временный сегмент может появиться и
использовать все доступное в табличном пространстве место, нельзя адекватно
спланировать удовлетворение потребностей роста других объектов базы
данных — стало быть, действительно, следует хранить временные сегменты в своем
собственном табличном пространстве, и как можно дальше от других объектов
базы данных.
Структуры памяти и данные отмены
477
Совет Фраза default temporary tablespace в команде create
database позволит создать временное табличное пространство по
умолчанию наряду с базой данных Oracle. Если, вводя команду create database,
вы не создаете временное табличное пространство, следует создать их,
позже с помощью команды create default temporary tablespace.
Дополнительный материал: сегменты LOB, кластерные
сегменты и сегменты ЮТ
Последний тип сегментов, которые могут использоваться в базе данных
Oracle — сегменты LOB, кластерные сегменты и сегменты ЮТ. LOB (large object)
означает большой объект, а большие объекты в Oracle используют для
размещения своих данных специальный тип сегмента. Если в базе данных часто
используются большие объекты, создайте отдельное табличное пространство и
хранить в нем эти объекты. В противном случае о создании дополнительного
табличного пространства можно не беспокоиться.
Возможно, вы уже слышали о кластерных таблицах — это физическая
группировка двух или более таблиц в одном и том же сегменте по общему
индексу. Кластерные сегменты поддерживают использование кластеров в
базе данных. Установка размеров кластерных сегментов и планирования их
роста — сложный, требующий внимания процесс, поскольку в каждом
блоке каждого сегмента, фактически, будут храниться данные из двух разных
таблиц.
И, наконец, ЮТ (index-organized table) означает таблицу с индексной
организацией, в которой вся таблица хранится в пределах структуры. Исторически
она предназначалась только для использования индексами. Очевидно, что
потребности этих сегментов в памяти аналогичны индексам. Однако
применение кластерных сегментов и сегментов ЮТ будет, скорее всего, весьма
ограничено, и вам не придется волноваться о потенциальном конфликте между
этими и другими объектами базы данных.
Примечание об инструментальных средствах базы данных
Административные инструментальные средства базы данных, например,
Oracle Enterprise Manager, используют набор таблиц, индексов и других объектов
базы данных, которые собирают данные о базе данных. Этот набор объектов
базы данных часто называется репозиторием. Хотя сегменты, в которых
хранятся объекты репозитория — это те же самые сегменты, в которых
содержатся ваши данные, по нескольким причинам для хранения объектов
репозитория следует создать отдельное табличное пространство. Одна из причин —
поддержание логического разделения на данные вашей организации и
инструментальные данные. Другая причина, хотя и маловероятная — в репозитории
может содержаться таблица или другой объект с тем же самым именем, как у
объекта в базе данных, что вызовет конфликт. Воспользовавшись
специальным табличным пространством TOOLS для хранения объектов, используемых
административными инструментальными средствами базы данных,
впоследствии вы облегчите свою работу.
Зачем разделять сегменты на разные
табличные пространства?
Для ответа на этот вопрос давайте рассмотрим потенциальную
фрагментацию для различных сегментов (и, таким образом, табличных пространств),
которые могут храниться в базе данных. Это поможет понять, почему так
важно хранить различные типы сегментов в различных табличных
пространствах. Сначала рассмотрим следующий вопрос: Что вызывает
фрагментацию? Табличное пространство фрагментируется в связи с усечением или
удалением хранимых в табличном пространстве объектов, которые затем
восстанавливаются (или, для сегментов отмены, при высвобождении некогда
478
Глава 13
запрошенных объектом экстентов). Срок, в течение которого сегмент или
экстент остается назначенным объекту базы данных, называется его сроком
службы {lifespan). Чем чаще экстент высвобождается, тем короче срок
службы экстента. Чем короче срок службы экстента, тем выше фрагментация
табличного пространства. Фоновый процесс SMON непрерывно ищет
оставшиеся после операций truncate или drop меньшие фрагменты свободного
пространства, объединяет их вместе и создает большие участки свободного
пространства.
Теперь рассмотрим потенциальную фрагментацию табличного
пространства для различных табличных пространств. Табличное пространство SYSTEM
содержит системные сегменты отмены и словарь данных. Oracle эффективно
управляет табличным пространством SYSTEM, и у его экстентов
продолжительный срок службы, так что в этом табличном пространстве фрагментация
очень маленькая или ее вообще нет. В табличном пространстве TOOLS,
вероятно, будет небольшая фрагментация, потому что, как правило, вам нет
необходимости (и не следует) входить в табличное пространство TOOLS и
самостоятельно управлять его объектами, лучше всего доверить управление
репозиторием административному инструменту. И здесь у экстентов
продолжительный срок службы.
Следующие два рассматриваемых табличных пространства — DATA и
INDEX. Возможная степень фрагментации этих табличных пространств
полностью будет зависеть от того, как часто таблицы усекаются или
удаляются. В производственной системе это вряд ли возможно, так что у
экстентов будет продолжительный срок службы, а фрагментация, вероятно, будет
низкой. Однако в базах данных разработки это может происходить
постоянно, потенциально сокращая срок службы экстентов и повышая
фрагментацию табличного пространства. Вам лучше судить об уровне фрагментации
этих табличных пространств, исходя из срока службы экстентов в таких
системах.
Еще два типа табличных пространств, UNDOTBS для сегментов отмены, и
TEMPORARY для временных сегментов (для сегментов сортировки и
временных сегментов можно иметь более одного табличного пространства) часто
сталкиваются с очень высокой фрагментацией. Это справедливо в отношении
табличного пространства UNDOTBS, потому что у сегментов отмены
потенциально очень короткий срок службы, a Oracle может назначать и
высвобождать экстенты в зависимости от потребностей долговременных транзакций.
В следующей главе мы более подробно рассмотрим назначение экстентов
сегментам отмены и их освобождение. И, наконец, срок службы сегментов и
экстентов в табличном пространстве TEMPORARY невероятно короток.
Временные сегменты используются для обработки операций сортировки
(сортировка вызывается командой select order by), которые управляют
слишком большим объемом сохраняемых в памяти данных. При
необходимости Oracle автоматически назначает место. Сразу после завершения операции
сортировки Oracle снова автоматически освобождает место. Таким образом,
исходя из определения применения и срока службы, у табличного
пространства TEMPORARY будет самая высокая фрагментация среди всех табличных
пространств базы данных.
Совет Срок службы экстента и фрагментация табличного пространство
обратно пропорциональны — чем короче срок службы, тем выше
потенциальная фрагментация табличного пространства.
Таким образом, хотя табличное пространство SYSTEM может хранить
любой объект базы данных, не рекомендуется размещать в нем какие-либо иные
объекты, кроме объектов словаря и системного сегмента отмены. Во
избежание проблем с базой данных, следует подготовить несколько других табличных
пространств для хранения различных типов сегментов. Размещение этих
объектов в других базах данных, созданных с учетом их собственных
потребностей в памяти, позволит администратору БД предупредить множество
потенциальных проблем с памятью.
Структуры памяти и данные отмены
479
Создание необходимых табличных пространств
для размещения различных сегментов
Одна из основных задач при работе с базой данных — создание отдельных
табличных пространств для хранения таблиц, индексов, сегментов отмены,
временных сегментов и сегментов, связанных с административными
инструментальными средствами базы данных, например, Oracle Enterprise Manager.
Необходимые для базы данных Oracle табличные пространства могут быть
созданы, например, с помощью такой команды:
f^S'gi CREATE TABLESPACE UNDOTBS datafile ' /u05/oradata/oracle/undo01 .dbf
SIZE 300M EXTENT MANAGEMENT LOCAL ONLINE;
CREATE TABLESPACE data datafile '/u06/oradata/oracle/data01.dbf'
SIZE Э00М EXTENT MANAGEMENT LOCAL ONLINE;
CREATE TABLESPACE index datafile '/uOV/oradata/oracle/indexOl.dbf
SIZE 3COM EXTENT MANAGEMENT LOCAL ONLINE;
CREATE TABLESPACE tools datafile '/u08/oradata/oracle/tools01.dbf
SIZE 300M EXTENT MANAGEMENT LOCAL ONLINE;
CREATE temporary TABLESPACE temp tempfile ' /u09/oradata/oracle/temp01 .dbf'
SIZE Э00М EXTENT MANAGEMENT LOCAL online;
Каждый из этих различных типов объектов базы данных имеет свое
собственное уникальное поведение, и иногда поведение одного типа объекта
конфликтует с другим. В разделе, посвященном структурам памяти и их
взаимоотношениям, вы узнали о существующих в Oracle различных типах сегментов, и
почему так важно помещать их в их собственные табличные пространства.
При указаний для этих табличных пространств параметров памяти по
умолчанию старайтесь задать параметры, подходящие типу объектов базы данных,
который будет храниться в этом табличном пространстве, или просто
воспользуйтесь назначением однородных экстентов, принятым Oracle9i по
умолчанию. Благодаря этому в команде create tablespace нет необходимости
указывать default storage. Это свойство мы рассмотрели в главе 3, а также обсудим
его в следующем разделе.
Закрепление пройденного материала
1. Убедитесь, что можете идентифицировать типы сегментов, доступные для
хранения объектов базы данных.
2. Помните, что важно не хранить все сегменты базы данных Oracle внутри
табличного пространства SYSTEM. Oracle9/ предлагает в команде create
database такие фразы, как default temporary tablespace и undo
tablespace, позволяющие создавать табличное пространство специально для
временных сегментов и сегментов отмены при создании базы данных. Это
не дает Oracle сбросить такие сегменты в табличное пространство
SYSTEM, которое следует использовать только для хранения данных
словаря и системных сегментов отмены.
3. С помощью команды create tablespace, как было показано в примере,
можно также создавать различные табличные пространства, которые
потребуются для разделения различных типов сегментов.
4. Необходимо уметь различать следующие типы сегментов в базе данных
Oracle и объяснить, почему их следует хранить в их собственных табличных
пространствах: DATA, INDEX, UNDOTBS.TEMP и TOOLS.
Упражнения
1. Вы конфигурируете базу данных Oracle для управления различными
типами сегментов. Какое из следующих утверждений истинно в отношении
разделения сегментов и экстентов?
480
Глава 13
A. Сегмент, используемый для хранения различных типов данных в
Oracle, состоит из блоков данных, что характерно для большинства
типов сегментов; таким образом, все они могут размещаться в
табличном пространстве SYSTEM, что сэкономит время и усилия
администратора БД.
B. Используемый для хранения данных таблицы сегмент будет
задействован, вероятно, сразу же после того, как Oracle обратится к
сегменту, в котором находятся ассоциированные индексные данные;
таким образом, желательно поместить табличный и индексный
сегменты в разные табличные пространства.
С Используемый для хранения временных данных сегмент может часто
назначаться и высвобождаться; таким образом, его следует размещать
в том же самом табличном пространстве, что и временные данные
таблицы, но отдельно от табличного пространства SYSTEM.
D. Табличное пространство SYSTEM используется для размещения
системных сегментов отмены, а поскольку все сегменты отмены
носят временный характер, табличное пространство SYSTEM — как
раз то место в базе данных Oracle, в котором следует держать все
сегменты отмены.
8. Ознакомьтесь со следующим блоком кода:
create database mydb
controlfile reuse
character set US7ASCII
national character set US7ASCII
datafile VuOl/oradata/mydb/mydbOl.dbf' size 400M
logfile group 1 ('/u02/oradata/mydb/redo01.1ogl) size 10M,
group 2 ( ' /u03/oradata/mydb/redo02 .logl ) size 10M
default temporary tablespace temp
tempfile '/u04/oradata/mydb/temp01.dbf' size 1024M
undo tablespace undotbs
datafile '/u05/oradata/mydb/undo01.dbf' size 1024M
noarchivelog,-
Какой из следующих вариантов соответствует табличному пространству,
которое не создается командой, приведенной в предыдущем блоке кода?
A. SYSTEM
B. UNDOTBS
C. DATA
D. TEMP
Э. Вы оцениваете размещение сегментов в табличных пространствах для базы
данных Oracle. Какой из следующих сегментов имеет самый короткий срок
службы?
A. Временные сегменты
B. Сегменты отмены
С Индексные сегменты
D. Сегменты словаря данных
Ответы
1. В. 2. С. 3. А
Управление использованием экстентов сегментами
Как правило, рост сегмента данных управляется с помощью экстентов. Если
сегмент исчерпает место для обработки новых записей, вносимых в объект, то
объект запросит экстент из остающегося свободным места в табличном про-
Структуры памяти и данные отмены
481
странстве. Вообще, логический объект базы данных типа таблицы или индекса
может иметь много экстентов, но все эти экстенты (плюс первоначальный
сегмент) следует хранить в одном и том же табличном пространство. Есть,
однако, некоторые исключения. Например, таблица, содержащая столбец,
определенный как тип данных LOB (BLOB, CLOB, NCLOB) может хранить свои
данные, не относящиеся к LOB (nonLOB), в одном табличном пространстве, в
то время как данные LOB — в другом. Однако следует помнить, что все
экстенты большинства объектов базы данных хранятся в одном и том же
табличном пространстве.
Совет Тот факт, что все экстенты для объекта базы данных следует
хранить в одном и том же табличном пространстве, не означает, что все
экстенты для объекта базы данных будут храниться в одном и том же
файле данных. Например, разделы или экстенты разделенной таблицы
могут быть распределены по файлам данных на различных дисках в целях
улучшения параллельной обработки. Oracle может также исчерпать место в
одном файле данных табличного пространства и, таким образом, будет
вынуждена назначить экстент в другом файле данных. Важно вспомнить
этот факт на экзамене "Основы АБДI".
Назначение однородных участков
в табличных пространствах
Назначение однородных участков пространства, как метод управления
размером сегментов и экстентов в табличном пространстве, задается в Oracle9i по
умолчанию. Сконфигурировать эту опцию позволяют ключевые слова
uniform size п [к| м], где п — размер назначаемого экстента в Кбайт или Мбайт,
которые задаются вместо autoallocate при вводе команды create tables-
pace. При указании uniform size Oracle все равно управляет назначением
всех экстентов и установлением размеров автоматически. Разница в том, что
при указании uniform size, любое заданное значение п будет использовано
Oracle для более поздних экстентов, назначаемых объекту в табличном
пространстве, независимо от настроек других параметров памяти в команде
create table. Давайте рассмотрим пример создания табличного пространства, в
котором Oracle установить размер всех экстентов равным 10 Кбайт:
ИНЧЯИ SQL> create tablespace lmtab5 datafile
2 'С:\oracle\oradata\orcl\lmtab501.dbf'
3 size 10M reuse
4 extent management local
5 uniform size 10K online;
Tablespace created.
Совет При назначении однородных экстентов Oracle вычисляет число
битов, используемых в битовом массиве распределения памяти как число
экстентов одного размера, которые бы уместились в табличном
пространстве. В противном случае, число битов, используемых для битового массива
равно числу умещающихся в табличном пространстве блоков.
Хранение явно определяемых объектов
и локально управляемые табличные пространства
При установлении размеров экстентов в локально управляемых табличных
пространствах Oracle всегда использует значение, указанное для uniform size.
То есть информацию в представлениях словаря будет противоречивой в
отношении объектов, помещенных в локально управляемые табличные
пространства с управлением однородными экстентами, если вы явно запрашиваете
экстенты иного размера, нежели предоставляемые Oracle с помощью
автоматического управления экстентами. Чтобы продемонстрировать суть
данного замечания, давайте создадим таблицу в табличном пространстве
LMTAB5:
462
Глава 13
*f!Wi^>? SQL> create table mytabOl
2 (coll number)
3 tablespace lmtab5
4 storage (initial 2OK) online;
Table created.
Полужирным шрифтом выделена строка кода, в которой я пытаюсь
перезаписать размер управления однородными экстентами в LMTAB5 для таблицы
MYTAB01, определив начальный размер экстента как 20 Кб с помощью своей
собственной фразы storage. Напомним, что Oracle должна создавать каждый
объект в LMTAB5 с размером экстента 10 Кб. Поэтому Oracle, разумеется,
игнорировала предпринятую нами отмену управления однородной памятью.
Давайте посмотрим представление DBA_TABLES:
НаМВЯИИ SQL> select table_name, initial_extent
2 from dba_tables
3 where table_name = 'MYTAB01';
TABLE NAME INITIAL EXTENT
MYTAB01 20480
Минуточку, я слышу, что вы говорите. Oracle должна была сделать
начальный экстент равным 10 Кбайт. Так почему же DBA_TABLES говорит нам, что
начальный экстент равен 20 Кбайт? Действительно, странное поведение.
Кроме того, кажется, то же самое происходит, когда мы используем команду
alter table allocate extent. Смотрите:
Квмшйуд SQL> alter table mytabOl allocate extent (size 30K) ;
Table altered.
SQL> table_name,- initial_extent, next_extent
2 from dba_tables
3 where table_name = 'MYTAB011;
TABLE NAME INITIAL EXTENT NEXT EXTENT
MYTAB01 20480 30720
Значит ли это, что предлагаемое в Oracle свойство управления
однородными экстентами можно отменить с помощью фразы storage при создании
таблицы или, явно распределяя экстенты большего размера, чем это разрешается
при управлении однородными экстентами. На самом деле, нет. Посмотрим
представление DBA_EXTENTS, чтобы разобраться с происходящим.
1%а£%£йЗ*й SQL> select segment_name, extent_id, bytes
2 from dba_extents
3 where segment_name = 'MYTAB01';
SEGMENT NA EXTENT ID BYTES
MYTAB01 0 10240
MYTAB01 1 10240
MYTAB01 2 10240
MYTAB01 3 10240
MYTAB01 4 10240
5 rows selected.
Итак, в действительности, словарь данных выполняет оба назначения
пространства, указанные во фразе storage и во фразе allocate extent, а также
свои собственные правила об однородных размерах экстентов, просто назначая
большее число экстентов одинакового размера. Как вы думаете, что Oracle
сделала бы, если бы мы в таком случае попросили назначить экстент 15 Кбайт? Oracle
просто назначила бы больше места, чем вы просили, прихватив еще два экстента
по 10 Кбайт каждый.
Назначение экстентов в управляемых
словарем табличных пространствах
При создании объекта базы данных в управляемом словарем табличном
пространстве Oracle назначает ему отдельный начальный сегмент в табличном
пространстве, если только вы не указали иное, на основании и при наличии
параметров фразы storage для объекта базы данных. Если в команде
создания объекта не было фразы storage, Oracle использует параметры по
умолчанию фразы storage для табличного пространства, в котором размещается
Структуры памяти и данные отмены
463
Получение экстентов
объект. Как правило, первоначально объект создается только с одним
назначенным сегментом пространства. По мере добавления новых строк к
таблицам, сегменты пространства используются для хранения этих новых данных.
Когда сегменты, содержащие данные таблицы, заполняются, а к таблице
необходимо добавить новые данные, таблице следует назначить еше один
экстент для хранения этих данных. На рис. 13.1 показан экстент, получаемый в
базе данных Oracle.
Сегмент, содержащий таблицу ЕМР
last
first
salary
I ° Jfl
^7.
Mien
Ide
Smith
Cook
Matt
Nam
Foo
Ned
May
Grey
Mum
103,000 ■
93,000 1
45,000 ■
99,000 I
250,000 1
18,000 1
Последнее дополнение
не умещается
'7 Norwa Lisa 67,950
Таблица ЕМР получает экстент
last
first salary
Norwa Lisa 67,950
Новый экстент будет получен объектом базы данных, только если ни в
одном из текущих сегментов объекта или экстентах для новых данных нет места.
Полученный экстент будет освобожден, только если администратор БД
усечет, удалит или восстановит таблицу.
Получение экстентов в управляемом словарем табличном
пространстве
Размер получаемого экстента зависит от значения, указанного для следующего
параметра фразы storage во фразе создания объекта. Если объект получает
третий или более экстент, размер экстента будет равен следующему,
умноженному на pctincrease. Это довольно сложно, поэтому давайте посмотрим, что
тут имеется в виду. Допустим, с помощью следующей команды вы создаете
таблицу EMPLOYEE:
И№цУ;фйК SQL> create table employee
2 (empid number primary key,
name varchar2(20),
salary number)
storage (initial 100K next 2K pctincrease 25
minextents 1 maxextents 100)
tablespace DATA;
Table created.
Совет
главе.
Подробнее фразы storage таблицы рассматриваются в следующей
Как только вы ввели эту команду, Oracle назначает один сегмент
размером 100 Кбайт в табличном пространстве DATA. Мы не знаем, в какой файл
данных Oracle поместит сегмент, знаем только, что это будет файл данных,
ассоциированный с табличным пространством DATA. Размер начального
сегмента 100 Кбайт известен, потому что это значение указано для начально-
464
Глава 13
го параметра во фразе storage. Допустим, пользователь добавляет к таблице
несколько служащих, заполняя этот начальный сегмент. Теперь начальный
сегмент заполнен, поэтому если следующий пользователь соберется
добавлять к таблице служащих, Oracle придется назначить таблице EMPLOYEE
еще один экстент. Этот экстент размером 2 Кбайт будет назначен в
табличном пространстве DATA. И снова мы знаем, что размер второго экстент
будет 2 Кбайт, потому что об этом сообщает параметр next фразы storage.
Если требуется указать другой размер следующего экстента, введите
команду alter table storage (next nextval), где nextval — размер
следующего экстента (в Кбайт или Мбайт). Oracle применит указанное вами значение
этого параметра к следующему назначенному экстенту. Ниже приводится
пример этой команды:
ГУЩИ SQL> ALTER TABLE employee STORAGE (NEXT 100K) ;
Table altered.
Совет Изменение определений таблицы подробно рассматривается в
следующей главе.
Теперь, вместо назначения следующему экстенту всего лишь 2 Кбайт,
Oracle выделяет 100 Кбайт, чтобы следующий экстент была столь же большим,
как и первый. Теперь допустим, что второй пользователь добавляет несколько
служащих, и второй экстент тоже заполняется. Что произойдет? Oracle должна
произвести кое-какие вычисления и решить, каким будет размер третьего
экстента. Откуда это известно? Из того, что для параметра pctincrease было
задано значение больше нуля. В этом случае Oracle умножает указанное вами
значение для next на заданное в процентах приращение. Поскольку во фразе
storage для pctincrease было задано 25, а для next 100 Кбайт, Oracle
выделит третьему экстенту 100 Кбайт х 1,25, т.е. 125 Кбайт.
Всякий раз, когда Oracle назначает объекту новый экстент, где
pctincrease больше нуля, Oracle повторно вычисляет значение для next, хранящегося в
записи словаря данных, ассоциированного с этим объектом. Это может быть
опасно, т.к. размер последующих назначаемых экстентов будет возрастать по
экспоненте. Чтобы было понятно, что имеется в виду, рассмотрим, что
случится, когда Oracle назначит таблице EMPLOYEE четвертый экстент. Размер
третьего экстента был 125 Кбайт, поэтому Oracle вычисляет размер четвертого
экстента на основе размера третьего экстента, увеличенного на указанное для
pctincrease значение. Другими словами, Oracle выделяет для четвертого
экстента 100 Кбайт х 1,25 х 1,25 или 156,25 Кбайт пространства. Как видим,
задание pctincrease значения больше нуля замедляет процесс назначения
экстентов для растущих объектов базы данных, назначая с каждым новым экстентом
все больше места.
Совет Чтобы не допустить экспоненциального роста объектов базы
данных, при первоначальном создании объекта во фразе storage задайте
pctincrease равным нулю. Таким образом, размер всех назначаемых экстентов
будет равен указанному для next значению.
Экстенты и параллельная обработка
Если в вашей базе данных Oracle не используется параллельная обработка, вы
добьетесь оптимальной производительности объекта базы данных, например,
таблицы или индекса, если все данные для него разместятся в одном сегменте
или наборе непрерывных блоков. Это особенно справедливо при размещении
данных в управляемых словарем табличных пространств, и меньше — при
размещении данных в локально управляемых табличных пространствах.
Однако при использовании параллельной обработки вам потребуется
хранить свои данные во множественных экстентах (предпочтительно
распределенных по нескольким дискам) для исключения конкуренции между
параллельными процессами, обращающимися к одной и той же таблице. При
использовании разделенных таблиц и опцию параллельного запроса,
очевидно, для таблицы потребуется столько разных сегментов, сколько параллель-
Структуры памяти и данные отмены
485
ных подчиненных процессов ввода-вывода используется Oracle для поиска
этой таблицы. Кроме того, есть некий компромисс в решении, сколько места
следует выделить, особенно для быстрорастущих таблиц.
Соблюдение равновесия
при предварительном назначении
Напомним, что во фразе storage для ранее созданной таблицы EMPLOYEE,
мы задали два других параметра этой таблицы. Это были minextents, число
экстентов, которые Oracle назначает таблице при ее первом создании, и та-
xextents, максимальное число экстентов, которое Oracle когда-либо назначит
этому объекту. Как только Oracle назначит максимальное число экстентов,
указанное вами в параметре maxextents, больше таблица уже не сможет
вырасти, (если, конечно, вы не измените значение для maxextents!).
Многие неопытные администраторы БД становится жертвой ловушки,
приготовленной предварительным назначением (preallocation). Они хотят
предварительно назначить как можно больше места, чтобы впоследствии
избежать проблем с попаданием в пределы, задаваемые maxextents. Иногда это
полезно, особенно, если предполагается, что пользователи быстро заполнят
объект данными, или следует сохранить все данные в одной сегменте. Однако
надо помнить и о паре недостатков. Во-первых, пространство на хост-машине
ограничено. Вовторых, и что более важно, ваша база данных могла
столкнуться с низкой производительностью резервного копирования из-за слишком
продолжительного сжатия табличного пространства (содержащего, главным
образом, пустые сегменты) для сохранения на ленте. Иногда проявляется и
третий недостаток. Если табличное пространство имеет много места,
занимаемого пустыми сегментами, таблицы на диске размещаются далеко друг от
друга. Из-за этого производительность базы данных может снизиться, что
отмечается у баз данных с§ очень большими таблицами, даже если таблицы, в
основном, пустые. С другой стороны, не стоит скупиться при назначении
памяти. Каждый дополнительный экстент, назначенный объекту базы данных
для хранения информации, влияет на снижение производительности при
обработке запросов и изменении данных, хотя эта проблема приписывается,
главным образом, использованию управляемого словарем табличного
пространства и, как правило, не решается с помощью локально управляемых
табличных пространств. Фокус заключается в том, чтобы найти равновесие
между следующими соображениями:
■ Использование локально управляемых табличных пространств вместо
управляемого словарем табличного пространства
Ш Предоставление большой части дополнительного пространства и в
табличном пространстве, и в начальном сегменте объекта, чтобы
соответствовать росту.
И Планирование покупки дисков для хост-машины или резервирование
дополнительного пространства для добавления новых табличных
пространств и файлов данных, чтобы сгладить остроту нехватки места.
■ По возможности, составить с пользователями такой график ежемесячного
или ежеквартального обслуживания, чтобы у вас было время работы
вхолостую для реорганизации табличных пространств в целях
предотвращения потенциальных проблем с размерами прежде, чем они станут
головной болью.
Закрепление пройденного материала
1. Экстенты назначаются каждый раз, когда объект базы данных исчерпает
место для поступающих данных.
2. Размер назначенного экстента зависит от параметров памяти,
определяемых при создании объекта. Эта информация берётся или из фразы stora-
466
Глава 13
ge в команде object creation, или из фразы default storage для
табличного пространства, в котором должен храниться объект.
3. Следует знать об использовании однородных экстентов в Огас1е9/.
Помните, что управление однородными экстентами задается по умолчанию для
локального управляемого временных табличных пространств, в то время
как автоматическое назначение задается по умолчанию для локально
управляемых постоянных табличных пространств.
4. Следует знать, что означают параметры initial, next и pctincrease в
контексте сегментов в управляемых словарем табличных пространствах.
Обратите особое внимание на экспоненциальный рост, сопутствующий
значениям pctincrease больше чем нуля.
5. Необходимо соблюдение равновесия при рассмотрении размера сегментов
и экстентов. Слишком большое предварительно назначенное пространство
приводит к напрасной трате места, а слишком малое — к слишком
большому числу экстентов. Это как натянутый канат, по которому, в конечном
счете, ходит каждый администратор БД, а правильный ответ часто зависят
от потребностей конкретной системы. На экзамене "Основы АБД I"
необходимо уметь определить их параметры, а для реальной жизни потребуется
большой опыт работы с конкретной системой (или много встреч с
пользователями, чтобы выяснить, как быстро они добавляют данные) прежде, чем
вы сможет определять эти числа интуитивно.
Упражнения
1. Вы создаете локально управляемое табличное пространство с помощью
следующей команды:
SQL> create tablespace DATA datafile
2 'c:\oracle\oradata\orcl\DATA01.dbf
3 size 150M reuse
4 extent management local
5 uniform size 500K online;
Tablespace created.
После его создания вы создаете с помощью фразы storage таблицу с
параметрами initial равным 100 Кбайт и minextents равным 3. Сколько
места займет созданная таблица в табличном пространстве?
А. 100 Кб В. 300 Кб
C. 500 Кб D. 1500 Кб
8. Вы хотите создать в Oracle локально управляемое табличное пространство
для размещения сегментов сортировки. Какой из следующих вариантов
подходит в отношении назначения сегментов и экстентов?
A. create temporary tablespace tempOl datafile
'/u01/oradata/orcl/temp01.dbf' size 100M extent
management local;
B. create temporary tablespace tempOl tempfile
'/u01/oradata/orcl/temp01.dbf' size 100M extent
management local;
С create tablespace tempOl datafile
'/uOl/oradata/orcl/tempOl.dbf' size 100M extent
management local temporary;
D. create tablespace tempOl tempfile
'/uOl/oradata/orcl/tempOl.dbf' size 100M extent
management local temporary;
3. Вы определяете локально управляемое табличное пространство, используя
следующий синтаксис:
Структуры памяти и данные отмены
487
SQL> create tablespace DATA datafile
2 ' c:\oracle\oradata\orcl\DATA01.dbf
3 size 150M reuse
4 extent management local online;
Tablespace created.
Какой из следующих вариантов соответствует фразе storage allocation,
опущенной, но подразумеваемый Oracle при создании этого табличного
пространства?
A. autoallocate
B. autoallocate size 1M
C. uniform
D. uniform size 1M
4. Вы создаете таблицу с помощью следующей команды:
SQL> create table tester
2 (coll varchar2 primary key)
3 tablespace testdata
4 storage (initial BOM next 100M pctincrease 20
5 minextents I maxextents 200);
Какой из следующих вариантов указывает, каким будет размер
назначенного Oracle пятого экстента?
А. 120 Мб В. 144 Мб
С 173 Мб D. 207 Мб
5. В базе данных Oracle была только что создана таблица с шестью
назначенными ей экстентами. Какой из следующих факторов явился наиболее
вероятной причиной наличия у таблицы такого большого числа назначенных
экстентов?
A. Значение параметра minextents.
B. Значение параметра pctincrease.
C. Значение параметра maxextents.
D. По умолчанию Oracle распределяет шесть экстентов всем объектам
базы данных.
Ответы
1. D. Потому что minextents дает Oracle указание назначить три экстента, a Oracle
использует назначение однородных участков памяти для определения, насколько
большим должны быть экстенты. 2. В. 3. А. 4. С. 5. А.
Параметры использования пространства
в блоках
В дополнение к суммарному назначению памяти экстентам для объектов базы
данных, Oracle позволяет управлять тем, как объекты используют место
внутри каждого полученного ими блока данных. Использование пространства
определяется на уровне блока с помощью опций pctf гее и pctused.
Контролируя назначение места на уровне блока, можно управлять тем, как объект
базы данных использует назначенное ему место более эффективно в
соответствии с типом изменения данных, который вероятен для этого объекта.
Различные приложения вносят изменения в объекты базы разными способами*,
например, базе данных, поддерживающей систему оперативной обработки
транзакций (online transaction-processing, OLTP), при которой последующие
изменения данных увеличивают размер существующих строк, заполняя
столбцы, первоначально заданные как NULL при добавлении строки к таблице,
требуется предварительно назначаемое на уровне блока пространство, чтобы
486
Глава 13
строка могла расти. Напротив, в системе поддержки решений (decision support
system, DSS), например, информационном хранилище, данные загруженных
строк, вероятно, не подвергнутся изменениям. В этом случае, лучше упаковать
в каждый назначенный строе блок как можно больше данных.
Почему администраторы БД управляет назначением места на уровне
блока? Потому что объекты используется поразному в различных операциях
языка манипулирования данных приложения (data manipulation language, DML).
Например, если таблица часто подвергается изменениям, приводящим к
увеличению размера строк в таблице, при назначении этому объекту места на
уровне блока следует учитывать дополнительный рост в расчете на строку.
Если изменение данных объекта состоит из большого числа команд insert,
вводящих строки, в основном, одного и того же размера, тогда цель
использования пространства в пределах каждого блока сводится к размещению как
можно большего числа строк в каждом блоке до назначения еще одного. Этот
же подход может сработать, если размер таблицы не меняется, а строки
добавляются к таблице редко.
Оставление дополнительного пространства
для роста строки: pctfree
Фраза pctfree определяется на уровне объекта базы данных. Она сообщает
Oracle, сколько свободного пространства следует оставить в блоке, когда он
первоначально заполняется данными из строки. В каждом блоке остается
такое свободное, неизрасходованное пространство, используемое в случае роста
существующих строк в блоке. Например, если для таблицы задан pctfree
равный 10%, Oracle прекратит добавлять к блоку новые строки, когда в блоке
останется свободным только 10% пространства. Это оставшееся пространство
используется существующими строками, когда пользователи присваивают
столбцам NULL ненулевые значения.
Решая, какое значение задать для pctfree, руководствуйтесь следующим
общим подходом. Если добавленные к таблице строки будут часто
обновляться, и каждое обновление будет приводить к увеличению размера строки в
байтах, установите для pctfree большое значение. Скоро мы рассмотрим
несколько примеров значений, считающихся большими для pctfree. А пока следует
понять, что, задав для pctfree большое значение, вы предотвратите
процессы, резко снижающие производительность, например, миграцию строк (при
которой Oracle перемещает всю строку в другой блок, потому что в
первоначальном блоке больше нет места для ее хранения). И, наоборот, если строки в
блоке будут обновляться нечасто, или если вносимые изменения затронут
размеры не всех строк, pctfree для такого объекта базы данных должен быть
небольшим.
Совет Большим для pctfree считается значение приблизительно от 20до
25, т.е. 20—25 % пространства в блоке оставляется свободным для более
поздних обновлений, которые могут увеличить размер существующей
строки в блоке. Наоборот, Низким значением для pctfree является 4 или 5,
которое подходит для статических таблиц или таблиц "только для чтения ".
Оперативное управление свободным пространством
в блоках: pctused
Еще одна опция управления свободным пространством в блоках — pctused.
Она также определяется на уровне объекта базы данных. Опция pctused
определяет пороговое значение использования в процентах, по которому
Oracle определит, допустимо ли добавление к блоку новых строк. Для
прояснения смысла сказанного давайте рассмотрим ситуацию с добавлением
данных к таблице. По мере добавления новых строк, Oracle заполняет блок
вставленными строками, пока не достигнет порогового значения, установленного
для pctfree. Позже, по мере удаления данных из таблицы, ее показатель
использования пространства на уровне блока снижается. И когда он падает ниже
Структуры памяти и данные отмены
469
порогового значения, установленного для pctused, Oracle добавляет блок
к поддерживаемому для этой таблицы списку свободных блоков (freelisf). Этот
список представляет собой список блоков данных, которые в настоящее время
принимают новые строки данных.
При установке pctused помните, что необходимость помечать блок как
свободный и добавлять его к списку свободных блоков для данного объекта
базы данных, приводит к непроизводительным издержкам Oracle. Таким
образом, задание pctused носит компромиссный характер, и это надо понимать
при подготовке к экзамену "Основы АБД I" и для работы. Следует, по мере
возможности, умерить свой интерес к управлению освобождаемым при
удалении строки пространством, т.к. каждый блок приводит к непроизводительным
издержкам. Чтобы предотвратить внесение блока в список свободных блоков,
когда к блоку можно добавить только одну-две строки, следует установить
довольно низкое значение опции pctused.
Совет Если, в действительности, вас не так уж сильно волнует
управление свободным пространством, не задавайте pctused выше 40—50.
Ситуация, требующая активного управления свободным пространством, может
возникнуть, если на дисках хост-системы останется очень мало свободного
пространства.
Установка фактических значений
для pctf гее и pctused
Эти две опции определяются на уровне объекта базы данных, и присваемые
им значения всегда должны рассматриваться в тандеме. Диапазон задаваемых
значений для каждой опции составляет 0—100. Однако, при определении
значений для pctf гее и pctused, не назначайте им значений, превышающих в
сумме 100. На самом деле, лучше даже не задавать им значения,
приближающиеся к 90, т.к. при этом Oracle тратит на управление использованием
пространства большее времени, чем необходимо. В следующих абзацах с
маркерами указываются некоторые вполне подходящие для pctfree и pctused
значения. Каждое значение сопровождается описанием сценария в Oracle, где
оно могло бы подойти, а также указанием, высокое оно или низкое:
■ pctfree 5, pctused 40 Подходит для статических таблиц или таблиц
"только для чтения", например, периодически загружаемых для
информационного хранилища или приложений, выполняющих только запросы.
■ pctfree 10, pctused 40 Подходит для всех связанных с OLTP случаев,
особенно, если существующие строки не будут расти в связи с
обновлениями уже после вставки строки.
■ pctfree 20, pctused 40 Подходит для OLTP, если существующие
строки будут расти в связи с обновлениями уже после вставки строки (20 —
высокое значение для pctfree).
Установка pctfree и pctused: пример
Подробнее об опциях памяти для создания объектов базы данных будут
рассмотрены в последующих главах. А сейчас вы увидите pctfree и pctused в
действии: следующий блок кода содержит команду create table с
заданными pctfree и pctused. Обратите внимание, эти фразы не входят во фразу
storage, они являются самостоятельными фразами команды create table.
SQL> CREATE TABLE FAMILY
2 ( NAME VARCHAR2(10| primary key,
3 RELATIONSHIP VARCHAR2 (10) )
4 storage (initial 100K next 100K
5 pctincrease 0 minextents 1 maxextents 200)
6 PCTFREE 20 PCTUSED 40;
Table created.
490
Глава 13
Закрепление пройденного материала
1. Следует понимать, как используются pctfree и pctused в отношении
управления пространством в таблице.
8. Опция pctfree сообщает Oracle, сколько места следует оставить
неиспользованным, когда к блоку будут добавляться новые строки, чтобы
оставить место для роста существующих строк.
3. Опция pctused сообщает Oracle пороговое значение использования
пространства, ниже которого блок считается свободным и заносится Oracle в
список свободных блоков таблицы, и к нему можно добавлять новые
строки.
4. Значения устанавливаются сразу для обеих опций при создании объекта
базы данных, чтобы в сумме они никогда не достигали 100.
Упражнения
1. Пользователь CAROLYN вводит команды в сеансе SQL*Plus с базой
данных Oracle с размером блока 4 Кб. В следующем блоке приводится
расшифровка ее сеанса:
SQL> describe records
Name Null? Type
RECORDNO NOT NULL NUMBER (4)
RECNAME VARCHAR2(10|
RECDESC VARCHAR2(4000)
RECDATE DATE
SQL> insert into records (recordno) values (1000);
1 row inserted.
SQL> select vsize(*) from records where recordno =■ 100;
VSIZE(*)
12
Позже, другой пользователь заполняет описание для этой записи,
представляющее собой блок текста из 100 слов. Когда CAROLYN вводит
приведенную выше команду select vsize (*), Oracle возвращает значение
3215. В каком из следующих вариантов указываются соответствующие
настройки для pctfree и pctused?
A. pctfree 5, pctused 80
B. pctf ree 10, pctused 50
C. pctf ree 15, pctused 20
D. pctf ree 80, pctused 5
2. Вы конфигурируете использование места в блоке для таблицы Oracle. В
каком из следующих вариантов указываются настройки использования места
в блоках, которые не подойдут ни при каких обстоятельствах?
A. pctfree 5, pctused 90
B. pctfree 15, pctused 80
С pctfree 20, pctused 70
D. pctfree 10, pctused 40
Ответы
1. D. 2. B.
Структуры памяти и данные отмены
491
Получение информации о структурах памяти
Информацию о памяти для объектов базы данных можно определять из
многих источников в словаре данных. Существует несколько представлений
словаря данных, связанных с отслеживанием информации о структурах памяти в
базе данных, например, табличные пространства, экстенты и сегменты. Кроме
того, существуют представления словаря для объектов базы данных,
предлагающие информацию о настройках использования пространством. Имена
представлений словаря обычно берутся из объектов, представленных данными
в представлении словаря, которым предшествует классификация соответствии
с контекстом данных. Каждый сегмент имеет свое собственное представление
словаря данных, в котором отображается информация о памяти. Допустим, вы
хотите узнать набор параметров памяти для всех объектов базы данных, Дтя
получения информации о памяти для уже рассмотренных типов сегментов
можно использовать следующие представления:
■ PBA_SEGMENTS Это сводное представление содержит все типы
сегментов, перечисленных представлениями словаря данных и их параметры
памяти.
■ DBAJTABLESPACES Это представление можно использовать для
просмотра параметров памяти по умолчанию для табличных пространств в
базе данных.
■ DBA_TS_QUOTAS Это представление можно использовать для указания
квоты на табличные пространства, назначаемых пользователям для
создания объектов, их значения по умолчанию и временные табличные
пространства.
■ VSTABLESPACE Дает простой листинг номеров и имен табличных
пространств.
■ DBA_EXTENTS Это представление можно использовать для просмотра
имен сегментов, типа, владельца, имени табличного пространства, в
котором хранится этот экстент, ID для экстента, ID файла, в котором хранится
экстент, ID начального блока экстента, общее число байтов и блоков
экстента.
■ DBA_FREE_SPACE Это представление указывает местоположение и
объем свободного места по имени табличного пространства, ID файла,
ID начального блока, байтам и блокам.
■ DBA_FREE_SPACE_COALESCED Это представление указывает
местоположение свободного объединенного места в табличном пространстве по
его имени, общему числу экстентов, объединенным экстентам и проценту
объединенных экстентов, а также другую информацию о месте в
табличном пространстве, объединенном с помощью SMON.
■ DBA_DATA_FILES Это представление дает информацию о файлах
данных для каждого табличного пространства.
■ VSDATAFILE Это представление дает информацию о файлах данных для
каждого табличного пространства.
Совет Объединение — это процесс слияния маленьких смежных участков
свободного пространства в табличном пространстве в большие участки
свободного пространства. Объединением табличного пространства
регулярно занимается процесс SMON о. Если вы хотите самостоятельно
объединять табличное пространство, введите команду alter tablespace
tblspc coalesce. Кроме того, при использовании локально управляемых
табличных пространств свободное пространство контролируется в
битовых массивах заголовков файла данных, поэтому объединение происходит
без SMON.
492
Глава 13
Закрепление пройденного материала
Необходимо знать о различных представлениях в словаре данных, которые
содержат информацию о памяти.
Упражнения
1. Вам нужно найти информацию о суммарном пространстве, назначенном
таблице в Oracle. Какой из следующих вариантов указывает на
представление, в котором следует посмотреть?
A. DBA_OBJECTS
B. DBA_SEGMENTS
С DBA_EXTENTS
D. DBA_FREE_SPACE_COALESCED
2. Вы хотите определить размер пространства, назначенного таблице ЕМР в
Oracle, принадлежащей SCOTT и хранящейся в табличном пространстве
DATA. Какой из следующих вариантов соответствует команде SQL,
которую можно было бы использовать в этих целях?
A. select blocks from dba_tables where table_name
'EMP' and owner 'SC0TT1;
B. select sum(bytes) from dba_free_space where
tablespace_name 'DATA';
C. select sum(bytes) from dba_extents where
segment_name = 'EMP' and owner = 'SCOTT';
D. select * from dba_objects where object_name 'BMP'
and owner = 'SCOTT';
3. Вы хотите идентифицировать параметры использования пространства для
таблиц в Oracle, принадлежащих SMITHERS. Какая из следующих команд
SQL пригодилась бы для этой цели?
A. select * from dba_objects where owner
B. select * from dba_segments where owner
'SMITHERS';
C.select * from dba_extents where owner
D. select * from dba indexes where owner
'SMITHERS';
'SMITHERS';
SMITHERS''
Ответы
1. С. 2. С. 3. В.
Управление данными отмены
Огас1е9/
■ более поздних
версий
В этом разделе будут рассмотрены следующие темы, связанные с управлением
сегментами отмены в Огас1е9/:
■ Назначение сегментов отмены
Ш Осуществление автоматического управления отменой
И Создание и конфигурирование сегментов отмены
Ш Представления словаря для данных отмены
Возможно, опытным администраторам БД Oracle знаком термин отмена
(undo) в своем предыдущем виде — откат (rollback). Сегменты отката долго
существовали в Oracle как ресурс, которым администраторам БД приходилось
управлять активно и вручную. В Огас1е9/ база данных делает управление сег-
Структуры памяти и данные отмены
493
ментами отката гораздо проще, чем можно ожидать от простого изменения
имени. В дополнение к переименованию сегментов отката в сегменты отмены,
Огас1е9/ предлагает несколько опций для упрощенного управления этими,
иногда проблематичными, ресурсами. В этом разделе мы рассмотрим
назначение сегментов отмены и содержащиеся в них данные. Вы также
познакомитесь с реализацией автоматического управления сегментами отмены в
Oracle!)/. Кроме того, вы узнаете, как создавать и конфигурировать сегменты
отмены. И, наконец, вы узнаете, где в словаре данных Oracle можно найти
информацию о сегментах отмены.
Совет Если Вы — опытный администратор БД Oracle, и у вас проблемы с
концепцией сегментов отмены, просто замените слово "отмена " на
"откат ", и вам сразу станет понятна роль этих объектов!
Назначение сегментов отмены
Часто администраторы БД тратят часть рабочего на "тушение пожаров" И не
раз эти пожары связаны с группой объектов базы данных, которая в
предыдущих версиях базы данных Oracle назывались сегментами отката. В Огас1е9/ эти
объекты называются сегментами отмены. В сегментах отмены хранятся старые
значения данных, когда процесс вносит изменения в данные из базы данных.
Сегмент отмены хранит информацию о данных и блоках, например, ID
файлов и блоков, для данных из таблицы или индекса, в том виде, в каком этот
блок существовал до изменения. Эта копия произведенных в базе данных
изменений данных доступна другим выполняющим запросы пользователям,
пока вносящий изменения пользователь не зафиксирует свои транзакция.
Сегмент отмены хранит изменения и после фиксации, но Oracle
систематически перезаписывает данные из зафиксированных транзакций в сегменте
отмены всякий раз, когда пользовательский процесс инициирует новую
транзакцию, и ему требуется месте в сегменте отмены для хранения данных еще
незафиксированных изменений. Сегменты отмены используются в трех целях:
И Они обеспечивают согласованность чтения на уровне транзакций для всех
пользователей базы данных.
■ Они позволяют пользователям выполнять откат, или сбрасывать
изменения, совершенные во время транзакции в пользу первоначальной версии
этих данных.
■ Они обеспечивают восстановление транзакции в случае сбоя экземпляра,
в то время как пользователь вносит изменения в данные.
Вероятно, сегменты отмены — наиболее полезные объекты базы данных при
обработке данных, но их обслуживание может доставить неприятности
администраторам БД. В предыдущих версиях Oracle, чтобы надолго удержаться в
должности администратора БД, приходилось очень быстро овладевать управлением
этих шустрых объектов. Автоматизировав многие аспекты их управления,
Oracle!)/ существенно упростила административные задачи, связанные сегментами
отмены.
Содержание сегментов отмены довольно разнообразно. Каждый сегмент
отмены содержит таблицу в заголовке сегмента. В этой таблице
перечисляются транзакции и пользователи, в настоящее время использующие этот сегмент
отмены для хранения изменений данных с целью обеспечения
согласованности чтения. Каждый сегмент отмены также имеет несколько назначенных ему
экстентов. В экстентах хранятся первоначальные версии данных из таблиц и
индексов. Всякий раз, когда пользователь Oracle вводит, команду update или
delete, серверный процесс записывает первоначальную версию измененных
или удаленных данных в сегмент отмены. Позже, если пользователь хочет
сделать откат своей транзакции, Oracle может легко скопировать старую версию
данных из сегмента отмены назад в надлежащее место. Или, если пользователь
хочет зафиксировать свою транзакцию, Oracle просто оставляет
первоначальные данные в сегменте отмены. Позже, место в сегменте отмены может много-
494
Глава 13
кратно использоваться для сохранения необходимых другим пользователям
первоначальных данных для другой транзакции.
Совет Новое свойство Oracle9i, Flashback Query (запрос обратного кадра)
использует данные отмены, сохраненные в сегменте отмены для того,
чтобы пользователи могли просмотреть данные, какими они были в базе данных
в определенный момент в прошлом.
Проектирование и управление сегментами отмены вручную — одна из
наиболее трудных задач для администраторов БД. Если бы сегменты отмены не
были так хорошо разработаны, пользователи столкнулись бы с ужасной
ошибкой ORA1555: Snapshot too old (rollback segment too small) error (Слишком
старый моментальный снимок (слишком маленький сегмент отката)). Но эта
ошибка вводит в заблуждение. Ее мог вызвать не только маленький размер
сегмента отката, но и многие другие причины. Если не уделить должного
внимания этой проблеме, вы можете столкнуться с ситуацией, когда придется
повторно выполнять работающие по несколько часов процессы пакетной
обработки, и только потому, что в разгар работы произошел сбой из-за этой
ошибки.
Для понимания и решения этой проблемы необходимо понимать, как
Oracle обеспечивать согласованность чтения. В многопользовательской среде
многие транзакции записывают или изменяют строки. Прежде, чем
транзакция зафиксирует произведенные изменения, измененные данные можно
увидеть с помощью всех команд в пределах транзакции, в которой делались
изменения, но не с помощью других команд или в других транзакциях. После
фиксации изменения становятся видимы для всех последующих транзакций.
Команды, выполнение которых началось до фиксации, будут продолжать
показывать старые данные, потому что эти изменения не существовали в
начале транзакции. Это называется согласованностью чтения (read consistency).
Как Oracle делает это возможным? Мы рассмотрим две транзакции —
транзакцию с изменением, которая вносит изменения в таблицу, и транзакцию с
чтением, которая считывает данные, изменяемые транзакцией с изменением.
Как уже говорилось, транзакция с изменением сохраняет исходный вид
изменяемых данных в сегменте отмены. Транзакция с чтением, которая началась
до того, как транзакции с изменением зафиксировала эти изменения, считает
исходный вид изменяемых данных из сегмента отмены. Как только
транзакция с изменением зафиксируется, сегменты отмены, в которых содержится
исходный вид изменяемых данных, помечаются как свободные и могут
использоваться любой транзакцией, или их можно очистить из-за сжатия сегмента
отмены. Если транзакция с чтением еще существует и возвращается к чтению
исходного вида данных из сегмента отмены, она обнаруживает, что данные
отсутствуют, и выдает сообщение об ошибке, после чего выполняет откат всех
произведенных с момента ее начала изменений. Это привело бы к настоящей
катастрофе, если бы эта транзакция была долговременной.
Итак, в чем же причина? Их может быть много. Это может быть вызвано
неадекватным числом сегментов отмены или неадекватно установленным
размером сегмента отмены или слишком маленьким или большим буферным
кэшем данных, и маленькими транзакциями, использующими те же самые
сегменты отмены или неправильно заданным размером параметра optimal
(который может слишком часто сжиматься), а иногда и слишком частыми
фиксациями в транзакциях. Есть один надежный способ предотвратить это —
убедиться, что табличное пространство отмены достаточно большое, что
позволит избежать слишком частых сжатий (задайте значение Optimal
побольше), и убедиться буферный кэш имеет высокий коэффициент попадания.
Огас1е9/ помогает предотвратить эту ситуацию, позволяя указать, сколько надо
хранить данные отмены после фиксации. Этот параметр — UNDO_
RETENTION.
Огас1е9/ управляет данными отмены двумя способами — автоматическим
управлением отменой и ручным управлением отменой. В целях подготовки к
экзамену "Основы АБД I", мы рассмотрим реализацию обоих способов. Если
Структуры памяти и данные отмены 495
вы опытный администратор БД, будьте уверены — Oracle не лишит вас
способности конфигурировать сегменты отмены вручную.
Ручная конфигурация сегментов отмены все еще доступна в Oracle9i в целях
обратной совместимости. На экзамене умение вручную управлять сегментами
отмены может проверяться, а может и нет, поэтому эта книга охватывает
управление сегментами отмены автоматически, а также вручную.
Закрепление пройденного материала
1. Убедитесь, что можете дать определение трех назначений сегментов
отмены в Oracle, включая использование отмены для согласованности чтения,
восстановления транзакции и восстановления экземпляра.
2. Следует знать причины появления ошибки Snapshot too old
в Oracle.
Упражнения
1. Вы управляете базой данных Oracle. К вам подходит пользователь и
сообщает, что он только что получил сообщение об ошибке ORA-1555. Какой
из следующих вариантов описывают причину, из-за которой этот
пользователь получил сообщение об ошибке?
A. Пользователь остался подключенным в течение ночи, и время его
соединения истекло.
B. Пользователь обратился к представлению данных, не
поддерживающему согласованность чтения, в процессе его изменения
долговременной транзакцией.
C. Очень маленькое значение OPTIMAL для сегментов отмены.
D. Пользовательская команда drop table длилась слишком долго, и
базе данных необходимо время на согласование.
2. Пользователь выполняет транзакцию в базе данных Oracle. Какой из
следующих вариантов правильно идентифицируют все команды, которые
сгенерируют информацию об отмене в пределах транзакции?
A. Только команды delete
B. Только команды insert
С Только команды update и insert
D. Только команды delete и update
E. Только команды delete, insert и update
Ответы
1. С. 2. Е.
Реализация автоматического управления отмены
Реализация автоматического управления отмены — самый легкий способ
сконфигурировать управление сегментов отмены в базе данных Oracle, особенно для
не очень опытных администраторов БД. Это быстро и просто, и позволяет
предоставить всю грязную работу Oracle. Даже если вы опытный администратор
БД, автоматическое управление отменой станет хорошим способом сэкономить
время, которое тратится на повседневные административные задачи. Так
происходит потому, что автоматическое управление отменой позволяет
сосредоточиться на более интересных аспектах работы, например, стратегическом
планировании роста данных или архитектуре новых систем базы данных,
становящихся оперативными. Кроме того, автоматическое управление отменой
хорошо работает в системах Oracle с не очень большим числом транзакций, на-
Oracle9/
■ более поздних
версий
496
Глава 13
пример, в среде испытаний или разработки. Конфигурация и реализация
автоматического управления отмены состоят из трех важных шагов:
1. Определить табличное пространство отмены, которое Oracle может
использовать для назначения и освобождения сегментов отмены.
2. Дать Oracle указание работать в режиме автоматического управления
отменой.
3. Указать Oracle, сколько следует хранить информацию отмены в сегменте
отмене.
Шаг 1: Создать и сконфигурировать сегменты отмены
Для автоматического управления отменой в Огас1е9/ базе данных требуется
сначала создать табличное пространство отмены. Табличное пространство
отмены содержит сегменты отмены, и может быть создано двумя различными
способами. Его можно создавать при создании базы данных. Следующий блок
кода является примером автоматического создания табличного пространства
отмены при создании базы данных в окружении Windows:
ШЯ&ШЯй CREATE DATABASE DB1
CONTROLFILE REUSE
LOGFILE GROUP 1 ('C:\Oracle\oradata\DBl\redo01.log') SIZE 100K,
GROUP 2 ('C:\Oracle\oradata\DBl\redo02.log') SIZE 100K,
GROUP 3 ('C:\Oracle\oradata\b81\redo03.log') SIZE 100K;
DATAFILE 'C:\Oracle\oradata\DBl\3ystem01.dbf
SIZE 100M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
UNDO TABLESPACE UNDOTBS
DATAFILE 'С:\Oracle\oradata\DBl\undotbs01.dbf'
SIZE 50M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
NOARCHIVELOG
CHARACTER SET US7ASCN
В качестве альтернативы можно создать табличное пространство отмены
вручную с помощью команды create tablespace, как показано в
следующем блоке кода:
тшятя&я sql> create undo tablespace undotbs_2
2 DATAFILE 'c:\oracle\oradata\DBl\undotbs2.dbf' SIZE 1M;
Tablespace created.
Шаг 2: Указать Oracle работать в режиме автоматического
управления отменой
Этот шаг завершается установкой параметра инициализации UNDO_
MANAGEMENT в файл init.ora. Этот параметр имеет две настройки:
MANUAL и AUTO. Если задано MANUAL (это параметр по умолчанию, если
в файле init.ora не существует параметр UNDO_MANAGEMENT), Oracle
позволяет управлять сегментами отмены вручную, как если бы вы управляли
сегментами отката в версиях Oracle до Огас1е9/. Для перевода базы данных
Oracle в режим автоматического управления сегментами отмены установите
UNDO_MANAGEMENT как AUTO в файле init. о га, как показано в
следующем блоке:
ЯШШШ UNDO_MANAGEMENT - AUTO
Если база данных определена, как работающая в режиме автоматического
управления отмены, следует иметь, по крайней мере, одно табличное
пространство отмены в оперативном режиме. Если у вас в табличном
пространстве более одного табличного пространства отмены, Oracle будет использовать
только одно из них. Можно явно определить, какой именно будет
использоваться, указав это в параметр UNDOJTABLESPACE файла init. ora.
ЙМЯИН UNDO TABLESPACE - undotbs
Структуры памяти и данные отмены
497
Следующая команда позволит динамически изменять этот параметр:
fflWaSW ALTER SYSTEM SET undo_tablespace - UNDOTBS;
И наконец, предупреждение: Если задать автоматическое управление
отменой, но не предусмотреть для Oracle никакого табличного пространства
отмены, Oracle не разрешит запуск базы данных. Так, например, если
установить UNDO_MANAGEMENT как AUTO, но задать UNDOJTABLESPACE
для несуществующего табличного пространства, Oracle выдаст сообщение об
ошибке ORA-01092 при попытке запустить и открыть базу данных. Решение
этой проблемы состоит в том, чтобы установить параметр
UNDO_TABLESPACE для допустимого табличного пространства отмены в
базе данных. Однако учтите, что, если, в действительности, у вас есть
доступное табличное пространство отмены и вы установили для него
UNDOJTABLESPACE в какой-либо момент, когда база данных работала до
этого, Oracle сохранит след установки для этого параметра с помощью
свойства SPFILE. Таким образом, если вы просто пропустили установку
параметра UNDO_TABLESPACE в файле init. ora, Oracle будет работать как
обычно. Эта проблема возникнет только, когда вы дадите Oracle неправильное
указание использовать недопустимое табличное пространство.
Совет Если вы предпочитаете не использовать автоматическое
управление отменой, убедитесь, что параметр ROLLBACKSEGMENTS
предоставит имена сегментов отмены при запуске базы данных. Иначе, Oracle
получит только сегмент отмены SYSTEM в табличном пространстве
SYSTEM, которое при запуске базы данных находится в оперативном
режиме.
Шаг 3: Указать Oracle, сколько хранить данные
в сегменте отмены
В Огас1е9/ сегменты отмены приобрели одно важное свойство — способность
хранить предварительно измененные (preechange) данные в течение
определенного времени. Эта функциональная возможность работает в сочетании с
Flashback Query, новым свойством Огас1е9/, позволяющим увидеть старые
версии данных после фиксации изменений в течение определенного времени.
Автоматическое управление отменой позволяет указать, сколько следует хранить
зафиксированную информацию отмены. Параметр UNDO_RETENTION из
файла init. ora равен числу секунд, в течение которых хранится эти данные.
Его можно динамически изменять с помощью команды alter system set
undo_retention = л, где п — число секунд, в течение которых Огас1е9/ будет
хранить в сегменте отмены первоначальную копию предварительно
измененных данных для Flashback Query. По умолчанию этот параметр равен 900.
Управление табличными пространствами отмены
Несмотря на то, что данные отмены — новая концепция Огас1е9/, табличные
пространства отмены управляются так же, как любое другое табличное
пространство. Табличное пространство отмены можно изменять с помощью
команды alter tablespace, которая позволяет добавлять и
переименовывать файлы данных, переводить их в оперативный, автономный или режим
или режим резервного копирования. Полный синтаксис этих операций
приводился в предыдущей главе в отношении табличных пространств и файлов
данных. Аналогично, команда alter database позволяет изменять размер
файлов данных отмены. Табличное пространство отмены можно также удалить с
помощью команды drop tablespace, но с существенным ограничением.
Табличное пространство нельзя удалить в то время, когда активные
транзакции используют сегменты отмены в нем. Это ограничение аналогично
ограничению на табличное пространство, содержащие активные сегменты отмены,
созданные вручную. В качестве примера приводится следующий блок кода:
fWfftB'ii? SQL> drop tablespace undotbs_2 ,
drop tablespace undotbs_2
498
Глава 13
ERROR at line 1:ORA-30013: undo tablespace 'UNDOTBS_2' is currently in use
Oracle поддерживает множественные табличные пространства отмены, но
использует только по одному на экземпляр. Однако Oracle все же позволяет
динамически переключаться с одного табличного пространства отмены на
другой, когда база данных в оперативном режиме и доступна пользователям.
Следующий блок демонстрирует, как это можно сделать. В этом случае мы
переходик от использования одного табличного пространства к другому, чтобы
удалить другое табличное пространство отмены:
т&ВЯКЯЯ! SQL> ALTER SYSTEM SET UNDO_TABLESPACE=undotbs;
System altered.
SQL> DROP TABLESPACE undotbs_2;
Tablespace dropped.
Создание непосредственно сегментов отмены
Опытные администраторы БД могли бы задать такой вопрос: "Хорошо,
теперь я знаю, как создать табличное пространство отмены, но как мне в
Огас1е9/ создать сегменты отмены?" Ответ: А вам и не надо. Сразу после
создания табличного пространства отмены Oracle автоматически создает все
сегменты отмены и управляет ими. Следовательно, если разрешено
автоматическое управление отмены, вам не приходится беспокоиться о создании
сегментов отмены и переводе их в оперативный режим, как это
происходило в более ранних версиях Oracle. Однако если вам это нравится,
сегментами отмены все еще можно управлять вручную. Следующее обсуждение
посвящено этому вопросу. Ручное управление сегментами отмены на
экзамене "Основы АБД I" может проверяться, а может и нет, а
автоматическое управление сегментами отмены проверяется обязательно. Необходимо
понимать, в чем фундаментальное отличие управления сегментами отмены
для. Огас1е9/, особенно если имеете практический опыт с базой данных
Oracle предыдущих версий.
Закрепление пройденного материала
1. Для автоматического управления отменой сначала в Oracle необходимо
создать табличное пространство отмены. Табличное пространство отмены
создается с помощью команды create undo tablespace или включения
фразы undo tablespace в команду create database command.
2. Табличное пространство отмены можно изменять с помощью команд
alter tablespace или alter database, которые позволяют добавлять
файлы данных и переименовывать файлы данных, переводить файл
данных в оперативный или автономный режим, или в режим резервного
копирования. Табличное пространство отмены можно также удалять, при
условии, что в них нет активных транзакций, это делает команда drop
tablespace.
3. Сконфигурировать Oracle9r для работы в автоматическом режиме
управления отменой позволяет параметр UNDO_MANAGEMENT в файле
init. ога, заданный как AUTO.
4. Можно иметь более одного табличного пространства отмены в базе
данных, но одновременно для одного экземпляра уде использоваться только
одно пространство. В случае нескольких табличных пространств отмены
тот, который должен использоваться экземпляром, задается в параметре
UNDOTABLESPACE. Если в файле init. ога этот параметр отсутствует,
Oracle все же может перевести в оперативный режим нужное вам
табличное пространство отмены с помощью свойства SPFILE в Огас1е9/.
5. Параметр инициализации UNDO_RETENTION позволяет указать, сколько
времени следует хранить данные отмены доступными для Flashback Query.
Структуры памяти и данные отмены
499
6. Сразу после создания табличного пространства и включения
автоматического управления, 0гас1е9/ непосредственно сегменты отмены, и вам
уже не приходится этим заниматься. Кроме того, Oracle автоматически
переводит сегменты отмены в оперативный режим при запуске базы
данных.
Упражнения
1. Вы конфигурируете автоматическое управление отмены в базе данных
Oracle. Какой из следующих вариантов указывает, что надо делать в ситуации,
где для хранения сегментов отмены доступно более одного табличного
пространства отмены?
А.3адать UNDO_MANAGEMENT в файле init.ora как MANUAL.
В. Задать UNDO_MANAGEMENT в файле init. ога как AUTO.
С Задать UNDO_TABLESPACE в файле init.ora как одно из
табличных пространств.
D.Задать UNDOJTABLESPACE в файле init.ora как оба табличных
пространства.
2. База данных Oracle с табличными пространствами отмены UND0_TBS1 и
UND0_TBS2 открылась с включенным автоматическим управлением
отменой. В предыдущем сеансе была введена команда alter system set
undo_tablespace = UNDOTBS1. Однако соответствующий параметр с
указанием, какое табличное пространство отмены использовать, в файле
init.ora было опущено. Какой из следующих вариантов правильно
описывает, что случится, когда первый подключившийся к Oracle
пользователь инициирует первую транзакцию?
A. База данных откроется, но только один системный сегмент отмены
будет в оперативном режиме.
B. База данных откроется, но ни один из сегментов отмены не будут в
оперативном режиме.
С База данных откроется, и все сегменты отмены в UNDO_TBSl будут
в оперативном режиме.
D. Oracle возвратит сообщение об ошибке, и база данных не откроется.
3. База данных Oracle с табличными пространствами отмены UNDO_TBSl
и UNDO_TBS2 была открыта с автоматическим управлением отмены,
допускаемым для этой базы данных. В предыдущем сеансе была введена
команда alter system set undo_tablespace = UND0_TBS1. Параметр
UNDOJTABLESPACE в файле init. ога был задан как UNDOTBS1.
Какой из следующих вариантов правильно описывает, что случится, когда
первый подключившийся к Oracle пользователь начинает свою первую
транзакцию?
A. База данных откроется, но только системный сегмент отмены будет в
оперативном режиме.
B. База данных откроется, но ни один сегмент отмены не будет в
оперативном режиме.
С База данных откроется, и все сегменты отмены в UNDO_TBSl будут
в оперативном режиме.
D. Oracle возвратит сообщение об ошибке, а база данных не откроется.
Ответы
1. С. 2. С. 3. D.
500
Глава 13
Создание и конфигурация сегментов
отмены вручную
У опытных администраторов БД может возникнуть вопрос, а можно ли все
еще конфигурировать сегменты отмены вручную, как они конфигурировали
сегменты отката. Ответ: Категорическое да! Чтобы разобраться с
конфигурацией сегментов отмены вручную, давайте сначала освежим познания о типах
сегментов отмены. Эти объекты можно разделить на две категории: системные
сегменты отмены и несистемные сегменты отмены. Как известно, системный
сегмент отмены размещается в табличном пространство SYSTEM и
обрабатывает транзакции, производимые с объектами в этом пространстве. Другой тип
сегментов отмены, несистемные сегменты отмены, обрабатывает транзакции,
производимые с данными в несистемных табличных пространствах в базе
данных Oracle. Несистемные сегменты отмены размещаются в несистемных
табличных пространствах, например, табличном пространстве UNDOTBS. Чтобы
Oracle запустила базу данных, когда там имеется одно или более несистемных
табличных пространство, экземпляру требуется, по крайней мере, один
несистемный сегмент отмены вне табличного пространства SYSTEM.
Несистемные сегменты отмены имеют две разновидности: частные и
общедоступные сегменты отмены. Частный (private) сегмент отмены —
единственный, запрашиваемый экземпляром, явно называющим сегменты
отмены, которые будут запрашиваться при запуске с помощью параметра
ROLLBACKSEGMENTS в файле initsid.ora, или с помощью введенной
вручную администратором БД команды alter rollback segment undo_seg
online.
Общедоступные сегменты отмены обычно используются при работе в Огас-
1е9/ свойства Real Application Cluster, но может также использоваться в одном
экземпляре. Общедоступные сегменты отмены запрашиваются Oracle, которая
автоматически вычисляет параметры TRANSACTIONS и TRANSACTIONS_
PERROLLBACKSEGMENT в файле init.ora, из пула доступных в базе
данных сегментов отмены.
Как транзакции используют сегменты отмены
Происходящим в базе данных Oracle транзакциям сегменты отмены нужны
для хранения зафиксированных изменений данных. Транзакции назначаются
сегментам отмены двумя способами. Можно явно назначить транзакцию
сегментам отмены с помощью команды set transaction use rollback
segment undo_seg. Если же сегменты отмены не определены явно, Oracle
циклически назначает транзакцию тому сегменту отмены, который в настоящий
момент минимально загружен транзакциями. Таким образом, несколько
транзакций могут использовать один и тот же сегмент отмены, но каждый блок в
сегменте отмены вмещает данные только одной транзакции.
Сегменты отмены используются следующим образом. Сегмент отмены
обычно имеет несколько экстентов, назначаемых ему в любой момент
времени, и эти экстенты используются последовательно. После запуска базы
данных первая транзакция будет назначена первому сегменту отмены, и он будет
хранить произведенные ею изменения данных в экстенте #1 из сегментов
отмены. В ходе транзакции (допустим, долговременные процессы пакетной
обработки с тысячами команд update), он вмещает все больше и больше данных.
Экстент, содержащий данные из выполняемой транзакции, называется
активным (active). В базе данных запускается все больше и больше транзакций, и
этому сегменту отмены могут быть назначены некоторые из других
транзакций. Каждая транзакция будет вносить в экстент #1 все больше и больше
данных об изменениях, пока не произойдет фиксация транзакций.
Если экстент #1 заполняется данными изменений раньше, чем транзакции
зафиксируются, транзакции начнут заполнять данными экстент #2.
Считается, что транзакции с изменениями данных, перетекающие в новый
экстент, расширяются (extend). Специальный маркер, называемый заголовком
сегмента отмены, переходит от экстента #1 к экстенту #2 и указывает на
Структуры памяти и данные отмены
501
экстент, в который новые и существующие транзакции, назначенные на этот
сегмент отмены, могут записывать данные об изменениях. Как только
транзакция зафиксирует изменения данных, ей больше не нужно место в
экстенте #1, использовавшееся для хранения ее данных об изменениях. Если
экстент #1 заполнен информацией об изменении данных только из
зафиксированных транзакций, экстент #1 считается неактивным (inactive). На
рис. 13.2 показан этот тип поведения сегментов отмены.
Чтобы эффективно использовать пространство в сегментах отмены,
сегмент отмены назначает всего несколько экстентов, и эти экстенты часто
используются повторно. Идеальная работа сегменты отмены с пятью
экстентами выглядит следующим образом: назначенные сегменту отмены
транзакции должны немного заполнить экстент #5 после фиксации
транзакции с данными об изменениях в экстенте #1. Таким образом,
экстент #1 станет неактивным как раз перед тем, как транзакции в экстенте
#5 потребуется перейти (wrap) в него. Однако, такое не всегда возможно.
Если транзакция идет долго без фиксации изменений данных, в конечном
счете, она может заполнить все экстенты в сегменте отмены. В таких
случаях сегмент отмены запрашивает экстент #6, и переводит в него
изменения данных из текущей транзакции. Заголовок сегмента отмены
также переходит в экстент #6. На рис. 13.3 показано, как Oracle получает
или запрашивает дополнительные экстенты для сегмента отмены.
Если транзакция заставляет сегмент отмены назначить максимальное
число экстентов для хранения изменения данных длинной транзакции — как
указано в опции памяти maxextents при создании сегмента отмены — сегмент
отмены становится протяженным по форме. У Oracle есть опция optimal в
памяти сегмента отмены, позволяющаяся сегменту отмены освобождать
экстенты после того, как долговременные транзакции вынуждают их
запрашивать дополнительные экстенты, которые им действительно нужны. Фраза
optimal определяет оптимальный размер сегмента отмены или Мбайт. Это
значение сообщает Oracle оптимальное число поддерживаемых сегментом
отмены экстентов. Если для сегмента отмены задано optimal, этот объект
освободит пространство, когда заголовок сегмента отмены перейдет от одного
экстента к другому, если текущий размер сегмента отмены превышает optimal
и есть непрерывные смежные неактивные экстенты. На рис. 13.4 показано
освобождение экстента сегмента отмены.
Совет Освобождение экстента из-за optimal никак не связано с
фиксацией транзакций в базе данных. Освобождение происходит, когда заголовок
сегмента отмены переходит от одного экстента к другому. Oracle не
освобождает используемые в настоящее время экстенты (даже если общий
размер превышает optimal) и всегда пытается освободить сначала самые
старые неактивные экстенты.
Рис. 13.2.
Сегмент отмены,
содержащий пять
многократно
используемых
экстентов
\
502
Глава 13
Рис. I.V.V
Как сегмент отмены
приобретает
дополнительные
экстенты
Правило четырех для планирования числа сегментов отмены
для систем OLTP
Рекомендуемая Oracle стратегия планирования соответствующего числа
сегментов отмены для большинства систем оперативной обработки транзакций
(OLTP) называется правилом четырех (Rme of Four) для простоты запоминания.
Возьмите общее число транзакций, которые обращаются к базе данных в любой
заданный момент времени, разделите его на 4 и узнаете, сколько сегментов
отмены надо создать. Рассмотрим пример. Ваша база данных будет
использоваться для небольшой пользовательской выгрузки приложения OLTP. В любой
данный момент времени в базе данных будет происходить приблизительно
25 параллельных транзакций. Применение правила четырех показывает, что
потребуется около шести сегментов отмены. Вскоре мы рассмотрим
дополнительные вычисления, необходимые для определения размера сегмента отмены.
Существуют два исключения из правила четырех. Во-первых, если частное
меньше 4, округлите результат до ближайшего кратного 4 и используйте это
число сегментов отмены. В нашем примере результат округления был бы 6—8.
Второе исключение из правила четырех заключается в том, что Oracle не
рекомендует иметь в базе данных больше 50 сегментов отмены, хотя это
исключение уже не столь актуально для массивных систем базы данных, требующих
свыше 2000 параллельных пользователей. Таким образом, если по правилу
четырех необходимо свыше 50 сегментов отмены, администратор БД должен
начать с назначения 50, а затем проследить за коэффициентом ожидания
сегмента отмены и решить, нужны ли дополнительные сегменты.
Рис. 13.4.
Освобождение
экстента сегмента
отмены
Освобожденные
1MB
7
optimal
= 1МВ
1MB
1
Активный
Неактивный *Ч/
1MB
6 *
Неактивный
/
i
1MB
2
Активный
Заголовок
\ /
ч /
1MB
5
1MB
4
Активный
1MB
3
Активный
Активный
Структуры памяти и данные отмены
503
Планирование числа сегментов отмены
для пакетной системной обработки
При планировании числа сегментов отмены, требуемых при пакетной системе
обработки транзакций необходимо сделать доступным небольшое число
больших сегментов отмены для поддержки долговременных процессов, которые
производят несколько замен данных. В такой базе данных следует следить за
числом транзакций, одновременно выполняемых в процессе пакетной
обработки, и применять правило четырех для установления числа необходимых
сегментов отмены аналогично приложению OLTP. В следующем разделе мы
рассмотрим, как вычислить размер сегментов отмены, поддерживающих как
OLTP, так и пакетные транзакции.
Установление размеров OLTP и пакетных сегментов отмены
Существует два компонента определения размера сегмента отмены, первый из
них — общий размер сегмента отмены. Размер ваших сегментов отмены, в
свою очередь, зависит от двух главных факторов: тип команды DML,
используемый для изменения данных и объем обрабатываемых данных. Для
различных команд DML, изменяющих данные, требуется разный объем хранимых
данных; далее они перечисляются по порядку, от наименьшего объема
информации об изменениях данных, хранимой в сегменте отмены до самого
большого: insert (хранит в сегменте отмены только новый ROWID), update
(хранит ROWID плюс старые значения столбца) и delete (хранит ROWID и все
данные строки или столбца). Кстати, информация об изменении данных,
сохраненная в сегменте отмены называется отменой (undo). Итак, если ваши
транзакции сначала вставляют данные, сегменты отмены меньше по
сравнению с тем, какими бы они были, если бы транзакции сначала удаляли данные.
Второй компонент определения размера сегмента отмены — число
экстентов, образующих сегмент отмены. Часто при этом бывает, что чем больше, тем
лучше. Используя большее число экстентов при назначении начального
сегмента отмены, что определяется опцией памяти minextents, вы уменьшаете
вероятность продления сегмента отмены. Oracle рекомендует 20 (или больше)
экстентов при назначении начального сегмента отмены.
Создание сегментов отмены с соответствующими
настройками памяти
Сегменты отмены создаются с помощью команды create rollback segment.
Все экстенты в сегментах отмены базы данных Oracle должны быть одного
размера. Запомните это — так или иначе вы столкнетесь с этим на экзамене
"Основы АБД I". Чтобы сделать эту рекомендацию отчасти принудительной,
Oracle отвергает использование pctincrease в команде create rollback
segment. (Опция pctincrease доступна для других объектов, например,
таблиц, в целях увеличения размера назначаемых объекту последующих экстентов,
что уменьшает общее число назначенных экстентов.) Размеры сегментов
отмены и входящих в них экстентов определяются опциями во фразе storage.
Ниже приводится перечень опций, доступных для установки сегментов
отмены:
■ initial Размер начального экстента сегмента отмены в Кбайт или Мбайт.
■ next Размер следующего назначаемого экстента сегмента отмены в
Кбайт или Мбайт. Следует обеспечить одинаковый размер всех экстентов,
задав next равным initial.
I minextents Минимальное число экстентов в сегменте отмены. Значение
для minextents должно быть не менее 2.
■ maxextents Максимальное число экстентов, которое может запросить
сегмент отмены. Убедитесь, что задали его как число, а не как unlimited;
это не позволит неконтролируемым транзакциям занять все доступное
504
Глава 13
табличное пространство. Этот особенно важно, если в табличном
пространстве UNDOTBS находятся файлы данных, использующие свойство
autoextend.
■ optimal Оптимальный общий размер сегмента отмены в Кбайт или
Мбайт. При условии, что initial равен next, значение optimal не
может быть меньше, чем initial * minextents.
Следующий блок кода демонстрирует создание не относящегося к
табличному пространству SYSTEM частного сегмента отмены в базе данных в
соответствии с рекомендациями Oracle. В экзаменационных вопросах по этому
разделу следует давать ответы, исходя из рекомендаций Oracle.
fWflWS CREATE ROLLBACK SEGMENT rollsegOl
TABLESPACE orgdbrbs
STORAGE (INITIAL 10K
NEXT 10K
MINEXTENTS 20
MAXEXTENTS 450
OPTIMAL 30OK );
Совет Предыдущая команда предназначена для использования с табличным
пространством под управлением словаря.
Обратите внимание, в блоке кода не использовалось ключевое слово
public. Сегменты отмены всегда являются частными, если только их не создают с
помощью команды create public rollback segment. После создания
сегмента отмены следует перевести его в оперативный режим, чтобы он стал
доступен для пользовательских транзакций. Это позволяет сделать команда
alter rollback segment undo_seg online. Число переводимых в
оперативный режим сегментов отмены можно ограничить при запуске
экземпляра, задав параметр MAX_ROLLBACK_SEGMENTS из файла init-
sid. ora как 1 + число сегментов отмены, не входящих в табличное
пространство SYSTEM, которое должно быть доступно в Oracle.
Совет Сегменты отмены можно создать с помощью административной
утилиты Storage Manager, которая входит в Oracle Enterprise Manager, a
также из SQL*Plus.
Перевод сегментов отмены в оперативный режим
при запуске экземпляра
После ввода команды shutdown все созданные или переведенные в
оперативный режим во время работы базы данных сегменты отмены становятся
автономными. Вернуть их в оперативный режим можно двумя способами. Первый
из них — снова ввести команду alter rollback segment undo_seg online
для каждого сегмента отмены, который надо сделать оперативным.
Второй способ — через многошаговый процесс, включаемый Oracle при
запуске экземпляра. Сначала, при запуске экземпляра, Oracle запрашивает
любые сегменты отмены, названные вами в параметре ROLL-
BACK_SEGMENTS файла initriJ.ora, указанном как ROLLBACK.
SEGMENTS = {rollsegOl, rollseg02...). Затем, Oracle вычисляет количество
необходимых для надлежащей работы базы данных сегментов отмены,
используя набор значений для параметров TRANSACTIONS, TRANS-
ACTIONS_PER_ROLLBACK_SEGMENT и initsid.ora. Вычисление
представляет собой операцию TRANSACTIONS/TRANSACTIONS_
PER_ROLLBACK_SEGMENT. Следовательно, если TRANS- ACTIONS = 146,
a TRANSACTIONS_PER_ROLLBACK_SEGMENT = = 18, то Oracle понимает,
что следует запросить восемь сегментов отмены. Если было названо восемь
сегментов отмены, Oracle переводит эти частные сегменты отмены в
оперативный режим. Если они не были названы, Oracle пытается запросить
разницу из пула свободных общедоступных сегментов отмены. При наличии в
пуле достаточного числа общедоступных сегментов отмены Oracle запрашивает
разницу и переводит все запрошенные сегменты отмены в оперативный режим.
Структуры памяти и данные отмены
505
Обратите внимание, однако, что для общедоступных сегментов отмены, где
используется Oracle Parallel Server, сначала требуется шаг вычисления.
Совет Если Oracle недостаточно свободных общедоступных сегментов
отмены, экземпляр Oracle запускается, и база данных все равно открывается,
причем в трассировочном файле или журнале предупреждающих сообщений
не сообщается об ошибках.
Поддержка сегментов отмены вручную
Для поддержки сегментов отмены в Oracle есть несколько команд. Первая из
них команда alter rollback segment. Как вы уже видели, эта команда
переводит сегмент отмены в оперативный режим, как в alter rollback
segment undo_seg online. Команда alter rollback segment undo_seg
offline позволяет перевести сегмент отмены в автономный режим. Однако
сегмент отмены можно сделать автономным, только если в нем не содержатся
активные экстенты, поддерживающие транзакции с незафиксированными
изменениями данных. Эта команда также используется изменения опций во
фразе storage, за исключением размера начального экстента (initial).
Однако обратите внимание, что изменение размера последующего экстента (next)
изменит размер следующего экстента, запрашиваемого сегментом отмены, а
не размер какого-либо экстента, который сегмент отмены уже запросил, и,
кроме того, это не рекомендуется делать по ряду причин, которые уже
объяснялись.
«ижааеа ALTER ROLLBACK SEGMENT rollsegOl
STORAGE (MAXEXTENTS 200
OPTIMAL 31OK );
Команда alter rollback segment имеет одну дополнительную фразу,
которой вы можете воспользоваться, и эта фраза — shrink to. Она позволяет
вручную уменьшить назначение памяти в вашем сегменте отмены до размера,
не менее указанного вами оптимального размера (если optimal задан). Как и
в случае с optimal, Oracle не будет уменьшать размер сегмента отмены, если
экстенты сверх указанного размера все еще активны. Если не определено
никакого значения, Oracle попытаться сократить сегмент отмены до значения,
указанного в optimal. И, наконец, Oracle игнорирует команду alter rollback
segment undo_seg shrink [to x [K|M] ], если указанное для х значение
больше текущего назначения сегмента отмены. Следующий блок кода
демонстрирует привальное использование фразы shrink to:
ОФШ!№ ALTER ROLLBACK SEGMENT rollsegOl SHRINK;
ALTER ROLLBACK SEGMENT rollsegOl SHRINK ТО 220K;
Можно удалить переведенный ранее автономный режим сегмент
отмены, если вы считаете, что он больше не понадобится, или его надо
восстановить с другими параметрами размера экстента initial, next и minex-
tents. Для этой цели используется команда drop rollback segment
undo_seg.
$1ШЯШ DROP ROLLBACK SEGMENT rollsegOl;
CREATE ROLLBACK SEGMENT rollsegOl;
TABLESPACE orgdbrbs
STORAGE (INITIAL 12K
NEXT 12K
MINEXTENTS 25
MAXEXTENTS 400
OPTIMAL 300K)
Совет Если вы хотите управлять сегментами отмены вручную, в то время
как Oracle9i работает в автоматическом режиме управления отменой,
следует задать параметр UNDO_SUPPRESS_ERRORSв файле ini t. ora как
true. По умолчанию значение этого параметра —false, т.е. любая попытка
управлять сегментами отмены вручную во время автоматического
управлениями ими приводит к ошибке.
506
Глава 13
Закрепление пройденного материала
1. Что происходит с производительностью базы данных, если Oracle
должна часто назначить экстенты своим сегментам отмены, не освобождая
их? Какая опция памяти используется для сведения этих случаев к
минимуму?
8. Как используются minextents и maxextents при установлении размеров
сегментов отмены? В чем заключается правило четырех? Какие правила
следует применять при установлении размеров сегментов отмены в
пакетных приложениях? Почему важно использовать много экстентов в
сегменте отмены?
3. Как освобождаются экстенты сегмента отмены?
4. Назовите опции конструкции памяти сегмента отмены, и опишите их
общее назначение. Как Oracle пытается принудительно ввести установление
одинаковых для всех экстентов размеров в сегментах отмены?
5. Как перевести сегменты отмены в оперативный режим после их создания?
При запуске экземпляра?
6. Какие опция памяти нельзя модифицировать с помощью команды alter
rollback segment? Как можно вручную сделать сегмент отмены
недоступным для использования транзакцией, и что может помешать вам
сделать это?
7. Что представляет собой фраза shrink to из команды alter rollback
segment, и как она используется? Когда следует (или возможно) исключить
сегмент отмены, и какая команда используется для этого?
Упражнения
1. Вы пытаетесь управлять сегментами отмены вручную, в то время как в
системе установлено автоматическое управление отменой. Какой из
следующих вариантов соответствует тому, что случится при вводе команды alter
rollback в этом контексте?
A. Сегмент отмены будет изменен, как вы и хотели.
B. Сегмент отмены будет изменен, но Oracle выдаст предупреждение.
С Сегмент отмены не будет изменен, a Oracle выдаст ошибку.
D. База данных даст сбой.
8. Вы пытаетесь управлять сегментами отмены вручную, в то время как в
системе установлено автоматическое управление отменой. Какой из
следующих вариантов соответствует правильному методу конфигурации Oracle,
допускающей это?
A. Задать UNDO_MANAGEMENT как AUTO.
B. Задать UNDO_SUPRESS_ERRORS как FALSE.
С Задать UNDO_MANAGEMENT как MANUAL.
D. Задать UNDO_RETENTION как 1,800.
3. Вы отключили автоматическое управление отменой в базе данных Oracle.
Который из следующих вариантов соответствует методу, который следует
использовать для обеспечения доступности сегментов отмены для
пользовательских процессов?
A. Задать UNDOJTABLESPACE как имя табличного пространства
отмены.
B. Задать ROLLBACK_SEGMENTS как список сегментов отмены,
которые переводятся в оперативный режим.
Структуры памяти и данные отмены
507
C. Перевести базу данных в оперативный режим "только для чтения"
D. Ничего не делать. Oracle переведет сегменты отмены в оперативный
режим автоматически.
Ответы
1. С. 2. С. 3. В.
Получение информации о данных отмены
В Oracle существует много словарей и представлений производительности, как
старых, так и новых, которые отслеживают статистику отмены. В целях
получения полной информации о данных отмены рекомендуется использовать и
отмену, и представления словаря данных отмены. Ниже приводится перечень
представлений, о которых следует знать:
■ DBA_ROLLBACK_SEGS Это существующее представление, которое
отображает данные об отмене или сегментах отмены, например, имя сегмента
отмены, табличное пространство, в котором они постоянно находятся, и
их состояние.
■ DBA_UNDO_EXTENTS Это представление словаря данных содержит
информацию о времени фиксации для каждого экстента в табличном
пространство отмены.
■ V$UNDOSTAT Это представление отображает гистограмму
статистических данных, демонстрирующих поведение отмены. Каждая строка в этом
представлении хранит статистику сегментов отмены в экземпляре для
десятиминутных интервалов. Это представление может использоваться для
оценки требуемого количества пространства отмены.
■ V$ROLLSTAT, VSROLLNAME Это два старых представления, которые
отображают информацию о производительности сегментов отмены.
Закрепление пройденного материала
Необходимо знать, какие словари и представления, производительности
доступны в Oracle для управления сегментами отмены.
Упражнения
1. Это представление содержит информацию о производительности для
управляемых Oracle сегментов отмены: .
Я. Это представление содержит листинг сегментов отмены, созданных Oracle
для обработки информации об отмене: .
Ответы
1. V5UNDOSTAT 2. DBA_UNDO_EXTENTS.
Резюме главы
В этой главе, мы рассмотрели вопросы, касающиеся управления сегментами в
базе данных Oracle и использования сегментов отмены. Эти два раздела
охватывают приблизительно 14 % экзаменационных материалов. Вы
ознакомились с различными типами используемых в Oracle сегментов, а также
некоторыми методами анализа, дающими представление о фрагментации и сроке
службы сегментов. Эта информация полезна, потому на ее основе можно
распределить различные типы сегментов по разным табличным пространствам.
Вы также узнали, как Oracle запрашивает новые экстенты для объектов базы
508
Глава 13
данных по заполнении текущего экстента. Мы упомянули об особом значении
настроек памяти объекта для установления размера назначаемых экстентов.
Затем вы ознакомились с использованием сегментов отмены в Oracle. Мы
обсудили управление сегментами отмены, использующими автоматическое
управление отменой, а также управление ими вручную. Мы завершили
рассмотрение сегментов отмены, указав вам, где можно найти массу информации
о сегментах отмены в Oracle в словаре данных.
Двухминутное погружение в пройденное
Ш Каждый объект базы данных в Oracle хранится в сегменте. Поскольку эти
сегменты поддерживают данные в Oracle, используемые в различных
целях, необходимо хранить различные сегменты в разных табличных
пространствах.
■ Следует понимать, что в табличном пространстве существует обратно
пропорциональное отношение между сроком службы экстентов и
фрагментацией — чем короче срок службы, тем выше потенциальная фрагментация
табличного пространства.
Ш Помните, что метод, позволяющий управлять назначением экстентов
объектам базы данных, определяется параметрами памяти для объекта базы
данных. Они могут быть установлены на уровне объекта или унаследованы
от параметров по умолчанию для табличного пространства. Параметрами
памяти являются
■ initial Первый сегмент в объекте
■ next Следующий назначенный сегмент (а не просто второй в
объекте)
■ pctincrease Прирост в процентах следующего экстента,
назначенного свыше значения next
■ minextents Минимальное число экстентов, назначенных объекту
при создании
■ maxextents Максимальное число экстентов, которое может
назначить объект
■ pctfree Сколько места остается свободным в каждом блоке
после выполнения команды insert при обновлении строки.
■ pctused Пороговое значение, до которого должен снизиться
показатель использования, прежде чем будет добавлена строка.
■ Следует понимать, как Oracle позволяет администратору БД управлять
использованием пространства на уровне блока с помощью pctfree и
pctused.
Ш Следует знать, как использовать представления словаря для поиска
информации о структурах памяти, включая DBASEGMENTS, DBA_
TABLESPACES, DBA_TS_QUOTES, V$TABLESPACE, DBA_EXTENTS,
DBA_FREE_SPACE и DBA_FREE_SPACE_COALESCED.
Ш Сегменты отмены, которые в предыдущих версиях Oracle назывались
сегментами отката.
■ Сегменты отмены позволяют обрабатывать транзакции с помощью
сохранения старой версии данных, которые были изменены, но не
зафиксированы пользователем.
■ Огас1е9/ предлагает новое свойство для сегментов отмены —
автоматическое управление отменой. Для его использования необходимо выполнить
следующие шаги:
Структуры памяти и данные отмены
509
1. Создайте табличные пространства отмены или при создании базы данных с
помощью фразы undo tablespace, или с помощью команды create
undo tablespace.
2. Задайте параметр UNDO_MANAGEMENT как AUTO, а параметр
UNDO_TABLESPACE как созданное вами табличное пространство
отмены.
3. Задайте параметр UNDO_RETENTION как продолжительность времени, в
течение которого следует сохранять информацию об отмене в сегментах
для поддержки свойства Flashback Query.
■ Можно также управлять сегментами отмены вручную, как это делалось в
предыдущих версиях Oracle. Для этого задайте UNDO_MANAGEMENT
как MANUAL. Можно также задать UNDO_SUPPRESS_ERRORS как
TRUE, чтобы предотвратить ситуацию, когда база данных работает в
режиме автоматического управления отменой и выдает сообщения об
ошибке, если вы пытаетесь управлять сегментами отмены вручную.
■ Если вы решили управлять сегментами отмены вручную, убедитесь, что
сегменты отмены состоят из экстентов одинакового размера
■ Опция pctincrease не разрешается для сегментов отмены, если вы
создаете их вручную
I Чтобы можно было использовать сегменты отмены, их необходимо
перевести в оперативный режим. При автоматическом управлении отменой
Oracle позаботится об этом автоматически, но если вы используете ручное
управление отмены, вы должны сами перевести их в оперативный режим.
I Нельзя перевести сегмент отмены в автономный режим до завершения
всех активных транзакций, записывающих элементы отмены. Это то же
ограничение относится к табличному пространству, содержащему
активные сегменты отмены.
I Элементы ассоциируются с транзакциями в сегменте отмены при помощи
системного номера изменения (system change number, SCN).
■ В случае ручного управления отменой при запуске можно назначать
определенные частные сегменты отмены, если они определены в параметре
ROLLBACK_SEGMENTS из файла initsid. ora.
■ В случае ручного управления отменой следите за производительностью в
сегментах отмены с помощью V$ROLLSTAT и VSWAITSTAT.
I Помните о новых представлениях словаря в поддержку автоматического
управления отмены.
Вопросы для самопроверки
1. Опция storage для объектов базы данных, которая может вызывать
экспоненциальный рост размера каждого экстента, запрашиваемого для объекта
базы данных — это .
2. Тип сегмента в базе данных Oracle, в котором хранится исходные данные в
записи, изменяемой пользовательским процессом .
3. Этот тип сегмента базы данных хранит данные в течение дисковой
сортировки:
4. Этот параметр инициализации используется для разрешения
автоматического управления отменой в Oracle: .
5. Набор значений для этого параметра определяет, столкнется ли
выполнение команды с alter rollback segment ошибками, если в Oracle
разрешения автоматическое управление отменой: .
510
Глава 13
Вопросы ко всей главе
1. При определении числа сегментов отмены в базе данных, какой из
следующих вариантов соответствует фактору, который следует учитывать?
A. Параллельные транзакции
B. Размер обычных транзакций
C. Размер строк в наиболее часто изменяемой таблице
D. Число ожидаемых дисковых сортировок
8. Сколько сегментов отмены потребуется, если TRANSACTIONS задано
значение 20, а для TRANSACTIONS_PER_ROLLBACK_SEGMENT - 4?
A. Два
B. Четыре
C. Восемь
D. Девять
3. Когда вы создаете сегмент отмены вручную, какой из следующих
вариантов автоматически устанавливает Oracle для состояния доступности?
A. Online
B. Pending online
C. Offline
D. Stale
4. Все следующие варианты, за исключением одного, представляют способ
решения проблемы с ошибкой ORA-1555 Snapshot too old (rollback
segment too sma 11). Какой это вариант?
А Создать сегменты отмены с более высоким значением optimal.
B. Создать сегменты отмены с более высоким значением maxextents.
C. Создать сегменты отмены, где экстенты больше по размеру.
D. Создать сегменты отмены с более высоким значением minextents.
5. Вы управляете диалоговой обработкой запросов в Oracle. Какой из
следующих компонентов Oracle связывает элементы сегмента отмены с
транзакциями?
А Число выполненных операций commit
B. Число выполненных операций rollback
C. ROWID
D. Номер, изменяемый системой
6. Вы управляете сегментом в таблице Oracle с параметрами памяти 100
Кбайт для initial и next, соответственно, при первом создании таблицы,
и 50 для pctincrease. Какой из следующих вариантов соответствует
размеру таблицы после назначения четвертого экстента?
А 225 Кбайт В. 325 Кбайт
С. 350 Кбайт D. 575 Кбайт
7. Вы устанавливаете параметры использования пространства блока для
таблицы в информационном хранилище. Еженедельно таблица загружается
данными, а затем становится доступной для пользователей в режиме
доступа "только для запросов". Какой из следующих вариантов соответствует
правильной настройке использования пространства блока?
A pctfree 5 В. pctfree 40
С. pctused 5 D. pctused 40
Структуры памяти и данные отмены
511
8. Вы только что добавили табличное пространство отмены к базе данных, а
теперь хотите сконфигурировать автоматическое управление отменой в
базе данных Oracle. Какой из следующих параметров необходим для
конфигурации этого свойства?
A. UNDO_MANAGEMENT
B. UNDO_TABLESPACE
С UNDO_RETENTION
D. UNDO_SUPPRESS_ERRORS
Ответы на вопросы для самопроверки
1. pctincrease
2. Сегмент отмены
3. Временный сегмент
4. UNDO_MANAGEMENT
5. UNDO SUPPRESSJERRORS
Ответы на вопросы ко всей главе
1. А. Параллельные транзакции
Объяснение Число параллельных транзакций используется частично для
определения числа сегментов отмены, которые должны быть в вашей базе
данных. Если бы вопрос был о том, какой вариант играет роль в определении
размера экстентов или общего размера сегмента отмены, тогда вариант В или С
был бы правильным. Поскольку дисковые сортировки имеют мало общего с
сегментами отмены, ни в коем случае нельзя выбирать D.
2. С. Восемь
Объяснение При создании сегментов отмены обратимся к правилу четырех.
Вспомним уравнение TRANSACTIONS/TRANSACnONS_PER_ROLLBACK_
SEGMENT. В нашем примере ответ равен 5. Это особый случай в правиле
четырех, который округляется до 8.
3. С. Автономное
Объяснение После создания сегмента отмены находится автономном
состоянии, и для использования его следует перевести в оперативный режим.
Вспомним обсуждение сегментов отмены. Чтобы сделать его оперативным,
следует ввести команду issue the alter rollback segment online, что
исключает вариант A. Pending online недействительное в Oracle состояние
сегментов отмены, что исключает вариант В. Stale — допустимое состояние
для журнала базы данных, но не для сегментов отмены, что исключает
вариант D.
4. В. Создайте сегменты отмены с более высоким значением
maxextents.
Объяснение Обратитесь к обсуждению индексов, создаваемых в сочетании
с ограничениями целостности.
5. D. Изменяемый системой номер
Объяснение SCN — идентификаторы, группирующие команды изменения
данных в одну транзакцию в сегментах отмены и журнале базы данных. Число
выполненных операций commit или rollback просто уменьшает число
активных транзакций в базе данных, и, следовательно, объем активной отмены в
сегменте отмены. Таким образом, варианты А и В неправильны. Наконец,
512
Глава 13
ROWID соответствует местоположению на диске строк таблицы и имеет мало
общего с группировкой транзакций, так что вариант С неправилен.
6. D. 575 Кбайт
Объяснение Общая сумма назначенного этой таблице пространства равна
575, потому что первые два экстента имеют по 100 Кб, третий экстент — 100
Кб X 1,5 или 150 Кб, а четвертый — 100 Кб х 1,5 х 1,5 или 225 Кб. Хотя вариант
правильно указывает размер четвертого экстента, внимательное чтение главы
подсказало бы, что, фактически, это вопрос о полном размере таблицы после
того, как назначены все четыре экстента. Вариант В указывает полный размер
первого и четвертого экстента, принимая во внимание, что вариант С
указывает полный размер второго и третьего экстента.
7. A. pctfree 5
Объяснение Поскольку эта таблица загружается периодически, а затем
доступна для пользователей в режиме "только для запросов", не следует оставлять
много места под рост строки. Таким образом, следует сосредоточиться на
pctfree, а не на pctused, потому что pctfree используется для управления
ростом строки. Таким образом, варианты С и D можно сразу же отбросить. Из
двух оставшихся вариант А — наиболее правильный, потому что предлагает
самое низкое значение параметра pctfree.
8. A. UNDO_MANAGEMENT
Объяснение Чтобы конфигурировать автоматическое управление отмены,
следует задать параметр UNDO_MANAGEMENT в файле init.ora как
AUTO. Это единственный шаг, необходимый для введения автоматического
управления отменой после создания табличного пространства отмены, потому
что Oracle может выяснить, какое из табличных пространств использовать,
если существует табличное пространство отмены; таким образом, вариант В
неправилен. Вариант С неправилен, потому что UNDO_RETENTION имеет
заданное по умолчанию значение 900. Наконец, поскольку вы, вероятно, не
будете управлять сегментами отмены вручную при разрешенном
автоматическом управлении отменой, не следует изменять настройку для
UNDO_SUPPRESS_ERRORS, вариант создания D неправильный.
ГЛАВА 14
Управление объектами
базы данных
514
Глава 14
этой главе мы познакомимся со следующими областями, а
потом и продемонстрируем свои знания по ним:
■ Управление таблицами
■ Управление индексами
■ Управление целостностью данных
Повседневная работа администратора БД, в основном, сводится к
созданию и обслуживанию объектов базы данных, например, таблицам и индексам.
Это в особенности справедливо для администраторов, управляющих базами
данных разработки и тестирования. Даже работающие с производственными
системами администраторы согласятся, что, по крайней мере, часть их
времени тратится на исследование проблем, связанных с настройками объектов
базы данных. В этой главе мы рассмотрим все необходимое для создания
таблиц, индексов и ограничений целостности. Хотя в Oracle существуют и другие
объекты, например, последовательности, кластерные таблицы или таблицы с
индексной организацией (index-organized table, ЮТ), таблицы и индексы
являются основными объектами практически всех баз данных Oracle.
Ограничения целостности открывают для таблиц и индексов уникальную перспективу.
С одной стороны, ограничения предотвращают ввод в таблицы недостоверных
данных. С другой стороны, ограничения целостности иногда используют
индексы в качестве основного механизма поддержки своих действий. Эта глава
охватывает приблизительно 18 % экзаменационного материала.
Управление таблицами
В этом разделе будут рассмотрены следующие темы, относящиеся к
управлению таблицами:
■ Различные методы сохранения данных
Ш Различение типов данных Oracle
■ Расширенные и ограниченные ROWID
■ Структура строки
Ш Создание постоянных и временных таблиц
■ Управление структурами памяти в таблице
■ Реорганизация, усечение и удаление таблиц
Ш Удаление столбцов в таблицах
Для хранения данных в Oracle используются таблицы. С точки зрения
данных, таблица, как объект, аналогична электронной таблице, поскольку, в
таблице есть столбцы и строки для хранения данных. Вся информация в столбце
будет иметь тот же тип данных, а строка рассматривается как совокупность
отдельных значений, определенных для каждого столбца. В этом разделе
таблица рассматривается с точки зрения администрирования, как совокупность
битов и байтов внутри файла, чья память сегмент должна тщательно
планироваться и управляться. Мы обсудим в общих чертах имеющиеся в
Oracle типы таблиц, а также, но уже поподробнее, типы данных в Oracle. Мы
обсудим во всех деталях ROWID, который Oracle использует как механизм для
отслеживания местоположения отдельных строк в таблицах файлов базы
данных. Будет рассмотрена структура строки и процесс создания таблицы в
Oracle, а также обслуживание таблиц.
Различные методы хранения данных
Перед тем, как приступать к исследованию таблиц, задумаемся над
следующим вопросом: Чем таблица отличается от сегментов данных, которые мы
обсуждали в предыдущих главах? В конце концов, данные, размещаемые
пользователями в таблицах, на самом деле хранятся в сегментах и экстентах внутри
Управление объектами базы данных
515
файлов данных. Однако именно это и отличает таблицы — они дают такое
представление о данных внутри сегмента или экстента, которое также
позволяет ссылаться на эти данные, управлять ими, добавлять новые данные или
даже удалять данные. Другими словами, таблицы — это конструкции,
позволяющие пользователям обращаться к данным, которые администраторы БД
считают хранящимися в сегментах и экстентах.
Oracle поддерживает различные типы таблиц для сохранения
пользовательских данных в сегменте Oracle. Существуют постоянные таблица для хранения
постоянных данных, и временные таблицы для временных данных.
Большинство администраторов БД сочтет, что эти два типа таблиц дают им все
необходимое для организации данных. Однако имеется также много экзотических
разновидностей таблиц, которые были разработаны в Oracle за эти годы, и
каждая из них занимает важную нишу. К этим типам таблиц относятся
разделенные таблицы, таблицы с индексной организацией и кластерные таблицы. А
теперь рассмотрим каждый из этих типов таблиц поподробнее.
Постоянные таблицы
Постоянные таблица — наиболее распространенные типы таблиц для
хранения пользовательских данных. При выполнении команды create table Oracle
создает по умолчанию постоянную таблицу. Согласно определению таблиц,
данному Е.Ф. Коддом (E.F. Codd) в его функаментальной работе по
относительной теории баз данных, Oracle не гарантирует, что данные строки будут
сохранены в определенном порядке. Этот тип памяти данных иногда называется
памятью с неупорядоченным хранением данных или памятью типа "куча"
(heap-organized), где данные хранятся в неупорядоченной совокупности, или в
"куче" Как вам уже известно, порядок можно навести позднее с помощью
различных конструкций в запросах SQL, которые рассматриваются в
руководстве по подготовке к экзамену по SQL (ОСР Огас1е9« Introduction to SQL
exam).
Временные таблицы
Те пользователи Oracle, которые пришли к администрированию базы данных
Oracle из мира Microsoft SQL Server, должно быть знакомы со следующей
концепцией. Допустим, вы хотите создать сложное сообщение, в котором данные
проходят через ряд шагов сложной обработки. Для упрощения обработки вы
решаете сохранить данные в промежуточном формате с помощью таблиц.
Проблема состоит в том, что вы не хотите, чтобы, во избежание путаницы,
пользователи не обращались к этой промежуточной информации в течение или
после создания отчета. Можно просто использовать стандартную таблицу
Oracle, но тогда надо помнить об очистке таблицы.
Oracle предлагает временные таблицы как средство создания таблицы
для хранения частных данных сеанса только на протяжении транзакции или
сеанса. Временная таблица обеспечивает функциональную возможность,
уже недоступная в Oracle с помощью других средств, а также решает за вас
много небольших, но досадных, проблем, связанных с альтернативными
методами. Во-первых, поскольку данные доступны только для сеанса,
поместившего их туда, можно не волноваться, что другие пользователи смогут
увидеть эти данные без вашего разрешения. Кроме того, поскольку данные
из временных таблиц носят временный характер, можно не беспокоиться об
удалении содержимого таблицы, когда данные уж будут не нужны. В конце
транзакции или сеанса данные исчезнут, в зависимости от определения
временной таблицы.
Совет Даже притом, что Oracle защищает сеанс в отношении данных
во временной таблице, все временные таблицы в Oracle доступны для
использования всеми текущими сеансами, а определение временной
таблицы продолжит существовать в словаре данных даже после удаления ее
данных.
516
Глава 14
Разделенные таблицы
Разделенные таблицы аналогичны постоянным таблицам Oracle, за
исключением одной важной особенности — они позволяют ссылаться на отдельные
сегменты, которые могут непосредственно поддерживать большие таблицы.
Сегмент не считается отдельным объектом базы данных, скорее это подоб-
ъект, на который можно ссылаться прямо. Разделенные таблицы позволяют
лучше контролировать распределение данных по нескольким дискам в
машине, на которой установлена база данных Oracle. Каждый диск в машине имеет
канал или аппаратный механизм, предназначенный для облегчения доступа к
нему. Однако этот канал не всегда обеспечивает достаточную пропускную
способность, чтобы несколько процессов могли достаточно быстро обратиться
к диску и предоставить пользователям данные во время пиковых периодов
работы.
Именно здесь требуется разделение. Можно разделить большую таблицу, к
которой обращаются в течение пиковых периодов, и распределить
хранящиеся в ней данные между несколькими дисками. Поскольку каждый диск
вращается независимо от других и может иметь канал прямого доступа, разделение
обеспечивает более высокую, но сравнению с постоянными таблицами,
степень параллельности обработки для баз данных с большой нагрузкой.
Разделение можно использовать и для масштабирования чрезвычайно больших
таблиц, например, в информационных хранилищах. В разделенной таблице
данные хранятся в каждом разделе в соответствии с ключом раздела, или
столбцом, который распределяет блоки данных строки по разделам. Разделы
могут храниться в разных табличных пространствах. Каждый раздел в таблице
должен иметь те же самые столбцы. На самом деле, для выполнения
разделения надо изучить его более подробно, но на экзамене "Основы АБДI" этот
вопрос не входит в число основных, поэтому не будем тратить на него много
времени.
Совет Разделы дают ряд преимуществ, включая повышенную доступность
данных и возможность выполнения параллельных операций изменения
данных одновременно в разных разделах.
Таблицы с индексной организацией
В постоянных таблицах данные хранятся неупорядоченно. Как правило, с
этими таблицами связываются индексы первичного ключа, что ускоряет доступ к
неупорядоченным данным в таблице. Эти индексы создаются в структуре
В-дерева, которая хранится отдельно от таблицы. Структура В-дерева ускоряет
поиск хранящейся в этой структуре информации. '
Вместо неупорядоченного хранения данных Oracle помещает их в таблицы
с индексной организацией в индексной структуре В-дерева. Данные хранятся
в порядке первичного ключа таблицы. Строки в таблице с индексной
организацией не только сортируются по их значениям в первичном ключе, но и
содержат значения столбца первичного ключа и другие, не связанные с ключом,
значения столбца. В таблицах с индексной организацией не существует
отдельной индексной структуры для хранения первичного ключа. Это снижает
накладные расходы памяти, особенно для таблиц с небольшим числом столбцов.
Таблицы с индексной организацией особенно полезны для данных, поиск
которых осуществляется, в основном, по первичному ключу. Пример такой
сортировки данных — таблица поиска, где важные термины ассоциированы с
короткими буквенно-цифровыми кодами.
Кластерная таблица
Иногда встречается набор таблиц, обращение к которым происходит
одновременно. Например, система компенсации расходов служащих может
содержать две таблицы, совместно используемые как родительская и дочерняя.
Родительская таблица содержит ключевую информацию о каждом запросе
компенсации представленных служащим расходов. В этой таблице каждому
Управление объектами базы данных
517
запросу на компенсацию соответствует одна строка, и содержатся значения
столбца, в которых определяются имя служащего или идентификационный
номер, идентификационный номер запроса по расходам и почтовый адрес,
по которому следует отправить чек на компенсацию. Дочерняя таблица
содержит элементы каждого запроса на компенсацию. Например, если
служащий летал на несколько дней в Сингапур на торговую ярмарку, в дочерней
таблице будет храниться несколько строк, каждая из которых будет
относиться к определенному расходу (стоимость авиабилетов, гостиница,
автомобиль, регистрация на конференции, питание и т.д.), а также номер счета для
оплаты каждого из расходов.
В такой ситуации может пригодиться кластер, т.к. данные хранятся как две
отдельных таблицы, но служащие, желающие узнать о компенсации своих
расходов, неизменно запрашивают данные из обеих таблиц сразу. Кластеры
позволяют хранить данные нескольких таблиц внутри одного сегмента, так что
пользователи могут очень быстро извлекать данные из двух таблиц сразу. Для
совместного хранения двух и более таблиц внутри сегмента и кластера,
таблицы должны совместно использовать, по крайней мере, один столбец. Этот
столбец становится ключом кластера. Поскольку кластеры хранят связанные
строки различных таблиц в одном и том же физическом сегменте данных, это
обеспечивает два преимущества:
■ Сокращается дисковый ввод-вывод и улучшается время доступа к
объединениям кластерных таблиц.
■ Требуется лишь сохранить однажды общий столбец(цы) для всех таблиц,
сгруппированных в кластер.
Совет Хотя это и полезный тип таблицы, лучше всего кластеры
работают, когда в них хранятся, прежде всего, статические данные или данные
только для чтения. Причина в том, что строки одной таблицы, хранимые в
блоках кластерного сегмента, размещаются так, чтобы они находились
поблизости от ассоциированных строк из других таблиц. Если размер строки
значительно возрастает после первоначального размещения строки в
кластере, то данные могут сдвинуться в блоках кластера, сводя на нет
увеличение производительности, которого можно было добиться в ином случае.
Закрепление пройденного материала
1. Постоянные таблица в Oracle отлично подходят для общих потребностей
хранения данных. Это наиболее гибкий тип объекта базы данных в Oracle
для хранения данных.
2. Временные таблицы в Oracle полезны для размещения промежуточных
наборов данных в течение сложной обработки на протяжении транзакции
или сеанса.
3. Разделенные таблицы в Oracle позволяют непосредственно обращаться к
отдельным сегментам данных в большей таблице, как если бы они были
миниатюрной копией таблицы, содержащей только определенный блок
данных этой таблицы. Эти объекты удобны для чрезвычайно больших
таблиц в информационных хранилищах.
4. Все перечисленные выше таблицы хранят неупорядоченные данные. Для
ускорения доступа к данным администраторы БД, как правило, создают
индексы для такой таблицы. Таблицы с индексной организацией содержат
данные в индексной структуре, что сокращает накладные расходы
хранения, но не отделяет таблицу от индекса. В результате таблицы с индексной
организацией обеспечивают быстрый поиск своего содержимого.
5. Обычно, сегмент содержит информацию только для одной таблицы.
Кластеры же позволяют хранить внутри одного сегмента данные более чем
одной таблицы. Это полезно в ситуациях, когда пользователи всегда
обращаются к двум или более таблицам сразу, запрашивая их данные.
518
Глава 14
Упражнения
1. В базе данных Oracle хранятся данные в отдельной таблице, к которой
часто обращаются пользователи приложения информационного хранилища.
На какую из следующих таблиц следует переключиться для ускорения
параллельной обработки данных в этой таблице?
A. Временная таблица
B. Таблица с индексной организацией
C. Кластерная таблица
D. Разделенная таблица
2. Имеется долговременный процесс пакетной обработки с технологией
извлечения, преобразования и загрузки данных, (технология ETL), который
выполняет обширную обработку нескольких промежуточных наборов
данных. В конце обработки промежуточные наборы необходимо удалить для
конечного набора, который затем загружается непосредственно в другую
таблицу в информационном хранилище. Какой из следующих объектов
базы данных может облегчить эту обработку с помощью механизма
создания таблиц в дисковой памяти?
A. Временная таблица
B. Таблица с индексной организацией
С Кластерная таблица
D. Стандартная таблица Oracle
3. К строкам в трех таблицах Oracle, поддерживающих специальную систему
упорядочения элементов, часто производится совместный доступ с
помощью объединения таблиц. Поскольку к таблицам постоянно добавляются
данные, вы оставляете много дополнительного пространства внутри
каждого блока для размещения прироста. Какой из следующих типов таблиц
был бы полезен для хранения' данных в такой ситуации?
A. Временная таблица
B. Таблица с индексной организацией
С Кластерная таблица
D. Стандартная таблица Oracle
4. Вы развертываете некие медицинские приложения для поддержки
диагностирования и лечения пациентов. Каждому диагнозу назначен код из пяти
букв, который приложение ищет динамически, по мере ввода новых
записей о пациентах. Образец таких кодов представлен в следующем блоке:
DIAGNOSIS CODE
Influenza D43I2
Chicken Pox R501F
Sore Throat T40AS
Который из следующих типов таблиц лучше всего подошел бы для этого
приложения?
A. Временная таблица
B. Таблица с индексной организацией
С Кластерная таблица
D. Стандартная таблица Oracle
Ответы
1. D. 2. А. 3. D. Помните, что кластеров лучше всего работают, когда в связанных таб-
лицах хранятся, в основном, статические данные или данные только для чтения. 4. В.
Управление объектами базы данных
519
Различение типов данных Oracle
Напомним, что каждый столбец в таблице хранит данные определенного
типа. Каждая строка может содержать значения для столбцов различных
типов данных, но каждый отдельный столбец может хранить данные только
одного типа. Хотя Oracle предлагает много различных полезных типов данных,
их не так много, как хотелось бы, особенно если вы стали администратором
базы данных Oracle после работы с базами данных на уровне отдела или
однопользовательскими. Например, в Oracle нет типа данных валюты
(currency), потому что валюта — всего лишь число с маской формата валюты. Таким
образом, вместо того, чтобы грузить пользователей разными числовыми
типами данных, Oracle предусматривает только один тип данных для чисел,
NUMBER, и надежный механизма применения масок формата, которые вы
сочтете необходимыми для своих чисел. Давайте рассмотрим типы данных
Oracle поподробнее.
Скалярные типы данных Oracle
Oracle существенно реорганизовала типы данных между версиями 7.3 и 8.0.
Существует две основных категории типов данных в Oracle: встроенные и
определяемые пользователем. Встроенные типы включают три основных
класса типов данных: скалярные, коллекции и отношения. Определяемые
пользователем типы включают классы типов данных, которые вы можете
определять для использования в своих собственных приложениях, и их число
бесконечно. Давайте подробно рассмотрим скалярные типы данных.
CHAR(L) и NCHAR(L) Это типы данных текстовой строки фиксированной
длины, где данные хранятся с пробелами, дополняемыми до полной ширины
столбца (здесь L). NCHAR —это многобайтовый эквивалент CHAR для набора
национальных языков (National Language Set, NLS). NLS используется для
того, чтобы Oracle была доступна не только на американском варианте
английского языка. Для некоторых мировых языков с большими наборами
символов (например, японский, китайский или корейский) или с другими
существенными отличиями от английского языка (например, чтение справа
налево, как в арабском языке или иврите) приходится использовать несколько
байтах, чтобы сохранить один символ. В английском же языке для хранения
символа, например, буквы А, достаточно одного байта. В Oracle столбцы
NCHAR и CHAR, а также переменные могут достигать 2000 байт в длину. В
Огас1е7 пределом были 255 байт.
VARCHAR2 (£) и NVARCHAR2 (£) Это типы данных текстовой строки
переменной длины, где данные хранятся с помощью только того числа байтов,
которое необходимо для фактического значения, длина которого, в свою
очередь, может быть разной для каждой строки. NVARCHAR2 — это
многобайтовый эквивалент VARCHAR2 для набора NLS. На самом деле, это не совсем
так: NCHAR и NVARCHAR2 — типы данных NLS, которые позволяют
хранить символы фиксированной или переменной ширины; их можно также
использовать для обычных наборов символов, но такое бывает редко. Итак, в
любых целях, NVARCHAR2 — многобайтовый эквивалент VARCHAR2 для
набора NLS. В Oracle их длина может достигать 4000 байт.
NUMBER(£, P) Они всегда хранятся как данные переменной длины, где
один байт используется для хранения образца, один байт — для каждых двух
значащих цифр мантиссы числа, и один байт — для отрицательных чисел,
если число значащих цифр меньше 38 байт.
Совет Мантисса — десятичная часть логарифма. Oracle использует
логарифм числа для хранения двоичной версии числа, чтобы оно занимало меньше
места.
DATE Хранится поле с фиксированной длиной 7 байт. На самом деле, в
Oracle формат DATE включает не только дату, но и время, и эта информация
хранится внутри как число. Можно применять любые маски форматирование,
520
Глава 14
какие вам только нужны, и получать дату в соответствующем виде. По
умолчанию, Oracle показывает информацию о дате как ДДММ-ГГ, или дату из двух
цифр, после которой идут три буквы, обозначающие месяц, и две цифры года.
Обратите внимание, что внутри Oracle дата хранится как число, в котором год
представлен четырьмя цифрами. Представление года по умолчанию двумя
цифрами — это только маска форматирования. Этот формат можно легко
изменять на уровне системы или сеанса с помощью команды alter [systeml
session] set nls_date_format 'mask1, где mask замещается
фактической маской формата.
RAW(£) Этот тип данных содержит небольшое число двоичных данных. В
Oracle не производится никаких преобразований необработанных данных.
Необработанные данные просто хранятся, как они есть. В столбце RAW может
содержаться до 2000 байт.
ROWID Этот тип данных используется для хранения информации
идентификатора строки. ROWID — 10-байтовая строка, которая указывающая
местоположение данных строки в файле данных.
Сравнение типов данных LONG, LONG RAW и LOB
Oracle может хранить очень большие объемы информации в столбцах,
использующих также другие скалярные типы данных. Есть несколько типов данных,
некоторые из которых поддерживаются, главным образом, для обратной
совместимости. Ниже приводятся типы данных, доступные в Oracle для
хранения очень больших объемов данных в одном столбце:
■ LONG Хранит до 2 Гбайт текстовых данных.
■ LONG RAW Хранит до 2 Гбайт двоичных данных.
■ BLOB Хранит до 4 Гбайт двоичных данных.
■ CLOB и NCLOB Хранят до 4 Гбайт текстовых данных; NCLOB — это
большой тип данных NLS с фиксированной шириной.
■ BFILE Хранит до 4 Гбайт неструктурированных данных в файлах
операционной системы.
Несколько ключевых различий между типами LONG и LOB делают типы
LOB более универсальными и полезными для управления большими
объектами. Во-первых, в таблице может быть только один столбец LONG, потому что
данные столбца LONG хранятся как, однорядные (inline), т.е. все данные в
столбце LONG для каждой строки в таблице хранятся в непрерывных блоках данных
внутри сегмента, используемого для хранения данных этой таблицы. Напротив,
столбцов LOB в таблице может быть много, потому что, когда значение LOB
превышает 4000 байтов, только локатор для типа LOB хранится в одном ряду с
данными таблицы — другими словами, ни один LOB не потребует более 4000
байтов пространства, в одном ряду с другими данными таблицы. Остальная
часть данных в столбцах LOB хранится в сегменте переполнения. Таким
образом, команды select для столбцов LONG возвращают фактические данные, а
та же самая команда для столбца LOB возвращает только локатор. Oracle
поддерживает использование типов LOB в объектных типах, кроме NCLOB, a
LONG — нет. Кроме того, LOB может быть больше LONG — 4 Гбайт для L0B
против 2 Гбайт для LONG. К данным LOB можно также обращаться "по
кускам" (piecewise), а к LONG доступ последовательный; в столбце LONG можно
получить только полное значение, а в LOB можно получать части.
Типы данных "коллекция"
Коллекция (collection) — сбор аналогично определенных элементов. В Oracle
существует два типа "коллекция". Первый называется массивом переменной
длины (VARRAY). Его можно считать упорядоченным списком объектов того
же самого типа данных. VARRAY имеет два специальных атрибута (в дополне-
Управление объектами базы данных
521
ние к атрибутам в объектах, содержащих VARRAY). Эти признаки — счет
(count) для числа элементов в VARRAY и предел (limit) для максимального числа
элементов, которые могут появляться в VARRAY. Хотя VARRAY может иметь
любое число элементов, необходимо предварительно задать предел. Каждый
элемент в VARRAY имеет индекс — число, соответствующее позиции
элемента в массиве. Для элементов VARRAY нельзя создавать ограничения и
значения по умолчанию, и после создания VARRAY пользователь обращается
только к одному элементу в VARRAY с помощью PL/SQL (хотя для доступа ко
всему VARRAY может использоваться SQL).
Другой тип коллекции называется вложенной (nested) таблицей, и его
можно считать таблицей в таблице. Архитектура вложенной таблицы прекрасно
подходит для приложений, которые имеют родительские/дочерние таблицы со
ссылочной целостностью. Вложенная таблица — неупорядоченный список
записей строки, причем все они имеют одинаковую структуру. Эти строки
обычно хранятся вне таблицы, с указателем контрольной точки из
соответствующей строки в родительской таблице на дочернюю таблицу. Подобно VARRAY,
вложенные таблицы могут иметь любое число элементов, и, кроме того, не
нужно предварительное определять максимальный предел.
Ссылочные и определяемые пользователем типы данных
И, наконец, рассмотрим ссылочные и определяемые пользователем типы
данных. Разработчики могут использовать ссылочный тип для определения
отношения внешнего ключа между двумя объектами. Ссылочный тип может
ссылаться на все столбцы в таблице для определенной строки — это указатель на
определенный объект, а не сам объект. Определяемые пользователем типы —
это абстрактные типы данных или сочетания существующих скалярного или
других типов, которые можно определить для очень узких целей в Oracle. Как
правило, они состоят из скалярной коллекции или других определяемых
пользователем типов.
Закрепление пройденного материала
1. Существует две общих категории типов данных — встроенные и
определяемые пользователем. Встроенные типы включают такие типы данных, как
скалярные, ссылочные и коллекции. Определяемые пользователем типы —
это специализированные составные типы данных, создаваемые для себя с
помощью существующих встроенных типов.
2. Убедитесь, что можете объяснить разнице между имеющимися в Oracle
типами данных LONG и LOB для хранения очень больших объемов
данных в одном столбце. Типы LOB дают несколько преимуществ и являются
предпочтительным типом. Тип LONG поддерживается для обратной
совместимости.
Упражнения
1. Этот тип данных может хранить 2000 байт символьных данных,
дополняемых пробелами до полной ширины столбца; .
2. В Oracle можно хранить до (А) байт данных в столбце
RAW и до 4000 байт в столбце (В) .
3. Внутри Oracle информация DATE хранится как .
4. (А) является типом данных большого объекта, способным
хранить до (В) Гбайт двоичных данных. Аналогично, CLOB — тип
данных большого объекта, способный хранить (С) данные.
522
Глава 14
Ответы
1. CHAR. 2. (А) 2000; (В) VARCHAR2. 3. Число. 4. (A) BLOB; (В) 4; (С) текстовые.
Расширенные и ограниченные ROWID
Напомним, что ROWID используются в Oracle для указания местоположения
строки внутри базы данных. ROWID — не адреса в памяти или на диске;
скорее, они — идентификаторы, которые Oracle может использовать для
вычисления местоположения строки в таблице. Поиск строки таблицы с помощью
ROWID — самый быстрый способ найти строку в таблице. Хотя к
информации ROWID можно обратиться как другим столбцам в таблице, ROWID не
хранится явно, как значение столбца. Когда пользователи добавляют новые
строки к базе данных, Oracle создает ROWID для идентификации уникального
местоположения этой строки в базе данных. Конкретный ROWID зависит от
разных факторов, включая:
■ Файл данных, содержащий таблицу, к которой добавлена конкретная
строка
■ Сегмент, соответствующий объекту, в котором будет сохранена строка
■ Блок внутри сегмента, который будет содержать строку
■ Слот или местоположение внутри блока Oracle, в котором будет храниться
строка.
Приведенный выше список соответствует компонентам информации,
используемой Oracle для создания ROWID с помощью расширенного формата
ROWID, чей размер равен 16 байт и содержит эти четыре компонента. Этот
формат был представлен в Oracle 8.0.3 для преодоления ограничения на
дисковое пространство, к которому могли обращаться предыдущие версии Oracle. В
версиях Oracle после 8.0.3, Oracle использует 80 битов (10 байт) для хранения
расширенного ROWID. ROWID состоит из четырех компонентов: номер
объекта (32 бита), относительный номер файла (10 битов), номер блока (22 бита)
и номер строки (слота) (16 битов). Расширенный ROWID отображается как
18-символьное представление местоположения данных в базе данных, причем
каждый символ представлен в формате base-64, включающем символы от А до
Z, а до z, цифры от ноля до девяти, + и /. Первые шесть символов
соответствуют номеру объекта данных, следующие два — относительному номеру файла,
следующие пять — номеру блока и три последних — номеру строки. При
использовании расширенного ROWID Oracle может обращаться к строкам в
таблицах так, что размер базы данных может стать практически безграничным.
Следующий блок кода демонстрирует расширенный формат ROWID:
«аистяя SQL> select name, ROWID from employee;
NAME ROWID
DURNAM AAAA3kAAGAAAAGsAAA
BLANN AAAA3kAAGAAAAGsAAB
Ограничение, о котором мы ранее упоминали, было вызвано
ограниченным форматом ROWID, используемым в выпусках программного
обеспечения базы данных до Oracle 8.O.3. Исторически, Oracle использовала для
ROWID 6-байтовый формат, теперь он считается ограниченным, потому что
не хранит номер объекта для таблицы, в которой будет находиться строка.
Этот формат использовался в старших версиях Oracle, т.к. в то время все
файлы данных в Oracle имели уникальный номер файла в пределах базы данных,
независимо от табличного пространства, к которому файл принадлежал.
Напротив, в Огас1е8/и в более поздних выпусках файлы данных нумеруются
относительно табличного пространства, которому они принадлежат.
Ограниченные ROWID отображались как 18 символьные в формате base-16, где первые 8
символов представляют номер блока, символы с 10 по 13 — номер строки, а
символы с 15 по 18 — (абсолютный) номер файла. Символы с 9 по 14 —
статические символы разделителя.
Управление объектами базы данных
523
Получив благодаря расширенным ROWID дополнительные
функциональные возможности, можно спросить, а зачем Oracle вообще беспокоится об
ограниченных ROWID. Действительно, ограниченные ROWID используются
редко, но за одним исключением. Ограниченный формат ROWID все еще
используется для размещения строк в неразделенных индексах для
неразделенных таблиц, где все индексные элементы обращаются к строкам в одном и том
же сегменте, устраняя, таким образом, любую неопределенность в отношении
номеров файлов, потому что сегмент можно хранить в одном и только одном
табличном пространстве.
Совет Можете считать это глупостью, но вот как можно запомнить
компоненты ROWID в Oracle. В Oracle!компонентами являются ID блока,
номер строки и номер файла, что дает нам аббревиатуру БСФ. В Oracle9i
компоненты — ID объекта, ID блока, номер строки, и относительный
номер файла, т.е. ОБСОФ. Осталось запомнить эти аббревиатуры.
Закрепление пройденного материала
1. ROWID — адреса, указывают на местоположение строки на диске
относительно файла, блока, номера строки и номера объекта данных.
2. Версии Oracle до 8.0.3 используют ограниченный формат ROWID.
Текущие версии Oracle все еще используют этот формат для очень
ограниченных целей.
3. Начиная с Oracle 8.0.3, Oracle также использует расширенный формат
ROWID, позволяющий базе данных обращаться к большему пространству
на диске, чем это допускалось раньше. Это заметно увеличивает
пространство, до которого может дорасти база данных Oracle.
Упражнения
1. Вы можете запросить ROWID строки так же, как любой другой столбец.
(Истина /Ложь).
2. Расширенный формат ROWID использует формат ROWID размером
(А) байтов, где каждый символ в ROWID находится в формате Ьа-
se-_(B)_.
3. Напротив, ограниченный формат ROWID использует формат ROWID
размером (А) байтов, где каждый символ в ROWID находится в формате
base- (В) .
4. Основное различие между расширенным и ограниченным форматами
ROWID вытекает из того факта, что более ранние версии Oracle требовали,
чтобы все номера файлов данных были (А) в базе данных, а в
более поздних версиях Oracle номера файлов данных (В)
табличному пространству, частью которого^является файл данных.
Ответы
1. Истина 2. (А) 10; (В) 64. 3. (А) 6; (В) 16.4. (А) уникальными; (В) относительными.
Структура блоков данных и строк
Основа основ управления памятью -^ способность Oracle дать вам
возможность управлять пространством в блоке данных. Размер блока определяется
при создании базы данных параметром инициализации DB_BLOCK_SIZE,
который задается для экземпляра во время создания базы данных. Размер
блока данных почти всегда кратен размеру блока операционной системы. Как
правило, в операционной системе используется размер блока 512 или 1024
байт. Следовательно, блоки Oracle — группа блоков операционной системы.
524
Глава 14
I'iic. 14-1.
Структура блоков
данных и строк
в Oracle
Размер блока Oracle может быть от 2048 до 16384 байт (даже больше для
некоторых операционных систем), причем для большинства баз данных Oracle
наиболее распространенный размер — 8192 байт. Чтобы разобраться с
блоками данных, давайте поподробнее исследуем их содержание. Внутри каждого
блока данных базы данных Oracle существует несколько различных
компонентов. На рис. 14.1 представлена структура блоков и строк в Oracle. Эти
компоненты свободно распределяются в следующих областях:
Длина = 1 байт Длина = 3 байта Длина = 0 байт
Заголовок строки Столбец < 250 байт Столбец > 250 байт Столбец NULL
Структура строки
Заголовок блока и информация каталога Каждый блок имеет заголовок
блока с информацией о блоке, включая информацию о таблице, которая
владеет блоком и данные строки, которая содержится в блоке.
Свободное пространство Это пространство, зарезервированное для роста
существующих строк в блоке, оно определяется используемым при
создании объекта параметром pctf гее.
Пространство, занятое существующими строками Каждый раз, когда к
объекту добавляется строка, Oracle помещает ее строку в блок. Сколько
доступного для строк пространства можно добавить зависит от значения
DBBLOCKSIZE, минус пространство, занятое заголовком блока, минус
пространство, зарезервированное значением pctf гее.
Взгляд на сами строки
Данные строки состоят из фактических строк каждой таблицы данных.
Каждая строка в таблице имеет заголовок. Заголовок строки (row header) хранит
информацию о номере столбца в строке, информацию о Сцеплении и текущее
состояние блокировки для строки. За заголовком строки идут сами данные
строки. Данные строки состоят из строк каждой таблицы данных. Данные
строки распределяются по столбцам, или данным столбцов. Данные столбцов
для каждой строки хранятся в том порядке, в котором были определены
столбцы таблицы. Кроме того, наряду с данными, кроме столбца NULL, хранится
поле с указанием ширины (width) столбца. Если значение столбца для этой
строки равно NULL, в блоке для этого столбца строки нет никакого поля с
указанием ширины или значения столбца, и не отводятся байты для хранения
значений столбца NULL. Следовательно, теперь понятно, почему необходимо
Управление объектами базы данных
525
поддерживать с помощью pctf гее свободное пространство для роста строки.
Поле ширины столбца равно 1 байту, ее значение для столбца менее 250 байт,
и равно 3 байт, если значение столбца больше или равно 250 байт. В обоих
случаях Oracle хранит число, указывающее ширину значения столбца для
данной строки, только когда значение столбца не NULL.
Закрепление пройденного материала
1. Блоки состоят из трех компонентов: заголовка блока, данных строки и
зарезервированного свободного пространства для размещения прироста
существующей строки.
2. Сами строки состоят из заголовка, данных столбца и поля, указывающего
ширину каждого столбца.
3. Если в столбце не содержится данных о конкретной строке, Oracle не
тратит место в блоке, сообщающем такой факт. Наоборот, там ничего не
хранится.
Упражнения
1. Каждый блок в базе данных Oracle состоит из (А) , (В)
и (С) .
2. Если в конкретной строке для столбца хранится ненулевое (не NULL)
значение, размер поля ширины будет (А) байт, если значение
столбца меньше 250 байт в ширину, или (В) байт, если значение
столбца больше или равно 250 байт в ширину.
3. Поле ширины значения столбца не сохраняется для строки со значением
столбца .
Ответы
1. (А) заголовка блока; (В) данных строки; (С) свободного пространства. 2. (А) 1; (В) Э.
3. NULL.
Создание постоянных и временных таблиц
Напомним, что из "ОСР Огас1е9/ Introduction to SQL exam" вы узнали, как
создать постоянные и временные таблицы с помощью команды create table.
В этой книге мы займемся повторением. Но, при этом мы обсудим различные
соображения относительно управления памятью. Как вы помните из
обсуждения создания табличного пространства, мы рассматривали использование
фразы default storage. Параметры этой фразы применяются к
помещаемым в это табличное пространство объектам, созданным без нее. Теперь мы
поподробнее обсудим фразу storage, которую можно определить для
создаваемого объекта.
Создание постоянных таблиц
Давайте рассмотрим создание постоянной или стандартной таблицы в Oracle.
Вы создаете таблицу с помощью команды create table. Допустим, в целях
использования фразы storage, вы помещаете таблицу в управляемое
словарем табличное пространство. Позже мы обсудим, как можно определить при
создании таблиц локально управляемое табличное пространство и показатель
управления однородными экстентами во фразе storage. В следующем блоке
кода приводится пример команды create table:
ЁЙШЙЙ CREATE TABLE EMPLOYEE
(empid lastname NUMBER(IO),
lastname VARCHAR2 (25),
firstname VARCHAR2 (25),
526
Глава 14
salary NUMBER(10,4),
CONSTRAINT pk_employee_01
PRIMARY KEY (empid))
TABLESPACE data
PCTTREE 20 PCTDSED 50
INITRANS 1 MAXTRANS 255
ЫОСАСНЕ LOGGING
STORAGE ( INITIAL 100K NEXT 150K
MINEXTENTS 4 MAXEXTENTS 300
PCTINCKEASE 20 )
Ключевое слово tablespace указывает, в каком табличном пространстве
Oracle должна создать таблицу. Если не определить эту фразу, Oracle поместит
таблицу в табличное пространство по умолчанию, которое было назначено
вам при создании идентификатора пользователя use rid. Следующие две
фразы нужны для использования пространства. Напомним, что ключевое слово
pctf гее определяет пространство, оставляемое Oracle свободным при вставке
строк, чтобы позднее размещать в нем прирастающую в связи с
модификациями информацию. Опция pctused определяет пороговое значение в процентах
для блока, который содержит данные строки; Oracle считает блок свободным
для вставки новых строк, только если фактический показатель ниже этого
значения.
Следующие две фразы, связанные с использованием пространства —
initrans и maxtrans — управляют способностью Oracle выполнять
параллельные модификации блока данных. Опция initrans определяет начальное
число транзакций, которые могут одновременно обновлять строки в блоке
данных, a maxtrans определяет максимальное число таких транзакций. Как
правило, для этих опций следует сохранять значения по умолчанию. Для
initrans значение по умолчанию для таблиц — 1, а для кластерных таблиц — 2. Для
maxtrans значение по умолчанию для таблиц — 255.
Фраза nocache указывает, что Oracle не должна делать эти блоки
постоянными в буферном кэше, если в результате команды select таблица
просматривается полностью. В нашем примере select * from employee привела бы
к тому, что Oracle загрузила бы блоки в буферный кэш так, чтобы они не
слишком долго, находились там. Если бы потребовалось сохранить таблицу в
буферном кэше при введенной команде select * from employee, вместо
этого следовало определить ключевое слово cache. Значением по умолчанию
является nocache, дающее указание помещать найденные для этой таблицы
блоки в конец списка LRU (с наиболее давним использованием) в буферном
кэше, когда таблицы просматриваются полностью.
Следующая фраза, logging, дает Oracle указание отслеживать создание
таблицы в журнале базы данных так, чтобы в случае дискового сбоя таблица
могла быть восстановлена. Это значение по умолчанию. Однако его можно
изменить на nologging, и после загрузки данные не будут регистрироваться в
файле журнала базы данных, что удобно при создании таблицы и некоторых
типах загрузок больших массивов данных, после которых администратор БД
планирует провести резервное копирование. Наконец, можно определить
фразы storage для создания таблицы, которые перезапишут заданные по
умолчанию настройки памяти табличного пространства, в котором создается
объект. Единственное значение по умолчанию для табличного пространства,
которое не отменит ваша фраза storage, — minimum extent.
Практические способы управления памятью таблиц
для экзамена "Основы АБД Г
Ознакомьтесь со следующими практическими способами создания таблиц и
запомните их для экзамена:
■ Таблицы находятся в иных, чем сегменты отмены, временные сегменты,
индексные сегменты, табличных пространствах и не входят в табличное
пространство SYSTEM.
Управление объектами базы данных
527
■ Коллекция дополнительных для таблиц стандартных размеров экстентов
или назначение однородных экстентов позволит свести к минимуму
фрагментацию табличного пространства. Назначение однородных экстентов
используется в Огас1е9/ по умолчанию, хотя в целях соблюдения
параметров назначения для initial или next во фразе storage из команды
create table Oracle назначит несколько экстентов одного размера.
■ Помните, что при полном просмотре таблицы команда cache продолжает
считывать блоки в буферный кэш, причем значительно дольше, чем в
иных ситуациях. Если вы часть обращаетесь к маленькой справочной
таблице, лучше хранить ее в памяти, задав фразу cache, или введя alter
table lookup_tblname кэш
Совет В Oracle9i все таблицы по умолчанию созданы как локально
управляемые таблицы в отличие от предыдущих версий, где по умолчанию таблицы
создавались как управляемые словарем.
Создание временных таблиц
Временные таблицы создаются с помощью команды create global
temporary table name ( tbldef ) on commit [delete | preserve] rows statement. В
определении таблицы tbldef может использоваться любое из определений
столбца или ограничения, допустимые для постоянной таблицы, и в поддержку
первичного или уникального ключа будут генерироваться связанные
временные индексы. Данные во временной таблице хранятся в памяти, внутри области
сортировки. Таким образом, если требуется много пространства, используются
временные сегменты из вашего временного табличного пространства. Если
задано on commit delete rows, данные во временной таблице (наряду с
данными в любом связанном индексе) очищаются завершения транзакции. Если
задано on commit preserve rows, строки будут храниться в таблице, пока
создавший временную таблицу пользователь не закончит сеанс. В течение этого
периода можно использовать временную таблицу так же, как вы использовали
бы любую другую таблицу. Если фраза on commit не определена, по умолчанию
Oracle будет использовать on commit delete rows. Давайте рассмотрим
пример, где пользователь SCOTT создает и использует временную таблицу:
мтяЕИШб SQL> connect scott/tiger
Connected.
SQL> create global temporary table mytemptab
2 (coll number,
3 col2 varchar2 (30))
Table created.
SQL> insert into myteaptab values (I,JUHK');
1 row created.
SQL> select * from mytemptab;
COL1 COL2
1 JUNK
SQL> commie;
Commit complete.
SQL> select * from mytemptab;
no rows selected
Теперь давайте посмотрим, как используется временная таблица, в
которой данные должны быть постоянными в течение сеанса:
МйЕИК*8 SQL> connect scott/tiger
Connected.
SQL> create global temporary table T_TABLE
2 coll number,
3 col2 varchar2(20))
4 on commit preserve rows;
Table created.
SQL> insert into t_table values (1, 'JUNK');
1 row created.
SQL> select * from t_table,
COL1 COL2
1 JUNK
528
Глава 14
JUNK
SQL> commit;
Commit complete.
SQL' select * from t_table;
C0L1 COL2
1 JUNK
SOL> connect turner/ike
Connected.
SQL> connect scott/tiger
Connected.
SQL> select * from t_table;
no rows selected
Соображения при использовании временных таблиц
Как только что было сказано, созданную пользователем SCOTT временную
таблицу могут также использовать и другие пользователи. Только они не будут
видеть данные пользователя SCOTT. Аналогично, SCOTT не будет видеть их
данные. Кроме того, если SCOTT введет команду truncate table
MYTEMPTAB, будут удалены только его данные. Данные других
пользователей останутся в таблице. К временной таблице можно присоединять
постоянные таблицы и создавать такие объекты, как представления, индексы и
триггеры, которые формируют зависимость объекта от временной таблицы. Однако
нельзя создать представление, содержащее объединение между временными и
постоянными таблицами. Команда create global temporary table не
регистрирует повторы^ и временные изменения данных в таблице нельзя
восстановить. Однако произведенные во временных таблицах изменения данных
сгенерируют информацию отката, это позволит Oracle сделать откат
транзакции и, следовательно, временных данных таблицы при сбое экземпляра.
Столбцы TEMPORARY и DURATION в представлении DBA_TABLES
указывают, является ли таблица временной, и сколько будут существовать данные в
таблице.
Временные таблицы и память
Oracle хранит временные данные таблицы во временных сегментах
временного табличного пространства. Поскольку Oracle равномерно назначает
сегменты временного табличного пространства, как правило, можно не волноваться
об определении фразы storage при создании временного табличного
пространства. Вместо этого, администратор БД должен сосредоточиться на том,
действительно ли данные во временной таблице сегмент должны быть
постоянными в течение транзакции или сеанса.
Закрепление пройденного материала
1. Убедитесь, что можете создавать в Oracle таблицы с соответствующими
параметрами памяти.
2. Сумейте описать концепцию, лежащую в основе временных таблиц в Oracle.
Необходимо знать цели, которым они служат в отношении хранения
информации о сеансе, общедоступности для всех пользователей, сохранения
данных в течение транзакции или сеанса.
3. Надо знать, как создать временные таблицы в Огас1е9/, включая
определение периода времени для сохранения данных во временной таблице.
Кроме того, надо знать, где найти информацию о временных таблицах в
Огас1е9/.
Упражнения
1. Ваше табличное пространство DATA управляется локально и использует
назначение однородных экстентов. Вы вводите следующую команду:
Управление объектами базы данных
529
CREATE TABLE EMPLOYEE
(empid
lastnarae
firstname
salary
CONSTRAINT
PRIMARY KEY
TABLESPACE
PCTFREE
INITRANS
NOCACHE
STORAGE (
data
20
1
NUMBER(IO),
VARCHAR2 (25),
VARCHAR2 (25),
NUMBER(10,4),
pk_emplо уee_01
(empid))
PCTOSED 50
MAXTRANS 255
LOGGING
INITIAL 10OK NEXT
150K
MINEXTENTS 4 MAXEXTENTS 300
PCTINCREASE 20 ) ,-
Какое из следующих суждений является истинным в отношении только
что созданной таблицы?
А.Таблица создана в том же самом табличном пространстве, где будут
размещены временные сегменты.
В. Первый назначенный этой таблице сегмент будет равен 100 Кбайт
непрерывных блоков.
С Для создания этой таблицы будет сгенерирована информация о
повторе.
D. При полном просмотре таблицы EMPLOYEE блоки из таблицы будут
еще долго храниться в буферном кэше после выполнения команды.
2. Пользователь FITZPATRICK создает временную таблицу, используя
следующую команду:
SQL> create global temporary table FITZTEMPTAB
2 (name varchar2(10), value number, use_date date)
3 on commit delete rows;
Table created
Затем FITZPATRICK сообщает пользователям
MCGILLICUDDY и OBRYAN о своей временной таблице. Пока каждый
из них подключен к Огас1е9/ и заполняет таблицу FITZTEMPTAB,
OBRYAN вводит команду truncate table FITZTEMPTAB. У какого из
следующих пользователей в результате этого действия удалятся записи из
временной таблицы?
A. Только у FITZPATRICK
B. Только у OBRYAN
C. Только у OBRYAN и FITZPATRICK
D. У OBRYAN, FITZPATRICK, и MCGILLICUDDY
3. Пользователь FITZGERALD вводит следующую команду для таблицы
FITZTEMPTAB, созданной с помощью блока кода, приведенного в
вопросе 1: update fitztemptab set name = 'MYCHANGE' where value = 55.
Какой из следующих аспектов базы данных Oracle совершенно точно не
будет использовать в рамках этой операции?
A. Область сортировки
B. Табличное пространство TEMP
C. Процесс LGWR
D. Сегмент отката, назначенный транзакции
4. Пользователь OBRYAN добавляет запись в таблицу FITZTEMPTAB,
определенную с помощью блока кода, приведенного в вопросе 1. В какой
момент будут удалены из временной таблицы данные, добавленные этим
пользователем к таблице FITZTEMPTAB?
A. Когда FITZPATRICK зафиксирует транзакцию
B. Когда OBRYAN зафиксирует транзакцию
530
Глава 14
С Когда OBRYAN выйдет из Огас1е91
D. Когда FITZPATRICK введет truncate table FITZTEMPTAB
Ответы
1. С 2. В. 3. С. 4. В.
Управление структурами памяти в таблице
Как вы помните из предыдущих глав, Oracle автоматически назначает
таблицам новые экстенты, если добавляемый объем данных превышает текущее
выделенное пространство. Команда alter table allocate extent (size
лшп[К|М] datafile 'filename ') позволяет вручную добавить
дополнительное количество экстентов, где лит — размер назначаемого экстента (при
соблюдении предела табличного пространства, определяемого параметром
minimum extent), a filename — абсолютный путь и имя файла данных, в
котором будет храниться экстент. Фразы size и datafile необязательны.
Если не указан size, Oracle использует размер, заданный в опции next из
фразы storage для таблицы. Если исключен datafile, Oracle непосредственно
управляет размещением. Эта команда полезна для управления
распределением экстентов перед загрузкой больших массивов данных.
ИУИВИ» ALTER TABLE EMPLOYEE ALLOCATE EXTENT;
ALTER TABLE EMPLOYEE ALLOCATE EXTENT ( SIZE 2 0OK )
ALTER TABLE EMPLOYEE ALLOCATE EXTENT
(DATAFILE '/ulO/oradata/oracle/dataOS.dbf'
Верхняя отметка таблицы и неиспользованное пространство
Теперь рассмотрим, как Oracle позволяет узнать о размере таблицы.
Специальный маркер высокая отметка (high-water mark) указывает на последний
блок, в котором содержались данные таблицы. По мере заполнения блоков
данных с помощью команды insert, Oracle перемещает верхнюю отметку все
дальше и дальше, чтобы она указывала на последний используемый блок.
Верхняя отметка хранится в заголовке сегмента таблицы и используется для
определения, где следует прекратить считывать блоки во время просмотра всей
таблицы. Верхнюю отметку для таблицы можно найти с помощью процедуры
unusedspace ( ) из пакета DBMS_SPACE, поставляемого с Oracle или в
представлении словаря DBATABLES после выполнения команды analyze
для этой таблицы. Ниже мы подробнее рассмотрим analyze и представление
словаря, содержащее информацию о таблице.
И. наконец, если требуется устранить назначенное таблице
неиспользованное пространство, можете ввести alter table tblname deallocate
unused keep лит[к | м], где keep — дополнительная фраза, позволяющая
сохранять неиспользованное пространство в размере num. Фраза keep
определяет, сколько байтов следует сохранить выше верхней отметки. Если команда
используется без фразы keep, сервер Oracle освободит все неиспользованное
пространство выше верхней отметки. Если верхняя отметка в экстенте ниже
значения minextents, сервер Oracle освободит экстенты выше minextents.
МЯгаЗаИЙ ALTER TABLE EMPLOYEE DEALLOCATE UNUSED;
ALTER TABLE EMPLOYEE DEALLOCATE UNUSED KEEP 10K;
Миграция строк и формирование цепочки
Если значение pctf гее слишком мало для блоков в таблице, команды update
могут столкнуться с проблемой недостаточного пространства в блоке из-за
увеличения размера такой строки. Таким образом, Oracle должна переместить
строку в другой, подходящий для таких изменений блок. Миграция (migration)
строк снижает производительность, т.к. серверный процесс пытается найти
мигрировавшую строку, а она, оказывается, находится в другом месте.
Управление объектами базы данных
531
Формирование цепочки также отрицательно сказывается на
производительности базы данных. Формирование цепочки (chaining) — это хранение данных
для одной строки в нескольких блоках. Это распространенный побочный
эффект в таблицах, столбцы которой имеют тип данных LONG, потому в таких
столбцах данные хранятся в одном ряду с остальной частью таблицы.
Серверный процесс сегмент должен собирать по частям одну строку данных с
помощью нескольких операций считывания с диска. Кроме того, DBWR снижает
производительность, выполняя множественные операции записи на диск
только для одной строки данных.
Проверка целостности и миграции
с помощью анализа таблиц
Как правило, каждый раз, когда блок читается в буферный кэш для
пользовательских процессов, Oracle автоматически обрабатывает проверку
правильности структуры каждого используемого блока данных. Однако для проверки
достоверности структурной целостности блоков данных можно сделать две
вещи. Во-первых, использовать параметр DB_BLOCK_CHECKSUM из файла
initsid.ora. Настройка этого параметра как TRUE заставляет процесс
DBWR вычислять контрольную сумму для каждого записываемого им блока,
независимо от табличного пространства, что является дополнительной мерой
защиты целостности блоков в базе данных. Кроме того, Oracle вычисляет
контрольные суммы для блоков, записываемых оперативными файлами журнала
базы данных. Когда этот параметр установлен как FALSE, процесс DBWR
вычисляет контрольные суммы только при записи блоков в табличное
пространство SYSTEM. Процесс вычисления контрольных сумм приводит к росту
накладных расходов, по сравнению с нормальной работой базы данных.
Необходимо выбирать между этими дополнительными накладными расходами
производительности и гарантиями, что блоки данных не повреждены.
Второй метод проверки целостности можно использовать в любое время с
помощью команды analyze table tblname validate structure.
Дополнительная фраза cascade в этой команде проводит дополнительную проверку
достоверности структуры блоков в индексах, связанных с таблицей. Команда
analyze вводится из SQL*Plus для одной таблице за раз.
Использование команды analyze
для обнаружения миграции строк
Основное использование команды analyze — выявление статистики
производительности для основанной на стоимости оптимизации обработки
команд SQL в Oracle. Дополнительное преимущество команды analyze в
том, что она также выявляет миграции строк в таблице. У этой команды есть
две основные фразы: estimate statistics и compute statistics.
Последняя из них оценивает собранную для таблицы статистику на основании
выборки данных, которая указывается (но необязательно) с помощью фразы
sample num [rows | percent] При отсутствии фразы sample Oracle
использует 1064 строки. Фраза compute statistics вычисляет совокупость
статистических данных для таблицы статистику на основании каждой строки
в таблице. Oracle рекомендует использовать estimate statistics, а не
compute statistics, потому что она обеспечивает почти такую же
точность, а времени требует меньше.
После генерации статистических данных в столбце CHAIN_CNT в
представлении словаря DBA_TABLES появляется число сцепленных и
мигрировавших строк, оцененных или найденных в таблице. Если это число кажется вам
высоким, проблема устраняется с помощью сохранения данных таблицы,
удаления таблицы, ее восстановления и перезагрузки данных. Помните что,
формирование цепочки до некоторой степени допустимо, особенно если строки
широкие (например, в них много VARCHAR2 (4000) столбцов или столбцов
LONG). Наконец, если требуется подтверждать целостность в рабочем порядке
532
Глава 14
в рамках приложения PL/SQL, можно разработать код, вызывающий
процедуры analyze _schema О в модуле DBMS_UTILITYили analyze_ object в
DBMSDDL. Область действия этих процедур очевидна.
Совет Вместо команды analyze статистику можно собрать с помощью
модуля DBMS_STATS. Этот модуль дает некоторые преимущества по
сравнению с командой analyze, особенно для сохранения и повторного
использования статистики в различных базах данных.
Поиск информации о таблицах в словаре данных
Существует несколько представлений словаря данных, где можно получить
информацию о таблицах. Представления словаря отображают эту
информацию на основании своего содержимого для таблиц в базе данных или для
производительности таблиц, собранных во время работы экземпляра. Следует
запомнить следующие представления, содержащие информацию о таблицы:
■ DBA_SEGMENTS Дает информацию об имени, местоположении
табличного пространства и владельце сегментов, содержащих данные
таблицы в Oracle
■ DBA_OBJECTS Дает информацию о номере ID объекта, используемого
для определения ROWID строк в таблице, также временной метки
создания таблицы для определения зависимостей
■ DBA_TABLES Дает информацию обо всех параметрах памяти таблицы,
а также статистики, собранной в рамках операции analyze для этой
таблице
■ DBA_EXTENTS Дает информацию о числе назначенных таблице
экстентов, о файлах данных, в которых они хранятся, и о размере каждого
экстента
■ DBA_TAB_COLUMNS Дает информацию о каждом столбце в каждой
таблице, включая тип данных, размер, точность, позицию столбца в каждой
строке и возможности значения NULL
■ DBA_TAB_COMMENTS Дает информацию комментария для каждой
таблицы, если информация комментария сохранена
■ DBA_COL_COMMENTS Дает информацию комментария для каждого
столбца в каждой таблице, если информация комментария сохранена
Ввиду огромного числа комбинаций этих данных мы не будем приводить
пример команды SQL. Вместо этого рассмотрим возможные сочетания.
Например, требуется определить, уместилась ли чрезвычайно большая таблица в
одном файле данных, тогда можно обратиться к представлению
DBAEXTENTS. Если требуется определить, что произошло со строками: из
них была сформирована цепочка или они мигрировали в вашей таблице,
можно обратиться к представлению DBAJLABLES. Если требуется посмотреть,
сколько в таблице неиспользованного пространства, можно также обратиться
к представлению DBA_TABLES. Помните, что при этом столбцы, к которым
вы обратились бы из DBA_TABLES, будут заполнены только, если для этой
таблицы была выполнена команда analyze. Если эти столбцы имеют
значение NULL, выполните analyze, чтобы свести в таблицу необходимые вам
данные.
Закрепление пройденного материала
1. Убедитесь, что понимаете процесс распределения вручную
дополнительного числа экстентов таблице.
2. Следует знать имя представления, в котором можно узнать дату/время
создания таблицы и где можно посмотреть, были ли строки в таблице
сформированы в цепочку или мигрировали.
Управление объектами базы данных
533
3. Следует понимать, что такое верхняя отметка и как ее устанавливать.
4. Следует понимать, что такое фрагментация. Фрагментация может
проявляться многими способами, а миграция строк — одна из серьезных проблем
фрагментации.
Упражнения
1. Миграция строк в Oracle выявляется с помощью команды .
2. Дополнительные экстенты назначаются таблице с помощью команды
Ответы
1. analyze.
2.
alter
table
allocate
extent.
Реорганизация, усечение и удаление таблиц
Раньше перемещение таблицы в другое табличное пространство было
нелегкой задачей, для этого приходилось использовать инструмент EXPORT,
который создавал файл дампа, содержащий строки таблицы, а также определения
таблицы. Если они включали индексы или ограничения, их тоже приходилось
сбрасывать в файл с помощью этого инструмента. Генерация дампа экспорта,
как правило, не доставляла хлопот, но загрузка таблицы обратно в другое
табличное пространство с помощью утилиты IMPORT была не из легких. После
экспорта приходилось удалять таблицу из базы данных Oracle, затем
восстанавливать ее в другом табличном пространстве. Затем надо было запустить
IMPORT с параметром IGNORE равным Y, чтобы при выполнении IMPORT
не было сбоя, если выяснится, что таблица уже существует. При пропуске
этого шага IMPORT просто загружала таблицу обратно в то же табличное
пространство, в котором оно хранилось раньше. И, что еще хуже, если таблица не
существовала, IMPORT загружала объект в табличное пространство по
умолчанию для пользователя, под чьим именем вы выполняли IMPORT, а это, при
невнимательности, могло привести к загрузке таблицы в табличное
пространство SYSTEM. Возможно, вместо этого вы пользовались SQL*Loader или
командой create table as select с неявно определенными фразами
storage и tablespace, но на выполнение обеих опций уходило довольно много
времени.
Перемещение таблиц в Oracle: основная идея
В настоящее время Oracle предлагает отличное свойство для перемещения и
реорганизации таблиц. Можно перемещать таблицу в другое табличное
пространство и реорганизовывать таблицу в целях изменения размера начального
сегмента без утилит IMPORT и EXPORT, и без команды create table as
select. Теперь в Oracle для этих действий используется команда alter
table. Команд alter table move поддерживает следующие фразы:
■ tablespace пате Фраза tablespace позволяет указать местоположение
табличного пространства, в которое вы собираетесь поместить таблицу.
Если фраза пропущена, Огас1е8/ восстанавливает таблицу в новом
сегменте в той же таблице.
■ storage (storagejattributes) Фраза storage позволяет
переконфигурировать аспекты памяти таблицы, например, экстент initial, или рост в
процентах последующих экстентов. Если эта фраза не указана, Oracle
восстановит таблицу с теми же атрибутами памяти, которые использовались
при первоначальном создании таблицы. Учтите, что этот аспект создания
таблицы полезен только для размещения управляемых словарем
табличных пространств, а не локально управляемых табличных пространств.
534
Глава 14
■ logging или nologging Использование ключевого слова logging явно
указывает, что в целях обеспечения восстановления Oracle должна
записать изменения, произведенные командой alter table move, в
оперативные файлы журнала базы данных. В данном контексте для Oracle это
действие по умолчанию. Ключевое слово nologging используется для
того, чтобы Oracle не записывала изменения эти изменения в оперативные
файлы журнала базы данных.
Совет В Oracle Enterprise Edition команда alter table move также
позволяет использовать ключевое слово online, которое разрешает
перемещать или реорганизовывать таблицу, в то время как для использования все
еще доступна старая версия.
Перемещение таблиц в Oracle: Реализация
А теперь, после обсуждения принципа действия alter table move, давайте
разберемся с тем, как использовать эту команду на практике. В первом
примере мы переместим таблицу WORK_TABLE из табличного пространства
USER_DATA в табличное пространство LMTAB:
У^У#к»гая SQL> select owner, table_name, index_name, tablespace_name
2 from dba_tables
3 where table_name = 'WORK_TABLE'
OWNER TABLE NAME TABLESPACE NAME
SCOTT WORKJTABLE USER_DATA
SQL> alter table raytab move tablespace lmtab;
Table altered.
SQL> select owner, table_name, tablespace name
2 from dbajtables
3 where table_name = 'WORKJTABLE';
OWNER TABLE NAME TABLESPACE NAME
SCOTT WORKJTABLE LMTAB
Теперь понятно, где может пригодиться эта команда, особенно это
касается ситуаций, где таблицу требуется вывести из табличного пространства
SYSTEM в более подходящее табличное пространство для определяемых
пользователем таблиц. Однако хотя Oracle сохраняет связанные с таблицами
ограничения, объектные привилегии и триггеры при перемещении таблицы из
одного табличного пространства в другое, команда alter table name move
tablespace tblspcname не перемещает индексы, связанные с этой
таблицей. Рассмотрим следующий блок кода, и вы поймете, что имеется в виду.
fWffifftl SQL> create table TAB_W_INDEXES
'2 (coll number primary key)
3 tablespace system;
Table created.
SQL> select owner, table_name, index_name, tablespace_name
2 from dba_indexes
3 where table_name - 'TAB_W_INDEXES';
OWNER TABLE NAME INDEX NAME TABLESPACE NAME
SCOTT TAB_W_INDEXES SYSJC00953 SYSTEM
SQL> alter table tab_w_indexes
2 move tablespace user_data;
Table altered.
SQL> select owner, table_name, index_name, tablespace name
2 from dba_indexes
3 table_name = 'TABJWJINDEXES';
OWNER TABLE NAME INDEX_NAME TABLESPACE NAME
SCOTT TABWINDEXES SYSJC00953 SYSTEM
Возможности этой команды далеко превосходят аналогичные
функциональные возможности команды create table as select. Давайте рассмотрим
эти функциональные возможности в действии:
ИМ1Й1И SQL> alter index sys_c00953 rebuild tablespace user_data;
Index altered.
Управление объектами базы данных
535
SQL> select owner, table_name, indexname, tablespace_name
2 from dba_indexes
3 where tablename = 'TAB_W_INDEXES';
OWNER TABLE_NAME INDEX_NAME TABLESPACE NAME
SCOTT TAB_W_INDEXES SYSCC0953 L'SER_DATA
Совет Как и при создании таблицы в локально управляемом табличном
пространстве, эти параметры можно найти в DBA_TABLES, но они могут
не работать. Следует проверить фактический размер экстентов в байтах
или блоках в представлении DBA_EXTENTS.
И, наконец, рассмотрим использование фразы alter table move для
реорганизации существующей таблицу в ее первоначальное табличное
пространство. Помните, что Oracle размещает таблицу в новом сегменте в
исходном табличном пространстве, чтобы восстановить распределение памяти
согласно вашим спецификациям. Ее использование показано в следующем
блоке кода:
MJf*flPlffiW SQL> alter table tab_w_indexes
2 move storage (initial 20K next 20K),-
Table altered.
SQL> select owner, table_name, inital_extent, next_extent
2 from dba_tables
3 where table_name = 'TAB_W_INDEXES';
OWNER TABLE_NAME INITAL_EXTENT NEXT_EXTENT
SCOTT TAB_W_INDEXES 20480 204B0
Совет Если Вы реорганизуете большую таблицу и хотите повысить
производительность операции, можно определить ключевое слово no logging в
рамках команды alter table move. Производительность возрастет,
потому что сделанные Oracle8i изменения не будут записываться в
оперативный файл журнала базы данных, но будьте осторожны — восстановить
впоследствии изменения уже будет нельзя.
Соображения по поводу пространства
при перемещении таблиц
Выполнение команды alter table name move требует пространства,
достаточного для существования двух копий таблицы в Oracle8i до завершения
операции, и Огас1е8/ может удалять таблицу. Во время перемещения таблицы,
пользователи могут все еще вводить команды select, позволяющие видеть
данные в таблице, но не могут изменять данные в таблице.
Усечение и удаление таблиц
А теперь лакомый кусочек из архива мелочей Oracle. Вы вводите команду
delete для таблицы со многими сотнями тысяч или миллионов строк и
фиксируете эту команду. Довольный своим достижением, вы вводите команду
select count (*). И несколько минут спустя получаете счетчик нулевых строк.
Что случилось? Oracle не сбросила верхнюю отметку после команды delete, и
более того, никогда этого не делает! Команда truncate table (с
необязательной фразой drop storage) позволяет избавиться от назначенных экстентов,
которые теперь пусты, и сбросить верхнюю отметку, сохраняя при этом
определение таблицы. Обратите внимание, что это операция языкаопределения
данных (DDL), а не языка манипуляции данными (DML), т.е. после усечения
таблицы вы не сможете ввести команду rollback, чтобы волшебным образом
вернуть данные. Помните также, что любое изменение minextents после
создания таблицы будет применено к таблице, если не определить
необязательную фразу reuse storage, которая сохраняет текущее распределение памяти
и не сбрасывает верхнюю отметку. И последнее — все связанные индексы
будут также усечены, а любая необязательная фраза drop storage или reuse
storage также будет применяться к связанным индексам.
536
Глава 14
^^^ TRUNCATE TABLE EMPLOYEE;
TRUNCATE TABLE EMPLOYEE DROP STORAGE;
TRUNCATE TABLE EMPLOYEE REUSE STORAGE;
Подсказка Есть интересный факт о команде truncate table, который
может встретиться на экзамене "Основы АБД1". Несмотря на то, что вы
не можете выполнить команду rollback для усечения таблицы, Oracle все
же запрашивает сегмент отката для этой операции. Почему? Потому
что, в случае прекращения команды truncate table или сбоя сегмент
отката сохраняет изменения, выполненные в течение операции truncate, чтобы
можно было восстановить сбой.
И, наконец, чтобы избавиться от таблицы полностью и отдать табличному
пространству все назначенное ей пространство, введите команду drop table.
Существует дополнительная фраза, которую следует включить для обработки
других таблицы, у которых могут быть определены ограничения ссылочной
целостности на эту таблицу: фраза cascade constraints. Следующий блок
кода демонстрирует эту команду:
DROP TABLE EMPLOYEE;
DROP TABLE EMPLOYEE CASCADE CONSTRAINTS;
Закрепление пройденного материала
1. Необходимо знать команду перемещения таблицы в другое табличное
пространство и понимать, чем работа этой команды похожа на команду
create table as select.
2. Надо знать ограничения для alter table move в отношении перемещения
поддерживающих индексов. Помните, что команда alter index rebuild
tablespace может использоваться для перемещения связанных индексов.
3. Убедитесь, что знаете соображения о назначении пространства, которые
надо учитывать при перемещении или реорганизации таблицы, проверьте
также, знаете ли вы компромиссы, связанные с использованием ключевого
слова nologging в команде alter table move.
Упражнения
1. Вы должны переместить таблицу ЕМР из табличного пространства DATA в
табличное пространство LARGE_DATA. Эта таблица была создана с
уникальным ограничением на столбец GOVT_ID, с помещенным в табличное
пространство IDX связанным индексом. Вы хотите переместить этот
индекс в также табличное пространство LARGE_INDX. Какая из следующих
команд может использоваться для перемещения соответствующего индекса
в столбец GOVT_ID в соответствующее табличное пространство?
A. alter index myidx rebuild tablespace large_index;
B. alter table emp move tablespace large_data index
tablespace large_index;
C. alter table emp move tablespace large_index;
D. alter index myidx move tablespace large_index;
2. Вы перемещаете таблицу ЕМР из табличного пространства DATA в
табличное пространство LARGE_DATA. Найдите неправильное утверждение о
поведении Oracle в отношении передачи объектов в этом контексте?
A. Привилегии объекта, предоставленные пользователям для этой
таблицы, сохраняются при перемещении.
B. Новый сегмент в табличном пространстве LARGE_DATA теперь
содержит данные ЕМР.
Управление объектами базы данных
537
С Код для связанных с таблицей триггеров перемещается из табличного
пространства DATA в табличное пространство LARGEDATA.
D. Связанный первичный ключ продолжает предписывать уникальность
для ключа столбца во время перемещения.
3. Вы вводите в Oracle следующую команду: alter table EMP move storage
(initial 5OK next 100K) nologging. Какое из следующих утверждений
относительно этой команды неправильно?
A. Таблица ЕМР была перемещена в новый сегмент.
B. Таблица ЕМР была перемещена в новое табличное пространство.
C. Изменение таблицы ЕМР было сделано без запроса блокировки
назначения повтора.
D. Изменение таблицы ЕМР нельзя восстановить.
Ответы
1. А. 2. С. Код триггеров хранится в таблицах словаря в табличном пространстве
SYSTEM. 3. В.
Удаление неиспользованных столбцов из таблиц
Представим следующий сценарий в версиях Oracle до Огас1е9/. Есть таблица
EMPLOYEE, в которой хранятся данные о служащих. Один из столбцов
сохранил текстовую строку, соответствующую имени филиала компании, в
котором работал служащий. При реорганизации компании все филиалы
объединяются в родительскую компанию, и теперь ненужно хранить информацию о
филиале в виде собственного столбца. Если бы вы хотели устранить ненужный
столбец, следовало бы сбросить содержание таблицы в неструктурированный
файл, удалить таблицу, восстановить таблицу без вспомогательного столбца и
использовать SQL*Loader для перезагрузки записей таблицы в вновь
созданную таблицу. В зависимости от того, сколько служащих было в компании, этот
процесс занять довольно много времени. В качестве альтернативы, можно
использовать Рго*С вместо SQL*Loader, это позволит быстрее загрузить записи в
таблицу с помощью выборки из массива, но все равно выполнение этой
задачи состояло бы из нескольких шагов. Для выполнения этой задачи пришлось
бы пойти на непроизводительные потери времени.
Удаление неиспользованных столбцов: основная идея
Вместо выполнения этой потенциально трудной задачи Огас1е9/ разрешает
просто удалять неиспользованные столбцы из таблиц с помощью команды alter
table. Существует два способа удаления столбца в Огас1е9/. Первый —
логический метод, который не удаляет данные, но ведет себя, как будто столбец был
удален. Эта опция известна как маркировка столбца как неиспользуемого.
Второй способ физически удаляет столбец из таблицы. Давайте рассмотрим эти
положения поподробнее.
Маркировка столбца как неиспользуемого Пользователи таблицы не могут
видеть неиспользованный столбец. Информация о неиспользованном столбце
не появляется в выводе команды describe table, и вы не можете обратиться
к данным в неиспользованном столбце. Маркировка столбца как
неиспользуемого похожа на логическое удаление столбца, потому что данные все еще
находятся в таблице, но не могут использоваться. Столбец помечается как
неиспользуемый с помощью следующего синтаксиса: alter table пате set
unused column colname. Чтобы увидеть, какие таблицы имеют
неиспользованные столбцы, можно обратиться к представлению словаря, известному в
Oracle9i как DBA_UNUSED_COL_TABS, и все таблицы с неиспользованны-
53В
Глава 14
ми столбцами будут перечислены. Столбец COUNT в этом представлении
указывает для каждой таблицы, сколько в ней неиспользованных столбцов. Если
требуется удалить столбцы после маркировки их как неиспользуемых, вместо
этого используйте команду alter table name drop unused column.
Маркировка столбца как неиспользуемого и с последующим использованием
команды alter table name drop unused column полезна тем, что позволяет быстро
прекратить доступ к столбцу. Позже, в выходные, которые администраторы
БД используют для обслуживания, или по окончании периода максимальной
нагрузки, можно удалить столбец с помощью alter table name drop
unused column, и восстановить пространство.
Физическое удаление столбца Еще один метод удаления столбца из
таблицы—использование команды alter table name drop column colname. Эта
команда фактически удаляет все данные из столбца и устраняет столбец из
определения таблицы. Эта операция занять довольно много времени, чем
маркировка столбца как неиспользуемого, потому что Oracle должна пройтись по
всем блокам таблицы и фактически удалить данные столбца для
восстановления пространства, занятого этим столбцом.
Удаление столбцов в Oracle9i: реализация
Давайте рассмотрим ряд примеров удаления столбцов в Oracle9f с помощью
команды alter table. В первом примере Oracle получает указание
игнорировать столбец, для этого используется фраза set unused column. В нашем
примере информация из столбца таблицы не удаляется. Oracle просто
притворяется, что столбца там нет. Позже, мы сможем удалить столбец с помощью
фразы drop unused columns. В следующем блоке показаны оба шага:
gjggg^sgsfti SQL> alter table employee set unused column subsidiary;
Ta»le altered.
SQL> alter table employee drop unused columns;
Table altered.
Вторая опция немедленно удаляет столбец и все содержимое из таблицы.
Эта команда приводится в следующем блоке:
WVrtiSW SQL> alter table employee drop column subsidiary;
Table altered.
Дополнительный синтаксис для удаления столбцов
Существует несколько дополнительных фраз для команды alter table name
drop column colname, которые добавляются к команде после colname:
■ cascade constraints Любые внешние ключи, относящиеся к
удаляемому столбцу, иди любые ограничения на сам столбец будут устранены
вместе со столбцом.
■ invalidate Любые объекты, связанные с таблицей, чей столбец удален,
будет отмечен как недействительный. Помните, что объекты,
относящиеся к таблице, таким образом, включают обращающиеся к таблице блоки
PL/SQL, триггеры и представления.
■ checkpoint лит Позволяет уменьшить количество используемого
пространства в сегменте отката благодаря тому, что Огас1е9/ делает
контрольную точку через каждые num строк. Во время операции alter table
drop column статус таблицы показан как INVALID. Если операция
заканчивается неправильно (например, сбой сеанса или экземпляра), Oracle
может произвести откат только к самой последней по времени контрольной
точке, и таблице остается в состоянии INVALID. Однако можно
возобновлять удаление столбца после восстановления экземпляра, или при
повторном установлении соединения с помощью команды alter table name
drop columns continue.
Управление объектами базы данных
539
Закрепление пройденного материала
1. Следует знать, как добавить столбцы с помощью команды alter table с
фразой add.
2. Следует знать, как модифицировать определение типа данных столбца с
помощью команды alter table с фразой modify.
3. Следует знать оба применения команды alter table для удаления
столбцов — при одном используется синтаксис set unused column и drop
unused columns, а при другом — синтаксис drop column.
Упражнения
1. Вы только ввели следующую команду: alter table sales drop column
profit. Какой из следующих вариантов указывает, когда столбец будет
фактически удален из Oracle?
A. Немедленно после выполнения команды
B. После ввода команды alter table drop unused columns
С После ввода команды alter table set unused column
D.После ввода команды alter table modify
2. Компания Acme Sales реорганизуется для консолидации коммерческих
возможностей в одном регионе, что устраняет необходимость столбца
SALES REGION. В Oracle9/вы вводите следующую команду: alter
table sales set unused column sales_region. В какой точке данные
действительно будут удалены из таблицы?
A. Когда будет введена команда the alter table sales drop unused
columns.
B. Когда закончится выполнение команды alter table sales set
unused column sales_region.
С Когда вы сбросите содержимое таблицы в неструктурированный
файл, восстановите таблицу без столбца SALES_REGION и
перегрузите данные с помощью SQL*Loader.
D. Никогда. Столбец удаляется только при использовании команды
alter table sales drop column sales_region.
3. Вы хотите определить, сколько столбцов в таблице EMPLOYEE отмечены
как неиспользуемые для последующего удаления. Какой из следующих
методов подошел для этой цели?
A. Обращение к представлению DBATABLES
B. Использование команды describe
С Обращение к представлению DBA_UNUSED_COLS
D. Обращение к представлению DBA_UNUSED_COL_TABS
Ответы
1. А 2. А 3. С.
Управление индексами
В этом разделе мы рассмотрим следующие темы по управлению индексами:
■ Различные типы индексов и их использование
Ш Создание В-дерева и битовых индексов
И Реорганизация индексов
540
Глава 14
■ Удаление индексов
■ Получение информации об индексах из словаря данных
■ Контроль использования индекса
Таблицы могут становиться весьма большими, и когда это происходит,
пользователи уже не могут быстро найти необходимые им данные. Поэтому
Oracle предлагает индексы как метод ускорения производительности базы
данных при доступе к таблицам с большим количеством данных. Oracle
предлагает различные типы индексов для разных целей, и мы расскажем о них. Вы
также узнаете об определенных процедурах создания В-дерева и битового
индекса, и в каких случаях вы будете выбирать тот или иной метод. Также
рассматриваются методы реорганизации и удаления индексов. И наконец, вы
узнаете, где в словаре данных можно увидеть информацию об индексах и как
контролировать использование индекса.
Различные типы индексов и их использование
Индекс в Oracle можно сравнить с каталогом карточек в библиотеке. Когда
необходимо найти книгу, вы идете в каталог карточек (или компьютерный
каталог) и ищете книгу по имени автора, названию или теме. Когда вы находите
карточку для этой книги, в ней указано местонахождение книги в библиотеке
согласно системе классификации. Такой способ сокращает время,
затрачиваемое на поиск книги, по сравнению с поиском наугад в библиографическом
отделе. Индексы Oracle работают точно так же. Сначала вы находите данные
строки, которые соответствует вашим критериям поиска в индексе, а затем
используете для этой строки ROWID из индекса, чтобы быстро получить всю
строку из таблицы.
Для определения типа индекса используется несколько критериев. Первый
критерий — сколько столбцов в индексе. Простые (simple) индексы содержат
только один столбец данных, в котором можно искать, плюс ROWID
соответствующей строки в таблице. Сложные (composite) индексы хранят более одного
столбца данных для поиска плюс ROWID соответствующей строки в таблице.
В сложном индексе можно разместить до 32 столбцов, но это число может
быть ограничено, если полный размер всех нужных вам столбцов в индексе
превышает DB_BLOCK_SIZE / 3. Есть и другие критерии идентификации
индексов — содержит ли индексированный столбец (цы) все уникальные
(сложные) значения, разделен ли индекс или неразделен, является ли он
традиционным В-деревом или битовым индексом, хранятся ли данные в индексе в
обратном порядке.
Совет Когда индексы для таблицы — сложные, Oracle будет использовать
этот индекс только, если ведущий столбец (цы) сложного индекса
упомянуты во фразе where обращения к таблице.
Oracle поддерживает индексы всякий раз, когда пользовательские
процессы изменяют данные в таблицах. Например, если вы вставляете новую строку
в таблицу, в индексе создается связанный элемент для индексированного
столбца этой строки. Этот элемент создается не для последнего лепесткового
блока индекса, скорее, соответствующий лепестковый блок расположен
согласно индексному порядку сортировки, а элемент создается в нем. Параметр
pctf гее влияет на индекс только во время создания. Когда данные удаляются
из таблицы, соответствующий элемент индекса помечается на удаление.
Позже, когда все другие строки, соответствующие всем элементам индекса в
лепестковом узле будут удалены, тогда и только тогда весь блок будет очищен от
элементов индекса. Таким образом, структура индекса сохраняется. Команда
update, изменяющая значение индексированного столбца строки,
обрабатывается как удаление помеченных элементов, за которым идет insert.
Наконец, элементы индекса можно добавлять к блоку даже за пороговым
значением pctf гее.
Управление объектами базы данных
541
Неразделенные индексы В-дерева
Индекс В-дерева — традиционный механизм индексации, используемый в
Oracle. Данные в нем хранятся в древовидной структуре, как показано на
рис. 14.2.1 В основании индекса — корневой узел (root node), который является
точкой входа при поиске данных в индексе. Корневой узел содержит указатели
на другие узлы на следующем уровне индекса. В зависимости от
разыскиваемого значения, вас направят в одном из многих направлений. Следующий
уровень индекса состоит из узлов ветвления (branch nodes), которые
аналогичны корневому узлу тем, что они также содержат указатели на следующий
уровень узлов в индексе. Снова, в зависимости от искомого значения, вам
направят в одном из многих направлений. Узлы ветвления указывают на самый
высокий уровень индекса: лепестковые узлы (leaf nodes). На этом самом
высоком уровне элементы индекса (index entries) содержат индексированные
значения столбца и соответствующие ROWID строк, хранящих эти значения
столбца. Каждый лепестковый узел связан с лепестковым узлом слева и справа от
себя, что позволяет осуществлять поиск вверх и вниз через диапазон
элементов в индексе.
В индекс
Элемент индекса состоит из нескольких частей, некоторые из них уже мы
уже рассматривали. Первый — заголовок элемента индекса, указывающий
число столбцов в элементе. После него в элементе хранятся значения для
столбца(цов) в индексе. Каждому значению столбца предшествует длина в
байтах с соблюдением тех же самых правил, что для длины в байтах элементах
строки. Наконец, индексный вход хранит ROWID. Этому значению не
требуется указание длины в байтах, потому что весь ROWID одной и той же длины.
Следует разобраться с несколькими специальными случаями данных,
хранящихся в элементах индекса:
■ Если индекс неуникальный, и несколько строк содержат одно и то же
значение для столбца, то каждая строка с этим значением будет иметь свой
собственный элемент индекса для хранения каждого уникального
ROWID.
■ Если строка имеет значение NULL для индексируемого столбца(цов), у
этой строки не будет соответствующего элемента индекса.
542
Глава 14
■ Только для неразделенных индексов, т.к. индекс хранит данные только
для одной таблице и все таблицы можно хранить только в одном
табличном пространстве, для нахождения строки в индексе не требуется ID
номер объекта. Таким образом, использование неразделенных индексов
В-дерева сводит применение ROWID к указанию на данные строки.
Как правило, индексы В-дерева используются для повышения
производительности команд select, использующих столбцы уникальных или наиболее
отличимых значений. Поддержка индексов В-дерева не требует от Oracle
слишком много времени или усилий, когда в индексированном столбце тоже
изменяются данные, поэтому такой тип индекса полезен для оперативных
приложений диалоговой обработки запросов. Однако эти индексы не годятся
для быстрого обнаружения данных с помощью команд select с фразой
where, содержащей операции сравнения, объединенных логическим ИЛИ и в
ситуациях, где значения в индексированном столбце не слишком различаются.
Битовый индекс
Хотя все индексы в Oracle хранятся в структуре "корень-ветвление-лепестки",
представленной на рис. 14.2, битовый индекс имеет другое значение. Вместо
сохранения элементов для каждой строки таблицы, битовый индекс хранит
элемент, содержащий каждое отличное значение, начальный и конечный
ROWID для указания диапазона ROWID в этой таблице, и длинную двоичную
строку, содержащую столько битов, сколько строк в таблице.
В качестве примера рассмотрим представление битового индекса для
таблицы на рис. 14.3. Индексированный столбец APPLE_TYPE имеет только три
отличных значения. Как видно из рисунка, битовый индекс имеет три
элемента. Показаны также начальный и конечный ROWID для объекта, из чего мы
узнаем о потенциальном диапазоне ROWID. Наконец, показана двоичная
строка, представляющая битовую карту. Позиция для элемента
устанавливается как 1, если столбец для той строки содержит связанное значение; иначе,
бит задается как 0. Если элемент содержит бит, заданный как 1,
соответствующий бит в каждом другом элементе будет всегда устанавливаться как 0.
Фактически, этот двоичный элемент также сжат, т.е. нельзя увидеть битовую карту с
0 и 1, но таково внутреннее представление информациия.
Битовые индексы повышают производительность в ситуациях, когда
производится выборка данных из столбца, чьи значения часто повторяются,
например статус служащего (активный, LOA, или на пенсии). Они также улучшают
Логическое
представление
битового
индекса
Битовый индекс для столбца Sort таблицы APPLES
Cranny Smith
Red Delicious
Macintosh
AAAAvQAACAAAA3yAAA
AAAAvQAAGAAAA3yAAA
AAAAvQAACAAAA3yAAA
AAAAvQAACZZZZ3yZZZ
AAAAvQAAGZZZZ3yZZZ
AAMvQAACZZZOyZZZ
100...
010...
001...
Тележка
Вес
Число
Сорт
_Число битов =
число строк
Таблица APPLES
Управление объектами базы данных
543
производительность для команд select с несколькими условиями where,
объединенными с помощью or.
Битовые индексы повышают производительность в таких столбцах, где
данные не отличаются друг от друга и редко (или никогда) не изменяются. К
тому же, изменение данных в таком столбце — довольно трудный процесс, т.к.
изменение значения столбца, содержащегося в битовом индексе, требует от
Oracle блокировки всего сегмента, в котором хранится битовый индекс.
Блокировка производится для всего битового индекса. Другими словами, при
изменении ключевого столбца в таблице должны модифицироваться битовые
карты. Это приводит к блокировке соответствующих битовых сегментов.
SQL> create bitmap index idx_emp_bmp_01 on table emp (gender);
Index created.
Индексы обратного ключа
И в заключение рассмотрим использование индексов обратного ключа. Этот
тип индекса аналогичен стандартному индексу В-дерева, за исключением
одного — данные индексируемого столбца хранятся в обратном порядке. Таким
образом, если значение столбца в таблице JASON, столбец индекса обратного
ключа будет NOSAJ. Как правило, пользователи считают самым большим
преимуществом индексов обратного ключа то, что команды select содержат
фразы where, в которых используются сравнения равенства, например, where
X = 5, а не те случаи, где используются сравнения диапазона, например,
where X between 4 and 6. Значение или преимущество индексов обратного
ключа должны повысить производительность в окружении Oracle Real
Application Cluster.
Ш^ЗШ SQL> create index idx_emp_rev_01 on table emp (lastname) reverse;
Index created.
Индексы на основе функций
Индексы на основе функции — новый тип индекса в Огас1е8/, он повышает
производительность запроса, позволяя определить индекс, если фраза where
содержит операции над столбцами. Если фраза where содержит столбцы,
участвующие в функциях или операциях, традиционные индексы В-дерева не
используются. Допустим, имеется таблица ЕМР с четырьмя столбцами: EMPID,
LASTNAME, FIRSTNAME, и SALARY. У столбца SALARY есть индекс
В-дерева. Однако если ввести комадау select * from EMP, where (salary*
1.08) > 63000, система управления реляционной базой данных (РСУБД)
игнорирует индекс, выполняя вместо этого полный просмотр таблицы. Индексы
на основе функции используются там, где команды SQL содержат такие
операции во фразах where. Ниже приводится блок кода с индексом на основе
функции:
НЯНИН! CREATE INDEX idx_emp_func_01
ON emp(SALARY*1.06);
Используя индексы на основе функции, можно оптимизировать
производительность запросов, содержащих функциональные операции над
столбцами во фразе where, подобно запросу, показанному выше. Пока
определенная вами функция является повторяемой, для нее можно
создавать индекс на основе функции. Повторяемая (repeatable) функция — та,
чей результат будет неизменным для одного и того же набора входных
данных. Например, 2 + 2 всегда равно 4, и никогда не изменится так, чтобы
получилось 5. Таким образом, операция сложения — повторяемая. Чтобы
можно было использовать индексы на основе функции, необходимо ввести
две команды alter session:
"™™™ SQL> alter session set query_rewrite_enabled = true;
Session altered.
SQL> alter session set query_rewrite_integrity=trusted;
Session altered.
544
Глава 14
Совет Битовые индексы могут также быть индексами на основе функции.
Индексы на основе функции могут также быть разделенными.
Убывающие индексы
Другой новый тип индекса в версиях 0racle8i и выше — убывающий индекс.
Напомним, что фраза order by используется в командах SQL> для
установления порядка сортировки возвращаемых из базы данных, что улучшает их
читаемость. Как правило, Oracle не хранит данные в каком-либо определенном
порядке, это обычная практика в реляционных базах данных. Однако индекс
В-дерева хранит информацию в определенном порядке. В версиях Oracle до
Огас1е8/ индексы В-дерева использовали возрастающий порядок, от низшего
значения столбца до самого высокого.
В Огас1е8/ и выше можно также разбить данные в индексе В-дерева на
категории в убывающем порядке. Это свойство полезно в приложениях,
требующих сортировки в противоположных направлениях. Например, имеется
таблица ЕМР с четырьмя столбцами: EMPID, LASTNAME, SALARY и DEFT.
Сравнивая производительность по отделам, вам придется обращаться к этой
таблице по коду отдела в возрастающем порядке и зарплате в убывающем
порядке с помощью следующего запроса:
SQL> select dept, salary, empid, lastname
2 from emp
3 order by dept азе, salary desc,
Если таблица ЕМР большая, то в предыдущих версиях Oracle для
получения данных из DEPT в одном порядке сортировки, а из SALARY в другом,
потребовались бы огромные пространства сортировки. Вместо этого
используются убывающие индексы. Например, определяем отдельные простые
индексы для DEPT и данных SALARY, где для данных DEPT применяется
традиционный метод возрастания в индексе В-дерева, а столбец SALARY
использует убывающий порядок в индексе. Для создания простых индексов
можно воспользоваться следующим блоком кода:
K**fai»,p51 Regular ascending Index
CREATE INDEX emp_dept_idx_01
ON EMP(DEPT);
flffflSfflFf,' Descending index
CREATE INDEX emp_sai_idx_01
ON EMP (SALARY DESC);
Для столбцов в сложном индексе можно также задать различные
направления сортировки. В предыдущем примере можно было бы определить сложный
индекс, содержащий два столбца с разным порядком сортировки, как
показано в следующем блоке кода:
HHWHKW CREATE INDEX emp_dep_sal_idx_01
ON EMP(dept ASC, salary DESC);
Совет Объединение индексов на основе функции с убывающими индексами
позволяет создавать убывающие индексы на основе функции. Убывающие
индексы можно также разделять.
Закрепление пройденного материала
1. Необходимо знать, что такое уникальный индекс, и чем он отличается от
неуникального. Следует знать разницу между сложными и простыми
индексами, а также между структурой индексов В-дерева и битовых
индексов.
2. Необходимо знать и другие типы индексов в Oracle, включая убывающие
индексы, индексы на основе функции, индексы обратного ключа и т.д.
Управление объектами базы данных
545
Упражнения
1. Таблица EMPLOYEE содержит много уникальных значений в столбце
FIRSTNAME. Вы хотите индексировать этот столбец, чтобы
воспользоваться этим преимуществом при обращении к ней. Какой из следующих
индексов можно использовать?
A. Битовый индекс
B. Индекс на основе функции
С Простой индекс В-дерева
D. Сложный индекс В-дерева
2. Вы хотите использовать битовый индекс в базе данных Oracle. Какое из
следующих утверждений справедливо в отношении битовых индексов?
A. Битовые индексы полезны там, где столбец таблицы содержит мало
уникальных значений, и эти значения часто изменяются.
B. Битовые индексы полезны там, где столбец таблицы содержит много
уникальных значений, и эти значения часто изменяются.
C. Битовые индексы полезны там, где столбец таблицы содержит мало
уникальных значений, и эти значения редко изменяются.
D. Битовые индексы полезны там, где столбец таблицы содержит много
уникальных значений, и эти значения редко изменяются.
Ответы
1. с. 2. с.
Создание индексов В-дерева и битовых индексов
Команда create index позволяет создавать все типы индексов. Для
определения специальных типов индексов следует использовать различные ключи,
например, create unique index для индексов по столбцам, которым
требуется уникальность каждого элемента данных или create bitmap index для
создания битовых индексов. Следующий блок кода демонстрирует команду
для создания уникального индекса В-дерева. Команда также включает опции
хранения и создания данных:
BWWIrtE CREATE UNIQUE INDEX employee_lastname_incbc_01
ON employee (lastname ASC)
TABLESPACE INDEXES
PCTFREE 12
INITRANS 2 MAXTRANS 255
LOGGING
NOSORT
STORAGE INITIAL 900K
NEXT 1800K
MINEXTENTS 1
MAXEXTENTS 200
PCTINCREASE 0 );
В определении памяти есть несколько знакомых вам элементов, типа
pctf ree, tablespace, logging, и компоненты фразы storage. Все эти
опции, кроме pctfree, используются аналогично тому, как они работают в
команде create table. Oracle использует pctfree только при создании
индекса, чтобы зарезервировать пространство для элементов индекса,
вставляемых в тот же самый индексный блок.
Некоторые компоненты могут показаться незнакомыми, например,
unique, asc и nosort. Чтобы индекс требовал уникальность значений в
столбце, следует задать unique. Ключевое слово asc в этой фразе указывает
возрастающий порядок столбца в индексе, и может быть заменено на desc
(убывание). Ключевое слово nosort нужно, если данные таблицы загружены
546
Глава 14
в надлежащем порядке сортировки относительно индексируемого столбца. В
нашем примере это означало бы, что вы загрузили данные в таблицу
EMPLOYEE, сортируемую по возрастанию столбца LASTNAME. Если указан
nosort, Oracle пропустит обычно используемую при создании индекса
сортировку, и, тем самым, повысит производительность команды create index.
Эта опция полезна, если в операционной система процедура сортировки более
эффективна, чем в Oracle. И, наконец, pctused не используется для
определения индекса. Поскольку для работы индекса необходима упорядоченность его
элементов, Oracle должна поместить элемент индекса в блок, неважно, какой.
Следовательно, pctused не используется.
Битовые индексы можно также создать с помощью нескольких
спецификаций памяти, но помните, что они используются для повышения
производительности поиска в столбцах с небольшим числом элементов, поэтому битовые
индексы могут быть неуникальны. Следующий блок кода демонстрирует
создание битового индекса:
frHfirafffr CREATE BITMAP INDEX employee_lastname_indx_01
ON employee (lastname)
TABLESPACE ORGDBIDX
PCTFREE 12
INITRANS 2 MAXTRANS 255
LOGGING
NOSORT
STORAGE ( INITIAL 900K
NEXT 1B00K
MINEXTENTS 1
MAXEXTENTS 200
PCTINCREASE 0 )
На производительность команд с использованием битового индекса
существенно влияет область памяти, указанная в параметре CREATE_BITMAP_
AREASIZE из файла initsid.ora. Эта область определяет, сколько памяти
будет использовано для сохранения битовых сегментов. Если битовый индекс
создается для столбца с большим числом элементов, потребуется больше
пространства. Для битового индекса большое число элементов означает
приблизительно двенадцать уникальных значений из 500 000 (в отличите от индексов
В-дерева, для которых большое число элементов означает приблизительно
490000 уникальных значений из 500000). В нашем примере для параметра
инициализации CREATE_Bn"MAP_AREA_SIZE можно сохранить значение
Oracle по умолчанию 8 Мбайт.
Примером небольшого числа элементов для столбца может быть два
разных значения на всю таблицу, например, в столбца пола служащих, т.е.
мужской или женский. В этом случае можно установить значение параметра
инициализации значительно ниже значения по умолчанию, т.е. приблизительно
750 Кбайт.
Установление размеров
и другие вопросы создания индексов
Без предоставляемых индексами преимуществ поиск в большой таблице
занимает много времени, потому что приходится просматривать всю таблицу.
Индексы предназначены для повышения производительности поиска. В отличие
от полного просмотра таблицы, где производительность снижается по мере
роста таблицы, производительность поиска в таблице с индексами растет по
экспоненте по мере роста индекса (и связанной с ним таблицы). В
действительности, в списке из 1 миллиона элементов, алгоритм двоичного поиска,
аналогичный используемому в индексе В-дерева, находит любой элемент за
максимум 20 попыток, но на самом деле, алгоритм В-дерева гораздо эффективнее.
Однако за такую скорость приходится расплачиваться дополнительным
дисковым пространством, требуемым для хранения индекса, и накладными
расходами для его поддержки при выполнении над таблицей операций
DML. Компромисс сводится к необходимости выбора между стоимостью
Управление объектами базы данных
547
памяти при добавлении индекса к базе данных и производительностью
поиска в таблице при наличии индекса. Достигнутая с помощью индекса
производительность растет по экспоненте, по сравнению с
производительностью полного просмотра таблицы, но от индекса нет никакого толка, если
он никогда не используется приложением. Перед созданием индекса
следует также учесть изменчивость данных в таблице. Если данные в
индексированном столбце изменяются регулярно, лучше проиндексировать более
статический столбец.
Необходимо также обдумать размер pet free для индекса. Oracle
использует pctf гее только для определения свободного пространства при
первоначальном создании индекса. После этого пространство является справедливой
игрой, т.к. Oracle должна хранить все элементы индекса в порядке. Поэтому
после создания Oracle поместит индексные записи в блок, используя все
доступное пространства до последнего бита. Следующие соображения позволят
определить оптимальное значение pctf гее для индекса. Если значения в
индексируемом столбце последовательно возрастают, например, значения
столбца, сгенерированные последовательностями, можно задать размеры pctf гее
равным 2 или 3. В противном случае pctf гее вычисляется на основании
прогноза роста строки за определенный период времени (например, 12 месяцев)
по следующей формуле: ((max_t_rows_in_period ±nitial_t_rows_
in_period) / max_#_rows_in_period) x 100.
Закрепление пройденного материала
1. Надо уметь описывать настройки, которые можно и нельзя использовать
во фразе storage для индекса, и уметь это объяснить.
2. Помните, что создать уникальные битовые индексы — эти термины
противоречат друг другу. Необходимо также понимать, как Oracle использует
параметр SORT_BITMAP_AREA_SIZE в отношении создания битовых
индексов.
Упражнения
1. Вы задаете параметры выделения памяти для индекса. Какой из
следующих вариантов указывает на такой аспект назначения памяти для индекса,
которое не существует для таблиц?
A. pctfгее
B. pctincrease
C. pctused
D.initial
2. Вы планируете использовать приведенный в следующем блоке кода
текстовый файл как источник для загрузки данных в таблицу EMPLOYEE:
0193 FLOM BETSY
4302 BUTTERWORTH LORNA
6302 GUPTA RAJIV
1201 FLOM TOM
В каком из следующих вариантов указан метод, который можно
использовать при создании индекса по столбцу LASTNAME для повышения
производительности, не жертвуя при этом возможностью
восстановления?
А-Создать индекс перед загрузкой таблицы с низким значением
параметра фразы storage.
В. Использовать ключевое слово nosort при создании индекса после
загрузки таблица.
548
Глава 14
С Использовать ключевое слово nologging при создании индекса после
загрузки таблицы.
D. Создать индекс перед загрузкой таблицы с высоким значением
параметра фразы storage.
Ответы
1. с. 2. в.
Реорганизация индексов
Команда alter index позволяет реорганизовывать индексы. Эта команда
полезна для переопределения опций памяти, например, pctincrease,
maxextents, initrans mramaxtrans. Можно также использовать эту
команду для изменения значение pet free для новых блоков в новых экстентах,
назначенных вашим индексом. Команда alter index allocate extent
позволит также вручную добавлять экстенты к индексу почти так же, как это
делается для таблиц, причем size и datafile указывать необязательно.
Команда alter index deallocate unused позволит также избавиться от
неиспользуемого пространства ниже верхней отметки индекса, резервируя
небольшое дополнительное пространство с помощью фразы keep.
Реорганизовать индекса можно также, восстановив это. Эта операция
позволяет создать новый индекс, используя данные из старого, а это уменьшает
число операций считывания из таблицы при восстановлении, упрощает
управление пространством в индексе и повышает общую производительность. Эта
операция выполняется с помощью команды alter index idxname rebuild
tablespace tblspcname. Фраза tablespace в этой команде также
перемещает индекс в именованное табличное пространство, что упрощает
выполнение этой задачи. Все определяемые в команде create index опции памяти
можно использовать для команды alter index rebuild. Ситуация
с восстановлением индекса может возникнуть при перемещении индекса
в другое табличное пространство или в случае удаления большого числа строк
из таблицы, в результате чего удаляются и элементы индекса. Во время фор-
мировния индекса запросы могут продолжать использовать существующий
индекс.
Совет Команду analyze index validate structure можете
использовать аналогично использованию в таблицах для проверки повреждения блока.
Представление словаря INDEX_STATS показывает число элементов индекса в
лепестковых узлах в столбце LF_ROWS no сравнению с числом удаленных
элементов в столбце DEL_LF_FOWS. Oracle рекомендует восстанавливать
индекс, если число удаленных элементов выше на 30%.
Оперативное формирование или восстановление индексов
Oracle самостоятельно обслуживает индексы всякий раз, когда изменяются
данные индексированного столбца в таблице. Со временем значения в
индексированном столбце могут измениться так, что Oracle придется перестроить
содержимое индекса, чтобы найти место для новых значений в
индексированном столбце. Если в столбце изменилось столько значений, что стало
неверным общее число элементов в индексе, указанном в создаваемой Oracle
конфигурации при первоначальном формировании индекса, индекс может
устареть. Устаревший индекс замедляет поиск данных, и пользователи
замечают снижение производительности при выполнении их запросов, хотя в плане
выполнения команды указывается применение индекса.
Восстановление индексов позволяет избавиться от устаревания
индексов, для этого используется команда alter index rebuild. Чтобы
восстановить индекс, Oracle устанавливает блокировку DML в базисной таблице,
чей индекс будет восстанавливаться. Пока Oracle удерживает эту
блокировку DML, нельзя вносить какие-либо изменения в данные базисной
таблицы. Таким образом, если по любой причине приходится формировать или
Управление объектами базы данных
549
восстанавливать индекс, следует планировать время проведения операций
обслуживания в отношении потребностей пользователей, которым нужно
изменять таблицы. Если индексируемая таблица большая и доступная
пользователям, ее простой должен планироваться на ночь или выходные, потому что при
формировании индекса Oracle должна предотвратить операции DML над
данными в таблице. Однако для требования приложений электронной
коммерции, которые должны быть доступны круглосуточно все дни недели, простой
просто невозможен.
Oracle предоставляет способ формирования или восстановления индексов,
использующих менее строгие механизмы блокировки. Это способ позволяет
другим пользователям вносить изменения в данные таблицы одновременно с
формированием или восстановлением индекса. Эти изменения также
регистрируются в новом или восстановленном индексе. Oracle оперативно
восстанавливает индекс следующим образом. Сначала Oracle блокирует таблицу в
течение очень короткого времени, чтобы определить структуру индекса и
обновить словарь данных. Этот шаг представлен на рис. 14.4. В это время
таблица и индекс недоступны для запросов данных или изменений.
По завершении первого шага Oracle снимает блокировку, требуемую для
получения структуру индекса, и пользователи могут снова изменять данные в
таблице. Индекс, в том виде, в котором он существует в настоящее время,
становится доступным для только запросов, a Oracle начинает восстанавливать
копию индекса. Oracle одновременно поддерживает маленькую копию
первоначальной таблицы, называемую журнальной таблицей (journal table). Эта
таблица создается исключительно для размещения новой информации,
добавляемой к столбцу таблицы. Этот шаг представлен на рис. 14.5.
Затем Oracle вставляет новые данные, ранее добавленные к столбцу таблицы
в уменьшенной копии индекса, в большую копию индекса. Существует еще
меньшая копия индекса, предназначенная для фиксации любых новых данных,
Первый шаг
оперативного
восстановления
индексов
Сначала Oracle блокирует таблицу
для получения основной структуры индекса
и другой информации. Таблица не меняется
и остается доступной для изменений.
Затем текущий индекс становится доступным
только для запросов.
Исходная таблица
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX-
XX
XX
XX
XX
XX
XX
*и
XX
XXX
XXX'
/ххх
XXX
XXX
XXX
XXX
.XXX
XXX
XXX
х
■■х"
X
X
'Х-
X
X
X
X
X
Рис. 14.5.
Второй шаг
оперативного
восстановления
индексов
Затем Oracle начинает формировать
новый индекс, одновременно поддерживая
меньший индекс для новой информации,
добавленной к таблице после начвла операции
по восстановлению.
Исходная таблица
XX
XX
XX
XX
хх
XX
XX
XX
XX
XX
XX,
XX
XX
XX
XX
XX
XX
XX
XX
XX
XXX
XXX
XXX
XXX
XXX
XXX
XXX
XXX
XXX
XXX
*х
X
X
X
X
X
.X
X
X
X
550
Глава 14
добавленных к таблице за то время, пока другая копия добавлялась к
восстанавливаемому индексу. После добавления данных из маленькой копии к
восстановленному индексу, Oracle начинает вставлять новые данные, обнаруженные в
еще меньшей копии. Затем Oracle повторяет процесс, создавая самую
маленькую копию индекса для размещения небольшого числа новых записей,
добавленных за то время, пока Oracle вставляла новые данные из меньшей копии,
как показано на рис. 14.6.
Этот процесс не может продолжаться вечно, поэтому после вставки
изменений из меньшей копии Oracle блокирует несколько строк таблицы
одновременно, так, чтобы пользователи не смогли изменять данные. Затем самая
маленькая копия индекса вставляется в восстанавливаемый индекс. По
завершении Oracle отказывается от первоначального индекса в пользу
восстановленной версии, снимает все блокировки, и пользователям снова получают
доступ к таблице. Это показано на рис. 14.7.
Оперативное формирование
или восстановление индексов: синтаксис
Для формирования индекса таблицы, которая продолжает оставаться
оперативной и доступной для пользователей, используется команда create index
name on table {columns) online. Для восстановления существующего
индекса используется команда alter index name rebuild online.
Следующий блок кода демонстрирует использование команды online rebuild в
сеансе SQL*Plus:
Рис. 14.6.
Третий шаг
оперативного
восстановления
индексов
Затем Oracle вставляет изменения, сделанные
в течение первоначального формирования
из первой меньшей копии индекса.
Для произведенных за это время изменений
поддерживается еще меньшая копия индекса
(красным цветом).
Исходная таблица
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX.
XX
XX
XX
•XX
XX
XX
XX
XX
XX
XX
XXX
XXX
XXX-
XXX
XXX
XXX
XXX
XXX
ххх~
XXX
X
х.
X'
X
X
X
X
X
X
X
Заключительный шаг
оперативного
восстановления
индексов
Это не может продолжаться вечно,
поэтому Oracle вставляет произведенные
во время формирования изменения из самой
маленькой копии индекса, после чего таблица
снова блокируется до завершения
заключительного восстановления.
XX
XX
XX.
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX
XX
XXX
XXX
XXX
XXX
XXX X
XXX
XXX
XXX
XXX
XXX
Управление объектами базы данных
551
SQL> alter index idx_emp_Cl rebuild online;
Index altered.
Совет В зависимости от размера индексируемой таблицы и объема
измененных пользователями данных во время восстановления индекса,
завершение операции online rebuild может занять много времени. К сожалению,
для оптимизации процесса мало что можно сделать. Это один из
компромиссов при обеспечении круглосуточной доступности данных в течение всей
недели. Можно свести к минимуму воздействие на конечных пользователей,
запланировав операцию online rebuild на часы с минимальной нагрузкой.
Оперативное формирование или восстановление индексов:
ограничения
Этот метод нельзя использовать для формирования или восстановления
битовой карты или кластерных индексов. Он предназначен, главным образом, для
индексов В-дерева и их вариантов, например, индексов на основе функции,
индексов убывания, индексов обратного ключа и разделенных индексов.
Нельзя также использовать этот метод индексации для вторичных индексов в
таблицах с индексной организацией.
Закрепление пройденного материала
1. Необходимо знать, в каких ситуациях восстанавливается индекс, и какая
для этого вводится команда. Следует помнить, какие параметры памяти
нельзя изменять в рамках команды alter index.
2. Надо знать, в чем заключается использование таблицы словаря
INDEXSTATS, и как это связано с командой analyze.
3. Проверьте, можете ли вы описать процесс, в котором индексы
формируются или восстанавливаются по умолчанию. Объясните, почему для этой
операция необходим простой. Надо знать, как можно в Oracle выполнить эту
операцию оперативно.
4. Проверьте, можете ли вы определить синтаксис, используемый для
оперативного восстановления индекса. Надо также знать значения
производительности и другие ограничения на выполнение.
Упражнения
1. Вы хотите восстановить индекс в Oracle. Какой из следующих вариантов
указывает причину возможности оперативного восстановления индексов в
Oracle?
A. Менее ограничительные блокировки для основных базисных таблиц
B. Более ограничительные блокировки для восстановленного индекса
C. Использование дублирующей базы данных для временного хранения
D. Использование временной таблицы для временного хранения
2. Вы исследуете использование оперативного восстановления индексов для
база данных Oracle, работающей круглосуточно семь дней в неделю. В
каком из следующих вариантов указан индекс, который нельзя восстановить
оперативно?
A. Разделенные индексы В-дерева
B. Битовые индексы
C. Индексы обратного ключа
D. Вторичные индексы таблиц с индексной организацией
Ответы
1. А. 2. D.
552
Глава 14
Удаление индексов
Что бывает, если надо расширить индекс и включить в него большее число
столбцов, или избавляться от столбцов? Можно ли использовать для этого
alter index? К сожалению, нельзя. Для обновления определений столбцов или
порядка столбца с убывающего на возрастающий (и наоборот) следует удалить
и восстановить индекс. Это делает команда drop index idxname.
Может возникнуть необходимость избавиться от индекса, который
используется только для определенных целей и нерегулярно, особенно, если
таблица имеет другие индексы и временные данные. Может также
потребоваться удалить индекс, если планируется большая загрузка табличных данных,
перед которой производится чистку всех данных в таблице. Это ускоряет
загрузку данных, а создаваемый впоследствии индекс будет новым и хорошо
организованным. Обновление индекса может потребоваться, если он имеет
статус INVALID в представлении DBA_OBJECTS, или известно, что индекс
поврежден при выполнении DBVERIFY для табличного пространства, в
котором находится индекс, или команды analyze непосредственно для индекса.
Закрепление пройденного материала
Необходимо знать, чем вызывается необходимость удалить индекс и как это
делается.
Упражнения
1. Команда удаления индекса
Ответ
1. drop index.
Получение информации об индексе из словаря данных
Словарь данных Oracle может помочь в поисках информации об индексах.
Представление DBAJNDEXES предлагает большое количество информации
об индексах, например, тип индекса (стандартный или битовый), его текущее
состояние (допустимое, недопустимое и т.д.), и требуется для индекса
уникальность или нет. Можно также получить информацию о связанных с индексом
таблицах. Еще одно представление, содержащее информацию о столбцах в
индексе, называется DBA_IND_COLUMNS. Наиболее ценная информация из
этого представления (в дополнение сведений о том, какие столбцы
индексированы) — порядок, в котором появляются столбцы индекса. Это чрезвычайно
важный фактор при определении, улучшит ли индекс производительность
выбора данных из таблицы. Например, если вводится команда select * from
EMPLOYEE where LASTNAME = 'SMITH', и существует сложный индекс, в
котором LASTNAME — первый столбец в порядке индекса, тогда этот индекс
улучшит производительность. Однако если бы первым столбцом индекса был
FTRSTNAME, то индекс не помог бы. Эта концепция представлена на рис. 14.8.
И, в заключение, примечание относительно поиска информации об
индексах обратного ключа. Вероятно, вы заметили, что если в базе данных есть
индексы обратного ключа, о них нет информации в представлении
DBAJNDEXES, которая определенно говорила бы, что этот индекс —
обратный ключ. Чтобы увидеть эту информацию, необходимо выполнить
специализированный запрос, использующий таблицу IND$, принадлежащую SYS, а
также представление DBA_OBJECTS. Запрос приводится в следующем блоке кода:
*Я№*ЗИ18 SELECT object_name FROM dba_objects
WHERE object_id IN (SELECT objl
FROM ind$
WHERE BITAND(property, 4) - 4);
Управление объектами базы данных
553
Влияние положения
столбца в сложном
индексе
select...
from...
where
lastname..
Индекс по
(LASTNAME, FIRSTNAME)
Таблица ЕМР
EMPID
\
•
LASTNAME
FIRSTNAME
SALARY
TUP
He подходит —
придется выполнять
просмотр всей таблицы
г / Индекс по
*]/ (FIRSTNAME, LASTNAME)
Закрепление пройденного материала
1. Назовите некоторые представления словаря и таблицы, содержащие
информацию об индексах.
S. Необходимо понимать значение положения столбца в сложном индексе и
знать, где в словаре данных можно найти эту информацию.
Упражнения
1. Это — представление, в которое следует заглянуть, чтобы определить
проиндексированные столбцы таблицы: .
Я. Это — представление, которое следует использовать для выявления
существования индексов для некоей таблицы: .
Ответы
1. DBA IND COLUMNS. 2. DBAJNDEXES.
Контроль использования индексов
Как мы неоднократно говорили, цель индексов — ускорять
производительность, что позволяет пользователям обращаться к данным в большой таблице.
Однако индекс не работает, если никто им не пользуется. Чтобы
удостовериться, что пользователи используют созданные вами индексы, Oracle
предусматривает средства контроля индексов, определяющие, используются они
или нет. Конечно, может возникнуть соблазн создать как можно больше для
повышения производительность в как можно большем числе запросов, однако
каждый созданный индекс занимает пространство, которое можно
использовать в других целях. Хотя дисковое пространство уже не так дорого, если
обнаруживается, что индекс не используется, его можно удалить, исключив
ненужные накладные расходы, и создав место для нового индекса, у которого
больше шансов на использование.
554
Глава 14
Механизм Oracle для контроля использования диска активизируется с
помощью команды alter index name monitoring usage, где name — имя
индекса, который вы намерены контролировать. Затем пользователям
разрешается обращаться к базе данных Oracle в течение некоторого времени. В этот
период Oracle собирает информацию о том, какие индексы используются, а
какие — нет. В целях точности постарайтесь, чтобы использование базы
данных Oracle в течение этого периода реалистично отражало обычное
использование базы данных. Например, не следует контролировать использование
индексами диска с вечера пятницы до утра субботы, если известно, что
большинство пользователей в это время находятся дома, и не будут
выполняться никакие процессы пакетной обработки. Oracle прекращает
контролировать использование индекса, если вводится команда alter index name no-
monitoring usage.
После того, как Oracle собрала статистику об использовании, можно
просмотреть представление производительности V$OBJECT_USAGE и выяснить,
используется ли ваш индекс пользователями предназначенным для него
способом. Записи для каждого индекса, отслеживаемого в течение срока службы
экземпляра, будут сохраняться в этом представлении по имени индекса и
связанной с ним таблицы. Как только вы впервые начинаете контролировать индекс, к
V$OBJECT_USAGE добавляется соответствующая запись. При последующих
попытках контролировать индекс новые записи добавлять в
V$OBJECT_USAGE не будут, но столбец MONITORING будет содержать YES
для этого индекса всякий раз, когда для индекса будет включаться контроль,
и любая предыдущая информация о контроле этого индекса в
V$OBJECT_USAGE будет очищаться и сбрасываться. Это представление также
содержит столбец USED. Возможные значения этого столбца — YES или N0,
благодаря чему его довольно легко интерпретировать. Если индекс
использовался в течение контрольного периода, Oracle указывает YES; в противном
случае, N0. Представление также содержит время начала и останова контрольного
периода.
Совет Чтобы увидеть статистику по индексу в V$OBJECT_USAGE,
необходимо зарегистрироваться в Oracle как пользователь, владеющий
индексом. Например, если проверяемый индекс принадлежит SCOTT, а вы
войдете как SYS и обратитесь к VSOBJECTUSAGE, вы не увидите информацию
для индекса SCOTT.
Контроль использования объекта: сценарий
Столбец USED в V$OBJECT_USAGE изменяется, только когда проверяемый
индекс используется, что позволяет отмечать, когда индексы используются, а
когда — нет. Для этого сценария мы воспользуемся стандартной таблицей
DEPT, принадлежащей нашему старому другу SCOTT. SCOTT беспокоится,
что индекс для столбца DEPTNO в таблице DEPT, PK_DEPT, неэффективно
используется другими пользователями Oracle, поэтому он регистрируется в
базе данных и начинает контролировать индекс PKDEPT. Он также
обращается к таблице V$OBJECT_USAGE, чтобы удостовериться, что все готово для
запуска контроля использования индекса. Эти действия показаны в
следующем коде:
№$&&№ SQL> connect scott/tiger
Connected.
SQL> alter index pk_dept monitoring usage;
Index altered.
SQL> select * from v$object_usage;
INDEX_NAME TABLE_NAME MONI USED START_MONITORING END_MONIT0RING
PK_DEPT DEPT YES NO 10/21/2001 13:21
В этот момент SCOTT убеждается, что контролируемый индекс включен.
Затем пользователь SYSTEM регистрируется в Огас1е9« и вводит следующий
запрос к таблице DEPT:
Управление объектами базы данных 555
f№WSgP? SQL> select * from dept;
DEPTNO DNAME LOG
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
Потом SCOTT снова обращается к представлению V$OBJECT_USAGE,
чтобы посмотреть на состояние дел:
ВМЙШ INDEX NAME TABLE NAME MONI USED START MONITORING END MONITORING
PK_DEPT DEPT YES NO 10/21/2001 13:21
Вы спрашиваете, как такое может быть? SYSTEM зарегистрировался и
обратился к таблице DEPT, a Oracle сообщает, что индекс столбца DEPTNO не
используется. Именно так и должно быть, потому что SYSTEM не обратился
таблице DEPT, основанной на содержании таблицы DEPTNO — SYSTEM
просто запросила все данные, приведшие к выполнению полного просмотра
таблицы в поисках данных из таблицы DEPT. Если бы SYSTEM ввел
команду select * from dept where deptno = 10, SCOTT бы увидел следующий
вывод:
иыазяиз INDEX NAME TABLE_NAME MONI USED START_MONITORING END_MONITORING
PK DEPT DEPT YES YES 10/21/2001 13:21
Закрепление пройденного материала
1. Необходимо знать, как использовать команду alter index monitoring
usage и alter index nomonitoring usage, и что цель этих команд —
позволить вам выяснить, используется ли индекс в базе данных.
2. Необходимо знать содержание представления V$OBJECT_USAGE. Оно
заполняется записями, имеющими отношение к индексам, проверяемым
только после того, как тот индекс был проверен впервые. Запись сохранится
после выключения контроля, и более поздние попытки контролировать
использование этого индекса очистят и сбросят значения от предыдущей
попытки.
3. Надо понимать, когда индексы используются и не используются в базе
данных. Индекс будет использоваться, если во фразе where есть ссылка на
индексированный столбец. Индекс не будет использоваться, если запрос
не имеет фразы where или обращается к неиндексированным столбцам.
Упражнения
1. Для ответа на вопрос используйте следующую информацию. У вас есть
таблица ODDS_AND_EVENS с двумя столбцами: THE_NAME и ТНЕ_
NUMBER. Для столбца THENUMBER существует индекс. Ваши
пользователи вводят следующий запрос к этой таблице: select * from
ODDS_AND_EVENS where mod (THE_NUMBER, 2) 0. Какой индекс ДЛЯ
столбца THE_NUMBER будет использован для выполнения этого запроса?
A. Битовый индекс
B. Индекс В-дерева
C. Индекс на основе функции
D. Убывающий индекс
2. Вы вводите команду alter index myidx monitor usage в базе данных
Oracle. Этот индекс контролируется во второй раз с момента создания базы
данных, и экземпляр закрывался только один раз с того момента, когда вы
контролировали этот индекс в последний раз. Какое из следующих утверж-
556
Глава 14
дений истинно в отношении содержимого представления
V$OBJECT_USAGE?
A. При вводе этой команды в V$OBJECT_USAGE будет размещена
новая запись, соответствующая MY_IDX.
B. При вводе этой команды в V$OBJECT_USACE будет размещена
вторая запись, соответствующая MY_IDX.
C. При вводе этой команды информация в существующей записи
MY_IDX в V$OBJECT_USACE будет очищена и сброшена.
D. При вводе этой команды информация в существующей записи
MYJDX в V$OBJECT_USAGE будет очищена, но не сброшена.
3. Вы прекращаете контроль индекса MY_IDX, который длился несколько
часов. Какая из следующих команд правильна относительно
V$OBJECT_USAGE в этом контексте?
A. Oracle удаляет из V$OBJECT_USAGE запись, соответствующую
MYJDX.
B. Oracle заполняет столбец END_MONITORING в записи,
соответствующей MY_IDX в представлении V$OBJECT_USAGE.
С Oracle заполняет столбец USED в записи, соответствующей MY_IDX
в представлении V$OBJECT_USAGE.
D. Oracle очищает все значения в записи, соответствующей MYJDX в
представление V$OBJECT_USAGE.
Ответы
1. С. 2. А. 3. В.
Управление целостностью данных
В этом разделе мы рассмотрим следующие темы, связанные с управлением
ограничениями целостности данных:
Ш Реализация ограничения целостности данных
■ Поддержка ограничений целостности
Ш Получение в Oracle информации об ограничении
Цель ограничения целостности заключается в установлении
определенных деловых правил. Например, в организации, которая хочет, чтобы у
каждого служащего была фамилия, существует три способа достижения этой
цели. Наиболее часто используемый в базах данных Oracle способ —
декларативное ограничение целостности. Столбец LASTNAME таблицы
EMPLOYEE может иметь ограничение не-NULL, которое не допускает
добавления строки информации без заполнения столбца LASTNAME.
Популярность ограничений целостности связано с тем фактом, что их легко
определять и использовать, они быстро выполняются, и очень гибки. В
этом разделе мы объясним, как использовать, поддерживать, и управлять
ограничениями целостности в Oracle.
Реализация ограничений целостности данных
Как вы помните со времени сдачи экзамена Огас1е9/ ОСР Introduction to SQL,
существует пять типов декларативных ограничений целостности в Oracle:
первичные ключи, внешние ключи, уникальные ключи, ограничения проверки и
ограничения hctNULL. Мы опишем каждый из них, чтобы освежить ваши
познания.
Управление объектами базы данных
557
Первичные ключи
Первичные ключи таблицы базы данных — это уникальный идентификатор
для этой таблицы, который отличает каждую строку в таблице от всех других
строк. Ограничение первичного ключа состоит из двух правил целостности
данных для столбца, объявленного в качестве первичного ключа. Во-первых,
каждое значение в столбце первичного ключа должно быть уникально в
таблице. Во-вторых, никакое значение в столбце, объявленном в качестве
первичного ключа, не может быть NULL. Первичный ключ — опорная сеть таблицы.
Следует тщательно выбрать первичный ключ для таблицы. Столбец или
столбцы, определенные в качестве первичных ключей, должны отражать наиболее
важную часть уникальной информации о каждой строке таблицы.
Внешние ключи
Создание ограничения внешнего ключа из одной таблицы в другую
определяет специальные отношения между двумя таблицами, которые часто
называются родительскими/дочерними отношения, как показано на рис. 14.9.
Родительская таблица — та, на которую ссылается внешний ключ, а дочерняя
таблица — та, которая фактически содержит внешний ключ. Администратор
БД должен гарантировать, что внешние ключи для одной таблице ссылаются
только на первичные ключи других таблиц. В отличие от ограничений
первичного ключа, ограничение внешнего ключа для столбца не мешает
пользовательским процессам устанавливать значения в столбце внешнего ключа
дочерней таблицы как NULL. В тех случаях, когда столбец NULL, ссылочная
целостность между дочерней и родительской таблицами проверяться не будет.
Уникальные ограничения
Подобно первичным ключам, уникальное ограничение гарантирует, что
значения в столбце, для которого определено уникальное ограничение, не
дублируются другими строками. Кроме того, уникальное ограничение —
единственный тип ограничения, помимо ограничения первичного ключа, имеющий
связанный с ним индекс, создаваемый с ним при названии ограничения.
Создание отношений
родительских/
дочерних таблиц
с помощью
внешних ключей
Ограничения не-NULL
У столбца, для которого применяется ограничение не-NULL, не может быть
значения NULL. Часто, администратор БД определяет это ограничение в соче-
ЕМР — родительская таблица
empid
empname salary
Smith
Jones
Kamil
Doody
105,000
56,000
78,00
18,000
BANK_ACCOUNT — дочерняя таблица
Bankacct
0304060
1374843
2342356
8543858
ABA_rtng#
empid
S95849235-090348 3
34874754 3
987234085 4
48594393 1
Отношения внешнего ключа
558
Глава 14
тании с другим ограничением. Например, ограничение не-NULL может
использоваться с ограничением внешнего ключа, чтобы принудительно ввести
проверку достоверности данных столбца для таблицы с достоверными значениями.
Ограничения проверки
Ограничения проверки позволяют администратору БД определить набор
достоверных значений для столбца, который Oracle будет проверять
автоматически при вставке строки с не-NULL значением для того столбца. Это
ограничение накладывается только на жестко закодированные достоверные значения.
Другими словами, ограничение проверки не может искать где-либо
достоверные значения, и не может выполнять какие-либо операции SQL или PL/SQL в
рамках своего определения.
Совет Первичные ключи и уникальные ключи создаются со связанным
уникальным индексом. Этот индекс сохраняет уникальность в столбце(цах), а
также облегчает быстродействующий поиск в таблице всякий раз, когда во
фразе where указывается первичный ключ.
Создание ограничения целостности
Определения ограничения управляются на уровне определения таблицы, или
в команде create table или alter table. Всякий раз, когда создается
ограничение, оно автоматически активизируется, если только для таблицы не
задано условие, нарушающее ограничение. Если ограничения нарушено, Oracle
создаст ограничение с заблокированным состоянием, а нарушающие
ограничение строки произвольно записываются в специальное местоположение. В
качестве альтернативы, можно определить ограничение, которое будет
заблокировано при создании с помощью фразы disable или принудительно задать
создание и активизацию ограничений с помощью фразы novalidate, которая
не проверяет достоверность данных. Ниже приводятся некоторые общие
рекомендации по созданию ограничений:
■ Помещать связанные с ограничениями индексы в табличное пространство
отдельно от данных таблиц.
■ Отключать ограничения перед загрузкой таблиц с большим количеством
данных в строках, а впоследствии повторно активизировать ограничения.
■ Создавать ограничения как откладываемые, если используются
самовызывающиеся ограничения внешнего ключа.
Создание первичных ключей и не-NULL ограничения
Первичный ключ определяется с помощью фразы constraint. Первичному
ключу необходимо дать имя, чтобы назвать связанный индекс. Тип
ограничения определяется в следующей строке; он будет первичным ключом, внешним
ключом, уникальным ограничением или ограничением проверки. Для
индексов, связанных с первичными и уникальными ключами, во фразе using tab-
lespace называется табличное пространство, используемое для сохранения
индекса. Из соображений производительности следует определить отдельное
табличное пространство для индексов и таблиц. Приведенный ниже блок кода
представляет создание таблицы с заданными ограничениями:
ЧФРВШ CREATE TABLE emp
( empid NUMBER NOT NULL, I
empname VARCHAR2O0) NOT NULL,
salary NUMBER NOT NULL,
CONSTRAINT pk_emp_01
PRIMARY KEY (^opid)
NOT DEFERRABLE
OSING INDEX TABLXSFACE indaxae_01 DISABLE)
TABLESPACE data_01;
Этот пример демонстрирует команду create table, определяющую
ограничения после того, как названы столбцы. Это называется определением
ограничения вне основного ограничения, потому что ограничения идут после
Управление объектами базы данных
559
столбцов. Это следует сделать, если в первичных или уникальных ключах
планируется использовать два или более столбцов. Ниже показан другой
способ — использовать команду create table со встроенными определениями
ограничения, но помните, что при этом ограничение может обращаться
только к столбцу, для которого оно является встроенным. Кроме того, помните,
что ограничения не-NULL должны всегда определяться как встроенные.
PSTlMB CREATE TABLE emp
( empid NUMBER
CONSTRAINT pk_emp_01
PRIMARY KEY NOT DEFERRABLE
USING INDEX TABLESPACE Lndaxas_01 ENABLE NOVALIDATE,
empname VARCHAR2(30) NOT NULL,
salary NUMBER NOT NULL )
TABLESPACE data_01;
Создание внешних ключей
Внешний ключ также определяется в команде create table или alter
table. Внешний ключ в одной таблице ссылается на первичный ключ в другой,
который иногда называется родительским ключом. Другая фраза, on delete
cascade, является необязательной. Когда она включена в команду, то
сообщает Oracle, что, если в ЕМР что-либо удалялось, в результате чего
банковский счет завис, соответствующая строка в BANKACCOUNT с тем же самым
значением для EMPID будет также удалена. Как правило, эти отношения
желательны, поскольку таблица BANKACCOUNT — дочерняя для таблицы
ЕМР. Если не включать опцию on delete cascade, то удаление записи из
ЕМР, которая имеет соответствующую дочернюю запись в BANK_ACCOUNT
с определенным EMPID, не разрешается. Кроме того, чтобы связывать два
столбца с помощью ограничение внешнего ключа, имена не должны быть
одинаковыми, но тип данных для каждого столбца должен быть идентичен.
1ШЗДИВ CREATE TABLE bankaccount
(bankacct VARCHAR2(40) NOT NULL,
aba_rtng_no VARCHAR2(40) NOT NULL,
empid NUMBER NOT NULL,
CONSTRAINT pk_bank_account_01
PRIMARY KEY (bankacct)
USING INDEX TABLESPACE indexes_01,
CONSTRAINT £k_b«nk_account_01
rOREIGN KEY (ampidF REFERENCES (amp.ampid)
ON DELETE CASCADE)
TABLESPACE data_01;
Совет Чтобы внешний ключ ссылался на столбец в родительской таблице,
типы данных обоих столбцов должны быть идентичны.
Создание уникального ограничения
и ограничения проверки
Определение уникального ограничения управляется следующим образом.
Предположим, администратор БД решает отслеживать номера телефона в
дополнение ко всем другим данным, отслеженным в ЕМР. Чтобы произвести
изменения в базе данных, вводится команда alter table. Аналогично
первичному ключу, индекс создан с целью подтверждения уникальности столбца.
Этот индекс идентифицируется именем, данным ограничению.
1ЧР*ШЗЯ alter table emp
add (homejphone varchar2(10)
constraint ux_emp_01 unique
using index tablespace indexes_01);
И последнее ограничение, которое мы рассмотрим, — ограничение
проверки. Вымышленная компания, использующая таблицы ЕМР и BANK_
ACCOUNT, устанавливает предел заработной платы для всех служащих
$110000 в год. Для отображения этой политики, администратор БД вводит
команду alter table, и ограничение вступает в силу сразу после ввода
560
Глава 14 j
команды. Если строка существует в таблице, в которой значение столбца нару- ;
шает ограничение проверки, ограничение блокируется.
ig«e»«a ALTER TABLE emp
ADD CONSTRAINT ck_emp_01
CHECK (salary < 110000)
Ограничение отложенности
Oracle подкрепляет успех декларативных ограничений целостности с
помощью новых особенностей их использования. Первое изменение, внесенное в
декларативные ограничения целостности в базе данных Oracle —
дифференцирование между задержанными и немедленными ограничениями.
Немедленные ограничения (immediate constraints) — это ограничения целостности,
которые принудительно применяются сразу после выполнения команды. Если
пользователь пытается вводить данные, нарушающие ограничение, Oracle
сообщает об ошибке, и делается откат команды. Вплоть до Огас1е8/, все
декларативные ограничения целостности в базе данных были немедленными. Однако
Огас1е8/ и более поздние выпуски позволяют также администратору БД
задержать проверку целостности базы данных. Отложенные (deferred) ограничения
целостности — это ограничения, которые не вводятся принудительно до тех
пор, пока пользователь не попытается зафиксировать транзакцию. Если в это
время введенные командами данные нарушают ограничение целостности,
Oracle сообщит об ошибке и произведет откат всей транзакции.
Пользователь может откладывать любое и все ограничения, которые
являются откладываемыми (deferrable), в течение всего сеанса с помощью
команды alter session set constraints=deferred. В качестве
альтернативы, пользователь может откладывать указанные по имени или все
ограничения для определенной транзакции с помощью set constraint name
deferred или set constraint all deferred. Эта форма отложенного
вычисления временно позволяет ввести в базу данных данные, которые
нарушают ограничения целостности. Например, в Огас1е7, не было никакого
способа вставить данные в дочернюю таблицу, для которой не было также
данных в родительской таблице. В Огас1е8/ пользователь может проводить
вставку в дочернюю таблицу перед вставкой данных в родительскую таблицу,
просто задерживая ограничение внешнего ключа. Пользователь может также
устанавливать ограничения для немедленного принудительного применения
с помощью команды set constraint name immediate или set
constraint all immediate. Можно задавать ограничения как откладываемые
(deferrable) или неоткладываемые (not deferrable), и как изначально отложенные
(initially deferred) или изначально немедленные (initially immediate). Эти
признаки могут быть различны для каждого ограничения. Они определяются
ключевыми словами во фразе constraint, которую мы рассмотрим ниже.
Deferrable или Not Deferrable Определение ограничения указывает,
может ли ограничение быть отложено пользователями. В этом определении
участвуют два фактора. Первый — возможность полностью отложить
ограничение. Если ограничение создано с ключевым словом deferrable,
пользовательские процессы Могут отложить ограничение, пока не будет
зафиксирована транзакция. Напротив, если ограничение создано с ключевым словом
not deferrable, то команды пользовательского процесса будут всегда
связаны ограничением целостности. Состояние not deferrable — значение по
умолчанию для ограничения. Если ограничение было создано с состоянием
not deferrable, то упомянутые выше команды для откладывания
ограничений целостности alter session и set использоваться не могут.
Initially Deferred или Initially Immediate Второй фактор —
задаваемое по умолчанию поведение ограничения. Первая опция должна отложить
ограничение, определенное с ключевым словом initially deferred. Эта
опция и описанная выше опция ключевого слова not deferrable являются
взаимоисключающими. Другая опция — принудительное введение ограниче-
Управление объектами базы данных
561
ния целостности, если только оно явно не отложено пользовательским
процессом, определенным ключевым словом initially immediate.
етм/ят create table employees
(empid NUMBER(IO) NOT NULL,
name VARCHAR2(40) NOT NULL,
salary NUMBER (10) NOT NULL,
CONSTRAINT pk_employees_01
PRIMARY KEY (empid) NOT DEFERRABLE);
Совет Если не включить признак откладываемости ограничения, Oracle
предположит, что ограничение нельзя откладывать. Более поздние
попытки ввести команду alter table modify constraint name deferrable
приведут к сообщению об ошибке. Чтобы сделать ограничение
откладываемым, необходимо удалить и восстановить ограничение.
Закрепление пройденного материала
1. Необходимо понимать, что такое декларативные средства целостности
данных, проверьте, сможете ли вы назвать пять типов ограничений
целостности, используемых в базе данных Oracle. Вы должны знать, как использовать
для создания ограничения команду alter table или create table.
S. Запомните, что Oracle создает индексы для поддержки первичного ключа и
уникальных ограничений в базе данных.
3. Помните, что при определении ограничений внешнего ключа между двумя
столбцами в двух разных таблицах, у этих двух столбцов должен быть один
и тот же тип данных. Однако имена столбцов должны быть разными.
Упражнения
1. Вы реализуете ограничение целостности в базе данных Oracle с помощью
следующей команды: alter table BMP add constraint PK_EMP_01
primary key (EMPNO) . Какое из следующих утверждений истинно в
отношении только что добавленных ограничений?
A. В результате этого ограничения Oracle создаст битовый индекс для
поддержки своих действий.
B. Ограничение будет обращаться к первичному ключу в другой таблице
за допустимыми значениями.
С Ограничение будет создано, но останется заблокированным, если все
значения в столбце EMPNO не уникальны и не NULL.
D. Ограничение принудительно установит уникальность, но разрешит
значения NULL.
S. Вы создаете таблицу с помощью следующей команды:
CREATE TABLE employees
(empid NUMBER(10) NOT NULL,
name VARCHAR2(40i NOT NULL,
salary NUMBER(IO) NOT NULL,
CONSTRAINT pk_employees_01
PRIMARY KEY (empid) NOT DEFERRABLE);
Затем к таблице добавляется несколько строк. Какой из следующих
вариантов указывает команду, ввод которой приведет к сообщению об ошибке?
A. alter table employees disable novalidate
pk_employees_0l;
B. alter table employees modify constraint
pk_employees_01 deferrable;
С alter employees enable novalidate pk_employees_01;
D. alter employees enable validate pk_employees_01;
Ответы
1. С. 2. В.
562
Глава 14
Поддержка ограничений целостности
Исторически, было два основных состояния для ограничений целостности:
включить и выключить. В более современных версиях базы данных Oracle
предлагаются вариации на эту тему. Например, состояние "включить" (enable)
теперь включает в себя состояние "включить с проверкой достоверности"
(enable validate), в результате чего текущее содержание столбца с
ограничениями проверяется на нарушение этих ограничений. Другое состояние
ограничений целостности, "включить без проверки достоверности" (enable novalidate),
позволяет Oracle принудительно установить ограничение для вводимых в
таблицу новых данных (enabling), но не для уже существующих в таблице данных
(no validating). Эти состояния полезны при вводе команды alter table tab-
le_name enable novalidate constraint constraint_name ИЛИ команды
alter table name enable validate constraint constraint_name.
Кроме того, Oracle может поддерживать уникальные ограничения,
принудительно устанавливаемые с помощью неуникальных индексов.
Индексированные как часть уникального ограничения столбцы должны быть первыми
столбцами в неуникальном индексе, и пока они — ведущие столбцы индекса,
они могут появляться в любом порядке. В индексе могут также быть и другие
столбцы, это делает его неуникальным. Данное свойство ускоряет процесс
включения первичного ключа или уникальных ограничений для таблицы.
Нельзя удалить неуникальный индекс, поддерживающий уникальный индекс
или ограничение первичного ключа.
Совет В версии OracIe8i и выше существует четвертое состояние для
ограничений целостности, disable validate. Это состояние ограничения
запрещает любую модификацию столбцов с ограничением. Кроме того,
индекс ограничении удаляется, а ограничение блокируется. Это полезно для
уникального ограничения; состояние disable validate позволяет
эффективно загружать данные из неразделенной таблицы в разделенную с
помощью опции exchange partition в команде alter table.
Ограничения выполняют отведенную им роль, если они включены, и не
работают, если они заблокированы. Команда alter table tblname enable
constraint включает ограничение. Дополнительные ключи validate или
novalidate позволяют Oracle проверять или не проверять данные,
находящиеся в настоящее время в столбце с ограничениями, на соответствие этим
ограничениям. Ключевое слово validate означает проверку данных согласно
правилам ограничения. Если Oracle выявляет несоответствие данных критериям
ограничения, то ограничение не включается. Ключевое слово novalidate
приводит к автоматическому включению ограничений без проверки данных, но
позднее у пользователей могут возникнуть проблемы при фиксации изменений,
если изменения содержат данные, нарушающие отложенное ограничение.
«8ЙИИИ8И ALTER TABLE emp ENABLE NOVALIDATE CONSTRAINT pk_emp_01;
ALTER TABLE EMP ENABLE VALIDATE CONSTRAINT PK_EMP_OI,
ALTER TABLE emp ENABLE CONSTRAINT pk_emp_01; — automatic validate
Гораздо проще отключение ограничения — просто воспользуйтесь
командой alter table tblname disable constraint. Команда alter table
tblname drop constraint позволяет снять ограничения с таблицы. Если
требуется удалить из базы данных таблицу, на которую ссылается внешний
ключ в других таблицах, введите команду drop table tblname cascade
constraints.
FHSHWftl ALTER TABLE emp DISABLE CONSTRAINT pk_emp_01;
ALTER TABLE emp DROP CONSTRAINT Ux_emp_01;
DROP TABLE emp CASCADE CONSTRAINTS;
Совет При использовании novalidate для отключения или deferrable
для откладывания первичного или уникального ключа, связанный индекс
должен быть неуникальным, чтобы в нем непродолжительное время хранились
потенциально нарушающие ограничение записи, пока транзакция не будет
зафиксирована.
Управление объектами базы данных
563
Таблица EXCEPTIONS
Единственный защищенный от неправильного использования способ
создания ограничения без возникающих при этом нарушений — создать
ограничение до вставки данных. В противном случае, необходимо уметь управлять
нарушениями с помощью таблицы EXCEPTIONS, которая создается с помощью
выполнения сценария utlexcpt. sql, поставляемого вместе с ПО Oracle. Как
правило, этот файл находится в подкаталоге rdbms /admin домашнего
каталога Oracle. В качестве альтернативы, пока столбцы еще не изменились со
времени их создания сценарием utlexcpt. sql для таблицы EXCEPTIONS,
можно воспользоваться таблицей, которой вы сами присвоите имя. Эта таблица
содержит столбец для ROWID нарушающей ограничение строки и имя
нарушенного ограничения. Если ограничения не имеют явных имен (например,
не-NULL), его именем будет имя, автоматически создаваемое Oracle в момент
создания ограничения. Фраза exceptions into помогает идентифицировать
строки, нарушающие устанавливаемЪе ограничение.
В приведенном ниже блоке кода демонстрируется нарушение
ограничения, вызываемое и затем разрешаемое с помощью таблицы EXCEPTIONS.
Сначала создадим проблему:
tc&wsxm SQL> truncate table exceptions;
Table truncated.
SQL> alter table emp disable constraint ux_emp_01;
Table altered.
'SQL> desc emp
Name Null? Type
EMPID NOT NULL NUMBER
EMPNAME NOT NULL VARCHAR2(30)
SALARY NOT NOLL NUMBER
HOME_PHONE VARCHAR2(10)
SQL> insert into emp (empid, erapname, salary , home_phone)
2 values (3049394), 'FERRIS", 110000, '1234567890');
1 row created
SQL> insert into emp (empid, empname, salary, home_phone)
2 values (40294932), 'BLIBBER', 50000, '1234567890');
1 row created.
SQL> commit;
Commit complete.
SQL> alter table emp enable validate Constraint ux_emp_01
2 exceptions into exceptions;
alter table emp enable validate constraint ux_emp_01
*
ERROR at line:
ORA-02299: cannot enable (SYS.UXEMP01) duplicate keys found
Как только вы столкнетесь с подобной проблемой, таблица EXCEPTIONS
поможет решить ее. Обратите внимание, что в EXCEPTIONS показаны все
строки, нарушающие ограничение. Можно также просто удалить
нарушающие ограничения, а затем добавить их после включения ограничения:
^ЗШ^£%$ SQL> select rowid, home_phone from emp
2 where rowid in (select row_id from exceptions);
ROWID HOME PHONE
AAAA8 9AAGAAAC JKAAA 1234567890
AAAA89AAGAAACJKAAB 1234567890
SQL> update emp set home_phone °= NULL where rowid =■
2 Chartorowid( ' AAAA8 9AAGAAACJKAAB' )
1 row updated.
SQL> commit;
Commit complete.
SQL> select * from emp;
EMPID EMPNAME SALARY HOME PHONE
3049394 FERRIS 110000 1234567890
40294932 BLIBBER 50000
SQL> alter table emp enable validate constraint ux_emp_01;
Table altered.
SQL> truncate table EXCEPTIONS;
Table truncated.
564
Глава 14
Совет Во избежание путаницы с нарушающими ограничения строками из
разных таблиц, не забудьте очистить таблицу EXCEPTIONS до и после ее
использования.
Закрепление пройденного материала
1. Необходимо понимать, что принудительная установка ограничений на
таблицу зависит от того, включены эти ограничения или нет. Если
ограничение включено, Oracle проверяет достоверность поступающих данных. Если
не включено, Oracle этого не делает.
2. Ключевые Слова validate и novalidate позволяют определить, будет или
нет Oracle проверять на нарушения существующие данные таблицы.
Упражнения
1. Вы управляете ограничениями целостности в Oracle. В каком из
следующих вариантов указана команда, используемая при отключении
ограничения целостности первичного ключа?
A. alter table
B. alter constraint
C. alter index
D. alter system
2. Вы хотите определить, какие строки в таблице нарушают ограничение
целостности, которое вы пытаетесь включить. Какой из следующих
сценариев вы использовали бы для создания объектов базы данных,
поддерживающих эту деятельность?
A. utlfile.sql
B. utlxplan.sql
С.catalog.sql
D. utlexcpt.sql
Ответы
1. A. 2. 0.
Получение из Oracle информации
об ограничениях
К информации об ограничениях можно обратиться несколькими способами.
Многие из представлений словаря данных показывают ограничения под
разными углами зрения. Хотя каждое из перечисленных представлений имеет
префикс DBA_, представления также доступны в версиях ALL_ или USER_, с
ограниченными следующими способами данными. Представления ALL_
соответствуют объектам данных, привилегиям и т.д., доступным выполняющим
запрос пользователям, а представления USER_ соответствуют созданным
пользователями объектам данных, привилегиям и т.д.
DBA CONSTRAINTS
Это представление приводит подробную информацию обо всех ограничениях
в системе: имя ограничения, владелец ограничения, тип ограничения,
состояние и ссылочное имя столбца и владелец родительского ключа, если это
ограничение является ограничением внешнего ключа. Единственное слабое место
Управление объектами базы данных
565
этого представления — при попытке отыскать имя родительской таблицы для
ограничения внешнего ключа администратору БД приходится искать таблицу,
чей первичный ключ аналогичен столбцу, указанному для ссылочного имени
столбца. В некоторых важных или новых столбцах этого представления для
Огас1е9/ содержится следующее:
■ CONSTRAINT_TYPE Отображает р для первичного ключа, г для
внешнего ключа, с для ограничения проверки (включая проверки на то, что
данные не-NULL), и и для уникальных ограничений
■ SEARCH_CONDITION Отображает критерии ограничения проверки
■ R_OWNER Отображает владельца ссылочной таблицы, если
ограничение — внешний ключ
■ R_CONSTRAINT_NAME Отображает имя первичного ключа в
ссылочной таблице, если ограничение — внешний ключ
■ GENERATED Указывает, было ли имя ограничения определено
создавшим таблицу пользователем, или сгенерировано Oracle
■ BAD Указывает, содержит ли ограничение проверки ссылку на год из
двух цифр, т.е. проблема совместимости-2000.
DBA CONS COLUMNS
Это представление содержит подробную информацию о каждом связанном с
ограничением столбце. Представление включает имя ограничения и
связанной таблицы, а также имя столбца в ограничении. Если ограничение состоит
из нескольких столбцов, как в первичном ключе, уникальном ограничении и
ограничении внешнего ключа, позицию или порядок столбцов указывается
значением 1, 2, 3... п в столбце POSITION этого представления. Особенно
полезно знать позицию столбца при оптимизации запросов SQL, чтобы
использовать сложные индексы при наличии соответствующего ограничению
индекса.
Закрепление пройденного материала
Необходимо знать, где в словаре данных можно выяснить, включено
состояние ограничения или выключено, и где определить, что для столбцов имеются
ограничения целостности.
Упражнения
1. Это представление, которое используется для выяснения существования
ограничения для конкретного столбца в таблицах Oracle: .
2. Это представление, которое используется для выявления ограничений,
связанных с конкретной таблицей в Oracle: .
Ответы
1. DBA_CONS_COLUMNS. 2. DBA_CONSTRATNTS.
Резюме главы
В этой главе мы рассмотрели много вопросов, касающихся подготовки к
экзамену "Основы АБД I". Мы начали с административных аспектов
управления таблицами в базе данных Oracle. Вы узнали о различных типах таблиц и
относительных преимуществах и недостатках каждого из них для сохранения
данных в Oracle. Кроме того, вы рассмотрели различные типы данных,
доступные в Oracle. Мы обсудили назначение и структуру ограниченного и
расширенного ROWID, а также краткую историю каждого из них в базе данных
Oracle. Затем мы перешли к обсуждению внутренней структуры блоков в
566
Глава 14
Oracle, и структуры данных строки внутри блоков. Вы также научились в
качестве администратора создавать стандартные и временные таблицы.
Подробно обсуждалось и управление структурами памяти (то есть сегментами и
экстентами) в пределах таблиц. Вы научились поддерживать таблицы,
включая реорганизацию, усечение и удаление таблицы, и удаление
неиспользованных столбцов. Затем мы перешли к индексам в Oracle. Вы узнали об
административных аспектах индексов, например, создании, поддержке,
оперативном восстановлении и удалении индексов. Вы научились выяснять,
используется индекс или нет, и где в словаре данных найти информацию об
индексах. Наконец, мы обсудили ограничения целостности в Oracle. Вы
научились создавать их, управлять ими и находить информацию о них в словаре
данных.
Двухминутное погружение в пройденное
■ Существует четыре типа таблиц: стандартные таблицы, разделенные
таблицы, кластерные таблицы и таблицы с индексной организацией.
■ Существуют две категории типов данных: определяемый пользователем и
встроенный.
■ Существуют три класса встроенных типов: скалярный тип, тип коллекции
и тип отношений.
■ К скалярному типу стандартного размера относятся CHAR, NCHAR,
VARCHAR2, NVARCHAR2, DATE, RAW, ROWID и NUMBER.
■ К скалярному типу большого размера относятся LONG и LONG RAW из
Огас1е7, а также CLOB, NCLOB, BLOB и BFILE.
■ К типу коллекции относится VARRAY — массив переменной длины, и
TABLE — тип вложенной таблицы.
■ Тип отношений — это указатель на другие данные в другой таблице.
■ Для типов коллекции и отношений требуется установление в Oracle
объектной опции.
■ Вам будет легче запомнить компоненты ROWID, если представить
сокращения BRF и OBRRF как рычание собаки.
■ Напомним использование каждой из опций определения памяти и
создания таблицы:
Ш initial Первый сегмент в таблице
■ next Следующий назначенный сегмент (а не просто второй в
таблице)
■ pctincrease Увеличение в процентах следующего экстента,
назначенного сверх значения next
■ minextents Минимальное число экстентов, назначенных при
создании таблицы
■ maxextents Максимальное число экстентов, которое может
назначить объект
■ pctf гее Сколько места в каждом блока остается свободным после
вставки строки
■ pctused Пороговое значение, ниже которого должен снизиться
показатель использования перед добавлением строки
■ initrans Число параллельных изменений, которое может
происходить в блоке
Управление объектами базы данных
567
■ maxtrans Максимальное число транзакций, которые могут
выполнять одну и ту же функцию
■ logging/nologging Будет ли Oracle хранить повтор для команды
create table
■ cache/nocache Позволит ли Oracle блокам оставаться в буферном
кэше после полных просмотров таблицы
■ Миграция строк — когда в результате обновления строка становится
слишком большой, чтобы оставаться в первоначальном блоке.
Ш Формирование цепочки — процесс разбиения строк и сохранения в
нескольких блоках. Для обоих требуется многократное считывание с диска/запись на
диск для отыскания/сохранения, поэтому их производительность низка.
Ш Индексы используются для повышения производительности
относительно объектов базы данных в Oracle. Типы индексов в Oracle: битовые,
индексы В-дерева, убывающие, индексы на основе функции и индексы
обратного ключа.
■ Битовые индексы лучше всех повышают производительность для
столбцов, содержащих статические значения, где мало элементов или мало
уникальных значений.
Ш Индексы В-дерева всех повышают производительность для столбцов,
содержащих значения с большим числом элементов.
Ш Принимая решение создать индекс, необходимо соотношение повышения
производительности от использования индекса и создаваемых накладных
расходов производительности при изменении данных индекса с помощью
команд DML.
■ Параметр pctused недоступен для индексов, т.к. каждый индексный блок
всегда доступен для изменений данных, в результате Oracle приходится
сохранить данные в том порядке, как в индексе.
■ DBAJNDEXES и DBA_IND_COLUMNS — представления словаря,
хранящие информацию об индексах.
■ Ограничения целостности данных объявляются в базе данных Oracle как
часть определения таблицы.
■ Существует пять типов ограничений целостности:
И Первичный ключ Идентифицирует каждую строку в таблице как
уникальную
■ Внешний ключ Создает ссылочную целостность между двумя
таблицами
■ Уникальное Требует, чтобы в столбце все не-NULL значения были
уникальными
■ He-NULL Требует, чтобы каждое значение в столбце было не-NULL
■ Проверка Проверяет каждый элемент столбца по набору
допустимых значащих констант
Ш Существуют состояния ограничения в Oracle, включая откладываемые или
неоткладываемые ограничения.
Ш Кроме того, можно включить ограничение для таблицы без проверки
достоверности существующих данных в столбце с ограничениями с
помощью фразы enable novalidate.
■ Для принудительного ввода уникального ограничения и ограничения
первичного ключа Oracle использует уникальные индексы, если ограничения
568
Глава 14
неоткладываемые. Если ограничения откладываемые, то Oracle использует
для них неуникальные индексы.
Ш После создания ограничения, каждая строка в таблице проверяется на
соответствие ограничениям.
■ В таблице EXCEPTIONS хранятся строки, нарушающие созданное для
таблицы ограничение целостности.
Ш Таблица EXCEPTIONS создается с помощью сценария utlexcpt. sql.
■ Представления словаря данных DBA_CONSTRAINTS и DBA_CONS_
COLUMNS отображают информацию об ограничениях базы данных.
Ш Ограничения можно включать или выключать. Если ограничения
включены, они будут выполняться в принудительном порядке. Если выключены,
то не будут.
Вопросы для самопроверки
1. Ключевое слово для того, чтобы при действиях над таблицей OOL в журнал
базы данных не заносились какие-либо элементы: .
2. Тип данных, позволяющий хранить в столбце таблицы до 4 Гбайт текстовых
данных: .
3. Термин, используемый для описания, что Oracle должна делать при
попытках пользователей добавить большее количество данных к существующей
строке в базе данных, когда в блоке с этой строкой не хватает места для
роста строки: .
4. Область доступности, используемая при определении временных таблиц в
Oracle: .
3. Тип индекса, хранящий числа от самого большого до самого маленького, а
не от самого маленького до самого большого: .
6. Конструкция определения блока, которая подходит для определения
индексов: .
7. Декларативное ограничение целостности, не позволяющее вводить в
столбец дублирующие значения: .
8. Представление словаря, содержащее перечень всех столбцов, которые
являются частью декларативного ограничения целостности: .
Вопросы ко всей главе
1. Вы хотите вычислить статистику для оптимизации на основании стоимости
по всем строкам таблицы EMPLOYEE, используя параметры по умолчанию
Oracle. Который из следующих вариантов содержит необходимую команду?
A. analyze table EMPLOYEE validate structure;
B. analyze table EMPLOYEE compute statistics;
С analyze table EMPLOYEE estimate statistics;
D. analyze table EMPLOYEE estimate statistics sample
10 percent;
2. Администратор БД считает, что в базе данных происходит формирование
цепочки и миграция строк. Какой из следующих вариантов указывает на
способ обнаружить это?
A. select CHAIN_CNT from DBA_SEGMENTS
B. select CHAIN CNT from DBA TABLES
Управление объектами базы данных
569
С select CHAIN_CNT from DBAJDBJECTS
D. select CHAIN_CNT from DBA_EXTENTS
3. Который из следующих типов данных используется в ситуациях, где
требуется упорядоченный набор элементов данных, а все элементы имеют один
и тот же тип данных, и где предварительно задается число элементов,
которые появятся в наборе?
A. REF В. TABLE
C. CLOB D. VARRAY
4. Какой из следующих вариантов описывает результат использования фразы
nologging при вводе команды create table as select?
A. Замедляет производительность при создании таблицы
B. Обеспечивает возможность восстановления создания таблицы
С Улучшает производительность при создании таблицы
D. Делает постоянным чтение блоков в память во время полных
просмотров таблицы
5. Какой из следующих элементов, хранящихся в заголовке сегмента для
таблицы, указывает максимальный размер, когда-либо достигнутый таблицей?
A.ROWID
В. Верхняя отметка
С Адрес сеанса
D. Ни один из вышеупомянутых
6. Администратор БД разрабатывает модель данных для приложения. Какое
из следующих утверждений ложно в отношении первичного ключа?
A. Первичный ключ не может быть NULL.
B. Значения отдельного или сложного столбца, объединение которых
создает первичный ключ, должны быть уникальными.
C. Все значения столбца в первичном ключе соответствует значению
первичного ключа другой таблицы.
D. Первичный ключ идентифицирует уникальность этой строки в
таблице.
E. Связанный индекс создается с первичным ключом.
7. Для какой из следующих целей администратор БД может использовать
столбец POSITION в DBA_CONS_COLUMNS в работе с разработчиками
приложений?
A. Для указания позиции ограничения на диск
B. Для связывания с иерархической позицией таблицы в модели данных
C. Для улучшения масштабируемости базы данных Oracle
D. Для указания позиции столбца в сложном индексе
8. Администратор БД оценивает, какой индекс использовать в приложении.
В какой из следующих ситуаций битовые индексы улучшают
производительность базы данных?
A. Команды select для столбца, указывающего состояние служащего, в
котором имеется только четыре уникальных значения на 50 000 строк
B. Команды update, где изменяется индексированный столбец
С Команды delete, где одновременно удаляются только одна или две
строки
D. Команды insert, где одновременно добавляется несколько сотен
строк
570
Глава 14
9. Администратор БД разрабатывает сценарий создания индекса. Какой из
следующих вариантов лучше всего объясняет причину, почему индексы не
допускают определение опции памяти pctused?
A. Индексы имеют заданную настройку pctused = 25.
B. Oracle должна содержать элементы индекса в порядке, поэтому
индексные блоки постоянно обновляются.
C. Индексы не изменены, если они не восстановлены.
D. Индексы не будут изменяться после превышения порогового
значения pctf гее.
10. Администратор БД разрабатывает архитектуру, позволяющую
поддерживать просмотр больших документов и систему перекрестных ссылок на
систему, используемую для хранения руководств по стратегии. Архитектура
включает несколько таблиц, в которых будут находиться более 30 000 000
строк. Какой из следующих проектов таблицы больше всего
соответствовал бы этой архитектуре?
A. Разделенные таблицы
B. Таблицы с индексной организацией
C. Сгруппированные таблицы
D. Стандартные таблицы
11. Какой из следующих вариантов подходит для проектирования таблицы, в
которой принудительно устанавливается уникальность столбца?
A. Уникальное ограничение
B. Битовый индекс
C. Первичный ключ
D. Внешний ключ
E. Ограничение не- NULL
F. Разделенный индекс
G. Уникальный индекс
Н. Ограничение с проверкой
12. При проектировании архитектуры базы данных, которая максимально
повышает производительность для команд select, каждый из следующих
вариантов повышает производительность, за исключением .
A. Использование индексов для столбцов, часто используемых во фразе
where. *
B. Использование битовых индексов для часто изменяемых столбцов
C. Помещение в отдельное табличное пространство индексов таблиц на
разных дисках
D. Проектирование таблиц с индексной организацией по командам
select, используемым в приложении
13. При попытке повторно включить первичный ключ после загрузки данных,
администратор БД получает следующее сообщение об ошибке:
"ORA-02299: cannot enable (SYS.UX_EMP_01) - duplicate keys found." Где
администратор БД может посмотреть, какие строки вызвали нарушение?
A. DBA_CONS_COLUMNS
B. DBA_CONSTRAINTS
C. DBA_CLU_COLUMNS
D. EXCEPTIONS
Управление объектами базы данных
571
14. Администратор БД замечает, что сгенерированные системой индексы,
связанные с ограничениями целостности в базе данных Oracle,
определены как неуникальные. Какой из следующих вариантов точно указывает
причину этого?
A. Неоткладываемые ограничения первичного ключа
B. Откладываемые уникальные ограничения
С Внутренняя ошибка
D. Неполная загрузка данных
Ответы на вопросы для самопроверки
1. nologging
2. CLOB
3. Миграция
4. GLOBAL
5. Убывающий
6. pctused
7. Уникальное
8. DBA_CONS_COLUMNS
Ответы на вопросы ко всей главе
1. В. analyze table EMPLOYEE compute statistics;
Объяснение В этом вопросе есть намек — вас просят вычислить статистику
для всех строк в таблице. В этой ситуации нельзя провести оценку, потому что
вы обрабатываете все строки в таблице, не только некоторые из них. Таким
образом, варианты С и D неправильны. А поскольку фраза validate
structure только проверяет структурную целостность блоков данных,
вариант А также неправилен.
2. В. select CHAIN_CNT from DBA_TABLES
Объяснение Столбец CHAIN_CNT найден в представлении словаря
DBA_TABLES, поэтому вариант В правильный. Хитрость этого вопроса в том,
что надо указать не откуда данные прибывают, т.к. очевидно, что они из
столбца CHATN_CNT, который заполняется с помощью команды analyze.
Надо знать, где в словаре находится информация. Перед экзаменом "Основы
АБД II" просмотрите все представления словаря из этой главы и выполните
для них команду des cr ibe, чтобы понимать, какие столбцы что показывают.
3. D. VARRAY
Объяснение Суть вопроса, а именно упорядоченный набор элементов
данных, где все элементы одного типа данных, и где вы предварительно задаете
число элементов, которые появятся в наборе, указывает на свойства,
доступные в VARRAY. Вложенная таблица — неправильный ответ, т.к. вложенная
таблица — это неупорядоченный набор, что исключает вариант В. Вариант А,
REF, является типом отношений, хранящим указатель на данные, а не сами
данные, и поэтому неправилен. Наконец, CLOB — большой текстовый
объект, это исключает вариант С.
4. С. Повышает производительность при создании таблицы
Объяснение Поскольку nologging не позволяет команде create table as
select генерировать какую-либо информацию о повторе,
производительность в течение всей операции несколько повышается. Это логическая проти-
572
Глава 14
воположность варианта А, и с учетом остальных фактов, вариант А
неправильный. Вариант В также неправилен, потому что отключение генерации
информации о повторах означает, что операция невосстанавливаемая.
Наконец, вариант D неправилен, потому что опция cache не устанавливает
nologging, а заставляет блоки постоянно считывать в память при просмотре
всей таблицы.
5. В. Верхняя отметка
Объяснение Информация о ROWID — это просто указатель на строки в
таблице. Он не определяет размер этой таблицы. Таким образом, вариант
неправилен. Вариант С неправилен, потому что адрес сеанса — динамическая
информация о пользовательских процессах, в настоящее время связанных с
Oracle. Это не имеет никакого отношения к размеру какойлибо таблицы
где-либо в базе данных. Поскольку вариант В правилен, вариант D также
логически неправилен.
6. С. Каждое значение столбца в первичном ключе соответствует значению
первичного ключа в другой таблице.
Объяснение Все другие команды, выполненные для первичных ключей
правильны. Они должны быть не NULL и уникальны, что позволит им
уникальным образом представлять каждую строку в таблице. Связанный индекс также
создается с первичным ключом. См. обсуждение первичного ключа в рамках
ограничений целостности.
7. D. Идентифицировать позицию столбца в сложном индексе
Объяснение Ограничения хранятся с определением данных таблицы,
безотносительно значения в POSITION. Поэтому, вариант А неправилен.
POSITION также не имеет никакого отношения к родительским/дочерним
иерархиям в модели данных или к масштабируемости, исключая, таким
образом, варианты В и С. Об ограничениях см. обсуждение использования
представлений словаря.
8. А. Команды select для столбца, указывающего статус служащего,
который имеет только четыре уникальных значения для 50 000 строк
Объяснение Битовые индексы предназначены для повышения
производительности для таблицы, чей столбец содержит относительно статические
данные с небольшим количеством элементов. Это означает, что в большом пуле
строк находится мало уникальных значений. Четыре уникальных значения из
50000 довольно очевидно характеризуют его. Вариант В неправилен из-за
того, что значения столбца относительно статические. Поскольку изменение
значения в битовом индексе требует интенсивной работы процессора,
рекомендуется использовать битовый индекс для статических значений столбца.
9. В. Oracle должна поддерживать элементы индекса в порядке, чтобы
индексные блоки постоянно обновлялись.
Объяснение Как вы помните из обсуждения работы индексов, чтобы Oracle
могла поддерживать индексированный порядок, все блоки должны быть
постоянно доступны для обновления. Таким образом, вариант В — правильный
ответ на этот вопрос. Кроме того, для индексов не существует значения по
умолчанию pctused.
10. А. Разделенные таблицы
Объяснение 30 000000 строк — довольно большой объем данных, чтобы
ими можно было управлять в обычной таблице. Таким образом, сразу же
следует исключить вариант D. Умный администратор БД сделает данные
максимально доступными, обеспечив разделение таблицы и распределив разделы по
нескольким дискам, что позволит вести параллельную обработку. Хотя
таблицы с индексной организацией предназначены для просмотра текста, их нельзя
разделять, и, следовательно, они не подходят для хранения этих больших дан-
Управление объектами базы данных
573
ных. Таким образом, исключите вариант В. Наконец, поскольку ничего не
сказано об объединениях таблиц, нет никаких причин выбирать вариант С.
11. А, С, и G. Уникальное ограничение, первичный ключ, уникальный индекс
Объяснение Уникальные индексы требуют уникальности значений в
столбце или столбцах. Они также используются Oracle в качестве основной логики
для первичных ключей и уникальных ключей. Благодаря этому факту А, С, и
G — правильные ответы. Варианты D и Е исключаются, потому что ни один
из этих декларативных ограничений целостности не имеет уникальных
индексов или какого-либо другого механизма поддержки уникальности. Битовый
индекс тоже не может быть уникальным, что исключает вариант В.
12. В. Использование битовых индексов для часто изменяемых столбцов
Объяснение Битовые индексы никогда не должны использоваться для часто
изменяемых столбцов, потому что эти изменения очень дорого обходятся для
поддержания индекса. Использование индекса для столбцов, часто
используемых во фразе where, помещение индексов в отдельное табличное
пространство из таблиц на другом дисковом ресурсе, и разработка таблицы с индексной
организацией с помощью используемых в приложении команд select —
хорошие методы повышения производительности.
13. D. EXCEPTIONS
Объяснение Если ограничение не удастся установить, вы вряд ли заглянете
в словаре данных. Этот факт исключает варианты А, В и С. Вместо этого вы
смотрите в таблице EXCEPTIONS. Вспомните, что исключения во фразе
EXCEPTIONS в команде alter table enable constraint позволяют
поместить нестандартные записи в таблицу EXCEPTIONS для последующего
обзора и исправления.
14. В. Откладываемые уникальные ограничения
Объяснение Исчерпывающее рациональное объяснение описанной в этом
вопросе ситуации, а именно, что произведенные системой индексы,
связанные с ограничениями целостности в этой базе данных Oracle, были
определены как nonunique, является целиком и полностью следствием ограничений
целостности. Поскольку это ограничение откладываемое, индекс не может быть
уникален, потому что во время транзакции он должен принять новые записи.
Предпринятая пользователем попытка фиксации приводит к откату
транзакция, если ограничения не выполнены.
ГЛАВА 15
Управление пользователями
базы данных
Управление пользователями базы данных
575
этой главе мы познакомимся со следующими темами, а потом
проверим свои знания по ним:
■ Управление пользователями
■ Управление ресурсами и защитой пароля
■ Управление привилегиями
■ Управление ролями
Основная тема этой главы — функциональные возможности ограничения
доступа к базе данных Oracle. Существует несколько различных аспектов
ограничения использования базы данных. Во многих крупных организациях
безопасностью занимается администратор по безопасности. В Oracle администратор
БД вообще не управляет функциональными возможностями безопасности. Но
как специалисту по программному обеспечению Oracle вам полезно
ознакомиться с этой темой, чтобы лучше управлять базой данных Oracle. Обратите
внимание, по ходу обсуждения мы будем использовать термины
"администратор БД" (DBA) и "администратор по безопасности" (security administrator).
Эти вопросы входят в экзаменационные вопросы о безопасности.
Приблизительно 16% экзаменационных материалов "Основы АБД I" касаются
безопасности базы данных.
Управление пользователями
В этом разделе будут рассмотрены следующие темы, связанные с управлением
пользователями:
И Создание новых пользователей базы данных
■ Изменение и удаление существующих пользователей
■ Контроль информации о существующих пользователях
Самая безопасная база данных — та, в которой нет пользователей, однако
без пользователей в базе данных мало смысла! В этом разделе речь пойдет о
предусмотрительном создании пользователей в Oracle. Вы изучите основной
синтаксис создания пользователей и узнаете, как при этом избежать проблем.
Этот раздел предшествует обсуждению ресурсов и защиты пароля, но сначала
поговорим о создании пользователей.
Создание новых пользователей базы данных
Одна из основных задач при создании новой базы данных — добавление
новых пользователей. Однако создание пользователей происходит постоянно.
Поскольку пользователи приходят и уходят, необходимо также отслеживать
доступ к базе данных, предоставленный таким пользователям. Собственный
метод аутентификации базы данных Oracle позволяет создавать новых
пользователей с помощью команды create user:
Kffi«j CREATE USER spanjcy
IDENTIFIED BY firstOl
DEFAULT TABLESPACE users_01
TEMPORARY TABLESPACE temp_01
QUOTA 10M ON users_01
PROFILE app_developer
PASSWORD EXPIRE
ACCOUNT UNLOCK;
Содержащиеся в этой команде сведения образуют синтаксис и семантику
создания пользователей, и мы рассмотрим их в следующем подразделе:
create user
Это имя пользователя в Oracle. Если разрешение на доступ к базе данных
предоставляется пользователям с помощью аутентификации операционной сие-
576
Глава 15
темы, то по умолчанию имени пользователя должен предшествовать OPS$. Во
всех остальных случаях рекомендуется включать в имя пользователя только
буквенно-цифровые символы, хотя в именах пользователя разрешены
символы _ и #. Имя должно начинаться с буквы. В однобайтовых наборах символов
имя может занимать от 1 до 30 символов, а в многобайтовых наборах символов
имя пользователя не должно быть длиннее 30 байт. Кроме того, согласно
рекомендациям Oracle имя должно содержать один однобайтовый символ. Имя
пользователя не зависит от регистра и не может быть зарезервированным
словом.
identified by
Это пароль пользователя базы данных Oracle. Элемент должен содержать, по
крайней мере, три символа, но лучше не менее шести. Вообще,
рекомендуется, чтобы пользователи меняли свои пароли, как только узнают о создании для
них имени пользователя. Oracle принудительно реализует эту рекомендацию с
помощью фразы password expire. Нельзя использовать для новых паролей
какие-либо слова или имена, кроме того, рекомендуется включать в пароль
цифру. Как и имя пользователя, пароль может быть, максимум, 30 байт в
длину и не может быть зарезервированным словом. При использовании
аутентификации с помощью операционной системы применяются определяемые
внешне ключевые слова. Это единственный аспект ID пользователя в Oracle,
который пользователям разрешается изменять с помощью команды alter
user.
default tablespace
Управление табличным пространством — чрезвычайно важная задача в Oracle.
Заданное по умолчанию табличное пространство указывает местоположение,
в котором создаются по умолчанию объекты базы данных пользователя. Эта
конструкция играет важную роль в защите целостности табличного
пространства SYSTEM. Если для пользователя не задана эта конструкция, создаваемые
пользователем объекты могут оказаться в табличном пространстве SYSTEM.
Напомним, что SYSTEM содержит много объектов баз данных, например
словарь данных и сегменты отката SYSTEM, имеющие решающее значение для
использования базы данных. Нельзя разрешать пользователям создавать свои
объекты базы данных в табличном пространстве SYSTEM.
temporary tablespace
Как мы уже отмечали при обсуждении создания баз данных, Огас1е9/
позволяет создавать табличное пространство по умолчанию или во время создания
базы данных, или во время ее изменения с помощью команды create
temporary tablespace. Создавая табличные пространства по умолчанию, нет
необходимости указывать фразу temporary tablespace для каждого
создаваемого пользователя. Команды create user или alter user с опцией
temporary tablespace позволяют назначать пользователей иному, чем по
умолчанию, табличному пространству.
Замечание Если при создании имени пользователя администратор БД не
определил табличное пространство по умолчанию и не указал явно
temporary tablespace, все временные сегменты для такого пользователя
окажутся в табличном пространстве SYSTEM. А как вы уже знаете,
SYSTEM— это ценный ресурс, который не следует использовать под
хранение пользовательских объектов.
quota
Квота — это предельное значение пространства, которое могут занимать
пользовательские объекты базы данных в пределах табличного пространства. Если
Управление пользователями базы данных
577
пользователь пытается создать объект базу данных, превышающий квоту этого
пользователя в данном табличном пространстве, то в сценарии создания
объекта произойдет сбой. Квоту можно задавать в килобайтах (Кб) или
мегабайтах (Мб). Для каждого табличного пространства, кроме временного, к
которому пользователь будет обращаться для создания объектов базы данных,
следует вводить отдельную фразу quota. Если вы хотите, чтобы пользователь
мог использовать все табличное пространство, можно задать quota
unlimited on tblspcname.
Совет Квота на табличное пространство нужна пользователям только
для создания объекта базы данных. Им не нужна квота при обновлении,
вставке или удалении данных в существующем объекте, размещенном
в табличном пространстве, пока у них есть соответствующая привилегия
для выполнения этих операций на объекте.
profile
Профили (profiles) — это связанные наборы параметров использования
ресурса, который администратор БД может задать так, чтобы ограничить для
пользователя полное использование хост-машины. Основная идея их применения
заключается в том, что многим конечным пользователям системы во время
сеанса требуется только определенная часть мощности хост-машины. Чтобы
свести к минимуму вероятность того, что один пользователь сможет повлиять
на общую производительность базы данных с помощью, допустим, плохо
сформулированного незапланированного отчета, который создает огромную
проблему для базы данных, можно назначать каждому пользователю профиль,
ограничивающий время, которое они могут потратить на систему.
password expire
Эта фраза заставляет пользователей изменять пароль при первой регистрации
в Oracle. Этот дополнительный уровень защиты пароля гарантирует, что даже
администратор БД не узнает пароль пользователя. Если не включить эту
фразу, пользователю не придется изменять пароль при первой регистрации в
Oracle.
account unlock
Эта фраза установлена по умолчанию для созданных учетных записей
пользователей. Она предназначена для того, чтобы учетная запись пользователя сразу
становилась доступной для использования. Фраза account lock позволяет
администратору БД запретить пользователям использовать их учетные записи.
Создание пользователя, аутентифицируемого операционной
системой
Аутентификация пользователя базы данных Oracle может выполняться на
различных уровнях — непосредственно в Oracle, операционной системой или
удаленным сервисом. В предыдущем разделе было рассмотрено создание
пользователей, аутентифицируемых Oracle. Следующая команда показывает, как
создать пользователя, аутентифицируемого операционной системой:
РИЯОТ. CREATE USER Sam
IDENTIFIED EXTERNALLY
DEFAULT TABLESPACE users;
Эта команда создает пользователя SAM, которого будет аутентифициро-
вать операционная система. Это означает, что на машине с базой данных
Oracle пользователь SAM должен иметь учетную запись операционной
системы. Зарегистрировавшись на машине, он должен ввести следующую команду,
чтобы зарегистрироваться в базе данных:
578
Глава 15
Перед созданием пользователя, аутентифицируемого операционной
системой, следует определить параметр инициализации OS_AUTHENT_PREFIX.
Этот параметр определяет формат имени пользователя, аутентифицируемого
операционной системой. По умолчанию он задается как OPS$ в целях
обратной совместимости, но теперь может задаваться и как NULL:
fiHWHWW OS_AUTHENT_PREFIX =
Если задать параметр REMOTE_OS_AUTHENT как TRUE, это позволит
пользователям, аутентифицируемым операционной системой,
регистрироваться в Oracle с удаленной машины. При использовании такой спецификации
пользователя может аутентифицировать удаленная операционная система. По
умолчанию этот параметр задается как FALSE. Однако учтите, что
использование этого параметра как TRUE открывает брешь в защите базы данных:
аутентифицируемые системой пользователи нестандартных систем могут
получить доступ к вашей базе данных Oracle.
Рекомендации по управлению учетными записями
Ниже приводится перечень рекомендаций по управлению учетными
записями. Многие из них являются новыми для Огас1е8/ и улучшают управление
учетными записями:
■ Для создания пользователей используйте стандартный пароль, например
123abc или firstl, и фразу password expire. Это заставит
пользователей заменить пароль на свой собственный при первой регистрации в Oracle.
■ Аутентификация с помощью операционной системы допустима, если
только все ваши пользователи обращаются к Oracle из прямого соединения с
хостом базы данных (это тоже не рекомендуется).
■ Всегда создавайте временное табличное пространство по умолчанию.
Тогда вам не придется волноваться о назначении табличного пространства
при создании пользователя. При отсутствии временного табличного
пространства по умолчанию, всегда назначайте пользователям, которые могут
создавать объекты базы данных, например разработчикам, temporary
tablespace и default tablespace.
■ Только немногие из пользователей должны иметь quota unlimited. Хотя
просьбы пользователей о дополнительном пространстве могут раздражать,
еще больше раздражает реорганизация табличного пространства,
заполненного объектами базы данных.
■ Изучите управление учетными записями и другие предельные значения
хоста, которые можно устанавливать через профили. Эти новые свойства
поднимают управление учетными записями в Oracle на новый уровень
безопасности.
Закрепление пройденного материала
1. Необходимо знать, как установить новых пользователей в Oracle с
помощью команды create user. Изучите также все компоненты этой
команды. Обратите особое внимание на фразы default tablespace и
temporary tablespace.
2. Запомните фразы, вынуждающие пользователей регулярно изменять
пароль после первой регистрации.
Упражнения
1. Из базы данных Oracle получена следующая информация о табличном
пространстве:
Управление пользователями базы данных
579
SQL> select tablespace_name, contents from dba_tablespaces;
TABLESPACE NAME CONTENTS ч
SYSTEM
DATA
INDEXES
UNDOTBS
TEMP
USERS
PERMANENT
PERMANENT
PERMANENT
UNDO
TEMPORARY
PERMANENT
Вы создаете пользователя в этой базе данных с помощью команды create
user serena identified by tranquill. Какой из следующих
вариантов указывает местоположение, в котором Oracle разместит необходимые
для дисковых сортировок данные пользователя SERENA?
A. SYSTEM В. DATA
С. TEMP D. UNDOTBS
Администратор по безопасности для вашей компании, пользователь ПО
базы данных Oracle с именем Fortune 500, установил требование, чтобы все
пользователи в организации имели пароль, который никто не должен знать,
даже администратор БД. Пользователь BETTYBOOP только сегодня начала
работать на фирме, и задача администратора БД — создать ей новый
пользовательский ID в базе данных Oracle. Какую из следующих фраз create user
следует использовать, чтобы BETTYBOOP изменила пароль при первой
регистрации в Oracle?
A. identified by
B. quota
C. password expire
D. account unlock
Из базы данных Oracle получена следующая информация о табличном
пространстве:
SQL> select tablespace_name, contents from dba_tablespaces;
TABLESPACE NAME CONTENTS
SYSTEM
DATA
INDEXES
UNDOTBS
TEMP
USERS
PERMANENT
PERMANENT
PERMANENT
UNDO
TEMPORARY
PERMANENT
Вы создаете пользователя в этой базе данных с помощью команды create
user serena identified by tranquill. Какой из следующих
вариантов указывает местоположение, в котором Oracle разместит новую таблицу
пользователя SERENA, которую она создает с помощью команды create
table mytab (coll number primary key)?
A. SYSTEM
B. DATA
С TEMP
D. UNDOTBS
Ответы
1. С. SYSTEM не используется, потому что эта база данных имеет заданное по
умолчанию временное табличное пространство 2. С. 3. А. Если команда create user не
содержит фразу default tablespace, таблицы и индексы этого пользователя
помещаются в табличное пространство SYSTEM, при условии что команда object creation
не содержит фразу tablespace.
580
Глава 15
Изменение и удаление существующих пользователей
После создания пользователя иногда приходится его модифицировать. Если
пользователь забывает пароль, задайте его как истекший, и при следующей
регистрации пользователь сам изменит его. Для изменения пароля
пользователя используется команда alter user identified by:
«ааиюэа ALTER USER athena
IDENTIFIED BY forgotpassword
PASSWORD EXPIRE;
Совет Пользователи могут изменять свои пароли с помощью команды
alter user identified by. Однако это единственный аспект ID
пользователя, который может изменять сам пользователь.
В некоторых случаях на основе информации из пользовательских
профилей учетная запись пользователя может оказаться заблокированной. Это
может произойти, если пользователь забыл свой пароль и много раз пытался
войти с помощью неверного пароля. Чтобы снять блокировку учетной записи
пользователя и позволить пользователю изменить пароль, вводится
следующая команда:
РШ/Я/Ш ALTER USER athena
IDENTIFIED BY fotgotpassword
ACCOUNT UNLOCK
PASSWORD EXPIRE;
Совет В этой главе мы еще рассмотрим блокировку учетной записи
подробнее в разделе управление паролем.
Встречается много других ситуаций. Следующая команда поможет вам
предотвратить неправильное употребление и заблокировать учетную запись,
которая была многократно неправильно использована для получения доступа
к Oracle:
(¥ШЖ' ALTER USER athena
ACCOUNT LOCK;
Совет Помните, что изменение паролей, состояния блокировки учетной
записи или истечения пароля применимо только к последующим
пользовательским сеансам, а не к текущему.
Изменение назначения
табличного пространства пользователю
Можно реорганизовать табличное пространство, чтобы распределить нагрузку
ввода-вывода и повысить производительность аппаратных средств, на
которых работает Oracle. Возможно, при этом придется удалять некоторые
табличные пространства и создавать новые. Команда alter user default tables-
pace позволяет администратору БД изменить заданное по умолчанию
табличное пространство пользователя. Как уже говорилось, это изменение
помогает сохранить целостность табличного пространства SYSTEM. Эта
команда воздействует только на вновь создаваемые объекты.
Существующие объекты, созданные этим пользователем в других
табличных пространствах, будут постоянно находиться в этих табличных
пространствах, пока их не удалят. Кроме того, если пользователь определяет табличное
пространство для размещения объекта базы данных, эта спецификация
отменяет заданное по умолчанию табличное пространство.
fSfjMjgipj ALTER USER spanky
DEFAULT TABLESPACE ovecfIow_tabspcCl
Кроме того, может потребоваться реорганизация табличного пространства,
используемого для дисковых сортировок, так как вы переходите от
постоянных табличных пространств к временным, и это делается с помощью команды
alter user temporary tablespace. Изменения может вносить только ад-
Управление пользователями базы данных
581
министратор БД. Пользователи не могут изменять свои собственные
временные или заданные по умолчанию табличные пространства.
«ЯЖКИС ALTER USER spanky
TEMPORARY TABLESPACE temp_overf low_01;
Совет Если в базе данных нет заданного по умолчанию временного
табличного пространства или вы хотите назначить пользователям иное, чем
заданное по умолчанию, временное табличное пространство, от вас
требуется только указать фразу temporary tablespace для пользователей.
Для табличного пространства, доступного пользователю, при создании
пользователя можно установить квоту. Команда alter user quota позволяет
администратору БД изменять квоту. Например, администратор БД может
уменьшить квоту для табличного пространства USERS_01 с 10 Мбайт до 5 Мбайт
для пользователя SPANKY. Если пользователь уже занял своими объектами
базы данных 5 Мбайт табличного пространства, нельзя добавлять данные к
этим объектам добавить и создавать новые объекты. Только администратор БД
может изменять для пользователя квоту табличного пространства.
Пользователи не могут сами изменять свои собственные квоты.
1ЕИИВИИ ALTER USER spanky
QUOTA 5M ON users_01;
Совет Если для пользователя задано quota 0 on SYSTEM, это не
позволит ему создать объект в табличном пространстве SYSTEM, даже если у
него default tablespace задано как SYSTEM. Однако это ограничение
не включает создание пакетов, сохраняемых процедур и функций.
Изменяемые пользователем аспекты учетных записей
Все рассмотренные нами аспекты учетной записи пользователя могут
изменяться администратором БД. Число аспектов учетной записи, которые могут
изменяться пользователем, еще более ограничено. При стандартном
использовании базы данных может возникнуть ситуация, когда пользователь хочет
изменить свой пароль. Это делается так:
WHegffi ALTER USER athena
IDENTIFIED BY mynewpasswocd;
Совет Пользователь может изменять только свой собственный пароль,
кроме тех случаев, когда пользователю предоставляется привилегия alter
any user.
Удаление учетных записей
Пользователи приходят и уходят, и это должно отражаться на их праве доступа.
Команда drop user позволяет удалить пользователя из базы данных. Если
пользователь создал объекты базы данных, его можно удалить только после удаления
объектов. Опция cascade позволяет сразу удалить пользователя и все связанные
с ним объекты базы данных.
РЕ*1ШЕ DROP USER spanky CASCADE;
Совет Если вы хотите удалить пользователя, а его таблицу(ы) назначить
другому пользователю, воспользуйтесь инструментом EXPORT для дампа
таблицы и затем используйте IMPORT с параметрами FROMUSER и
TOUSER для импорта таблицы в качестве указанного пользователя.
Закрепление пройденного материала
1. Требуется знать, как использовать команду alter user для изменения
конфигурация ID пользователя. Помните, что единственный аспект ID
пользователя, который можно изменить с помощью команды alter user, но
582
Глава 15
который нельзя установить с помощью команды create user, — фраза
default role. Роли будут рассмотрены ниже в этой главе.
2. Пользователи могут изменять только свои собственные пароли. Все другие
аспекты изменения ID пользователя должны производиться
администратором БД.
Упражнения
1. Пользователь BETTYBOOP регистрируется в Oracle. Какую из следующих
команд она может выполнять сама, чтобы изменить некий аспект ее
собственного пользовательского ID?
A. alter user bettyboop identified by boop2edoop;
B. alter user bettyboop default tablespace users;
С alter user bettyboop quota 100M on tablespace;
SYSTEM;
D. alter user bettyboop default role none;
2. Пользователь BOBSMITH уволился из вашей компании. Директор отдела
просит вас удалить его пользовательский ID из базы данных Oracle. При
анализе вы обнаруживаете, что в схеме BOBSMITH находится
приблизительно 60 таблиц, все они размещены в табличном пространстве USERS
вместе с таблицами многих других пользователей. В каком из следующих
вариантов указана команда, которая удалит пользователя BOBSMITH's и
содержимое его схемы за наименьшее число шагов?
А.Ввести drop table для всех 60 таблиц, а затем drop user
bobsmith;
В.Ввести spool genacrpt.sql, затем select 'drop table
table_name II Л;' from dba_tables where owner
'BOBSMITH', чтобы создать сценарий, затем ввести Ggensript и
после этого drop user BOBSMITH.
C. Ввести команду drop user bobsmith cascade.
D.Ввести команду drop tablespace users including contents.
3. Вы вводите следующую команду в Oracle: alter user JOSEPHINE
default tablespace system quota 0 on SYSTEM. Предположим,
JOSEPHINE имеет на это соответствующие привилегии, тогда какую из
следующих команд JOSEPHINE не сможет ввести в результате этого
действия?
A.create table mytab (coll number primary key);
B. create procedure myproc begin null; end;
С create function myfunc return null begin null; end;
D.create table mytab2 (coll number primary key)
tablespace data;
Ответы
1. A, 2. С. З. А.
Контроль информации о существующих пользователях
У администратора БД периодически возникает необходимость
контролировать информацию о пользователях. Несколько представлений словаря данных
позволяют получить такую информацию. Собираемая информация включает
информацию о заданных по умолчанию и временных табличных
пространствах, созданных пользователем объектах и о текущем состоянии учетной
записи для учетной записи этого пользователя. Эту информацию можно найти в
следующих представлениях словаря данных:
Управление пользователями бвзы данных
583
■ DBA_USERS Содержит имя пользователя, сгенерированный Oracle
идентификационный номер, зашифрованный пароль, информацию о
заданных по умолчанию и временных табличных пространствах и
пользовательском профиле, указанном в командах создания ID, или о любых
изменениях, которые могли за этим последовать. Кроме того, в
представлении показаны: ACCOUNTSTATUS, который может быть
заблокированным, открытым или истекшим; LOCK_DATE, т.е. дата блокировки
учетной записи (NULL для открытых учетных записей); EXPIRY_DATE,
т.е. дата истечения учетной записи.
■ DBA_OBJECTS Содержит определенную информацию о каждом объекте
в базе данных. Администратор БД может определить владельцев всех
объектов с помощью столбца OWNER этого представления.
■ DBA_SEGMENTS Аналогичен DBA_OBJECTS. Содержит информацию
о различных созданных пользователями сегментах (таблицы, индексы и
т.д.), где они постоянно находятся, и информацию о назначении им места.
■ DBA_TS_QUOTAS Называет всех пользователей и все созданные для них
квоты табличного пространства.
Совет Значение -1 в MAX BYTES или MAX_BLOCKS означает, что
пользователь имеет неограниченную квоту на пространство для этого
табличного пространства.
Закрепление пройденного материала
1. Необходимо знать представления, в которых находится информация о
пользователях базы данных Oracle: DBA_USERS и DBA_TS_QUOTAS.
2. Необходимо знать, где в словаре данных можно найти информацию о
постоянном местоположении пользовательских объектов базы данных —
DBA_OBJECTS и DBA_SEGMENTS.
Упражнения
1. Вы вводите следующую команду в Oracle, и Oracle выдает следующую
информацию:
SQL> select usernkme, tablespace_name, max_bytes from dba_ts quotas
2 where username 'CAPTAINCRUNCH';
USERNAME TABLESPACE NAME MAX BYTES
CAPTAINCRUNCH SYSTEM 1048576
CAPTAINCRUNCH DATA -1
CAPTAINCRUNCH TEMP -1
CAPTAINCRUNCH INDEXES 10485760
Который из следующих вариантов правильно описывает аспект квоты
пользователя CAPTAINCRUNCH на назначение табличного пространства?
A. CAPTAINCRUNCH может назначать до 1 Мбайт пространства в
табличном пространстве SYSTEM для исходного текста процедуры.
B. CAPTAINCRUNCH может производить дисковые сортировки,
которые создают достаточно временных сегментов, чтобы заполнить
табличное пространство TEMP.
С CAPTAINCRUNCH может назначить до 10 Мбайт памяти в
табличном пространстве DATA.
D. CAPTAINCRUNCH может назначить до 1 Мбайт памяти в табличном
пространстве INDEXES.
584
Глава 15
2. Вы вводите следующую команду в Oracle, и Oracle выдает информацию:
SQL> select * from dba_usera where username = 'SYS';
USERNAME USER_ID PASSWORD
ACCOUNT STATUS LOCK DATE EXPIRY DATE
DEFAULT TABLESPACE TEMPORARY TABLESPACE CREATED
PROFILE INITIAL RSRC CONSUMER GROUP EXTERNAL NAME
SYS 0 D4C5016086B2DC6A
OPEN
SYSTEM TEMP 06-JUN-01
DEFAULT SYS_GROUP
Какое из следующих утверждений истинно в отношении приведенной
выше информации о пользователях?
A. Никто из пользователей не может зарегистрироваться в Oracle как
SYS.
B. Если SYS создает таблицу без указания фразы tablespace, таблица
будет помещена в табличное пространство TEMP.
C. Пароль для пользователя SYS в этой базе данных —
D4C5016086B2DC6A.
D. Если SYS производит дисковую сортировку, временные сегменты будут
помещаться в табличное пространство TEMP.
3. Вы пытаетесь найти в представлении DBA_USERS информацию о некоем
имени пользователя. Какой из следующих информационных компонентов
о пользователе SYS нельзя найти в представлении DBA_USERS?
A. Заданная по умолчанию роль
B. Заданное по умолчанию табличное пространство
C. Заданное по умолчанию временное табличное пространство
D. Заданный по умолчанию профиль
Ответы
1. В 2. D. 3. А.
Управление ресурсами и защитой пароля
В этом разделе будут рассмотрены следующие темы, относящиеся к
управлению использованием ресурса:
■ Управление использованием ресурсами с помощью профилей
■ Управление профилями
Ш Управление паролям с помощью профилей
■ Получение информации о профилях из словаря данных
Профили — это объекты базы данных Oracle, ограничивающие
способность пользователя использовать ресурсы хост-системы базы данных Oracle.
Другими словами, чтобы группа пользователей не смогла злоупотребить
процессором хост-компьютера базы данных Oracle, используются профили. Тем,
как Oracle использует хост-машину, можно управлять от имени ряда
пользователей, создавая определенные пользовательские профили, соответствующие
предполагаемому объему деятельности обычных транзакций, выполняемых
различными типами пользователей. Принцип применения пользовательских
профилей не заставляет пользователя выходить из системы при каждом
превышении искусственно низкого порога использования ресурса. Скорее,
пороги использования ресурса позволяют пользователям делать все необходимое в
Управление пользователями базы данных
585
базе данных Oracle, но при этом ограничивают нежелательное или
недопустимое использование. Если пользователи делают ошибку или пытаются сделать
нечто снижающее производительность базы данных, профили могут быстро
остановить их. Рассмотрим использование профилей в базе данных Oracle.
Управление использованием ресурсов
с помощью профилей
Главная задача пользовательских профилей — управлять использованием
системных ресурсов хоста базы данных Oracle в отношении пользователя. Однако
перед тем как переходить к подробному обсуждению профилей, следует
внести изменение в файл init. ora, чтобы Oracle принудительно ввела
ограничения системных ресурсов хоста, заданные в профилях. Чтобы использовать
пределы ресурса, сначала необходимо заменить параметр RESOURCELIMIT
в файле init. ora на TRUE в базе данных Oracle. Следующая команда
позволяет включить в текущем сеансе базы данных ограничения ресурсов,
используемые вместе с профилями:
«ЯЯЖВ8В» ALTER SYSTEM
SET RESOURCE_LIMIT - TRUE;
После включения пределов ресурса необходимо учесть три различных
аспекта использования ресурса и ограничения при задании профилей.
Рассмотрим все три. Это пределы ресурса для отдельных лиц на уровне сеанса,
пределы ресурса на уровне запроса и назначение стоимости ресурса для установки
сложных пределов.
Настройка индивидуальных пределов ресурса:
уровень сеанса
Создаваемые вами профили позволяют назначать пределы для следующих
областей использования ресурса. Если превышен предел ресурса на уровне
сеанса, пользователь получает сообщение об ошибке и сеанс автоматически
прекращается. На уровне сеанса устанавливаются следующие пределы ресурса:
■ aeaaiona_per_uaer Число сеансов с базой данных Oracle, которое
может одновременно открыть пользователь.
■ cpu_p*r_aeaeion Максимально разрешенное время процессора в 1/100
секунды, которое пользователь может использовать в одном сеансе.
■ logical_reada_per_eeesion Максимальное число операций считывания
дисковых блоков ввода-вывода, которое может быть выполнено для
обработки пользователя в одном сеансе.
■ idle_time Время в минутах, в течение которого пользователь может не
вводить команды, прежде чем Oracle выгрузит его из сеанса.
■ connect_time Общее время в минутах, в течение которого пользователь
может быть подключен к базе данных.
■ private_ega Объем собственной памяти в Кб или Мб, который можно
назначить пользователю для собственного хранения. Используется только
когда в базе данных Oracle используется MTS.
Совет Ниже мы рассмотрим примеры профилей
с этими наборами пределов.
Индивидуальные пределы ресурса: уровень запроса
На уровне запроса можно задать в создаваемых вами профилях пределы для
областей использования ресурса. Если пользователь превышает назначенные
ему пределы использования на уровне запроса, приведшая к ошибке команда
SQL прекращается и производится откат любых транзакций, выполняемых то-
586
Глава 1S
лько командой-нарушительницей, предыдущие же команды остаются
неповрежденными, и пользователь сохраняет связь с Oracle. Пределы
использования ресурса на уровне запроса идентифицируются следующим образом:
■ logical_reads_per_call Максимальное число операций чтения
дисковых блоков ввода-вывода, которые могут быть выполнены для
обработки пользователя в одном сеансе.
■ cpu_per_call Максимально разрешенное время процессора в 1/100
секунды, которое отдельная операция может использовать в одном
пользовательском сеансе.
Совет Ниже мы рассмотрим примеры профилей с этими наборами пределов.
Установка сложных пределов и стоимости ресурсов
В некоторых случаях может выявиться негибкость пределов отдельных
ресурсов. Альтернативное решение — установить сложные пределы по принципу
стоимости ресурса. Стоимость ресурса — это произвольное число,
отражающее относительное значение этого ресурса на основе мощностей
хост-машины. Например, на хост-машине с несколькими процессорами и несколькими
контроллерами дисков cpu_per_ session считается более ценным, чем 1о-
gical_reads_per_session. Назначить стоимость ресурса позволяет команда
alter resource co&t. Стоимость ресурса применима только к ресурсам
cpu_per_ session, logical_reads_per_session, connect_time, и pri-
vatesga. По умолчанию стоимость каждого ресурса — ноль. Стоимость
ресурса не обязательно соотносится с денежной стоимостью. Стоимость
определяется как абстрактное значение модуля, а не денежная цена ресурса.
Например, значение стоимости ресурса циклов процессора за сеанс равно 1,5,
но это не значит, что выполнение каждого цикла процессора обходится
пользовательскому процессу в $1,50.
«ЖйЮСЯС ALTER RESOURCE COST
CPU_PER_SESSION 10
LOGICAL_READS_PER_SESSION 2
PRIVATE_SGA 6
CONNECTJTIME 1;
Совет Ниже мы рассмотрим примеры профилей со сложными наборами
пределов.
Группы потребителей ресурсов и управление системными
ресурсами хоста
В версии 8/ Oracle представила новое средство управления системными
ресурсами хоста — использование групп потребителей ресурсов. Это средство
управляет тем, как пользователи используют системные ресурсы хоста, с
помощью встроенных процедур PL/SQL и функций. Хотя эта тема не столь
широко представлена на экзамене "Основы АБД I", это средство стоит того,
чтобы исследовать его самостоятельно. Более подробно об этом см. в разделе
"Управление ресурсами базы данных Огас1е9Г' в Руководстве
администраторов базы данных, которое поставляется с общей документацией по Oracle.
Закрепление пройденного материала
1. Помните о необходимости задания параметра инициализации
RESOURCE_LIMIT, прежде чем Oracle принудительно реализует пределы
ресурса согласно вашим параметрам профиля.
2. Проверьте, сможете ли вы назвать различные уровни задания системных
параметров хоста: уровень сеанса, уровень запроса и сложные пределы.
Сложные пределы устанавливаются с помощью команды alter resource
cost, которая определяет значения стоимости ресурсов.
Управление пользователями базы данных
587
Упражнения
1. Вы, хотите использовать сложные пределы ресурса в базе данных Oracle.
Какую из следующих команд следует ввести, чтобы назначить значения
сложных пределов для сложных ресурсов?
A. alter system
В.alter resource cost
С.alter profile
D.alter user
2. В базе данных Oracle вы вводите команду alter system set resour-
celimit true;. Какое из следующих утверждений описывает цель
этой команды?
A. Эта команда означает установку стоимости сложных пределов
ресурсов в базе данных Oracle.
B. Эта команда означает включение использования профилей для
ограничения использования системных ресурсов хоста.
С Эта команда означает создание профиля для использования в Oracle.
D. Эта команда означает назначение соответствия пользователей
профилям в Oracle.
3. Вы определяете пределы ресурса для использования с профилями. Что из
следующего не является пределом ресурса, который можно установить
вместе со сложными пределами в базе данных Oracle?
A. IDLE_TIME
B. CPU_PER_SESSION
С PRIVATE_SGA
D. CONNECT TIME
Ответы
1. В. 2. В. 3. А.
Управление профилями
Профили назначаются пользователям с помощью команд create user или
alter user command. Мы уже рассматривали ряд примеров использования
команды create user. При создании базы данных Oracle существует
специальный пользовательский профиль DEFAULT. Если не назначить пользователю
профиль с помощью фразы profile в команде create user, Oracle
автоматически назначает пользователю профиль DEFAULT. Этот профиль не слишком
ограничивает системные ресурсы хоста. Фактически DEFAULT предоставляет
пользователям неограниченные возможности использования всех ресурсов,
которые можно определить в базе данных. Можно создать пользовательский
профиль с ограничениями на использование некоторых системных ресурсов, как
например в следующем блоке кода:
№№?Я CREATE PROFILE developer LIMIT
SESSIONS_PER_USER 1
CPU_PER_SESSION 10000
CPU_PER_CALL 20
CONNECT_TIME 240
IDLE_TIME 20
LOGICAL_READS_PER_SESSION 50000
LOGICAL_READS_PER_CALL 4 00
PRIVATE_SGA 1024;
Этот блок кода — хороший пример использования профилей для установки
индивидуальных пределов ресурса (individual resource limits). He следует опреде-
588
Глава 1S
лять пределы для всех доступных ресурсов, потому что любые не явно
назначенные при создании профиля пределы ресурсов получат значения по
умолчанию, определенные в профиле DEFAULT. Таким образом, если вы изменяете
значение для предела ресурса в профиле DEFAULT, можно внести изменения и
в другие профили вашей системы. Сразу после создания профилей они
назначаются пользователям с помощью фразы profile в команде create user или
alter user. В следующем блоке кода приводятся примеры каждой команды:
«8МЙЯЙЧЯ CREATE USER spanky
IDENTIFIED BY orange#tabby
TEMPORARY TABLESPACE temp_01
QUOTA 5M ON temp_01
PROFILE developer;
ALTER USER athena
PROFILE developer;
Изменение и удаление профилей
Создав пределы системных ресурсов хоста в профиле, вы можете изменять их
параметры с помощью команды alter profile. Изменение
пользовательского профиля может потребоваться, если пользовательские профили в базе
данных имеют значение по умолчанию, заданное в профиле DEFAULT.
Например, если предел ресурса cpu_per_ session в DEFAULT изменяется с
неограниченного до 20 000, это отразится на cpu_per_session в любом
пользовательском профиле, где он задан неявно. Возможно, вам это и не нужно, но
только явно заданное значение для cpu_per_session сделает профиль
независимым от профиля DEFAULT для предела cpu_per_session. Следующая
команда позволяет изменить предел ресурса в профиле:
*ШЯ№ ALTER PROFILE developer LIMIT
CPU_PER_SESSION UNLIMITED;
Совет Любую опцию в любом профиле можно изменить в любое время.
Однако изменение вступит в силу для пользователей, назначенных этому
профилю, только после выхода пользователя из системы и повторной
регистрации.
Если требуется удалить пользовательский профиль из базы данных, введите
команду drop profile. Что случится, если попробовать удалить профиль,
которому уже были назначены пользователи? Следует ввести команду drop prof i le
cascade. После этого Oracle переключает пользователей, назначенных на
удаленный профиль снова на профиль DEFAULT. По очевидным причинам, этот
профиль нельзя удалить. Рассмотрим пример команды drop prof i le, чтобы
понять ее синтаксис:
fiMMB DROP PROFILE developer CASCADE;
Совет Чтобы собрать информацию о том, как пользователи используют
хост-машину в сеансах базы данных, необходимую для правильного
установления пределов ресурса, введите команду audit session. Мы еще обсудим
аудит подробнее. Пределы ресурса, для которых можно собрать
информацию, включают connect_time, logical_reads_per_session иlogi-
cal_reads_j>er_call.
Создание профилей с набором сложных пределов
Как только стоимости ресурсов установлены, вы назначаете пользователям
сложные пределы. Сложные пределы ограничивают использование базы
данных, определяя предел того, сколько машинных ресурсов хоста можно
использовать в сеансе. Каждый раз, когда сеанс использует ресурс, Oracle
подсчитывает суммарное использование ресурса для этого сеанса. Когда сеанс достигает
значения compositelimit, он прекращается. Команда alter profile
позволяет изменить профили так, чтобы они включали composite_limit.
Управление пользователями базы данных
589
ALTER PROFILE developer LIMIT
COMPOSITE LIMIT 500;
Закрепление пройденного материала
1. Убедитесь, что понимаете основную цель профилей. Они предотвращают
неправильное употребление основных системных ресурсов хоста, задавая
пределы для этих ресурсов на пользовательском уровне.
2. Необходимо знать цели профиля DEFAULT. Он назначается
пользователям, если не определена фраза profile в команде create user. Однако
они не слишком ограничивают использование — все пределы
использования ресурсов хоста заданы как unlimited.
3. Профили создаются с помощью команды create profile. Если не задать
в профиле пределы системных ресурсов хоста, Oracle по умолчанию
установит для этих пределов такие значения, которые указаны в профиле
DEFAULT.
4. Для удаления назначенного пользователю профиля следует использовать
опцию cascade в команде drop profile. В этом случае Oracle переводит
пользователя в профиль DEFAULT.
Упражнения
1. Во время сеанса с базой данных Oracle была получена следующая выходная
информация:
SQL> Select username, profile from dba_users,
USERNAME PROFILE
SYS SYS_PROFILE
SYSTEM SYS_PROFILE
MARY ANN DATA_ADMIN
MARYSUE DEVELOPER
MARYJANE MANAGER
Если вы вводите команду drop profile DATA_ADMIN cascade, какой из
следующих профилей будет назначен MARYANN?
A. DEVELOPER
B. MANAGER
C. SYS_PROFILE
D. DEFAULT
2. Вы создаете профиль с помощью следующей команды:
CREATE PROFILE myprofile LIMIT
SESSIONS_PER_USER 1
CPU_PER_CALL 20
CONNECT_TIME 240
IDLE_TIME 20
PRIVATE_SGA 1024;
Какой из следующих вариантов лучше всего показывает, как Oracle
определит, каким будет значение для предела CPU_PER_SESSION?
A. Oracle использует то же самое значение, что
и CPU_PER_CALL из команды create profile.
B. Oracle использует значение для CPU_PER_SESSION из профиля
SYS_PROFILE.
С Oracle использует значение для CPU_PER_SESSION из профиля
DEFAULT.
D. Oracle устанавливает CPU_PER_SESSION как unlimited.
590
Глава 15
3. Вы создали три профиля в вашей базе данных Oracle для вашей
компании — пользователя "Fortune 500" — ресурсами Oracle: DEVELOPER — для
разработчиков Oracle, MANAGEMENT — для менеджеров
информационных технологий и ORACLE_USERS — для конечных пользователей базы
данных Oracle. Сегодня первый день работы пользователя BETTYBOOP в
вашей компании. Ваша задача — создать для него пользовательский ID. Вы
вводите следующее: create user bettyboop identified by changeme
password expire account unlock. Какой из вариантов соответствует
профилю ресурса, которому будет назначен пользователь BETTYBOOP?
A. DEVELOPER
B. ORACLEJJSERS
C. MANAGEMENT
D. DEFAULT
E. Ни один — в команде create user не была указана фраза profile.
Ответы
1. D 2. С 3. D.
Управление паролями с помощью профилей
Как мы уже говорили, Oracle поддерживает расширенное управление
паролями с помощью профилей. К расширенному управлению относятся блокировка
учетной записи, истечение пароля, история пароля и требования к сложности
пароля. Цель этих свойств — затруднить взлом базы данных Oracle
санкционированному пользователю, не знающему пароль пользователя. Это защищает
целостность назначенных имен пользователя и общую целостность данных
базы данных Oracle.
Администратор БД может поддержать функциональные возможности
управления паролями с помощью сценария utlpwdmg. sgi как SYS, хотя это и
не обязательно. Этот сценарий находится в подкаталоге rdbms/admin в
домашнем каталоге ПО Oracle. Этот сценарий вносит некоторые дополнения в
профиль DEFAULT, о котором уже шла речь в этой главе, и они используются
вместе с управлением пароля. После выполнения сценария управления
паролями все заданные по умолчанию параметры управления паролями,
определенные в профиле DEFAULT, всегда принудительно реализуются в базе
данных Oracle. В этом заключается отличие от других пределов ресурса, которые
все еще требуют установки RESOURCELIMIT как TRUE перед запуском
экземпляра.
Управление учетными записями
Блокировка учетной записи позволяет Oracle блокировать учетную запись,
когда пользователи делают несколько неудачных попытках зарегистрироваться в
базе данных. Максимальное число неудачных попыток устанавливается из
расчета на пользователя или на группу. Число неудавшихся попыток указывается
администратором БД или сотрудником службы безопасности таким образом,
чтобы его можно было быстро определить, а неудачные попытки
отслеживаются Oracle. И если пользователь не сможет зарегистрироваться в базе данных за
указанное число попыток, Oracle автоматически заблокирует пользователя.
Кроме того, можно задать период времени для автоматической блокировки
пользователя, тогда счетчик неудачных попыток входа в систему будет
сбрасываться по истечении этого период, и пользователь сможет попытаться снова
зарегистрироваться в базе данных. Или, наоборот, автоматическая блокировка
может быть постоянной, и отключить ее сможет только администратор по
безопасности или администратор БД. Кроме того, учетные записи можно
блокировать вручную, если этого хочет администратор по безопасности или
администратор БД. В этой ситуации единственный способ разблокировать учетную
Управление пользователями базы данных
591
запись — сделать это вручную. Приведенная ниже команда показывает, как
установить параметры для блокировки учетной записи:
ттеыяш alter profile default limit
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_L0CK_TIME unlimited;
В этом примере настройка FAILED_LOGIN_ATTEMPTS определяет
число неудачных попыток входа в систему до блокировки учетной записи. Мы
установили эту опцию на 3, т.е. после трех неудачных попыток
зарегистрироваться Oracle автоматически заблокирует учетную запись пользователя. Другая
опция, PASSWORD_LOCK_TIME, указывает число дней, в течение которых
учетная запись будет заблокирована после трех неудачных попыток входа в
систему. Мы задали пребывание учетной записи в заблокированном состоянии
как бесконечное, т.е'. до того времени, пока администратор БД не исследует
ситуацию и не разблокирует учетную запись вручную.
Срок действия пароля и ротация
В базе данных Oracle может также учитываться возраст пароля.
Администратор БД или администратор по безопасности могут установить максимальный
срок службы пароля. После его превышения пользователь должен изменить
свой пароль, иначе он уже не сможет обратиться к базе данных Oracle. Можно
задать период вежливости, в течение которого пользователь должен изменить
пароль. Если по завершении этого периода пользователь не изменит пароль,
учетная запись будет заблокирована и только администратор по безопасности
сможет разблокировать ее. Рекомендуется также устанавливать для вновь
создаваемых пользователей срок истечения пароля, чтобы при первой
регистрации для пользователя начинался отсчет периода вежливости, вынуждающий
его изменить пароль в течение этого времени.
Изменение пароля пользователями потенциально создает проблему.
Иногда пользователи пытаются "обмануть" систему, заменяя устаревший пароль
каким-либо другим, а затем сразу же возвращаясь к старому паролю. Во
избежание этого Огас1е8/ поддерживает свойство истории пароля, сохраняющее
информацию об использвовавшихся в последнее время паролях, и отвергает
их использование в течение указанного времени или числа изменений.
Интервал задается в пользовательском профиле, и вскоре мы рассмотрим, как это
делается. Ниже приводится стандартный код реализации срока действия
пароля и ротации:
РЯЖИ ALTER PROFILE default LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX 0;
Параметр PASSWORDLIFETIME определяет срок службы пароля в днях
до его истечения. Параметр PASSWORD_GRACE_TIME определяет период
вежливости в днях, предоставляемый на замену пароля после первой
успешной регистрации сразу после истечения срока пароля. Параметр
PASSWORDREUSETIME определяет максимальное число дней до
повторного использования предыдущего пароля. Наконец, параметр
PASSWORDREUSEMAX определяет, сколько раз (максимум) может
использоваться предыдущий пароль.
Проверка сложности пароля
И последнее, возможно, наиболее важное свойство для обеспечения
целостности учетной записи пользователя Oracle — свойство проверки сложности
пароля. Существует много стандартных методов создания пароля, например
проверка определенной длины в символах, проверка, что это не имя
собственное и не слово из словаря, проверка на обязательное наличие в нем и симво-
592
Глава 15
лов, и цифр и т.д. Однако пользователи слишком часто игнорируют эти
требования и создают пароли, которые можно легко расшифровать с помощью
любой из имеющихся программ для расшифровки зашифрованной
информации пароля.
Чтобы предотвратить непреднамеренное ослабление пользователями
безопасности базы данных, Oracle поддерживает автоматическую проверку
сложности пароля с помощью функции PL/SQL, применяемой во время создания
профиля пользователя или группы для обеспечения достаточной сложности
создаваемых пользователями паролей. Эта функция по умолчанию проверяет
минимальную длину пароля — четыре символа, не совпадающих с именем
пользователя. Кроме того, пароль должен содержать, по крайней мере, одну
букву, число и символ пунктуации, должен отличаться от предыдущего пароля,
как минимум, тремя символами.
Если обеспечиваемый данной функцией PL/SQL уровень проверки
сложности недостаточно высок, организация сама может определить
функцию PL/SQL достаточной сложности, соблюдая некоторые условия.
Полный синтаксис запроса должен соответствовать сведениям в приведенном
ниже листинге кода. Кроме того, новая процедура должна назначаться как
процедура проверки пароля в профиле пользователя или профиле DEFAULT.
В команде create profile должно присутствовать следующее: pass-
word_verify_function user_pwcmplx_fname, где user_pwcmplx_fname —
имя определяемой пользователем функции сложности пароля. Есть и другие
ограничения на определение этой функции: необходимо выдавать
соответствующее сообщение об ошибке, если процедура приводит к
исключению или становится недействительной, функция проверки должна
принадлежать SYS и использоваться в контексте SYSTEM. При вызове
PL/SQL функции проверки сложности должны выполняться следующие
требования передачи параметра и возвращения значения:
fegWEB USER_ P»CMPLX_ FNAME
( \jser_id_parm IN VARCHAR2,
newjpasswdjparm IN VARCHAR2,
old_passwd_parm IN VARCHAR2;
) RETURN BOOLEAN;
Рассмотрим кодирование, применяемое в функции сложности пароля, на
следующем примере. Этот пример является упрощенным и
модифицированным блоком кода, аналогичным функции проверки пароля в Oracle. Функция
проверит три пункта: отличие нового пароля от имени пользователя, длину
нового пароля (шесть символов) и отличие нового пароля от старого. При
создании администратором БД имени пользователя вызывается процесс
проверки для определения соответствия пароля. Если функция возвратит TRUE,
администратор БД сможет создать имя пользователя. Если нет — создание
пользователя потерпит неудачу. Этот пример демонстрирует основы
кодирования функции сложности пароля, но учтите, что функция в следующем
листинге очень упрощена и приводится только как пример:
Ш^Ш CREATE OR REPLACE FUNCTION my_pwver
x_user IN VARCHAR2,
x_new_pw IN VARCHAR2,
x_old_pw IN VARCHAR2
)RETURN BOOLEAN IS
BEGIN
IF LENGTH(x_new_pw)< 6 THEN
RAISE_APPLICATION_ERROR(-20001,
ELSIF x_new_pw = x_user THEN
RAISE_APPLICATION_ERROR(-20002,
ELSIF x_new_pw = x_old_pw THEN
RAISE_APPLICATION_ERROR(-20003,
ELSE
RETURN (TRUE) ;
END IF;
END;
Сама функция может быть определена в профиле следующим образом:
'New password too short.');
'New password same as username');
'New password same as old');
Управление пользователями базы данных
593
"^"в^* ALTER PROFILE default LIMIT
PASSWORD_VERIFY_FUNCTION ray_pwver;
Пределы ресурса управления паролями
в профиле DEFAULT
После выполнения сценария utlpwdmg. sql для нескольких пределов ресурса
управления паролями будет заданы значения по умолчанию. Ниже приводится
объяснение для каждой опции. Значением по умолчанию для каждого из этих
параметров является unlimited или NULL.
■ f ailed_login_attempt3 Число неудачных попыток регистрации,
которое пользователь может сделать до блокировки учетной записи
■ pa33word_lif e_time Число дней, в течение которых пароль останется
активным
■ password_reuse_time Число дней, по истечении которых пароль может
использоваться повторно
■ pa33word_reu3e_max Число, указывающее, сколько раз должен
смениться пароль, прежде чем его можно будет использовать повторно
■ pa33word_lock_time Число дней, по истечении которых Oracle
разблокирует учетную запись, автоматически блокируемую при превышении
пользователем failed_login_attempts
■ pas3word_grace_time Число дней| в течение которых необходимо
заменить истекший пароль, иначе Oracle постоянно блокирует учетную
запись
И password_verify_function Функция, используемая для проверки
сложности пароля
Использование параметров пароля для профилей: пример
Ниже приводится стандартный код создания нового профиля со всеми
предыдущими параметрами пароля:
№й^ИЖ CREATE PROFILE tmp_profile LIMIT
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME unlimited
PASSWORD_LIFE_TIME 30
PASSWORD_REUSE_TIME 30
PASSWORD_VERIFY_FUNCTION my_pwver
PASSWORD GRACE TIME 5;
Закрепление пройденного материала
1. Необходимо знать предоставляемые в Oracle свойства управления
учетными записями. С помощью этих свойств можно блокировать и
разблокировать учетные записи.
2. Проверьте, знаете ли вы свойства установления срока действия пароля и
ротации, предоставляемые в Oracle. Их можно задать так, чтобы Oracle не
позволила использовать их повторно в течение определенного периода
времени, и заставляла пользователей периодически менять пароли,
3. Необходимо знать, как Oracle управляет проверкой сложности паролей в
базе данных. Проверьте, можете ли вы описать использование функций
PL/SQL в этих целях.
Упражнения
1. Вы создаете профиль с помощью следующего блока кода:
594
Глава 15
CREATE PROFILE tmp_profile LIMIT
FAILED_LOGIN_ATTEM?TS 3
PASSWORD_LOCK_TIME unlimited
?ASSWORD_LIFE_TIME 30
PASSWORD_REUSE_TIME 180
PASSWORD_VERIFY_FUNCTION my_pwver
PASSWORD_GRACE_TIME 5;
Какое из следующих утверждений справедливо относительно созданного
вами профиля?
A. После трех неудавшихся попыток регистрации пользователю,
которому назначен этот профиль, придется ждать три дня, прежде
чем он снова сможет попытаться зарегистрироваться в Oracle.
B. Через 180 дней пользователь, которому назначен этот профиль,
сможет повторно использовать свой пароль.
C. Пользователь, которому назначен этот профиль, должен менять свой
пароль каждые 30 минут.
D. Пользователю отводится, максимум, пять минут, на установление
пароля при первой регистрации, прежде чем Oracle автоматически
заблокирует учетную запись.
2. Вы планируете выполнять сценарий utlpwmg. sgl в рамках управления
паролями. В котором из следующих каталогов находится этот сценарий?
A. $ORACLE_HOME/dbs
B. $ORACLE_HOME/sqlplus/admin
C. $ORACLE_HOME/rdbms/admin
D. $ORACLE_HOME/network/admin
3. Вы хотите установить свойства управления пароля в базе данных Oracle
так, чтобы пользователи никогда не смогли повторно использовать пароль
и чтобы у пользователей было три дня на изменение пароля по умолчанию
для первой регистрации в Oracle, прежде чем учетная запись будет
заблокирована. В каком из следующих вариантов приводится используемая для
этой цели команда?
A. alter profile default limit failed_login_attempts 3
password_reuse_time unlimited;
B. alter profile default limit password_grace_time 3
password_reuse_limit unlimited;
С alter profile default limit failed_login_attempts 3
password_grace_time unlimited;
D. alter profile default limit password_reuse_time 3
failed_login_attempts unlimited;
Ответы
1. В. 2. С. 3. В.
Получение информации о профиле
из словаря данных
В следующих представлениях словаря содержится информация о пределах
использования ресурсов, определенных для профилей, и о назначенных
пользователям профилях:
■ DBA_PROFILES Содержит определенную информацию о параметрах
использования ресурса, указанных в сочетании с каждым профилем.
Управление пользователями базы данных
595
■ RESOURCE_COST Идентифицирует все ресурсы в базе данных и их
стоимость, как определено администратором БД. Стоимость определяет
относительную важность использования ресурса.
■ USER_RESOURCE_LIMITS Идентифицирует пределы системных
ресурсов для отдельных пользователей, как определено назначенным
пользователям профилем.
■ DBAUSERS Предлагает информацию о назначенном пользователю
профиле, текущем состоянии учетной записи, дате блокировки и дате
истечения пароля.
Совет Перед тем как сдавать экзамен по администрированию Oracle9i,
потратьте немного времени в базе данных Oracle на ознакомление с
содержанием каждого из этих представлений словаря.
Закрепление пройденного материала
1. Назначенный пользователю профиль можно найти в представлении
DBA_USERS.
2. Стоимость ресурса и параметры предела ресурса можно найти в
RESOURCE_COST и представлении USER_RESOURCE_LIMITS
соответственно.
3. Представление DBA_PROFILES удобно для поиска параметров ресурса в
конкретном профиле.
Упражнения
1. Вы управляете профилями в базе данных Oracle. Какой из следующих
запросов вы бы использовали для определения фактических пределов
ресурса для пользователя SALLY, если-бы вы не знали, какой профиль назначен
SALLY?
A. select resource_name, limit from dba_profiles where
profile (select profile from dba_users where
username 'SALLY');
B. select resource_name, limit from dba_profiles where
profile (select profile from dba_users where
user_id 'SALLY');
С select resource_name, unit_cost from resource_cost
where resource name in (select resource name from
dba_profiles where profile (select profile from
dba_users where username 'SALLY'));
D. select resource_name, unit_cost from resource_cost
where resource_name in (select resourcename from
dba_profiles where profile (select profile from
dba_users where user_id 'SALLY''));
2. Вы пытаетесь определить, какие профили имеют параметры ресурса, не
налагающие ограничений на использование пользовательских ресурсов.
Какой из следующих запросов лучше всего подошел бы для этой цели?
A. select profile from dba_profiles where profile
(select username from dba_users where profile
'UNLIMITED');
B. select profile from dba_profiles where limit
(select unit_cost from resource_cost where
resource_name = ' CPU_PER_SESSION');
596
Глава 15
С select profile from dba_profiles where limit
ЛUNLIMITED';
D. select distinct profile from dba_profiles where
limit 'UNLIMITED';
Ответы
1. A. 2. D. В вопросе речь идет о наиболее подходящем для этой цели запросе. Запрос в
варианте С трудно читать, потому что в выводе имя профиля перечисляется один раз
для каждого набора пределов ресурса, заданного как unlimited, и поэтому лучше
подходит запрос в варианте Р.
Управление привилегиями
В этом разделе будут рассмотрены следующие темы, связанные с управлением
привилегиями:
■ Идентификация системы и привилегий объекта
■ Предоставление и отмена привилегий
■ Идентификация возможностей аудита
Для доступа к базе данных Oracle необходимы привилегии базы данных.
Доступ на установление соединения с базой данных, доступ к объектам,
которые разрешается видеть пользователю, и объекты, которые пользователю
разрешено создавать, — все это управляемые привилегии. Использование
каждого объекта базы данных и системного ресурса управляется привилегиями.
Существуют привилегии, необходимые для создания объектов, для доступа к
объектам, для изменения данных в пределах таблиц, выполнения сохраняемых
процедур, создания пользователей и т.д. Поскольку доступ к каждому объекту
управляется привилегиями, защита в базе данных Oracle очень гибкая в
отношении доступности определенных объектов для определенных пользователей.
Идентификация системных и объектных привилегий
Существует две категории привилегий. Первая из них — системные привилегии
(system privileges). Системные привилегии управляют созданием и
обслуживанием многих объектов базы данных, например, сегментов отката, синонимов,
таблиц, и спусковых механизмов. Кроме того, возможность использования
команды analyze и ревизии базы данных Oracle управляется системными
привилегиями. Другая категория — объектные привилегии. Эти привилегии
управляют способностью пользователя управлять объектами базы данных,
принадлежащими другим пользователям в базе данных.
Идентифицируемые системные привилегии
Есть несколько подкатегорий системных привилегий, которые касаются
каждого объекта. Эти категории определяют область действия способности,
которую получит тот, кому назначается привилегия. Ниже перечислены классы,
или категории, системных привилегий. В следующих подразделах привилегия
дает вам возможность выполнить действие для ваших собственных объектов
базы данных, а любое ключевое слово относится к способности выполнить
действие для любого объекта базы данных этого типа в Oracle.
функции администрирования Эти привилегии касаются действий, как
правило, сохраняемых для администраторов БД и выполняемых ими.
Привилегии включают alter system, audit system, audit any, alter database,
analyze any, SYSDBA, SYSOPER и grant any privilege. Чтобы установить
соединение с Oracle, необходимо иметь привилегию create session. Ниже,
в разделе "Привилегии sysdba и sysoper", мы подробно рассмотрим
привилегии sysdba и sysoper и разрешаемые ими действия.
Управление пользователями базы данных
597
Доступ к базе данных Эти привилегии управляют теми, кто обращается к
базе данных, когда им можно обращаться к ней, и тем, что они могут делать
при управлении своим собственным сеансом. Привилегии включают create
session, alter session, и restricted session.
Табличные пространства Вы уже знаете, что табличные пространства
являются дисковыми ресурсами, используемыми для хранения объектов базы
данных. Эти привилегии определяют, кто может поддерживать эти дисковые
ресурсы. Как правило, эти привилегии предоставляются администраторам БД.
Привилегии включают create tablespace, alter tablespace, manage
tablespace, drop tablespace и unlimited tablespace. Обратите
внимание, нельзя назначать неограниченное табличное пространство для роли.
Подробнее о ролях мы поговорим в следующем разделе.
Пользователи Эти привилегии используются для управления
пользователями на базе данных Oracle. Как правило, эти привилегии предоставляются
администраторам безопасности или администраторам БД. Привилегии
включают create user, become user, alter user и drop user.
Сегменты отмены Сегменты отката являются дисковыми ресурсами,
благодаря которым возможны некоторые аспекты обработки транзакций.
Привилегии включают create rollback segment, alter rollback segment И drop
rollback segment. Обратите внимание, эти привилегии нужны, если вы
планируете управлять сегментами отмены вручную. Если будет использоваться
автоматическое управление отмены, эти привилегии никому не
предоставляются.
Таблицы Таблицы хранят данные в базе данных Oracle. Эти привилегии
управляют теми, пользователями,кто может создавать и поддерживать
таблицы. Привилегии включают create table, create any table, alter any
table, backup any table, drop any table, lock any table, comment any
table, select any table,insert any table, update any table и delete
any table. Привилегия create table или create any table позволяет
также удалять таблицу. Привилегия create table также позволяет создавать
индексы для таблицы и выполнять для таблицы команду analyze. Усекать
таблицу позволяет назначенная вам привилегия drop any table.
Кластеры Кластеры используются для хранения таблиц, обычно
используемых вместе, поблизости друг от друга на диске. Привилегии включают create
cluster, create any cluster, alter any cluster и drop any cluster.
Привилегии create cluster и create any cluster также позволяют
изменять и удалять эти кластеры.
Индексы Индексы используются для повышения производительности
команды SQL для таблиц, содержащих большое количество данных в строках.
Привилегии включают any index, alter any index и drop any index. Учтите,
системной привилегии create index не существует. Привилегия create
table позволяет изменять и удалить индексы, которые принадлежат вам и
связаны с таблицей.
Синонимы Синоним является объектом базы данных, что позволяет
ссылаться на другой объект по другому имени. Общедоступный синоним (public
synonym) означает, что синоним доступен каждому пользователю в базе
данных для аналогичной цели. Привилегии включают create synonym, create
any synonym, drop any synonym, create public synonym, и drop public
synonym. Привилегия create synonym позволяет изменять и удалить
принадлежащие вам синонимы.
Представления Представление — объект, содержащий команду SQL,
которая ведет себя как таблица в Oracle, за исключением того, что не содержит
никаких данных. Привилегии включают create view, create any view и drop
any view. Привилегия create view позволяет изменять и удалять
принадлежащие вам представления.
598
Глава 15
Последовательности Последовательность является объектом Oracle,
который генерирует номера согласно устанавливаемым вами правилам.
Привилегии включают create sequence, create any sequence, alter any
sequence, drop any sequence и select any sequence. Привилегия create
sequence позволяет удалять принадлежащие вам последовательности.
Связи базы данных Связи базы данных являются объектами Oracle, которые
в пределах сеанса с одной базой данных позволяют ссылаться на таблицы в
другой базе данных Oracle без установления отдельного соединения.
Общедоступная связь базы данных — это связь, доступная всем пользователям Oracle,
а частная связь базы данных — та, которую может использовать только
владелец. Привилегии включают create database link, create public
database link и drop public database link. Привилегия create database
link позволяет удалить принадлежащие вам частные связи базы данных.
Роли Роли — это объекты, которые могут использоваться для упрощенного
управления привилегиями. Вы создаете роль, назначаете ей привилегии, а затем
назначаете роль пользователям. Привилегии включают create role, drop any
role, grant any role и alter any role.
Транзакции Эти привилегии предназначены для разрешения
сомнительных, распределенных транзакций, обрабатываемых на базе данных Oracle.
Привилегии включают force transaction и force any transaction.
PL/SQL Мы уже рассматривали имеющиеся в Oracle различные блоки
PL/SQL. Эти привилегии позволяют создавать, выполнять и управлять
различными типами блоков. Привилегии включают create procedure, create
any procedure, alter any procedure, drop any procedure и execute any
procedure. Привилегия create procedure позволяет изменять и удалять
принадлежащие вам блоки PL/SQL.
Триггеры Триггеры являются блоками PL/SQL в Oracle. Они выполняются,
когда для таблицы выполняется определенная DML операция, с которой
связан триггер. Привилегии включают create trigger, create any trigger,
alter any trigger и drop any trigger. Привилегия create trigger
позволяет изменять и удалять принадлежащие вам триггеры.
Профили Профили являются объектами Oracle, которые позволяют
установить на хост-компьютере Oracle пределы ресурсов для пользователей.
Привилегии включают create profile, alter profile, drop profile и alter
resource cost.
Моментальные снимки и материализованные представления Моментальные
снимки — это объекты Oracle, позволяющие копировать данные из таблицы в
одной базе данных в копию таблицы на другой. Привилегии включают create
snapshot, create any snapshot, alter any snapshot и drop any
snapshot.
Каталоги Каталоги в Oracle — это объекты, ссылающиеся на каталоги на
хост-машине базе данных Oracle. Они используются для идентификации
каталогов, содержащих внешние к Oracle объекты, за которыми следит Oracle,
например, объекты BFILE-типа. Привилегии включают create any directory
и drop any directory.
Типы Типы в Oracle соответствуют определяемым пользователем типам,
которые можно создавать в опции Oracle8/ Objects. Привилегии включают
create type,create any type, alter any type,drop any type и execute
any type. Привилегия create type позволяет изменять и удалять
принадлежащие вам типы.
Библиотеки Библиотека является объектом, позволяющим ссылаться на
набор внешних к Oracle процедур. В настоящее время поддерживаются только
процедуры С. Привилегии включают create library, create any library,
alter any library, drop any library и execute any library.
Управление пользователями базы данных
599
Привилегии SYSDBA и SYSOPER
В начале этой книги, при обсуждении аутентификации с помощью файла
пароля, мы рассмотрели системные привилегии sysdba и sysoper. Привилегия
sysdba обычно назначается учетным записям администраторов базы данных,
a sysoper — учетным записям операторов базы данных. Только пользователи
с этими привилегиями могут зарегистрироваться в базе данных с помощью
файла пароля с неограниченными привилегиями и выполнять операции над
объектами базы данных и самими базами данных. Привилегия sysoper
позволяет пользователю с этой привилегией делать следующее:
■ STARTUP, SHUTDOWN
■ ALTER DATABASE OPEN | MOUNT
■ ALTER DATABASE BACKUP CONTROLFILE
■ RECOVER DATABASE
■ ALTER DATABASE ARCHIVELOG
Привилегия sysdba позволяет пользователю с этой привилегией делать
следующее:
■ Получать все sysoper привилегии
■ CREATE DATABASE
■ ALTER DATABASE [BEGIN|END] BACKUP
■ RESTRICTED SESSION
■ RECOVER DATABASE
Ограничения на системные привилегии
Oracle позволяет предотвратить доступ обычных пользователей базы данных к
основным таблицам, составляющим словарь данных. Пользователям с update
any table разрешается обновлять основные таблицы словаря данных, а это
может поставить под угрозу целостность всей базы данных. Во избежание
таких сбоев Oracle предусматривает механизм защиты словаря в виде параметра
инициализации 07_DICTIONARY_ACCESSIBILITY. Если с помощью
настройки 07_DICTI0NARY_ACCESS1BILITY как FALSE установлена защита
словаря, то доступ к объектам в схеме SYS (содержащей базисные таблицы
словаря данных) ограничивается для пользователей, устанавливающих
соединение как SYSDBA и самого пользователя SYS. Пользователям с системными
привилегиями, которые разрешают доступ к ЛЮБОЙ СХЕМЕ, будет закрыт
доступ к объектам схемы SYS. Это не позволит пользователям без привилегий
администратора обращаться к базисным таблицам,, из которых состоит
представление словаря данных, и изменять их. По умолчанию этот параметр
задается как FALSE. Установка этого параметра как TRUE позволяет
пользователям, чьи системные привилегии допускают обращение к объектам в любой
схеме, получить также доступ к объектам схемы SYS.
Идентификация объектных привилегий
Другая категория предоставляемых в базе данных Oracle привилегий — набор
объектных привилегий (object privileges). Объектные привилегии позволяют
владельцу объектов базы данных, например таблиц, управлять доступом к этим
объектам согласно следующим типам доступа. Ниже приводятся восемь типов
объектных привилегий:
Ш select Позволяет обладателям этой объектной привилегии обращаться
к данным в таблице, последовательности, представлению или
моментальному снимку.
600
Глава 15
■ insert Разрешает обладателям этой привилегии объекта вставлять
данные в таблицу или, в некоторых случаях, представления.
■ update Позволяет обладателям этой объектной привилегии обновлять
данные в таблице или представлении.
■ delete Позволяет обладателям этой объектной привилегии удалять
данные из таблицы или представления.
■ alter Позволяет обладателям этой объектной привилегии изменить только
определение таблицы или последовательности. Привилегии alter для всех
остальных объектов базы данных считаются системными привилегиями.
■ index Позволяет обладателям этой объектной привилегии создавать
индекс для уже определенной таблицы.
Ш references Позволяет обладателям этой объектной привилегии создавать
или изменять таблицу для создания ограничений внешнего ключа для
данных в этой таблице.
■ execute Позволяет обладателям этой объектной привилегии выполнять
сохраняемые процедуры или функции.
Совет Самое главное — суметь отличить, является привилегия системной
или объектной. Поскольку существует всего восемь объектных привилегий,
надо их запомнить. Если вы видите привилегию, которая не является ни
одной из восьми объектных привилегий, значит это системная привилегия.
Закрепление пройденного материала
1. Убедитесь, что можете отличить в Oracle системные привилегии от
объектных. Легче всего запомнить объектные привилегии и считать, что все
остальные — системные привилегии.
2. Необходимо знать задачи привилегий sysdba и sysoper. Эти привилегии
привилегированного пользователя позволяют выполнять
административные задачи в базе данных.
Упражнения
1. Требуется разрешить пользователям базы данных Oracle создать индексы
для таблицы, принадлежащей пользователю SCOTT. В каком из следующих
вариантов приводятся необходимые для выполнения этой задачи средства?
A. Назначить пользователям, создающим индексы, системную
привилегию create table.
B. Назначить пользователям, создающим индексы, системную
привилегию create index.
С Назначить пользователям, создающим индексы, объектную
привилегию references для этой таблицы.
D. Назначить пользователям, создающим индексы, объектную
привилегию index для этой таблицы.
2. Вы предоставляете пользователю базы данных Oracle привилегию SYSDBA.
Какую из следующих возможностей дает эта привилегия ее обладателю?
A. Возможность обращаться ко всем таблицам в Oracle
B. Возможность назначать привилегию sysdba другим
С Возможность проводить резервное копирование базы данных
D. Возможность удалять информацию из любой таблицы в Oracle
Ответы
1. D. 2. С.
Управление пользователями базы данных
601
Предоставление и отмена привилегий
Предоставление системных и объектных привилегии пользователям
производится с помощью команды grant. Системные привилегии сначала
предоставляются пользователям SYS и SYSTEM, а также любому другому пользователю
с разрешением grant any privilege. По мере создания других
пользователей им необходимо предоставлять привилегии исходя из их потребностей с
помощью команды grant. Например, выполнение следующих команд grant
позволяет пользователю SPANKY создать таблицу и предоставляет объектные
привилегии на другую таблицу в базе данных:
««ждан GRANT CREATE TABLE TO spanky; system
GRANT SELECT, UPDATE ON athena.emp TO spanky; — object
Совет Чтобы предоставлять другим объектные привилегии, вы должны
владеть объектом базы данных или иметь объектную привилегию with
grant option.
Кроме предоставления объектных привилегий для объектов базы данных
привилегии можно назначать для столбцов внутри объекта базы данных.
Управляемые на уровне столбца привилегии включают привилегии insert,
update и references. Однако во избежание проблем, особенно с
привилегией insert, от предоставляющего привилегии столбца требуется осторожность
при управление ими. Если пользователь имеет привилегию insert для
нескольких, но не для всех столбцов в таблице, администратор привилегии должен
гарантировать, что все столбцы в таблице, которым не назначили привилегию
insert, являются не-NULL столбцами.
Рассмотрим следующий пример. В таблице ЕМР два столбца: NAME и
EMPID. Оба столбца не имеют ограничения NULL. Пользователю SPANKY
предоставляется доступ insert для столбца EMPID, но не для столбца
NAME. Когда SPANKY пытается вставить EMPID в таблицу, Oracle
генерирует NULL для столбца NAME, а затем выдает сообщение об ошибке, в котором
говорится, что пользователь не может вставлять не-NULL значение в столбец
NAME, потому что для столбца установлено не-NULL ограничение.
Управление объектными привилегиями update и на insert уровне столбца должно
быть очень осторожным, проще всего использовать на уровне столбца
привилегии references.
Некоторые специальные условия касаются использования привилегии
execute. Если пользователь может выполнить хранимую процедуру,
принадлежащую другому пользователю, а процедура обращается к некоторым
таблицам, объектные привилегии на доступ к этим таблицам должны быть
предоставлены владельцу процедуры, а не пользователю, которому были
предоставлены привилегии execute. Кроме того, привилегии должны
назначаться непосредственно пользователю, а не через роль. Когда пользователь
выполняет сохраняемую процедуру, он может использовать любые
привилегии, необходимые для выполнения этой процедуры. Например, пользователю
SPANKY предоставляются привилегии execute на процедуру process_depo-
sit (), принадлежащую ATHENA, а эта процедура обновляет таблицу
BANK_ACCOUNT, используя привилегию update, предоставленную
ATHENA. SPANKY сможет обновить BANK_ACCOUNT с помощью
процедуры process_deposit О даже при том, что ему не назначена привилегия
update. Однако SPANKY не сможет ввести из SQL*Plus команду update для
таблицы BANK_ACCOUNT, потому что непосредственно ему не была
предоставлена соответствующая привилегия.
Предоставление возможностей администрирования
через привилегии
В конце выполнения рассмотренных в начале обсуждения двух команд
SPANKY сможет выполнить команду create table в своей пользовательской
схеме, а также и выбрать и обновить данные строки в таблице ЕМР из схемы
пользователя ATHENA. Однако SPANKY не сможет ни предоставить эти при-
602
Глава 15
вилегии другим, ни отказаться от них без помощи администратора БД. Чтобы
наделить пользователя SPANKY некоторыми возможностями управлять
предоставленными ей привилегиями в отношении других пользователей,
владельцу объекта надо выполнить следующие запросы:
«g&a»g GRANT CREATE TABLE TO spanky WITH ADMIN OPTION; system privileges
GRANT SELECT, UPDATE ON emp TO SPANKY WITH GRANT OPTION; — object privileges
Фраза with admin option позволяет SPANKY предоставлять системные
привилегия другим пользователям или отменять их. Кроме того, она позволяет
SPANKY делать других пользователей администраторами этой же привилегии.
И, наконец, если SPANKY предоставляется роль with admin option,
SPANKY может изменять роль или даже удалять ее. Фраза with grant
option для объектных привилегий предоставляет SPANKY те же самые
возможности, что и with admin option for для системных привилегий. SPANKY
может выбирать и обновлять данные из ЕМР и может предоставлять эту
возможность другим. Получающий привилегию может управлять только
привилегиями with grant option или with admin option. Кроме того,
существует комбинированный метод предоставления объектных привилегий с
помощью ключевого слова all. Обратите внимание, что в этом контексте all — не
привилегия. Это просто спецификация всех объектных привилегий для
объекта базы данных.
&&&*&*& GRANT ALL ON emp TO spanky;
Отмена системных привилегий для пользователя
Может наступить момент, когда потребуется отменить все привилегии
пользователей. Эта задача решается с помощью команды revoke. Отмена
привилегии create table также лишает возможности администрирования,
предоставляемой вместе с привилегией или ролью. Для отмены системной
привилегии with admin option или объектной привилегии with grant
option не требуется никакого дополнительного синтаксиса.
ШИЖКШа REVOKE CREATE TABLE FROM spanky;
REVOKE SELECT, UPDATE ON emp FROM spanky;
Точно так же можно отменять роли пользователей, даже если пользователь
создал роль и, таким образом, имеет admin option. Привилегия grant any
role позволяет отменять любую роль, а назначение привилегии with the
admin option позволяет предоставлять или отменять некоторые системные
привилегии. Отмена системной привилегии не приводит к каскадным
событиям. Таким образом, если SPANKY создала несколько таблиц, имея
привилегию create table, эти таблицы не удаляются при отмене привилегии.
Таблицы можно удалить только с помощью команды drop table.
Совет Разберем следующий сценарий: пользователю X предоставили
системную привилегию with admin option. Затем пользователь Xназначает
привилегию пользователю Yc административными привилегиями.
Пользователь Y делает то же самое для пользователя Z. Затем X отменяет эту
привилегию для пользователя Y. Пользователь Z будет по-прежнему
обладать этой привилегией. Почему?Потому что отсутствует эффект
каскадирования по отношению к отмене системных привилегий у иных, чем
упомянутый, пользователей.
Отмена объектных привилегий для пользователей
При отмене объектных привилегий имеют место каскадные события.
Например, если у вас есть привилегия на обновление таблицы ЕМР, принадлежащей
SPANKY, и SPANKY отменяет ее, вы не сможете изменять записи в таблице.
Однако уже измененные вами строки не восстанавливаются, как по
волшебству, в прежнем виде. При отмене объектных привилегий надо учитывать
несколько соображений. Например, если привилегия предоставлена на два
отдельных столбца, нельзя отменить ее только для одного столбца. Надо отменить
Управление пользователями базы данных
603
привилегию полностью, а затем, при необходимости, предоставить повторно
для отдельного столбца. Кроме того, если пользователю предоставлена
привилегия references и он использовал ее для создания ограничения внешнего
ключа для другой таблицы, то при удалении этой привилегии производится
каскадирование.
t<S№*£Sm REVOKE REFERENCES ON emp FROM spanky CASCADE CONSTRAINTS;
В этом примере удаляются не только привилегия для создания ссылочной
целостности, но и все экземпляры базы данных, в которых была использована
эта ссылочная целостность. Если в таблице ЕМР пользователя SPANKY было
создано ограничение внешнего ключа, и в приведенной выше команде была
введена фраза cascade constraints, то команда revoke потерпит неудачу.
Совет Разберем следующую последовательность. Пользователь X
предоставляет пользователю Yобъектную привилегию with grant option, а
затем пользователь Yназначает ту же самую привилегию пользователю Z.
Когда пользователь Xотменяет эту объектную привилегию для
пользователя Y, она отменяется и для пользователя Z. Это результат того, что
Oracle каскадно отменяет объектные привилегии.
Открытые для Public
Другой аспект привилегий и доступа к базе данных — специальный
пользователь базы данных. Этот пользователь называется PUBLIC. Если пользователю
PUBLIC предоставляется системная привилегия, объектная привилегия или
роль, то ее получают все пользователи в базе данных. Как правило, не
рекомендуется предоставлять PUBLIC много привилегий или ролей, так как, если
когда-нибудь придется отменять привилегию или роль, это приведет к
повторной компиляции всех сохраненных модулей, процедур или функций.
Информация словаря относительно привилегий
Следующие представления позволяют увидеть привилегии, связанные с
пользователями и ролями:
■ DBA_SYS_PRIVS Показывает все системные привилегии, связанным с
этим пользователем.
■ DBA_TAB_PRIVS Показывает всем объектные привилегии, связанным с
этим пользователем.
■ SESSION_PRIVS Показывает всем привилегии, доступные в этом сеансе
для этого пользователя.
В представлении DBA_SYS_PRTVS можно найти информацию о
системных привилегиях, предоставленных всем пользователям, а в представлении
словаря SESSION_PRTVS — информацию о привилегиях, доступных вам
как текущему пользователю в сеансе. В представлении словаря
DBA_TAB_PRIVS и DBA_COL_PRIVS можно найти информацию о
предоставленных в базе данных объектных привилегиях.
Закрепление пройденного материала
1. Необходимо уметь предоставлять пользователям системные и объектные
привилегии и удалять их. Также требуется знание фраз для системных и
объектных привилегий, для администрирования предоставлением
привилегий другим пользователям.
2. Следует знать роль пользователя PUBLIC в Oracle. Когда PUBLIC
предоставляются привилегии, ее получают все пользователи.
3. Необходимо знать, где в словаре данных можно найти информацию о
предоставленных пользователям привилегиях.
604
Глава 15
Упражнения
1. Пользователь MARYANN имеет привилегию create table,
предоставленную ей пользователем IMADBA с помощью следующей команды:
grant create table to maryann with admin option. Затем MARYANN
предоставляет эту привилегию GILLIGAN. Об этом узнает IMADBA и
вводит команду revoke create table from maryann. Какое из следующих
утверждений истинно в отношении MARYANN, GILLIGAN и IMADBA?
A. У IMADBA и GILLIGAN есть эта привилегия,
а у MARYANN нет.
B. У IMADBA и MARYANN есть эта привилегия,
а у GILLIGAN нет.
C. У IMADBA есть эта привилегия, а у GILLIGAN
и MARYANN нет.
D. У IMADBA, GILLIGAN и MARYANN есть эта привилегия.
2. IMADBA предоставил пользователю MARYANN привилегию select для
таблицы EMPLOYEE с помощью команды grant select on EMPLOYEE
to maryann with grant option. Затем MARYANN предоставляет эту
привилегию GILLIGAN. Об этом узнает IMADBA и вводит команду
revoke select on employee from maryann. Какое из следующих
утверждений истинно в отношении MARYANN, GILLIGAN и IMADBA?
A. У IMADBA и GILLIGAN есть эта привилегия,
а у MARYANN нет.
B. У IMADBA и MARYANN есть эта привилегия,
а у GILLIGAN нет.
C. У IMADBA есть эта привилегия, а у GILLIGAN
ч и MARYANN нет.
D. У IMADBA, GILLIGAN и MARYANN есть эта привилегия.
3. Вы хотите знать, какие системные привилегии предоставлены пользователю
GINGER. Какой из следующих запросов используется для этого?
A. select privilege from dba_tab_j>rivs where grantee
'GINGER'
B. select privilege from dba_sys_privs where grantee
'GINGER'
С select privilege from session_privs where grantee
'GINGER'
D. select grantor from dba_sys_privs where grantee ='GINGER'
Ответы
1. A. 2. С 3. В.
Определение возможности аудита
Защита базы данных от нежелательных действий — это только часть пакета
программных средств безопасности данных, который Oracle предлагает
администраторам БД или администраторам по безопасности базы данных Oracle. Другой
основной компонент архитектуры безопасности Oracle — способность
контролировать деятельность базы данных в целях обнаружения подозрительного или
нежелательного использования. Oracle обеспечивает эти функциональные
возможности с помощью аудита базы данных. В этом разделе будут рассмотрены
дифференциация между базой данных и аудитом на основе значений, аудитом
использования базы данных, применение словаря данных для контроля опций
аудита, а также просмотр результатов аудита и управление ими.
Управление пользователями базы данных
605
Совет Аудит базы данных требует назначения табличному пространству
SYSTEM значительного дополнительного пространства для хранения
сгенерированных данных аудита.
Есть несколько аспектов, аудит которых всегда проводится в базе данных.
Это выполняемые администраторами БД привилегированные операции,
например запуск и выключение экземпляра и регистрация в качестве sysdba
или sysoper. Информация о них находится в журнале предупреждающих
сообщений ALERT, там же находится информация о переключении журналов,
контрольных точках и табличных пространствах, переведенных в автономный
или оперативный режим.
Параметр AUDITJTRAIL из файла initsid.ora позволяет
сконфигурировать аудит всей системы. Допустимыми значениями этого параметра
являются база данных, т.е. DB (TRUE), операционная система (FALSE) или
NONE. DB указывает, что для хранения контрольных записей аудита будет
использоваться архитектура базы данных. В качестве альтернативы можно задать
для AUDITJTRAIL значение TRUE и получить тот же самый результат, что от
DB. Операционная система указывает, что контрольный след будет храниться
вне Oracle с помощью некоего компонента операционной системы. В качестве
альтернативы можно задать для AUDITjrRAIL значение FALSE и получить
тот же самый результат, что от операционной системы. И, наконец, NONE
указывает, что никакой аудит базы данных вообще не будет проводиться.
После изменения набора значений этого параметра, следует выключить и снова
запустить экземпляр.
База данных и аудит на основе значений
Аудит базы данных (database auditing) отличается от аудита на основе
значения (value-based auditing). Аудит базы данных относится к аудиту доступа к
объектам базы данных, деятельности в течение пользовательского сеанса,
запуску, выключению и другой деятельности базы данных. Информация об
этих событиях базы данных хранится в контрольном следе и может
использоваться для контроля потенциально опасных действий, например удаления
строк из таблиц. Администраторы БД могут использовать эти данные для
статистического анализа производительности базы данных за
определенный период времени. Аудит на основе значений относится к аудиту
фактических значений столбца/строки, изменяемых в результате деятельности
базы данных. Контрольный след Oracle не отслеживает контрольную
информацию аудита на основе значения, поэтому необходимо разрабатывать
триггеры, таблицы, код PL/SQL или клиентские приложения,
обрабатывающие этот уровень аудита в базе данных.
Хороший пример аудита на основе значений в приложении доставки
пакетов — отслеживание изменения состояния для существующих доставок со
времени получения заказа до времени доставки. В этом случае клиенты
смогут выяснить состояние доставки пакета через Интернет. Каждый раз,
когда пакет достигает некоторой стадии, например "взятый из местного
офиса" или "переданный получателю", состояние доставки будет
изменяться, а на основании старого состояния, времени изменения состояния и
имени пользователя того, кто внес изменение, будет составляться запись
предыстории. Однако, как можно себе представить, аудит на основе значений
привязан к приложению. Таким образом, основное внимание
администратора БД будет уделено управлению аудитом базы данных с помощью
свойств аудита в Oracle.
Совет Если AUDITJTRAIL задается как "операционная система ",
информация контрольного следа будет храниться в каталоге, имя которого
указывается параметром AUDITJFILE_DEST из файла init.sid.ora, по
умолчанию заданного как каталог rdbms/audit в домашнем каталоге ПО
Oracle. Если AUDITJTRAIL задан как DB, информация контрольного следа
хранится таблице AUDS, принадлежащей SYS.
606
Глава 15
Использование аудита базы данных
Аудит базы данных наиболее эффективен, когда администратор БД или
администратор по безопасности знает, что ищет. Лучший способ провести аудит
базы данных — запустить аудит, имея общее представление о том, что может
происходить в базе данных. Как только цели поставлены, настройте аудит так,
чтобы контролировать необходимые аспекты базы данных, и ищите в
результатах подтверждение или опровержение вашей гипотезы.
Почему следует проводить аудит именно так? При аудите базы данных
генерируется большой объем информации о доступе к базе данных. Если
администратор БД будет контролировать все, важные факты затеряются среди
многочисленных ненужных сведений. Хорошо представляя, какие виды
деятельности кажутся подозрительными, и зная типы команд или связанные
объекты базы данных, которые следовало бы посмотреть, впоследствии
администратор БД сэкономит много времени.
Команда Audit для аудита привилегий или команд
Для команды SQL audit нет необходимости задавать параметр
AUDIT_TRAIL из файла init. ora для установки нужных вам опций аудита.
Можно настроить свойства аудита на контроль действий базы данных,
включая запуск, выключение и установление соединения с базой данных. Или же
задайте аудит команд, включая создание или удаление объектов базы данных.
Кроме того, можно задать аудиты прямого использования базы данных,
например обновления таблиц или вставок.
Общий синтаксис для установки аудита команд или системных привилегий
выглядит следующим образом. Укажите имя команды (например, update) или
системной привилегии (например, create table), подлежащей аудиту. Затем
укажите, какие пользователи будут проверяться, с помощью username, by
session или by access. В заключение укажите, нужно ли при аудите
записывать факты успешного или неудачного выполнения рассматриваемой
деятельности. Пример команды audit демонстрируется в следующем блоке кода:
f^WMW AUDIT CREATE TABLE, ALTER TABLE, DROP TABLE
BY spanky
WHENEVER SUCCESSFUL;
Следующая команда демонстрирует, как можно записывать операции
изменения данных, выполняемые в определенных таблицах:
t&esSKK AUDIT UPDATE, DELETE
ON spanky.cat_toys
BY ACCESS
WHENEVER NOT SUCCESSFUL;
Рассмотрим другие уникальные особенности синтаксиса команды audit.
При задании аудита нет необходимости называть определенных
пользователей, деятельность которых будет контролироваться. Вместо этого можно
проверять деятельность такого рода каждый раз, когда команда вводится с
фразой by access. Кроме того, если не указана опция not successful,
контрольные записи генерируются, только когда выполнение команды было
неудачным. Использование синтаксиса команды audit без дополнительных
фраз приводит к максимальному расширению области действия этой
команды. Например, если опустить фразы by и whenever, аудит будет проводиться
по всем вставкам в таблицу PRODUCTS, независимо от пользователя и
состояния завершения:
fffWff* AUDIT INSERT ON products;
Опция default команды audit позволяет определить опции аудита для
еще не созданных объектов. После задания этих опций аудита по умолчанию,
для всех созданных впоследствии объектов автоматически будет выполняться
аудит с этими опциями. Следующий блок кода демонстрирует использование
ключевого слова default:
Управление пользователями базы данных 607
*s»s AUDIT INSERT
ON DEFAULT
WHENEVER SUCCESSFUL;
Команда audit для аудита объектов
Можно проводить аудит любых предоставляемых привилегий. Однако
поскольку в базе данных Oracle можно предоставить свыше 100 системных и
объектных привилегий, создание команды audit может занять довольно много
времени. В качестве альтернативы поименному перечислению всех привилегий
для объекта базы данных Oracle позволяет администратору указать имя
объекта для аудита, и Oracle будет контролировать все привилегированные
операции. Вместо перечня всех привилегированных операций, связанных с типом
контролируемого объекта, администратор по безопасности может получить
желаемый результат, назвав тип объекта.
**W&fflM AUDIT TABLE
BY spanky
WHENEVER SUCCESSFUL;
И, наконец, задавая аудит, можно также указать компиляцию контрольных
записей по сеансам. Это означает, что audit будет записывать данные для
контролируемых операций в каждом сеансе, в отличие от by access.
Отсутствие фразы when successful указывает команде audit записывать все
операции создания таблицы, изменения или удаления для каждого сеанса
соединения с базой данных, независимо от их успешности.
««ИРЧЕИа AUDIT TABLE
BY SESSION
Сокращенные команды для команды Audit
Существуют и другие возможности объединения спецификаций работы базы
данных в одну простую команду аудита. Эти команды приводятся ниже:
■ connect Аудиты пользовательских соединений с базой данных. С тем же
эффектом ее можно заменить на session, connect осуществляет аудит
регистрации в системе и выхода из нее каждого пользователя базы данных.
■ resource Аудиты подробных сведений, относящихся к стандартным
действиям разработчика приложений или администратора БД разработки,
например создание таблиц, представлений, кластеров, ссылок,
сохраняемых процедур, сегментов отката.
■ dba Аудиты действий, связанные с "истинным" администрированием базы
данных, включая создание пользователей и ролей, а также предоставление
системных привилегий и аудит системы.
И all Эквивалент переключателя "включить-выключить", где
контролируются и регистрируются все действия базы данных.
Совет Процедура PL/SQL или команда SQL могут ссылаться на несколько
различных объектов или команд, подвергающихся аудиту. Таким образом,
одна команда генерирует много элементов контрольного следа.
Отключение конфигурации аудита
Отключить аудит можно с помощью двух методов. Первый метод — изменение
параметра инициализации AUDITTRAIL с NONE на FALSE. После
выключения и повторного запуска базы данных эта опция отключит аудит в базе
данных Oracle. Однако учтите, поскольку нет необходимости в установке
AUD1T_TRAIL для использования команды SQL audit, есть еще одна опция,
используемая для изменения регистрируемых audit действий — noaudit. Эта
опция может быть выполнена двумя способами. Первый — выключение
отдельных областей, для которых в настоящее время осуществляется аудит.
60S
Глава 15
iwwtn-f NOAUDIT INSERT ON application.products;
Однако в некоторых случаях может потребоваться отключить все
происходящие процессы аудита и начать аудит снова. Возможно, средство контроля
потеряло след аудитов, происходящих в базе данных. Эту команду можно
дополнительно модифицировать, чтобы ограничить отключение аудита
конкретным объектом базы данных.
ЁШ!^Ш MOAUDIT ALL;
NOAUDIT ALL PRIVILEGES;
NOAUDIT ALL ON application.products;
И, наконец, не забудьте защитить информацию аудита!
Самое главное в базе данных при управлении аудитом нежелательных
действий — защита свидетельств этой деятельности. Администратор БД должен
гарантировать, что никто из пользователей не сможет незаметно удалять записи
из контрольного журнала. Поэтому самый важный шаг при аудите — аудит
контрольного следа. Этот шаг может включать защиту от записи каталога
$ORACLE_HOME/rdbms/audit с помощью команды операционной системы
(например, chmod в UNIX), а также контроль удаления данных из таблицы
SYS.AUD$, как это показано в следующем блоке кода:
№РЗЯЯ AUDIT delete ON sys.aud$;
Просмотр включенных опций аудита
Информация о сконфигурированных и включенных опциях аудита
содержится в следующих представлениях:
■ DBA_OBJ_AUDIT_OPTS Список опций аудита для представлений,
таблиц и других объектов базы данных
■ DBA_PRrV_AUDrT_OPTS Список опций аудита для всех привилегий в
базе данных
■ DBA_STMT_AUDIT_OPTS Список опций аудита для всех выполненных
на базе данных команд
■ ALL_DEF_AUDIT_OPTS Список всех заданных по умолчанию опций
аудита для объектов базы данных
Поиск и поддержка информации аудита
Для поиска результатов проводящегося в настоящее время в базе данных
Oracle аудита используются следующие представления словаря данных. Эти
представления создаются сценарием cataudit. sql, который находится в
подкаталоге rdbms/admin домашнего каталога ПО Oracle. Этот сценарий
выполняется автоматически при создании базы данных сценарием
catalog, sql. Дополнительная информация аудита хранится в журнале
предупреждающих сообщений, а при использовании аудита операционной системы
дополнительная информации аудита будет сохраняться в файле операционной
системы:
■ DBA_AUDIT_EXISTS Список контрольных входов, сгенерированных
опцией exists команды audit
И DBA_AUDIT_OBJECT Список контрольных входов, сгенерированных
для аудита объектов
■ DBA_AUDIT_SESSION Список контрольных входов, сгенерированных
установлением и прекращением соединений сеанса
■ DBA_AUDIT_STATEMENT Список контрольных входов,
сгенерированных опциями команды audit
Управление пользователями базы данных
609
■ DBA_AUDIT_TRAIL Список всех входов в таблице AUD$, собранных
командой audit
Управление информацией аудита
После создания вся информация аудита остается в таблице AUD$,
принадлежащей SYS. В случае использования нескольких опций аудита для сбора
информации о деятельности базы данных таблица AUD$ может разрастись. Для
сохранения целостности других таблиц и представлений словаря данных и
сохранения общего пространства в табличном пространстве SYSTEM (где
хранятся все объекты словаря данных) администратор БД или администратор по
безопасности должен периодически удалять данные из таблицы AUD$, просто
удаляя записи или архивируя их с последующим удалением. Кроме того, если
контрольные записи сохраняются в базе данных Oracle для выявления
подозрительной деятельности, администратор по безопасности должен принять
дополнительные меры и гарантировать защиту данных в таблице AUD$ от
вмешательства.
Совет Может потребоваться переместить таблицу AUDS за пределы
табличного пространства SYSTEM из-за временного характера данных
аудита и их способности значительно разрастаться. Для этого с помощью
команды alter table move tahlespace создайте другую таблицу с
данными A UDS. Затем удалите A UD$ и переименуйте другую таблицу в A UD$.
После этого создайте один индекс для новой таблицы AUDS по столбцам
SESSIONID и SESSTID в новом табличном пространстве (конечно,
сохранив индекс вне табличного пространства SYSTEM). И в заключение
предоставьте delete на новую таблицу AUDS роли DELETE_CATALOG_ROLE.
Во избежание проблем с сохранением слишком большого объема данных
аудита при проведении аудита базы данных надо записывать столько
информации, сколько нужно для достижения цели аудита, избегая сохранения
ненужной информации. Объем собранной в процессе аудита информации
связан с числом опций аудита и частотой сбора данных (а именно by username,
by access и by session). Если проблемы вызваны слишком большим
объемом собранной информации, для удаления записей из AUD$ пользователь с
привилегией delete any table, пользователь SYS или пользователь,
которому SYS предоставил доступ delete к AUD$, должен зарегистрироваться в
системе и удалять записи из AUDS. Однако перед этим рекомендуется в целях
архивирования создать резервную копию удаляемых записей. Для этого
скопируйте все записи из AUD$ в другую таблицу, определенную с теми же
самыми столбцами, что и AUD$, скачав с помощью команды select все
данные из AUD$ в неструктурированный файл или использовав EXPORT для
размещения всех записей AUD$ в файле дампа базы данных. После выполнения
этого шага можно с помощью delete from AUD$ или truncate table AUD$
удалить все или часть данных в таблице AUD. Но не забудьте защитить
контрольный след с помощью уже рассмотренных методов.
Закрепление пройденного материала
1. Необходимо знать задачи аудита в базе данных и разницу между аудитом
базы данных и аудитом на основе значений.
2. Необходимо знать, что свойство аудита в Oracle включается с помощью
команды audit.
3. Необходимо знать, что все контрольные записи хранятся в базисной таблице
словаря SYS.AUDS в Oracle, а информацию из этой таблицы можно найти
во многих представлениях словаря.
4. В процессе аудита генерируется много информации, сохраняемой в
табличном пространстве SYSTEM. Если Вы планируете использовать это
свойство, рекомендуется заранее решить, что искать, а не задавать аудит
610
Глава 15
случайно и потом разбираться в огромном объеме посторонней
контрольной информации, заполнившей табличное пространство SYSTEM.
Упражнения
1. Аудит базы данных конфигурируется с помощью этой команды:
2. Если включен аудит, записи помещаются в таблицу (А) ,
принадлежащую пользователю (В) . Эту таблицу можно найти в
табличном пространстве (С) .
3. Чтобы задать аудит в Oracle, параметр инициализации (А) должен
быть установлен в (В) .
Ответы
1. audit. 2. (A) AUD$; (В) SYS; (С) SYSTEM. 3. (A) AUDIT_TRAIL; (В) TRUE.
Управление ролями
В этом разделе мы рассмотрим следующие вопросы управления ролями:
■ Создание и изменение ролей
Ш Управление доступностью ролей
■ Удаление ролей
■ Использование предопределенных ролей
■ Вывод на экран информации о роли из словаря данных
Роли облегчают управление пользовательскими привилегиями. Роль в базе
данных можно представить как виртуального пользователя. Объектные и
системные привилегии базы данных, необходимые для выполнения группы
пользовательских функций, собираются вместе и предоставляются роли, которую
затем можно назначить непосредственно пользователям. В этом разделе вы
научитесь создавать и изменить роли, управлять их доступностью, удалять
роли, использовать предопределенные в Oracle роли и выводит на экран
информацию о ролях из словаря данных.
Создание и изменение ролей
По мере добавления пользователями новых объектов в базу данных
управление привилегиями может превратиться в кошмар. Вот здесь и могут
пригодиться роли. Роли называются логическими группировками привилегий,
которыми можно управлять легче, чем отдельными привилегиями. Роли создаются
в базах данных следующим образом. Администратор БД определяет, какие
типы пользователей существуют в базе данных и какие привилегии в базе
данных можно логически сгруппировать вместе.
Создание ролей
Для создания роли, которая будет поддерживать управление пользовательскими
привилегиями, вводится одна из следующих команд. После создания роль не
имеет никаких привилегий, пока они не будут явно предоставлены вами.
Следующая команда позволяет создать роль в Oracle:
CREATE ROLE cat_priv;
Эта команда создает роль cat_priv. Следующий блок кода демонстрирует
вариант команды create role, где мы в явном виде указываем, что
включение этой роли для пользователя не требует пароля. Для ролей в Oracle это
поведение по умолчанию.
Управление пользователями базы данных
611
fflSFWW CREATE ROLE Cat_J>liv NOT IDENTIFIED;
В следующей команде показана созданная в базе данных роль cat_priv.
На сей раз мы устанавливаем роль, чтобы потребовать от пользователя вводить
пароль при каждом включении роли. Прежде чем использовать связанные с
этой ролью привилегии, пользователь должен включить роль. А теперь
рассмотрим команду:
№Sjg5M> CREATE ROLE Cat_priv IDENTIFIED BY meow;
Предоставление ролей
После создания роли ей нужно назначить привилегии. Привилегии
назначаются ролям следующим образом. Когда администратор БД определяет
использование ресурсов различными классами пользователей базе данных, он может
определить, какие объектные и системные привилегии потребуются каждому
классу пользователей. Вместо предоставления привилегий непосредственно
пользователям на индивидуальной основе администратор БД может назначать
привилегии ролям, которые впоследствии легко можно назначать нескольким
пользователям.
г&шт&к GRANT SELECT, INSERT, UPDATE ON catfood TO catjarivs;
GRANT SELECT, INSERT, UPDATE ON litter box TO cat_privs,
GRANT SELECT ON fav_sleeping_spots TO cat_privs;
Роли также позволяют динамически управлять привилегиями. Если
нескольким пользователям уже назначили роль, а вы создаете новую таблицу и
предоставляете роди привилегии select, все пользователи, имеющие эту роль,
смогут выбрать данные из этой таблицы. Предоставление обеспечивает
непосредственную возможность пользоваться предоставленной через роль
привилегией. Роли можно также назначать другим ролям. Однако следует быть
внимательным и не назначить роль себе (даже через другую роль), иначе Oracle
выдаст сообщение об ошибке.
Предоставление ролей пользователям
Как только вы создали роль и назначили ей некоторые привилегии,
необходимо назначить роль пользователю. Это позволяет пользователю обращаться к
привилегиям, для управления которыми предназначается роль. Роль
предоставляется пользователю с помощью команды grant, а удаляется командой
revoke. Следующий блок кода демонстрирует назначение роли пользователю:
ga^SfW GRANT cat_privs TO spanky;
Пароли и роли
Использование пароля для аутентификации пользователей роли не является
обязательным. Однако пароль обеспечивает дополнительный уровень
безопасности в процессе аутентификации регистрации в базе данных. В целях усиления
безопасности при использовании ролей с паролями задайте для этого
пользователя роль, аутентификация которой происходит по паролю nondef ault. Таким
образом, если пользователь пытается использовать привилегию,
предоставленную через роль, сначала ему придется ввести пароль роли. Подобно
пользователям роли не имеют владельца и не являются частью схемы. Имя роли должно
быть уникально среди всех ролей и пользователей базы данных.
Изменение ролей
Впоследствии может потребоваться изменить роль с помощью команды alter
role. Все элементы, определяемые в create role, можно также определить с
помощью alter role, как показано в следующем блоке кода:
«aWBtt» ALTER ROLE то1е_пате NOT IDENTIFIED;
ALTER ROLE role_name IDENTIFIED BY roie_j>assword;
612
Глава 15
Возможность администрирования и роли
По умолчанию только создавший роль пользователь имеет для нее
административные привилегии, включая способность назначить роль другим
пользователям. Другие пользователи могут, конечно, назначать привилегии роли, но
только пока им это разрешено. Однако, как и привилегии, пользователям
можно назначать роли с возможностью администрирования. Это делается с
помощью опции grant rolename to username with admin option. Та же
опция' используется для предоставления возможности администрирования с
системными привилегиями.
Закрепление пройденного материала
1. Необходимо понимать концептуальное значение роли. Для использования
роли сначала необходимо создать роль, а затем назначить ей привилегии.
Тогда можно объединить предоставление этих привилегий пользователям,
просто предоставив роль этому пользователю.
2. Роли могут создаваться для принудительной реализации аутентификации с
помощью пароля. При этом пользователь должен указывать пароль, чтобы
использовать привилегии, связанные с заверенной паролем ролью. В
Oracle пароли на роль необязательны.
3. По умолчанию владелец роли имеет возможность назначить эту роль
другим. Однако роли можно назначать пользователям вместе с возможностью
администрирования для этой роли. Это позволяет сделать команда grant
rolename to username with admin option.
Упражнения
1. Вы создаете роль в Oracle по имени DEVELOPER, а затем назначаете ее
пользователю SKIP. Затем SKIP регистрируется в базе данных Oracle.
Затем вы назначаете привилегию create table роли DEVELOPER. Какое
из следующих утверждений лучше всего описывает возможности
пользователя SKIP создавать таблицы в Oracle?
A. SKIP сможет создавать таблицы, когда в следующий раз
зарегистрируется в Oracle.
B. SKIP сможет создавать таблицы сразу же после того, как вы
назначаете эту привилегию роли.
C. Чтобы создавать таблицы с этой ролью, SKIP должен владеть ею.
D. Чтобы создавать в Oracle таблицы, эта роль должна быть задана SKIP
по умолчанию.
9. Вы хотите использовать роли в Oracle для управления привилегиями.
Какой из следующих вариантов правильно описывает последовательность
событий, необходимых для того чтобы пользователи успешно применяли
роли для пользования привилегиями?
A. Создать роль, предоставить роли привилегии, назначить роль
пользователям, а пользователи включают роль.
B. Создать роль, пользователи включают роль, предоставить роли
привилегии и назначить роль пользователям.
С Предоставить роли привилегии, создать роль, назначить роль
пользователям, а пользователи включают роль.
D. Пользователи включают роль, создать роль, предоставить роли
привилегии, назначить роль пользователям.
Управление пользователями базы данных
613
Ответы
1. В. 2. А.
Контроль доступности ролей
После регистрации пользователь может иметь несколько назначенных ему
ролей. По умолчанию все назначенные пользователю роли включаются при
регистрации и пароль при этом не требуется. Некоторые, все или ни одна из этих
ролей не могут быть установлены как роли по умолчанию, т.е.
предоставляемые через роль привилегии становятся доступными автоматически при
регистрации пользователя в Oracle. Число назначаемых пользователю ролей не
ограничено. Однако при наличии у пользователя привилегий, назначенных
через роль nondefault, чтобы воспользоваться ими, пользователю, вероятно,
придется переключать роли по умолчанию.
Все назначенные пользователю роли первоначально являются ролями по
умолчанию. Команда alter user позволяет после предоставления роли
пользователю менять, какие роли являются заданными по умолчанию. Команда
alter user default role all заставляет все назначенные SPANKY роли стать
ролями по умолчанию. Другие опции, доступные для определения
пользовательских ролей, включают листинг одной или нескольких ролей, которые должны
быть ролями по умолчанию, или определение всех ролей, за исключением тех,
чьи имена указаны с помощью all except (го2е_лате [, ...] ) или none.
«ямяаи ALTER USER spanky DEFAULT ROLE ALL;
Предыдущая команда устанавливает все назначенные пользователю
SPANKY роли как роли по умолчанию. Следующая команда устанавливает
роли ORG_USER и ORG_DEVELOPER как роли по умолчанию для
пользователя SPANKY:
ВЙ<ЖЗВ ALTER USER spanky DEFAULT ROLE org_user, org_developer;
В этой команде роли ORG_USER и ORG_DEVELOPER назначаются как
роли по умолчанию, а остальные назначаемые пользователю SPANKY роли
задаются не по умолчанию. Следующая команда делает роль ORG_MGR
единственной ролью не по умолчанию, которая есть у SPANKY:
№й&ИИЯ> ALTER USER spanky DEFAULT ROLE ALL EXCEPT (org_mgr);
Следующая команда делает так, чтобы у SPANKY не было ролей по
умолчанию, задаваемых при регистрации. Единственные привилегии, которые
пользователь SPANKY имеет при регистрации, — привилегии, назначенные
непосредственно пользователю.
taasaaia alter user spanky default role none,-
Совет Обратите внимание, default role — единственная опция,
используемая для команды alter user. Роль по умолчанию не определяется в
create user, так как пользователю еще не назначены роли. Учтите, что роли
по умолчанию — это подмножества назначаемых пользователю ролей,
которые автоматически включаются при регистрации пользователя в Oracle.
Включение и выключение ролей
Когда пользователь регистрируется, его роли по умолчанию активизируются
автоматически. Однако можно включать и выключать не задаваемые по
умолчанию роли с помощью команды set role. Такие роли действительны в
течение пользовательского сеанса. Когда пользователь выходит из сеанса и снова
входит в Oracle, активизируются только роли по умолчанию. В следующем
блоке кода приводится пример команды set role:
*®&№ЯЯ SET ROLE catjrivs;
Обратите внимание, если для роли catprivs необходим пароль, его
следует предоставить при включении роли с помощью команды set role.
Синтаксис демонстрируется в следующем блоке кода:
614
Глава 15
SET ROLE catjrivs IDENTIFIED ВУ meow;
Совет Команда set role all позволяет включить сразу много ролей (пока
ни одна из ролей не требует пароля). Команда set role all except
role_name позволяет не включать некоторые роли. Кроме того, команда
set role none позволяет выключать все назначенные роли.
Модуль DBMS_SESSION содержит процедуру setrole ( ), которая
эквивалентна команде set role. Она может включать или выключать роли для
пользователя и может вводиться из форм Oracle, сообщений, анонимных
блоков или любого другого поддерживающего PL/SQL инструмента, за
исключением сохраненных функций PL/SQL, процедур и модулей. Наконец, обратите
внимание, что включение или выключение роли с помощью команды set
role не зависит от того, является ли роль заданной по умолчанию или нет.
Только команда alter user default role, введенная администратором БД,
зависит от того, является ли роль заданной по умолчанию или нет.
Закрепление пройденного материала
1. Назначенные пользователям роли считаются ролями по умолчанию, если
не указано иное. Команда alter user username default role rolena-
me позволяет сделать роль заданной по умолчанию или нет.
Я. Когда пользователь зарегистрируется в Oracle, он сможет использовать все
назначенный ему привилегии непосредственно и через заданные по
умолчанию роли.
3. Назначение пользователю роли как nondefault добавляет уровень
безопасности, особенно когда роль не по умолчанию имеет пароль. В этом
случае пользователи должны использовать команду set role rolevame
identified by password, позволяющую воспользоваться ролью.
4. Настройка роли указанным выше способом не делает роль заданной по
умолчанию — он просто включает роль для текущего сеанса. Чтобы снова
включить предоставляемые ролью привилегии, пользователь должен
использовать команду set role.
Упражнения
1. Следующий вывод представляет собой листинг ролей, назначенных
пользователю KENNY:
GRANTEE GRANTED ROLE ADM DEF
KENNY APP_DEVELOPER NO N0
KENNY POWERJJSER NO YES
KENNY назначается привилегия create table через роль
APP_DEVELOPER. Какое из следующих утверждений лучше всего
описывает, что произойдет, когда KENNY попытается ввести команду create
table mytab (coll number primary key) tablespace datal?
A. Oracle возвратит ошибку с указанием на превышение квоты KENNY
на табличное пространство DATA1.
B. Oracle возвратит ошибку с указанием на отсутствие у KENNY
необходимых для выполнения этой задачи привилегий.
C. Oracle возвратит ошибку с указанием на необходимость включения
роли POWER_USER.
D. Oracle успешно выполнит задачу.
Я. Ознакомьтесь со следующей расшифровкой сеанса SQL*Plus:
SQL> connect scott/tiger
Connected.
SQL> create user smithers identified by mortl;
Управление пользователями базы данных
615
User created.
SQL> create role user_role identified by useme;
Role created.
SQL> grant all on scott.emp to user_role;
Grant succeeded.
SQL> grant user_role to smithers;
Grant succeeded.
SQL> grant create session to smithers;
Grant succeeded.
SQL> alter user smithers default role none;
User altered.
SQL> connect smithers/mortl
Connected.
SQL> select * from scott.emp;
Какой из следующих вариантов описывает команду, которую должен
ввести SMITHERS для просмотра содержимого таблицы ЕМР как требуется в
расшифровке сеанса?
A. Ни один - команда select будет успешно выполнена.
B. connect smithers/useme
C. set role user_role identified by useme,
D. alter user smithers default role user_role;
Ответы
l. в. 2. с.
Удаление ролей
Другой способ ограничить использование роли состоит в том, чтобы отменить
роль у пользователя. Это делается с помощью команды revoke аналогично
отмене привилегии. Эффект достигается немедленно — пользователь больше не
сможет использовать связанные с ролью привилегии. Можно также удалить
роль, чтобы ограничить ее использование. Нет необходимости отменять роль
перед ее удалением — этим занимается Oracle. Однако для удаления роли
следует иметь привилегию drop any role или роль with admin option.
1ИШИММИ! REVOKE cat_pVivs FROM spanky;
DROP ROLE cat_privs;
Совет Чтобы удалить роль, вам должна быть назначена роль wi th admin
option или системная привилегия DROP ANY ROLE.
Закрепление пройденного материала
1. Знайте, что команда revoke используется для отмены ролей у других
пользователей, а команда drop role используется для удаления ролей из базы
данных.
2. Перед удалением ролей нет необходимости отменять их у всех, кому они
были назначены, пока у вас есть разрешение на удаление роли.
Упражнения
1. Вы удаляете роль из базы данных, используя команду (А) (два
слова). Вам (надо/не надо) отменить роль у тех, кому она была назначена,
перед удалением роли из базы данных.
2. Роль может быть удалена из базы данных любым пользователем, который
(А) роль, или пользователем с привилегией (В) (три слова).
Ответы
1. (A) drop role; не надо. 2. (А) создал (или владеет), (В) drop any role.
616
Глава 15
Использование предопределенных ролей
Пользователям базы данных доступны некоторые специальные роли.
Доступные при создании базы данных роли, начиная с Огас1е7 и выше, включают
роли CONNECT, RESOURCE, DBA, EXP_FULL_DATABASE и
IMP_FULL_DATABASE. Oracle8/ добавляет к ним DELETE_CATALOG_
ROLE, EXECUTE_CATALOG_ROLE и SELECT_CATALOG_ROLE роли и
многое другое. Использование каждой роли описано в приведенном ниже
перечне:
■ CONNECT Предоставляет пользователю широкие возможности
разработки в пределах собственной схемы пользователя, включая способность
использовать create table, create cluster, create session, create
view, create sequence и т.п. Связанные с этой ролью привилегии
зависят от платформы, поэтому роль может содержать разное число
привилегий, но, как правило, роль никогда не позволяет создавать сохраняемые
процедуры.
■ RESOURCE Предоставляет пользователю средние возможности
разработки в пределах собственной схемы пользователя, включая
способность использовать create table, create cluster, create trigger
и create procedure. Связанные с этой ролью привилегии зависят от
платформы, поэтому роль может содержать различное число
привилегий.
■ DBA Позволяет пользователю управлять всеми системными
привилегиями и использовать их.
■ EXP_FULL_DATABASE Позволяет пользователю экспортировать все
объекты в базе данных с помощью утилиты EXPORT.
■ IMP_FULL_DATABASE Позволяет пользователю импортировать все
объекты из файла дампа экспорта с помощью утилиты IMPORT.
■ DELETE_CATALOG_ROLE Распространяет привилегию delete на
принадлежащие SYS таблицы словаря в ответ на новое ограничение
привилегии delete any table, не позволяющее тем, кому назначена эта
привилегия, удалять строки из принадлежащих SYS таблиц словаря.
■ EXECUTE_CATALOG_ROLE Позволяет пользователю получить
привилегии execute на любом принадлежащем SYS модуле, поставляемом с ПО
Oracle.
■ SELECT_CATALOG_ROLE Позволяет пользователю выбирать данные из
любой принадлежащей SYS таблице словаря или представления.
Использование других предопределенных ролей
В Oracle доступны и другие дополнительные, предопределенные роли,
которые обычно определяются администратором БД с помощью предоставляемого
базой данных сценария SQL. Например, AQ_ADMINISTRATOR_ROLE и
AQ_USER_ROLE создаются сценарием dbmsaqad. sql. Эти роли
используются с расширенным свойством организации очереди в базе данных Oracle.
Существует еще роль PLUSTRACE, создаваемая с помощью сценария plustr-
се. sql для установки свойства автотрассировки в SQL*Plus.
Закрепление пройденного материала
1. Необходимо понимать значение предопределенных ролей в Oracle.
CONNECT, RESOURCE и DBA широко используются для предоставления
пользователям возможности быстрого запуска. Однако использовать эти
роли следует осторожно, потому что они могут пользователям дать гораздо
большее число привилегий, чем вы собирались.
Управление пользователями базы данных
617
9 Необходимо знать вспомогательные цели ролей каталога. Эти роли
позволяют пользователям видеть данные в словаре данных. Их не всегда следует
назначать конечным пользователям, чтобы пользователи видели
определенные представления словаря. Но если пользователь не видит объект в
словаре данных, роли каталога позволяют ему сделать это.
Упражнения
1. Роль полезна для администраторов базы данных, потому что
предоставляет все административные привилегии, которые нужны для работы
администратора базы данных.
2. Роль позволяет пользователям экспортировать содержимое базы
данных Oracle.
3. Роль позволяет пользователям обращаться к словарю данных.
Ответы
1. РВА 2. EXP_FULL_DATABASE 3. SELECT_CATALOG_ROLE.
Показ информации о роли из словаря данных
Информация о созданных в базе данных Oracle ролях находится в словаре
данных. В следующих подразделах перечислены различные представления,
доступные для поиска информации о созданных вами ролях:
■ DBA_ROLES Называет все созданные в базе данных роли и указывает
необходимость пароля для использования каждой роли.
■ DBA_ROLE_PRIVS Называет всех пользователей и назначенные им
роли.
■ ROLE_ROLE_PRJVS Идентифицирует все роли и назначенные им в базе
данных роли.
■ DBA_SYS_PRIVS Идентифицирует все роли и пользователей, которым
они назначены, а также предоставленные этим ролям и пользователям
системные привилегии.
■ ROLE_SYS_PRIVS Идентифицирует все системные привилегии,
назначенные в Oracle только ролям.
■ ROLE_TAB_PRIVS Идентифицирует все объектные привилегии,
назначенные в Oracle только ролям.
■ SESSION_ROLES Идентифицирует все доступные в текущем сеансе
Oracle роли.
Мелкомодульное управление доступом
Мелкомодульное управление доступом позволяет осуществлять политику
безопасности с помощью функций, а затем связывать ее с таблицами или
представлениями. Сервер базы данных автоматически реализует политику
безопасности. Можете использовать разную политику для select, insert, update и
delete. Можно использовать ее только там, где она необходима (например,
информации о зарплате). Наконец, можно использовать более одной
политики для каждой таблицы, включая компоновку поверх базисных политик
прикладного пакета.
Функция, или модуль, реализующий созданную вами политику
безопасности, возвращает предикат (фразу where). Этот предикат управляет доступом в
соответствии с политикой. Перезаписанные запросы полностью
оптимизированы и могут использоваться совместно. Управлять политикой безопасности
позволяет модуль PL/SQL DBMS_RLS. С помощью этого модуля можно до-
618
Глава 15
бавлять, удалять, включать, отключать и восстанавливать созданную вами
политику.
Закрепление пройденного материала
1. Представление DBAROLES показывает все роли в базе данных Oracle.
ROLE_TAB_PRTVS и ROLE_SYS_PRIVS показывают все объектные и
системные привилегии, предоставленные ролям в Oracle.
Я. DBAROLEPRJVS показывает назначенным пользователям Oracle роли, а
ROLEROLEPRIVS показывает роли, назначенные другим ролям.
3. Представление SESSION_ROLES показывает все текущие роли, активные
в пользовательском сеансе.
Упражнения
1. Определить, какие роли являются активными в вашем сеансе, позволяет
представление словаря .
2. Определять, какие системные привилегии назначены роли, позволяет
представление (А) . Определить, какие объектные привилегии были
назначены роли, позволяет представление (В) .
3. Определить доступные в базе данных роли позволяет представление
Ответы
1. SESSION_ROLES. 2. (A) DBA_SYS_PRIVS;
(В) DBA_TAB_PRIVS. 3. DBA_ROLES.
Резюме главы
В этой главе были рассмотрены основные сведения о пользователях,
профилях, привилегиях и ролях, необходимые для экзамена "Основы АБД I" Мы
обсудили создание пользователей и управление созданными пользователями
в Oracle. Вы научились создавать пользователей, поддерживать их, узнали,
где найти дополнительную информацию. Вы также узнали о профилях —
инструменте Oracle для управления основными системными ресурсами хоста, к
которым конечные пользователи обращаются через Oracle. Мы обсудили
создание профилей и назначение им пользователей. Кроме того, мы
рассмотрели специальную тему сложных ресурсов. Мы также охватили системные и
объектные привилегии в Oracle. Вы узнали, что каждое действие в базе
данных Oracle управляется привилегией. Вы узнали, что такое системные
привилегии и чем они отличаются от объектных привилегий. Вы также научились
назначать и отменять привилегии с возможностью администрирования или
без нее. Мы обсудили возможности аудита в Oracle для выявления
неправильного использования базы данных.
Наконец, мы обсудили особое значение ролей в Oracle. Вы узнали, что
роли действуют как "расчетная палата" для более эффективного
предоставления привилегий, особенно при наличии большого числа объектов базы
данных и многочисленных пользователей системы Oracle. Вы научились
создавать роли, предоставлять ролям привилегии и назначать роли пользователям.
Вы научились различать роли по умолчанию и роли не по умолчанию и
использовать команду alter user default role для задания пользователям
ролей по умолчанию. Вы узнали, что привилегии, предоставленные
пользователям через роли не по умолчанию, доступны только после ввода
пользователями команды set role, которая добавляет дополнительный
уровень безопасности, особенно при использовании ролей, аутентифицируемых
паролем. Мы рассмотрели удаление ролей, использование предопределенных
Управление пользователями базы данных
619
ролей, а также где найти информацию о ролях в словаре данных. В целом эта
глава охватила 16% материалов, выносимых на экзамен "Основы АБД I"
Двухминутное погружение в пройденное
■ Новые пользователи базы данных создаются с помощью команды create
user.
■ Для нового пользователя с помощью команды create user можно
сконфигурировать следующее:
■ Пароль
■ Заданное по умолчанию табличное пространство для объектов базы
данных
■ Временное табличное пространство
■ Квоты на табличное пространство
■ Пользовательский профиль
■ Состояние блокировки учетной записи
■ Должен ли пользователь определить новый пароль при первой
регистрации
■ Пользовательские определения можно изменять с помощью команды
alter user и удалять с помощью команды drop user. Пользователи могут
вводить команду alter user только для изменения своего пароля и
заданных по умолчанию ролей.
■ Информация о пользователе базы данных находится в следующих
представлениях словаря:
■ DBA_USERS
■ DBA PROFILES
■ DBA_TS_QUOTAS
■ DBA_OBJECTS
■ DBA_ROLE_PRIVS
■ DBA_TAB_PRTVS
■ DBA_SYS_PRIVS
■ В окружении с аутентификацией при помощи операционной системы при
создании пользователей к их именам добавляется префикс OPSS.
■ Пользовательские профили помогают ограничивать использование
ресурсов в базе данных Oracle.
■ Для использования пользовательских профилей администратор БД
должен установить параметр RESOURCELIMIT как TRUE.
■ Ограничиваемые с помощью профиля ресурсы включают:
■ Одновременно устанавливаемые сеансы на одного пользователя
■ Время процессора на вызов
■ Время процессора на сеанс
■ Дисковый ввод-вывод на вызов
■ Дисковый ввод-вывод на сеанс
620
Глава 15
■ Продолжительность установленного соединения
■ Время простоя
■ Собственную память (только для MTS)
■ Сложный предел
■ Профили должны создаваться для каждого типа или класса пользователя.
Каждый параметр имеет свой набор пределов ресурсов в пользовательском
профиле, назначаемом пользователям на основании их потребностей в
обработке.
■ Oracle устанавливает специальный профиль, назначаемый
пользователю, если не определены другие профили. Этот специальный профиль
называется DEFAULT, и все значения в нем установлены как
unlimited.
■ Любой параметр, не установленный явно в других пользовательских
профилях, по умолчанию задается равным значению, указанному для этого
параметра в DEFAULT.
■ В Огас1е8/ имеются также новые свойства управления паролем:
■ f ailed_login_attempt3 Число неудачных попыток регистрации,
прежде чем учетная запись будет блокирована. Значение по
умолчанию — три.
■ pa33word_life_time Число дней, в течение которых пароль
останется активным. Значение по умолчанию — 60.
■ password_reuse_time Число дней до того, как пароль можно
будет использовать повторно. Значение .по умолчанию — 1800
(приблизительно пять лет).
■ password_reuse_max Сколько раз пароль должен быть изменен,
прежде чем его можно будет использовать повторно. Значение по
умолчанию — неограниченно.
■ password_lock_time Число дней после, по истечении которых
Oracle разблокирует учетную запись, автоматически блокируемую
при превышении пользователем failed_login_attempts.
Значение по умолчанию — 1/1440 (одна минута).
■ pas3word_grace_time Число дней, в течение которых
пользователь должен изменить истекший пароль, иначе Oracle
постоянно блокирует учетную запись. Значение по умолчанию — 10.
■ password_verify_function Функция, используемая для
проверки сложности пароля. По умолчанию задается функция
verify_function ( ).
Ш Привилегии базы данных управляют доступом для выполнения
разрешенных операций в базе данных Oracle.
■ Существует две категории привилегий базы данных: системные
привилегии и объектные привилегии.
■ Системные привилегии позволяют создавать каждый объект базе данных
вместе со способностью выполнять много команд и устанавливать
соединение с базой данных.
■ Объектные привилегии позволяют обращаться к данным в объектах базы
данных.
■ Существует три основных класса системных привилегий для объектов
базы данных — create, alter и drop. Эти привилегии позволяют тем,
Управление пользователями базы данных
621
кому она предоставляются, создавать объекты базы данных в своей
собственной пользовательской схеме.
■ Существуют исключения из предыдущего правила. Привилегия alter
table — объектная привилегия, а привилегия alter rollback
segment — системная привилегия. Привилегия create index — также
объектная привилегия.
■ Три нестандартные привилегии — grant, audit и analyze. Они
применяются для создания всех объектов базы данных и выполнения важных
команд в Oracle.
■ Модификатор any предоставляет пользователю дополнительную
возможность создавать объекты или выполнять команды над объектами в
пользовательской схеме.
■ И последняя интересующая нас системная привилегия — привилегия
restricted session, которая позволяет пользователю устанавливать
соединение с базой данных в ограниченном режиме сеанса.
■ Объектные привилегии позволяют пользователям размещать, удалять,
изменять или просматривать данные в таблице или одном столбце таблицы,
а также изменять определение таблицы, создавать индекс для таблицы и
разрабатывать ограничения внешнего ключа.
Ш Если отменить системные привилегии, созданные пользователем объекты
останутся.
■ Системную привилегию можно назначить с помощью with admin
option, что позволяет получившему эту привилегию управлять
способностью других пользователей использовать эту привилегию.
■ Если отменить объектные привилегии, помещенные в таблицу или
измененные^ ней данные останутся, но вы больше не сможете выполнять
разрешенное привилегией действие.
■ Объектную привилегию можно назначить with grant option другому
пользователю и таким образом сделать его администратором привилегии.
Ш Нельзя использовать grant option, чтобы предоставить роли
привилегию.
■ Роли позволяют связывать привилегии вместе и включать или выключать
их автоматически.
■ Пользователь может создавать объекты, предоставить роли объектные
привилегии без права предоставления, а затем назначать роль стольким
пользователям, скольким необходимо.
■ Существуют роли, создаваемые Oracle при установке программного
обеспечения:
■ CONNECT Может устанавливать соединение с базой данных и
создавать кластеры, ссылки, последовательности, таблицы,
представления и синонимы. Эта роль подходит для владельцев
схемы таблиц и администраторов БД разработки.
■ RESOURCE Может устанавливать соединение с базой данных и
создавать кластеры, последовательности, таблицы, триггеры и
сохраняемые процедуры. Эта роль подходит для разработчиков
прикладных программ. Имеет неограниченное табличное
пространство.
■ DBA Может использовать любые системные привилегии,
использующие with admin option.
■ EXP_FULL_DATABASE Может экспортировать все объекты базы
данных в экспортный файл дампа.
622
Глава 15
■ IMP_FULL_DATABASE Может импортировать все объекты базы
данных из экспортного файла дампа в базу данных.
■ DELETE_CATALOG_ROLE Распространяет привилегии delete на
таблицы словаря, принадлежащие SYS, в ответ на новое ограничение
на привилегии delete any table, которые не позволяют
получившим эту привилегию удалять строки таблиц словаря,
принадлежащие SYS.
■ EXECUTE_CATALOG_ROLE Позволяет получившим эту
привилегию иметь привилегии execute в любом принадлежащем
SYS модуле, поставляемом с ПО Oracle.
■ SELECT_CATALOG_ROLE Позволяет получившим эту
привилегию выбрать (select) данные из любой принадлежащей SYS
таблицы словаря или представления.
■ Ролям можно назначать пароли в целях обеспечения безопасности для
использования некоторых привилегий.
■ Пользователи могут изменять свои собственные роли в сеансе базы
данных. Каждая роль требует 4 байта пространства в программной глобальной
области (PGA). Параметр инициализации MAX_ENABLED_ROLES
позволяет ограничить количество пространства, требуемое каждым
пользователем в PGA.
■ Когда привилегия назначается пользователю PUBLIC, ее могут
использовать все пользователи базы данных. Однако при отмене привилегии для
PUBLIC необходимо повторно компилировать каждую сохраняемую
процедуру, функцию или модуль в базе данных.
В Аудит базы данных проводится для выявления нежелательной
деятельности или сохранения архива работы базы данных.
■ При аудите может быть собран большой объем информации. Для
минимизации поиска необходимо ограничить аудит действий базы данных
предполагаемым источником проблемы.
Ш Можно проводить аудит любых видов деятельности в базе данных или по
имени привилегии, или по имени объекта в базе данных.
Ш Можно проводить аудит действий одного или более пользователей,
каждого доступа к объекту или привилегии, или каждого сеанса в базе данных.
Ш Аудит позволяет контролировать успешные действия, связанные с
привилегией, неудачные действия или и то, и другое.
Ш При каждом аудите базы данных запуск и останов экземпляра, а также
каждое подключение, установленное пользователем с привилегиями DBA,
предоставленными пользователями SYSDBA и SYSOPER,
контролируются независимо от любых других действий, для которых проводится аудит.
■ Контрольные данные хранятся в таблице AUD$ словаря данных, которая
принадлежит SYS.
В Существуют несколько представлений словаря для просмотра данных в
таблице AUD$. Основными являются:
■ DBA_AUDIT_EXISTS
■ DBA_AUDIT_OBJECT
■ DBA_AUDIT_SESSION
■ DBA_AUDIT_STATEMENT
■ DBA AUDIT TRAIL
Управление пользователями базы данных
623
■ Если проводится аудит и контроль соединений в сеансе и если таблица
AUD$ заполняется, никто из пользователей не сможет больше установить
соединение с базой данных, пока таблица AUD$ не будет (архивирована
и) освобождена.
■ При каждом использовании таблицы AUD$ должен проводиться ее аудит
в целях выявления любых вмешательств в ее данные.
Вопросы для самопроверки
1. Имя таблицы в Oracle, где хранятся контрольные данные: .
2. Имя определяемой Oracle роли, которая позволяет выполнять все
поставляемые с Oracle модули: .
3. Объект базы данных Oracle, облегчающий использование расширенного
свойства Oracle по управлению паролями: .
4. Использование этой объектной привилегии объекта позволяет определить
отношения внешнего ключа: .
5. Имя профиля, создаваемого для вас Oracle при первом создании базы
данных: .
Вопросы ко всей главе
1. Администратор БД рассматривает ограничение использования его
пользователями хоста через базу данных Oracle. Если администратор БД хочет
использовать для ограничения использования ресурса стоимость ресурсов,
что из следующего необходимо сделать в первую очередь?
A. Изменить значение RESOURCE_LIMIT на TRUE.
B. Изменить значение composite_limit в пользовательском профиле
наО.
C. Изменить значение composite_limit в профиле DEFAULT на 0.
D. Изменить значение стоимости ресурса для ограничиваемых ресурсов.
2. Владелец таблицы базы данных устраняет из базы данных Oracle
зависимости внешнего ключа до удаления таблиц. Какую опцию должен
использовать администратор БД для успешной отмены привилегии references?
A. with admin option
B. with grant option
C. cascade constraints
D. trailing nullcois
3. Администратор БД использует для базы данных Oracle аутентификацию
операционной системы. Он создает пользователя базы данных. Какая из
строк следующей команды выдаст ошибку?
A. create user OPS$ELLISON
B. identified externally
C. default tablespace USERS_01
D. default role CONNECT;
E. В этой команде нет ошибок
4. Администратор БД собирается проводить аудит базы данных Oracle, чтобы
выявить некоторую подозрительную деятельность базы данных. В каком из
следующих объектов базы данных хранится информация контрольного следа?
624
Глава 15
A. SYS.SOURCES
B. SYS.AUDS
C. DBA^SOURCE
D. DBA_AUDIT_TRAIL
5. Какая из следующих привилегий предоставляется создателю роли в
отношении только что созданной роли?
A» grant any privilege
В. create any role
С with admin option
D. with grant option
E. sysdba
6. К какому представлению в словаре данных Oracle должен обратиться
администратор БД для выяснения, сколько объектов базы данных создал
пользователь?
A. DBA_USERS
B. DBAJ3BJECTS
С DBA__TS_QUOTAS
D. DBA TAB PRIVS
7. Администратор БД решает, какие параметры использовать для профилей в
базе данных Oracle. В каком из следующих вариантов представлено
значение параметра CONNECT_TIME в профиле DEFAULT после создания
базы данных?
A. 1
B. 10
С 300
D. unlimited
E. Никакого значения, профиль DEFAULT еще не создан.
8. Пользователь не может изменять аспекты конфигурации своей учетной
записи, за исключением одного. Какой из следующих вариантов указывает
область учетной записи пользователя, которую пользователь может
изменять самостоятельно с помощью команды alter user?
A. identified by
B. default tablespace
C. temporary tablespace
D. quota on
E. profile
F. default role
9.. Администратор БД планирует реализовать контроль пределов
использования пользователями ресурсов хост-машины во время соединения с базой
данных Oracle. Какой из следующих вариантов точно описывает стоимость
ресурсов?
A. Денежная стоимость за использование ресурса базы данных
B. Денежная стоимость за использование привилегии
C. Целочисленное значение, предстаачяющее важность ресурса
D. Целочисленное значение, представляющее стоимость в долларах за
использования ресурса
Управление пользователями базы данных
625
10. Администратор БД получает от пользователя, пытающегося установить
соединение с Oracle, экстренный вызов, в котором говорится, что база
данных не позволяет ему соединяться и что контрольный журнал
заполнен. Какой из следующих вариантов точно описывает, что происходит в
базе данных Oracle?
A. База данных включена и работает.
B. Таблица AUD$ заполнена, и проводится аудит сеанса.
C. Ограниченный сеанс был заблокирован.
D. Используется аутентификация с помощью операционной системы.
11. Администратор БД должен отслеживать, когда запущена база данных,
из-за сообщения о проблемах с доступностью Oracle, возникших после
перезагрузки хост-машины. Где сохраняются контрольные записи при
аудите запуска экземпляра?
A. SYS.AUDS
B. DBA_AUDIT_TRAIL
C. ARCHIVE_DUMP_DEST
D. AUDIT_FILE_DEST
IS. При установлении стоимости ресурсов для определения пользовательских
профилей какому из следующих вариантов администратор БД назначит
высокую стоимость ресурса?
A. Менее дорогому ресурсу
B. Меньшему количеству ресурса, используемому в минуту
C. Более дорогому ресурсу
D. Большему количеству ресурса, используемому в минуту
Ответы на вопросы для самопроверки
1. SYS.AUDS
2. EXECUTE_CATALOG_ROLE
3. Профили
4. Ссылки
5. DEFAULT
Ответы на вопросы ко всей главе
1. А. Изменить значение RESOURCE_LIMIT на TRUE.
Объяснение Чтобы любое значение, заданное для стоимости ресурса
было эффективным и чтобы использовать любой пользовательский
профиль, следует задать параметр инициализации RESOURCE_LIMIT как
TRUE. См. обсуждение пользовательских профилей.
2. С. cascade constraints
Объяснение Если ограничение внешнего ключа определяется как результат
предоставления привилегии references, то для отмены этой привилегии
необходимо использовать опцию cascade constraints. Варианты А и В
неправильны, так как admin option и grant option относятся к предоставлению
системных и объектных привилегий соответственно, а в вопросе речь идет об
отмене объектной привилегии. Вариант D неправилен, так как trailing
nullcols относится к опции в управляющем файле SQL*Loader, который бу-
626
Глава 15
дет рассмотрен в следующей главе. См. обсуждение управления объектными
привилегиями.
3. D. default role CONNECT
Объяснение Хотя пользовательский профиль можно определить как часть
команды создания пользователя, это невозможно для отдельных опций,
указанных в пользовательском профиле. Поэтому такая команда выдаст ошибку в
строке D. Это вызвано тем, что пользователю еще не предоставлены
привилегии или роли. После создания пользователя и предоставления ему привилегий
или ролей можно ввести команду alter user default role. См. раздел о
создании пользователя.
4. В. SYS.AUDS
Объяснение AUD$ содержит все записи контрольного следа. Она
принадлежит пользователю SYS. Вариант А неправильный, потому что SOURCES
содержат исходный текст для всех сохраняемых процедур, функций и модулей.
Варианты С и D — представления словаря, обеспечивающие доступ к
основным таблицам словаря данных, названным в вариантах А и В. Хотя они
позволяют увидеть данные, в самих представлениях ничего не хранится, так как это
представления. См. обсуждение аудита.
5. D. with grant option
Объяснение Вариант D — правильный ответ, т.к. это правильная
административная конструкция, предлагаемая создателю роли в Oracle. Создатель роли
может делать с ролью все что хочет, включая ее удаление. Вариант С
неправилен, потому что with admin option относится к административной
конструкции для системных привилегий. Варианты А, В и Е неправильны, потому
что роли не предоставляется никаких привилегий на создание. См.
обсуждение ролей и with grant option.
6. В. DBA_OBJECTS
Объяснение В представлении DBAOBJECTS перечислены все
находящиеся в базе данных Oracle объекты, а также их владельцы. Вариант А
неправильный, так как DBA_USERS содержит фактическую информацию о создании
пользователя, например зашифрованный пароль, табличное пространство по
умолчанию и временное табличное пространство, пользовательский профиль
и роли по умолчанию. Вариант С неправильный, так как DBAJTSQUOTAS
идентифицирует все квоты табличного пространства, названные для
пользователя. Вариант D неправильный, так как DBA_TAB_PRIVS называет все
назначенные привилегии объекта таблицы и того, кому они предоставлены. См.
обсуждение контроля информации о существующих пользователях.
7. D. unlimited
Объяснение При установке Oracle все пределы ресурса в пользовательском
профиле DEFAULT устанавливаются как unlimited. Их можно изменить
впоследствии с помощью команды alter profile. См. обсуждение профиля
DEFAULT в обсуждении управления использованием ресурсов.
8. A. identified by
Объяснение Существует только одна опция создания пользователя,
которую созданный пользователь может модифицировать. Все другие
управляются или администратором по безопасности, или администратором БД. Хотя
пользователи могут изменять текущую роль из назначенных им в настоящее
время ролей с помощью команды set role, они не могут вводить команду
alter user, дающую тот же самый результат. См. обсуждение создания
пользователя.
9. С. Целочисленное значение, представляющее важность ресурса
Объяснение Стоимость ресурса является целым числом, которое для
администратора БД является мерой относительной важности ресурса. Его значение
Управление пользователями базы данных
627
совершенно произвольно и не имеет никакого отношения к деньгам. Поэтому
варианты А, В и D неправильны. См. обсуждение оценки стоимости ресурсов
в разделе о пользовательских профилях.
10. В. Таблица AUD$ заполнена, и проводится аудит сеанса.
Объяснение Если проводится аудит пользовательских соединений и
заполняется таблица AUD$, никто из пользователей не сможет установить
соединение, пока не будет очищена таблица AUD$. Вариант А неправильный, так как
база данных открыта для всеобщего использования, когда она запущена и
работает. Неправилен вариант С, потому что когда заблокирован ограниченный
сеанс, база данных открыта для общего доступа. Вариант D неправильный, так
как использование аутентификации с помощью операционной системы —
просто другой способ проверки пользовательских паролей. Она не
перекрывает пользователям доступ к базе данных. См. обсуждение управления
контрольным следом.
11. D. AUDIT_FILE_DEST
Объяснение Это трудный вопрос. Например, после запуска аудит размещает
собранную информацию в специальный файл, который помещается туда, где
фоновый процесс записывает трассировочный файл. Место, где фоновые
процессы размещают трассировочный файл, указывается при запуске экземпляра
с параметром инициализации AUDIT_FILE_DEST. Поскольку база данных
еще не запущена, таблица AUD$ не может находиться в том же месте, куда
записывается информация о запуске экземпляра, что исключает вариант А.
Поскольку DBA_AUDIT_TRAIL — представление для AUDS, вариант В также
неправильный. Вариант С — место, куда записываются архивные файлы. Это
уже ближе к ответу, но все же неправильно. См. обсуждение аудита
деятельности базы данных на уровне системы.
18. С. Более дорогой ресурс
Объяснение Чем выше значение, заданное для стоимости ресурса, тем более
ценен ресурс для базы данных, что увеличивает ее относительные "затраты"
Вариант А неправильный, так как все с точностью до наоборот. Варианты В и
D неправильны, потому что хотя администратор БД может отслеживать
использование ресурса на поминутной основе, это не добавляет никакого
значения и не указывает относительные затраты использования ресурса.
ЧАСТЫУ
Основы администрирования
базой данных Oracle9i I
Тренировочные экзамены
ГЛАВА 16
Основы администрирования
базой данных Oracle9i I
Основы администрирования базой данных Qracle9/1
631
а экзамен "Основы АБДI" выносятся общие положения и
методы, относящиеся к повседневному администрированию базы
данных Oracle. Чтобы сдать этот экзамен, необходимо
продемонстрировать знание свойств, предоставляемых Oracle для
управления объектами базы данных и всей базой данных. В
самых последних вариантах этого экзамена основное внимание
было сосредоточено на умении использовать автоматическое управление
отменой, Oracle-Managed Files (OMF) и другие новые свойства Огас1е9/. Кроме
того, необходимо проверить, что вы знаете, как использовать поддержку
национального языка (NLS) для управления языком.
Важное замечание Не приступайте к тренировочному экзамену, пока не
ознакомитесь с Приложением Л "Поддержка глобализации". Хотя это не
очень большая тема, несомненно, на экзамене "Основы ЛБДI" будет
несколько вопросов по поддержке глобализации.
Первый комплект экзаменационных вопросов
1. Включено автоматическое архивирование информации повтора, а все
файлы журнала базы данных находятся на одном и том же дисковом ресурсе.
Какие фоновые процессы могут конфликтовать друг с другом?
A. SMON и LGWR
B. ARCH и RECO
С PMON и DBWR
D. ARCH и LGWR
2. Вы добавляете журнал базы данных к базе данных Oracle. К какому из
следующих ресурсов Oracle добавляет информацию создание нового журнала
базы данных?
A. Разделяемый пул
B. Управляющий файл
C. SGA
D. PGA
3. Вам требуется найти, где в базе данных Oracle хранятся таблицы словаря
данных. В каком из следующих табличных пространств находятся таблицы,
содержащие информацию о базе данных Oracle, например имена таблиц,
пользователи и оперативные сегменты отмены?
A. SYSTEM
B. TEMP
C. UNDOTBS
D. INDEX
4. Вы выполняете шаги по созданию словаря данных Oracle. Частью какой из
следующих схем являются объекты в словаре данных Oracle?
A. SYSTEM
B. SYS
C. PUBLIC
D. SCOTT
5. В качестве администратора БД вы пытаетесь ограничить неправильное
использование пользователями возможностей Oracle для использования
ресурсов хост-машины. Какое из следующих свойств базы данных Oracle
подходит для этой задачи?
632
Глава 16
A. Сегменты отмены
B. Роли
C. Профили
D. Файлы параметров
6. Вы идентифицировали таблицу в базе данных, в которой ярко выражен
процесс формирования цепочки строк. В каком из следующих вариантов
приводится способ, который лучше всего решит эту проблему?
A. Увеличить pctused.
B. Увеличить pctf гее.
С Увеличить pctincrease.
D. Увеличить next.
7. Который из следующих вариантов лучше всего идентифицирует свойство
Oracle, позволяющее сохранять несколько оперативных копий
информации о повторе на нескольких дисках во избежание проблемы с отказом
носителей информации?
A. Мультиплексирование
B. Архивирование
С Повтор
D. Занесение в журнал
8. В вашей базе данных тысячи таблиц и пользователей. Какой из следующих
методов доступа лучше всего подходит при управлении сложными базами
данных со многими объектами и пользователями?
A. Предоставление привилегий непосредственно профилям
B. Предоставление привилегий непосредственно пользователям
C. Использование профилей
D. Предоставление привилегий непосредственно ролям
9. Вы пытаетесь увеличивать интервал контрольной точки в базе данных.
Каждый из следующих вариантов повлияет на продолжительность
и/или частоту контрольных точек, за исключением одного. Какой это
вариант?
A. Размер журнала базы данных
B. Число файлов данных
C. LOG_CHECKPOINTJNTERVAL
D. LOG_CHECKPOINTJTIMEOUT
10. В результате конфигурирования области базы данных Oracle РСУБД
Oracle тратит больше времени на управление использованием
пространства в блоках в системе OLTP с большим объемом транзакций. Который
из следующих вариантов указывает потенциальную причину такого
поведения?
A. Высокое значение pctf гее
B. Высокое значение pctused
C. Низкое значение pctf гее
D. Низкое значение pctused
Основы администрирования базой данных OracleO/1 633
11. Вы хотите, чтобы хост-машина не занималась чрезмерной обработкой
пользователя SPANKY в базе данных. Который из следующих вариантов
соответствует шагу, который вы должны выполнить, чтобы это стало
возможным в текущем экземпляре?
A. Ввести grant LIMITER to SPANKY, где LIMITER — профиль.
B. Ввести grant LIMITER to SPANKY, где LIMITER — роль.
С Ввести alter user SPANKY PROFILE LIMITER, где LIMITER —
профиль.
D.Ввести alter user SPANKY PROFILE LIMITER, где LIMITER—роль.
12. Ваше приложение регулярно вводит следующую команду:
SELECT * FROM BANK_ACCT
WHERE ACCT_BALANCE BETWEEN 1000 AND 100000;
Какой из следующих объектов базы данных не подходит для
использования с этой командой?
A. Материализованное представление
B. Индексы
С Таблицы с индексной организацией
D. Хеш-кластеры
13. Администратору БД требуется реорганизовать табличное пространство.
Какая из следующих привилегий будет использована для регистрации в
Oracle, пока база данных открыта, но недоступна другим
пользователям?
A. create session
B. restricted session
C. connect
D. mount
14. Вы пытаетесь изменить размер начального сегмента для таблицы в
управляемом словарем табличном пространстве. Какое из следующих ключевых
слов может использоваться как часть этого процесса?
A. drop table
B. alter table
С resize
D.coalesce
15. Вы находитесь в процессе создания пользователей в базе данных. Какая из
следующих фраз в команде create user предупреждает конфликт
дисковых сортировок пользователя с объектами словаря?
A. identified by
B. temporary tablespace
С default tablespace
D. default role
16. Какой из следующих типов файлов должен существовать в базе данных,
чтобы позволить удаленное администрирование пользователей и
табличного пространства в базе данных Oracle?
A. Файл пароля
B. Файл инициализации
С Файл данных
634
Глава 16
D. Управляющий файл
E. Никакой — для этих действий привилегии sysdba не требуются.
17. Все приведенные ниже варианты указывают компонент архитектуры
повтора Oracle, кроме одного. Какой из следующих вариантов не является
прямым компонентом механизма повтора Oracle, когда база данных
находится в режиме archivelog?
A.DBWO
B. Буфер журнала базы данных
C. LGWR
D. Оперативный файл журнала базы данных
Е.СКРТ
F. Архивные файлы журнала базы данных
18. Рассмотрите следующую команду:
CREATE TABLE SPANKY.EMPLOYEE
(empid NUMBER(101,
lastname VARCHAR2 (25),
firstname VARCHAR2 (251,
salary NUMBER(10,4),
CONSTRAINT pk_employee_01
PRIMARY KEY (empid))
TABLESPACE orgdbdata
EXTENT MANAGEMENT DICTIONARY
PCTFREE 20 PCTUSED 50
INITRANS 1 MAXTRANS 255
NOCACHE LOGGING
INITIAL 100K NEXT 150K
MINEXTENTS 4 MAXEXTENTS 300
PCTINCREASE 20 );
Что не так с этой командой?
A. Неправильно объявлен первичный ключ.
B. И индекс, и данные от таблицы должны храниться в одном и том же
табличном пространстве.
С Команду нельзя успешно выполнить, потому что для столбца EMPID
необходимо ограничение не-NULL.
D. Команда будет выполнена успешно, но данные не будут вставляться.
E. Неправильно определена фраза storage.
19. Пользователь ANN имеет привилегию insert для таблице ЕМР с опцией
grant. ANN предоставляет привилегию insert пользователю SIMON.
Каким будет немедленный эффект отмены администратором БД
привилегии ANN?
A. Записи ANN будут удалены из таблицы ЕМР.
B. У ANN останется возможность добавлять записи в ЕМР.
C. SIMON больше не сможет добавлять записи в таблицу ЕМР.
D. Администратор БД больше не сможет добавлять записи в ЕМР.
20. У вас есть таблица, и вы пытаетесь определять для нее соответствующие
значения pctf гее и pctused. Начальная вставка новых данных в
таблицу приведет к тому, что большинство его больших столбцов NULL
должно будет заполняться позже при последующих обновлениях. Записи
никогда не удаляются. Каково правильное сочетание значений pctf гее и
pctused?
A.pctused = 99, pctfгее = 1
В. pctused = 40, pctf гее = 30
Основы администрирования базой данных OracleOi I 635
С pctused = 40, pctfгее = 10
D. pctused = 80, pctfree = 10
21. Вы конфигурируете индекс, который будет сохранен в табличном
пространстве. Какой из следующих параметров памяти подхрдит для
индексов?
A. OPTIMAL
B. INITIAL
C. PCTINCREASE
D. NEXT
22. Вы должны управлять конфигурацией для новых и существующих
пользователей. Какая из следующих фраз имеется в команде alter user, но не в
команде create user?
A. identified by
B. temporary tablespace
С profile
D. default role
E. account lock
F. password expire
23. Приходя утром на работу, вы получаете сообщения от нескольких
пользователей, которые жалуются, что получили следующую ошибку, когда
пытались зарегистрироваться в Oracle с новым пользовательским ID и
паролем:
Error accessing PRODUCT_USER_PROFILE
Warning: Product user profile information not loaded!
Что нужно сделать для решения этой проблемы?
A. Запустить pupbld. sql как SYSTEM.
B. Произвести аварийное выключение.
С Удалить и восстановить пользователей.
D. Удалить и восстановить базу данных.
24. Во время обычной работы базы данных какой из фоновых процессов
возьмет меньшие блоки свободного пространства в управляемом словарем
табличном пространстве и переместит содержимое, чтобы создать фрагменты
свободного пространства большего размера?
A.DBWO
В. LGWR
С ARCH
D. SMON
E. PMON
25. Вы разрабатываете физическую компоновку базы данных на хост-машине.
Каковы отношения между табличными пространствами и файлами
данных в базе данных Oracle?
A. Одно табличное пространство имеет только один файл данных.
B. Много табличных пространств могут совместно использовать один
файл данных.
С Одно табличное пространство может иметь много файлов данных.
D. Один файл данных может содержать много табличных пространств.
636
Глава 16
26. Какой из следующих вариантов подходит для задания высокой стоимости
ресурса на время процессора и низкой — на общее время соединения
пользователя с Oracle?
A. Увеличить значение COMPOSITE_LIMIT.
B. Увеличить значение CPU_PER_SESSION и уменьшить значение
CONNECTJTIME.
C. Уменьшить значение CPU_PER_SESSION и увеличить значение
LOGICAL_READS_PER_SESSION.
D. Задать PRIVATE_SGA как UNLIMITED.
27. Вы пытаетесь перевести табличное пространство UNDOTBS01 в
автономное состояние, используя управляемые вручную сегменты отмены, и
получаете следующую ошибку: ORA-01546 — cannot take tablespace offline
(нельзя перевести табличное пространство в автономный режим). В чем
проблема?
A. Таблице назначено слишком много экстентов.
B. Недоступен файл init.ora.
C. Все еще продолжается незафиксированная транзакция.
D. Архивируется оперативный файл журнала базы данных.
28. Вы анализируете, как Oracle обрабатывает пользовательские команды. В
какой из следующих областей памяти базы данных хранится информация
анализа SQL и PL/SQL?
A. Библиотечный кэш
B. Кэш строки
C. Словарный кэш
D. Большая область
E. Буферный кэш
29. Информация в буферном кэше сохраняется на диске в каждой из
следующих ситуаций, за исключением одной. В какой из ситуаций это не
происходит?
A. Когда происходит блокировка по времени
B. Когда происходит переключение журналов
C. Когда сбрасывается на диск разделяемый пул
D. Когда возникает контрольная точка
30. Вы хотите установить управление паролем в базе данных Oracle. Какой из
следующих вариантов указывает, что надо сделать, чтобы увидеть пример
установки функции управления паролем?
A. Задать RESOURCEJJMIT как TRUE.
B. Запустить utlpwmg. sql.
С Удалить профиль DEFAULT.
D. Запустить catproc. sql.
31. Ознакомьтесь со следующей записью сеанса пользователя ATHENA:
SQL> create table obobobo (bobobo varchar2(3))
2 tablespace cman;
create table obobobo (bobobo varchar2(3))
*
ERKOR at line 1:
ORA-01536: space quota eKceeded for tablespace 'RMAN'
Где администратор БД должен искать информацию для решения этой
проблемы?
Основы администрирования базой данных Qracle9/1
637
A. В представлении словаря DBA_TS_QUOTAS
B. В представлении DBAJUSERS
С В представлении DBA_TAB_COLUMNS
D. В представлении DBA_TABLESPACES
32. Администратор БД вводит следующую команду:
CREATE USER DBADMIN
IDENTIFIED BY DBADMIN;
Какой профиль получит пользователь DBADMIN?
A. DEFAULT
B. Никакой
С CONNECT
D. DBA
33. В базе данных есть несколько профилей, каждый с различным набором
значений, заданных так, чтобы пользователи оставались в базе данных в
течение различных периодов времени. Где надо искать информацию о
профиле, назначаемом пользователю, соединение которого должно быть
очень коротким?
A. DBAJUSERS
B. DBA_PROFILES
С RESOURCE_COST
D. RESOURCEJLIMIT
34. Вы закончили создание новой базы данных и запустили сценарии
создания представления словаря данных. Какой из следующих вариантов
указывает, что надо сделать дальше для создания поставляемых Oracle
модулей?
A. catproc.sql
B. catalog.sql
C. utlpwdmg.sql
D. utllockt.sql
35. Вы стараетесь усилить безопасность базы данных. Какой из следующих
ресурсов Oracle поддерживает безопасность с помощью аутентификации
пароля в добавление к тому, что пользователю может быть предоставлен
доступ к приложению?
A. Профили
B. Таблицы
C. Сегменты отмены
D. Роли
36. Произошел сбой диска, на котором находятся единственные копии всех
четырех оперативных файлов журнала базы данных. Как бы вы изменили
базу данных Oracle, чтобы в дальнейшем она не очень пострадала?
, А. Изменить параметр CONTROL_FILES в файле init.ora.
B. Использовать alter database add LOGFILE GROUP 5;
C. Создать несколько членов для каждой из четырех групп и поместить
их на различных дисках.
D. Задать LOG_BLOCK_CHECKSUM в файле init.ora.
638
Глава 16
37. Первичный ключ таблицы был заблокирован. После его разблокирования
администратор БД выясняет, что пользователи ввели в таблицу
записи-двойники. Какой из следующих объектов базы данных может помочь
исправить ситуацию?
A. EXCEPTIONS
B. DBA_TABLES
C. USER_TAB_COLUMNS
D. AUD$
38. После создания нового пользователя для базы данных Oracle пользователь
жалуется, что не может зарегистрироваться из-за ошибки, связанной с
недостаточностью привилегий. Какое из следующих действий необходимо
выполнить?
A. Предоставить пользователю привилегии create table.
B. Переустановить пароль пользователя.
С Назначить пользователю роль CONNECT.
D. Разблокировать учетную запись пользователя.
39. Какой вариант реорганизации индексов подойдет для повышения
производительности обращения к таблицам, содержащим все слова в словаре,
начиная с буквы s, после инсталляции сервера Oracle?
A. Преобразовать индекс В-дерева в битовый индекс.
B. Преобразовать битовый индекс в индекс В-дерева.
C. Преобразовать индекс В-дерева в индекс обратного ключа.
D. Преобразовать индекс обратного ключа в индекс В-дерева.
40. Вы планируете хранить в таблице большие блоки текста. Столбец должен
быть достаточно большим, чтобы в нем умещалось приблизительно десять
предложений. Столбец должен также иметь фиксированную ширину.
Какой из следующих типов данных являются наиболее подходящим?
A.CLOB
В. LONG
CVARCHAR2
D. CHAR
41. Вы включили аудит в базе данных с помощью следующей команды:
AUDIT UPDATE, DELETE
i
ON spanky.cat_toys
BY ACCESS
WHENEVER NOT SUCCESSFUL;
Какой вариант лучше всего объясняет, как Oracle будет проводить аудит
данных?
A. Будут регистрироваться успешно выполненные SPANKY команды
insert для CAT_TOYS.
B. Будут регистрироваться безуспешные команды update и delete,
выполненные любым пользователем для CATJTOYS.
C. Будут регистрироваться безуспешные команды update и delete,
выполненные пользователем ACCESS для CATTOYS.
D.Будут регистрироваться безуспешные команды update и delete,
выполненные SPANKY для любой таблицы.
42. Первичный ключ таблицы ЕМР имеет три столбца: EMPID, LASTNAME и
FIRSTNAME. Вы вводите следующую команду select:
Основы администрирования базой данных OracleO/1 639
SELECT * FROM EMP
WHERE LASTNAME - 'HARRIS'
AND FIRSTNAME - 'BILLI'
AND EMPID - '5069493';
Какое представление словаря можно использовать для проверки порядка
ведущих столбцов в индексе, связанном с первичным ключом?
A. DBA_IND_COLUMNS
B. DBA_TAB_COLUMNS
C. DBAJNDEXES
D. DBA_CLU_COLUMNS
43. Вы вводите следующую команду:
DROP PROFILE LTD_PROGRAMMER;
Нескольким пользователям базы данных Oracle назначается профиль
LTD_PROGRAMMER. Что произойдет с этими пользователями?
A. Пользователи, у которых был профиль LTDPROGRAMMER, больше не
смогут регистрироваться в Oracle.
B. Пользователи, у которых был профиль LTD_PROGRAMMER, теперь
имеют профиль DEFAULT.
С Пользователи, у которых был профиль LTD_PROGRAMMER, теперь не
имеют никакого профиля.
D. Ничего. Вы не сможете удалить ранее назначенный пользователям
профиль.
44. Вы хотите уменьшить число экстентов, которое сегмент будет назначать
по мере роста таблицы. Каждый из следующих вариантов указывает
необходимое действие, за исключением одного. Какой это вариант?
A. Запуск EXPORT с параметром COMPRESS, заданным как Y
B. Увеличение значения pctused для таблицы
С Увеличение значения pctincrease для таблицы
D. Увеличение значения next для таблицы
45. Вы планируете размещение сегментов в табличных пространствах. Какой
из следующих типов сегментов обычно имеет самую низкую
оборачиваемость в базе данных Oracle?
A. Сегменты отмены
B. Сегменты таблиц
C. Временные сегменты
D. Сегменты SYSTEM
46. Вы вводите команду shutdown в 15:00 в пятницу. Спустя два часа база
данных все еще находится в процессе выключения. Какую из
следующих опций вы, скорее всего, использовали бы для выключения базы
данных?
A. shutdown abort
B. shutdown immediate
С shutdown transactional
D. shutdown normal
47. Пользователь выбирает данные из базы данных Oracle. Какой из
следующих процессов управляет получением данных из Oracle для этого
пользователя?
А. Пользовательский процесс сам получает информацию.
640
Глава 16
В. Процесс DBWO получает информацию для пользователя.
С Серверный процесс получает информацию для пользователя.
D. Прослушивающий процесс получает информацию для пользователя.
48. Результат select count(*) from DBA_TABLES, где TABLESPACE_NAME_
'MY_TBLSPC выдается следующим образом:
COUNT(*)
150
Затем вы вводите команду drop tablespace MY_TBLSPC. Что произойдет
после этого?
A. Команда drop tablespace будет успешно выполнена.
B. Команда drop tablespace завершится неудачно, потому что вы не
включили опцию cascade constraints.
С Команда drop tablespace завершится неудачно, потому что вы не
включили опцию including contents.
D. Нельзя удалить табличное пространство после его создания.
49. После запуска SQL*Plus в режиме командной строки вы вводите команду
shutdown immediate. Что, скорее всего, случится после этого?
A. База данных выключится.
B. База данных не выключится, потому что пользователи должны
отключиться.
С SQL'Plus возвратит сообщение об ошибке, говорящей, что сначала вы
должны установить соединение с Oracle.
D. Ничего не произойдет. SQL'Plus не является инструментом
командной строки.
50. Вам надо просмотреть значения параметров инициализации для базы
данных Oracle. Какой из следующих вариантов не идентифицирует метод,
используемый для получения значений параметров инициализации?
A. Ввести select * from DBA_PARAMETERS; из SQL*Plus.
B. Ввести select * from V$PARAMETER; из SQL*Phis.
C. Ввести show parameters из SQL*Plus.
D. Воспользоваться OEM Instance Manager.
51. Вы вводите следующую команду в Oracle:
CREATE UNIQUE BITMAP INDEX employee_lastname_indK_01
ON employee (lastname ASC)
TABLESPACE ORGDBIDX
PCTFREE 12
INITRANS 2 MAXTRANS 255
LOGGING
NOSORT
STORAGE ( INITIAL 900K
NEXT 1800K
MINEXTENTS 1
MAXEXTENTS 200
PCTINCBEASE 0 );
Что не так в этой команде для управляемых словарем табличных
пространств?
A. Нельзя использовать ключевое слово nosort при создании индекса.
B. Битовые индексы не могут быть уникальными.
С Следует опустить фразу tablespace.
D. Следует опустить ключевое слово asc.
Основы администрирования базой данных OracleQ/1 641
58. Вы управляете привилегиями доступа базы данных с помощью ролей, где
это возможно. Вы назначили роль SELECT_MY TABLE другой роли,
EMP_DEVELOPER. Какое из следующих представлений словаря
подходит для просмотра информации о других ролях, которые могут быть
назначены EMP_DEVELOPER?
A. DBA_ROLE_PRTVS
B. DBA_TAB_PRIVS
С USER_SYS_PRTVS
D. ROLE_ROLE_PRIVS
53. Ваш текущий сеанс отображает информацию о дате в следующем формате:
10-FEB-1999:10:15AM. Результатом какой из следующих команд он,
скорее всего, является?
A. alter session set NLS_DATE_FORMAT = 'DD-MON-YYYY:HH:MIAM';
B. alter session set NLS_DATE_FORMAT = 'DD-MON-YY:HH24:MI*;
С alter session set NLS_DATEJFORMAT = 'DD-MON-YY:HH:MIAM';
D. alter session set NLS_DATE_FORMAT = 'DD-MON-YYYY:HH24:MI';
54. Вы должны включить аудит для приложения, управляющего приемом
заказов и отправкой изделия, чтобы, когда столбец ORDER_STATUS в
таблице ORDERS изменится на SHIPPED, запись помещалась в
специальную таблицу, связанную с частью приложения,
предоставляющей коммерческим представителям ежедневный список клиентов,
которых надо обзвонить, чтобы убедиться, что клиент доволен заказом.
Какой из следующих вариантов позволяет провести такой аудит лучше
всего?
A. Аудит команд
B. Аудит объектов
С Аудит доступа
D. Аудит на основе значений
55. Вы занимаетесь предоставлением роли нескольких разрешений. Какая из
следующих привилегий не является системной привилегией?
A. analyze any
B. index
С create rollback segment
D. create synonym
56. При установлении размеров временных табличных пространств следует
попытаться везде, где можно, задать значение по умолчанию памяти
INITIAL для временного табличного пространства кратным какому из
следующих параметров инициализации?
A. LOG_BUFFER
B. DB_BLOCK_BUFFERS
С SORT_AREA_SIZE
D. SHARED_POOL_SIZE
57. Когда вы вводите в сеансе команду commit, что из следующего не
произойдет?
A. Разблокирование запрошенной строки или таблицы.
B. Немедленное сохранение кэшированных данных на диске.
642
Глава 1 б
С Разблокирование запрошенных сегментов отмены.
D. Генерация элемента повтора для зафиксированной транзакции.
58. Вы обрабатываете команду update. В какой момент обработки команды
SQL будут действительно изменяться данные в буферах блоков?
A. При открытии курсора
B. При анализе команды
C. При переносе данных из курсора
D. При выполнении команды
59. Вы определяете память для различных типов сегментов в базе данных
Oracle. Какой из следующих вариантов не является допустимым типом
сегмента в Oracle?
A. Сегмент данных
B. Сегмент отмены
C. Временный сегмент
D. Сегмент последовательности
60. Вы должны указать оставшееся свободное место в табличном
пространстве. Из какого из следующих представлений легче всего получить эту
информацию?
A. DBA_TABLESPACES
B. DBA_FREE_SPACE
С VSTABLESPACE
D. DBA_EXTENTS
Второй комплект экзаменационных вопросов
1. Если бы вы хотели найти имя и местоположение управляющих файлов, эту
информацию можно было бы найти в каждом из следующих
местоположений, за исключением одного. Какого?
A. V$CONTROLFILE_RECORD_SECTION
B. VSCONTROLFILE
C. VSPARAMETER
D. init.ora file
2. Вы планируете требования памяти для базы данных. Какой из следующих
вариантов является эффектом поддержания высокого pctfree для таблицы?
A. Oracle будет более активно управлять заполнением блоков данных
новыми записями.
B, Oracle будет менее активно управлять заполнением блоков данных
новыми записями.
С Oracle оставит больше сводного места в блоках данных для
существующих записей.
D. Oracle оставит меньше сводного места в блоках данных для
существующих записей.
3. Администратор БД создал таблицу с помощью следующей команды:
CREATE TABLE EMPL
(EMPID NUMBER(10),
LASTNAME VARCHAR2(40) ,
RESUME LONG RAW);
Администратор пытается ввести следующую команду:
Основы администрирования базой данных Огас1е9/1
643
ALTER TABLE EMPL
ADD ( PERF_APPRAISE LONG);
Что произойдет?
A. Команда будет успешно выполнена.
B. Команда будет успешно выполнена, но столбец будет добавлен как
VARCHAR2.
С Команда потерпит неудачу.
D. Команда добавит ограничение constraint.
4. Пользователь ANN имеет привилегию insert для таблицы ЕМР. Каков
самый быстрый эффект при отмене администратором БД привилегии
ANN?
А- Записи ANN будут удалены из базы данных.
B. ANN не сможет создавать таблицы.
C. ANN больше не сможет обратиться к базе данных.
D. Пользователи, которым ANN назначала привилегии insert, не
смогут выполнять insert.
5. Если бы вы захотели, чтобы каждый пользователь в Oracle мог иметь
только одно соединение с базой данных за один раз, какой из следующих
вариантов указывает способ сделать это?
A. Задать LICENSE_MAX_SESSIONS = 1 в init.ora.
B. Задать SESSIONS_PER_USER в профиле DEFAULT как 1.
C. Задать IDLE_TIME в профиле DEFAULT как 1.
D. Задать SESSIONS_PER_USER = 2 в init.ora.
6. В какой из следующих областей памяти базы данных хранятся записи из
информации словаря данных?
A. Библиотечный кэш
B. Кэш строки
C. UGA сеанса
D. Буферный кэш
7. Который из следующих вариантов правильно описывает различие между
загрузкой данных через обычный путь и прямой путь?
A. Один выполняется быстрее, чем другой.
B. Обычный путь загрузки данных обходит большинство РСУБД Oracle
RDBMS, а прямой путь загрузки данных является
быстродействующей версией insert в SQL.
C. Прямой путь загрузки данных обходит большинство РСУБД Oracle
RDBMS, а обычный путь загрузки данных является
быстродействующей версией insert в SQL.
D. Обычный путь выполняется, когда параметр командной строки
conventional задан как TRUE.
8. В каком из следующих представлений словаря можно найти информацию
о местоположении индексов в базе данных и размере этих индексов?
A. DBA_TS_QUOTAS
B. DBA_OBJECTS
C. DBA_SEGMENTS
D. DBA INDEXES
644
Глава 16
9. Вы хотите назначить долговременный процесс определенному сегменту
отмены, для этой цели переведенному в оперативный режим.
Автоматическое управление отмены не используется. Какую команду можно для этого
использовать?
A. alter database
В.set transaction
С. alter rollback segment
D.alter table
10. Что происходит, когда Oracle не может считать данные из группы
оперативных файлов журнала базы данных для архивирования в ситуации, где
не производится мультиплексирование журналов базы данных?
A. Ничего не происходит.
B. Обнаружив это, Oracle автоматически переключит журнал базы
данных.
C. Oracle, в конечном счете, не позволит добавлять новые записи к базе
данных.
D. Произойдет сбой экземпляра.
11. Все приведенные ниже действия, кроме одного, изменяют число
контрольных точек, возникающих в течение одного часа в базе данных. Какое это
действие?
A. Уменьшение размера табличного пространства
B. Уменьшение размера членов журнала базы данных
С Задание LOG_CHECKPOINT_INTERVAL больше размера файла
журнала базы данных
D. Задание LOC_CHECKPOINT_TIMEOUT равным нулю
12. Вы определяете области профиля в базе данных Oracle. Какая из
следующих областей профиля может использоваться для управления
использованием ресурса для остальных четырех?
A. LOGICAL_READS_PER_SESSION
B. CONNECTJTIME
С COMPOSITE_LIMIT
D. CPU_PER_SESSION
E. PRTVATE_SGA
13. Пользователь ANN имеет привилегию create any table с
возможностью администрирования для этой привилегии. Какая из следующих
команд показывает, как изъять у ANN административный компонент, не
ограничивая общую способность создавать таблицы?
A. revoke admin option from create any table;
B. revoke admin option from create any table; then grant
create any table to ANN;
С revoke create any table from ANN; then grant create any
table to ANN;
D. revoke create any table from ANN with admin optior then
grant create any table to ANN;
14. Администратор БД определяет заданную по умолчанию роль для
пользователей. Какой из следующих методов неприемлем для определения
заданной по умолчанию роли?
Основы администрирования базой данных Oracle9/1 645
A. alter user default role all;
B. alter user default role all except R0LE_1;
С alter user default role none;
D. alter user default role none except ROLE_l;
15. Вы вводите в SQL*Plus следующую команду: startup mount. Где Oracle
получает значения для запуска экземпляра?
A. Из файла init. ога
B. От значений по умолчанию Oracle
C. От параметров по умолчанию для табличного пространства
D. От параметров по умолчанию в файле журнала базы данных
16. Вы анализируете компоненты механизмов журнала базы данных в вашей
базе данных Oracle. Каким из приведенных ниже целей служит процесс
СКРТ?
A. Запись измененных буферов на диск
B. Запись текущего номера журнала базы данных в заголовке файла
данных
C. Запись информации журнала базы данных на диск
D. Считывание информации в память для пользователей
17. Вы разрабатываете архитектуру базы данных, которая будет
использоваться в создании окружения OLTP. Какой из следующих вариантов лучше
всего представляет необходимость мультиплексирования оперативного
файла журнала базы данных?
A. Чтобы воспользоваться преимуществом увеличения пространства для
хранения
B. Чтобы избежать снижения производительности журнала базы данных
С Чтобы уменьшить зависимость от буфера журнала базы данных
D. Чтобы избавить пользователей от ожидания, если нельзя архивировать
член журнала базы данных
18. Вы конфигурируете новые профили для базы данных. Какой из
следующих вариантов не является областью, для которой можно определить
предел профиля ресурса?
A. LOGICAL_READS_PER_SESS10N
B. CONNECT_TIME
C. LOGICAL_WRITES_PER_SESSION
D. IDLEJTIME
19. Вы пытаетесь очистить сархивированный файл журнала базы данных.
Какая из следующих команд позволяет вручную активизировать
переключение журналов?
A. alter database
B. alter system
C. alter user
D. alter redo log
20. Какая из следующих фраз доступна в команде alter user, но не команде
create user?
A. identified by
B. temporary tablespace
646
Глава 16
С profile
D. default role
21. Какой из следующих вариантов перечисляет опцию alter user, которую
может выполнить сам пользователь?
A. default tablespace
B. identified by
C. temporary tablespace
D. profile
22. Какая из следующих команд позволяет задать предел для совместного
использования ресурса пользователями?
A. alter profile default limit COMPOSITE_LIMIT 3500;
B. RESOURCE_COST=TRUE
С Set cpu_per_session 100 в профиле DEFAULT.
D. Set LICENSE_MAX_SESSIONS 1 in init.ora.
23. Какая из следующих команд лучшего всего подходит для назначения
пользователю другой роли?
A. alter user
В.alter database
С.alter system
D.grant
24. Какая из следующих операций не требует, чтобы Oracle хранила
информацию в сегменте отмены в рамках транзакции?
A. insert
B. select
С update
D. delete
25. Вы разрешили использование выделенных серверов в системе базы
данных Oracle. Где в базе данных Oracle хранится информации сеанса при
использовании выделенных серверов?
A.BPGA
B. В разделяемом пуле
C. В буферном кэше
D. В буфере журнала базы данных
E. В большой области
26. Какая из следующих фраз в команде create user ограничивает число
таблиц, которые пользователь может добавлять к табличному
пространству?
A. quota on
B. default tablespace
С profile
D. identified by
27. Использование пространства блока идентифицируется следующими
значениями: pctfree 25, pctused 30. Какой из следующих вариантов
лучше всего описывает управление блоками в этой базе данных?
Основы администрирования базой данных 0racle9/l
647
A. Осталось мало свободного пространства для модификации, и
пространство освобождается с помощью операций delete, активно
вводимых Oracle
B. Осталось мало свободного пространства для модификации, и
пространство освобождается с помощью операций delete, неактивно
вводимых Oracle
C. Осталось много свободного пространства для модификации, и
пространство освобождается с помощью операций delete, активно
вводимых Oracle
D. Осталось много свободного пространства для модификации, и
пространство освобождается с помощью операций delete, неактивно
вводимых Oracle
28. Вы определяете для пользовательского процесса путь доступа к
информации в базе данных Oracle. Какой из следующих целей служит процесс с
маркировкой D009?
A. Записывает измененные буферы на диск
B. Записывает текущий номер журнала базы данных в заголовки файлов
данных
C. Направляет обращение пользовательского процесса на разделяемый
сервер
D. Записывает элементы журнала базы данных на диск
29. Вы рассматриваете использование архитектуры MTS в базе данных Oracle.
Где в базе данных Oracle хранится информация сеанса при использовании
разделяемых серверов?
A.BPGA
B. В разделяемом пуле
C. В буферном кэше
D. В буфере журнала базы данных
E. В большой области
30. Администратор БД выполняет следующую команду:
CREATE OR REPLACE VIEW MYVW AS
SELECT EMPID, LASTNAME, FIRSTNAME,
TO_CHAR (SALARY) AS SALARY FROM EMP;
Если столбец SALARY в таблице ЕМР имеет тип данных NUMBER (10),
какой тип данных будет у столбца SALARY в MYVW, когда администратор
БД обратится к словарю данных?
A.ROWID
В. NUMBER
С DATE
D. VARCHAR2
31. Вы определили национальный язык на базе данных Oracle как
английский, а текстовые данные в некоторых таблицах содержат немецкие
символы. Какой из следующих параметров надо установить, чтобы
перечислить эти текстовые данные по алфавиту в порядке возрастания согласно
немецкому синтаксису, но чтобы язык базы данных был определен как
английский?
A. NLS_DATE_FORMAT
В. NLS_RULE
648
Глава 16
С NLS_TERRlTORY
D. NLS_SORT
32. Каким из следующих факторов можно пренебречь при выборе набора
символов и национального набора символов?
A. Ваш набор символов должен или быть US7ASCII или расширением
этого набора.
B. Ваш национальный набор символов и набор символов должны быть
по возможности близко связаны.
С Вы можете использовать наборы многобайтовых символов
с изменяющейся длиной в качестве обоих наборов символов в базе
данных.
О. Для ввода команд SQL и PL/SQL Oracle поддерживает в качестве
набора символов только языки, близкие английскому.
33. Вы работаете администратором БД в Организации Объединенных Наций.
Вы поддерживаете базы данных во многих странах на многих языках.
Какое из представлений базы данных можно использовать для определения
соглашений по дате для базы данных в конкретной стране?
A. V$NLS_PARAMETERS
B. NLS_DATE_FORMAT
С DBA_DATES
D. V$NLS_VALID_VALUES
34. Вы выполняете в базе данных Oracle в Америке финансовый анализ
Проекта для правительства Египта. Какие из следующих параметров
инициализации нужны, чтобы сгенерировать отчеты, в которых представлены
денежные суммы в египетских фунтах, а не в долларах?
A. NLS_SORT
B. NLS_CURRENCY
C. NLS_LANG
D. NLS_DATE_FORMAT
35. Вы пытаетесь найти файл ALERT на хост-машине базы данных, которой
вы никогда раньше не управляли. Какой из следующих параметров
инициализации используется для идентификации местоположения ALERT
файла?
A. BACKGROUND_DUMP_DEST
B. USER_DUMP_DEST
С LOG_ARCHIVE_DEST
D. CORE_DUMP_DEST
36. Вы вводите команду alter tablespace read only для базы данных
Oracle. Какой из следующих вариантов лучше всего описывает, что
случится после этого?
A. Oracle немедленно переводит табличное пространство в режим только
для чтения.
B. Oracle переводит табличное пространство в режим только для чтения
после выхода из системы последних пользователей.
Основы администрирования базой данных Огас1е9/1
649
C. Oracle помещает табличное пространство в режим только для чтения
после фиксации последней предшествующей транзакции для этого
табличного пространства, предотвращая последующий DML, пока не
произойдет изменение.
D. Oracle возвращает ошибку.
37. Вы используете локально управляемое табличное пространство в Oracle.
Какой из следующих вариантов лучше всего описывает способ реализации
Oracle этого свойства в базе данных?
A. Использование битовой карты в сегменте заголовка пространства
B. Использование словаря данных для локальной базы данных
C. Использование неструктурированных файлов в локальном каталоге,
хранящем файл данных
D. Использование словаря данных в распределенной базе данных
38. Вы конфигурируете свойство "большой пул" в Oracle. Какой из
следующих вариантов лучше всего описывает информацию, сохраняемую в
большом пуле, если он определен для вашей базы данных?
А- Деревья анализа для SQL-команд
B. Память сеанса для конфигурации MTS
C. Память сеанса для конфигурации выделенного сервера
D. Переполнение буфера блока
39. Вы должны удалить столбец из базы данных. Какой из следующих
вариантов лучше всего указывает, как это сделать, если надо быстро выполнить
задачу без обязательного освобождения пространства в табличном
пространстве?
A. alter table drop column
B. alter table set unused column
С alter table modify column
D. truncate table
40. При генерации глобальных временных таблиц в каких из следующих мест
в базе данных Oracle хранятся фактические данные, используемые вашей
временной таблицей?
A.PGA
B. Буферный кэш
C. Табличное пространство SYSTEM
D. Табличное пространство RBS
41. Вы используете SQL*Loader для быстрой вставки данных в базу данных.
Какое из следующих свойств позволяет определить строку данных в
файле данных, если она начиналась не с начала строки, а в другом месте?
A. fields separated by
B. fields terminated by
C. trailing nullcols
D. recseparator
42. Вы восстанавливаете индексы в Oracle. Какое из следующих действий
нельзя объединить с восстановлением вашего индекса в базе данных Oracle и
необходимо выполнять как отдельную операцию?
A. Оценить статистику.
B. Вычислить статистику.
650
Глава 16
C. Переместить индекс в другое табличное пространство.
D. Оперативно восстановить.
43. Вы хотите поддерживать несколько местоположений журналов архивов в
Oracle. Какой из следующих параметров позволяет указать, сколько
процессов ARCH в Oracle должно быть выполнено для управления хранением
файлов журналов архива в нескольких местах?
A. LOG_ARCHIVE_PROCESSES
B. LOG_ARCHIVE_MAX_PROCESSES
С LOG_ARCHIVE_MIN_SUCCEED_DEST
D. LOG ARCHIVE_START
44. Вы установили Oracle и использовали Database Configuration Assistant для
создания базы данных в среде Windows. Где находятся файлы данных для
базы данных, которую вы только что создали?
A. %ORACLE_BASE %\admin
B. %ORACLE_BASE %\rdbms\admin
C. %ORACLE_BASE %\database
D. %ORACLE_BASE %\oradata
45. Вы вводите следующую команду в базе данных Oracle, где DB_BLOCK_
SIZE равен 4 Кбайт:
CREATE TABLESPACE orgdbindex
DATAFILE Voracle/disk_8/index01.dbf
5IZE 300M
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 100K
ONLINE;
Сколько блоков будет представлять каждый бит в битовой области
локально управляемых файлов данных?
А. 23 В. 30
С. 80 D. 250
46. Вы назначили три таблицы для пула сохранения. Как определить его
правильный размер?
A. На основании размера вашего разделяемого пула
B. Только на основании числа блоков в таблице
C. На основании числа блоков в таблице плюс числа блоков в связанных
индексах
D. Только на основании числа блоков в связанных индексах
E. Ни одним из вышеупомянутых способов
47. Администратор БД в Германии должен гарантировать, что в самом
последнем приложении преобразования валюты будут поддерживаться и
немецкая марка, и евро. Какой из следующих параметров NLS лучше всего
подойдет для этой цели?
A. NLSJTERRITORY
B. NLS_LANG
C. NLS_COMP
D. NLS_DUAL_CURRENCY
48. Пользователь пытается вставлять данные в столбец, который нарушает не-
откладываемое ограничение. Пользователь ввел команду alter session
set constraints = deferred. Что произойдет с insert?
Основы администрирования базой данных Oracle9/1 651
A.insert успешно завершится во время ввода, но впоследствии
произойдет откат транзакции.
B. insert закончится неудачно во время ввода, и транзакция
закончится.
C. insert успешно завершится во время ввода, и впоследствии не будет
отката транзакции
D. insert закончится неудачно во время ввода, но транзакция будет
продолжаться.
49. Значение, сохраняемое в индексе для столбца, — '596849'. Затем
администратор БД вводит команду alter index reverse. Как теперь выглядят
данные в индексе?
A. '596849'
B. '849596'
C. '948695'
D. '695948'
50. Какой из следующих вариантов лучше всего позволяет уменьшить
требования к размеру таблиц, к которым требуется обращаться только через
первичный ключ?
A. Создать больше индексов для таблицы.
B. Создать таблицу с индексной организацией для хранения данных.
С Удалить первичный ключ.
D. Увеличить значение pctf гее для блоков таблицы.
51. При управлении паролями в базе данных Oracle выясняется, что по
истечении текущего пароля пользователи просто повторно используют
старые пароли. Какой из следующих вариантов указывает связанный с
профилем метод предотвращения повторного использования паролей в
течение трех лет?
A. Задать password_reuse_time равным 3.
B. Задать password_rcuse_time равным 39.
С Задать password_reuse_time равным 339.
D. Задать password_reuse_time равным 1095.
E. Задать password_reuse_time равным 3195.
52. Вы вводите следующую команду в Oracle:
grant create table to STARSKY with admin option;
После чего пользователь STARSKY вводит в Oracle следующую команду:
grant create table to HUTCH;
Вы обнаруживаете действия STARSKY и поступаете следующим
образом:
revoke create table from STARSKY;
Какой из следующих вариантов правильно описывает результат?
A. HUTCH больше не может создавать таблицы, а вы сможете.
B. STARSKY больше не сможет создавать таблицы, a HUTCH сможет.
C. Вы и STARSKY больше не сможете создавать таблицы, a HUTCH
сможет.
D. Вы и HUTCH больше не сможете создавать таблицы, a STARSKY
сможет.
652
Глава 16
53. Вы назначаете пользователю защищенную паролем роль nondefault, которая
разрешает ему действовать в качестве привилегированного пользователя
приложения при добавлении записей к некоторым таблицам. Какой из
следующих вариантов лучше указывает способ, которым получивший эту
привилегию мог бы воспользоваться для реализации назначенных ему с этой
ролью привилегий?
A. Пользователь вводит соответствующие команды DML.
B. Пользователь вводит команду alter user, а затем команды DML.
C. Пользователь вводит команду set role, а затем команды DML.
D. Пользователю необходимо вмешательство администратора БД для
реализации эти привилегий.
54. Вы собираетесь изменить размер табличного пространства на диске.
Какой из следующих вариантов указывает ограничение на выполнение этих
операций, если предполагаемый размер табличного пространства больше
его текущего размера?
A. Наличие объектов в файлах данных, чей размер изменяется.
B. Доступность пространства на диске, на который добавляются файлы
данных.
С Использование AUTOEXTEND с файлами данных для этого
табличного пространства.
D. Наличие места в памяти для временного хранения блоков в
табличном пространстве.
55. Разработчики жалуются, что через нескольких минут после обращения к базе
данных их сеанс разрывается. Какой из следующих вариантов не указывает
потенциальную причину разьединения?
A. В профиле DEVELOPER для COMPOSITE_LIMIT задано 230000.
B. Администратор БД неоднократно вводит команду alter system
kill session.
С В профиле DEFAULT для CPU_PER_SESSION задано 100.
D. В профиле USERS для CONNECTJTIME задано 500.
56. Вы назначаете роли пользователям базы данных Oracle. Какая из
следующих ролей не определяется заранее при создании базы данных Oracle?
A. CREATE_CATALOG_ROLE
B. SELECT_CATALOG_ROLE
С EXP_FULL_DATABASE
D. IMP_FULL_DATABASE
57. Вы управляете окружением базы данных, работающей круглосуточно без
выходных (24x7), и должны оперативно восстановить индекс. Какой из
следующих вариантов указывает фактор, который необходимо учесть при
определении времени для проведения оперативного восстановления?
A. Доступность в течение времени простоя
B. Производительность
C. Простой системы
D. Пакетная обработка данных
58. Вас беспокоит формирование цепочки строки, снижающее
производительность окружения базы данных Oracle. Какой из следующих ресурсов
Oracle нельзя использовать при определении для таблицы числа строк,
образующих цепочку?
A. Команда analyze
B. Модуль DBMS_DDL
Основы администрирования базой данных Oracle9/1
653
С Модуль DBMS_UTILITY
D. Команда alter tablespace coalesce
59. Вы пытаетесь ввести команду alter tablespace move datafile в базе
данных Oracle. Какой из следующих вариантов указывает шаг, который
необходимо выполнить после ввода этой команды?
A. Физически переместить файл данных в новое место.
B. Перевести табличное пространство в автономный режим.
C. Перевести табличное пространство в оперативный режим.
D. Выполнить операцию ИМПОРТ для загрузки новых метаданных.
60. Вы создаете пользователя базы данных Oracle с помощью команды:
create user GIANT identified by GREEN;
Затем вы вводите следующий запрос:
SQL select password from dba_users where username = 'GIANT';
PASSWORD
C5527BB9391BBF29
Затем вы вводите следующую команду:
alter user GIANT identified by "C55278B9391BBF29";
Какой из следующих вариантов лучше всего описывает значение,
установленное теперь для пароля GIANT?
A. GREEN
B. C55278B93918BF29
С Этот вопрос не соответствует ситуации, так как GIANT не может
установить соединение без привилегий create session.
D. Этот вопрос не соответствует ситуации, так как учетная запись
GIANT была заблокирована по умолчанию.
Третий комплект экзаменационных вопросов
1. Вы конфигурируете использование серверов в базе данных Oracle. Какая из
следующих команд описывает, что случится, после того как
прослушивающий процесс обнаружит пользователя, пытающегося установить
соединение с Oracle при использовании выделенного сервера?
A. Прослушивающий процесс породит новый серверный процесс.
B. Прослушивающий процесс передаст запрос диспетчеру.
C. Прослушивающий процесс передаст запрос LCWR.
D. Прослушивающий процесс передаст запрос DBWO.
2. Пользователь вводит команду select для базы данных Oracle. Какой из
следующих вариантов описывает шаг, выполняемый Oracle в поддержку
этой команды?
A. Затребовать блокировку на таблицы, к которым обращаются.
B. Сгенерировать повтор для команды.
C. Перенести данные с диска в память.
D. Записать изменения на диск.
3. Пользователь вводит команду insert для базы данных Oracle. Какой из
следующих вариантов описывает шаг, выполняемый Oracle в поддержку
этой команды?
654
Глава 16
A. Произвести изменения в блоке данных в памяти.
B. Проанализировать команду, если в разделяемом пуле уже существует
дерево анализа.
С Записать измененные записи в сегмент отмены.
D, Записать повтор транзакции в файл данных.
4. Вы реализуете Oracle в своей организации. В каком из следующих
вариантов указано свойство Оптимальной гибкой архитектуры (OFA)?
A. OFA собирает программное обеспечение, базу данных и
административные файлы в одну область, что облегчает
администратору БД их поиск.
B. Использование OFA позволяет администраторам БД определить свои
собственные компоновки файловой системы с помощью соглашений
об именовании, что облегчает управление базой данных Oracle.
C. Использование OFA облегчает поддержку, стандартизируя
компоновку файловой системы для всех инсталляций Oracle.
D. OFA собирает все объекты базы данных, например таблицы и
индексы в одно табличное пространство, что облегчает
администратору БД управление ими.
5. Вы создаете файл пароля в Oracle. Какой из следующих вариантов
указывает, как определить эту команду, если вы хотите, чтобы ваш файл паролей
orapwdORCL.pwd в каталоге /uOl/app/oracle/database позволял
устанавливать соединение и управлять базой данных, максимум, 100 другим
администраторам БД?
A. orapwd directory=/u01/app/oracle/database
file5orapwdORCL.pwd
B. orapwd file=/u01/app/oracle/database/orapwdORCL.pwd
password=oracle entries=100
С orapwd file=/u01/app/oracle/database/orapwdORCL.pwd
entries=100
D. orapwd file=orapwdORCL.pwd password=oracle
entries=100
6. Вы управляете базой данных Oracle. Какой из следующих вариантов
правильно указывает, когда Oracle прочитает содержимое файла init. о га?
A. При запуске экземпляра
B. При установке базы данных
C. При открытии базы данных
D. При закрытии базы данных
7. Вы вводите в Oracle следующую команду: create tablespace BOBTBS
datafile "boboi.dbf" size 2M;. Последующие обращения к базе
данных показывают, что табличное пространство расположено в каталоге
/uOl/oradata/oracle. Какой из следующих вариантов указывает, как Oracle
определяет, куда поместить bobOl.dbf?
A. DB_CREATE_FILE_DEST
B. DB_CREATE_ONLINE_LOC_l
C. DB_CREATE_ONLINE_LOG_2
D. В Oracle каталог — значение по умолчанию, задаваемое
операционной системой, которое нельзя задать или изменить
вручную.
8. Вы сконфигурировали OMF в системе базы данных Oracle. После
тщательного анализа вы решаете, что следует удалить табличное пространство из
Основы администрирования базой данных Qracle9/1
655
базы данных. Какой из следующих вариантов указывает, как OMF может
помочь вам выполнить эту задачу?
A. OMF автоматически обновит словарь данных, чтобы удалить
ссылки на файлы данных табличного пространства.
B. OMF автоматически удалит базовый файл из хост-окружения.
С OMF даст Oracle инструкцию автоматически прекращать
использовать файлы данных, связанные с этим табличным
пространством.
D. Ни в одном из вышеупомянутых вариантов не указаны
предоставляемые OMF функциональные возможности.
9. Выберите соответствующий вариант для завершения следующего
высказывания: Если вы хотите использовать OMF для указания местоположения
оперативных файлов журнала базы данных, необходимо указать
посредством определения параметров файла init.ora, относящихся к OMF, как
минимум, пунктов назначения, которые Oracle будет
использовать.
A. Один
B. Два
C. Три
D. Четыре
10. Вы управляете экземпляром базы данных Oracle. Какой из следующих
вариантов идентифицирует команду, дающую Oracle инструкцию временно
прекратить работу базы данных?
A. startup nomount
B. alter database open read only
C. alter system suspend
D. alter system resume
11. Вы должны выключить базу данных Oracle сразу после уведомления.
Какой из следующих вариантов указывает команду, которую вы
использовали бы, если были бы готовы позволить Oracle выполнять восстановление
экземпляра при следующем открытии базы данных?
A. shutdown abort
B. shutdown transactional
С shutdown normal
D. shutdown immediate
12. Следующий отрывок из трассировочного файла взят из базы данных Oracle:
Tue Jul 18 17:04:33 2000
alter database dismount
Completed: alter database dismount
archiving is disabled
Dump file c:\Oracle\admin\orcl\bdump\orclALRT.LOG
Tue Jul 18 17:05:00 2000
ORACLE V9.0.1.0.0 Production vsnsta=0
vsnsql=d vsnxtr=3
Windows NT V4.10, OS V192.0, CPU type 586
Starting up ORACLE RDBMS Version: 9.0.1.0.0.
System parameters with non-default values:
processes = 59
shared_pool_size 15728640
java_pool_size 20971520
disk_asynch_io FALSE
control_files c:\Oracle\ORADATA\orcl\control01.ctl,
c:\Oracle\ORADATA\orcl\control02.ctl
656
Глава 16
db_block_buffers 200
db_block_size 2048
compatible = 9.0.1.0.0
log_buffer = 8192
log_checkpoint_interval -. 10000
log_checkpoint_timeou 0
В каком из следующих вариантов указано наиболее вероятное имя для
этого трассировочного файла?
A. orclDBWO.trc
B. orclLGWR.trc
C. оrclALRT.trс
D. orcll3095.trc
13. Вы готовитесь создать базу данных Oracle. Какой из следующих
параметров в файле init.ora следует изменить, чтобы создать новую базу
данных, которая не будет конфликтовать с другими существующими на
хост-машине базами данных Oracle, если вы скопируете файл init.ora
из одной из тех баз данных для использования в этой базе данных?
A. CONTROL_FILES
B. DB BLOCK SIZE
C. DB_DOMAIN
D. SHARED_POOL_SIZE
14. Вы используете Database Configuration Assistant для конфигурации своей
базы данных Oracle. Какой из следующих терминов относится к созданию
объекта, на котором может основываться создание другой базы данных?
A. Клон
B. Копия
C. Шаблон
D. Терминал
15. Вы только что создали базу данных Oracle с помощью команды create
database. Которому из следующих табличных пространств будет
принадлежать любой файл данных, указанный как часть фразы dataf ile для
команды create database?
A. DATA
B. INDEX
C. UNDOTBS
D. SYSTEM
16. Вы собираетесь создать словарь данных Oracle для использования с базой
данных. Какой из следующих пользователей вы подключили бы к базе
данных для этой цели в Огас1е9/ и более поздних версиях?
A. SYSTEM
B. OUTLN
C. INTERNAL
D. SYS
17. Вы идентифицируете объекты словаря в базе данных Oracle. Какой
вариант из следующих является представлением в словаре данных?
A. VSDATABASE
B. DBA TABLES
Основы администрирования базой данных Qracle9i I
657
C. SYS.AUD$
D. ЕМР
18. Используйте данный блок кода для ответа на следующий вопрос:
TEXT
declare
х varchar2 (10) ;
begin
x := 'hello world';
dbms_output.put_line (x);
end;
Каким из следующих представлений могут быть эти данные?
A. DBA_ERRORS
B. DBA_SOUR.CE
C. DBAJVIEWS
D. DBA_TRIGGERS
19. Используйте этот блок кода для ответа на следующий вопрос:
SQL select text from DBA_views where view__name =
2 ' DBA_TABLES '
TEXT
select u.name,o.name,
decode(bitand(t.property, 4194400), 0, ts.name, null),
Какой из следующих вариантов идентифицирует команду
форматирования, которая может быть использована для показа остальной части вывода?
A. set long 9999
B. column text format a9999
C. set long 50
D. column text format a50
20. Ваши попытки запустить базу данных Oracle потерпели неудачу.
Посмотрев в соответствующем местоположении, вы устанавливаете значение для
параметра CONTROL_FILES как /u01/oradata/orcl/control01.ctl. Какой из
следующих вариантов указывает вероятный следующий шаг,
необходимый для выявления проблемы?
A. Проверить фактическое местоположение каталога вашего
управляющего файла.
B. Проверить аппаратные средства на предмет дефекта карты памяти.
C. Проверить фактическое местоположение каталога вашего файла
данных SYSTEM.
D. Проверить, создали ли вы два журнала базы данных.
21. Ознакомьтесь со следующим отрывком из файла init.ora:
DB_CREATE_ONLINE_L0G_DEST_l =/u01/oradata/dbl
DB_CREATE_ONLINE_L0G_DEST_2 =/u02/oradata/dbl
DB_CREATE_ONLINE_LOG_DEST_3-/u03/oradata/dbl
DB_CREATE_FILE_DEST =/u04/oradata/dbl
В каком из следующих вариантов не указано местоположение, где Oracle
разместит ваш управляющий файл при создании базы данных?
A. /uOl/oradata/dbl
B. /u02/oradata/dbl
С /u03/oradata/dbl
D. /u04/oradata/dbl
658
Глава 16
22. Вы используете OMF в сочетании с управлением управляющего файла
базы данных Oracle. Какой из следующих вариантов указывает аспект
управления управляющим файлом, который Oracle обрабатывает
независимо от использования OMF?
A. Размещение управляющего файла в соответствующем каталоге
B. Мультиплексирование управляющих файлов множественным
адресатам
C. Изменение содержимого управляющего файла при добавлении нового
табличного пространства
D. Автоматическое назначение значения параметру CONTROL_FILES
23. Вы реализуете мультиплексирование управляющего файла. Какой из
следующих вариантов указывает метод, используемый для создания копии
управляющего файла, который будет поддерживаться Oracle?
А.Ввести alter database backup controlfile to filename.
B. Сделать копию управляющего файла при закрытой базе данных.
C. Ввести alter database backup controlfile to trace.
D. Сделать копию управляющего файла при работающей базе данных.
24. Вы анализируете структуру журнала базы данных в базе данных Oracle.
Какой из следующих вариантов идентифицирует имя фонового процесса,
который записывает изменения из оперативных файлов журнала базы
данных в архивные копии при поддержке базы данных, работающей в режиме
ARCHIVELOG?
A.LGWR
В. СКРТ
CDBW0
D. ARCO
25. Вы реализовали OMF для управления журналами базы данных. Какой из
следующих вариантов отражает регистрационное имя файла, если
включено OMF?
A. logOl.log
B. logORCL01.log
C. l_2.log
D. ora_l_asdfl234.log
26. Вы вводите следующую команду на базе данных Oracle:
create tablespace tbs_terap
datafile Vu05/oradata/oracle/tbs_temp01.dbf size 600M
extent management dictionary online;
Какой из следующих вариантов правильно описывает только что
созданное вами табличное пространство?
A. Вы создавали локально управляемое временное табличное
пространство.
B. Вы создавали управляемое словарем временное табличное
пространство.
C. Вы создавали локально управляемое постоянное табличное
пространство.
D. Вы создавали управляемое словарем постоянное табличное
пространство.
Основы администрирования базой данных Огас1е9/1
659
27. Вы создаете табличное пространство в Oracle. Какое из следующих
ключевых слов или фраз разрешает файлам данных табличного пространства
расти автоматически при размещении растущих данных?
A. default storage
B. extent management
С autoextend
D. datafile
28. Вы хотите конфигурировать распределение места во временных
табличных пространствах. Какой из следующих вариантов идентифицирует
свойство Oracle, при реализации которого принудительно вводится
назначение сегментов табличного пространства одинакового размера
независимо от назначения памяти, определенного для помещенных в табличное
пространство объектов?
A. default storage
B. storage
С uniform extent management
D. autoextend
29. Вы собираетесь удалять табличное пространство. Какую из следующих
команд можно использовать для удаления табличных пространств,
которые содержат родительские таблицы в отношениях внешнего ключа?
A. alter database datafile offline drop
B. alter tablespace offline immediate
С drop tablespace cascade constraints
D. drop tablespace including contents
30. Вы изменяете заданные по умолчанию параметры памяти табличного
пространства в базе данных Oracle, чтобы увеличить размер начальных
экстентов. Какой из следующих вариантов показывает, когда изменение
вступит в силу для уже существующих в этом табличном пространстве
таблиц?
A. Изменение вступает в силу немедленно.
B. Изменение вступает в силу после добавления данных к таблице.
C. Изменение вступает в силу после удаления данных из таблицы.
D. Изменение не вступит в силу для существующих таблиц.
31. Вы реализуете OMF в базе данных Oracle. После включения OMF Oracle
управляет созданием и удалением файлов данных из хост-системы для
какого из следующих табличных пространств?
A. Только табличное пространство SYSTEM
B. Только табличное пространство UNDO
C. Только табличное пространство TEMP
D. Лее табличные пространства в базе данных
32. Ознакомьтесь со следующим блоком кода:
create database mydb
controlfile reuse
character set 0S7ASCII
national character set 0S7ASCII
datafile VuOl/oradata/mydb/mydbOl.dbf size 400M
logfile group 1 (VuO^/oradata/mydb/redoOl.logl) size 10M,
group 2 (Vu03/oradata/mydb/redo02.1og') size 10M
default temporary tablespace temp
tempfile Vu04/oradata/mydb/temp01.dbf size 1024M
660
Глава 16
undo tablespace undotbs
datafile Vu05/oradata/mydb/undo01.dbf' size 1024M
noarchivelog;
Какой из следующих вариантов идентифицирует табличное
пространство, которое не будет создано показанной в предыдущем блоке кода
командой?
A. SYSTEM
B. UNDOTBS
С DATA
D. TEMP
33. Вы создаете локально управляемое табличное пространство с помощью
следующей команды:
SQL > create tablespace DATA datafile
2 'c:\oracle\oradata\orcl\DATA01.dbf
3 size 150M reuse
4 extent management local
5 uniform size 500K online;
Tablespace created.
После создания табличного пространства вы создаете таблицу с фразой
storage, где initial = 100 Кбайт и minextents =3. Сколько места в табличном
пространстве займет таблица после создания?
А. 100 Кбайт В. 300 Кбайт
C. 500 Кбайт D. 1500 Кбайт
34. Вы хотите создать локально управляемое табличное пространство для
размещения сегментов сортировки в Oracle. Какая из следующих команд
подошла бы для этой цели в отношении назначения сегментов и экстентов?
A. Create temporary tablespace tempOl datafile
VuOl/oradata/orcl/tempOl.dbf size 100M extent
management local;
B. create temporary tablespace tempOl tempfile
VuOl/oradata/orcl/tempOl.dbf size 100M extent
management local;
C. create tablespace tempOl datafile
VuOl/oradata/orcl/tempOl.dbf' size 100M extent
management local temporary;
D. create tablespace tempOl tempfile
VuOl/oradata/orcl/tempOl.dbf' size 100M extent
management local temporary;
35. Вы определяете локально управляемое табличное пространство с
помощью следующего синтаксиса:
SQL create tablespace DATA datafile
2 » с: \oracle\oradata\orcl\DATA01. dbfx
3 size 150M reuse
4 extent management local online;
Tablespace created.
Какой из следующих вариантов указывает опущенную при создании этого
табличного пространства, но подразумеваемую Oracle фразу storage
allocation?
A. autoallocate
B. autoallocate size 1M
C. uniform
D. uniform size 1M
Основы администрирования базой данных Oracle9/1
661
36. В базе данных Oracle только что создана таблица с шестью назначенными
ей экстентами. Какой из следующих факторов наиболее вероятно стал
причиной того, что таблица имеет так много распределенных экстентов?
A. Значение параметра minextents
B. Значение параметра pctincrease
C. Значение параметра maxextents
D. По умолчанию, Oracle распределяет шесть экстентов всем объектам
базы данных.
37. Вы хотите определить количество пространства, назначенное таблице
ЕМР пользователя SCOTT в Oracle, которая хранится в табличном
пространстве DATA. Какой из следующих вариантов указывает подходящую
для этой цели команду SQL?
A. select blocks from dba_tables where table_name 5
"EMP' and owner 5 "SCOTT';
B. select sum(bytes) from dba_free_space where
tablespace_name 5 "DATA';
С select sum(bytes) from dba_extents where
segment_name 5 'EMP' and owner 5 "SCOTT';
D. select * from dba_objects where object_name 5 "EMP'
and owner 5 "SCOTT';
38. Вы управляете базой данных Oracle. Пользователь сообщает вам, что
только что получил ошибку ORA-15555. Какой из следующих вариантов
описывает причину этой ошибки?
A. Пользователь оставался подключенным в течение ночи,
и время его соединения истекло.
B. Пользователь обратился к несовместимому с чтением представлению
данных, изменяемому долговременной транзакцией.
С Долговременная транзакция пользователя стала настолько длинной,
что пространство для информации отмены исчерпалось.
D. Команда пользователя drop table шла слишком долго, и базе данных
необходимо время на перевод в пассивное состояние.
39. База данных Oracle с табличными пространствами отмены UNDO_TBSl
и UNDO_TBS2 была открыта с включенным управлением отмены. В
предыдущем сеансе была введена команда alter system set
undo_tablespace_UNDO_ TBS1. Однако в файле init.ora был опущен
параметр, дающий Oracle указание, какое табличное пространство отмены
использовать. Какой из следующих вариантов правильно описывает,
что случится, когда первый установивший соединение с Oracle
пользователь инициирует свою первую транзакцию?
A. База данных откроется, но оперативным будет только системный
сегмент отмены.
B. База данных откроется, но ни один из сегментов отмены не будет
оперативным.
C. База данных откроется, и все сегменты отмены в UNDO_TBSl будут
оперативными.
D. Oracle выдаст сообщение об ошибках, и база данных не откроется.
40. База данных Oracle с табличными пространствами отмены UNDO_TBSl и
UNDO_TBS2 была открыта с включенным управлением отмены. В
предыдущем сеансе была введена команда alter system set undo_tablespa-
ce _ UNDOTBS1. В файле init.ora параметр UNDO_TABLESPACE был
задан как UNDOTBS1. Какой из следующих вариантов правильно описы-
662
Глава 16
вает, что случится, когда первый установивший соединение с Oracle
пользователь инициирует свою первую транзакцию?
A. База данных откроется, но оперативным будет только системный
сегмент отмены.
B. База данных откроется, но ни один из сегментов отмены не будет
оперативным.
C. База данных откроется, и все сегменты отмены в UNDO_TBSl будут
оперативными.
D. Oracle возвратит сообщения об ошибках, и база данных не откроется.
41. Вы пытаетесь управлять сегментами отмены вручную, в то время как в
вашей системе включено автоматическое управление отмены. Какой из
следующих вариантов указывает метод конфигурации Oracle, допускающий
такую ситуацию?
A. Задание UNDO_MANAGEMENT как AUTO.
B. Задание UNDO_SUPRESS_ERRORS как ЛОЖНОЕ.
С Задание UNDO_MANAGEMENT как ВРУЧНУЮ.
D. Задание UNDO_RETENTION как 1800.
42. Обращение к строкам внутри трех таблиц Oracle, поддерживающих
систему ввода клиентами заказов, часто происходит совместно с помощью
объединения таблицы. Поскольку к таблицам постоянно добавляются
данные, вы оставляете внутри каждого блока много дополнительного
пространства для размещения прироста. Какой из следующих типов
таблиц полезен для хранения данных в такой ситуации?
A. Временная таблица
B. Таблица с индексной организацией
С Кластерная таблица
D. Стандартная таблица Oracle
43. Ваше табличное пространство DATA управляется локально и использует
назначение однородных экстентов. Вы вводите следующую команду:
CREATE TABLE EMPLOYEE
(empid
lastname
firstname
salary
CONSTRAINT
PRIMARY KEY
TABLESPACE data
PCTFREE 20
INITRANS 1
NOCACHE
NUMBER(10),
VARCHAR2(25),
VARCHAR2 (25) ,
NUMBER(10,4) ,
pk employee 01
(empld) )
PCTUSED 50
MAXTRANS 255
LOGGING
STORAGE ( INITIAL 100K NEXT 150K
MINEXTENTS 4 MAXEXTENTS 300
PCTINCREASE 20 ) ;
Какое из следующих утверждений справедливо в отношении только что
созданной таблицы?
A. Таблица создана в том же табличном пространстве, в котором будут
размещаться временные сегменты.
B. Первый назначенный для этой таблицы сегмент будет занимать 100
Кбайт непрерывных блоков.
C. Для создания этой таблицы будет сгенерирована информация о
повторе.
D. Когда для таблицы EMPLOYEE будет выполняться полный просмотр,
блоки из таблицы еще долго будут находиться в буферном кэше и
после выполнения команды.
Основы администрирования базой данных Огас1е9/1 663
44. Пользователь FITZPATRICK создает временную таблицу с помощью
следующей команды:
SQL> create global temporary table FITZTEMPTAB
2 (name varchar2(10), value number, use_date date)
3 on commit delete rows;
Table created
Затем FITZPATRICK сообщает пользователям MCGILLICUDDY и
OBRYAN о своей временной таблице. Пока все пользователи подключены
к Oracle и заполняют таблицу FITZTEMPTAB, OBRYAN вводит команду
truncate table FITZTEMPTAB. У кого из следующих пользователей в
результате этого действия будут удалены записи из временной таблицы?
A. Только у FITZPATRICK
B. Только у OBRYAN
С Только у OBRYAN и FITZPATRICK
D. У OBRYAN, FITZPATRICK и MCCILLICUDDY
45. Пользователь OBRYAN добавляет запись в FITZTEMPTAB,
определенную с помощью блока кода из предыдущего вопроса. В какой момент
данные, добавленные к FITZTEMPTAB пользователем OBRYAN, будут
удалены из временной таблицы?
A. Когда FITZPATRICK зафиксирует транзакцию
B. Когда OBRYAN зафиксирует транзакцию
С Когда OBRYAN выйдет из Oracle
D. Когда FITZPATRICK введет команду truncate table FITZTEMPTAB
4*. Вы только что ввели следующую команду: alter table sales drop
column profit. Какой из следующих вариантов указывает, когда столбец
будет фактически удален из Oracle?
A. Немедленно после выполнения команды
B. После ввода команды alter table drop unused columns
C. После ввода команды alter table set unused column
D. После ввода команды alter table modify
47. Вы хотите определить, сколько столбцов в таблице EMPLOYEE помечены
как неиспользованные для последующего удаления. Какой из следующих
методов подошел бы для этой цели?
A. Обращение к представлению DBA_TABLES
B. Использование команды describe
C. Обращение к представлению DBA_UNUSED_COLS
D. Обращение к представлению DBA_UNUSED_COL_TABS
48. Вы хотите восстановить индекс в Oracle. Какой из следующих вариантов
указывает причину, по которой в Oracle возможно оперативное
восстановление индексов?
A. Меньше ограничительных блокировок для основных базисных
таблиц
B. Больше ограничительных блокировок для восстановленного индекса
C. Использование дублирующей базы данных для временного
хранения
D. Использование временной таблицы для временного хранения
49. Вы прекращаете контролировать индекс MYIDX, после того как
контролировали его использования в течение нескольких часов. Какое из следу-
664
Глава 16
ющих утверждений является правильным в данной ситуации
относительно V$OBJECT_USAGE?
A. Oracle удаляет относящуюся к MYIDX запись из
V$OBJECT_USAGE.
B. Oracle заполняет столбец END_MONITORING в записи,
соответствующей MY_JDX в представлении V$OBJECT_USAGE.
C. Oracle заполняет столбец USED в записи, соответствующей MY_IDX
в представлении V$OBJECT_USAGE.
D. Oracle удаляет все значения в записи, соответствующей MYIDX в
представлении V$OBJECT_USAGE.
50. Вы реализуете офаничение целостности в базе данных Oracle с помощью
команды alter table EMP add constraint PK_EMP_01 primary key
(empno) . Какое из следующих утверждений справедливо в отношении
только что добавленного офаничения?
A. Ограничение заставит Oracle создать битовый индекс для поддержки
его действий.
B. Ограничение будет обращаться к первичному ключу в другой таблице
за допустимыми значениями.
C. Ограничение будет создано, если все значения в столбце EMPNO
будут уникальными и не-NULL.
D. Ограничение потребует уникальности, но значения NULL будут
разрешены.
51. Из базы данных Oracle поступила следующая информация
о табличном пространстве:
SQL select tablespace_name, contents from dba_tablespaces;
TABLESPACE NAME CONTENTS
SYSTEM PERMANENT
DATA PERMANENT
INDEXES PERMANENT
UNDOTBS UNDO
TEMP TEMPORARY
USERS PERMANENT
Вы создаете пользователя в этой базе данных с помощью команды create
user serena identified by tranquill. Какой из следующих
вариантов указывает, где Oracle разместит новую таблицу пользователя SERENA,
созданную с помощью команды create table mytab (coll number
primary key)?
A. SYSTEM
B. DATA
С TEMP
D. UNDOTBS
52. Вы вводите в Oracle следующую команду: alter user JOSEPHINE
default tablespace SYSTEM quota 0 on SYSTEM. Допустим, JOSEPHINE
имеет на это соответствующие привилегии. Какую из следующих команд
JOSEPHINE не сможет ввести в результате этого действия?
A. create table mytab (coll number primary key);
B. create procedure myproc begin null; end;
С create function myfunc return null begin null; end;
D.create table mytab2 (coll number primary key)
tablespace data;
Основы администрирования базой данных Огас1е9/1 665
53. Вы вводите следующую команду в Oracle, и Oracle выдает информацию:
SQL select * from dba_u3ers where username - 'SYS';
USERNAME USER ID PASSWORD
ACCOUNT STATUS LOCK DATE EXPIRY DATE
DEFAULT TABLESPACE TEMPORARY TABLESPACE CREATED
PROFILE INITIAL RSRC CONSUMER GROUP EXTERNAL NAME
SYS 0 D4C5016086B2DC6A
OPEN
SYSTEM TEMP 06-JUN-01
DEFAULT SYS_GROUP
Какое из следующих утверждений истинно в отношении приведенной
выше пользовательской информации?
A. Никто из пользователей не сможет регистрироваться в Oracle как SYS.
B. Если SYS создаст таблицу без фразы tablespace, таблица будет
помещена в табличное пространство TEMP.
С В этой базе данных пользователь SYS имеет пароль
D4C5016086B2DC6A.
D. Если SYS будет выполнять дисковую сортировку, временные
сегменты будут помещаться в табличное пространство TEMP.
54. Вы хотите использовать сложные пределы ресурса в базе данных Oracle.
Какую из следующих команд надо ввести, чтобы сложным ресурсам было
назначено значение для сложных пределов?
A. alter system
В.alter resource cost
С alter profile
D. alter user
55. Вы определяете пределы ресурса для использования с профилями. Какой
из следующих вариантов не является пределом ресурса, который можно
установить вместе со сложными пределами в базе данных Oracle?
A. IDLEJTIME
B. CPU_PER_SESSION
С PRIVATE_SGA
D. CONNECTJTIME
56. Вы создаете профиль с помощью команды:
CREATE PROFILE myprofile LIMIT
SESSIONS_PER_USER 1
CPU_PER_CALL~20
CONNECTJTIME 240
IDLEJTIME 20
PRIVATE_SGA 1024;
Какой из следующих вариантов лучше всего показывает, как Oracle
определит значение для предела CPU_PER_SESSION?
A. Oracle использует то же самое значение, что
и CPU_PER_CALL из этой команды create profile.
B. Oracle использует значение для CPU_PER_SESSION
из профиля SYS_PROFILE.
666
Глава 16
C. Oracle использует значение для CPU_PER_SESSION
из профиля DEFAULT.
D. Oracle устанавливает CPU_PER_SESSION как unlimited.
57. Вы создаете профиль с помощью следующего блока кода:
CREATE PROFILE tmp_proflie LIMIT
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME unlimited
PASSWORD_LIFE_TIME 30
PASSWORD_REUSE_TIME 180
PASSWORD_VERIFY_FUNCTION my_pwver
PASSWORD_GRACE_TIME 5;
Какое из следующих утверждений истинно в отношении только что
созданного профиля?
A. После трех неудавшихся попыток входа в систему пользователю,
которому назначен этот профиль, придется ждать три дня до новой
попытки зарегистрироваться в Oracle.
B. Через 180 дней пользователь, которому назначен этот профиль, может
снова использовать свой пароль.
С Пользователь, которому назначен этот профиль, должен менять свой
пароль каждые 30 минут.
D. Пользователь имеет, максимум, пять минут для установления пароля
при первой регистрации, прежде чем Oracle автоматически блокирует
учетную запись.
58. Вы хотите установить свойство управления паролями в базе данных Oracle
так, чтобы пользователи никогда не могли повторно использовать пароль
и имели три дня на его замену. Пароль по умолчанию при первой
регистрации в Oracle должен быть изменен, прежде чем учетная запись будет
заблокирована. Какой из следующих вариантов указывает подходящую для
этой цели команду?
A. alter profile default limit failed_login_attempts 3
password_reuse_time unlimited;
B. alter profile default limit password_grace time 3
password_reuse_limit unlimited;
С alter profile default limit failed_login_attempts 3
password_grace_time unlimited;
D. alter profile default limit password_reuse_time 3
failed_login_attempts unlimited;
59. Вы пытаетесь определить, какие профили имеют параметры ресурса,
не налагающие ограничения на использование ресурсов
пользователями. Какой из следующих запросов был бы наиболее полезен для этой
цели?
A. select profile from dba_profiles where profile
(select username from dba_users where profile
'UNLIMITED');
B. select profile from dba_profiles where limit
(select unit_cost from resource_cost where
resource_name 'CPl^PEF^SESSION');
С select profile from dba_profiles where limit
'UNLIMITED';
D. select distinct profile from dba_profiles where
limit = 'UNLIMITED';
Основы администрирования базой данных Огас1е9/1 667
60. Вы назначаете привилегию SYS DBA пользователю базы данных Oracle.
Какую из следующих возможностей дает эта привилегия ее
обладателю?
A. Возможность обращаться ко всем таблицам в Oracle
B. Возможность назначать привилегию SYSDBA другим
С Возможность проводить резервное копирование базы данных
D. Возможность удалять информацию из любой таблицы в Oracle
Ответы на первый комплект экзаменационных
вопросов
1. D.ARCHhLGWR
2. В. Управляющий файл
3. A. SYSTEM
4. В. SYS
5. С. Профили
6. В. Увеличение pctf гее
7. А. Мультиплексирование
8. D. Предоставление привилегий непосредственно ролям
9. В. Число файлов данных
10. В.Высокое значение pctused
11. С. Ввод alter user spanky profile LIMITER, где LIMITER является
профилем.
12. D. Хеш-кластеры
13. В. Ограниченный сеанс
14. D. drop table
15. В.Временное табличное пространство
16. Е. Ничего — для этих действий привилегии SYSDBAHe требуются.
17. A. DBW0
18. ЕЛеправильно определена фраза storage.
19. С. SIMON больше не сможет добавлять записи в таблицу ЕМР.
20.В. pctused= 40, pctfree= 30
21. A. OPTIMAL
22. D. default role
23. А.Запустить pupbld.sqlкак SYSTEM.
24. D. SMON
25. С. Одно табличное пространство может иметь много файлов данных.
668
Глава 16
26. В. Увеличить значение CPU_PER_SESSION и уменьшить значение
CONNECT_TIME
37. С. Все еще продолжается незафиксированная транзакция.
28. А. Библиотечный кэш
29. С. Когда сбрасывается на диск разделяемый пул
30. В.Запустить utlpwmg.sql.
31. А. В представлении словаря DBA_TS_QUOTAS
32. A. DEFAULT
33. В. DBA_PROFILES
34. A catproc.sql
35. D. Роли
36. С. Создать несколько членов для каждой из четырех групп и поместить их
на различных дисках.
37. A. EXCEPTIONS
38. С. Назначить пользователю роль CONNECT.
39. С. Преобразовать индекс В-дерева в индекс обратного ключа.
40. D. CHAR
41. В. Будут регистрироваться безуспешные команды update и delete,
выполненные любым пользователем для CAT_TOYS.
42. A. DBA_IND_COLUMNS
43. D. Ничего. Вы не сможете удалить ранее назначенный пользователям
профиль.
44. В. Увеличение значения pctused для таблицы
45. D. Сегменты SYSTEM
46. D. shutdown normal
47. С. Серверный процесс получает информацию для пользователя.
48. С. Команда drop tablespace завершится неудачно, потому что вы не
включили опцию including contents.
49. С. SQL*Plus возвратит сообщение об ошибке, говорящей, что сначала вы
должны установить соединение с Oracle.
50. А. Ввести select * from dba_parameters ; из SQL'Plus.
51. В. Битовые индексы не могут быть уникальными.
52. D. ROLE_ROLE_PRTVS
53. A. alter session set NLS_DATE_FORMAT ^D-MON-YYYY-.HHiMIAM';
54. D. Аудит на основе значений
55. В. index
Основы администрирования базой данных Огвс1е911 669
56. С. SORT_AREA_SIZE
57. В. Немедленное сохранение кэшированных данных на диске.
58. Б.При выполнении команды
59. D. Сегмент последовательности
60. В. DBA_FREE_SPACE
Ответы на второй комплект экзаменационных
вопросов
1. A. V$CONTROLF1LE_RECORD_SECTION
2. С. Oracle оставит больше свободного места в блоках данных для
существующих записей.
3. С. Команда потерпит неудачу.
4. D. Пользователи, которым ANN назначала привилегии insert, не смогут
выполнять insert.
5. В. Задать SESSIONS_PER_USER в профиле DEFAULT как 1.
6. В. Кэш строки
7. С. Прямой путь загрузки данных обходит большинство РСУБД Oracle
RDBMS, а обычный путь загрузки данных является быстродействующей
версией insert в SQL.
8. С. DBA_SEGMENTS
9. В. set transaction
10. С. Oracle, в конечном счете, не позволит добавлять новые записи к базе
данных.
11. А. Уменьшение размера табличного пространства
12. С. COMPOSITE_LIMIT
13. С. revoke create any table from ANN; then grant create
any table to ANN;
14. D. alter user default role none except R0LE_1;
15. А.Из файла init.ora
16. В. Запись текущего номера журнала базы данных в заголовке файла
данных.
17. D. Чтобы избавить пользователей от ожидания, если нельзя архивировать
член журнала базы данных.
18. С. Logical_writes_PER_Session
19. В. alter system
20. D. default role
21. В. identified by
670
Глава 16
22. A. alter profile default limit COMPOSITE_LIMIT 3500;
23. D. grant
24. B. select
25. А. В PGA K
26. A. quota on
27. D. Осталось много свободного пространства для модификации, и
пространство освобождается с помощью операций delete, неактивно
вводимых Oracle
28. С. Направляет обращение пользовательского процесса на разделяемый
сервер
29. В. В разделяемом пуле
30. D. VARCHAR2
31.D. NLS_SORT
32. С. Вы можете использовать наборы многобайтовых символов с
изменяющейся длиной в качестве обоих наборов символов в базе данных.
33. A. V$NLS_PARAMETERS
34. В. NLS_CURRENCY
35. A. BACKGROUND_DUMP_DEST
36. С. Oracle помещает табличное пространство в режим только для чтения
после фиксации последней предшествующей транзакции для этого
табличного пространства, предотвращая последующий DML, пока не
произойдет изменение.
37. А. Использование битовой карты в сегменте заголовка пространства
38. В. Память сеанса для конфигурации MTS
39. В. alter table set unused column
40. A. PGA
41. D. recseparator
42. А. Оценить статистику.
43. В. LOG_ARCHIVE_MAX_PROCESSES
44.D.%ORACLE_BASE %\oradata
45.A. 25
46. С. На основании числа блоков в таблице плюс числа блоков в связанных
индексах
47. D. NLS_DUAL_CURRENCY
48. D. insert закончится неудачно во время ввода, но транзакция будет
продолжаться
49. С. '948695'
50. В. Создать таблицу с индексной организацией для хранения данных.
Основы администрирования базой данных Огас1е9/1 671
51. D. Задать password_reuse_time равным 1095
52. В. STARSKY больше не сможет создавать таблицы, a HUTCH сможет.
53. С. Пользователь вводит команду set role, а затем команды DML.
54. В. Доступность пространства на диске, на который добавляются файлы
данных.
55. А. В профиле DEVELOPER для COMPOSITE_LIMIT задано 230 000.
56. A. CREATE_CATALOG_ROLE
57. В. Производительность
58. D. Команда alter tablespace coalesce
59. С. Перевести табличное пространство в оперативный режим.
60. B.C55278B93918BF29
Ответы на третий комплект экзаменационных
вопросов
1. А. Прослушивающий процесс породит новый серверный процесс.
2. С. Перенести данные с диска в память.
3. А. Произвести изменения в блоке данных в памяти.
4. С. Использование OFA облегчает поддержку, стандартизируя компоновку
файловой системы для всех инсталляций Oracle.
5. В. orapwd file=/u01/app/oracle/database/orapwdORCL.pwd
password=oracle entries=100
6. А. При запуске экземпляра
7. A. DB_CREATE_FILE_DEST
8. В. OMF автоматически удалит базовый файл из хост-окружения.
9. В. Два
10. С. alter system suspend
11. A. shutdown abort
12. С. orclALRT. trc
13. A. CONTROL_FILES
14. С. Шаблон
15. D. SYSTEM
16.D.SYS
17. B. DBAJTABLES
18. B. DBA_SOURCE
19. A.set long 9999
672
Глава 16
20. А. Проверить фактическое местоположение каталога вашего
управляющего файла.
21. D. /u04/oradata/dbl
22. С. Изменение содержимого управляющего файла при добавлении нового
табличного пространства
23. В. Сделать копию управляющего файла при закрытой базе данных.
24. D. ARCO
25. D. ora_l_asdfl234.log
26. D. Вы создавали управляемое словарем постоянное табличное пространство.
27. С. autoextend
28. С. uniform extent allocation
29. С. drop tablespace cascade constraints
30. D. Изменение не вступит в силу для существующих таблиц.
31. D. Все табличные пространства в базе данных
32. С. DATA
33. D. 1500 Кбайт
34. В. create temporary tablespace tempOl tempfile VuOl/orada-
ta/orcl/temp01.dbf size 100M extent management local;
35. A. autoallocate
36. А.Значение параметра minextents
37. С. select sum(bytes) from dba_extents where
segment_name 5 'EMP' and owner = 'SCOTT';
38. С. Долговременная транзакция пользователя стала настолько длинной, что
пространство для информации отмены исчерпалось.
39. С. База данных откроется, и все сегменты отмены
в UNDOJTBS1 будут оперативными.
40. D. Oracle возвратит сообщения об ошибках, и база данных не откроется.
41. С. Задание UNDO_MANAGEMENT вручную.
42. D. Стандартная таблица Oracle
43. С. Для создания этой таблицы будет сгенерирована информация о повторе.
44. В. Только у OBRYAN
45. Когда OBRYAN зафиксирует транзакцию
46. А. Немедленно после выполнения команды
47. D. Обращение к представлению DBA_UNUSED_COL_TABS
48. А. Меньше ограничительных блокировок для основных базисных таблиц
49. В. Oracle заполняет столбец END_MONITORING в записи,
соответствующей MY_IDX в представлении V$OBJECT_USAGE.
Основы администрирования базой данных OracleQ/1 673
50. С. Ограничение будет создано, если все значения в столбце EMPNO будут
уникальными и не-NULL.
51. A. SYSTEM
52. A. create table mytab (coll number primary key);
53. D. Если SYS будет выполнять дисковую сортировку, временные сегменты
будут помещаться в табличное пространство TEMP.
54. В. alter resource cost
55. A. IDLE_T1ME
56. С. Oracle использует значение для CPU_PER_SESSION
из профиля DEFAULT.
57. В. Через 180 дней пользователь, которому назначен этот профиль, может
снова использовать свой пароль.
58. В. alter profile default limit password_grace time 3
password_reuse_limit unlimited;
59. D. select distinct profile from dba_profiles where
limit^ UNLIMITED' ;
60. С. Возможность проводить резервное копирование базы данных
ПРИЛОЖЕНИЕ А
Поддержка глобализации
676
Приложение А
этом приложении обсуждается архитектура поддержки
глобализации (Globalization Support Architecture) в Oracle. Это свойство
позволяет развернуть Oracle на иных, чем английский, языках.
Эта тема охватывает только 3% фактического
экзаменационного материала. В Огас1е7 и ниже свойство поддержки
глобализации Oracle называлось поддержкой национальных языков
(NLS). Теперь свойство NLS является подмножеством Globalization Support
Architecture. В этом разделе мы рассмотрим следующие моменты
использования NLS в Oracle:
Я Выбор базы данных и набора национальных символов для базы данных
■ Определение поведения в зависимости от языка
■ Использование различных типов параметров NLS
■ Получение информации о параметрах NLS
Oracle поддерживает много различных схем кодирования языка для
создания программы, которую можно было бы использовать во всем мире.
Поддерживается четыре различных класса: наборы однобайтных символов (7-битные
и 8-битные), наборы многобайтных символов с изменяющейся шириной,
наборы многобайтных символов с фиксированной шириной, и наборы символов
Unicode. Возможно, вам знакомы однобайтные символы US7ASCII,
используемый в Соединенных Штатах набор 7-битных символов ASCII. Для хранения
символа в нем используется один байт, поэтому он может представлять 128
символов. В Европе используется несколько наборов 8-битных символов,
представляющих дополнительные по отношению к английскому языку
символы. WE8IS08859P1 является стандартным западноевропейским набором
8-битных символов, который широко используется Международной
Организацией по стандартизации (ISO). В отличие от US7ASCII, который использует
7 битов представления символа, в нем используется 8 битов, и поэтому он
может представлять 256 символов.
Oracle использует наборы символов с изменяющейся и фиксированной
шириной для поддержки таких языков, как японский, китайский, корейский
и т.д., которые используют сложные символы, а также арабского и еврейского
языков, в которых имеется дополнительная сложность — их надо читать
справа налево. Unicode — стандарт для кодирования всех используемых в
компьютерах символы, включая все символы на всех языках, плюс
специализированные символы печати, математические и компьютерные символы. В этом
разделе вы узнаете о вариантах наборов символов для базы данных — как
определить поведение NLS в различных сценариях, параметры NLS,
использование NLS, и какой эффект он может произвести на поведение приложения
в зависимости от языка.
Набор символов базы данных определяется во время создания базы данных
с помощью фразы character set в команде create database. Существует
несколько опций, заменяющих набор символов после создания базы данных.
Набор символов базы данных можно заменить только, если новый набор
символов укрупненным набором существующего набора символов. Причина
этого очевидна — существующий набор символов базы данных должен быть
представлен в новом наборе символов. Если это условие выполнено, то набор
символов можно заменить с помощью команды alter database character
set. Если нет, то потребуется полный экспорт базы данных,
восстанавливающий базу данных с новым набором символов, а затем полный импорт базы
данных.
Выбор базы данных и набора национальных символов
для базы данных
Для базы данных можно определить два набора символов: набор символов
базы данных и набор национальных символов. И база данных, и наборы
национальных символов определяются при создании базу данных. Набор символов
Поддержка глобализации
677
базы данных используется для хранения исходных кодов Oracle SQL и
PL/SQL, а набор национальных символов используется для представления
данных в таблицах. SQL и PL/SQL должны храниться на языке, содержащем
все символы американского 7-битного ASCII или EBCDIC, смотря что
поддерживается на вашей хост-машине. Поэтому, даже если вы говорите
по-корейски и хотите хранить корейский язык в базе данных, вы все равно должны
знать английский, чтобы вводить с клавиатуры командах SQL и PL/SQL.
Набор национальных символов определяется во время создания базы
данных с помощью фразы national character set. Если она не задана, то
Oracle по умолчанию задает его как набор символов базы данных. Для наборов
национальных символов, текстовых или переменных больших объектов
задаются некоторые специальные условия. Типы данных CLOB, CHAR и
VARCHAR2 могут хранить наборы символов базы данных, и каждый имеет
национальные эквиваленты набора символов, NCLOB, NCHAR и
NVARCHAR2, соответственно. Тип данных LONG может хранить только
наборы символов, назначенные наборами символов базы данных. Клиентские
или пользовательские машины могут иметь набор символов, отличающийся
от набора символов базы данных. Это достигается заданием переменной
окружения. Убедитесь, что набор символов базы данных является укрупненным
клиентским набором символов.
Наборы многобайтных символов с переменной шириной
В наборе символов с переменной шириной, набор многобайтных символов
представлен одним или несколькими байтами на символ. Значение значащего
бита указывает, что представляет байт: один байт или часть ряда байтов,
представляющих символ.
Наборы многобайтных символов с фиксированной шириной
Наборы символов с фиксированной шириной обеспечивают поддержку,
аналогичную наборам многобайтных символов, за исключением того, что формат
представляет собой фиксированное число байтов для каждого символа.
Учтите также, что термины "фиксированная длина" и "переменная длина"
имеют иные значения для типов данных CHAR и VARCHAR2, чем
фиксированная ширина и переменная ширина в контексте CHAR и NCHAR, или
VARCHAR2 и NVARCHAR2. В первом случае, фиксированная ширина
означает, что у сохраненных в CHAR (3) данных длина будет всегда равна трем
символам, даже если вы определяете только один символ данных. Один символ будет
дополняться двумя дополнительными пробелами. Столбцы VARCHAR2 не
будут дополняться дополнительными пробелами, поэтому длина того же символа
данных в столбце VARCHAR2 (3) будет составлять только один символ. Во
втором случае фиксированная и переменная ширина относится к числу байтов,
используемых для хранения каждого символа в строке.
Необходимость в наборах национальных символов
Невозможно использовать наборы многобайтных символов с фиксированной
шириной как набор символов базы данных; его можно использовать только в
качестве набора национальных символов. Типы данных NCHAR,
NVARCHAR2 и NCLOB необходимы для описания столбцов как вариантов
базовых типов CHAR, VARCHAR2 и CLOB, чтобы указать, что они хранятся с
помощью набора национальных символов, а не набора символов базы данных.
Совет Наборы национальных символов и наборы символов базы данных
должны быть тесно связаны в целях достижения наилучшего результата.
Кроме того, существует компромисс между наборами символов с
фиксированной и переменной шириной — наборы символов с фиксированной шириной
обеспечивают более высокую производительность в операциях над
строками, например, length ( ) и substr ( ), а наборы с переменной шириной
лучше для управления пространством.
678
Приложение А
Закрепление пройденного материала
1. Сравните типы данных с фиксированной и переменной шириной с
наборами многобайтных символов с фиксированной и переменной шириной.
Какой в них вкладывается смысл?
2. Сравните наборы национальных символов и наборы символов базы
данных. Что означает и позволяет каждый из них?
Определение поведения в зависимости от языка
Существует несколько различных областей, в которых можно указывать
поведение в зависимости от языка. Задание параметров NLS изменяет значения по
умолчанию в зависимости от указанного набора национальных символов и
символов базы данных. Эти параметры можно изменить следующим образом:
■ Указав параметр в файле параметров инициализации па сервере. Эти
значения оказываю влияние не на клиента, а только на сервер.
NLSJTERRITORY = "CZECH REPUBLIC"
■ Указав NLS как переменную окружения на клиентской машине. Она
определяет поведение клиента и перезаписывает в файле параметром
инициализации набор значений по умолчанию для сеанса. Ниже приводится
пример задания NLS как переменной окружения в системе UNIX.
t export NLS_SORT-FRENCH
■ На уровне сеанса с помощью команды alter session
alter session set NLS_DATE_LANGUAGE - FRENCH;
■ Указав определенные функции SQL
TO_CHAR(hiredate, 'YYYY-MM-DD', ЧН,3_0АТЕ_1АН0иАСЕ - FRENCH'))
Определенные в функциях SQL параметры NLS имеют более высокий
приоритет, после них идут параметр, указанные в команде alter session, за
ними переменная окружения, за ней параметры инициализации и, наконец,
параметры с самым низким приоритетом — параметры базы данных по
умолчанию.
Параметры NLS
Ниже приводится перечень параметров NLS и их спецификации:
■ NLS_LANGUAGE Указывает язык для сообщений об ошибках, названия
дней и месяцев, а также символы для времени в 12-часовом представлении
и календарный период: это параметр также определяет используемый
Oracle механизм сортировки.
■ NLS_DATE_LANGUAGE Изменяет язык для названия дней и месяцев, и
других языковых компонентов в информации о дате.
■ NLS_SORT Изменяет используемый Oracle механизм сортировки.
Например, вы можете переопределить порядок сортировки по умолчанию,
задаваемый в наборе национальных символов, и использовать порядок
сортировки из другого набора символов.
■ NLSJTERRITORY Указывает нумерацию дней недели, формат даты по
умолчанию, символы валют и десятичные символы.
■ NLS_CURRENCY Указывает новый символ валюты.
■ NLS_ISO_CURRENCY Указывает новую территорию, чей символ
валюты, принятый в ISO, будет использован.
■ NLS_DATE_FORMAT Указывает новый формат даты
Поддержка глобализации
679
■ NLS_NUMERIC_CHARACTERS Указывает новый разделитель
десятичных знаков (0.00) и порядков (0,000).
NLS_LANG Перезаписывает значения NLS по умолчанию для
пользователя по формату: язык-территория, набор символов. Изменение параметров
NLS в сеансе производится двумя способами: или с помощью команды alter
session set parm_name value, где parm_name — имя параметра NLS, a
value — это то, что вы хотите задать для этого параметра; или же можно
использовать процедуру setnls ( ) в модуле DBMS_SESSION, который
принимает два значения: рагт_пате и value.
Закрепление пройденного материала
1. Назовите два способа изменения параметров NLS в сеансе.
2. Назовите параметры, которые изменяют формат информации в типе
данных DATE.
Получение информации об использовании поддержки
глобализации
Информацию об использовании поддержки глобализации можно получит
двумя способами информация о ваших данных в различных форматах NLS и
информация об обычной настройке NLS для вашей базы данных. Первый
набор информации можно получить через стандартные функции SQL
to_char ( ),to_number ( ) и to_date ( ). Эти функции принимают
различные параметры NLS, а возвращают информацию в зависимости от
параметров NLS, которые вы им дали.
Кроме того, имеется несколько функции NLS, которые используют
параметр NLS_SORT. В приведенном ниже блоке кода показана выходная
информация из таблицы с параметрами NLS, используемыми для обеспечения
понятного форматирования в простом отчете. В этом примере обратите
внимание на использование L, G и D в качестве маркеров символов местной
валюты и разделителей порядков и десятичных знаков:
SQL> select year,
to_char(gnp,' L9G999G999G999D99', 'NLS_NUMERIC_CHARACTERS=" .,$"')
2 as GNP
3 from us_gnp;
YEAR GNP
1997 $5,948,399,939.34
1998 $6,043,345,223.34
1999 $6,143,545,453.80
Совет Поэкспериментируйте с порядком символов, указанных для
приведенного вые параметра NLS_NUMERIC_CHABACTERS из файла initsid.ora,
и посмотрите, что произойдет в выходной информацией. Они указываются
в следующем порядке: D, G, L и С (который представляет символ ISO для
местной валюты, например, USD для долларов США).
Представления словаря данных, содержащие параметры NLS
Помимо представления VSPARAMETER, можно найти информацию о
настройках параметров NLS в Oracle, просматривая несколько приведенных
ниже представлений:
■ NLS_DATABASE_PARAMETERS В этом представлении хранятся все
параметры NLS для всей базы данных.
■ NLS_INSTANCE_PARAMETERS В этом представлении хранятся все
параметры NLS для всего экземпляра.
680
Приложение А
■ NLS_SESSION_PARAMETERS В этом представлении хранятся все
параметры NLS для активного сеанса.
■ V$NLS_PARAMETERS Это укрупненный набор из предыдущих трех
представлений.
■ V$NLS_VALID_VALUES Это листинг всех допустимых значений для всех
параметров.
Закрепление пройденного материала
1. Назовите представление, которое содержит все параметры NLS для
экземпляра, сеанса и базы данных.
S. Назовите способ, с помощью которого можно использовать параметры
NLS в функции преобразовании SQL. Каковы другие способы применения
этого свойства в Oracle?