Oracle как отключить триггер

Обновлено: 04.07.2024

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

schema_name
Имя схемы, к которой принадлежит триггер. Аргумент schema_name не может указываться для триггеров DDL или триггеров входа.

trigger_name
Имя триггера, который нужно отключить.

ALL
Означает, что все триггеры в области действия предложения ON будут отключены.

SQL Server создает триггеры в базах данных, опубликованных для репликации слиянием. Если в опубликованных базах данных указано значение ALL, то эти триггеры отключаются, что прерывает репликацию. Перед тем как задавать значение ALL, убедитесь, что текущая база данных не опубликована для репликации слиянием.

object_name
Имя таблицы или представления, для выполнения которых создан триггер DML с именем trigger_name.

DATABASE
Показывает, что триггер DDL trigger_name был создан или изменен для выполнения в области базы данных.

ALL SERVER
Область применения: SQL Server 2008 и более поздних версий.

Показывает, что триггер DDL trigger_name был создан или изменен для выполнения в области сервера. Параметр ALL SERVER также применяется к триггерам входа.

Этот параметр недоступен в автономной базе данных.

Remarks

Триггеры включаются по умолчанию при создании. Отключение триггера не сбрасывает его. Триггер все еще существует как объект в текущей базе данных. Однако триггер не запускается, когда инструкции Transact-SQL, для которых он запрограммирован, выполняются. Повторно включить триггеры можно с помощью инструкции ENABLE TRIGGER. Кроме того, триггеры DML, определенные в таблицах, можно отключать или включать с помощью ALTER TABLE.

Изменение триггера с помощью инструкции ALTER TRIGGER приводит к включению триггера.

Разрешения

Для отключения триггера DML пользователь должен обладать как минимум разрешением ALTER для таблицы или представления, где создан триггер.

Для отключения триггера DDL в области сервера (ON ALL SERVER) или триггера входа пользователь должен обладать разрешением CONTROL SERVER для этого сервера. Для отключения триггера DDL в области базы данных (ON DATABASE) пользователь должен обладать как минимум разрешением ALTER ANY DATABASE DDL TRIGGER в текущей базе данных.

Примеры

Приведенные ниже примеры описаны в базе данных AdventureWorks2012.

A. Отключение триггера DML в таблице

В следующем примере показано отключение триггера uAddress , созданного для таблицы Person .

Б. Отключение триггера DDL

В следующем примере создается триггер DDL safety в области базы данных, а затем он отключается.

В. Отключение всех триггеров, определенных в одной области

В следующем примере отключаются все триггеры DLL, созданные в области сервера.

триггеры в PL/SQL: Сопровождение

Oracle поддерживает ряд команд DDL, повышающих эффективность управления триг­герами на PL/SQL. С их помощью можно включать, отключать и удалять триггеры, просматривать информацию о них, проверять их состояние.

Отключение, включение и удаление триггеров в PL/SQL

Отключенный триггер не запускается при наступлении связанного с ним события. Уда­ленный триггер полностью исчезает из базы данных. Синтаксис отключения триггера очень прост по сравнению с синтаксисом создания:

Отключенный триггер можно включить повторно следующей командой:

В команде ALTER TRIGGER задается только имя триггера; ни его тип, ни что-либо иное задавать не нужно. Эту команду можно вызывать из хранимой процедуры PL/SQL, как в сле­дующем примере, где включение и отключение всех триггеров таблицы выполняется динамическим кодом SQL:

Команда удаления триггера DROP TRIGGER столь же проста; как и в предыдущем случае, достаточно указать имя:

Создание отключенных триггеров PL/SQL

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

Благодаря присутствию в заголовке ключевого слова DISABLE этот триггер будет про­верен, откомпилирован и создан, но не будет запускаться до его явного включения на более поздней стадии. Учтите, что ключевое слово DISABLE не сохраняется в базе данных:

Если вы пользуетесь служебными программами с графическим интерфейсом, будьте осторожны — перекомпиляция может привести к непреднамеренному включению триггеров.

Просмотр триггеров PL/SQL

В словаре данных Oracle имеется несколько представлений, возвращающих разно­образную информацию о триггерах:

  • DBA_TRIGGERS — все триггеры базы данных;
  • ALL_TRIGGERS — все триггеры, доступные текущему пользователю;
  • USER_TRIGGERS — все триггеры, принадлежащие текущему пользователю.

В табл. 1 перечислены самые важные (и часто используемые) столбцы этих пред­ставлений.

Таблица 1. Название таблицы

Проверка работоспособности триггера

Как ни странно, ни одно из указанных представлений не содержит информации о том, находится ли триггер в работоспособном состоянии. Если триггер создан ошибочной командой PL/SQL, он сохраняется в базе данных, но помечается как неработоспособный ( INVALID ). Чтобы определить, находится ли триггер в этом состоянии, нужно извлечь информацию из представления user_objects или all_objects :

Пишу участок кода, в котором для работы на время операции необходимо отключить триггер, а затем - включить. На самую первую строку "alter table. " выдаётся ошибка:

PLS-00103: Encountered the symbol "ALTER" when expecting one of the following:

Как включить/отключить триггер?


50.3k 152 152 золотых знака 54 54 серебряных знака 211 211 бронзовых знаков 393 2 2 золотых знака 6 6 серебряных знаков 17 17 бронзовых знаков На вопрос уже ниже ответили. от себя замечу, что так делать вообще не стоит. DDL завершит текущую транзакцию и откат выполняемого в данном pl/sql блоке и до него будет невозможен. И что самое печальное - это почти равносильно тому, что вы просто удалите триггер навсегда. в момент между disable и enable другой процесс может сделать в таблице, что то на что нужна реакция, а триггер выполнен не будет. стоит рассмотреть другие пути обхода, например модифицировать некое поле и/или использовать специальное значение на которое среагирует триггер и не будет выполнять то, что не надо @Mike отличный комментарий! Если добавить в него пример реализации без DDL и ссылки на документацию, то получится отличный ответ, который дополнит уже существующий.

В PL\SQL блоках операторы DDL надо обернуть в execute immediate


6,965 5 5 золотых знаков 31 31 серебряный знак 59 59 бронзовых знаков

Несколько подзабытое решение появившееся до execute immediate . Это пакетная процедура dbms_utility.exec_ddl_statement (ddl_statement) . Оба решения делают то же самое, в PL/SQL контексте выполняет DDL, который не поддерживается статическими инструкциями. Предпочтительней использовать execute immediate .

Но небольшое преимущество у dbms_utility.exec_ddl_statement всё же есть - её можно выполнить в дистрибутивной среде. Например отключить триггеры в удалённой базе до того, как произвести вставку или изменение в таблице в этой же удалённой базе.

Внимательно ознакомьтесь с комментарием от @Mike перед тем, как решите использовать предложенное решение.


50.3k 152 152 золотых знака 54 54 серебряных знака 211 211 бронзовых знаков

Левый и правый объекты триггеров операторов обычно являются таблицами данных. Действие триггера - это операция Dml для целевого объекта.

Триггер создания оператора

Роль триггера и время срабатывания триггера

Триггеры в Oracle могут быть построены на таблицах данных или представлениях

Вы можете создать до и после триггеров для таблицы, но для представления вы не можете создать до и после триггеров

Триггерная операция триггера включает только вставку и обновление. Вы не можете создавать триггеры для операций выбора.

Несколько действий по активации

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

Предикат триггера

Может быть несколько действий активации триггера, когда необходимо точно определить, какое действие активирует триггер. Использование предикатов триггера - хороший выбор.

Существует три типа предикатов триггера: вставка, обновление, удаление

Записать журнал операций пользователя в таблицу данных

Если все изменения данных отправлены, данные таблицы student_log также будут отправлены, а если откат операции с данными таблицы student откатывается, операция данных по student_log, инициируемой триггером, также будет откатываться.

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

Для модификации таблицы учеников вам необходимо записать данные перед изменением, то есть необходимость сохранения исторических данных. На этот раз используйте триггер строки

Создать и использовать триггеры строк

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

: old - переменная типа строки, через которую можно ссылаться на столбцы строки. : Старая переменная не может быть применена к триггеру типа операции вставки

Ссылки на переменные для триггеров строк

Соответствует: старая переменная: новая переменная: новая используется для ссылки на новые записи

Перед операцией преобразуйте столбец состояния новой записи в верхний регистр. Время срабатывания не может быть после

Даже если инструкция Update не включает столбец student_age. Но Oracle все еще обновляет его до 0

Модификация: значение, указанное old, является недопустимым действием, и будет сообщено об ошибке.

Переменная ссылка и ссылка

Вы можете использовать ссылочное ключевое слово для указания переменных в объявлении триггера вместо: old и: new links

Порядок выполнения нескольких триггеров

Когда действие активирует несколько триггеров, эти триггеры будут срабатывать в следующем порядке: высокий уровень> низкий уровень. Табличные триггеры предшествуют триггерам строк. Если уровень совпадает, триггер, который был создан позже, чем тот, который был создан ранее

Условия запуска

Когда (old.emplayee_age <18) ставится после того, когда (old.emplayee_age <18), это означает, что триггер сработает только тогда, когда строка удовлетворяет employee_age меньше 18. Примечание: ограничение должно быть расширено скобками, в ссылочной записи вместо старого используется старый

вместо триггера используется для замены действия триггера, например: триггер действия вставки больше не выполняет действие вставки, а вместо этого выполняет действие триггера

Создать и использовать вместо триггера

Вместо действия Обновить

вместо ссылки на переменную в триггере

Действия триггера вместо триггера «Не» включают «Обновить», «Вставить» и «Удалить» Для каждой строки данных для каждого действия вместо триггера будет выполнен один раз. Поэтому вместо триггеров используются триггеры уровня строки. Но нет необходимости отображать оператор для каждой строки. Кроме того
, вместо Trigger может напрямую ссылаться на исходные / новые данные, но не может изменить значение этих ссылок.

Триггер вместо используется для замены исходного действия, поэтому исходное действие не будет выполнено. При обновлении после изменения значения, на которое ссылается new, Oracle попытается отразить это изменение в базе данных, то есть выполнить фактическое действие по обновлению. И это противоречит первоначальному замыслу вместо триггера.

Системные события - это события, запускаемые действиями на уровне базы данных. Эти события в основном включают запуск базы данных, завершение работы базы данных и системные ошибки. Триггеры, созданные для системных событий, называются системными событиями.

Пользовательские события относятся к операциям Dml, таким как таблицы (представления), выполняемые пользователями. К общим пользовательским событиям относятся событие создания, усечение, удаление, изменение, принятие и откат. Триггеры, созданные для пользовательских событий, называются пользовательскими событиями.

Системные и пользовательские события не являются обычно используемыми.

Триггер системного события

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

Время запуска не может быть до запуска базы данных и после ее закрытия.

Пользовательский триггер

Пользователь может иметь несколько объектов в базе данных, например, пользователь имеет несколько таблиц данных и представлений. Объект пользовательского триггера событий - это не отдельный объект, а совокупность всех объектов, принадлежащих пользователю, то есть схема, которую мы часто говорим.

Триггеры могут быть созданы до и после следующих действий

Следующие события имеют только перед триггером

Следующие события имеют только после триггера

в system.schema указывает, что роль триггера играют все объекты пользовательской системы, а ora_dict_obj_name указывает имя удаленного объекта.

Отключить триггер

Включить триггер

Просмотр информации о триггере в словаре данных

В базе данных Oracle представления, связанные с триггерами, включают user_objects и user-triggers

Читайте также: