Глава 24. КАК ДАННЫЕ SQL ХРАНЯТСЯ В УПОРЯДОЧЕННОМ ВИДЕ?

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

КАТАЛОГ СИСТЕМЫ

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

Хотя это - вопрос конкретной программы, а нестандарта ANSI, большинство БД SQL используют набор SQL-таблиц, хранящих служебную информацию, для своих внутренних потребностей. Этот набор называется в различных публикацияхсистемный каталог, словарь данных или просто системные таблицы (Термин "словарь данных" может также относится к общему архиву данных, включая информацию о физических параметрах БД, - данных, которые хранятся вне SQL. Следовательно, имеются программы баз данных, которые имеют и системный каталог, и словарь данных.)

Таблицы системного каталога напоминают обычные SQL-таблицы: те же строки и столбцы данных. Например, одна таблица каталога обычно содержит информацию о таблицах, существующих в БД, по одной строке на каждую таблицу базы данных; другая содержит информацию о различных столбцах таблиц, по одной строке на столбец, и так далее.

Таблицы каталога создаются и заполняются с помощью самой БД и идентифицируются с помощью специальных имён, таких, например, как SYSTEM.

База данных создает эти таблицы и модифицирует их автоматически; таблицы каталога не могут быть непосредственно подвергнуты действию команды модификации. Если это случится, это значительно запутает всю систему и сделает её неработоспособной. Однако в большинстве систем каталог может быть запрошен пользователем. Это очень полезно, потому что это даётвозможность узнать кое-что о БД, которую вы используете. Конечно, не вся информациявсегда доступна всем пользователям. Подобно другим таблицам, доступ к каталогу ограничен для пользователей без соответствующих привилегий. Так как каталог принадлежит самой системе, имеется некоторая неясность относительно того, кто имеет привилегии и кто может предоставить привилегии в этом каталоге. Обычно привилегии каталога предоставляет суперпользователь, например, администратор системы, зарегистрированный как SYSTEM или DBA. Кроме того, некоторые привилегии могут предоставляться пользователям автоматически.

ТИПИЧНЫЙКАТАЛОГ СИСТЕМЫ

Давайте рассмотрим некоторые таблицы, которые мы могли бы найти в типовом каталоге системы:

 Таблицы Содержание
 -------------------------------------------------------- 
 
 SYSTEMCATALOGТаблицы (базовые и представления)
 
 SYSTEMCOLUMNSСтолбцы таблицы
 
 SYSTEMTABLES Каталог представления в SYSTEMCATALOG
 
 SYSTEMINDEXESИндексы в таблице
 
 SYSTEMUSERAUTH Пользователи базы данных
 
 SYSTEMTABAUTHОбъектные привилегии пользователей
 
 SYSTEMCOLAUTHСтолбцовые привилегии пользователей

 SYSTEMSYNONS Синонимы таблиц

Теперь, если наш DBA предоставит пользователю Stephen право просматривать SYSTEMCATALOG такой командой

 GRANT SELECT ON SYSTEMCATALOG TO Stephen;

то Stephen сможет увидеть некоторую информацию обо всех таблицах в БД (мы имеем здесь пользователя DBA, пользователя Chris - владельца трёх наших типовых таблиц, а также Adrian - владельца представления Londoncust).

SELECT tname, owner, numcolumns, type, CO
 FROM SYSTEMCATALOG;


 ===============SQL Execution Log ===============
||
| SELECT tname, owner, numcolumns, type, CO|
| FROMSYSTEMCATALOG; |
||
| ================================================ |
| tnameownernumcolumnstypeCO |
| ------------- ------- -----------------|
| SYSTEMCATALOG SYSTEM4 B|
| Salespeople Chris 4 B|
| Customers Chris 5 B|
| LondoncustAdrian5 VY |
| OrdersChris 5 B|
||
 ==================================================

	Рисунок 24.1 Содержание таблицы SYSTEMCATALOG

Как видите, каждая строка описывает свою таблицу. Первый столбец - имя; второй - имя пользователя, который владеет ею; третий - число столбцовтаблицы; четвертый - код из одного символа: это или B (для базовой таблицы), или V (для представления). Последний столбец имеет пустые (NULL) значения, если его тип не равен V, и этот столбец указывает, определена или нет возможность проверки.

Обратите внимание что SYSTEMCATALOG (СИСТЕМНЫЙ КАТАЛОГ) представлен как одна из таблиц в вышесказанном списке. Для простоты мы исключили остальные каталоги системы из вывода. Таблицы системного каталога обычно показываются в SYSTEMCATALOG.

ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ В ТАБЛИЦАХ КАТАЛОГА

Поскольку SYSTEMCATALOG это таблица, вы можете использовать её в представлении. Фактически можно считать, что имеется такое представление с именем SYSTEMTABLES.

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

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

 CREATE VIEW Datatables
AS SELECT *
 FROM SYSTEMCATALOG
 WHERE owner < > 'SYSTEM';

РАЗРЕШИТЬ ПОЛЬЗОВАТЕЛЯМ ВИДЕТЬ (ТОЛЬКО) ИХ СОБСТВЕННЫЕ ОБЪЕКТЫ

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

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

 CREATE VIEW Owntables
 AS SELECT *
FROM SYSTEMCATALOG
WHERE Owner = USER;

Теперь вы можете предоставить всем пользователям доступ к этому представлению:

GRANT SELECT ON Owntables TO PUBLIC;

Каждый пользователь теперь способен выбирать (SELECT) только те строки из SYSTEMCATALOG, владельцем которых он сам является.

ПРЕДСТАВЛЕНИЕ SYSTEMCOLUMNS

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

Сначала давайте рассмотрим ту часть таблицы SYSTEMCOLUMNS, которая описывает наши типовые таблицы (другими словами, исключим сам каталог):

 tnamecname datatypecnumbertabowner
 ---------------- -----------------------

 Salespeoplesnuminteger1Diane

 Salespeoplesname char 2Diane

 Salespeoplecitychar 3Diane

 Salespeoplecommdecimal4Diane

 Customerscnuminteger1Claire

 Customerscname char 2Claire

 Customerscitychar 3Claire

 Customersratinginteger4Claire

 Customerssnuminteger5Claire

 Orders onuminteger1Diane

 Orders odate date 2Diane

 Orders amt decimal3Diane

 Orders cnuminteger4Diane

 Orders snuminteger5Diane

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

Следовательно, табличные столбцы: tname (имя таблицы), tabowner (владелец таблицы) и cname (имя столбца) вместе составляют первичный ключ этой таблицы. Столбец datatype (тип данных) говорит сам за себя. Столбец cnumber (номер столбца) указывает на местоположение этого столбца внутри таблицы. Для упрощения мы опустили параметры длины столбца, точности и масштаба.

Для справки показана строка из SYSTFMCATALOG, которая ссылается на эту таблицу:

tname ownernumcolumns type CO
--------------------------------------

SYSTEMCOLUMNSSystem 8 B

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

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

CREATE VIEW Owncolumns
 AS SELECT *
FROM SYSTEMCOLUMNS
WHERE tabowner = USER;

GRANT SELECT ON Owncolumns TO PUBLIC;

КОММЕНТАРИЙ В СОДЕРЖАНИИ КАТАЛОГА

Большинство версий SQL, позволяютпомещать комментарии (ремарки) в специальные столбцы пояснений таблиц каталогов SYSTEMCATALOG и SYSTEMCOLUMNS, что удобно, так как эти таблицы не всегда могут объяснить свое содержание. Для простоты мы пока исключали этот столбец из наших иллюстраций. Можно использовать команду COMMENT ON со строкой текста, чтобы пояснить любую строку в одной из этих таблиц. Состояние TABLE - для комментирования в SYSTEMCATALOG, а текст COLUMN - для SYSTEMCOLUMNS. Например:

 COMMENT ON TABLE Chris.Orders

 IS 'Current Customer Orders';

Текст будет помещен в столбец пояснений SYSTEMCATALOG. Обычно максимальная длина таких пояснений - 254 символа.

Сам комментарий указывается для конкретной строки, один с tname=Orders, а другой owner=Chris. Мы увидим этот комментарий в строкетаблицы Заказов в SYSTEMCATALOG:

 SELECT tname, remarks
FROM SYSTEMCATALOG
WHERE tname = 'Orders'
 AND owner = 'Chris';

Вывод для этого запроса показан на Рисунке 24.2.

SYSTEMCOLUMNS работает точно так же. Сначала мы создаём комментарий

 COMMENT ON COLUMN Orders.onum
IS 'Order #';

затем выбираем эту строку из SYSTEMCOLUMNS:

 SELECT cnumber, datatype, cname, remarks
FROM SYSTEMCOLUMNS
WHERE tname = 'Orders'
 AND tabowner = 'Chris'
 AND cname = onum;

Вывод для этого запроса показан на Рисунке 24.3.

Чтобы изменить комментарий, вы можете просто ввести новую команду COMMENT ON для той же строки. Новый комментарий будет записан поверх старого. Если вы хотите удалить комментарий, напишите поверх него пустой комментарий:

COMMENT ON COLUMN Orders.onum
 IS '';

и этот пустой комментарий затрёт предыдущий.

 ===============SQL Execution Log ===============
||
| SELECT tname, remarks|
| FROMSYSTEMCATALOG|
| WHERE tname = 'Orders' |
| AND owner = 'Chris'|
| ;|
| ================================================ |
| tnameremarks |
| ------------- -----------------------|
| OrdersCurrent Customers Orders |
||
 ==================================================

	Рисунок 24.2 Комментарий в SYSTEMCATALOG


 ===============SQL Execution Log ===============
||
| SELECT cnumber, datatype, cname, remarks |
| FROMSYSTEMCOLUMNS|
| WHERE tname = 'Orders' |
| AND tabowner = 'Chris' |
| AND cname = 'onum' |
| ;|
| ================================================ |
| cnumberdatatypecnameremarks|
| ---------- --------- ------------------|
|1 integer onumOrders #|
||
 ==================================================

 	 Рисунок 24.3 Комментарий в SYSTEMCOLUMNS

ОСТАЛЬНОЕ СОДЕРЖИМОЕ КАТАЛОГА

Здесь показаны определения остальных ваших системных таблиц с типовым запросом для каждого:

SYSTEMINDEXES - ИНДЕКСАЦИЯ В БАЗЕ ДАННЫХ

Имена столбцов в таблице SYSTEMINDEXES и их описания:

СТОЛБЕЦОПИСАНИЕ
------------------------------------------------------------ 

iname 		 Имя индекса (используемое для его исключения)

iowner Имя пользователя, создавшего индекс

tnameИмя таблицы, которая содержит индекс

cnumberНомер столбца в таблице

tabowner Пользователь, который владеет таблицей, содержащей индекс

numcolumns Число столбцов в индексе

cpositionПозиция текущего столбца среди набора индексов

isunique Уникален ли индекс (Y или N)


ТИПОВОЙ ЗАПРОС
Индекс считается неуникальным, если он вызывает продавца в snum-столбце таблицы Заказчиков:

SELECT iname, iowner, tname, cnumber, isunique
FROM SYSTEMINDEXES
WHERE iname = 'salesperson';

Вывод для этого запроса показан на Рисунке 24.4.

 ===============SQL Execution Log ================
| |
| SELECT iname, iowner, tname, cnumber, isunique|
| FROMSYSTEMINDEXES |
| WHERE iname = 'salespeople' |
| ; |
| ================================================= |
| inameiowner tname cnumberisunique |
| --------------------------- --------------- |
| salespersonStephanCustomers 5 N |
| |
 ===================================================

Рисунок 24.4 Строка из таблицы SYSTEMINDEXES
SYSTEMUSERAUTH - ПОЛЬЗОВАТЕЛЬСКИЕ И СИСТЕМНЫЕ ПРИВИЛЕГИИ В БАЗЕ ДАННЫХ

Имена столбцов для SYSTEMUSERAUTH и их описания:

СТОЛБЕЦОПИСАНИЕ 
-------------- ----------------------------------------------- 

username	 Идентификатор (ID) доступа пользователя

password 	 Пароль пользователя, вводимый при регистрации

resource 	 Где пользователь имеет права RESOURCE

dba	 Где пользователь имеет права DBA

Мы будем использовать простую схему системных привилегий из Главы 22, где были представлены три системные привилегии: CONNECT (ПОДКЛЮЧИТЬ), RESOURCE (РЕСУРСЫ) и DBA.

Все пользователи получают CONNECT по умолчанию при регистрации, поэтому она не описана в таблице выше. Возможные состояния столбцов resource и dba: Y (Да, пользователь имеет привилегии) или No (Нет, пользователь не имеет привилегий).

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

ТИПОВОЙ ЗАПРОС Чтобы найти всех пользователей, которые имеют привилегию RESOURCE, и увидеть, какие из них - DBA, вы можете ввести следующее условие:

 SELECT username, dba
FROM SYSTEMUSERAUTH
WHERE resource = 'Y';

Вывод для этого запроса показан на Рисунке 24.5.

SYSTEMTABAUTH - ПРИВИЛЕГИИ ОБЪЕКТА, КОТОРЫЕ НЕ ОПРЕДЕЛЯЮТ АВТОРИЗАЦИЮ СТОЛБЦА

Здесь показаны имена столбцов в таблице SYSTEMTABAUTH и их описания:

СТОЛБЕЦ ОПИСАНИЕ
--------------------------------------------------------- 
username	Пользователь, который имеет привилегии

grantor 	Пользователь, который передает привилегии по имени пользователя

tname 	Имя таблицы, в которой существуют привилегии

owner 	Владелец tname

selauth 	Имеет ли пользователь привилегию SELECT

insauth 	Имеет ли пользователь привилегию INSERT

delauth 	Имеет ли пользователь привилегию DELETE

Возможные значениякаждой из перечисленных привилегий объекта (имена столбцов которых оканчиваются на auth): Y, N и G.

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

 ===============SQL Execution Log ================
| |
| SELECT username, dba|
| FROMSYSTEMUSERAUTH|
| WHERE resource = 'Y'|
| ; |
| ================================================= |
| usernamedba |
| ----------------- |
|Diane N|
|AdrianY|
| |
===================================================

Рисунок 24.5 Пользователи, имеющие привилегию RESOURCE

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

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

ТИПОВОЙ ЗАПРОС Чтобы найти все привилегии SELECT, INSERT и DELETE, которые Adrian предоставляет пользователям в таблице Заказчиков, вы можете ввести следующее (вывод показан на Рисунке 24.6):

SELECT username, selauth, insauth, delauth
FROM SYSTEMTABAUTH
WHERE grantor = 'Adrian'
 ANDtname = 'Customers';

 ===============SQL Execution Log ================
| |
| SELECT username, selauth, insauth, delauth|
| FROMSYSTEMTABAUTH |
| WHERE grantor = 'Adrian'|
| AND tname = 'Customers' |
| ; |
| ================================================= |
| username selauthinsauthdelauth|
| -------------------------- -------- |
|ClaireGYN|
|NormanYYY|
| |
===================================================

Рисунок 24.6 Пользователи, получившие привилегии от Adrian 

Выше показано, что Adrian предоставил Claire привилегии INSERT и SELECT в таблице Заказчиков, позднее предоставив ей права на передачу привилегий. Пользователю Norman он предоставил привилегии SELECT, INSERT и DELETE, но не дал возможность передачиниодной из них. Если Claire имела привилегию DELETE в таблице Заказчиков от какого-то другого источника, в этом запросе это показано не будет.

SYSTEMCOLAUTH - ПРИВИЛЕГИИ ОБЪЕКТА, КОТОРЫЕ ОПРЕДЕЛЯЮТ АВТОРИЗАЦИЮ СТОЛБЦА
СТОЛБЕЦ		ОПИСАНИЕ
------------- -------------------------------------------

username	Пользователь, который имеет привилегии

grantor 	Пользователь, который предоставляет привилегии другому пользователю 

tname 	Имя таблицы, в которой существуют привилегии

cname 	Имя столбца, в котором существуют привилегии

owner 	Владелец tname

updauth 	Имеет ли пользователь привилегию UPDATE в этом столбце

refauth 	Имеет ли пользователь привилегию REFERENCES в этом столбце

Столбцы updauth и refauth могут быть в состоянии Y, N или G, но не могут быть одновременно в состоянии N в одной и той же строке. Это первые пять столбцов таблицы, которые не составляют первичный ключ. Он отличается от первичного ключа SYSTEMTABAUTH, в котором содержится поле cname, указывающее на определенный столбец обсуждаемой таблицы, для которой применяются одна или обе привилегии. Отдельная строка в этой таблице может существовать для каждого столбца в любой данной таблице, в которой одному пользователю передаются привилегии определенного столбца с помощью другого пользователя.

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

ТИПОВОЙ ЗАПРОС Чтобы выяснить, в каких столбцах какой таблицы вы имеете привилегию REFERENCES, вы можете ввести следующий запрос (вывод показан на Рисунке 24.7):

SELECT owner, tname, cname
 FROM SYSTEMCOLAUTH
 WHERE refauth IN ('Y', 'G')
AND username = USE 
 ORDER BY 1, 2;

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

 ===============SQL Execution Log ================
| |
| SELECT OWNER, TNAME, CNAME|
| FROMSYSTEMCOLAUTH |
| WHERE refaulth IN ('Y' , 'G' )|
| AND username = USER |
| ORDER BY 1, 2 |
| ; |
| ================================================= |
| owner tname cname |
| ----------------------------- |
|Diane Customers cnum |
|Diane Salespeople sname|
|Diane Salespeople sname|
|GillanCustomers cnum |
===================================================

Рисунок 24.7 Столбцы, в которых пользователь имеет привилегию INSERT
SYSTEMSYNONS - СИНОНИМЫ ДЛЯ ТАБЛИЦ В БАЗЕ ДАННЫХ

Этоимена столбцов в таблице SYSTEMSYNONS и их описания:

СТОЛБЕЦ 	ОПИСАНИЕ 
------------- -------------------------------------------- 
synonym	Имя синонима

synowner 	Пользователь, который является владельцем синонима (может быть PUBLIC (ОБЩИЙ))

tname	Имя таблицы, используемой владельцем

tabowner 	Имя пользователя, который является владельцем таблицы

ТИПОВОЙ ЗАПРОС Предположим, что Adrian имеет синоним Clients для таблицы Заказчиков, принадлежащей Diane, и что имеется общий синоним Customers для этой же таблицы. Вы делаете запрос таблицы для всех синонимов в таблице Заказчиков (вывод показан на Рисунке 24.8):

SELECT *
FROM SYSTEMSYNONS
WHERE tname = 'Customers'


 ===============SQL Execution Log ================
| |
| SELECT *|
| FROMSYSTEMSYNONS|
| WHERE tname = 'Customers' |
| ; |
| ================================================= |
| synonym synownertname tabowner|
| ------------------------------------------|
|ClientsAdrianCustomers Diane |
|CustomersPUBLICCustomers Diane |
| |
===================================================

 Рисунок 24.8 Синонимы для таблицы Заказчиков

ДРУГОЕ ИСПОЛЬЗОВАНИЕ КАТАЛОГА

Конечно, вы можете выполнять более сложные запросы в системном каталоге. Объединения, например, могут быть очень удобны.
Эта команда позволит вам увидеть столбцы таблиц и базовые индексы, установленные для каждого (вывод показан на Рисунке 24.9):

SELECT a.tname, a.cname, iname, cposition
FROM SYSTEMCOLUMNS a, SYSTEMINDEXES b
WHERE a.tabowner = b. tabowner
 AND a.tname = b.tname
 AND a.cnumber = b.cnumber
ORDER BY 3 DESC, 2;

Она показывает два индекса: один - для таблицы Заказчиков и один - для таблицы Продавцов. Последний из них это одностолбцовый индекс с именем salesno в поле snum; он был помещён первым из-за сортировки по убыванию (в обратном алфавитном порядке) в столбце iname. Другой индекс, custsale, используется продавцами, чтобы отыскивать своих заказчиков. Он основывается на комбинации полей snum и cnum внутри таблицы Заказчиков с полем snum, приходящим в индексе первым, как это и показано с помощью поля cposition.

 ===============SQL Execution Log ================
| |
| SELECT a.tname, a.cname, iname, cposition |
| FROMSYSTEMCOLUMNS a, SYSTEMINDEXES b|
| WHERE a.tabowner = b.tabowner |
| AND a.tname = b.tname |
| AND a.cnumber = b.cnumber |
| ORDER BY 3 DESC, 2; |
| |
| ================================================= |
|tnamecname iname cposition |
| --------------------------------------|
| Salespeople sname salesno1|
| Customers cnumcustsale 2|
| Customers snumcustsale 1|
| |
 ===================================================

	 Рисунок 24.9 Столбцы и их индексы

Подзапросы также могут быть использованы. Имеется способ увидеть данные столбца только для столбцов из таблиц каталога:

SELECT *
FROM SYSTEMCOLUMNS
WHERE tname IN
(SELECT tname
FROM SYSTEMCATALOG);

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

РЕЗЮМЕ

Итак, система SQL использует набор таблиц, называемый системным каталогом, в структуре базы данных. Эти таблицы могут запрашиваться, но не модифицироваться. Кроме того, вы можете добавлять комментарии столбцов в (и удалять их из) таблицы SYSTEMCATALOG и SYSTEMCOLUMNS.

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

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

РАБОТА СО SQL

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

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

3. Выясните, сколько таблиц имеют индексы в более чем пятидесяти процентах их столбцов.

(См. ответы в Приложении A.)