Создание триггеров для обработки событий изменения структуры базы данных.
create trigger <name> [active | inactive] on <ddl_event>
<db_event> ::= {any ddl statement | <ddl_list>} <ddl_list> ::= <d_event> [,<ddl_list>] <d_event> ::= {create | alter | drop} <ddl_object> <ddl_object>={table | procedure | function | trigger | exception | view | domain | role | sequence | user | collation | package | package body | mapping} Для объектов collation, package опция alter неприменима. Данная группа триггеров предназначена для контроля изменений структуры базы данных. В больших системах возможны ситуации, когда отдельные давно функционирующие программы «вдруг» начинают работать неправильно. Причиной этой ситуации часто бывают, казалось бы, незначительные изменения в структуре таблиц обзоров, функций или процедур. В действующей системе с сотнями таких объектов отследить подобные изменения достаточно сложно, особенно, если это проявляется при работе программ, которые используются достаточно редко, например полугодовые и годовые отчеты и тому подобное. Использование триггеров этой группы позволяет сохранить историю подобных изменений с одной стороны, и контролировать сам процесс модификации структур базы данных с другой. Команда ALTER TRIGGER Команда alter trigger предназначена для изменения ранее созданных триггеров. Используя команду alter trigger, можно изменить заголовок триггера, тело триггера и то и другое одновременно. В заголовке триггера можно изменить: признак активности триггера, условие включения триггера (after-before, insert - update - delete), порядок включения триггеров. Изменение тела триггера состоит в его замене на вновь указанное. Для изменения автоматически создаваемого системой (по команде check) триггера следует использовать alter table. Команда alter trigger может быть также использована для отключения триггера без его удаления. Если установить опцию inactive, то триггер не будет включаться. В то же время он сохраняется в базе и для его повторного включения достаточно выдать alter trigger с опцией active. alter trigger <name>[{active | inactive}][{before | after} Синтаксис alter trigger аналогичен синтаксису create trigger, за исключением: • В команде отсутствует опция указания таблицы, к которой относится триггер. При создании триггера он связывается с определенной таблицей и эта связь не может быть изменена, иначе это будет уже другой триггер, для создания которого нужна другая команда create trigger. • Если какие-либо опции в alter trigger отсутствуют, то они копируются из существующего описания триггера. Изменение заголовка триггера При необходимости изменить заголовок триггера надо задать список изменяемых опций триггера (хотя бы одной опции). При этом остальные опции триггера не будут меняться. Если меняются опции after или before, то должна быть указана и соответствующая им опция из перечня insert, update, delete. Изменение тела триггера При необходимости изменить только тело триггера в заголовочной части следует задавать только имя триггера. Тело триггера, заданное в команде alter trigger, заменяет тело существующего триггера. На практике можно рекомендовать предварительно выбрать тело существующего триггера, затем внести в него изменения и загрузить командой alter trigger. Команда drop trigger Команда drop trigger используется для физического удаления триггера из базы данных. Для временного отключения триггера следует использовать команду alter trigger. Автоматически созданные триггеры (конструкцией check) не могут удаляться. Для удаления таких триггеров следует использовать команду alter table. drop trigger <name >; 6.6. Команды создания, удаления, модификации триггеров и работа с ними в Oracle Синтаксис команд создания триггеров в Oracle, хотя и похож на синтаксис InterBase, но имеет ряд отличий и имеет следующий вид create [or replace] trigger [<schema.>]<trigger_name>{before | after | instead of} {<dml_event_list> | {<ddl_event_list> | <db_event_list>} on {[<schema.>schema} | database} [referencing <list_ref>] [for each row] [when <condition>] {<pl_sql_block> | <call_proc_stmnt>}
<schema.> - имя схемы, в которой находится контролируемый объект (к которому относится триггер); после имени следует «.», отделяющая имя схемы от имени объекта.
<dml_event_list> задает список условий, при которых срабатывает триггер на изменение данных <dml_event_list> ::= {delete | insert | update [of <column_list>]} [or <dml_event_list>] <column_list> задает список столбцов объекта, при обновлении которых срабатывает триггер. <column_list> ::= <column_name> [,<column_list>] <ddl_event_list> задает список условий, при которых срабатывает триггер на изменение структуры данных <ddl_event_list> ::= <ddl_event> [,<ddl_event_list>] <ddl_ event> ::= {alter | analyze | associate statistics | audit | comment | create | disassociate statistics | drop | grant | noaudit | rename | revoke | truncate}
События alter, create, drop, rename возникают при соответствующих действиях с объектами базы данных. События analyze, associate statistics, audit, disassociate statistics, noaudit возникают при обработке статистической информации об объектах базы данных. События grant, revoke возникают при попытках предоставления прав. Событие truncate возникают при попытках очистки таблиц базы (операция truncate делает таблицу пустой и, в отличие от операции delete не допускает возможности отката). <db _event _list> - события, возникающие при общих операциях в базе данных <db_event_list> ::= <db_event> [,<db_event_list>] <db _event> = {servererror, logon, logoff, startup, shutdown} Перечисленные события возникают при серверных ошибках, подключении или отключении пользователей к базе данных, при старте и завершении работа сервера Oracle соответственно. referencing <list _ref> используется для управления контекстными переменными внутри тела триггера. <list_ref> ={old [as] <user_old>| new [as] <user_new> | parent [as] <user_ parent>} [<list_ref>] for each row задает условие включения триггера при изменении каждой строки объекта; в этом случае внутри триггера доступны значения столбцов объекта. Если режим for each row не задан, то триггер срабатывает на транзакцию целиком, либо перед ее началом при задании режима before, либо после ее завершения началом при задании режима after. В этом случае значения в отдельных столбцах объекта недоступны, но появляется возможность выполнить подготовительные и завершающие действия при операциях, действующих на группу строк. Отметим, что такая возможность в рамках InterBase отсутствует. При работе с Oracle контролируется ситуация вызова из триггера команд изменения данных в одной и той же таблице, что в принципе является потенциально опасным действием, могущем вызвать «зацикливание» обработке. Таким образом, при создании (изменении) триггера может появиться сообщение о «мутирующей» таблице. В случаях, когда изменение одной из строк таблицы должно согласованно менять данные в других строках той же таблицы можно рекомендовать использование обзора (view), построенного для этой таблицы в триггерах instead of которого можно уже корректно провести согласованные изменения в таблице; угроза «зацикливания» при этом легко обходится. when <condition> задает условие, при котором вызывается триггер. Задание конструкций when <condition> позволяет создать для объекта несколько триггеров, из которых в зависимости от значения <condition> вызываются только необходимые. Это позволяет упростить разработку и отладку триггеров, а также действия, связанные с их подключением, отключением, добавлением новых триггеров без отключения существующих. <call_proc_stmnt> позволяет вместо тела триггера использовать вызов хранимой процедуры. <call_proc_stmnt> = call <proc_name>[(<par_list>)] Триггер подобного типа можно проиллюстрировать следующим примером … for each row call my_check(:new.field1, :new.field5, :new.field8); 6.7. Команды создания, удаления, модификации хранимых процедур; работа с ними в InterBase Создание хранимых процедур Хранимые процедуры создаются командой create procedure. Хранимая процедура состоит из заголовка и тела. Заголовок хранимой процедуры содержит: • Имя процедуры, которое должно быть уникальным среди имен функций, процедур, таблиц и обзоров в базе данных. • Необязательный список параметров процедуры, передаваемых процедуре вызывающими приложениями, с указанием их типов данных. Для процедур, возвращающих значения вызывающим приложениям, необходимо указать список возвращаемых параметров с указанием их типов. Список указывается после ключевого слова returns. Тело процедуры содержит: • Необязательный список локальных переменных с указанием их типов. Блок операторов на языке процедур и триггеров, заключенный в операторные скобки begin - end. Сам блок может содержать внутри себя другие блоки. Количество вложений блоков практически не ограничено. При использовании для ввода команды Script-файла необходимо помнить, что в соответствии с синтаксисом операторы внутри процедуры отделяются друг от друга символом ";". В то же время команды в Script-файле также отделяются ";". Чтобы устранить неоднозначность разделения команд, необходимо установить какой-либо иной ограничитель текста команд. Для этого следует непосредственно перед заданием команды create trigger или create procedure выполнить команду set term, устанавливающую такой ограничитель, а в конце работы той же командой set term восстановить стандартный (";").
create procedure <name> [(<lict_param_in>)] [returns(>[(<lict_param_out>)] as <procedure_body>;
<lict_param_in> ::= <param_name> <datatype> [,<lict_param_in>] <lict_param_out> ::= <param_name> <datatype> [,<lict_param_out>]
<procedure_body> ::= [<variable_declaration_list>] <block> <name> - имя процедуры, имя должно быть уникальным среди имен процедур, таблиц и обзоров в базе данных <lict_param_in> задает список входных параметров <lict_param_out> задает список выходных параметров <param_name> <datatype> - параметр процедуры, передаваемый ей вызывающими приложениями и его тип или возвращаемый процедурой. Процедура возвращает значения выходных параметров вызывающим приложениям по достижении ее конца или по команде suspend в теле процедуры as - ключевое слово, отделяющее заголовок процедуры от ее тела Объявление переменных и тело процедуры аналогичны объявлению переменных и телу триггера за исключением того, что префиксы «new.» и «old.» здесь, естественно недоступны, а могут использоваться директивы exit и suspend.
ПРИМЕР create procedure pbuthor(code integer) returns (authors varchar(250)) Изменение хранимых процедур Изменение хранимых процедур осуществляется командой alter procedure. alter procedure изменяет описание хранимой процедуры при условии сохранения корректности ссылок на нее со стороны объектов базы данных. Изменения, внесенные в хранимую процедуру, сразу становятся доступными для всех использующих ее приложений. Перекомпиляция соответствующих приложений не требуется. При изменении хранимой процедуры новое описание замещает существующее. Необходимо помнить, что изменение состава, последовательности и типов входных и выходных параметров процедур, как и интерфейса прикладных программ, может повлечь необходимость внесения изменений в вызывающих программах. Синтаксис команды alter procedure аналогичен синтаксису команды create procedure: alter procedure <name>[([(<lict_param_in>)] <name> – имя существующей хранимой процедуры. Состав параметров и опций команды полностью аналогичен параметрам и опциям команды create procedure. Удаление хранимых процедур Удаление хранимых процедур осуществляется командой drop procedure. Команда drop procedure удаляет существующую в базе данных процедуру, и может быть выполнена создателем процедуры, пользователем SYSDBA или другим пользователем с аналогичными правами. drop procedure <name>; <name> – имя существующей процедуры. ПРИМЕР drop procedure pbuthor; Изменения желательно проводить, когда с базой не работают приложения, использующие процедуры, в противном случае нельзя быть уверенным, с какой именно версией процедуры они работают. Обращение к выполнимой процедуре При обращении к выполнимой процедуре из другой выполнимой процедуры или триггера используется следующий синтаксис: execute procedure <name> [<param_list>] <name> – имя процедуры, <param_ list> задает список входных или выходных параметров. <param_list> ::= : <param> [,<param_list>] <param> – входной параметр или возвращаемое значение. При обращении к выполнимой процедуре из ISQL используется следующий синтаксис. execute procedure <name> [(<iparam_list>)]; <iparam_list> - список входных параметров. <iparam_list> ::= <param> [,<iparam_list>] Обращение к процедуре выбора При обращении к процедуре выбора используется следующий синтаксис: select <col_list> from <name> [(<param_list>)] <name> – имя процедуры, <param_list> - список параметров <param_list> ::= <param> [,<param_list>] <param> – входной параметр процедуры, <col_list> – список выбираемых выражений (должен базироваться на списке возвращаемых значений процедуры), <search_condition>, <order_list> – условия выборки и способ упорядочения результатов. В целом структура команды select не зависит от того, каким образом выбираются данные (см. разд. 3.1). Синтаксически использование процедуры от таблицы или обзора отличается только тем, что после имени процедуры могут указываться ее параметры. Выборка данных из процедуры может сочетаться с выборками из других объектов: таблиц, обзоров, процедур. Доступ к хранимым процедурам Доступ к хранимым процедурам, так же, как к таблицам и обзорам, регулируется механизмом предоставления прав доступа командами grant и revoke. Поскольку в своей работе хранимые процедуры могут обращаться к таблицам, обзорам и другим хранимым процедурам, самим процедурам также должны быть установлены права доступа. Изначально процедуры получают те же права, что и их создатель. Доступ к ним получает их создатель и пользователь SYSDBA или другой с аналогичными правами.
6.8. Команды создания, удаления, модификации хранимых процедур; работа с ними в Oracle Базовый синтаксис создания процедур имеет следующий вид. create [or replace] procedure [<schema>.]<proc_name> [(<list_par>)] as begin [<psql_statements>] end Полный синтаксис содержит ряд дополнительных опций, но их рассмотрение выходит за рамками данной книги.
<schema> - имя схемы. <proc_name> - имя процедуры. <list_par> - список параметров. <list_par> ::= <param_descr> [, <list_par>] <param_descr> ::= <param_name> {in | out | in out} <datatype> <param_name> - имя параметра. <datatype> - любой допустимый в PL/SQL Oracle тип данных, однако характеристики размера полей (прежде всего, для символьных полей) и точности (для числовых) в описании типа данных недопустимы. Текст тела процедуры задает алгоритм реализуемый процедурой в соответствии с описанным выше синтаксисом языка PL/SQL. Синтаксис команды alter procedure имеет вид. alter procedure [<schema>.]<proc_name> compile [debug]; Команда выполняет перекомпиляцию указанной процедуры без внесения в ее текст каких-либо изменений. Последнее может быть полезно, когда процедура по тем или иным причинам помечена, как неправильная, например, из-за внесения изменений в процедуры или функции, вызываемые из нее. Синтаксис команды удаления процедуры имеет вид.
drop procedure [<schema>.]<proc_name>;
6.9. Команды создания, удаления, модификации пользовательских функций; работа с ними в InterBase Создание функций Пользовательские функции, как самостоятельный объект InterBase появляются, начиная с версии 3.0. Пользовательские функции могут использоваться так же, как и встроенные, везде, где по синтаксису допустимо использование выражений. В теле функций допустимы те же операторы, что и в хранимых процедурах за исключением оператора suspend. Работа функции завершается оператором return <expr>. Пользовательские функции создаются командой create function. Пользовательская функция состоит из заголовка и тела. Заголовок пользовательской функции содержит: • Имя функции, которое должно быть уникальным среди имен функций, процедур, таблиц и обзоров в базе данных. • Необязательный список параметров функции, передаваемых функции вызывающими приложениями, с указанием их типов данных. Тип возвращаемого значения указывается после ключевого слова returns. Тело функции содержит: • Необязательный список локальных переменных с указанием их типов. Блок операторов на языке процедур и триггеров, заключенный в операторные скобки begin - end. Сам блок может содержать внутри себя другие блоки. Количество вложений блоков практически не ограничено. При использовании для ввода команды Script-файла необходимо помнить, что в соответствии с синтаксисом операторы внутри процедуры отделяются друг от друга символом ";". В то же время команды в Script-файле также отделяются ";". Чтобы устранить неоднозначность разделения команд, необходимо установить какой-либо иной ограничитель текста команд. Для этого следует непосредственно перед заданием команды create function выполнить команду set term, устанавливающую такой ограничитель, а в конце работы той же командой set term восстановить стандартный (";"). create function <name> [(<param_list>)] <function_body> ::=[ <variable_declaration_list>] <block> <name> - имя функции, имя должно быть уникальным среди имен функций, процедур, таблиц и обзоров в базе данных <param_list> ::= <param> <datatype> [,<param_list>] <param> <datatype> - параметр функции, передаваемый ей вызывающими приложениями и его тип. returns <datatype> - задает тип возвращаемого значения. as -Ключевое слово, отделяющее заголовок функции от ее тела ПРИМЕР create procedure pbuthor(code integer) returns varchar(250) declare variable authors varchar(250); authors= ''; Изменение функций Изменение пользовательских функций осуществляется командой alter function. alter function изменяет описание пользовательской функции при условии сохранения корректности ссылок на нее со стороны объектов базы данных. Изменения, внесенные в пользовательскую функцию, сразу становятся доступными для всех использующих ее приложений. Перекомпиляция соответствующих приложений не требуется. При изменении пользовательской функции новое описание замещает существующее. Необходимо помнить, что изменение состава, последовательности и типов входных параметров и возвращаемых значений функции, как и интерфейса прикладных программ, может повлечь необходимость внесения изменений в вызывающих программах. Синтаксис команды alter function аналогичен синтаксису команды create function: alter function <name> [(<param_list>)] <name>– имя существующей функции. <param_list> ::= <param> <datatype> [,<param_list>]
Состав параметров и опций команды полностью аналогичен параметрам и опциям команды create function. Удаление функции Удаление пользовательских функций осуществляется командой drop function. Команда drop function удаляет существующую в базе данных функцию, и может быть выполнена создателем процедуры, пользователем SYSDBA или другим пользователем с аналогичными правами. drop function <name>; <name> – имя существующей процедуры. ПРИМЕР drop function pbuthor; Изменения желательно проводить, когда с базой не работают приложения, использующие функцию, в противном случае нельзя быть уверенным, с какой именно версией функции они работают. Обращение к функции При обращении к пользовательской функции из другой выполнимой процедуры или триггера используется следующий синтаксис: <name> ( [<par_list>]) <par_list> ::= <param>[,<par_list>] < param> – имя входного параметра.
6.10. Команды создания, удаления, модификации функций; работа с ними в Oracle Базовый синтаксис создания функции имеет следующий вид. create [or replace] function [<schema>.]<func_name> [(<list_par>)] return <datatype> as begin [<psql_statements>] end Полный синтаксис содержит ряд дополнительных опций, но их рассмотрение выходит за рамками данной книги.
<schema> - имя схемы. <func_name> - имя процедуры. <list_par> - список параметров. <list_par> ::= <param_descr> [, <list_par>] <param_descr> ::= <param_name> {in | out | in out} <datatype> <param_name> - имя параметра. <datatype> - любой допустимый в PL/SQL Oracle тип данных, однако характеристики размера полей (прежде всего, для символьных полей) и точности (для числовых) в описании типа данных недопустимы. Текст тела функции задает алгоритм реализуемый функцией в соответствии с описанным выше синтаксисом языка PL/SQL. Работа функции завершается оператором return, таким образом, тело функции должно содержать, по крайней мере, один такой оператор. Синтаксис команды alter function имеет вид. alter function [<schema>.]<proc_name> compile [debug]; Команда выполняет перекомпиляцию указанной функции без внесения в ее текст каких-либо изменений. Последнее может быть полезно, когда функция по тем или иным причинам помечена, как неправильная, например, из-за внесения изменений в процедуры или функции, вызываемые из нее. Синтаксис команды удаления функции имеет вид.
drop procedure [<schema>.]<proc_name>;
Доступ к хранимым процедурам Доступ к хранимым процедурам, так же, как к таблицам и обзорам, регулируется механизмом предоставления прав доступа командами grant и revoke. Поскольку в своей работе хранимые процедуры могут обращаться к таблицам, обзорам и другим хранимым процедурам, самим процедурам также должны быть установлены права доступа. Изначально процедуры получают те же права, что и их создатель. Доступ к ним получает их создатель и пользователь SYSDBA или другой с аналогичными правами. Глава 7. Расширенные возможности для работы с базой 7.1. Обзоры (представления) Пользователи базы данных обычно должны обращаться к специфическому подмножеству данных, хранимых в базе. Кроме того, требования к данным отдельных пользователей или групп пользователей часто весьма противоречивы. Обзоры обеспечивают способ создать настраиваемую версию основных таблиц, которые отображают только те данные, которые интересуют данного пользователя или группу пользователей. Как только обзор определен, с ним можно работать так, как если бы это была обычная таблица. Обзор может быть получен из одной или нескольких таблиц или других обзоров. Обзоры выглядят точно так же как обычные таблицы базы данных, но физически не хранятся в базе данных. В базе хранится только определение обзора, которое используется для фильтрации данных при выполнении запросов, ссылающихся на обзор. Отметим, что создание обзора не создает копию данных, в то же время изменение данных через обзор, изменяет данные в основных таблицах, а замена данных в основных таблицах непосредственно отражается в обзоре. Обзор можно представлять как подвижное "окно", через которое видны фактические данные. Учитывая, что обзор все-таки не является таблицей, на операции с обзорами накладываются некоторые ограничения, которые будут рассмотрены ниже. Обзор представляет собой виртуальную таблицу, которая создается на основе результатов выборки данных из базы командой select. Он может быть создан: • На основе комбинации подмножества строк и столбцов отдельной таблицы. • На основе комбинации подмножества строк и столбцов объединения нескольких таблиц. Обзор может быть также создан на основе результатов работы хранимой процедуры. Использование обзоров позволяет обеспечить решение ряда задач: • Упрощенный доступ к данным. Обзоры дают возможность сформировать подмножество данных из одной или нескольких таблиц, которое можно использовать как основу для запросов без повторной выдачи команды SELECT. • Настраиваемый доступ к данным. Обзоры обеспечивают способ приспособить базу данных к требованиям разных пользователей с различными привычками и интересами. Обзоры позволяют выделить только те данные, которые интересуют конкретного пользователя. • Независимость приложений от организации хранения данных. Обзоры изолируют пользователей от изменений в структуре основной базы данных (при изменении базы несложно сохранить обзор в неизменном виде). • Защита данных. Обзоры обеспечивают защиту данных, ограничивая доступ к отдельным элементам данных.
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (219)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |