Введение в язык SQL
Интерактивная, статическая и динамическая форма SQL. Практическое использование языка запросов SQL, выборка данных из базы. Комбинированные условия поиска. Арифметические операции и функции строк символов. Создание приложений класса баз данных в Delphi.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | учебное пособие |
Язык | русский |
Дата добавления | 28.06.2009 |
Размер файла | 427,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Исполняющая система использует это значение для динамического построения условия поиска WHERE JOB = 'MANAGER', используемого первой командой SELECT для возврата нужных нам строк.
Классический пример - перечислить всех работников, получающих больше среднего оклада:
SELECT ENAME,SAL
FROM EMP
WHERE SAL >
(SELECT AVG(SAL)
FROM EMP);
ENAME |
SAL |
|
JONES |
2,975.00 |
|
BLAKE |
2,850.00 |
|
CLARK |
2,450.00 |
|
SCOTT |
3,000.00 |
|
KING |
5,000.00 |
|
FORD |
3,000.00 |
Подзапросы могут тоже быть составными, как и основные запросы - они могут содержать условия поиска и запросы JOIN. Например, можно использовать их в командах INSERT, UPDATE и DELETE (рассматриваемых в следующих секциях) наряду с командами SELECT.
Контрольные вопросы
В чем заключается удобство использования подзапросов в SQL-клаузе SELECT?
Каков порядок выполнения подзапросов и каким образом его можно изменить?
Составьте SQL-предписание для уничтожения строк с информацией о работниках, имеющих оклад не выше 25% от среднего. Каковы `подводные камни', могущие возникнуть при выполнении этой операции?
1.12 Модификация хранимых данных
Как видно из вышеизложенного, одна команда SELECT позволяет выбрать набор строк из одной или нескольких таблиц. SQL позволяет добавлять или модифицировать строки достаточно просто при помощи следующих трех команд:
команда UPDATE изменяет значения, хранимые в полях
команда INSERT добавляет строки в таблицу
команда DELETE удаляет строки из таблицы
1.12.1 Команда UPDATE
Используя имеющийся пример базы данных, для повышения окладов всех клерков на 100 долларов потребуется обновить или изменить значения некоторых данных (поля SAL) в некоторых строках (тех, в которых значение для JOB = CLERK) в таблице EMP. Команда UPDATE состоит из клаузы UPDATE вместе с клаузой SET и опционной (необязательной) клаузой WHERE:
UPDATE EMP
SET SAL = SAL + 100
WHERE JOB = 'CLERK';
Клауза UPDATE определяет таблицу, которую нужно модифицировать (EMP). Клауза SET задает поле, которое нужно модифицировать в некоторое другое значение (SAL=SAL+100). В клаузе WHERE задается условие выбора строк для обновления (условие JOB='CLERK'). Вывод на дисплей подтверждает, что обновление действительно имело место:
SELECT ENAME,JOB,SAL
FROM EMP
WHERE JOB ='CLERK';
ENAME |
JOB |
SAL |
|
SMITH |
CLERK |
900.00 |
|
ADAMS |
CLERK |
1,200.00 |
|
JAMES |
CLERK |
1,050.00 |
|
MILLER |
CLERK |
1,400.00 |
1.12.2 Команда INSERT
Ранее демонстрировалось использование команды INSERT для добавления строк в таблицу, однако это самое примитивное использование инструкции INSERT. Возможно использовать эту команду и для добавления набора строк в таблицу и для копирования строк из одной таблицы в другую. Это делается, используя запрос для определения набора строк, вводимых в таблицу.
Предположим, что в ранее описанном примере базы данных имеется третья таблицу по имени PROMOTION. Эта таблица содержит многие колонки такие же как в EMP - ENAME, JOB, SAL, СОММ. Задача введения в эту таблицу данных для всех продавцов, имеющих комиссионные больше 25% от оклада путем копирования информации из таблицы ЕМР решается с помощью следующей SQL-инструкции:
INSERT INTO PROMOTION (ENAME,JOB,SAL,COMM)
SELECT ENAME,JOB,SAL,COMM --- подзапрос
FROM EMP
WHERE COMM > 0.25 * SAL;
2 records created. --- возможное сообщение системы
Команда INSERT в данном примере использует подзапрос вместо списка значений данных. Исполняющая система вводит в таблицу PROMOTION строки и колонки, выбранные из ЕМР в подзапросе.
1.12.3 Команда DELETE
Поскольку в отделе 40 нет работников, удалим его из таблицы DEPT при помощи команды DELETE:
DELETE FROM DEPT
WHERE DEPTNO = 40;
Используем запрос SELECT * , чтобы убедиться, что удаление реально имело место:
SELECT *
FROM DEPT;
DEPTNO |
DNAME |
LOC |
|
10 |
ACCOUNTIG |
NEW YORK |
|
20 |
RESEARCH |
DALLAS |
|
30 |
SALES |
CHICAGO |
Клауза DELETE FROM определяет таблицу, из которой необходимо удалить строку или набор строк (в данном случае таблицу DEPT). Клауза WHERE должна иметь опции (клауза DELETE FROM без нее будет означать, что пользователь желает удалить все строки из таблицы); она задает условия, при соблюдении которых нужно удалять строки. В этом примере использовалась клауза WHERE, чтобы сообщить исполняющей системе следующее `УДАЛИТЬ строки таблицы DEPT, у которых значение в колонке DEPTNO равно 40'.
Клаузы WHERE во всех командах демонстрируют, как SQL использует одинаковый синтаксис для обработки данных и для запросов. В командах SELECT, UPDATE, INSERT, DELETE функционирование клаузы WHERE идентично: она всегда опционна и используется для задания условий, при которых нужно уничтожать, модифицировать или обновлять данные. Долее будет ясно, как SQL использует одинаковый синтаксис запросов для определения данных.
Контрольные вопросы
Каков формат SQL-предписаний UPDATE, INSERT и DELETE?
Каким образом команда INSERT используется для переноса (по заданному условию) данных из одной таблицы в другую?
1.13 Динамические изменения структуры базы данных
Поддерживаются команды SQL, необходимые для динамического изменения структуры базы данных. В данном разделе будут приведены необходимые для этого инструкции SQL:
ALTER TABLE ADD - добавления новой колонки в существующую таблицу
ALTER TABLE MODIFY - изменение размера существующей колонки
Для примера расширим вышеописанную базу данных так, что в дальнейшем сможем назначить работников для проектов так же, как назначали их для отделов. Это изменение структуры базы данных требует нескольких шагов. Сначала при помощи команды CREATE TABLE создадим таблицу проектов:
CREATE TABLE DEPT |
(PROGNO |
NUMBER (3) NOT NULL, |
|
PNAME |
CHAR (5), |
||
BUDGET |
NUMBER(7,2)); |
Далее используем команду INSERT для помещения некоторых данных в таблицу PROJ:
INSERT INTO PROJ VALUES (101, 'ALPHA', 96000)
INSERT INTO PROJ VALUES (101, 'BETA', 82000)
INSERT INTO PROJ VALUES (101, `GAMMA', 96000)
Проверим корректность создания таблицы PROJ:
SELECT *
FROM PROJ;
PROJNO |
PNAME |
BUDJET |
|
101 |
ALPHA |
96,000.00 |
|
102 |
BETA |
82,000.00 |
|
103 |
GAMMA |
15,000.00 |
И в третьих, добавим колонку номеров проектов в таблицу ЕМР, так что две таблицы разделят общую колонку. Используем команду ALTER TABLE для добавления новой колонки в существующую таблицу :
ALTER TABLE ЕМР ADD (PROJNO NUMBER(3));
В данной команде названа таблица, которую нужно изменить (в данном случае ЕМР), описана функция добавления (ADD), колонка, которую нужно добавить в нее (PROJNO), новый тип данных колонки и максимальная длина новой колонки - NUMBER(3).
Просмотрим таблицу ЕМР и заметим, что добавлено в каждую строку новое поле PROJNO с пустым начальным значением:
SELECT *
FROM ЕМР;
После введения новой колонки в таблицу ЕМР применим команду UPDATE для соотнесения работников с проектами. Соотнесем всех работников отдела 20 и всех продавцов проекту 101:
UPDATE ЕМР SET PROJNO = 101
WHERE DEPTNO = 20
OR JOB = 'SALESMAN';
Выведем на экран полученную таблицу ЕМР для уверенности во введенных изменениях:
SELECT *
FROM ЕМР;
Теперь поместим всех, кто не отнесен ни к какому проекту (то есть WHERE PROJNO IS NULL), в проект 102:
UPDATE EMP SET PROJNO = 102
WHERE PROJNO IS NULL;
Другой запрос в таблицу EMP показывает, что все работники теперь имеют значения в поле PROJNO:
SELECT *
FROM EMP;
Обновление строк работников с номерами проектов завершает модификацию базы данных и позволяет соотносить работников с проектами так же как с отделами.
Присоединение таблицы EMP к таблице PROJ:
SELECT ENAME,JOB,DEPTNO,PNAME
FROM EMP,PROJ
WHERE EMP.PROJNO = PROJ.PROJNO;
ENAME |
JOB |
DEPTNO |
PNAME |
|
SMITH |
CLERK |
20 |
ALPHA |
|
ALLEN |
SALESMAN |
30 |
ALPHA |
|
WARD |
SALESMAN |
30 |
ALPHA |
|
JONES |
MANAGER |
20 |
ALPHA |
|
MARTIN |
SALESMAN |
30 |
ALPHA |
|
SCOTT |
ANALYST |
20 |
ALPHA |
|
TURNER |
SALESMAN |
30 |
ALPHA |
|
ADAMS |
CLERK |
20 |
ALPHA |
|
FORD |
ANALYST |
20 |
ALPHA |
|
BLAKE |
MANAGER |
20 |
BETA |
|
CLARK |
MANAGER |
10 |
BETA |
|
KING |
PRESIDENT |
10 |
BETA |
|
JAMES |
CLERK |
30 |
BETA |
|
MILLER |
CLERK |
10 |
BETA |
При помощи этой серии примеров была продемонстрирована легкость, с которой можно динамически расширять и реструктуризировать базу данных.
Сначала была создана новая таблица. Затем в нее добавили новую колонку. После этого поместили данные в эту колонку. И, наконец, слили новую и старую таблицу. Все четыре операции были выполнены с помощью простых команд SQL без вмешательства системы для загрузки и перезагрузки данных или явной реорганизации какой-то части базы данных.
Команда ALTER TABLE
В дополнение к возможности добавлять новые колонки существующие таблицы, можно изменить размер существующих колонок.
Например, что было введено значение 15000 для бюджета в проекте 103. Предположим, что произошла ошибка и правильное значение в действительности должно быть равно 105000. Необходимо обновить строку проект 103 с правильным значением бюджета:
UPDATE PROJ
SET BUDGET = 105000
WHERE PROJNO = 103;
ERROR: для колонки задано значение больше допустимого
Получено сообщение об ошибке, поскольку сумма нового бюджета, которую попытались ввести, была слишком велика, чтобы поместиться в колонку BUDGET, определенную в команде CREATE TABLE как NUMBER(7,2). Это определение значит, что допускаются числа не больше чем 99,999.99 (7 цифр, из которых две справа от десятичной точки). Проблему можно решить, используя команду ALTER TABLE для увеличения колонки:
ALTER TABLE PROJ
MODIFY BUDGET NUMBER(8,2);
Также как в команде ALTER TABLE ADD, указывается таблица PROG, которую надо изменить. В данном примере необходимо модифицировать определение колонки BUDGET (определить ее размер как NUMBER(8,2) вместо текущей.
Теперь можно попытаться обновить таблицу снова:
UPDATE PROJ
SET BUDGET = 105000
WHERE PROJNO = 103;
Используем запрос SELECT для уверенности, что обновление действительно имело место:
SELECT *
FROM PROJ;
Контрольные вопросы
В каких случаях необходимо динамически изменять структуру таблицы?
Каков формат SQL-предписаний, осуществляющих динамическое изменение структуры данных?
Каким образом пользователь может отслеживать возможные ошибки, возникающие вследствие непродуманного изменения структуры таблиц?
Насколько, по Вашему мнению, динамическое изменение структуры таблиц с помощью SQL эффективнее традиционного подхода (создание новой таблицы c заданной структурой копирования в нее содержимого имеющейся таблицы добавление необходимых данных уничтожение `старой' таблицы)?
1.14Альтернативные виды данных
Поддерживающие язык SQL системы позволяют создавать и обрабатывать альтернативный вид данных - вид (VIEW, иное русскоязычное название - представление). Виды можно представить виртуальными таблицами; они подобны окнам, через которые можно просматривать данные, хранимые в реальных таблицах. Виды (именуемые также виртуальными таблицами, просматриваемыми таблицами) не содержат данных самих по себе, а являются запросами, выполняющимися всякий раз, когда в операторе встречается ссылка на данный вид (таким образом достигается актуальность вида).
Также любое изменение данных в таблицах сразу же вызывает соответственное изменение связанного с данными таблицами вида; образно говоря, изменения в 'окружающем пространстве' (таблицах) тут же проявляются в 'окне' (виде).
Виды (представления) используются аналогично любой таблицы - к видам можно обращаться с запросами, обновлять, вставлять или удалять данные или соединять его с другими таблицами или видами. Имена столбцов вида могут не совпадать с именами соответственных столбцов породивших вид таблицах.
Обычно изменения в виде сразу же сказывается на содержании породивших его таблиц (в этом случае говорят, что `вид обновляем'), однако существуют случаи, когда вид существует `только для чтения'. Вопрос определения критериев `обновляемости' видов до сих пор дискуссируется в теории баз данных (некоторые практические примеры можно найти в [1]).
Виды служат трем основным целям
упрощают доступ к данным
обеспечивают независимость данных
обеспечивают защиту данных
Рассмотрим, как создаются виды и как их можно использовать для упрощения доступа к данным.
Создадим вид таблицы ЕМР, который будет поднабором всей таблицы и будет включать только номера, фамилии и работу работников, занятых в отделе 10:
CREATE VIEW EMPN0 AS
SELECT EMPNO,ENAME,JOB
FROM ЕМР
WHERE DEPTNO = 10;
Поскольку результат запроса - таблица, то запрос используется для определения виртуальной таблицы или вида. В команде CREATE VIEW называется вид, а затем описывается в форме оператора запроса SQL, что вид должен содержать. С некоторыми ограничениями можно запрашивать и модифицировать виды так же, как если бы они были реальными таблицами.
Просмотрим созданный вид:
SELECT *
FROM EMPNO;
EMPNO |
ENAME |
JOB |
|
7782 |
CLARK |
MANAGER |
|
7839 |
KING |
PRESIDENT |
|
7934 |
MILLER |
CLERK |
Для некоторых пользователей проще работать с одной таблицей, чем с несколькими. Поддерживающие SQL системы позволяют создавать единственный вид из двух или более таблиц. Таким образом, возможно определить вид как выборку из нескольких таблиц, вместо которых можно запрашивать индивидуально сделанное соединение (это и есть вид).
Несложно создать единственный вид таблицы по имени PERSONNEL с колонками ENAME, JOB, PNAME из таблиц ЕМР и PROJ и затем проанализировать его содержимое.
Создание соединенного вида:
CREATE VIEW PERSONNEL AS
SELECT ENAME,JOB,PNAME
FROM EMP,PROJ
WHERE EMP.PROJNO = PROJ.PROJNO;
Просмотр созданного вида:
SELECT *
FROM PERSONNEL;
PROJNO |
JOB |
PNAME |
|
SMITH |
CLERK |
ALPHA |
|
ALLEN |
SALESMAN |
ALPHA |
|
WARD |
SALESMAN |
ALPHA |
|
JONES |
MANAGER |
ALPHA |
|
MARTIN |
SALESMAN |
ALPHA |
|
SCOTT |
ANALYST |
ALPHA |
|
TURNER |
SALESMAN |
ALPHA |
|
ADAMS |
CLERK |
ALPHA |
|
FORD |
ANALYST |
ALPHA |
|
BLAKE |
MANAGER |
BETA |
|
CLARK |
MANAGER |
BETA |
|
KING |
PRESIDENT |
BETA |
|
JAMES |
CLERK |
BETA |
|
MILLER |
CLERC |
BETA |
После создания вида пользователь никак не сможет узнать, что данные, которые он просматривает, хранятся в двух таблицах. Более того, можно считать, что данные хранятся в одной таблице (данном виде).
Таким образом можно использовать виды для упрощения доступа к данным, уменьшения длины строк и сокращения количества ошибок.
Используя вид PERSONNEL, перечислим имена менеджеров и проекты, над которыми они работают:
SELECT ENAME,PNAME
FROM PERSONNEL
WHERE JOB = 'MANAGER';
ENAME |
PNAME |
|
JONES |
ALPHA |
|
BLAKE |
BETA |
|
CLARK |
BETA |
Отметим, насколько прост этот запрос вида PERSONNEL по сравнению с запросом типа JOIN, требуемым для выполнения аналогичных действий - генерации этого списка из двух таблиц ЕМР и PROJ.
Контрольные вопросы
Что такое представления (виды) и чем они функционально отличаются от таблиц?
Каким целям служат представления?
Каким образом достигается актуальность содержимого представления?
Должно ли представление иметь одинаковое имя с таблицей, от которой порождено?
Возможно ли создание представления, включающего информацию из нескольких таблиц одновременно?
1.15 Независимость данных
Виды освобождают пользователя от необходимости знать, в каких таблицах находятся данные, c которыми он работает. Это разница в том, какие данные пользователь видит и как они хранятся, носит название независимость данных; эта разница упрощает доступ к данным в БД. Но можно использовать виды и для хранения пользовательских запросов, программ и так далее, предохраняя их от устаревания при изменениях базы данных.
Текущая структура БД позволяет связать несколько работников с проектом, однако каждый должен работать только по одному проекту - это известное соотношение 'многие к одному'. Предположим, что процедуры по персоналу изменились и сейчас есть необходимость связать работников с несколькими проектам. Чтобы это выполнить, необходимо пересмотреть структуру базы данных, преследуя две цели.
Первая цель - предохранить старые виды БД, чтобы можно было продолжать работы со всеми прикладными системами, отчетами и программами, зависящими от исходной структуры базы данных. Вторая цель заключается в том, чтобы иметь возможность использовать новые данные (дополнительные проекты) для построения новых прикладных систем. Ниже приведены этапы достижения поставленной цели.
Сначала создадим новую таблицу, соотносящую работников с проектами и содержащую информацию об участии конкретных работников в конкретном проекте (например, введем новый столбец - часы работы WORKHPS. Новая структура базы данных будет поддерживать соотношения типа 'многие-к-многим'):
Далее присоединим работников к проектам путем введения строк в таблицу РЕ. Отметим, что работник под номером 7369 имеет две строки в этой таблице: одна для проекта 101 и другая - для 102. Присоединение работников к проектам выполняется многократным использованием INSERT:
INSERT INTO PE VALUES (7369, 101, 0);
INSERT INTO PE VALUES (7369, 102, 0);
INSERT INTO PE VALUES (7399, 101, 0);
INSERT INTO PE VALUES (7521, 101, 0);
INSERT INTO PE VALUES (7366, 101, 0);
INSERT INTO PE VALUES (7554, 101, 0);
INSERT INTO PE VALUES (7698, 102, 0);
INSERT INTO PE VALUES (7782, 102, 0);
INSERT INTO PE VALUES (7788, 101, 0);
INSERT INTO PE VALUES (7839, 102, 0);
INSERT INTO PE VALUES (7844, 101, 0);
INSERT INTO PE VALUES (7876, 101, 0);
INSERT INTO PE VALUES (7900, 102, 0);
INSERT INTO PE VALUES (7902, 101, 0);
INSERT INTO PE VALUES (7934, 102, 0);
В будущем, если работник будет присоединен ко второму или третьему проекту, достаточно ввести дополнительную строку для этого работника в таблицу РЕ.
Поскольку теперь используется таблица РЕ для соотношения работников с проектами, больше не нужна информация, хранимая в колонке PROJNO таблицы ЕМР. Можно удалить эти данные путем установки значений этой колонки в пустые:
UPDATE EMP
SET PROJNO = NULL;
Вспомним, что отсутствие клаузы WHERE приказывает обновить все строки в таблице.
Поскольку все PROJNO установлены в NULL, больше невозможно использовать вид PERSONNEL, который использует колонку PROJNO для связи таблиц ЕМР и PROJ. Для генерации этой информации снова нужно соединить таблицу ЕМР с новой таблицей РЕ и соединить таблицу РЕ с нашей таблицей PROJ. Но возможно спрятать это изменение от пользователей, использующих вид PERSONNEL, просто изменив определение вида. Первый шаг в изменении вида PERSONNEL - уничтожить старый вид:
DROP VIEW PERSONNEL;
Теперь создадим новый вид PERSONNEL, объединяющий таблицу ЕМР и таблицу PROJ через таблицу РЕ :
CREATE VIEW PERSONNEL AS
SELECT ENAME,JOB,PNAME
FROM EMP,PROJ,PE
WHERE EMP.EMPNO = PE.EMPNO
AND PE.PROJNO = PROJ.PROJNO;
Теперь программы, использующие старый вид PERSONNEL, могут продолжать работу без модификации и пользователи могут работать со старыми данными в общем случае, не боясь изменений в базе данных.
Запрашивая новый вид PERSONNEL, увидим такую же информацию, как для старого вида PERSONNEL плюс второй проект для работника SMITH:
SELECT *
FROM PERSONNEL
ORDER BY ENAME;
Только что был продемонстрирован пример, как можно легко изменить структуру базы данных без изменений пользовательских программ, хранимых запросов и др. Это возможно именно потому, что SQL является непроцедурным языком и позволяет иметь разные виды (представления) одних и тех же данных.
Контрольные вопросы
В чем заключается независимость данных?
Допустимо ли использовать представления для хранения не только традиционных данных, но и текстов пользовательских запросов, программ и др.?
Каким образом с помощью представлений можно обеспечить функционирование старых программ без их модификации?
1.16 Разделение данных и защита
Поддерживающие язык SQL системы дают возможность многочисленным пользователям иметь доступ к одной базе данных. Это позволяет разделять (по желанию) свои данные с другими пользователями.
В данном разделе обсуждается, как использовать SQL для:
ГАРАНТИИ привилегий в таблицах и видах для других пользователей
ОТМЕНЯТЬ привилегии, которые ранее были гарантированы другим пользователям
Данный пользователь является полновластным владельцем любой созданной им таблицы (обладает всеми привилегиями доступа к ней - на чтение, изменение, уничтожение данных). Для регулирования доступа к данным для других пользователей служит инструкция GRANT.
Команда GRANT состоит из трех базовых клауз:
GRANT привилегия
ON таблица или вид
ТО пользователь или группа пользователей;
Предположим, что текущий пользователь является создателем таблицы ЕМР и желает дать пользователю по имени ADAMS право на запросы к ней. Для этого следует задать команду:
GRANT SELECT
ON EMP
TO ADAMS;
Возможно гарантировать любую комбинацию привилегий функционирования в таблицах или видах, включая:
Привилегии для таблиц |
Привилегии для видов |
|||
SELECT |
выбрать |
SELECT |
выбрать |
|
INSERT |
ввести |
INSERT |
ввести |
|
UPDATE |
обновить |
UPDATE |
обновить |
|
DELETE |
удалить |
DELETE |
удалить |
|
ALTER |
изменить |
|||
INDEX |
индексировать |
|||
CLUSTER |
кластер |
В предыдущем примере пользователю ADAMS гарантированы привилегии на выборку из всей таблицы EMP. Но что будет, если необходимо обеспечить всем пользователям доступ ко всей таблице, за исключением колонок SAL и СОММ?
Вопрос может быть решен путем гарантирования привилегий к видам, а не таблицам. Можно ограничить доступ к заданным строкам и колонкам таблицы. Сначала определим вид EMP, который не содержит колонки SAL и СОММ:
CREATE VIEW EMPS AS
SELECT EMPNO,ENAME,JOB,HIREDATE,DEPTNO
FROM EMP;
Теперь легко гарантировать привилегии на доступ к виду EMPS для всех пользователей при помощи ключевого слова PUBLIC:
GRANT SELECT
ON EMPS
TO PUBLIC; --- PUBLIC значит `ДЛЯ ВСЕХ'
Еще одна возможность SQL - он позволяет создавать виды, возвращающие разные результаты разным пользователям ! Создадим вид таблицы EMP, возвращающий данные только о тех пользователях, номера отдела которых совпадают с номером отдела персоны, использующей данный вид:
CREATE VIEW MYEMPS AS
SELECT *
FROM EMP
WHERE DEPTNO IN
(SELECT DEPTNO
FROM EMP
WHERE ENAME = USER);
Ключевое слово USER (используемое в конструкции WHERE ENAME=USER) возвращает имя текущего вошедшего в систему пользователя. Если это JONES, работающий в отделе 10, то он имеет доступ к виду MYEMPS, где перечислены только работники отдела 10. Если это BLAKE (из отдела 30), то он увидит только работников отдела 30. Другими словами, вид становится чувствительным к тем, кто его использует.
Несложно гарантировать доступ и привилегии обновления к виду MYEMPS для всех трех менеджеров отделов для разрешения им читать и изменять любые данные о работниках только их отделов:
GRANT SELECT,UPDATE
ON MYEMPS
ТО JONES, BLAKE, CLARK;
Таким образом, если работник переведен в другой отдел (то есть значение в поле DEPTNO изменилось), новый менеджер автоматически получает доступ к сведениям по окладу данного работника, а старый менеджер отдела автоматически теряет к нему доступ. Сочетание возможностей VIEW и GRANT, а также ключевого слова USER, дает поддерживающим SQL системам способность осуществлять защиту, чувствительную к содержимому БД.
Команда REVOKE
После предоставления привилегии всегда можно ее отменить при помощи команды REVOKE.
Например, для отмены привилегий ADAMS на введение значений в таблицу DEPT следует задать следующую SQL-инструкцию:
REVOKE INSERT
ON DEPT
FROM ADAMS;
Контрольные вопросы
Каким образом подтверждаются и отменяются привилегии пользователей на доступ к конкретной таблице БД?
Какими привилегиями обладает пользователь по отношению к созданной по его требованию таблице?
Каким образом осуществляется разделение привилегий на доступ к отдельным столбцам таблицы?
В чем заключается принцип защиты информации, чувствительный к содержимому БД?
1.17 Понятие транзакции
Транзакция - логическая единица работы, определяемая пользователем. Важнейшим свойством транзакции является ее атомарность - транзакция должна или завершиться полностью и успешно, или не завершиться совсем. В качестве логической единицы может выступать любое количество операторов SQL (однако целесообразно включать в единичную транзакцию логически связанные запросы). Смысл реализации транзакций - повышение уровня целостности информации в БД в критических ситуациях (например, в случае потери связи с удаленной БД, при сбое питания и др.).
Транзакцию (или логическую единицу работы) можно определить как последовательность ряда таких операций, которые преобразуют некоторое непротиворечивое состояние базы данных в другое непротиворечивое состояние (но не гарантируют сохранения непротиворечивости во все промежуточные моменты времени).
Транзакция начинается выдачей команды BEGIN TRANSACTION (т.е. начать вести журнал транзакции, в который записываются все необходимые изменения в БД). Далее следуют команды изменения БД (`тело' транзакции). Транзакция может завершиться успешно (для чего выдается команда COMMIT) или может быть проведен 'откат' данной транзакции (по команде ROLLBACK) к исходному (до момента начала транзакции) состоянию БД. Команды COMMIT или ROLLBACK могут являться условными; по умолчанию COMMIT выполняется в случае успешного выполнения тела транзакции (что определяется согласно записям в журнале транзакций), в противном случае выполняется ROLLBACK. Естественно, пользователь (обычно привилегированный) имеет возможность `откатить' все зарегистрированные в журнале транзакции.
Контрольные вопросы
Дать определение транзакции. Для применяются транзакции?
В чем заключается основное свойство транзакции?
Что такое журнал транзакций и какие функциональные возможности осуществляются с его помощью?
1.18 Понятие триггера
Триггер (понятие было введено в Oracle) является разновидностью хранимой (т.е. сохраняемой отдельно, а не входящей в код выполняемой программы) процедуры, срабатывающей автоматически при наступлении определенного события и возвращающей логическое значение.
Различают триггеры уровня блоков (активируются при выполнении запросов) и триггеры уровня записей (активируются в моменты изменений в полях БД). Триггеры также разделяются на пред-триггеры (активируются перед выполнением некоего действия) и пост-триггеры (активируются после выполнения действия)
Тело триггера может содержать любое число SQL-операторов, возвращающих значение ИСТИНА при выполнении заложенного в теле триггера условия или ЛОЖЬ в противоположном случае.
Простейший случай использования триггера - обеспечение ссылочной целостности БД. Например, в случае попытки удаления записи в MASTER-таблице триггер должен проверить наличие соответствующих ссылок в DETAIL-таблице (вернув значение ИСТИНА при их наличии и ЛОЖЬ в случае отсутствия); программа пользователя при получении значении ИСТИНА от данного триггера обязана отменить удаление записи.
Триггеры являются интуитивно понятным и мощнейшим средством обеспечения корректности функционирования СУРБД.
Контрольные вопросы
Что такое триггер (в понятиях SQL)?
Триггеры каких уровней и типов существуют?
Привести пример использования триггера при работе с БД.
2. ПРАКТИЧЕСКОЕ ИСПОЛЬЗОВАНИЕ SQL НА ПЭВМ
2.1 Создание приложений класса баз данных в Delphi / С++Builder
Создание приложений класса баз данных в Delphi/С++Builder производится быстро и легко, в то же время достигается большая гибкость в применении. Освоение фирмой Borland операционной системы Linux (RAD-система Kylix, см. http://www.borland.ru/kylix/index.html) еще более повышает ценность накопленных при работе с Delphi / С++Builder навыков программирования.
В основном применяются следующие компоненты Delphi / С++Builder (находятся на страницах DataAceess и DataControls стандартной линейки компонентов):
компонент ТТаblе для доступа к БД без использования SQL или ориентированный на SQL компонент TQuery доступа к БД; эти компоненты осуществляют физический доступ к БД на диске;
компонент TDataSource для связи ТTаblе/TQuery с (видимыми) компонентами представления информации БД;
компонент TDBGrid для визуального представления информации в виде стандартной таблицы (строки коей соответствуют записям, а столбцы - полям БД).
Часто применяют компонент TFieldList, обеспечивающий задание и визуализацию пользовательских заголовков полей в таблицах, компоненты TDBEdit, TDBImage для доступа/редактирования полей таблиц, компонент TDBNavigator для удобного перемещения по записям БД и др.
Для реализации систем класса 'клиент/сервер' обычно дополнительно применяются компоненты TStoredProc и TBatchMove
Таким образом, схема простейшей машины БД в Delphi / С++Builder может быть представлена на рис.2.1.
Для создания простейшей системы управления БД разработчик должен поместить на форму компоненты TTable/TQuery, TDataSource, TDBNavigator / TDBGrid / TDBEdit / TDBImage и настроить их соответствующим образом с помощью Object Inspector'a.
Экран приложения на Delphi / C++Builder |
TDBGrid |
|||||||||||||
TTable или TQuery |
TFieldList |
|||||||||||||
IndexNames |
TDataSource |
|||||||||||||
IndexFieldNames |
||||||||||||||
Оперативная память |
||||||||||||||
Дисковая память |
||||||||||||||
Таблица индексов |
||||||||||||||
Физическая таблица на диске (файл) |
Рис.2.1.Простейшая машина баз данных (схема)
Настройка компонент TDBNavigator/TDBGrid и TDBEdit / TDBMemo / TDBImage заключается в установке свойства DataSource на имя реального компонента TDataSource (а для компонентов TDBEdit / TDBMemo / TDBImage - свойства DataFleld на имя отображаемого поля).
Настройка компонента TDataSource заключается в установке свойства DataSet на имя реального компонента ТТаblе или TQuery
Настройка компонента ТТаblе заключается в установке свойства DatabaseName на имя алиаса нужной таблицы, свойств IndexFieldName или IndexName - на имя ключа, свойства TableName - на имя содержащего таблицу файла, свойства ТаblеТуре - на тип файла БД (dBase, Paradox etc).
Настройка компонента TQuery заключается в установке свойства DatabaseName как указано выше, (необязательных) установках свойств SQL (задать строку SQL-запроса) и Params (задать фактические значения используемых в SQL-запросе параметров). Часто свойства SQL и Params не устанавливаются в Object Inspector'e, a прямо присваиваются в RunTime (как показано ниже).
Установка свойства Active в TRUE (даже в DesignTime) компонентов ТТаblе и TQuery инициирует немедленное открытие нужной таблицы (весьма рекомендуется при отладке). Практические советы по настройке компонентов можно найти в [6,7].
Существенно, что о каждой (физической) таблицей могут быть связаны несколько компонентов TTable/TQuery и др., что бывает необходимо для открытия таблицы в разных режимах.
Сложности может вызвать настройка алиасов (псевдонимов) полных путей к файлам БД в компонентах ТTаblе/TQuery. Пользователь должен задать имя алиаса для каждой физической таблицы или для всех используемых в данном приложении таблиц (или разбить файлы на группы по месту их расположения на диске).
Компонент TQuery использует SQL-выражения для доступа к БД, причем возможны три пути определения SQL-предложения:
статическое SQL-выражение (задается во время DesignTime в свойстве SQL и в простейшем случае не изменяется во время выполнения скомпилированного приложения);
SQL-выражение с параметрами (текст SQL-запроса может содержать начинающиеся с двоеточия формальные параметры, изменяемые во время выполнения скомпилированного приложения);
динамическое задание SQL-запроса; в этом случае текст (строка) SQL-запроса генерируется в RunTime и передается компоненту TQuery для исполнения.
Простейшая схема использования возможностей компонента TQuery, обеспечивающая функционирование SQL-запросов к БД приведен ниже (C-текст дан применительно к системе C++Builder, предполагается, что текст SQL-запроса вводится пользователем в компонент Edit1):
void __fastcall TForm1::RunSQL(TObject *Sender)
{ // функция вызывается при нажатии
// на кнопку `RunSQL' (`Выполнить SQL')
Query1->Close(); // закрыть БД
Query1->SQL->Clear(); // очистить буфер SQL-предписаний
Query1->SQL->Add(Edit1->Text); // копировать в буфер из Edit1
Query1->Open(); // заново открыть БД (c выполнением SQL)
} // конец функции RunSQL
Приближенный к практике Раsса1-текст (для Delphi) в этом случае будет следующим (полагаем, что имя TQuery-компонента суть Query_l, a строки SQL_string_l, SQL_string__2 и др. содержат ранее сгенерированные тексты частей SQL-запроса - например, отдельно SELECT-часть, WHERE-часть и др.):
try { включить режим отслеживание исключительных ситуаций }
Screen.Cursor:=crSQLWait;{ форма курсора - песочные часы }
Query_1.Close;
Query_1.SQL.Clear; { очистить текст SQL-запроса }
Qnery_1.SQL.Add(SQL_string_1); { 1-я часть SQL-запроса }
Query_1.SQL.Add(SQL_string_2); { 2-я часть SQL-запроса }
{ и так далее - текст запроса может быть достаточно длинным... }
Query_1.Prepare; { ...часто повышает эффективность }
Query_1.Open; { выполнение SELECT - запроса}
Screen.Cursor:=crDefault; { форма курсора - по умолчанию }
except { ...какая-то ошибка при выполнении OPEN }
on E:EDatabaseError do
begin
if E.Message=LoadStr(SHandleError) then { ...это не SELECT !}
begin
Query1.ExecSQL; { попытка выполнения не SELECT - запроса }
Screen.Cursor:=crDefault; { форма курсора - по умолчанию }
end
else
begin { ошибка выполнение не SELECT - запроса }
Sсreen.Cursor:=crDefault; { форма курсора - по умолчанию }
{ raise; возбудить исключительное состояние }
MessageDlg('Ошибка выполнения UPDATE,DELETE или ' +
`INSERT', mtError, [mbOk], 0);
end;
end
else
begin { непонятная ошибка... }
Screen.Cursor:=crDefault; { форма курсора - по умолчанию }
{ raise; возбудить исключительное состояние }
MessageDlg('Нераспознанная ошибка SQL-запроса к БД',
mtError,[mbOk],0);
end;
end; { конец блока TRY }
Именно при выполнении метода Open происходит (физическое) соединение с БД, выполнение SQL-запроса и дальнейшая визуализация полученных данных. При наличии в SQL-предложении клауз INSERT, UPDATE, DELETE следует вместо метода Open использовать метод ExecSQL (метод Open используется только тогда, когда запрос предполагает возвращение результата - т.е. используется клауза SELECT).
Для успешной работы следует корректно настроить соответствие алиаса физическому пути к файлу БД и параметры соединения с помощью BDE (Borland Database Engine), в основе которого лежит технология IDAPI (Integrated Database API), см. [6,7] и др.
Контрольные вопросы
Какие компоненты интегрированных сред Delphi / C++Builder применяются при создании приложений класса БД и какие функции они выполняют?
В чем разница использования методов Open и ExecSQL и в каких случаях они применяются?
С помощью каких программных средств устанавливается соответствие алиаса и пути к файлам БД и параметры соединения?
2.2 Использование тренажера локального SQL
Конструирование корректных SQL-предложений на начальном этапе работы с языком SQL может вызвать затруднения, причем отладка SQL-запросов совместно с разрабатываемым Windows-приложением неэффективна из-за больших затрат на компиляцию (интерпретацию) базового приложения.
В связи с огромными возможностями языка SQL конечный результат запроса может быть достигнут различными способами (например, с использование или без использования вложенных запросов); эффективность (время выполнения и требуемый объем оперативной памяти) SQL-запроса при этом может изменяться в значительной степени, поэтому рационально использовать специальные программы-тренажеры (имитаторы выполнения) языка SQL.
При таком подходе SQL-запросы сначала конструируются и оптимизируются пользователем с использованием тренажера и только потом переносятся в приложение. Особенно эффективен такой подход для создания сложных хранимых SQL-процедур.
2.2.1Тренажер SQL-запросов к одной таблице
Для освоения (локального) SQL разработан простой тренажер в применении SQL, исполняемый файл которого называется SQL_1. ЕХЕ.
Тренажер позволяет исполнять SQL-предложения при работе с локальной БД, название файла БД - ЕМР (по строению совпадает с приведенным выше), имя алиаса - ЕМР. Текст SQL-запроса вводится пользователем и исполняется, результат исполнения визуализируется тут же в таблице, ошибка индицируется. Само SQL-выражение запоминается в дисковом файле с расширением SQL_1.SQL и восстанавливается при перестартовке тренажера.
При работе с тренажером имеется возможность пользоваться системой контекстного HELP'a (используется файл LOCALSQL.HLP из поставки Delphi); для вызова системы помощи следует пользоваться клавишей F1 (или Ctrl+Fl) или щелкнуть правой кнопкой 'мыши'.
Для перемещения по записям БД служит компонент TDBNavigator, представленный в виде линейки с кнопками в левой нижней части окна; он же используется для удаления записей, их изменения/добавления (в случае, если в результате последнего выполненного SQL-предписания БД не была открыта в режиме ReadOnly).
При работе тренажера ведется и выдается на экран статистика выполнения SQL-предписаний, протоколирование в файл не предусмотрено.
Общий вид экрана при работе с тренажером SQL_1 приведен ниже на рис.2.2.
Рис.2.2.Копия экрана дисплея при функционировании модуля SQL_1
Работающие на тренажере могут убедиться в наличии в текущем каталоге тренажера временных (начинающихся символом `подчеркивание') файлов, являющимися результатом последнего выполненного SQL-запроса; при штатном окончании Windows-приложения эти файлы стираются.
Пользователь вводит текст SQL-директивы в соответствующем окне и нажимает кнопку ВЫПОЛНИТЬ, после чего в таблице индицируется результат SQL-запроса или выдается предупреждение о невозможности выполнения. Кнопка ПОКАЗАТЬ ВСЮ ТАБЛИЦУ служит для вывода всех записей таблицы ЕМР, при этом (неявно) выполняется SQL-предписание SELECT * FROM 'emp'. Заметим, что в данной реализации SQL имена таблиц следует заключать в кавычки, для наименований полей (вместе с конкретизирующим данное поле именем таблицы) кавычки не требуются.
Пользуясь линейкой управления, можно дополнять / изменять / уничтожать записи (если до этого таблица не была открыта в режиме ReadOnly). Пользуйтесь выдаваемыми системой всплывающими подсказками (инициируются при нахождении указателя 'мыши' над отдельными элементами экрана в течение нескольких секунд).
2.2.2 Тренажер SQL-запросов к двум таблицам
Исполняемый файл данного тренажера имеет название SQL_2.EXE, при работе используется ранее описанная таблица ЕМР и таблица DEPT (строение таблицы DEPT приведено выше), алиас DEPT.
Общий вид экрана при работе с тренажером SQL_2 приведен ниже на рис.2.3. Условно экран разбит на 2 области - в верхней вводятся SQL-директивы и просматривается результат их выполнения (в окне 'РЕЗУЛЬТИРУЮЩАЯ ТАБЛИЦА), в нижней показаны исходные таблицы DEPT и ЕМР (допускается их редактирование с помощью линеек управления).
Пользователь вводит текст SQL-директивы в соответствующем окне и нажимает кнопку ВЫПОЛНИТЬ, после чего в окне РЕЗУЛЬТИРУЮЩАЯ ТАБЛИЦА индицируется результат SQL-запроса или выдается предупреждение о невозможности выполнения. SQL-выражение запоминается в дисковом файле с расширением SQL_2.SQL и восстанавливается при перестартовке тренажера.
Примеры SQL-запросов к таблицам DEP и ЕМР приведен выше. Заметим, что при использовании поля HIREDATE следует применять встроенные функции DAY(), MONTH(), YEAR(); подробнее см. контекстный HELP. Точка с запятой в конце SQL-строки необязательна. Локальный SQL поддерживает псевдонимы внутри SQL-выражений (см. ниже задаваемые в клаузе FROM псевдонимы D и Е для таблиц DEPT и ЕМР соответственно).
SELECT D.deptno,D.dname,D.loc,E.ename,E.job,E.hiredate,E.sal,E.comm
FROM 'dept' D, 'emp' E
WHERE D.deptno = E.deptno
ORDER BY E.sal
Рис.2.3.Копия экрана дисплея при функционировании модуля SQL_2
Пользователь может и должен самостоятельно составить SQL-запросы для уточнения возможностей локального SQL.
2.2.3Утилита dbEXPLORER разработки АО ROSNO
В комплект программного обеспечения для исследования БД входит разработанная и бесплатно распространяемая АО ROSNO утилита dbEXPLORER ('исследователь' БД). Утилита позволяет подключаться к таблице (файлу) БД по известному алиасу, просматривать содержимое БД (и выполнять допустимые SQL-запросы), получать информацию о полях и их типах в выбранной БД.
Утилита dbEXPLORER по функциональности приближается к (штатной) утилите SQL Explorer (см. ниже) и приводится здесь в качестве иллюстрации возможностей создания системного ПО с помощью интегрированных сред Delphi / C++Builder. Принцип взаимодействия пользователя с dbEXPLORER является стандартным для Windows, ввод и выполнение SQL-запросов практически не отличается от вышеописанного.
Рис.2.3.Копия экрана дисплея при функционировании утилиты
dbEXPLORER (русификация FREEWARE-продукта АО ROSNO)
Автор данного пособия заочно благодарен разработчикам dbEXPLORER'a и обязан сообщить о внесенных им несущественных изменениях в исходные тексты dbEXPLORER'а (в основном оформительского характера), не затрагивающих сущности утилиты.
2.3Дополнительные инструментальные средства пакетов Delphi / C++Builder
Для операций с БД в составе систем Delphi / C++Builder штатно поставляется набор утилит, приведенных ниже:
Database Desktop - программа создания и редактирования таблиц, SQL-запросов и запросов типа QBE (Query By Example, запросов по образцу).
BorlandDatabase Engine(BDE) - набор динамических библиотек и драйверов, предназначенных для организации доступа к БД.
BDE Administrator - утилита конфигурации BDE, позволяющая настраивать различные параметры BDE.
SQLExplorer - утилита для просмотра и редактирования БД и словарей данных.
SQLMonitor - программа-монитор для отслеживания порядка выполнения SQL-запросов к удаленным БД.
SQLBuilder - программа визуального конструирования SQL-запросов.
Data Pump - программа для переноса данных между БД различного формата.
LocalInterBaseServer - локальная версия SQL-сервера Borland InterBase.
InterBaseServerforWindows - многопользовательская версия SQL-сервера Borland InterBase.
InterBaseServerManager - программа-администратор управления удаленным сервером.
SQLLinks - набор драйверов для обращения к удаленным промышленным СУБД (Oracle, Microsoft SQL Server). Для доступа к серверу InterBase достаточно возможностей вышеописанного BDE.
ЗАКЛЮЧЕНИЕ
Приведенное учебное пособие по применению языка запросов SQL позволяет обучаемому начать изучение системы и создавать не слишком сложные программы. Для углубления знаний и навыков следует практиковаться при работе с конкретной системой (например, C++Builder, Delphi, Oracle etc) и пользоваться дополнительной литературой.
СПИСОК ЛИТЕРАТУРЫ
1. Грабер M. SQL. -M.: Лори, 2001. -643 C.
2. Пейдж В. Использование ORACLE 8/8i (специальное издание). -М.: Диалектика, 1999. -464 C.
3. Мещеряков Е.В., Хомоненко А.Д. Публикация баз данных в Интернете. -CПб.: BHV-Петербург, 2001. -560 С.
4. Codd E.F. Normalized database structure: A brief tutorial. ACM SIGFIDET Workshop on datadescription, access and control. Nov. 1971.
5. Мaier D. The Theory of Relational Databases. ComputerScience Press, 1983.
6. Гофман В., Хомоненко А. Delphi 5. -CПб.: BHV-Петербург, 2000. -800 С.
7. Елманова Н.З.Borland С++Builder. -М.: Диалог-МИФИ, 1998. - 240 C.
8. TUXEDO System: разработка систем клиент-сервер. Ладыженский Г.М.. В сб. 'Системы управления базами данных', 1996. № 1,2.
Подобные документы
Изучение основных принципов разработки приложений баз данных в среде Delphi. Создание таблиц, псевдонима и вычисляемых полей базы данных. Особенности организации поиска и фильтрации. Сортировка данных в таблицах. Построение запросов. Генерация отчетов.
курсовая работа [1,3 M], добавлен 05.02.2017Программа поиска в базе данных в среде Borland Delphi 7.0 Enterprise. Условия и блок-схемы задач. Ввод массива. Текст программ в Delphi, в Паскаль. Текст программы поиска в базе данных. Кодирование материала. Изготовление реляционной базы данных.
практическая работа [27,6 K], добавлен 11.10.2008Создание таблиц базы данных с помощью MS Access "Страны Азии". Форма базы данных и запросы к выборкам данных. Модификация структуры таблиц, создания связей между главными таблицами, редактирование данных и проектирование форм для реальной базы данных.
контрольная работа [723,9 K], добавлен 25.11.2012Создание и использование динамически загружаемых библиотек в Delphi. Преимущества использования, создание простейшей DLL. Статическая и динамическая загрузка DLL, обмен данными с ней. Создание программы, работающей с базой данных клиентов кардиоцентра.
курсовая работа [425,2 K], добавлен 07.07.2012Использование баз данных менеджерами автосалонов для повышения качества и скорости обслуживания клиентов. Создание запросов на добавление, удаление, обновление данных. Запросы перекрестный, на выборку. Кнопочная форма базы данных с практичным интерфейсом.
курсовая работа [1,6 M], добавлен 10.02.2014Построение банков данных. Инструментальные средства баз данных Borland. Принцип работы и архитектура баз данных в Delphi. Навигационный способ доступа к базам данных: операции с таблицей, сортировка и перемещение по набору данных, фильтрация записей.
курсовая работа [642,7 K], добавлен 06.02.2014Типы данных языка SQL, определенные стандартом ISO. Средства поддержки целостности данных. Введение ограничений для доменов. Разработка рабочего проекта для автосалона. Построение информационной схемы базы. Создание форм для занесения данных в таблицы.
курсовая работа [2,5 M], добавлен 29.01.2012Разработка информационной и инфологической модели базы данных на тему "Командировка". Выбор модели данных и составление ее концептуальной схемы. Получение доступа к БД средствами Delphi, разработка пользовательского интерфейса. Реализация SQL-запросов.
реферат [1,2 M], добавлен 16.06.2009Работа с хранящейся в базах данных информацией. Язык описания данных и язык манипулирования данными. Распространение стандартизованных языков. Структурированный язык запросов SQL. Язык запросов по образцу QBE. Применение основных операторов языка.
презентация [76,2 K], добавлен 14.10.2013Структура таблицы и типы данных. Ввод данных в ячейки таблицы. Создание запросов на выборку, удаление, обновление и добавление записей, на создание таблицы. Основное различие между отчетами и формами, их назначение. Создание отчетов для базы данных.
курсовая работа [1,9 M], добавлен 17.06.2014