Мартин Грубер - Понимание SQL (991940), страница 41
Текст из файла (страница 41)
Привилегия создавать таблицы, хотя и может быть передана по всей базе данных, часто передается в конкретной DBS. Мы можем создать DBS с именемSampletables, следующей командой:CREATE DBSPACE Sampletables(pctindex 10,pctfree 25);Параметр pctindex определяет, какой процент DBS должен быть оставлен, чтобысохранять в нем индексы таблиц. Pctfree — это процент DBS, который оставлен, чтобы позволить таблицам расширять размеры их строк (ALTER TABLE может добавлятьстолбцы или увеличивать размер столбцов, делая каждую строку длиннее.
Это —расширение памяти, отводимой для этого). Имеются также другие параметры, которые вы также можете определять, и которые меняются от программы к программе.Большинство программ автоматически будут обеспечивать значения по умолчанию,поэтому вы можете создавать DBS, не определяя эти параметры. DBS может иметьили определенное ограничение размера, или ей может быть позволено растинеограниченно вместе с таблицами.Если DBS создалась, пользователям предоставляются права создавать в нейобъекты. Вы можете например предоставить Diane право создать таблицуSampletables с помощью следующей команды:GRANT RESOURCE ON Sampletables TO Diane;Это даст вам возможность более конкретно определять место хранения данных.Первый DBS, назначаемый данному пользователю — обычно тот, где все объектыэтого пользователя создаются по умолчанию.Пользователи, имеющие доступ к многочисленым DBS, могут определить, гдеони хотят разместить определенный объект.При разделении вашей базы данных на DBSы, вы должны иметь в виду типыопераций, которые вы будете часто выполнять.
Таблицы, которые, как вам уже известно, будут часто объединяться, или которые имеют одну таблицу, ссылающуюсяна другую во внешнем ключе, должны находиться вместе в одной DBS.Например, вы могли бы сообщить при назначении типовых таблиц, что таблицаПорядков будет часто объединяться с одной или обеими из двух других таблиц, таккак таблица Порядков использует значения из обеих этих таблиц. При прочих равныхусловиях, эти три таблицы должны входить в ту же самую область DBS, независимоот того, кто их владелец.
Возможное присутствие ограничения внешнего ключа в таблице Порядков, просто приведет к более строгому совместному использованию области DBS.КОГДА СДЕЛАННЫЕ ИЗМЕНЕНИЯ СТАНОВЯТСЯПОСТОЯННЫМИ?Визуально, среда базы данных — это картина, которая постоянно отображаетдля существующих пользователей постоянно вводимые и изменяемые данные, допуская, что если система правильно разработана, она будет функционировать без сбоев.Однако реально, благодаря человеческим или компьютерным сбоям, ошибки время отвремени случаются, и поэтому хорошие компьютерные программы стали применятьспособы отмены действий, вызвавших такие ошибки.Команда SQL, которая воздействует на содержание или структуру базы данных— например команда модификации DML или команда DROP TABLE, — не обязательно будет необратимой.
Вы можете определить после окончания ее действия, останутся ли изменения, сделанные данной командой или группой команд постоянными вбазеы данных, или они будут полностью проигнорированы. С этой целью, командыобрабатываются группами, называемыми транзакциями.Транзакция начинается всякий раз, когда вы начинаете сеанс с SQL. Все команды которые вы введете будут частью этой транзакции, пока вы не завершите их вводом команды COMMIT WORK или команды ROLLBACK WORK.
COMMIT можетсделать все изменения постоянными с помощью транзакции, а ROLLBACK может откатить их братно или отменить. Новая транзакция начинается после каждой командыCOMMIT или ROLLBACK. Этот процесс известен как диалоговая обработка запросовили транзакция. Синтаксис, чтобы оставить все ваши изменения постоянными вовремя регистрации, или во время последнего COMMIT или ROLLBACKCOMMIT WORK;Синтаксис отмены изменения ROLLBACK WORK;В большинстве реализаций, вы можете установить параметр, называемыйAUTOCOMMIT.
Он будет автоматически запоминать все действия, которые будут выполняться. Действия, которые приведут к ошибке, всегда будут автоматически "прокручены" обратно. Если это предусмотрено в вашей системе, для фиксации всехваших действий, вы можете использовать эту возможность с помощью команды типа:SET AUTOCOMMIT ON;Вы можете вернуться к обычной диалоговой обработке запросов с помощью такой команды:SET AUTOCOMMIT OFF;Имеется возможность установки AUTOCOMMIT, которую система выполнит автоматически при регистрации.Если сеанс пользователя завершается аварийно — например, произошел сбойсистемы или выполнена перезагрузка пользователя, — то текущая транзакция выполнит автоматический откат изменений. Это — одна из причин, по которой вы можетеуправлять выпонением вашей диалоговой обработки запросов, разделив ваши команды на большое количество различных транзакций.
Одиночная транзакция не должнасодержать много несвязанных команд; фактически, она может состоять из единственной команды.Транзакции, которые включают всю группу несвязанных изменений, не оставляют вам фактически никакого выбора, сохранить или отклонить целую группу, если выхотите отменить только одно определенное изменение. Хорошее правило, которомунадо следовать, это делать ваши транзакции, состоящими из одной команды или нескольких близко связанных команд. Например, предположим, вы хотите удалить продавца Motika из базы данных. Прежде, чем вы удалите его из таблицы Продавцов, высначала должны сделать что-нибудь с его порядками и его заказчиками.
(Если используются ограничения внешнего ключа, и ваша система, следуя ANSI, ограничиваетизменение родительского ключа, у вас не будет выбора, делать или не делать этого.Это будет сделано обязательно.)Одно из логических решений будет состоять в том, чтобы установить поле snumв его порядках в NULL, в следствии чего ни один продавец не получит комиссионные вэтих порядках, пока комиссионые не будут предоставлены заказчикам для Peel. Затемвы можете удалить их из таблицы Продавцов:UPDATE OrdersSET snum = NULLWHERE snum = 1004;UPDATE CudomersSET snum = 1001WHERE snum = 1004;DELETE FROM SalespeopleWHERE snum = 1004;Если у вас проблема с удалением Motika (возможно, имеется другой внешнийключ, ссылающийся на него, о котором вы не знали и не учитывали), вы могли бы отменить все изменения, которые вы сделали, до тех пор, пока проблема не будет определена и решена.Более того, это должна быть группа команд, чтобы обрабатывать ее как одиночную транзакцию.
Вы можете предусмотреть это с помощью команды COMMIT, и завершить ее с помощью команды COMMIT или ROLLBACK.КАК SQL ОБЩАЕТСЯ СРАЗУ СО МНОГИМИПОЛЬЗОВАТЕЛЯМИSQL часто используется в многопользовательских средах — в средах, где сразумного пользователей могут выполнять действия в базе данных одновременно.
Этосоздает потенциальную возможность конфликта между различными выполняемымидействиями. Например, предположим что вы выполняете команду в таблице Продавцов:UPDATE SalespeopleSET comm = comm * 2WHERE sname LIKE 'R%';и в это же время, Diane вводит такой запрос:SELECT city, AVG (comm)FROM SalespeopleGROUP BY city;Может ли усредненное значение (AVG) Diane отразить изменения, которые выделаете в таблице? Не важно, будет это сделано или нет, а важно, что бы были отражены или все, или ни одно из значений комиссионных (comm), для которых выполнялись изменения.
Любой промежуточный результат является случайным илинепредсказуемым, для порядка в котором значения были изменены физически. Выводзапроса не должен быть случайным и непредсказуемым.Посмотрим на это с другой стороны. Предположим, что вы находите ошибку ипрокручиваете обратно все ваши модификации уже после того, как Diane получила ихрезультаты в виде вывода. В этом случае Diane получит ряд усредненых значений,основанных на тех изменениях, которые были позже отменены, не зная, что ее информации неточна.Обработка одновременных транзакций называется параллелизмом или совпадением и имеет ряд возможных проблем, которые могут при этом возникать.
Имеютсяследующие примеры:* Модификация может быть сделана без учета другой модификации. Например, продавец должен сделать запрос к таблице инвентаризации, чтобы найти десятьфрагментов пунктов торговцев акциями, и упорядочить шесть из них для заказчика.Прежде, чем это изменение было сделано, другой продавец делает запрос к таблицеи упорядочивает семь из тех же фрагментов для своего заказчика.ПРИМЕЧАНИЕ: Термин "упорядочить", аналогичен общепринятому — "заказать",что в принципе более соответствует логике запроса, потому что с точки зрения пользователя, он именно "заказывает" информацию в базе данных, которая упорядочиваетэту информацию в соответствии с "заказом".* Изменения в базе данных могут быть прокручены обратно уже после того,как их действия уже были закончены. Например если Вы отменили вашу ошибкууже после того, как Diane получила свой вывод.* Одно действие может воздействовать частично на результат другого действия.
Например когда Diane получает среднее от значений в то время как вы выполняете модификацию этих значений. Хотя это не всегда проблематично, вбольшинстве случаев действие такое же, как если бы агрегаты должны были отразитьсостояние базы данных в пункте относительной стабильности. Например в ревизионных книгах, должна быть возможность вернуться назад и найти это существующее усредненное значение для Diane в некоторой временной точке, и оставить его безизменений, которые могли быть сделаны начиная уже с этого места.
Это будет невозможно сделать, если модификация была выполнена во время вычисления функции.* Тупик. Два пользователя могут попытаться выполнить действия, которыеконфликтуют друг с другом. Например, если два пользователя попробуют изменитьи значение внешнего ключа и значение родительского ключа одновременно.Имеется много сложнейших сценариев которые нужно было бы последовательнопросматривать, если бы одновременные транзакции были неуправляемыми. К счастью, SQL обеспечивает вас средством управления параллелизмом для точного указания места получения результата. Что ANSI указывает для управленияпараллелизмом — это что все одновременные команды будут выполняться по принципу — ни одна команда не должна быть выдана, пока предыдущая не будет завершена (включая команды COMMIT или ROLLBACK).Более точно, нужно просто не позволить таблице быть доступной более чем дляодной транзакции в данный момент времени.