Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> МУТАЦИЯ? 
:(
    Опции темы
setnull
Дата 21.10.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

Репутация: 1
Всего: 1



Все здравствуйте!!!

Как в триггере узнать, замутирована ли та или иная таблица?

Спасибо!!!
PM MAIL   Вверх
Zloxa
Дата 21.10.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



попытаться выбраться и обработать -04091


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
azesmcar
Дата 21.10.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Не слышал о таком способе, но для избежания ошибки мутации можно использовать триггеры "AFTER" или использовать autonomous transactions.
PM   Вверх
DimW
Дата 26.10.2009, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(azesmcar @  21.10.2009,  13:21 Найти цитируемый пост)
но для избежания ошибки мутации можно использовать триггеры "AFTER"

как?
Код

create table TABLE1
(
  ID   NUMBER,
  NAME VARCHAR2(100)
)
/

create or replace trigger trigger_table1
after insert on table1
for each row
declare
  n number;
begin
  select count(*) into n from table1;
end;
/

SQL> insert into table1 values (10, 'xxx')
  2  /
 
insert into table1 values (10, 'xxx')
 
ORA-04091: table TABLE1 is mutating, trigger/function may not see it
ORA-06512: at "TRIGGER_TABLE1", line 4
ORA-04088: error during execution of trigger 'TRIGGER_TABLE1'



Цитата(setnull @  21.10.2009,  12:42 Найти цитируемый пост)
Как в триггере узнать, замутирована ли та или иная таблица?

конечную цель пояснить можете?
PM MAIL ICQ   Вверх
azesmcar
Дата 27.10.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(DimW @  26.10.2009,  08:17 Найти цитируемый пост)
как?

Интересно, я решал с помощью autonomous transactions. Насчет AFTER тригеров у меня теоретические знания, на сайте было написано, проверю на днях.

Добавлено через 3 минуты и 46 секунд
Цитата

The Oracle mutating trigger error occurs when a trigger references the table that owns the trigger, resulting in the "ORA-04091: table name is mutating, trigger/function may not see it." message.

    * Don't use triggers - The best way to avoid the mutating table error is not to use triggers.  While the object-oriented Oracle provides "methods" that are associated with tables, most savvy PL/SQL developers avoid triggers unless absolutely necessary.
       
    * Use an "after" trigger - If you must use a trigger, it's best to avoid the mutating table error by using an "after" trigger, to avoid the currency issues associated with a mutating table.  For example, using a trigger ":after update on xxx", the original update has completed and the table will not be mutating.
       
    * Re-work the trigger syntax - Dr. Hall has some great notes on mutating table errors, and offers other ways to avoid mutating tables with a combination of row-level and statement-level triggers.
       
    * Use autonomous transactions - You can avoid the mutating table error by marking your trigger as an autonomous transaction, making it independent from the table that calls the procedure.
...

http://www.dba-oracle.com/t_avoiding_mutat...table_error.htm

PM   Вверх
DimW
Дата 27.10.2009, 16:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(azesmcar @  27.10.2009,  16:02 Найти цитируемый пост)
Насчет AFTER тригеров у меня теоретические знания

быть может имелись ввиду стайтмент тригера, а не for each row...

PM MAIL ICQ   Вверх
setnull
Дата 27.10.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

Репутация: 1
Всего: 1



Цитата(DimW @ 26.10.2009,  08:17)
конечную цель пояснить можете?

К примеру, есть внешний ключ с каскадным удалением.

В триггерах (delete) дочерней таблицы нужно узнать (либо) обновить некоторою информацию по родительской записи.
При этом если инициирующим действием будет удаление родительской записи - то все...
Можно, конечно и отловить исключение, но вообще можно зарание узнать?

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

Это сообщение отредактировал(а) setnull - 27.10.2009, 16:15
PM MAIL   Вверх
azesmcar
Дата 27.10.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(DimW @  27.10.2009,  16:08 Найти цитируемый пост)
быть может имелись ввиду стайтмент тригера, а не for each row...

возможно, но в процитированной статье об этом ни слова. Надо проверить и книжку полистать.

Это сообщение отредактировал(а) azesmcar - 27.10.2009, 16:15
PM   Вверх
Zloxa
Дата 27.10.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(setnull @  27.10.2009,  16:14 Найти цитируемый пост)

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

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

Добавлено @ 16:24
Цитата(azesmcar @  27.10.2009,  16:15 Найти цитируемый пост)
возможно

azesmcar, я бы на месте DimW использовал бы не выражение "быть может", а "СТО ПУДОВ"


Это сообщение отредактировал(а) Zloxa - 27.10.2009, 16:25


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
azesmcar
Дата 27.10.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(Zloxa @  27.10.2009,  16:22 Найти цитируемый пост)
azesmcar, я бы на месте DimW использовал бы не выражение "быть может", а "СТО ПУДОВ"

намек понял smile 
PM   Вверх
DimW
Дата 27.10.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(setnull @  27.10.2009,  16:14 Найти цитируемый пост)
но вообще можно зарание узнать?

вы имеете ввиду на этапе разработки?
если так по это просто - мутация это появление не консистентных данных, это естетственный процесс который происходит при использовании DML в промежутке между началом выполнения оператора и его завершением, единственное место где на это можно нарваться это строковые тигеры, т.к. один оператор может изменять больше одной позиции в таблице, поэтому при реализации логики в тригерах нужно помнить какие таблицы могут быть задействованы в данной транзакции, любая попытка обратиться к ним приведет к ошибке - которая всего лишь предупреждает вас что данные уже не такие как были до выполнения действия.
если вы это понимаете то есть возможность забить на заботы сервера и воспользоваться  autonomous transactions.
это как вариан, но я так не делаю и вам не советую!
проше реализовать всю вашу логику в процедурах и пользоваться ими для удаления и обновления статистики.

Добавлено через 4 минуты и 41 секунду
Цитата(Zloxa @  27.10.2009,  16:22 Найти цитируемый пост)
использовал бы не выражение "быть может", а "СТО ПУДОВ"

да фиг знает может просто ###статья была  smile 
PM MAIL ICQ   Вверх
Zloxa
Дата 27.10.2009, 16:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(DimW @  27.10.2009,  16:42 Найти цитируемый пост)
единственное место где на это можно нарваться это строковые тигеры

 smile 
Код

SQL> create table test(val number);
 
Table created
SQL> create or replace function cnt_test return number
  2  is
  3  begin
  4    for i in (select count(*) cnt from test)
  5    loop
  6      return i.cnt;
  7    end loop;
  8  end;
  9  /
 
Function created
SQL> insert into test select cnt_test from dual;
 
insert into test select cnt_test from dual
 
ORA-04091: таблица COMMON.TEST изменяется, триггер/функция может не заметить это
ORA-06512: на  "COMMON.CNT_TEST", line 4



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 27.10.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



решеточки то всетаки поставились  smile

Добавлено через 1 минуту и 55 секунд
Цитата(Zloxa @  27.10.2009,  16:48 Найти цитируемый пост)
insert into test select cnt_test from dual;

ух хитрец!!!! красяво  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.