Вопросы - Ответы БД
.pdfТаблица 25 Отношение ВЕЩЕСТВО
НОМ_ЭЛЕМЕНТА |
ЭЛЕМЕНТ |
|
|
1 |
Водород |
|
|
2 |
Гелий |
|
|
… |
… |
|
|
105 |
… |
|
|
Таблица 26 Отношение ЭЛЕМЕНТЫ
НОМ_ВЕЩЕСТВА |
НОМ_ЭЛЕМЕНТА |
ПРОЦЕНТ |
|
|
|
1 |
1 |
5 |
|
|
|
1 |
2 |
3 |
|
|
|
1 |
105 |
0.01 |
|
|
|
2 |
1 |
50 |
|
|
|
Таблица 27 Отношение ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ
Для отношений, нормализованных таким образом, исходный запрос реализуется следующей последовательностью операторов:
1.R1(НОМЕР_ВЕЩЕСТВА,НОМ_ЭЛЕМЕНТА,ПРОЦЕНТ)= ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ*ПРОЦЕНТ>90+. (Выборка из отношения).
2.R2(НОМ_ЭЛЕМЕНТА) = R1*НОМ_ЭЛЕМЕНТА+. (Проекция отношения).
3.R3(НОМ_ЭЛЕМЕНТА,ЭЛЕМЕНТ)= R2*НОМ_ЭЛЕМЕНТА=НОМ_ЭЛЕМЕНТА+ЭЛЕМЕНТЫ. (Естественное соединение)
4.ОТВЕТ(ЭЛЕМЕНТ) = R3*ЭЛЕМЕНТ+. (Проекция таблицы).
На языке SQL такой запрос реализуется одной командой:
SELECT ЭЛЕМЕНТЫ.ЭЛЕМЕНТ
FROM ЭЛЕМЕНТЫ, ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ
WHERE
ЭЛЕМЕНТЫ.НОМ_ЭЛЕМЕНТА=ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ.НОМ_ЭЛЕМЕНТА AND ХИМИЧЕСКИЙ_СОСТАВ_ВЕЩЕСТВ.ПРОЦЕНТ>90;
Невыразимость транзитивного замыкания реляционными операторами
Следующий пример иллюстрирует класс запросов, невыразимых средствами реляционной алгебры или реляционного исчисления по причине невыразимости средствами реляционной алгебры транзитивного замыкания отношений (см. гл. 1).
Пример 17. Рассмотрим отношение, описывающее сотрудников некоего предприятия. Отношение содержит данные о табельном номере сотрудника, фамилии, должности и табельном номере руководителя сотрудника – СОТРУДНИКИ (ТАБ_НОМ, ФАМИЛИЯ, ДОЛЖНОСТЬ, ТАБ_НОМ_РУК):
ТАБ_НОМ |
ФАМИЛИЯ |
ДОЛЖНОСТЬ |
ТАБ_НОМ_РУК |
|
|
|
|
1 |
Иванов |
Директор |
1 |
|
|
|
|
2 |
Петров |
Глав.бухгалтер |
1 |
|
|
|
|
3 |
Сидоров |
Бухгалтер |
2 |
|
|
|
|
4 |
Васильев |
Начальник цеха |
1 |
|
|
|
|
5 |
Сухов |
Мастер |
4 |
|
|
|
|
6 |
Шарипов |
Рабочий |
5 |
|
|
|
|
… |
… |
… |
… |
|
|
|
|
Таблица 28 Отношение СОТРУДНИКИ
Рассмотрим запрос "Перечислить всех руководителей (прямых и непрямых) данного сотрудника".
Ответом на запрос может быть получен при помощи понятия транзитивного замыкания. Однако транзитивное замыкание не может быть выражено операторами реляционной алгебры.
Кросс-таблицы
Одной из задач, связанных с представлением табличных данных является построение так называемых кросс-таблиц.
Пусть имеется отношение с тремя атрибутами и потенциальным ключом, включающим первые два атрибута. Примером такого отношения могут быть данные с объемами продаж различных товаров за некоторые промежутки времени:
Товар |
Месяц |
Количество |
|
|
|
Компьютеры |
Январь |
100 |
|
|
|
Принтеры |
Январь |
200 |
|
|
|
Сканеры |
Январь |
300 |
|
|
|
Компьютеры |
Февраль |
150 |
|
|
|
Принтеры |
Февраль |
250 |
|
|
|
Сканеры |
Февраль |
350 |
|
|
|
… |
… |
… |
|
|
|
Таблица 29 Данные о продажах
Требуется представить эти данные в виде таблицы, по строкам которой идут наименования товаров, по столбцам - месяцы, а в ячейках содержатся объемы продаж. Это и будет кросс-таблицей:
Товар |
Январь |
Февраль |
… |
|
|
|
|
Компьютеры |
100 |
150 |
… |
|
|
|
|
Принтеры |
200 |
250 |
… |
|
|
|
|
Сканеры |
300 |
350 |
… |
|
|
|
|
Таблица 30 Кросс-таблица
Построение кросс-таблицы средствами реляционной алгебры невозможно, т.к. для этого требуется превратить данные в ячейках таблицы в наименования новых столбцов таблицы.
7.SQL. Язык определения данных (DataDefinitionlanguage– DDL),Язык манипуляции данными (Datamanipulationlanguage–DML). Основные операторы.
DDL
Data Definition Language (DDL) (язык описания данных) — это семейство компьютерных языков, используемых в компьютерных программах для описания структуры баз данных.
На текущий момент наиболее популярным языком DDL является SQL, используемый для получения и манипулирования данными в РСУБД, и сочетающий в себе элементы DDL и
DML.
Функции языков DDL определяются первым словом в предложении (часто называемом запросом), которое почти всегда является глаголом. В случае с SQL эти глаголы — «create» («создать»), «alter» («изменить»), «drop» («удалить»). Это превращает природу языка в ряд обязательных утверждений (команд) к базе данных.
CREATE TABLE (Создать таблицу)
INSERT (Вставить)
UPDATE (Обновить)
ALTER TABLE (Изменить таблицу)
CREATE VIEW (Создать представление)
CREATE INDEX (Создать индекс)
DROP TABLE (Удалить таблицу)
•Create • Alter • Drop • Commit • Rollback
Data Manipulation Language (DML) (язык управления (манипулирования) данными) — это семейство компьютерных языков, используемых в компьютерных программах или пользователями баз данных для получения, вставки, удаления или изменения данных в базах данных.
На текущий момент наиболее популярным языком DML является SQL, используемый для получения и манипулирования данными в РСУБД. Другие формы DML использованы в IMS/DL1, базах данных CODASYL (таких как IDMS), и других.
Языки DML изначально использовались только компьютерными программами, но с появлением SQL стали также использоваться и людьми.
Функции языков DML определяются первым словом в предложении (часто называемом запросом), которое почти всегда является глаголом. В случае с SQL эти глаголы — «insert» («вставить»), «update» («обновить»), и «delete» («удалить»). Это превращает природу языка в ряд обязательных утверждений (команд) к базе данных.
Select • Insert • Update • Merge • Delete • Truncate • Join • Union
8. Транзакции. Изолированность транзакций, блокировки.
Транзакции
Обязательным (хотя и не достаточным) условием сохранения ссылочной целостности базы данных является поддержка транзакций. Если программное обеспечение выполняет группу связанных между собой операций, которые по отдельности могут приводить к нарушению целостности ссылок, СУБД должна предоставлять возможность выполнения всей этой группы в одной транзакции, то есть так, чтобы при любом сбое производилась автоматическая отмена всех операций группы, в том числе уже полностью завершѐнных.
Проблемы параллельного доступа с использованием транзакций
При параллельном использовании транзакций могут возникать следующие проблемы:
–потерянное обновление (lost update);
–«грязное» чтение (dirty read) — чтение данных, которые были записаны откатанной транзакцией;
–неповторяющееся чтение (non-repeatable read);
–фантомная вставка (phantom insert).
Рассмотрим ситуации, в которых возможно возникновение данных проблем.
Потерянное обновление
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
|
|
|
|
|
|
Транзакция 1 |
|
|
Транзакция 2 |
|
|
|
|
|
|
|
|
|
|
SELECT |
f2 FROM tbl1 WHERE f1=1; |
|
SELECT |
f2 FROM tbl1 WHERE f1=1; |
|
|
|
|
|
|
|
|
|
|
UPDATE |
tbl1 SET f2=20 WHERE f1=1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UPDATE |
tbl1 SET f2=25 WHERE f1=1; |
|
|
|
|
|
|
|
|
|
|
В транзакции 1 изменяется значение поля f2, а затем в транзакции 2 также изменяется значение этого поля. В результате изменение, выполненное первой транзакцией, будет потеряно.
«Грязное» чтение
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
Транзакция 1 |
|
Транзакция 2 |
|
|
|
SELECT f2 FROM tbl1 WHERE f1=1;
UPDATE tbl1 SET f2=f2+1 WHERE f1=1;
SELECT f2 FROM tbl1 WHERE f1=1;
ROLLBACK WORK;
В транзакции 1 изменяется значение поля f2, а затем в транзакции 2 выбирается значение этого поля. После этого происходит откат транзакции 1. В результате значение, полученное второй транзакцией, будет отличаться от значения, хранимого в базе данных.
Неповторяющееся чтение
Предположим, имеются две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
|
|
|
|
|
|
|
|
|
Транзакция 1 |
|
|
|
Транзакция 2 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SELECT |
f2 FROM tbl1 WHERE f1=1; |
|
SELECT |
f2 |
FROM |
tbl1 |
WHERE f1=1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UPDATE |
tbl1 SET f2=f2+1 WHERE f1=1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
COMMIT; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SELECT |
f2 |
FROM |
tbl1 |
WHERE f1=1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
В транзакции 2 выбирается значение поля f2, затем в транзакции 1 изменяется значение поля f2. При повторной попытке выбора значения из поля f2 в транзакции 2 будет получен другой результат. Эта ситуация особенно неприемлема, когда данные считываются с целью их частичного изменения и обратной записи в базу данных.
Фантомная вставка
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
Транзакция 1 |
|
Транзакция 2 |
|
|
|
SELECT SUM(f2) FROM tbl1; INSERT INTO tbl1 (f1,f2) VALUES (15,20);SELECT SUM(f2) FROM tbl1;
В транзакции 2 выполняется SQL-оператор, использующий все значения поля f2. Затем в транзакции 1 выполняется вставка новой строки, приводящая к тому, что повторное выполнение SQL-оператора в транзакции 2 выдаст другой результат. Такая ситуация называется фантомной вставкой и является частным случаем неповторяющегося чтения. При этом, если выполняемый SQL-оператор выбирает не все значения поля f2, а только значение одной строки таблицы (используется предикат WHERE), то выполнение оператора INSERT не приведет к ситуации фантомной вставки.
Уровни изоляции
Стандарт SQL-92 определяет уровни изоляции, установка которых предотвращает определенные конфликтные ситуации. Введены следующие четыре уровня изоляции:
Serializable (упорядочиваемость)
Самый высокий уровень изолированности; транзакции полностью изолируются друг от друга. На этом уровне результаты параллельного выполнения транзакций для базы данных в большинстве случаев можно считать совпадающими с последовательным выполнением тех же транзакций (по очереди в каком-либо порядке).
Repeatable read (повторяемость чтения)
Уровень, при котором чтение одной и той же строки или строк в транзакции дает одинаковый результат. (Пока транзакция не завершена, никакие другие транзакции не могут модифицировать эти данные.)
Read committed (чтение фиксированных данных)
Принятый по умолчанию уровень для SQL Server. Завершенное чтение, при котором отсутствует черновое, "грязное" чтение.(т.е. чтение одним пользователем данных, которые не были зафиксированны в БД командой COMMIT) Тем не менее в процессе работы одной транзакции другая может быть успешно завершена и сделанные ею изменения зафиксированы. В итоге первая транзакция будет работать с другим набором данных. Это проблема неповторяемого чтения.
В Oracle блокировки на чтение нет, вместо этого «читающая» транзакция получает ту версию данных, которая была актуальна в базе до начала «пишущей».
Read uncommitted (чтение незафиксированных данных)
Низший уровень изоляции, соответствующий уровню 0. Он гарантирует только физическую целостность данных: если несколько пользователей одновременно изменяют одну и ту же строку, то в окончательном варианте строка будет иметь значение, определенное пользователем, последним изменившим запись, а не смешанные значения столбцов отдельных пользователей (повреждение данных). По сути, для транзакции не устанавливается никакой блокировки, которая гарантировала бы целостность данных.
Поведение при различных уровнях изолированности
«+» — предотвращает, «–» — не предотвращает.
|
|
|
|
|
|
|
|
|
Уровень изоляции |
|
Фантомная |
|
Неповторяющееся |
|
«Грязное» |
|
Потерянное |
|
вставка |
|
чтение |
|
чтение |
|
обновление |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
SERIALIZABLE |
|
+ |
|
+ |
|
+ |
|
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
REPEATABLE READ |
|
– |
|
+ |
|
+ |
|
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
READ COMMITED |
|
– |
|
– |
|
+ |
|
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
READ |
|
– |
|
– |
|
– |
|
+ (?) |
UNCOMMITTED |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9. Права пользователей и привилегии (на примере любой СУБД). CREATE USER имя_пользователя IDENTIFIED BY пароль_пользователя;
Синтаксис команды CREATE USER следующий:
CREATE USER имя_пользователя
IDENTIFIED BY пароль
или IDENTIFIED EXTERNALLY или IDENTIFIED GLOBALLY
AS `CN=user'
[ DEFAULT TABLESPACE имя_табличного_пространства ]
[ TEMPORARY TABLESPACE имя_табличного_пространства ]
[ QUOTA [ число K или M или UNLIMITED ] ON имя_таблчиного_пространства ] [, QUOTA [ число K или M или UNLIMITED ] ON имя_табличного_пространства ] [ PROFILE наименование_профиля ]
[ PASSWORD EXPIRE ]
[ ACCOUNT LOCK или ACCOUNT UNLOCK ]
Вот что означают параметры этой команды:
CREATE USER имя_пользователя – имя создаваемого пользовательского аккаунта, обязательное поле.
IDENTIFIED BY пароль – Oracle самостоятельно будет идентифицировать пользователя по паролю. Это первоначальный пароль, который со временем можно изменить.
IDENTIFIED EXTERNALL – Пользователь будет идентифицироваться средствами операционной системы. Имя пользователя должно быть идентичным тому, что используется операционной системой.
IDENTIFIED GLOBALLY AS ` CN = user ' – Имя пользователя будет идентифицироваться службой каталогов (enterprise directory service) Oracle .
Примечание: Должен использоваться один и только один способ идентификации пользователя.
DEFAULT TABLESPACE имя_табличного_пространства – Табличное пространство по-
умолчанию, к которому будет прикреплен пользователь. Если его не указать, то будет использоваться табличное пространство SYSTEM.
TEMPORARY TABLESPACE имя_табличного_пространства – временное табличное пространств для пользователя. По-умолчанию будет использоваться SYSTEM.
QUOTA число K или M ON имя_табличного_пространства – Определяет квоту (т.е.
ограничение) на использование указанного табличного пространства в К (килобайтах) или М (мегабайтах).
QUOTA UNLIMITED ON имя_табличного_пространства – для указанного табличного пространства будет установлена неограниченная квота.
PROFILE имя_профиля – пользователю будет присвоен определенный профиль.
PASSWORD EXPIRE – Паролю немедленно будет присвоен статус устаревшего. Пользователю придется сменить пароль перед первым использованием своей учетной записи (аккаунта).
ACCOUNT LOCK – аккаунт будет заблокирован сразу после его создания.
ACCOUNT UNLOCK – аккаунтом можно пользоваться сразу после создания.
Изменение пользовательских аккаунтов
Для того чтобы изменить параметры пользовательской учетной записи можно опять же воспользоваться Enterprise Manager-ом, или выполнить соответствующую SQL-команду.
В Enterprise Manager надо найти ветку искомого пользователя, и в контекстном меню выбрать команду EDIT . В открывшейся экранной форме можно произвести все необходимые изменения, и сохранить их нажатием кнопки APPLY (применить).
SQL -команда изменения пользователя имеет следующий синтаксис:
ALTER USER имя_пользователя
IDENTIFIED BY пароль
или IDENTIFIED EXTERNALLY или IDENTIFIED GLOBALLY AS `CN=user' [ DEFAULT TABLESPACE имя_табличного_пространства ]
[ TEMPORARY TABLESPACE имя_табличного_пространства ]
[ QUOTA [ число K или M или UNLIMITED ] ON имя_табличного_пространства ]
[, QUOTA [ number K or M or UNLIMITED ] ON имя_табличного_пространства ] [ PROFILE наименования_профиля ]
[ PASSWORD EXPIRE ]
[ ACCOUNT LOCK или ACCOUNT UNLOCK ]
[ DEFAULT ROLE имя_роли [, имя_роли ]
или [ DEFAULT ROLE ALL [ EXCEPT имя_роли [, имя_роли ] ] ] или [ DEFAULT ROLE NONE ]
Параметры, которые можно изменить, аналогичны тем, которые мы указывали при создании пользователя, за небольшим исключением. Этим исключением являются роли по-умолчанию.
Думаю, сейчас следует сделать небольшое отступление, и рассказать - что же из себя представляют роли.
Роль – это набор (или, иными словами, группа) системных и объектных привилегий. А привилегия – это право на исполнение определенной SQL -команды или на доступ к определенному объекту. Например, системная привилегия SELECT ANY TABLE разрешает выполнить оператор SELECT для любой таблицы. Если мы эту привилегию присвоим роли SOME _ ROLE , а затем эту роль предоставим некоторому пользователю, то этот пользователь также получит привилегию SELECT ANY TABLE . Роли можно присваивать и другим ролям.
Тут Вы можете спросить, зачем же нужны роли, если мы и так можем присвоить все необходимые привилегии выбранному пользователю? Так вот, роли значительно упрощают управление привилегиями. Представьте, что у Вас 100 пользователей, и каждому из них надо присвоить массу привилегий. Вы же замучаетесь их присваивать и рано или поздно допустите ошибку. Используя роли можно добиться того же результата гораздо эффективнее. Кроме того, Вы можете включить и выключить любую роль.
Также есть механизм присваивания пароля для роли, при этом ролью могут воспользоваться лишь те пользователи, которые знают пароль. Все пользователи, которым применена роль по умолчанию, могут пользоваться всеми привилегиями такой роли, без необходимости вводить пароль. Но, обратите внимание, что даже если у пользователя есть роль по-умолчанию ( DEFAULT ROLE ), то он может ей пользоваться только в случае, когда она ему непосредственно присвоена до этого. Иными словами, прежде чем указать роль по-умолчанию, эта роль должна быть назначена пользователю.
Сразу после создания пользовательского аккаунта, для него назначаются все роли поумолчанию (DEFAULT ROLE ALL). Если какие либо роли исключаются из DEFAULT, то пользователь не сможет воспользоваться соответствующими правами, пока не включит роль командой SET ROLE ИМЯ_РОЛИ.