
2. Определение ограничений целостности - unique, primary key, not null, foreign key, check. Особенности использования ограничений целостности.
ограничение NOT NULL. Столбец не может содержать значения null.
ограничение UNIQUE. Столбец или столбцы не могут содержать дублирующихся значений.
ограничение PRIMARY KEY. Столбец или столбцы, входящие в основной ключ, не могут дублироваться. Ограничение PRIMARY KEY включает в себя ограничение UNIQUE, но обратное не верно. Таблица может содержать только один столбец, определенный как PRIMARY KEY и несколько столбцов, определенных как UNIQUE. Кроме того, PRIMARY KEY включает в себя ограничение NOT NULL.
ограничение FOREIGN KEY. Столбец или столбцы, составляющие внешний ключ, должны ссылаться на основной ключ указанной таблицы.
ограничение CHECK. Перед тем, как строка добавится или изменится, она должна удовлетворить выражению, определенному ограничением CHECK.
ORACLE полностью поддерживает ограничение NOT NULL. Текущая фраза WITH CHECK OPTION из оператора CREATE VIEW поддерживает дополнительные формы относительной целостности. Для отработки ограничения UNIQUE в настоящее время используются индексы.
Ограничения целостности проверяются в момент вставки и или изменении данных в таблицах. Ограничения целостности можно включать или выключать.
Выключение ограничений осуществляется для вставки большого количества данных в таблицы. При последующем включении СУБД проверяет записи с таблице на соответствие ограничений. Будут приняты только те строки таблицы, которые соответствуют ограничениям.
ВАРІАНТ 7
1. Алгебра Кодда и реляционное исчисление как теоретическая основа базы данных.
Основная идея реляционной алгебры состоит в том, что коль скоро отношения являются множествами, то средства манипулирования отношениями могут базироваться на традиционных теоретико-множественных операциях, дополненных некоторыми специальными операциями, специфичными для баз данных.
Существует много подходов к определению реляционной алгебры, которые различаются набором операций и способами их интерпретации, но в принципе, более или менее равносильны. В состав теоретико-множественных операций входят операции:
объединения отношений;
пересечения отношений;
взятия разности отношений;
прямого произведения отношений.
Специальные реляционные операции включают:
ограничение отношения;
проекцию отношения;
соединение отношений;
деление отношений.
Кроме того, в состав алгебры включается операция присваивания, позволяющая сохранить в базе данных результаты вычисления алгебраических выражений, и операция переименования атрибутов, дающая возможность корректно сформировать заголовок (схему) результирующего отношения.
При выполнении операции объединения двух отношений производится отношение, включающее все кортежи, входящие хотя бы в одно из отношений-операндов.
Операция пересечения двух отношений производит отношение, включающее все кортежи, входящие в оба отношения-операнда.
Отношение, являющееся разностью двух отношений включает все кортежи, входящие в отношение - первый операнд, такие, что ни один из них не входит в отношение, являющееся вторым операндом.
При выполнении прямого произведения двух отношений производится отношение, кортежи которого являются конкатенацией (сцеплением) кортежей первого и второго операндов.
Результатом ограничения отношения по некоторому условию является отношение, включающее кортежи отношения-операнда, удовлетворяющее этому условию.
При выполнении проекции отношения на заданный набор его атрибутов производится отношение, кортежи которого производятся путем взятия соответствующих значений из кортежей отношения-операнда.
При соединении двух отношений по некоторому условию образуется результирующее отношение, кортежи которого являются конкатенацией кортежей первого и второго отношений и удовлетворяют этому условию.
У операции реляционного деления два операнда - бинарное и унарное отношения. Результирующее отношение состоит из одноатрибутных кортежей, включающих значения первого атрибута кортежей первого операнда таких, что множество значений второго атрибута (при фиксированном значении первого атрибута) совпадает со множеством значений второго операнда.
Операция переименования производит отношение, тело которого совпадает с телом операнда, но имена атрибутов изменены.
Операция присваивания позволяет сохранить результат вычисления реляционного выражения в существующем отношении БД.
2. Операция вставки данных, вставка данных с подзапросом (INSERT).
Операция удаления кортежей. Ограничения на удаление (ограничение целостности данных). Операция замены данных в таблицах (UPDATE).
INSERT INTO[user.]table [column [,column] ...)]
VALUES (value [,value]...) | query
user имя пользователя - владельца таблицы.
table имя существующей таблицы, обзора или синонима. По умолчанию -пользователь, выдавший команду INSERT.
column столбец таблицы или обзора.
value значение, соответствующее по позиции столбцу из списка столбцов. value может быть выражением. Если value не NULL, оно должно соответствовать по столбцу по типу данных.
query оператор SELECT, возвращающий столько значений, сколько указано в списке столбцов. Не может содержать фраз ORDER BY и UPDATE.
Оператор INSERT, применяемый с фразой VALUES, всегда добавляет не более одной строки. Полям, определяемым columns, назначаются специфицированные значения. Столбцы, опущенные в списке columns, будут содержать значения NULL и, следовательно, не могут быть описаны NOT NULL.
Оператор INSERT, в котором используется запрос (query) вместо фразы VALUES, может добавлять более одной строки (столько, сколько возвращено запросом). После того, как запрос выполнится, его столбцы сопоставляются по позиции со столбцами, специфицированными после ключевого слова INSERT (или всем, если ничего не специфицировано). Запрос может ссылаться на ту же таблицу, в которую строки вставляются.
Значение обязательно должно быть сопоставлено всем столбцам, определенным как NOT NULL.
Если в скобках указывается список столбцов, им должны быть поставлены в соответствие значения; если нет, то значения должны быть обеспечены всем столбцам. Если список столбцов опущен, значения должны указываться в порядке внутреннего расположения столбцов таблицы. Эти позиции можно определить, запросив обзор словаря данных USER_TAB_COLUMNS.
Если подзапрос внутри оператора INSERT не возвращает строк, в таблицу не будет добавлено ни одной строки.
Примеры Для вставки новой строки в таблицу DEPT введите:
INSERT INTO DEPT VALUES(50, 'PRODUCTION', 'SAN FRANCISCO')
Для вставки строки с шестью столбцами в таблицу EMP, включая значение NULL и числовое в научной нотации введите:
INSERT INTO ENP (EMPNO,ENAME,JOB,SAL,COMM,DEPTNO) VALUES(7890,'JINKS','CLERK',1.2E3,NULL,40)
Для копирования менеджеров и президентов: а также сотрудников, чьи комиссионные превышают 25%, в таблицу BONUS, введите:
INSERT INTO BONUS
SELECT ENAME, JOB, SAL, COMM
FROM EMP
WHERE COMM < 25 * SAL
OR JOB IN ('PRESIDENT','MANAGER')
DELETE [FROM] [user.]table [alias] [WHERE condition]
user владелец таблицы.
table имя таблицы или обзора, из которых удаляются строки.
alias алиас, назначенный таблице, который используется в общем случае - при коррелированных запросах внутри оператора DELETE.
condition условие должно приводить к результату TRUE или FALSE.
Если отсутствует фраза WHERE, из таблицы удаляются все строки. Если же эта фраза используется, удаляются строки, для которых условие condition дает TRUE. Условие может ссылаться на адресуемую таблицу или включать в себя коррелированный запрос.
Все удаляемые строки и соответствующие индексы освобождают занимаемую ими память.
UPDATE [user.]table [alias]
SET column = expr [,column = expr]...
[WHERE condition]
или
UPDATE [user.]table [alias]
SET (column [,column]...) = (query)
[,(column [,column]...) = (query) ] ... [WHERE condition]
user имя владельца таблицы.
table имя существующей таблицы, к которой у Вас есть доступ.
alias используется для переименования таблицы для ссылок в последующих фразах оператора.
column столбец, принадлежащий таблице. Если он единственный, круглые скобки не обязательны.
query оператор SELECT, не содержащий фраз ORDER BY и FOR UPDATE, обычно коррелированный с подлежащей модификации таблицей.
condition правильное условие, имеющее значение TRUE или FALSE.
Фраза SET определяет столбцы, подлежащие изменению и заносимые в них значения.
Фраза WHERE определяет строки, чьи значения должны изменяться; если она отсутствует, изменению подлежат все строки таблицы. Для каждой строки, удовлетворяющей условию WHERE столбцы слева от знака равенства получают значения выражений справа от равенства. Выражения вычисляются только для строк подлежащих модификации.
Если фраза SET содержит запрос, последний должен возвращать в точности одну строку для каждой изменяемой строки. Каждое значение из результата запроса назначается соответственно столбцу из заключенных в круглые скобки. Если запрос не возвращает строк, присваемое (т.е. SET value=query) значение будет NULL. Подзапросы могут выбирать строки из таблицы, которая меняется.
Во фразе SET можно смешивать значения, возвращаемые подзапросами и назначаемые выражениями.
Оператор UPDATE автоматически выдает исключительные блокировки для строк или таблиц, подлежащих изменению. Эти блокировки освобождаются после выдачи команд COMMIT или ROLLBACK.
ВАРІАНТ 8
1. Общая модель системы управления распределенными базами данных.
Локальные и глобальные данные, соединения баз данных.
Фрагментация данных - горизонтальное и вертикальное разбиение базы данных. Распределенные запросы.
Для задания горизонтального разделения отношений в SQL была введена конструкция вида
DISTRIBUTE TABLE <table-name> HORIZONTALLY INTO
<name> WHERE <predicate> IN SEGMENT <segment-name site>
.
.
<name> WHERE <predicate> IN SEGMENT <segment-name site>
При выполнении предложения такого типа указанное отношение разбивалось на ряд подотношений, содержащих кортежи, удовлетворяющие соответствующему предикату из раздела WHERE, и каждое полученное таким образом подотношение посылалось в казанный узел для хранения в сегменте с указанным именем. Гарантируется согласованное состояние разделов при изменении отношения.
Вертикальное разделение производилось с помощью оператора
DISTRIBUTE TABLE <table-name> VERTICALLY INTO
<name> WHERE <column-name-list> IN SEGMENT <segment-name site>
.
.
<name> WHERE <column-name-list> IN SEGMENT <segment-name site>
При выполнении такого предложения также образовывался набор подотношений с помощью проекции заданного отношения на атрибуты из заданного списка. Каждое полученное подотношение затем посылалось для хранения в сегменте с указанным именем в соответствующий узел. После этого система ответственна за поддержание согласованного состояния образованных разделов.
Горизонтальное и вертикальное разделение отношений реально не используются в System R*, хотя очевидно, что выполнение собственно оператора DISTRIBUTE никаких технических трудностей не вызывает. Трудности возникают при обеспечении согласованности разделов (смотри ниже). Кроме того, разделенные отношения очень трудно использовать. В соответствии с идеологией системы учет наличия разделов отношения в разных узлах сети должен производить оптимизатор, т.е. количество потенциально возможных планов выполнения запросов, которые должны оцениваться оптимизатором, еще более возрастает. При том, что в распределенной системе число возможных планов и так очень велико, и оптимизатор работает на пределе сложности, разумным образом использовать разделенные отношения невозможно.
Для задания требования поддержки копий отношения в нескольких узлах сети предлагалось использовать новую конструкцию SQL
DISTRIBUTE TABLE <table-name> REPLICATED INTO
<name> IN SEGMENT <segment-name site>
.
.
<name> IN SEGMENT <segment-name site>
При выполнении такого предложения должна была производиться рассылка копий указанного отношения для хранения в именованных сегментах указанных узлов сети. Система должна автоматически поддерживать согласованность копий.
Как и в случае разделенных отношений, кроме существенных проблем поддержания согласованности копий, проблемой является и разумное использование копий, наличие которых должно было бы учитываться оптимизатором.
Создание мгновенного снимка состояния баз данных в соответствии с заданным запросом на выборку должно было производиться с использованием новой конструкции SQL.
DEFINE SNAPSHOT <snapshot-name> (<attribute-list>)
AS <query>
REFRESHED EVERY <period>
При выполнении предложения фактически производится выполнение указанного в нем запроса на выборку, а результирующее отношение сохраняется под указанным в предложении именем в локальной базе данных в том узле, в котором выполняется предложение. После этого мгновенный снимок периодически обновляется в соответствии с запомненным запросом.
Можно обновить мгновенный снимок, не дожидаясь истечения временного интервала, указанного в определении, путем выполнения предложения REFRESH SNAPSHOT <snapshot-name>.
Создание связи из локальной базы данных с пользователем в удаленной базе. Межбазовая связь может быть как с базой данных ORACLE, так и нет, например - DB2 фирмы IBM.
Необходимо иметь доступ к имени пользователя в удаленной базе данных. Межбазовые связи типа PUBLIC может делать только пользователь с привилегией DBA. И на локальной, и на удаленной базе данных должно быть инсталировано программное обеспечение SQL*Net.
CREATE [PUBLIC] DATABASE LINK link
[CONNECT TO user IDENTIFIED BY password]
USING 'connect_string'
PUBLIC. Если опция PUBLIC опущена, создается личная связь (доступная только пользователю, ее создавшего). Если же эта опция специфицирована, связь становится доступной всем пользователям за исключением тех, кто создал личную связь с тем же именем.
link имя, которое дается создаваемой связи.
user,password действительное имя пользователя и пароль в специфицированной удаленной базе данных.
connect_string спецификация удаленной базы данных, доступной через SQL*Net.
Создав межбазовую связь, можно обращаться к таблицам удаленной базы в запросах и подзапросах, ссылаясь на нее во фразе FROM с тем же эффектом, что и при прямом подключении к определенному пользователю в удаленной базе.
Если фраза, содержащая имя пользователя и пароль, отсутствует, будет использоваться имя и пароль текущего пользователя. Например, если SCOTT выдаст команду создания связи и не задаст пользователя и пароль, ORACLE будет использовать для доступа к удаленной базе данных имя пользователя SCOTT и его пароль.
Удаленные таблицы специфицируются добавлением к таблице имени связи (@linkname) во фразе FROM оператора SELECT.
Запросы и подзапросы, выполняемые через межбазовую связь, подчиняются следующим ограничениям:
* Количество межбазовых связей, которые можно использовать в одном запросе, в большинстве систем ограничиваются четырьмя. Этот предел можно расширить, увеличив значение параметра OPEN_LINKS файла INIT.ORA.
* Через связь не могут быть выбраны столбцы типа LONG.
В древовидных структурах (используя фразу CONNECT BY):
* оператор PRIOR не может применяться во фразах, отличных от CONNECT BY
* фраза START WITH не может содержать подзапросов
* ни фраза CONNECT BY, ни START WITH не может содержать функции USERENV('ENTRYID'), ROWNUM и определенные пользователем функции.
Пример. Чтобы определить межбазовую связь BOSTON, которая ссылается на пользователя SCOTT с паролем TIGER в базе D:BOSTON-MFG, введите:
CREATE DATABASE LINK BOSTON
CONNECT TO SCOTT IDENTIFIED BY TIGER
USING 'D:BOSTON-MFG'
После создания межбазовой связи можно запрашивать таблицы пользователя SCOTT следующим образом:
SELECT * FROM EMP@BOSTON
Предыдущий запрос будет соединяться с пользователем SCOTT в удаленной базе и затем запрашивать таблицу DEPT пользователя ADAMS.
Для скрытия факта, что таблица EMP пользователя SCOTT находится на удаленной базе, можно воспользоваться синонимом. Следующий оператор приведет к тому, что дальнейшие запросы из таблицы EMP будут обращаться к удаленной базе данных:
CREATE SYNONYM EMP FOR SCOTT.EMP@BOSTON
2. Создание пользователей базы данных. Задание пароля и табличного пространства для работы пользователя. Ограничение работы пользователя. Системные пароли и имена.
Создание пользователей БД осуществляется оператором
Пользователь — это базовый объект Oracle, который может быть владельцем других объектов и выполнять предусмотренные действия с объектами Oracle в соответствии с поддерживаемой технологией.
Оператор определения пользователей Oracle использует следующий синтаксис:
CREATE USER имя_пользователя IDENTIFIED
{ BY пароль I EXTERNALLY }
[DEFAULT TABLESPACE имя_табличной_области1}
[TEMPORARY TABLESPACE имя_табличной_области2}
[QUOTA {число_единиц [{ К 1 M }] I UNLIMITED } ON имя _табл. области]
[PROFILE имя_профиля}
Параметр имя_пользователя задает имя, под которым пользователь регистрируется в системе. Имя пользователя должно быть указано в кодировке, поддерживаемой сервером.
Ключевое слово BY указывает, что подтверждающий подлинность пользователя пароль будет указан явно в параметре пароль. Обратите внимание, что даже если сервер использует двухбайтовые кодировки для символов национальных языков, для пароля возможно использование только символов из множества однобайтно кодируемых, например латиницы и цифр. Если указан параметр EXTERNALLY, то сервер проверяет соответствие зарегистрированного операционной системой пользователя и пользователя Oracle. Если имена совпадают, то Oracle не проводит собственную аутентификацию. Использование режима внешней аутентификации в защищенных системах не рекомендуется.
Ключевое слово DEFAULT TABLESPACE указывает имя табличной области, задаваемое параметром имя_таблич-ной_области1, которая используется для объектов создаваемого пользователя по умолчанию. Если ключевое слово DEFAULT TABLESPACE не указано, то для объектов создаваемого пользователя будет использоваться табличная область SYSTEM. Учитывая, что в табличной области SYSTEM размешен словарь данных, использовать ее для пользовательских объектов нецелесообразно.
Ключевое слово TEMPORARY TABLESPACE указывает имя табличной области, задаваемое параметром имя_табличной_области2, которая используется для временных сегментов создаваемого пользователя по умолчанию. Временные сегменты используются для хранения промежуточных данных сложных запросов. Если ключевое слово TEMPORARY TABLESPACE не указано, то для временных сегментов создаваемого пользователя будет использоваться табличная область SYSTEM. Учитывая, что в табличной области SYSTEM размещен словарь данных, использовать ее для временных сегментов пользователя объектов нецелесообразно. Для многопользовательской системы, к которой предъявляются повышенные требования по производительности.
Табличные области для временных сегментов и для объектов пользователя желательно разнести по различным физическим носителям.
Ключевое слово QUOTA задает ограничения на используемое пользователем пространство в конкретной табличной области. Максимально допустимое пространство за-дается параметром число_единиц в мегабайтах, если указано ключевое слово М; если указано ключевое слово К — в килобайтах; а если не указано ни М, ни К — в байтах. Указание ключевого слова UNLIMITED разрешает пользователю использовать табличное пространство без ограничений. Обратите внимание, что при регистрации пользователя можно использовать ключевое слово QUOTA несколько раз и определить для пользователя допустимое пространство в нескольких табличных областях.
Ключевое слово PROFILE назначает регистрируемому пользователю профиль, задаваемый параметром имя_профиля. Профиль пользователя — это поименованный набор ограничений на ресурсы системы. Если ключевое слово PROFILE не указано, пользователю приписывается профиль DEFAULT.
Для успешной регистрации пользователя необходимо иметь привилегию CREATE USER.
Рассмотрим пример создания пользователя U1, который использует пароль U1PSW для подтверждения подлинности и которому назначена табличная область по умолчанию аpp_data с ограничением на используемое пространство в 1 мегабайт. Пользователю U1 также разрешено использовать табличную область tools с ограничением 500 килобайт.
SQL > CREATE USER U1 IDENTIFIED BY IUY
2 DEFAULT TABLESPASE APP_DATA
3 QUOTA 1M ON APP_DATA
4 QUOTA 500K ON TOOLS;
User created.
Для исключения из базы данных пользователя используется оператор DROP USER. При исключении пользователя должны быть удалены все объекты, принадлежащие этому пользователю. Для выполнения операции исключения пользователя необходимо иметь привилегию DROP USER.
СУБД ORACLE имеет специальные имена для доступа к БД в качестве администратора.
ВАРІАНТ 9
1. Целостность данных в распределенных информационных системах.
Распределенные запросы.
Отличительной особенностью СУБД промышленного уровня является поддержка параллельной работы многих пользователей. Пользователи формируют запросы на доступ и изменение информации в базе данных асинхронно, то есть в произвольные моменты времени. Одно из базовых требований к СУБД — поддержка целостности данных, то есть такого состояния, когда в произвольный момент времени данные адекватно отображают состояние моделируемых объектов реального мира.
Суть проблемы состоит в том, что в процессе управления параллельной работой СУБД данные могут быть изменены или модифицированы не в надлежащей последовательности, что может привести к потере их целостности.
Перечислим некоторые ситуации, которые могут возникнуть из-за асинхронного выполнения действий пользователя с базой данных:
«потеря изменения» (два почти одновременных изменения базы данных базируются на том, что оба пользователя «видят» одно значение некоторых данных; при этом одно из изменений будет потеряно за счет того, что одному из пользователей оно неизвестно);
два практически одновременных изменения приводят к возникновению двух одинаковых значений ключей или индексов при объявленном уникальном значении ключа или индекса;
содержание таблицы изменяется в то время, как другой пользователь меняет структуру этой таблицы.
Очевидным решением проблемы согласованного изменения базы данных является формирование очереди пользователей к каждому ресурсу системы (таблице, представлению, индексу и т.п.). Недостатком этого решения является резкое снижение производительности системы. Если количество пользователей исчисляется десятками или сотнями, то блокировка дефицитного ресурса приведет к очень большому времени ожидания.
Сервер Oracle использует иной метод решения сформулированной проблемы, известный как согласованное чтение. Механизм согласованного чтения означает автоматическое обеспечение такой ситуации, когда данные, используемые оператором выборки, не меняются в течение работы этого оператора, и процессы выборки из базы не ожидают результатов записи строк в те же таблицы базы данных.
Метод обеспечения согласованного чтения состоит в поддержке для каждого запроса «мгновенной копии» базы данных, с которой он работает. Модель согласованного чтения Oracle иногда называют также многоверсионной моделью, так как в системе может одновременно существовать несколько различающихся версий одной таблицы. Различные версии таблиц поддерживаются с помощью специальных объектов Oracle, называемых сегментами отката.
Когда возникает необходимость в получении конкретных данных для согласованного чтения, сервер Oracle использует информацию из сегментов отката. Поэтому для чтения данных нет проблемы, связанной с доступом к данным, заблокированным для модификации.
2. Транзакции и их использование для организации многопользовательской работы. Распределенные транзакции. Операторы начала и окончания транзакции и контрольные точки транзакции.
Транзакция начинается при появлении первого выполнимого SQL-оператора, т.е. оператора описания или манипулирования данными. Транзакция завершается при появлении одного из следующих событий:
выдана команда языка SQL COMMIT или ROLLBACK;
выдана одна из таких команд языка описания данных (DDL), как CREATE, DROP или ALTER (при этом фиксируется предыдущая транзакция);
завершился оператор DDL (транзакция, содержащая в себе оператор языка описания данных, фиксируется автоматически);
пользователь завершил сеанс с системой Oracle (последняя транзакция фиксируется автоматически);
процесс пользователя аварийно завершен (транзакция откатывается автоматически).
Как только транзакция завершена, следующий выполнимый SQL-оператор начинает новую транзакцию. Если в конце транзакции не появились операторы COMMIT или ROLLBACK, то нормальное завершение программы приведет к фиксации транзакции, а аварийное завершение (вызванное, например, разрывом связи в локальной сети) вызовет откат транзакции. Если произошел сбой операционной системы (например, из-за нехватки ресурсов), то откат транзакции будет автоматически выполнен при запуске экземпляра Oracle после восстановления операционной системы.
Для фиксации или отката транзакции используются предложения COMMIT WORK, SAVEPOINT, ROLLBACK WORK.
Предложение COMMIT фиксирует транзакцию. Предложение ROLLBACK выполняет откат транзакции, то есть отменяет все изменения, выполненные данной транзакцией в базе данных. Предложение SAVEPOINT выполняет промежуточную «текущую копию» состояния базы данных для того, чтобы впоследствии, при необходимости, можно было вернуться к состоянию базы данных в точке сохранения.