Транзакции Под транзакцией понимается неделимая последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации) такая, что-либо результаты всех операторов, входящих в транзакцию, реализуются в БД, либо воздействие всех этих операторов полностью отсутствует. Лозунг транзакции - "Все или ничего". Оператор StartTransaction. Оператор COMMIT - результаты гарантированно фиксируются в БД Оператор ROLLBACK - завершении транзакцию с откаткой транзакции. Поддержание механизма транзакций - показатель уровня развитости СУБД. Корректное поддержание транзакций одновременно является основой обеспечения целостности баз данных, а также составляют базис изолированности пользователей в многопользовательских системах. При переходе от персональных к многопользовательским СУБД пользователи сталкиваются с необходимостью четкого понимания природы транзакций. Изолированность пользователей Во многопользовательских системах с одной базой данных одновременно могут работать несколько пользователей или прикладных программ. Предельной задачей системы является обеспечение изолированности пользователей, т.е. создание достоверной и надежной иллюзии того, что каждый из пользователей работает с БД в одиночку. В связи со свойством сохранения целостности БД транзакции являются подходящими единицами изолированности пользователей. Действительно, если с каждым сеансом работы с базой данных ассоциируется транзакция, то каждый пользователь начинает работу с согласованным состоянием базы данных, т.е. с таким состоянием, в котором база данных могла бы находиться, даже если бы пользователь работал с ней в одиночку. Сериализация транзакций Понятно, что для того, чтобы добиться изолированности транзакций, в СУБД должны использоваться какие-либо методы регулирования совместного выполнения транзакций. План (способ) выполнения набора транзакций называется сериальным, если результат совместного выполнения транзакций эквивалентен результату некоторого последовательного выполнения этих же транзакций. Сериализация транзакций - это механизм их выполнения по некоторому сериальному плану. Обеспечение такого механизма является основной функцией компонента СУБД, ответственного за управление транзакциями. Система, в которой поддерживается сериализация транзакций обеспечивает реальную изолированность пользователей. Основная реализационная проблема состоит в выборе метода сериализации набора транзакций, который не слишком ограничивал бы их параллельность. Приходящим на ум тривиальным решением является действительно последовательное выполнение транзакций. Но существуют ситуации, в которых можно выполнять операторы разных транзакций в любом порядке с сохранением сериальности. Примерами могут служить только читающие транзакции, а также транзакции, не конфликтующие по объектам базы данных. Журнализация изменений БД Одним из основных требований к развитым СУБД является надежность хранения баз данных. Это требование предполагает, возможность восстановления состояния базы данных после любого рода аппаратных и программных сбоев. Очевидно, что для выполнения восстановлений необходима некоторая дополнительная информация. В подавляющем большинстве современных реляционных СУБД такая информация поддерживается в виде журнала изменений базы данных. Поскольку основой поддержания целостного состояния базы данных является механизм транзакций, журнализация и восстановление тесно связаны с понятием транзакции. Общими принципами восстановления являются следующие: результаты зафиксированных транзакций должны быть сохранены в восстановленном состоянии базы данных; результаты незафиксированных транзакций должны отсутствовать в восстановленном состоянии базы данных. Это и означает, что восстанавливается последнее по времени согласованное состояние базы данных. Возможны два основных варианта ведения журнальной информации. В первом варианте для каждой транзакции поддерживается отдельный локальный журнал изменений базы данных этой транзакцией. Кроме того, поддерживается общий журнал изменений базы данных, используемый для восстановления состояния базы данных после мягких и жестких сбоев. http://progs-maker.narod.ru/bd.html ЧТО ТАКОЕ ПРЕДСТАВЛЕНИЕ ? Типы таблиц, с которыми вы имели дело до сих пор, назывались - базовыми таблицами. Это - таблицы, которые содержат данные. Однако имеется другой вид таблиц: - представления. Представления - это таблицы чье содержание выбирается или получается из других таблиц. Они работают в запросах и операторах DML точно также как и основные таблицы, но не содержат никаких собственных данных. Представления - подобны окнам, через которые вы просматриваете информацию( как она есть, или в другой форме, как вы потом увидите ), которая фактически хранится в базовой таблице. Представление - это фактически запрос, который выполняется всякий раз, когда представление становится темой команды. Вывод запроса при этом в каждый момент становится содержанием представления. КОМАНДА CREATE VIEW Вы создаете представление командой CREATE VIEW. Она состоит из слов CREATE VIEW (СОЗДАТЬ ПРЕДСТАВЛЕНИЕ), имени представления которое нужно создать, слова AS (КАК), и далее запроса, как в следующем примере: CREATE VIEW Londonstaff AS SELECT * FROM Salespeople WHERE city = 'London'; Теперь Вы имеете представление, называемое Londonstaff. Вы можете использовать это представление точно так же как и любую другую таблицу. Она может быть запрошена, модифицирована, вставлена в, удалена из, и соединена с, другими таблицами и представлениями. Давайте сделаем запрос такого представления ( вывод показан в Рисунке 20.1): SELECT * FROM Londonstaff; =============== SQL Execution Log ============ | | | SELECT * | | FROM Londonstaff; | | | | ==============================================| | snum sname city comm | | ------ ---------- ----------- ------- | | 1001 Peel London 0.1200 | | 1004 Motika London 0.1100 | | | =============================================== 20.1 Рисунок 20.1: Представление Londonstaff Когда вы приказываете SQL выбрать(SELECT) все строки ( * ) из представления, он выполняет запрос содержащий в определении - Loncfonstaff, и возвращает все из его вывода. Имея предикат в запросе представления, можно вывести только те строки из представления, которые будут удовлетворять этому предикату. Вы могли бы вспомнить, что в Главе 15, вы имели таблицу, называемую Londonstaff, в которую вы вставляли это же самое содержание ( конечно, мы понимаем что таблица - не слишком велика. Если это так, вы будете должны выбрать другое им для вашего представления). Преимущество использования представления, по сравнению с основной таблицы, в том, что представление будет модифицировано автоматически всякий раз, когда таблица лежащая в его основе изменяется. Содержание представления не фиксировано, и переназначается каждый раз когда вы ссылаетесь на представление в команде. Если вы добавите завтра другого, живущего в Лондоне продавца, он автоматически появится в представлении. Представления значительно расширяют управление вашими данными. Это превосходный способ дать публичный доступ к некоторой, но не всей информации в таблице. Если вы хотите чтобы ваш продавец был показан в таблице Продавцов, но при этом не были показаны комиссии других продавцов, вы могли бы создать представление с использованием следующего оператора ( вывод показан в Рисунке 20.2 ) CREATE VIEW Salesown AS SELECT snum, sname, city FROM Salespeople: =============== SQL Execution Log ============ | | | SELECT * | | FROM Salesown; | | | | ==============================================| | snum sname city | | ------ ---------- ----------| | 1001 Peel London | | 1002 Serres San Jose | | 1004 Motika London | | 1007 Rifkin Barcelona | | 1003 Axelrod New York | =============================================== Рисунок 20.2: Представление Salesown Другими словами, это представление - такое же как для таблицы Продавцов, за исключением того, что поле comm, не упоминалось в запросе, и следовательно не было включено в представление. УДАЛЕНИЕ ПРЕДСТАВЛЕНИЙ Синтаксис удаления представления из базы данных подобен синтаксису удаления базовых таблиц: DROP VIEW < view name > В этом нет необходимости, однако, сначала надо удалить все содержание как это делается с базовой таблицей, потому что содержание представления не является созданным и сохраняется в течении определенной команды. Базовая таблица из которой представление выводится, не эффективна когда представление удалено. Помните, вы должны являться владельцем представления чтобы иметь возможность удалить его. Триггеры (Triggers) Триггеры это отдельная программа, ассоциированная с таблицей или видом, которая автоматически выполняет действия, при добавлений, изменений или удалений строки в таблице или виде. Триггеры могут обеспечивать следующие возможности: Автоматическое ограничение ввода данных, что бы гарантировать, что пользователь ввел только допустимые значения в поля столбцов. Упрощение сопровождения приложений, так как изменение в триггере автоматически отражается во всех приложения, которые используют таблицы со связанными с ними триггерами. Автоматическое документирование изменений таблицы. Приложение может упровлять логом изменений с помощью триггиров, которые выполняются всякий раз, когда происходит изменение таблицы. Когда триггер вызван, он имеет непосредвенный доступ к добавлению, изменению или уничтожению данных. Триггеру могут быть так же доступны данные из других таблиц. Вы можете разрабатывать триггеры для: Завершения операции, возможно с сообщением об ошибке. Установки значений в записи к торой вы обращаетесь. Добавления, изменения или удаления строк в других таблицах. CREATE TRIGGER CREATE TRIGGER определяет новый триггер в базе данных. Триггер это отдельная программа ассоциированная с таблицей или видом, которая автоматически выполняет действия, когда строка в таблице или виде вставлена, модифицирована или удалена. Триггер никогда не вызывается непосредственно. Наоборот, когда приложение или пользователь пытаются выполнить инструкцию INSERT, UPDATE или DELETE над строкой в таблице, любые триггеры связанные с этой таблицей и операцией автоматически выполняются, or fier. Триггер, определенный для UPDATE на не модифицируемых видах fire, даже если никакая модификация не происходит. Триггеры состоят из заголовка и тела. Заголовок триггера содержит: Имя триггера уникальное внутри базы данных, которое отличает триггер от всех остальных. Имя таблицы, определяющие таблицу, с которой связан триггер. Инструкции, которые определяют, когда триггер fires. Тело триггера содержит: Факультативный список локальных переменных и их типов данных. Блок инструкций на языке процедур и триггеров InterBase, заключенный между ключевыми словами BEGIN и END. Эти инструкции выполняются, когда триггер fires. Блок может содержать в себе другой блок, так, чтобы могло быть много уровней вложений. Важно: Так как каждая инструкция в теле сохраненной процедуры должна завершатся точкой с запятой, вы должны определить отличный символ для завершения инструкции CREATE TRIGGER в ISQL. Используйте SET TERM пред CREATE PROCEDURE чтобы определить терминатор отличный от точки с запятой. После инструкции CREATE TRIGGER, включите SET TERM, что бы изменить терминатор обратно к точке с запятой. Триггер связан с таблицей. Владелец таблицы и любой пользователь, наделенный привилегиями на таблицу, автоматически имеют права выполнять связанные с ней триггеры. Триггеры могут быть наделены привилегиями на таблицу, точно так же, как пользователи или процедуры могут быть наделены привилегиями. Используйте инструкцию GRANT, но вместо использования TO username, используйте TO TRIGGER trigger_name. Привилегии триггеров могут быть отменены аналогичным использованием REVOKE. Когда пользователь выполняет действия, которые fires триггер, триггер будет иметь привилегии на выполнение этих действий, если одно из следующих условий истино: Триггер имеет привилегии для этого действия. Пользователь имеет привилегии для этого действия. Язык процедур и триггеров InterBase это полный язык программирования для сохраненных процедур и триггеров. Он включает: Инструкции SQL манипулирования данными: INSERT, UPDATE, DELETE и singleton SELECT. Операторы и выражения SQL, включая UDF's связанные с базой данных и генераторы. Мощно расширяет SQL, включая инструкции присвоения, controlflow инструкции, контекстные переменные, even-posting инструкции, исключительные ситуации и инструкции обработки ошибок. Генераторы (Generators) Генератор (generator) это механизм который создает последовательный уникальный номер, который автоматически вставляется в столбец базой данных, когда выполняются операции INSERT или UPDATE. Генератор обычно применяется для создания уникальных значений, вставляемых в столбец, который используется как PRIMARY KEY. Для базы данных может быть определено любое число генераторов, каждый генератор должен имеет уникальное имя. CREATE GENERATOR CREATE GENERATOR объявляет генератор для базы данных и устанавливает его начальное значение в нуль. Генератор это последовательный номер, который может быть вставлен в столбец с помощью функции GEN_ID(). Генератор часто используется, что бы гарантировать уникальное значение в PRIMARY KEY, такой как номер счета, который должен уникально идентифицировать ассоциированную строку. База данных может содержать любое количество генераторов. Генераторы глобальны для базы данных, и могут быть использованы и обновлены в любой транзакции. InterBase не назначает повторяющиеся значение генератора через транзакции. Когда генератор создан, SET GENERATOR может установить или изменить его текущее значение. Генератор может быть использован для триггера, процедуры или SQL инструкции, которая вызывает GEN_ID(). К началу страницы... Синтаксис CREATE GENERATOR name; Name- имя для генератора. Следующая инструкция создает генератор EMPNO_GEN и триггер CREATE_EMPNO. Триггер использует генератор для создания последовательных числовых ключей, с приращение 1, для столбца NEW.EMPNO: CREATE GENERATOR EMPNO_GEN; SET TERM !! ; CREATE TRIGGER CREATE_EMPNO FOR EMPLOYEES BEFORE INSERT POSITION 0 AS BEGIN NEW.EMPNO = GEN_ID(EMPNO_GEN, 1); END SET TERM ; !!