PostgreSQL - откат триггера ENABLE/DISABLE?

У меня есть функция PL/pgSQL, тело которой содержит некоторые обычные/обычные операторы DML... такие как UPDATE, DELETE и т. д.

Но также в теле этой функции есть операторы, такие как:

ALTER TABLE sc.TBL DISABLE TRIGGER TR_TBL_Delete; --- 1

а также

ALTER TABLE sc.TBL ENABLE TRIGGER TR_TBL_Delete; --- 2

Теперь... Я знаю, что если в теле функции возникает ошибка, все изменения в БД, сделанные операторами UPDATE, DELETE и т.д., будут отменены. И это произойдет независимо от того, есть ли блок EXCEPTION (т. е. исключение исключения) как часть основного функционального блока или нет.

Обратите внимание, что при входе в функцию все триггеры находятся в состоянии ENABLED. Поэтому я хочу быть на 100% уверен, что при выходе из функции они также будут в состоянии ENABLED.

Итак... У меня есть некоторые опасения по этому поводу... Интересно, возможно ли, чтобы какой-то триггер оставался в состоянии DISABLED, потому что оператор формы --- 2 не был достигнут (из-за возникшей ошибки).

В некотором смысле мне интересно, участвуют ли операторы ENABLE TRIGGER/DISABLE TRIGGER в той транзакции, в которой выполняется тело функции.

Мне нужен авторитетный ответ с некоторыми ссылками на официальные документы, если это возможно.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
0
487
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попробовал это сам с помощью нескольких простых тестов.

Эти триггерные операторы ENABLE/DISABLE участвуют в транзакции. Это означает, что он работает так, как я хотел/ожидал, что он будет работать.

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

BEGIN
    ALTER TABLE TBL DISABLE TRIGGER A;

    -- do some work (success) 

    -- more work here... but an error is raised

    ALTER TABLE TBL ENABLE TRIGGER A; -- (not executed)

    -- some other statements here (not executed) 

END;

Другие вопросы по теме