Дейт К. Д27 Руководство по реляционной субд db2/ Пер с англ и предисл. М. Р. Когаловского

Вид материалаРуководство
Глава 7 каталог 7.1. введение
7.2. Запросы по каталогу
7.3. Обновление каталога
Что касается системы, DB2, то столбец НОМЕР_ПОСТАВЩИКА в таблице S теперь больше бы не существовал
Ответы к некоторым упражнениям
Подобный материал:
1   ...   4   5   6   7   8   9   10   11   ...   34

ГЛАВА 7

КАТАЛОГ




7.1. ВВЕДЕНИЕ



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

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

— SYSTABLES

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

SYSTABLES

NAME

CREATOR

COLCOUNT

. . . .




S

P

SP

КДДЕЙТ

КДДЕЙТ

КДДЕЙТ

4

5

3

. . . .

. . . .

. . . .




SYSCOLUMNS

NAME

TBNAME

COLTYPE

. . . .




НОМЕР_ПОСТАВЩИКА

ФАМИЛИЯ

СОСТОЯНИЕ

ГОРОД

НОМЕР_ДЕТАЛИ

НАЗВАНИЕ

ЦВЕТ

ВЕС

ГОРОД

НОМЕР_ПОСТАВЩИКА

НОМЕР_ДЕТАЛИ

КОЛИЧЕСТВО


S

S

S

S

Р

Р

Р

Р

Р

SP

SP

SP

CHAR

CHAR

SMALLINT

CHAR

CHAR

CHAR

CHAR

SMALLINT

CHAR

CHAR

CHAR

INTEGER

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .




SYSINDEXES

NAME

TBNAME

CREATOR

. . . .




XS

XP

XSP

XSC

S

P

SP

XSP

КДДЕЙТ

КДДЕЙТ

КДДЕЙТ

КДДЕЙТ

. . . .

. . . .

. . . .

. . . .


Рис. 7.1. Структура каталога для базы данных поставщиков и деталей


— SYSCOLUMNS

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

— SYSINDEXES

В этой таблице каталога содержится строка для каждого индекса в системе. Для каждого такого индекса в ней указано его имя (NAME), имя индексируемой таблицы (TBNAME), имя создавшего индекс пользователя (CREATOR) и т. д. Для примера на рис. 7.1 показана в общих чертах структура каталога для базы данных поставщиков и деталей. При этом, конечно, опущены почти все подробности.

7.2. ЗАПРОСЫ ПО КАТАЛОГУ



Поскольку каталог состоит из таблиц, точно таких же, как обычные пользовательские таблицы, из него можно запрашивать данные с помощью предложений SELECT языка SQL так же, как из обычных таблиц. Например, чтобы узнать, какие таблицы содержат столбец НОМЕР-ПОСТАВЩИКА, можно использовать следующий запрос:

SELECT TBNAME

FROM SYSIBM.SYSCOLUMNS

WHERE NAME = 'НОМЕР_ПОСТАВЩИКА';

Результат:

TBNAME

S

SP

«Создателем» таблиц каталога считается SYSIBM. Поэтому для того, чтобы обратиться к таблице каталога, например SYSCOLUMNS, необходимо использовать SYSIBM в качестве префикса для имени таблицы, как во фразе FROM рассмотренного примера. В противном случае система DB2 будет предполагать, что Вы обращаетесь к Вашей собственной таблице, т. е. префиксом по умолчанию является Ваше собственное имя, известное системе, как пояснялось в главе 3.

Другой пример. Из каких столбцов состоит таблица S?

SELECT NAME

FROM SYSIBM. SYSCOLUMNS

WHERE TBNAME == 'S';

Результат:

NAME

НОМЕР_ПОСТАВЩИКА

ФАМИЛИЯ

СОСТОЯНИЕ

ГОРОД

И еще один пример. Сколько таблиц создал пользователь КДДЕЙТ?

SELECT COUNT(*)

FROM SYSIBM.SYSTABLES

WHERE CREATOR = 'КДДЕЙТ';

Пользователь, незнакомый со структурой базы данных, может с помощью подобного рода запросов получить информацию об этой структуре. Например, пользователь, которому требуется сформулировать запросы к базе данных, скажем, поставщиков и деталей, но который не располагает какими-либо подробными знаниями относительно того, какие в точности таблицы существуют в этой базе данных и из каких именно столбцов они состоят, может воспользоваться запросами к каталогу и сначала получить нужные знания, а затем перейти к .формулировке собственно запроса на данные. В традиционной (нереляционной) системе такие первоначальные запросы обычно должны были бы направляться к системному словарю данных, а не к базе данных (На самом деле, представление каталога (метаданных) базы данных как части самой базы данных, доступной не только СУБД, но и пользователю с помощью обычных средств манипулирования данными, не является прерогативой реляционных систем. Такой подход может быть реализован в СУБД, основанных и на других моделях данных. Обсуждение этого вопроса можно найти в работе: Когаловский М. Р., Виноградов М. М., Макальский К. И. Самоописываемые базы данных и реализация СУБД//Математические и реализационные проблемы СУБД.—М.: ЦЭМИ АН СССР, 1981—С. 31—53— Примеч. пер.) В действительности, каталог системы DB2 может рассматриваться как рудиментарный словарь — рудиментарный в том смысле, что он содержит только информацию, которая непосредственно необходима DB2, тогда как полноценный словарь данных обычно содержит много дополнительной информации, например о том, какие отчеты получают различные отделы. Важное отличие и существенное, с точки зрения легкости использования, достоинство системы DB2 заключаются в том, что запросы к каталогу и к базе данных осуществляются через один и тот же интерфейс, а именно—SQL. Напротив, в традиционных системах словарь и база данных всегда различались, и доступ к ним осуществлялся через различные интерфейсы. Интересно подумать о том, можно ли будет когда-либо расширить каталог системы DB2 с тем, чтобы он мог обеспечивать функции развитого словаря (такое расширение должно быть достаточно простым для реализации).

7.3. ОБНОВЛЕНИЕ КАТАЛОГА



Выше было показано, каким образом можно запрашивать сведения из каталога с помощью предложения SELECT языка SQL. Однако нельзя обновлять каталог, используя предложения SQL UPDATE, DELETE и INSERT, и система DB2 будет отвергать любые попытки сделать это. Причина, конечно, заключается в том, что потенциально было бы очень опасно допустить такие операции: можно было бы слишком легко умышленно или неумышленно разрушить информацию в каталоге, так что DB2 не смогла бы больше правильно функционировать. Предположим, например, что было бы допустимо предложение:

DELETE

FROM SYSIBM. SYSCOLUMNS

WHERE TBNAME = 'S'

AND NAME = 'НОМЕР_ПОСТАВЩИКА';

Результатом его было бы удаление строки ('НОМЕР_ПОСТАВЩИКА','S','CHAR',. ..) из таблицы SYSCOLUMNS. Что касается системы, DB2, то столбец НОМЕР_ПОСТАВЩИКА в таблице S теперь больше бы не существовал, т. е. DB2 не располагала бы больше какими-либо знаниями об этом столбце. Поэтому попытки доступа к данным на основе значений в этом столбце, например:

SELECT ГОРОД

FROM S

WHERE НОМЕР_ПОСТАВЩИКА = 'S4';

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

По причинам такого рода операции UPDATE, DELETE и INSERT для таблиц в каталоге, как уже указывалось, не допускаются. Такие обновления осуществляются с помощью предложений определения данных (CREATE TABLE, CREATE INDEX и т. д.). Например, предложение CREATE TABLE для таблицы S приводит: а) к созданию записи для S в таблице SYSTABLES и б) к созданию в таблице SYSCOLUMNS множества из четырех записей, по одной для каждого из четырех столбцов таблицы S. Оно вызывает также и ряд других действий, которые, однако, не имеют отношения к нашему обсуждению здесь. Следовательно, предложение CREATE является в некотором смысле аналогом INSERT для каталога. Таким же образом, предложение DROP — аналог DELETE, a ALTER — аналог UPDATE.

Кстати, каталог, конечно, включает также и записи для самих таблиц каталога. Однако эти записи не создаются с помощью явных операций CREATE TABLE. Они создаются автоматически самой системой DB2, как часть процедуры установки системы. Они фактически «зашиты» в систему.

Хотя, как мы только что видели, обычные предложения обновления данных SQL не могут использоваться для обновления каталога, имеется одно предложение SQL, а именно, COMMENT, которое реализует некоторого рода функцию обновления каталога. Каждая из таблиц каталога SYSTABLES и SYSCOLUMNS включает столбец, не показанный на рис. 7.1, называемый REMARKS (комментарии), который может в каждой конкретной строке рассматриваемой таблицы содержать текстовую строку, описывающую объект, идентифицируемый остальной частью этой строки. Предложение COMMENT позволяет вводить такие описания в столбец REMARKS в эти две таблицы. В следующих примерах иллюстрируются два основных формата этого предложения. Первый пример:

COMMENT ON TABLES IS

'Каждая строка представляет одного поставщика';

Специфицированная в этом примере текстовая строка запоминается в поле REMARKS таблицы SYSTABLES в строке для таблицы S, замещая значение, ранее запомненное в этой позиции. Заметим, что таблица, указываемая фразой «TABLE имя-таблицы» в предложении COMMENT, может быть либо базовой таблицей, либо представлением. Другой пример:

COMMENT ON COLUMN Р.ГОРОД IS

'Местоположение (единственного) склада, где хранится эта деталь’;

Специфицированная строка запоминается в поле REMARKS таблицы SYSCOLUMNS в строке для столбца Р.ГОРОД, замещая значение, ранее запомненное в этой позиции. Вообще говоря, специфицированный столбец может быть столбцом либо базовой таблицы, либо представления.

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

7.4. СИНОНИМЫ



Удобно завершить эту главу кратким обсуждением вопроса о синонимах, хотя он, в действительности, и не имеет отношения к каталогу как таковому, за исключением того, что синонимы записываются в каталог, как и многие другие объекты. Если говорить кратко, синоним представляет собой альтернативное имя таблицы — базовой таблицы или представления. В частности, можно определить синоним для таблицы, которая была создана каким-либо другим пользователем и для которой Вы должны были бы в противном случае использовать полностью уточненное имя. Например, пользователь АЛЬФА издает предложение:

CREATE TABLE ПРИМЕР. . .;

Пользователь БЕТА может обращаться к этой таблице, указывая АЛЬФА.ПРИМЕР:

SELECT *

FROM АЛЬФА.ПРИМЕР;

С другой стороны, пользователь БЕТА может издать предложение CREATE SYNONYM IJK FOR АЛЬФА.ПРИМЕР;

и может теперь обращаться к этой таблице, указывая просто IJK, например:

SELECT *

FROM IJK,

Имя IJK является совершенно приватным и локальным для пользователя БЕТА. Другой пользователь ГАММА также может иметь приватное и локальное имя IJK, отличное от имени, введенного пользователем БЕТА.

Другой пример:

CREATE SYNONYM ТАБЛИЦЫ FOR SYSIBM.SYSTABLES;

Имеется также предложение DROP SYNONYM (уничтожить синоним). Его синтаксис:

DROP SYNONYM синоним;

Например:

DROP SYNONYM ТАБЛИЦЫ;

УПРАЖНЕНИЯ



7.1. Сделайте набросок элементов каталога для базы данных поставщиков-деталей-изделий.

Напишите теперь предложения SELECT для следующих запросов (упражнения 7 2—7.8).

7.2. В какие таблицы входит столбец ГОРОД?

7.3. Сколько имеется столбцов в таблице поставок?

7.4. Составьте список имен всех таблиц каталога;

7.5. Составьте список фамилий всех пользователей, которыми были созданы таблицы со столбцом ГОРОД, вместе с именами этих таблиц.

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

7.7. Составьте список всех таблиц, для которых имеется по крайней мере один индекс.

7.8. Составьте список имен всех таблиц, для которых имеется более одного индекса.

7.9. Запишите предложения для того, чтобы сделать следующее:

а) Создать подходящий комментарий для таблицы SPJ.

б) Заменить этот комментарий на «Игнорировать предыдущий комментарий».

в) Создать подходящий комментарий для столбца НОМЕР_ДЕТАЛИ в таблице SPJ.

г) Создать подходящий комментарий для индекса XS.

д) Создать подходящий синоним для таблицы SYSCOLUMNS.

е) Уничтожить этот синоним.

ОТВЕТЫ К НЕКОТОРЫМ УПРАЖНЕНИЯМ



Как обычно, следующие решения не обязательно являются единственными.

7.2. SELECT TBNAME

FROM SYSIBM.SYSCOLUMNS

WHERE NAME = 'ГОРОД';

7.3. SELECT COLCOUNT

FROM SYSIBM.SYSTABLES,

WHERE NAME= 'SPJ';

7.4. SELECT NAME

FROM SYSIBM.SYSTABLES

WHERE CREATOR = 'SYSIBM';

7.5. SELECT CREATOR, NAME

FROM SYSIBM. SYSTABLES

WHERE NAME IN

(SELECT ТВNAME

FROM SYSIBM. SYSCOLUMNS

WHERE NAME = 'ГОРОД');

7.6. SELECT CREATOR, COUNT (*)

FROM SYSIBM.SYSTABLES

GROUP BY CREATOR;

7.7. SELECT ТВNAME

FROM SYSIBM. SYSINDEXES;

7.8. SELECT TBNAME

FROM SYSIBM. SYSINDEXES

GROUP BY TBNAME

HAVING COUNT (NAME) > 1;

7.9.

a) COMMENT ON TABLE SPJ IS 'Подходящий комментарий';

6) COMMENT ON TABLE SPJ IS 'Игнорировать предыдущий комментарий';

в) COMMENT ON COLUMN SPJ. НОМЕР_ДЕТАЛИ IS 'Подходящий комментарий';

г) Хитрый вопрос! В системе не предусматривается COMMENT ON для индекса.

д) CREATE SYNONYM СТОЛБЦЫ FOR SYSIBM.SYSCOLUMNS;

е) DROP SYNONYM СТОЛБЦЫ;