W Cat - SQL за 24 часа
SELECT TABLE_NAME
FROM USER_TABLES;
TABLE_NAME
-----------
CANDY_TBL
CUSTOMER_TBL
EMPLOYEE_PAY_TBL
EMPLOYEE_TBL
PRODUCTS_TBL
ORDERS_TBL
6 строк выбраны.
Следующий запрос возвращает список всех привилегий доступа к системе, имеющихся у пользователя с именем BRANDON.
SELECT GRANTEE, PRIVILEGE
FROM SYS.DBA_SYS_PRIVS
WHERE GRANTEE = 'BRANDON';
GRANTEE PRIVILEGE
-------------------------
BRANDON ALTER ANY TABLE
BRANDON ALTER USER
BRANDON CREATE USER
BRANDON DROP ANY TABLE
BRANDON SELECT ANY TABLE
BRANDON UNLIMITED TABLESPACE
6 строк выбраны.
А вот пример из MS Access:
SELECT NAME
FROM MSYSOBJECTS
WHERE NAME = 'MSYSOBJECTS'
NAME
------------
MSYSOBJECTS
Показанные здесь примеры иллюстрируют ничтожно малую долю той информации которую можно извлечь из любого системного каталога По поводу имеющихся в системном каталоге таблиц и их содержимого необходимо обратиться к документации той базы данных, с которой вы работаете
Обновление содержимого системного каталога
Системный каталог позволяет только выборку его данных - даже когда его использует администратор базы данных. Обновление системного каталога осуществляется автоматически сервером базы данных. Например, в базе данных пользователем создается таблица с помощью оператора CREATE TABLE. При этом сервер базы данных помещает соответствующий оператор DDL в определенную таблицу системного каталога. Необходимости обновлять таблицы системного каталога вручную не возникает никогда. Во всех реализациях эту работу выполняет сервер базы данных по схеме, показанной на рис. 21.2
Никогда не пытайтесь изменять таблицы системного каталога вручную. Это может привести к нарушению целостности данных Помните о том, что в системном каталоге хранится информация о структуре базы данных и ее объектах Как правило, системный каталог хранится отдельно от других данных в базе данных.
Рис. 21.2. Обновление системного каталога
Резюме
В ходе этого урока обсуждались назначение и содержимое системного каталога реляционной базы данных. Системный каталог в некотором смысле является базой данных внутри базы данных и по существу представляет собой базу данных с информацией о той базе данных, в рамках которой этот системный каталог создан. С помощью системного каталога проще осуществлять управление общей структурой базы данных, следить за происходящими в базе данных событиями и изменениями, получать полезную для управления базой данных информацию. Системный каталог предполагает только чтение его данных. Пользователям базы данных не позволено вносить какие бы то ни было изменения непосредственно в системный каталог. Изменения в системный каталог вносятся автоматически каждый раз, когда меняется структура базы данных, например, когда пользователем создаются таблицы. Такие изменения в системный каталог вносятся сервером базы данных.
Вопросы и ответы
Как пользователь базы данных я имею возможность получить информацию о своих объектах. Но как получить информацию об объектах других пользователей?
Есть целый ряд таблиц и представлений системного каталога, доступ к которым может получить любой пользователь базы данных. Среди таких таблиц и представлений обязательно найдутся такие, в которых содержится информация о тех объектах, к которым доступ вам разрешен.
Если пользователь забыл свой пароль, может ли администратор базы данных извлечь пароль пользователя из какой-нибудь таблицы системного каталога?
И да, и нет. Пароль действительно хранится в специальной таблице системного каталога, но обычно этот пароль бывает зашифрован, так что даже администратор не сможет его прочитать. Но пароль можно переустановить, что для администратора базы данных оказывается достаточно простым делом.
Как выяснить, из каких столбцов состоит некоторая таблица системного каталога?
К таблицам системного каталога можно адресовать запросы точно так же, как к любым другим таблицам базы данных. Просто выполните запрос к соответствующей таблице системного каталога.
Практикум
Задания практических занятий разделены на тесты и упражнения. Тесты предназначены для проверки общего уровня понимания рассмотренного материала. Упражнения дают возможность применить на практике идеи, обсуждавшиеся в ходе текущего урока, в комбинации с идеями из предыдущих уроков. Мы рекомендуем ответить на тестовые вопросы и выполнить упражнения прежде, чем продолжать дальнейшее чтение книги. Ответы можно проверить по Приложению Б, "Ответы".
Тесты
1. Как по другому называется системный каталог в некоторых базах данных?
2. Имеет ли возможность обычный пользователь обновлять системный каталог?
3. Какая системная таблица Sybase содержит информацию о существующих в базе данных представлениях?
4. Кто является владельцем системного каталога?
5. В чем различия между системными объектами ALLJTABLES и DBAJTABLES в Oracle?
6. Кто вносит изменения в таблицы системного каталога?
Упражнения
1. Попытайтесь выполнить запросы к системным таблицам в рамках своей базы данных. Начните с запроса к таблице, содержащей информацию о вашем учетной записи пользователя базы данных.
2. Получите из системного каталога список всех таблиц, к которым вы имеете право доступа.
3. Получите из системного каталога список всех имеющихся у вас привилегий доступа к системе и объектам.
4. Если вы имеете привилегию DBA или SELECT в отношении таблиц администратора базы данных, выполните запрос на выборку данных этих таблиц. Если же таких привилегий у вас нет, ознакомьтесь с образцами этих таблиц по документации, сопровождающей базу данных.
22-й час Средства опытного пользователя
В ходе этого урока мы с вами рассмотрим некоторые темы, выходящие за рамки элементарных средств SQL К концу урока вы будете иметь в своем арсенале понимание основ использования курсоров, сохраненных процедур, триггеров динамического SQL прямого вызова и вложенного SQL, а также SQL, сгенерированного средствами SQL
Основными на этом уроке будут следующие темы
• Что такое курсор
• Использование сохраненных процедур
• Триггеры
• Основы динамического SQL
• Использование SQL для генерирования SQL
• Прямой вызов SQL и вложенный SQL
• Интерфейс уровня вызовов
Средства, выходящие за рамки элементарных
Возможности SQL, обсуждаемые здесь, выходят за рамки базовых операций, которые мы с вами рассматривали до сих пор и к которым можно отнести операции выполнения запросов, создания структур базы данных и манипуляции данными Возможности, которые мы рассмотрим в ходе этого занятия, доступны во многих реализациях баз данных, использующих расширения стандартного SQL, обсуждавшегося до сих пор
Не все обсуждаемые здесь вопросы определяются стандартом ANSI SQL поэтому обязательно проверьте по документации синтаксис и правила использования предлагаемых ниже команд Для сравнения мы здесь приводим синтаксис команд нескольких ведущих производителей баз данных
Курсоры
Для многих людей слово "курсор" ассоциируется с мигающим прямоугольником на экране монитора, предназначенным для указания того места где в файле или приложении находится пользователь Здесь же под курсором понимается нечто иное Курсор SQL - это область памяти базы данных, где был сохранен последний из операторов SQL Если текущим оператором SQL оказывается запрос, в памяти сохраняется также и строка запроса Эта строка называется текущим значением курсора или текущей строкой Соответствующая область памяти именуется и оказывается доступной программам
Курсор обычно используется для извлечения порций данных из базы данных При этом программа получает возможность анализировать текущие строки курсора Курсоры обычно используются в рамках SQL, встроенного в программы процедурного типа Некоторые курсоры создаются автоматически сервером базы данных, другие же объявляются программистом Использование курсоров в базах данных разных производителей может иметь свои особенности
Рассмотрим для сравнения операторы объявления курсора для двух наиболее распространенных систем Microsoft SQL Server и Oracle
Синтаксис оператора объявления курсора в Microsoft SQL Server следующий
DECLARE ШЧ_КУРСОРА CURSOR
FOR OnEPATOP_SELECT
[ FOR {READ ONLY UPDATE [ СПИСОК__СТОЛБЦОВ ]}]
Синтаксис оператора объявления курсора в Oracle следующий
DECLARE CURSOR ИМЯ_ КУРСОРА
IS {ОПЕРАТОР_SELECT}
Создаваемый следующим оператором курсор будет содержать все записи таблицы EMPLOYEE_TBL
DECLARE CURSOR EMP_CURSOR IS
SELECT * FROM EMPLOYEE_TBL
{ ДРУГИЕ ОПЕРАТОРЫ ПРОГРАММЫ }