СТАТЬЯ
12.02.01

предыдущая часть | содержание | следующая часть

ГЛАВА 2

УПРАВЛЕНИЕ ОБЪЕКТАМИ СХЕМЫ

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

Замечание: Процедуры, функции и пакеты обсуждаются в главе 7, зависимости между объектами – в главе 9, а снимки – в главе 12. Если вы используете Trusted ORACLE, то вы должны знать о дополнительных привилегиях и других вопросах, которые необходимо рассматривать при управлении объектами схемы; обратитесь к документу Trusted ORACLE7 Server Administrator's Guide.

Управление таблицами

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

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

Следующие секции объясняют, как создавать, изменять и удалять таблицы. Представлены некоторые простые рекомендации, которым необходимо следовать при управлении таблицами в вашей базе данных; для дополнительных сведений обратитесь к документу ORACLE7 Server Administrator's Guide. Вы должны также прибегать к помощи учебников по проектированию реляционных баз данных и таблиц.

Проектирование таблиц

Учитывайте следующие рекомендации при проектировании ваших таблиц:

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

Создание таблиц

Создавайте таблицы с помощью команды SQL CREATE TABLE. Например, выдавая следующее предложение, пользователь SCOTT создает некластеризованную таблицу с именем EMP в своей схеме и сохраняет ее в табличном пространстве USERS. Заметьте, что на нескольких столбцах этой таблицы определены ограничения целостности.

CREATE TABLE emp (  
  empno NUMBER(5) PRIMARY KEY,
  ename VARCHAR2(15) NOT NULL,
  job VARCHAR2(10),
  mgr NUMBER(5),
  hiredate DATE DEFAULT (sysdate),
  sal NUMBER(7,2),
  comm NUMBER(7,2),
  deptno NUMBER(3) NOT NULL
    CONSTRAINT dept_fkey REFERENCES dept)
  PCTFREE 10  
  PCTUSED 40  
  TABLESPACE users  
  STORAGE ( INITIAL 50K
    NEXT 50K
    MAXEXTENTS 10
    PCTINCREASE 25 );
 

Управление использованием памяти для блоков данных

Следующие секции объясняют, как использовать параметры PCTFREE и PCTUSED для выполнения следующих задач:

Специфицирование PCTFREE

Умолчание для PCTFREE равно 10 процентов; вы можете задавать любое целое значение от 0 до 99 включительно, пока сумма PCTFREE и PCTUSED не превышает 100. (Если вы установите PCTFREE как 99, то ORACLE будет помещать в каждый блок по меньшей мере одну строку, независимо от размера этой строки. Если строки очень малы, а блоки очень велики, может уместиться даже несколько строк.)

Низкое значение PCTFREE имеет следующие эффекты:

Высокое значение PCTFREE имеет следующие эффекты:

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

Ваша цель – найти удовлетворительный компромисс между плотной упаковкой данных (низкий PCTFREE, заполненные блоки) и хорошей производительностью обновлений (высокий PCTFREE, менее заполненные блоки).

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

PCTFREE для некластеризованных таблиц

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

PCTFREE для кластеризованных таблиц

Эти же соображения применимы для кластеризованных таблиц. Однако после того, как достигнуто значение PCTFREE, новые строки для ЛЮБОЙ таблицы с таким же значением ключа кластера попадают в новый блок данных, который сцепляется с данным ключом кластера.

PCTFREE для индексов

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

Специфицирование PCTUSED

Когда свободная память в блоке данных падает до PCTFREE, в этот блок не вставляются новые строки, пока процент занятой памяти не упадет ниже PCTUSED. ORACLE старается удержать блок данных заполненным по крайней мере на PCTUSED. Это – процент памяти в блоке, свободной для данных после вычета накладных расходов из общей памяти блока.

Умолчание для PCTUSED равно 40 процентов; вы можете задавать любое целое значение от 0 до 99 включительно, пока сумма PCTFREE и PCTUSED не превышает 100.

Низкое значение PCTUSED имеет следующие эффекты:

Высокое значение PCTUSED имеет следующие эффекты:

Выбор связанных значений PCTUSED и PCTFREE

Если вы решили явно задать значения PCTUSED и PCTFREE, примите во внимание следующие соображения:

Примеры выбора значений PCTFREE и PCTUSED

Следующие примеры иллюстрируют подбор значений PCTFREE и PCTUSED при заданных сценариях.

Пример 1

Сценарий:

Типичная работа включает предложения UPDATE, которые увеличивают размеры строк.

Установка:

PCTFREE = 20 PCTUSED = 40

Объяснение:

PCTFREE установлен в 20, чтобы оставить достаточно места для строк, увеличивающихся в размере при обновлениях. PCTUSED установлен в 40, чтобы требовалось меньше обработки при высокой активности обновлений, т.е. для улучшения производительности.

Пример 2

Сценарий: Типичная работа включает предложения INSERT и DELETE, а предложения UPDATE в среднем не увеличивают размеры строк.

Установка:

PCTFREE = 5 PCTUSED = 60
Объяснение: PCTFREE установлен в 5, так как большинство предложений UPDATE не увеличивают размеров строк. PCTUSED установлен в 60, так что память, освобождаемая предложениями DELETE, скоро начинает повторно использоваться, так что обработка минимизируется.

Пример 3

Сценарий: Таблица очень велика; поэтому основной заботой является память. Типичная работа включает только-читающие транзакции.
Установка: PCTFREE = 5 PCTUSED = 90
Объяснение: PCTFREE установлен в 5, так предложения UPDATE используются редко. PCTUSED установлен в 90, так что для хранения данных используется большая часть блока. Это значение PCTUSED уменьшает число блоков, требуемое для размещения всех данных таблицы, сокращает среднее число блоков, просматриваемых во время запросов, и тем самым увеличивает производительность запросов.

Привилегии, требуемые для создания таблиц

Чтобы создать новую таблицу в вашей схеме, вы должны иметь системную привилегию CREATE TABLE. Чтобы создать таблицу в схеме другого пользователя, вы должны иметь системную привилегию CREATE ANY TABLE. Кроме того, владелец таблицы должен иметь квоту для табличного пространства, в котором содержится таблица, либо системную привилегию UNLIMITED TABLESPACE.

Изменение таблиц

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

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

Чтобы изменить таблицу, используйте команду SQL ALTER TABLE. Например, следующее предложение изменяет таблицу EMP:

ALTER TABLE
PCTFREE
PCTUSED
emp
30
60;

Вы должны понимать следующие последствия изменения таблицы:

Привилегии, требуемые для изменения таблиц

Чтобы изменить таблицу, либо она должна содержаться в вашей схеме, либо вы должны иметь объектную привилегию ALTER для этой таблицы, или системную привилегию ALTER ANY TABLE.

Удаление таблиц

Чтобы удалить ненужную таблицу, используйте команду SQL DROP TABLE. Например, следующее предложение удаляет таблицу EMP:

DROP TABLE emp;

Если удаляемая таблица содержит первичный или уникальный ключ, на который ссылаются внешние ключи других таблиц, то вы можете одновременно с этой таблицей удалить ограничения FOREIGN KEY для порожденных таблиц, включив в команду DROP TABLE опцию CASCADE, например:

DROP TABLE emp CASCADE CONSTRAINTS;

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

Если вы хотите удалить все строки таблицы, но сохранить определение этой таблицы, вы должны использовать команду TRUNCATE TABLE. Эта команда описана в документе ORACLE7 Server Administrator's Guide.

Привилегии, требуемые для удаления таблиц

Чтобы удалить таблицу, либо она должна содержаться в вашей схеме, либо вы должны иметь системную привилегию DROP ANY TABLE.

Управление обзорами

ОБЗОР – это логическое представление таблицы или комбинации таблиц. Обзор выводит свои данные из таблиц, на которых он базируется. Эти таблицы называются БАЗОВЫМИ ТАБЛИЦАМИ данного обзора. Базовые таблицы, в свою очередь, могут быть как настоящими таблицами, так и другими обзорами.

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

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

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

Создание обзоров

Создавайте обзоры с помощью команды SQL CREATE VIEW. Вы можете определять обзоры посредством любого запроса, который обращается к таблицам, снимкам или другим обзорам; однако запрос, определяющий обзор, может содержать фразы ORDER BY или FOR UPDATE. Например, следующее предложение создает обзор по подмножеству данных таблицы EMP:

Запрос, определяющий обзор SALES_STAFF, обращается только к строкам отдела 10. Более того, благодаря CHECK OPTION этот обзор создается с ограничением, которое не позволяет путем предложений INSERT и UPDATE, выдаваемых для этого обзора, получать строки, которые запрос не может выбирать. Например, следующее предложение INSERT успешно вставляет строку в таблицу

EMP через обзор SALES_STAFF, содержащий все строки с номером отдела 10:

INSERT INTO sales_staff VALUES (7584, 'OSTER', 10);

Однако следующее предложение INSERT подвергается откату и возвращает ошибку, потому что оно пытается вставить строку с номером отдела 30, которая не может быть выбрана обзором SALES_STAFF:

INSERT INTO sales_staff VALUES (7591, 'WILLIAMS', 30);

Следующее предложение создает обзор, который соединяет данные из таблиц EMP и DEPT:

Обзор DIVISION1_STAFF соединяет информацию из таблиц EMP и DEPT. Опция CHECK OPTION не специфицирована в предложении CREATE VIEW для этого обзора; поскольку нельзя вставлять или обновлять строки через обзор, который определен запросом, содержащим соединение, опция CHECK OPTION здесь не имеет смысла. См. страницу 2-13.

Расширение определяющего запроса во время создания обзора

В соответствии со стандартом ANSI/ISO, ORACLE расширяет любое групповое обозначение на верхнем уровне определяющего запроса обзора в список столбцов, и сохраняет в словаре данных результирующий обзор; все подзапросы остаются без изменений. Имена столбцов в расширенном списке столбцов заключаются в кавычки, на тот случай, если имена столбцов базового объекта были изначально определены в кавычках, и для гарантии синтаксической корректности запроса.

В качестве примера предположим, что обзор DEPT создается следующим предложением:

CREATE VIEW dept AS SELECT * FROM scott.dept;

ORACLE сохраняет определяющий запрос обзора DEPT в следующем виде:

SELECT "DEPTNO", "DNAME", "LOC" FROM scott.dept

ORACLE не расширяет обобщенные обозначения в обзорах, создаваемых с ошибками (см. следующую секцию). Когда обзор в конце концов будет откомпилирован без ошибок, ORACLE выполняет расширение определяющего запроса.

Создание обзоров с ошибками

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

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

Чтобы создать обзор с ошибками, вы должны включить опцию FORCE команды CREATE VIEW:

CREATE FORCE VIEW AS …;

Когда создается обзор с ошибками, ORACLE возвращает сообщение, указывающее, что обзор был создан с ошибками. Такой обзор имеет состояние INVALID (недействительный). Если позднее условия изменятся так, что недействительный обзор сможет быть выполнен, этот обзор может быть перекомпилирован и станет действительным (VALID).

Привилегии, требуемые для создания обзоров

Чтобы создать обзор, вы должны удовлетворять следующим требованиям:

Замена обзоров

Если вы хотите изменить определение обзора, то обзор должен быть заменен; нельзя изменить определение обзора командой ALTER. Вы можете заменять обзоры следующими способами:

SALES_STAFF, показанный в предыдущем примере (см. страницу 2-9), и назначили несколько объектных привилегий ролям и другим пользователям. Однако теперь вы хотите переопределить обзор SALES_STAFF, чтобы изменить номер отдела, заданный в фразе WHERE, на 30. Вы можете заменить текущую версию обзора SALES_STAFF с помощью следующего предложения:

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

Привилегии, требуемые для замены обзора

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

Использование обзоров

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

SELECT * FROM division1_staff;

ENAME

CLARK
KING
MILLER
ALLEN
WARD
JAMES
TURNER
MARTIN
BLAKE
EMPNO

7782
7839
7934
7499
7521
7900
7844
7654
7698
JOB

MANAGER
PRESIDENT
CLERK
SALESMAN
SALESMAN
CLERK
SALESMAN
SALESMAN
MANAGER
DNAME

ACCOUNTING
ACCOUNTING
ACCOUNTING
SALES
SALES
SALES
SALES
SALES
SALES

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

INSERT INTO sales_staff VALUES (7954, 'OSTER', 30);

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

1. Если обзор определен запросом, содержащим операцию соединения, операторы SET или DISTINCT, фразу GROUP BY или групповую функцию, то через этот запрос нельзя вставлять, обновлять или удалять строки базовых таблиц обзора.

2. Если обзор определен с фразой WITH CHECK OPTION, то через этот запрос нельзя вставлять, обновлять или удалять такие строки базовой таблицы обзора, которые не могут быть выбраны через этот же обзор.

3. Если в обзоре не участвует столбец базовой таблицы, который определен с ограничением NOT NULL и не имеет фразы DEFAULT, то через этот запрос нельзя вставлять строк в базовую таблицу.

4. Если запрос был создан с использованием выражения, такого как DECODE(deptno,10,'SALES',…), то через этот запрос нельзя вставлять или обновлять строки базовых таблиц обзора.

Например, незьзя выдавать предложения DML по обзору DIVISION1_STAFF, так как этот обзор определен запросом, содержащим операцию соединения. Ограничение, созданное фразой WITH CHECK OPTION в обзоре SALES_STAFF, позволяет вставлять или обновлять в таблице EMP через этот обзор лишь строки, имеющие номер отдела (DEPTNO) 10. Альтернативно, предположим, что обзор SALES_STAFF определен с помощью следующего предложения (т.е. из определения исключен столбец DEPTNO):

При этом определении обзора, вы можете обновлять поля EMPNO и ENAME в существующих строках, но вы не можете вставлять через обзор SALES_STAFF новые строки в таблицу EMP, потому что этот обзор не позволяет вам задавать поле DEPTNO (точнее, изменять его значение). Однако, если бы для поля DEPTNO было определено умалчиваемое значение 10, то вы могли бы осуществлять вставки строк.

Обращения к недействительным обзорам

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

ORA-04063: view 'view_name' has errors (запрос 'имя_запроса' имеет ошибки)

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

Привилегии, требуемые для использования обзоров

Чтобы выдавать для обзора запрос или предложение INSERT, UPDATE или DELETE, вы должны иметь для этого обзора объектную привилегию SELECT, INSERT, UPDATE или DELETE, соответственно, полученную либо явно, либо через роль.

Удаление обзоров

Удаляйте обзор с помощью команды SQL DROP VIEW. Например, следующее предложение удаляет обзор с именем SALES_STAFF:

DROP VIEW sales_staff;

Привилегии, требуемые для удаления обзора

Вы можете удалять любой обзор, содержащийся в вашей схеме. Чтобы удалить обзор в схеме другого пользователя, вы должны иметь системную привилегию DROP ANY VIEW.

предыдущая часть | содержание | следующая часть

Отправить ссылку на страницу по e-mail
Обсудить на форуме Oracle


Interface Ltd.
Тel/Fax: +7(095) 105-0049 (многоканальный)
Отправить E-Mail
http://www.interface.ru
Ваши замечания и предложения отправляйте автору
По техническим вопросам обращайтесь к вебмастеру
Документ опубликован: 12.02.01