Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Переименование таблиц

ние полностью совпадает с таблицей. Например, представление полностью использу­ ет СНЕСК ОРПОN в качестве подстановки для ограничения СНЕСК в базовой таблице (детали рассмотрены в главе 22). Можете создать собственные синонимы, ко­ торые совпадают с оригинальными названиями таблиц. Например, Adrian может опре­ делить Customers как свой собственный синоним таблицы Diane.Customers таким образом:

CREATE SYNONYM Customers FOR Diane.Customers;

С точки зрения SQL, теперь имеются два различных имени для таблицы: Diane.Customers и Adrian.Customers. Каждый из пользователей может ссылаться на таблицу просто как Customers.

Одно имя на всех

Если таблицу Customers будет использовать множество пользователей, наилучшим может оказаться вариант, при котором все они будут применять одно и тоже имя таб­ лицы. Эго позволит, например, использовать имя для внутренних потребностей без указания префикса. Для определения единственного имени для всех пользователей, необходимо создать общедоступный (puЬlic) синоним. Например, если все пользова­ тели должны называть таблицу Customers просто как Customers, следует ввести:

CREATE PUBLIC SYNONYM Customers FOR Customers;

Являясь владельцем таблицы Customers, вы можете не указывать перед именем этой таблицы собственное имя в качестве префикса. В общем случае доступные для всех синонимы создаются либо владельцами таблиц, либо высокопривилегированны­ ми пользователями, такими как DBA. Пользователи должны также получить привиле­ гии на таблицу Customers для того, чтобы иметь к ней доступ. Несмотря на то, что в результате выполнения рассмотренной выше команды имя таблицы становится обще­ доступным, сама таблица таковой не является. Общедоступные синонимы принадле­ жат PUBLIC, а не тем, кто их создал.

Уничтожение синонимов

Общедоступные или другие синонимы можно удалить с помощью команды DROP SYNONYM. Синонимы удаляются их владельцами, за исключением общедоступных синонимов, которые удаляются пользователями с привилегиями DBA. Чтобы исклю­ чить свой синоним Client - поскольку теперь можно воспользоваться общедоступ­ ным синонимом Customers, - Adrian должен ввести

DROP SYNONYM Clients;

Естественно, что на саму таблицу Customers эти команды никакого действия не

оказывают.

251

Глава 23. Глобш~ьные аспекты SQL

Каким образом база данныхразмещается для пользователя?

Таблицы и другие объекты данных хранятся в базе данных и ассоциируются с от­ дельными пользователями, которые являются их владельцами. Можно сказать, что они хранятся "в пространстве памяти, связанном с именем пользователя", хотя это не отражает физического расположения, а является просто логической конструкцией. Однако объе11.-гы данных должны храниться в памяти в физическом смысле и объем памяти, который можно использовать для отдельного объекта или пользователя в дан­

ный момент времени, ограничен. Ни один компьютер не предоставляет немедленного

доступа к безграничному множеству устройств (диск, лента или внутренняя память) для хранения данных. Более того, работоспособность SQL повышается, если логиче­ ская структура данных поддерживается на физическом уровне, что проявляется при

выполнении команд.

В больших SQL-системах (программных продуктах, основанных на использовании SQL) база данных разбивается на области, называемые 11ространство.л-1 базы данных (databasespaces) или пространство.л-1 таблиц (taЬ/espaces). Здесь инфор~ация содержится сконцентрированно для выполнения команд таким образом, чтобы программа не осуще­ ствляла уrnубленного и расширенного поиска информации, сгруппированной в пределах одной базы данных. Физические детали зависят от конкретной реализации, но работать с этими областями целесообразно непосредственно из SQL. Системы, использующие поня­ тие пространства баз данных (далее будем использовать аббревиатуру dbspaces), разреша­ ют их применять в качестве объектов в командах SQL. Dbspaces создаются с помощью

команд CREATE DBSPACE, ACQUIRE DBSPACE или CREATE TAВLESPACE в зависи­

мости от конкретной реализации. Одно dbspace может обслуживать любое количество пользователей, а один пользователь может иметь доступ к множеству dbspaces. Привиле­ mю создавать таблицы можно получить от пользователя со спецификацией dbspace.

Можно создать dbspace с названием SampletaЫes с помощью следующей команды:

CREATE DBSPACE SampletaЫes

{pctindex 10,

pctfree 25);

Параметр pctindex определяет процент пространства dbspace, выделяемый для хра­ нения индексов таблиц. Параметр pctfree определяет процент пространства dbspace, ко­ торый остается свободным, чтобы впоследствии разрешить увеличение размеров таблицы за счет добавления строк (команда ALTER TABLE может добавлять столбцы или увеличивать размеры столбцов, делая таким образом каждую строку длиннее. При подобном увеличении используется зарезервированное свободное пространство). Мож­

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

ных программных продуктов. Большинство программных продуктов предоставляет

252

Когда изменения становятся постоянными?

значения, автоматически назначаемые по умолчанию, значит, можно создавать dbspaces без указания параметров. Dbspace может иметь ограничения по размеру, либо ему мо­ жет быть разрешен неограниченный рост вслед за увеличением размеров таблиц. После того как dbspace создано, пользователи получают право создавать в нем объекты.

После создания dbspace SampletaЫes пользователи получают право создавать в нем объекты. Можно дать Diane право создать таблицы в SampletaЫes следующим обра­

зом:

GRANT RESOURCE ON SampletaЫes ТО Diane;

Это позволяет более рационально использовать доступный для хранения данных объем памяти. Первый dbspace, назначенный данному пользователю, является обычно участком памяти, в котором по умолчанию создаются все объекты данного пользова­ теля. Пользователи, имеющие доступ к множеству dbspaces, должны указывать, где конкретно они хотят разместить объект.

Разделяя базу данных на участки dbspaces, нужно иметь в виду типы операций, которые будут выполняться часто. Таблицы, которые будут часто соединяться или

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

вместе в одном dbspace. Исходя из опыта разработки простых таблиц, можно ска­ зать, что таблица Orders будет часто соединяться с одной или двумя другими табли­ цами, поскольку таблица Orders использует значения из этих двух таблиц. Отсюда следует, что эти три таблицы следует разместить в одном dbspace, независимо от

того, кто является их владельцем. Возможное присутствие ограничений внешнего

ключа в таблице Orders свидетельствует о том, что в этом же dbspace будет хранить­

ся и другая таблица.

Когда изменения становятся постоянными?

Ошибки из-за действий человека или компьютера часто возникают, и нужно дать

возможность пользовате.1ям отказаться от выполненных ими ранее действий.

Команда SQL, влияющая на содержимое или структуру базы данных, например, команда обновления языка манипулирования данными (DML) или DROP TABLE, не является необратимой. Можно определить, будет ли данная группа из одной или более команд вносить постоянные изменения в базу данных либо будет игнорировать их. С этой целью команды объединяются в группы, названные транзакциями (t1·ansactio11s).

Транзакция начинается всякий раз, когда инициируется сеанс работы с SQL. Все

вводимые команды являются частью той же транзакции, пока она не заканчивается вво­

дом команды COMMIT WORК или команды ROLLBACK WORК. COMMIT делает все изменения, выполняемые в транзакции, постоянными, команда ROLLBACK отменяет их. Новая транзакция начинается после каждой команды COMMIT или ROLLBACK. Этот процесс известен как обработка транзакций.

253

Глава 23. Глобш~ьные аспекты SQL

Синтаксис команды, которая делает все изменения постоянными после начала сеанса связи или после выполнения команды COMMIT или ROLLBACK, следующий:

СОММП WORK;

Синтаксис команды, которая отменяет их:

ROLLBACK WORK;

Во многих программных продуктах устанавливается параметр, названный:

AUTOCOMMIT. Он автоматически выполняет все правильные действия и отвергает приводящие к ошибкам. Если такой параметр предусмотрен в системе, можно устано­ вить режим выполнения всех действий с помощью команды, подобной этой:

SET AUTOCOMMIT ON;

Можно перейти к режиму обработки транзакций с помощью команды:

SЕТ AUTOCOMMIT OFF;

AUTOCOMMIТ может автоматически устанавливаться системой при входе в нее (в начале сеанса связи.)

Если сеанс связи пользователя завершается аварийно (например, в результате на­

рушений питания или в результате повторной загрузки системы пользователем), вы­

полнение текущей транзакции автоматически отменяется. По этой причине,

осуществляя транзакции вручную, желате;уьно разделить команды на множество раз­

личных транзакций. Единственная транзакция не должна содержать множества несвя­ занных команд; фактически, она может состоять из единственной команды.

Транзакции, которые включают целую группу несвязанных изменений, не оставляют

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

здесь следует придерживаться, - включать в состав транзакции единственную коман­

ду или тесно связанные команды.

Например, нужно удалить из базы данных продавца Motika. Прежде, чем удалить его из таблицы Salespeople, нужно что-то сделать с его заказами и покупателями. Не­ обходимо установить значение поля snum для покупателей Motika в NULL. Тогда ни один продавец не получит комиссионных от этих заказов, а его покупатели будут пере­ даны продавцу Рее!. После этого можно удалить Motika из таблицы Salespeople:

UPDATE Orders

SЕТ snum = NULL WHERE snum = 1004;

UPDATE Customers SET snum = 1001

WHERE snum = 1004; DELETE FROM Salespeople WHERE snum = 1004;

Если с удалением Motika появилась проблема (например, есть другой ссылающий­ ся на этого продавца внешний ключ, и это не было принято во внимание), может пона-

254

Как SQL работает одновременно с м11ожеством пользователей

добиться отменить все изменения до принятия соответствующего решения. Следовательно, эту группу команд полезно объединить в одну транзакцию. Можно по­ местить перед транзакцией команду СОММП и закончить ее командой COMMIT или

ROLLBACК.

Как SQL работает одновременно

смножеством пользователей

Вмногопользовательских системах, в которых часто применяется SQL, возможны накладки между различными выполняющимися действиями. Например, выполняется

следующая команда для таблицы Salespeop\e:

UPDATE Salespeople

SЕТ comm = comm•2

WHERE sname LIKE •RX. ;

В процессе выполнения команды Diane ввел следующий запрос:

SiLECT city, AVG (comm)

FROM Salespeople

GROUP ВУ city;

Будут ли средние значения, полученные Diane, отражать изменения, которые уже заданы для таблицы? Важно получить ответ на вопрос, отражаются ли в результате все изменения комиссионных. Любой промежуточный результат является случайным и непредсказуемым, зависящим от физического порядка расположения записей, но выходные данные запроса не должны зависеть от физических деталей и не должны быть случайными и непредсказуемыми.

Посмотрим на ситуацию с другой точки зрения. Предположим, найдена ошибка, но изменения после получения Diane своих выходных данных не внесены. В результа­ те Diane имеет выходные данные с подсчитанными средними обновленными значе­ ниями, обновления позже были отменены, и, следовательно, у Diane нет информации

о корректности полученных выходных данных.

Управление одновременно выполняющимися транзакциями называется паралле­

лuЗ.1110.м (concurrency), порождающим ряд проблем. Приведем некоторые примеры:

• Обнов.1ения должны выполняться без взаимного влияния. Например, продавец может сформулировать запрос к инвентарной таблице, найти десять единиц то­

вара из числа хранящихся на складе и подготовить шесть из них для покупате­

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

255

Источник: https://studfile.net/preview/16418473/