Перейти к оглавлению
           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        |
         | FROM  SYSTEMCATALOG;                             |
         |                                                  |
         | ================================================ |
         |   tname          owner    numcolumns  type  CO   |
         | -------------   -------   ----------  ----  ---  |
         | SYSTEMCATALOG   SYSTEM            4     B        |
         | Salespeople     Chris             4     B        |
         | Customers       Chris             5     B        |
         | Londoncust      Adrian            5     V    Y   |
         | Orders          Chris             5     B        |
         |                                                  |
          ==================================================
 
 
 Рисунок 24.1: Содержание таблицы SYSTEMCATALOG
 
 
   Как вы можете видеть,  каждая строка описывает свою таблицу.  Первый
 столбец - имя;  второй - имя пользователя который владеет ею; третий -
 число столбцов которые содержит таблица;  и четвертый - код из  одного
 символа,  это  или B ( для базовой таблицы ) или V ( для представления
 ).  Последний столбец имеет пустые(NULL) значения, если его тип не ра-
 вен V;  и этот столбец указывает,  определена или нет возможность про-
 верки.  Обратите внимание что SYSTEMCATALOG(СЧИСТЕМНЫЙ КАТАЛОГ) предс-
 тавлен как одна из таблиц в вышеуказаном списке. Для простоты, мы иск-
 лючили остальные каталоги системы из вывода.  Таблицы системного ката-
 лога обычно показываются в SYSTEMCATALOG.
 
 
            ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ В ТАБЛИЦАХ КАТАЛОГА
 
 
   Поскольку SYSTEMCATALOG  - это таблица,  вы можете использовать ее в
 представлении. Фактически можно считать, что имеется такое представле-
 ние  с  именем SYSTEMTABLES.  Это представление SYSTEMCATALOG содержит
 только те таблицы, которые входят в системный каталог; это обычно таб-
 лицы базы данных, типа таблицы Продавцов, которые показаны в SYSTEMCA-
 TALOG,  но не в 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, кото-
 рая описывает наши типовые таблицы( другими словами,  исключим сам ка-
 талог):
 
 
    tname      cname   datatype  cnumber  tabowner
 ----------------------------------------------------
  Salespeople  snum    integer      1      Diane
  Salespeople  sname   char         2      Diane
  Salespeople  city    char         3      Diane
  Salespeople  comm    decimal      4      Diane
  Customers    cnum    integer      1      Claire
  Customers    cname   char         2      Claire
  Customers    city    char         3      Claire
  Customers    rating  integer      4      Claire
  Customers    snum    integer      5      Claire
  Orders       onum    integer      1      Diane
  Orders       odate   date         2      Diane
  Orders       amt     decimal      3      Diane
  Orders       cnum    integer      4      Diane
  Orders       snum    integer      5      Diane
 
 
   Как вы можете видеть,  каждая строка этой таблицы показывает столбец
 таблицы в базе данных.  Все столбцы данной таблицы должны иметь разные
 имена,  также как каждая таблица должна иметь данного пользователя,  и
 наконец все комбинации пользователей,  таблиц,  и имен столбцов должны
 различаться между собой.
   Следовательно табличные  столбцы:  tname  ( имя таблицы ),  tabowner
 (владелец таблицы ),  и cname ( имя столбца ),  вместе составляют пер-
 вичный  ключ этой таблицы.  Столбец datatype( тип данных ) говорит сам
 за себя. Столбец cnumber ( номер столбца ) указывает на местоположении
 этого  столбца  внутри таблицы.  Для упрощения,  мы опустили параметры
 длины столбца, точности, и масштаба.
   Для справки,  показана  строка  из SYSTFMCATALOG которая ссылается к
 этой таблице:
 
 
      tname          owner   numcolumns   type   CO
     -----------------------------------------------
      SYSTEMCOLUMNS  System     8          B
 
 
 
 
   Некоторые SQL реализации, будут обеспечивать вас большим количеством
 данных чем показано в этих столбцах,  но показанное  являются  основой
 для любый реализаций.
   Для иллюстрации процедуры предложенной в начале этого раздела,  име-
 ется  способ,  позволяющий каждому пользователю видеть информацию SYS-
 TEMCOLUMNS только для принадлежащих ему таблиц:
 
 
           CREATE VIEW Owncolumns
              AS SELECT *
                 FROM SYSTEMCOLUMNS
                 WHERE tabowner = USER;
 
 
           GRANT SELECT ON Owncolumns TO PUBLIC;
 
 
 
 
                             КОММЕНТАРИЙ В
             ==========  СОДЕРЖАНИИ КАТАЛОГА   ============
 
 
   Большинство версий SQL,  позволяют вам помещать комментарии(ремарки)
 в специальные столбцы пояснений таблиц каталогов SYSTEMCATALOG и  SYS-
 TEMCOLUMNS,  что удобно, так как эти таблицы не всегда могут объяснить
 свое содержание. Для простоты, мы пока исключали этот столбец из наших
 иллюстраций.
   Можно использовать команду COMMENT ON со строкой текста, чтобы пояс-
 нить любую строку в одной из этих таблиц.  Состояние - TABLE, для ком-
 ментирования в SYSTEMCATALOG,  и текст -  COLUMN,  для  SYSTEMCOLUMNS.
 Например:
 
 
                COMMENT ON TABLE Chris.Orders
                   IS 'Current Customer Orders';
 
 
 Текст будет помещен в столбец пояснений SYSTEMCATALOG.  Обычно, макси-
 мальная длина таких пояснений - 254 символов.
   Сам комментарий, указывается для конкретной строки, одна с tname=Or-
 ders,  а  другая 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                            |
         | FROM  SYSTEMCATALOG                              |
         | WHERE tname = 'Orders'                           |
         | AND owner = 'Chris'                              |
         | ;                                                |
         | ================================================ |
         |   tname          remarks                         |
         | -------------   -----------------------          |
         | Orders          Current Customers Orders         |
         |                                                  |
          ==================================================
 
 
    Рисунок 24.2:  Коментарий в SYSTEMCATALOG
 
 
          ===============  SQL Execution Log ===============
         |                                                  |
         | SELECT cnumber, datatype, cname, remarks         |
         | FROM  SYSTEMCOLUMNS                              |
         | WHERE tname = 'Orders'                           |
         | AND tabowner = 'Chris'                           |
         | AND cname = 'onum'                               |
         | ;                                                |
         | ================================================ |
         |   cnumber      datatype    cname    remarks      |
         | ----------     ---------   ------  ------------  |
         |          1     integer     onum    Orders #      |
         |                                                  |
          ==================================================
 
 
    Рисунок 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    |
         | FROM  SYSTEMINDEXES                               |
         | WHERE iname = 'salespeople'                       |
         | ;                                                 |
         | ================================================= |
         |   iname      iowner   tname     cnumber  isunique |
         | -----------  ------  ---------- -------  -------- |
         | salesperson  Stephan  Customers       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 и их описание:
 
 
    COLUMN           ОПИСАНИЕ
    --------------------------------------------------------------
    username      Пользователь который имеет привилегии
    grantor       Пользователь который передает привилегии
                  по имени пользователя
    tname         Имя таблицы в которой существуют привилегии
    owner         Владелец tname
    selauth       Имеет ли пользователь привилегию SELECT
    insauth       Имеет ли пользователь привилегию INSERT
    delauth       Имеет ли пользователь привилегию DELETE
 
 
   Возможные значения  для каждой из перечисленных привилегий объекта (
 имена столбцов которых окончиваются на auth ) - Y, N, и G. G указывает
 что пользователь  имеет привилегию с возможностью передачи привилегий.
 В каждой строке,  по крайней мере один из этих столбцов  должен  иметь
 состояние отличное от N (другими словами, иметь хоть какую-то привиле-
 гию ).
 
 
          ===============  SQL Execution Log ================
         |                                                   |
         | SELECT username, dba                              |
         | FROM  SYSTEMUSERAUTH                              |
         | WHERE resource = 'Y'                              |
         | ;                                                 |
         | ================================================= |
         |   username    dba                                 |
         | -----------  ------                               |
         |  Diane         N                                  |
         |  Adrian        Y                                  |
         |                                                   |
          ===================================================
 
 
 Рисунок 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        |
         | FROM  SYSTEMTABAUTH                               |
         | WHERE grantor = 'Adrian'                          |
         | AND tname = 'Customers'                           |
         | ;                                                 |
         | ================================================= |
         |   username   selauth  insauth  delauth            |
         | -----------  -------  -------- --------           |
         |  Claire      G        Y        N                  |
         |  Norman      Y        Y        Y                  |
         |                                                   |
          ===================================================
 
 
 Рисунок 24. 6: Пользователи получившие привилегии от Adrian
 
 
   Выше показано, что Adrian предоставил Claire привилегии INSERT и SE-
 LECT  в  таблице Заказчиков,  позднее предоставив ей права на передачу
 привилегий. Пользователю Norman, он предоставил привелегии SELECT, IN-
 SERT,  и 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 = USER
                    ORDER BY 1, 2;
 
 
 который показывает,  что эти две таблицы, которые имеют различных вла-
 дельцев, но одинаковые имя, в действительности, совершенно разные таб-
 лицы ( т.е. это не как два синонима для одной таблицы ).
 
 
          ===============  SQL Execution Log ================
         |                                                   |
         | SELECT OWNER, TNAME, CNAME                        |
         | FROM  SYSTEMCOLAUTH                               |
         | WHERE refaulth IN ('Y' , 'G' )                    |
         | AND username = USER                               |
         | ORDER BY 1, 2                                     |
         | ;                                                 |
         | ================================================= |
         |   owner       tname       cname                   |
         | -----------  -----------  -------                 |
         |  Diane       Customers     cnum                   |
         |  Diane       Salespeople   sname                  |
         |  Diane       Salespeople   sname                  |
         |  Gillan      Customers     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 *                                          |
         | FROM  SYSTEMSYNONS                                |
         | WHERE tname = 'Customers'                         |
         | ;                                                 |
         | ================================================= |
         | synonym       synowner    tname       tabowner    |
         | -----------  -----------  ----------  ----------  |
         |  Clients      Adrian      Customers   Diane       |
         |  Customers    PUBLIC      Customers   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         |
         | 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;                               |
         |                                                   |
         | ================================================= |
         |    tname       cname     iname     cposition      |
         |   -----------  -------  --------  ------------    |
         |   Salespeople   sname   salesno              1    |
         |   Customers     cnum    custsale             2    |
         |   Customers     snum    custsale             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 для ответов. )
 
 
 
Перейти к оглавлению
Hosted by uCoz