Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
135
Добавлен:
22.03.2015
Размер:
2.28 Mб
Скачать

Intersect и minus

Команда UNION, как вы уже видели в Главе 14, может объединить два

запроса, обьединив их вывод в один. Два других обычно имеющихся спосо-

ба объединения отдельных запросов - это INTERSECT(Плюс) и MINUS(Ми-

нус). INTERSECT выводит только строки произведенные обоими перекресны-

ми запросами, в то время как MINUS выводит строки которые производятся

одним запросом, но не другим. Следовательно, следующие два запроса

SELECT *

FROM Salespeople

WHERE city = 'London'

INTERSECT

SELECT *

FROM Salespeople

WHERE 'London' IN

(SELECT city

FROM Customers

WHERE Customers.snum =

Salespeople.snum);

выведут строки произведенные обоими запросами, производящими всех про-

давцов в Лондоне которые имели по крайней мере одного заказчика разме-

щенного там также. С другой стороны, запрос

SELECT *

FROM Salespeople

WHERE city = 'London'

MINUS

SELECT *

FROM Salespeople

WHERE 'London' IN

(SELECT sity

FROM Customers

WHERE Customers.snum =

Salespeople.snum);

удалит строки выбранные вторым запросом из вывода первого, и таким об-

разом будут выводены все продавцы в Лондоне которые не имели там за-

казчиков. MINUS иногда еще называют DIFFERENCE (ОТЛИЧИЕ)

Автоматические внешние объединения

В Главе 14, мы обсуждали внешнее обьединение и показывали вам как

выполнять его используя команду UNION. Некоторые программы базы данных

имеют более непосредственный способ выполнения внешних обьединений. В

некоторых реализациях, вводимый знак " + " после предиката, может вы-

водить строки которые удовлетворяют условию также как и строки которые

ему не удовлетворяют. В условии предиката может содержаться поле сов-

падающее для обеих таблиц, и NULL значения будут вставлены там, где

такого совпадения не будет найдено. Например, предположим вы хотите

видеть ваших продавцов и соответствующих им заказчиков, не исключая

тех продавцов которым не назначено ни одного заказчика ( хотя такого

нет в наших типовых таблицах, но в действительности это возможно ) :

SELECT a.snum, sname, cname

FROM Salespeople a, Customers b

WHEREa.snum = b.snum(+);

Это является эквивалентом следующего объединения (UNION):

SELECT a.snum, sname, cname

FROM Salespeople a, Customers b

WHERE a.snum = b.snum

UNION

SELECT snum, sname, '_ _ _ _ _ _ _ _ _ _'

FROM Salespeople

WHERE snum NOT IN

(SELECT snum

FROM Customers);

Мы считаем что подчеркивания будут отображены NULL значениями( см. ко-

манду FORMAT ранее в этом приложении где описывалось отображение NULL

значениями).

Отслеживание действий

Ваша SQL реализация - достаточна хороша, если она доступна многим

пользователями, чтобы обеспечивать для них некий способ слежения за

действиями выполняемыми в базе данных. Имеются две основные формы что-

бы делать это:

Journaling(Протоколирование) и Auditing(Ревизия).

Эти формы отличаются по назначению. Journaling, пименяется с целью

защиты ваших данных, при разрушении вашей системы. Сначала Вы исполь-

зуете реализационно-зависимую процедуру чтобы архивировать текущее со-

держание вашей базы данных, поэтому копия ее содержания где-нибудь бу-

дет сохранена. Затем вы просматриваете протокол изменений сделанных в

базе данных. Он сохраняется в некоторой области памяти, но не в глав-

ной памяти базы данных а желательно на отдельном устройстве, и содер-

жит список всех команд которые произвели изменения в структуре или в

содержании базы данных. Если у вас вдруг появились проблемы и текущее

содержание вашей базы данных оказалось нарушенным, вы можете повторно

выполнить все изменения зарегистрированные в протоколе на резервной

копии вашей базы данных, и снова привести вашу базу данных в состояние

которое было до момента последней записи в протокол. Типичной командой

чтобы начать протоколирование, будет следующяя:

SET JOURNAL ON;

Auditing используется c целью защиты. Она следит за тем, кто и какие

действия выполнял в базе данных, и сохраняет эту информацию в таблице

доступной только очень немногим высоко привилегированным пользовате-

лям. Конечно, вы редко будете прибегать к процедуре ревизии, потому

что очень скоро она займет много памяти и вам будет сложно работать в

вашей базе данных. Но вы можете устанавливать ревизию для определенных

пользователей, определенных действий или определенных объектов данных.

Имеется такая форма команды AUDIT:

AUDIT INSERT ON Salespeople BY Diane;

Или предложение ON или предложение BY могут быть исключены, устанав-

ливая ревизию, либо всех объектов или всех пользователей, соответс-

твенно. Применвние AUDIT ALL, вместо AUDIT INSERT, приведет к отслежи-

ванию всех действий Diane в таблице Продавцов.

Соседние файлы в папке Базы данных