Главная страница
Навигация по странице:

  • Изучение особенностей работы механизма ссылочной целостности Set Null

  • Изучение особенностей работы механизма ссылочной целостности Set Default

  • Составить отчет по проделанной работе. 52 Практическая работа №7. Использование транзакций Транзакция

  • Блокировка транзакций.

  • Создать запрос, иллюстрирующий работу транзакционного механизма при добавлении данных в одну таблицу

  • сервер. Учебнометодическое пособие по выполнению пратических работ тольятти 2018 2 содержание


    Скачать 7.66 Mb.
    НазваниеУчебнометодическое пособие по выполнению пратических работ тольятти 2018 2 содержание
    Анкорсервер
    Дата29.11.2022
    Размер7.66 Mb.
    Формат файлаpdf
    Имя файлаSQL Server.pdf
    ТипУчебно-методическое пособие
    #820036
    страница4 из 8
    1   2   3   4   5   6   7   8
    Изучение особенностей работы механизма ссылочной целостности
    Cascade
    Рассмотрим особенности работы механизма ссылочной целостности
    Cascade на примере отношений между таблицами Поставщики и Договоры,
    Поставщики и ФизическиеЛица, Поставщики и ЮридическиеЛица, Договоры и
    Поставлено. Доступ к связям выполняется также, как описано выше. Для изучения особенностей работы механизма ссылочной целостности выполним следующую последовательность действий.
    1. Изменим механизмы ссылочной целостности для связей между всеми таблицами на Cascade. Пример результата изменения приведен на рис. 6.5.

    48
    Рисунок 6.5 2. Предположим, что в силу каких-то причин возникла необходимость для поставщика с кодом 2 изменить код на 8. Выбрав соответствующую запись в таблице Поставщики, измените код поставщика с 2 на 8. Затем попытайтесь перейти на предыдущую запись. Проверьте изменения значения код поставщика в непосредственно связанных с этим поставщиком таблицах (ЮридическиеЛица,
    Договоры). Если изменения не появились сразу, то таблицу нужно закрыть и затем снова открыть или в окне содержимого таблицы щелкнуть правой кнопкой мыши и в появившемся меню выбрать пункт Execute SQL.
    3. Теперь предположим, что данного поставщика (который теперь имеет код 8), необходимо удалить. Выбрав соответствующую запись в таблице
    Поставщики, нажмите правую кнопку мыши и в меню выберите пункт Delete.
    Затем подтвердите удаление записи. После этого проверьте состояние данных в таблицах, которые прямо или косвенно связаны с данным поставщиком
    (ЮридическиеЛица,
    Договоры,
    Поставлено). бедитесь в том, что соответствующие данные удалены. После этого нужно таблицы закрыть.
    Изучение особенностей работы механизма ссылочной целостности Set
    Null
    Рассмотрим особенности работы механизма ссылочной целостности
    Cascade на примере отношений между таблицами Поставщики и Договоры.
    Доступ к связям выполняется так же, как описано выше. Для изучения особенностей работы механизма ссылочной целостности выполним следующую последовательность действий.
    1. В списке таблиц выбрать таблицу Поставщики, щелкнув по ней правой

    49 кнопкой мыши. В появившемся меню выбрать пункт Modify. В результате будет получен доступ к редактированию структуры таблицы. Для поля КодПоставщика установить свойство Allow Nulls (рис. 6.6).
    Рисунок 6.6 2. Щелкнуть правой кнопкой мыши по любому полю таблицы и в появившемся меню выбрать пункт Relationships… В результате на экране появится окно Foreign Key Relationships. Изменить механизмы ссылочной целостности для связи между всеми таблицами Поставщики и Договоры на Set
    Null (рис. 6.7). Сохранить изменения в таблице.
    3. Открыть в режиме просмотра данных таблицы Поставщики и Договоры.
    Для договора 6 изменить код поставщика с 1 на 7. Затем в таблице Поставщики изменить код поставщика 7 на 10. Проверить данные в таблице Договоры. Код поставщика в договоре 6 должен принять значение Null. Пример таблицы с измененными данными приведен на рис. 6.8.
    4. В таблице Договоры для договора 6 измените значение код поставщика с
    Null на 10. После этого в таблице Поставщика удалите поставщика с кодом 10.
    Проверьте состояние данных в таблице Договоры. Для договора 6 значение кода поставщика опять должно принять значение Null.
    Рисунок 6.7

    50
    Рисунок 6.8 5. Открытые для просмотра данных таблицы закрыть.
    Изучение особенностей работы механизма ссылочной целостности
    Set Default
    Рассмотрим особенности работы механизма ссылочной целостности Set
    Default на примере отношений между таблицами Поставщики и Договоры.
    Доступ к связям выполняется также, как описано выше. Для изучения особенностей работы механизма ссылочной целостности выполним следующую последовательность действий.
    1. Проверить наличие связи между таблицами Поставщики и Договоры.
    Это можно сделать, в частности, путем создания диаграммы БД. При отсутствии связи связь установить. Диаграмму закрыть и сохранить.
    2. Открыть таблицу Поставщики в режиме просмотра данных. Для договора 6 изменить значение кода поставщика с Null на 3. Закрыть таблицу.
    3. Открыть таблицу Поставщики в режиме редактирования структуры. Для поля КодПоставщика отключить свойство Allow Nulls (рис. 6.9).
    Рисунок 6.9 4. Выбрать поле КодПоставщика и установить значение по умолчанию для этого поля. Для этого установить для свойства Default Value or Binding значение
    1 (рис. 6.10).
    Рисунок 6.10

    51 5. Щелкнуть правой кнопкой мыши по любому полю таблицы и в появившемся меню выбрать пункт Relationships…. В результате на экране появится окно Foreign Key Relationships. Изменить механизмы ссылочной целостности для связи между таблицами Поставщики и Договоры на Set Default
    (рис. 6.11). Закрыть окно Foreign Key Relationships и сохранить изменения в таблице.
    Рисунок 6.11 6. Открыть в режиме просмотра данных таблицы Поставщики и Договоры.
    В таблице Договоры определить список договоров, для которых код поставщика равен 3. В таблице Поставщики изменить код поставщика 3 на 12. Проверить данные в таблице Договоры. Для договоров, для которых код поставщика был равен 3, код поставщика должен измениться на 1.
    7. В таблице Договоры изменить для некоторых договоров (например, для договоров 3, 4, 6) код поставщика с 1 на 12.
    8. В таблице Поставщики удалить запись, соответствующую поставщику с кодом 12.
    9. Проверить данные в таблице Договоры. Для договоров, для которых код поставщика был равен 12, код поставщика должен измениться на 1.
    После окончания работы все таблицы нужно закрыть, а затем БД отключить.
    БД можно не сохранять.
    Составить отчет по проделанной работе.

    52
    Практическая работа №7. Использование транзакций
    Транзакция – это набор операций, который выполняется как один логический блок. Использование транзакций позволяет SQL Server обеспечивать определенный уровень целостности и восстанавливаемости данных. Журнал транзакций, который должна иметь каждая БД, поддерживает запись всех транзакций, которые осуществляют любой тип модификации в базе данных
    (вставка, обновление или удаление). SQL Server использует этот журнал транзакций для восстановления данных в случае ошибок или отказов системы.
    Целостность транзакции зависит, в частности, от программиста SQL.
    Программист должен знать, когда начинать и когда заканчивать транзакцию и в какой последовательности, чтобы модификации данных обеспечивали логическую согласованность и содержательность данных.
    Чтобы транзакцию можно было считать допустимой для использования, она должна отвечать четырем требованиям. Эти требования называют ACID- свойствами. ACID – это сокращение от atomicity (атомарность), consistency
    (согласованность), isolation (изолированность) и durability (устойчивость). В SQL
    Server включены механизмы, помогающие обеспечивать соответствие транзакций каждому из этих требований.
    Для запуска транзакции используется оператор T-SQL BEGIN
    TRANSACTION. Чтобы указать конец транзакции, используется COMMIT
    TRANSACTION или ROLLBACK TRANSACTION. В операторе BEGIN
    TRANSACTION вы можете дополнительно указать имя транзакции и затем ссылаться на эту транзакцию по имени в операторе COMMIT TRANSACTION или ROLLBACK TRANSACTION. Ниже показан синтаксис этих трех операторов:
    BEGIN TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции]
    COMMIT [TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции]]
    ROLLBACK [TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции
    | имя_точки_сохранения | @переменная_с_именем_точки_сохранения]]
    В SQL Server разрешаются вложенные транзакции, т.е. транзакции внутри транзакции. В случае вложенных транзакций нужно явно фиксировать каждую внутреннюю транзакцию, чтобы SQL Server получал информацию об окончании внутренней транзакции и мог освободить ресурсы, используемые этой транзакцией, когда будет фиксирована внешняя транзакция. Если ресурсы блокированы, другие пользователи не могут получать доступа к этим ресурсам.
    Хотя нужно явным образом включать оператор фиксации COMMIT для каждой транзакции, SQL Server не выполняет фактического фиксирования внутренних транзакций, пока не произойдет успешное фиксирование внешней транзакции; одновременно с этим SQL Server освобождает все ресурсы, используемые внутренними и внешней транзакциями. При неуспешном фиксировании внешней транзакции фиксирование внутренних транзакций не выполняется и происходит откат внешней и всех внутренних транзакций. После

    53 фиксирования внешней транзакции выполняется фиксирование внутренних транзакций. Иными словами, SQL Server по сути игнорирует операторы
    COMMIT внутри внутренних вложенных транзакций – в том смысле, что внутренние транзакции не фиксируются в ожидании окончательного фиксирования или отката внешней транзакции, чтобы определить статус завершения всех внутренних транзакций. Кроме того, в случае использования оператора отката ROLLBACK во внешней транзакции или в любой из внутренних транзакций происходит откат всех этих транзакций. В оператор
    ROLLBACK нельзя включать имя внутренней транзакции; в этом случае SQL
    Server возвратит сообщение об ошибке. Можно включать имя внешней транзакции, имя точки сохранения или не включать никакого имени.
    Хотя SQL Server не выполняет фактического фиксирования внутренних транзакций по оператору COMMIT, но все же для каждого оператора COMMIT происходит изменение системной переменной @@TRANCOUNT. Эта переменная следит за количеством активных транзакций на одно соединение с пользователем.
    При отсутствии активных транзакций значение
    @@TRANCOUNT равно 0. В начале каждой транзакции (с помощью BEGIN
    TRAN) значение @@TRANCOUNT увеличивается на 1. После фиксирования каждой транзакции значение @@TRANCOUNT уменьшается на 1. Когда значение @@TRANCOUNT становится равным 0, фиксируется внешняя транзакция. Если во внешней транзакции или в любой из внутренних транзакций выполняется оператор
    ROLLBACK, то значение
    @@TRANCOUNT устанавливается равным 0. Помните, что для правильного уменьшения
    @@TRANCOUNT вы должны указывать фиксирование (COMMIT) для каждой внутренней транзакции. Вы можете проверять значение @@TRANCOUNT, чтобы определять наличие активных транзакций. Чтобы увидеть значение
    @@TRANCOUNT, используйте оператор SELECT @@TRANCOUNT.
    В неявном режиме транзакция автоматически начинается при использовании определенных операторов T-SQL и продолжается, пока не появится оператор явного окончания COMMIT или ROLLBACK. Если оператор окончания не указан, то при отсоединении пользователя происходит откат данной транзакции.
    Следующие операторы T-SQL являются началом новой транзакции в неявном режиме:
    ALTER TABLE
    CREATE
    DELETE
    DROP
    FETCH
    GRANT
    INSERT
    OPEN
    REVOKE
    SELECT
    TRUNCATE TABLE
    UPDATE

    54
    Если один из этих операторов используется, чтобы начать неявную транзакцию, эта транзакция продолжается, пока не будет явно указано ее окончание, даже если внутри транзакции снова встретятся эти операторы. После явного фиксирования или отката данной транзакции следующее появление этих операторов является началом новой транзакции. Этот процесс продолжает действовать, пока не будет отключен неявный режим.
    Чтобы задать неявный режим транзакций, вы можете использовать следующий оператор T-SQL:
    SET IMPLICIT_TRANSACTIONS {ON | OFF}
    Значение ON активизирует неявный режим, и OFF отключает его. После отключения неявного режима используется режим автофиксации.
    Неявные транзакции полезно использовать, когда запускаются сценарии с модификациями данных, которые требуется защитить внутри транзакции. Вы можете включить неявный режим в начале сценария, выполнить необходимые модификации и отключить этот режим в конце сценария. Во избежание конфликтов параллельных операций отключайте неявный режим после модификации данных и перед просмотром данных. Если вслед за операцией фиксирования следует оператор SELECT, то с него начинается новая транзакция в неявном режиме, и соответствующие ресурсы не будут освобождены, пока не будет фиксирована эта транзакция.
    Откаты транзакций могут происходить в двух формах: автоматический откат, выполняемый SQL Server, или программируемый вручную откат. В определенных случаях SQL Server выполнит для вас откат. Но для обеспечения логической согласованности в программах нужно при необходимости явным образом обращаться к оператору ROLLBACK. Рассмотрим более подробно эти два метода.
    При сбое транзакции вследствие серьезной ошибки, такой как потеря сетевого соединения при выполнении данной транзакции или отказ клиентского приложения или компьютера, SQL Server выполняет автоматический откат транзакции. Во время отката происходит отмена всех модификаций, выполненных в данной транзакции, и освобождение всех ресурсов, использовавшихся этой транзакцией. Если при исполнении какого- либо оператора возникает ошибка, такая как нарушение ограничения или правила, то по умолчанию SQL Server автоматически выполняет откат только этого определенного оператора, в котором возникла ошибка.
    При программируемых откатах с помощью оператора ROLLBACK вы можете указать точку в транзакции, где будет выполнен откат. Оператор
    ROLLBACK прекращает данную транзакцию и выполняет откат (отмену) всех выполненных изменений. Если вы запускаете откат в середине какой-либо транзакции, то остальная часть этой транзакции игнорируется. Если, например, эта транзакция является хранимой процедурой и оператор ROLLBACK выполняется в этой процедуре, то происходит откат всей процедуры и переход к обработке оператора, следующего после вызова хранимой процедуры.
    Откат транзакции нельзя выполнить после ее фиксирования. Чтобы можно было выполнить явный откат отдельной транзакции, оператор ROLLBACK

    55 должен предшествовать оператору COMMIT. В случае вложенных транзакций после фиксирования внешней транзакции (и, тем самым, внутренних транзакций) уже нельзя выполнить откат ни одной из транзакций. Как уже отмечалось, вы не можете выполнить откат только внутренних транзакций; должен быть выполнен откат всей транзакции (всех внутренних транзакций и внешней транзакции).
    Поэтому, включив имя транзакции в оператор ROLLBACK, проследите за тем, чтобы было указано имя внешней транзакции (во избежание путаницы и сообщения об ошибке от SQL Server). Однако существует обходной путь, позволяющий избежать отката всей транзакции и сохранить часть модификаций: вы можете использовать точки сохранения, которые позволяют выполнять откат только до определенной точки в транзакции, а не до самого начала транзакции.
    Все модификации, выполненные до точки сохранения, остаются в силе и не подвергаются откату; но для всех операторов, выполняемых после точки сохранения (которую вы должны указать в транзакции) вплоть до оператора
    ROLLBACK, будет выполнен откат. Затем начнут выполняться операторы, следующие за оператором ROLLBACK. Если вы затем зададите откат транзакции без указания точки сохранения, то, как обычно, будет выполнен откат всех модификаций вплоть до начала данной транзакции, т.е. будет отменена вся транзакция. Отметим, что при откате транзакции до точки сохранения SQL Server не освобождает блокированные ресурсы. Они будут освобождены после фиксирования транзакции или после отката всей транзакции.
    Чтобы указать точку сохранения в транзакции, используйте следующий оператор:
    SAVE TRAN[SACTION] {имя_точки_сохранения |
    @переменная_с_именем_точки_сохранения}
    Поместите точку сохранения в том месте транзакции, до которого вы хотите выполнять откат. Чтобы выполнить откат до точки сохранения, используйте оператор ROLLBACK TRAN вместе с именем точки сохранения, как это показано ниже:
    ROLLBACK TRAN имя_точки_сохранения
    Блокировка транзакций.
    В SQL Server используется объект, который называется блокировкой (lock); он препятствует тому, чтобы несколько пользователей одновременно вносили изменения в БД и чтобы один пользователь считывал данные, которые изменяет в этот момент другой пользователь. Блокировка помогает обеспечивать логическую целостность транзакций и данных. Управление блокировками осуществляется внутренним образом из программного обеспечения SQL Server и захват блокировки осуществляется на уровне пользовательского соединения.
    Если пользователь захватывает блокировку (становится ее владельцем) по какому-либо ресурсу, то эта блокировка указывает, что данный пользователь имеет право на использование данного ресурса. К ресурсам, которые может блокировать пользователь, относятся строка данных, страница данных экстент (8 страниц), таблица или вся БД. Например, если пользователь владеет блокировкой по странице данных, то другой пользователь не может выполнять операции на этой странице, которые повлияют на операции пользователя, владеющего данной

    56 блокировкой. Поэтому любой пользователь не может модифицировать страницу данных, которая блокирована и считывается в данный момент другим пользователем. Кроме того, ни один пользователь не может владеть блокировкой, конфликтующей с блокировкой, которой уже владеет другой пользователь.
    Например, два пользователя не могут одновременно владеть блокировками на одновременную модификацию одной и той же страницы. Одна блокировка не может одновременно использоваться более чем одним пользователем.
    Создать запрос, иллюстрирующий работу транзакционного
    механизма при добавлении данных в одну таблицу
    Рассмотрим последовательность действий при создании и использовании запроса, с помощью которого запускается транзакция, в таблицу Поставлено добавляется новая запись, а затем имитируется ситуация некорректного или корректного завершения транзакции. Состояние таблицы контролируется до начала транзакции, в процессе выполнения транзакции и после завершения транзакции. Для этого нужно выполнить следующую последовательность действий.
    1. На панели инструментов нажать кнопку New Query
    2. Ввести текст запроса, приведенный на рис. 7.1.
    Рисунок 7.1 3. Выполнить запрос.
    4. В случае успешного выполнения запроса на экран будут выведены данные, иллюстрирующие состояние таблицы до начала транзакции, в процессе выполнения транзакции и после завершения транзакции (рис. 7.2). Как видно из приведенных данных, новая запись в таблице появляется, а затем исчезает.

    57
    Рисунок 7.2 5. Теперь рассмотрим ситуацию корректного завершения транзакции. Для этого в приведенном тексте запроса изменим оператор ROLLBACK на COMMIT.
    Выполним запрос. Результат приведен на рис. 7.3. Запрос можно сохранить с именем SQLQuery_trans.sql
    Рисунок 7.3

    58
    1   2   3   4   5   6   7   8


    написать администратору сайта