Мартин Грубер - Понимание SQL (991940), страница 44
Текст из файла (страница 44)
Возможные состояния столбцов resource и dba могутбыть — Y (Да, пользователь имеет привилегии) или — No (Нет, пользователь не имеет привилегий).Пароли (password) доступны только высоко привилегированным пользователям,если они существуют. Следовательно, запрос этой таблицы можно вообще делатьтолько для информации относительно привилегий системы и пользователей.ТИПОВОЙ ЗАПРОС Чтобы найти всех пользователей, которые имеют привилегию RESOURCE, и увидеть какие из них — DBA, вы можете ввести следующее условие:SELECT username, dbaFROM SYSTEMUSERAUTHWHERE resource = 'Y';Вывод для этого запроса показывается в Рисунке 24.5.SYSTEMTABAUTH — ПРИВИЛЕГИИ ОБЪЕКТА, КОТОРЫЕ НЕ ОПРЕДЕЛЯЮТСТОЛБЦЫЗдесь показаны имена столбцов в таблице SYSTEMTABAUTH и их описание:COLUMNusernamegrantortnameownerselauthinsauthdelauthОПИСАНИЕПользователь, который имеет привилегииПользователь, который передает привилегии по имени пользователяИмя таблицы, в которой существуют привилегииВладелец tnameИмеет ли пользователь привилегию SELECTИмеет ли пользователь привилегию INSERTИмеет ли пользователь привилегию DELETEВозможные значения для каждой из перечисленных привилегий объекта (именастолбцов которых окончиваются на auth) — Y, N, и G.
G указывает, что пользовательимеет привилегию с возможностью передачи привилегий. В каждой строке, по крайней мере один из этих столбцов должен иметь состояние отличное от N (другими словами, иметь хоть какую-то привилегию).=============== SQL Execution Log ================| SELECT username, dba|| FROM SYSTEMUSERAUTH|| WHERE resource = 'Y'|| ;|| ================================================= ||usernamedba|| ----------- -----|| DianeN|| AdrianY|===================================================Рисунок 24.5: Пользователи которые имеют привилегию RESOURCEПервые четыре столбца этой таблицы составляют первичный ключ.
Это означает что каждая комбинация из tname, владелец-пользователь (не забудьте, что дверазличные таблицы с различными владельцами могут иметь одно и тоже имя), пользователь и пользователь передающий права (гарантор), должна быть уникальной.Каждая строка этой таблицы содержит все привилегии (которые не являются определенным столбцом), предоставляются одним определенным пользователем другомуопределенному пользователю в конкретном объекте.UPDATE и REFERENCES являются привилегиями, которые могут быть определенными столбцами, и находиться в различных таблицах каталога. Если пользователь получает привилегии в таблице от более чем одного пользователя, такиепривилегии могут быть отдельными строками, созданными в этой таблице.
Это необходимо для каскадного отслеживания при вызове привилегий.ТИПОВОЙ ЗАПРОС Чтобы найти все привелегии SELECT, INSERT и DELETE,которые Adrian предоставляет пользователям в таблице Заказчиков, вы можете ввести следующее (вывод показан в Рисунке 24.6):SELECT username, selauth, insauth, delauthFROM SYSTEMTABAUTHWHERE grantor = 'Adrian' AND tname = 'Customers';=============== SQL Execution Log ================| SELECT username, selauth, insauth, delauth|| FROM SYSTEMTABAUTH|| WHERE grantor = 'Adrian'|| AND tname = 'Customers'|| ;|| ================================================= ||usernameselauth insauth delauth|| ----------- ------- -------- -------|| ClaireGYN|| NormanYYY|===================================================Рисунок 24.6: Пользователи получившие привилегии от AdrianВыше показано, что Adrian предоставил Claire привилегии INSERT и SELECT втаблице Заказчиков, позднее предоставив ей права на передачу привилегий.
Пользователю Norman он предоставил привелегии SELECT, INSERT и DELETE, но не далвозможность передачи привилегий ни в одной из них. Если Claire имела привилегиюDELETE в таблице Заказчиков от какого-то другого источника, в этом запросе это показано не будет.SYSTEMCOLAUTHСТОЛБЦЫusernamegrantortnamecnameownerupdauthrefauthОПИСАНИЕПользователь который имеет привилегииПользователь который предоставляет привилегии другому пользователюИмя таблицы в которой существуют привилегииИмя столбца в котором существуют привилегииВладелец tnameИмеет ли пользователь привилегию UPDATE в этом столбцеИмеет ли пользователь привилегию REFERENCES в этом столбцеСтолбцы updauth и refauth могут быть в состоянии Y, N, или G; но не могут бытьодновременно в состоянии N для одной и той же строки.
Это — первые пять столбцовтаблицы, которы не составляют первичный ключ. Он отличается от первичного ключаSYSTEMTABAUTH в котором содержится поле cname, указывающее на определенныйстолбец обсуждаемой таблицы для которой применяются одна или обе привилегии.Отдельная строка в этой таблице может существовать для каждого столбца в любойданной таблицы в которой одному пользователю передаются превилегии определенного столбца с помощью другого пользователя.Как и в случае с SYSTEMTABAUTH та же привилегия может быть описана в более чем одной строке этой таблицы если она была передана более чем одним пользователем.ТИПОВОЙ ЗАПРОС Чтобы выяснить, в каких столбцах какой таблицы вы имеетепривилегию REFERENCES, вы можете ввести следующий запрос (вывод показывается в Рисунке 24.7)SELECT owner, tname, cnameFROM SYSTEMCOLAUTHWHERE refauth IN ('Y', 'G') AND username = USERORDER BY 1, 2;который показывает, что эти две таблицы, которые имеют различных владельцев, ноодинаковые имя, в действительности, совершенно разные таблицы (т.е.
это не как двасинонима для одной таблицы).=============== SQL Execution Log ================| SELECT OWNER, TNAME, CNAME|| FROM SYSTEMCOLAUTH|| WHERE refaulth IN ('Y' , 'G' )|| AND username = USER|| ORDER BY 1, 2|| ;|| ================================================= ||ownertnamecname|| ----------- ----------- ------|| DianeCustomerscnum|| DianeSalespeoplesname|| DianeSalespeoplesname|| GillanCustomerscnum|===================================================Рисунок 24.7: Столбцы в пользователь имеет привилегию INSERTSYSTEMSYNONS — СИНОНИМЫ ДЛЯ ТАБЛИЦ В БАЗЕ ДАННЫХЭто — имена столбцов в таблице SYSTEMSYNONS и их описание:СТОЛБЕЦsynonymsynownertnametabownerОПИСАНИЕИмя синонимаПользователь, который является владельцем синонима (может бытьPUBLIC (ОБЩИЙ))Имя таблицы используемой владельцемИмя пользователя который является владельцем таблицыТИПОВОЙ ЗАПРОС Предположим, что Adrian имеет синоним Clients для таблицы Заказчиков, принадлежащей Diane, и что имеется общий синоним Customers дляэтой же таблицы.
Вы делаете запрос таблицы для всех синонимов в таблице Заказчиков (вывод показывается в Рисунке 24.8):SELECT *FROM SYSTEMSYNONSWHERE tname = 'Customers'=============== SQL Execution Log ================| SELECT *|| FROM SYSTEMSYNONS|| WHERE tname = 'Customers'|| ;|| ================================================= || synonymsynownertnametabowner|| ----------- ----------- ---------- ---------- || ClientsAdrianCustomersDiane|| CustomersPUBLICCustomersDiane|===================================================Рисунок 24.8: Синонимы для таблицы ЗаказчиковДРУГОЕ ИСПОЛЬЗОВАНИЕ КАТАЛОГАКонечно, вы можете выполнять более сложные запросы в системном каталоге.Обьединения, например, могут быть очень удобны.
Эта команда позволит вам увидеть столбцы таблиц и базовые индексы, установленые для каждого (вывод показывается в Рисунке 24.9):SELECT a.tname, a.cname, iname, cpositionFROM SYSTEMCOLUMNS a, SYSTEMINDEXES bWHERE a.tabowner = b.tabowner AND a.tname = b.tname ANDa.cnumber = b.cnumberORDER 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;|| ================================================= ||tnamecnameinamecposition||----------- ------- -------- -----------||Salespeoplesnamesalesno1||Customerscnumcustsale2||Customerssnumcustsale1|===================================================Рисунок 24.9: Столбцы и их индексыПодзапросы также могут быть использованы. Имеется способ увидеть данныестолбца только для столбцов из таблиц каталога:SELECT *FROM SYSTEMCOLUMNSWHERE tname IN (SELECT tnameFROM SYSTEMCATALOG);Для простоты, мы не будем показывать вывод этой команды, которая состоит изодного входа для каждого столбца каждой таблицы каталога.
Вы могли бы поместитьэтот запрос в представление, назвав его, например, SYSTEMTABCOLS, для представления SYSTEMTABLES.РЕЗЮМЕИтак, система SQL использует набор таблиц, называемый системным каталогомв структуре базы данных. Эти таблицы могут запрашиваться но модифицироваться.Кроме того, вы можете добавлять комментарии столбцов в (и удалять их из) таблицыSYSTEMCATALOG и SYSTEMCOLUMNS. Создание представлений в этих таблицах —превосходный способ точно определить, какая пользовательская информация можетбыть доступной.Теперь, когда вы узнали о каталоге, вы завершили ваше обучение SQL в диалоговом режиме. Следующая глава этой книги расскажет вам, как SQL используется впрограммах, которые написаны прежде всего на других языках, но которые способныизвлечь пользу из возможностей SQL, взаимодействуя с его таблицами базы данных.РАБОТА С SQL1. Сделайте запрос каталога чтобы вывести, для каждой таблицы имеющей болеечем четыре столбца, имя таблицы, имя владелеца, а также имя столбцов и типданных этих столбцов.2.