CftClub.ru
Клуб специалистов ЦФТ-Банк

Триггеры
На страницу Пред.  1, 2, 3  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеСр Ноя 11, 2015 14:52   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:
Матвеев Евгений пишет:

в девелопере пробегись по всем триггерам, поищи с селектом внутри. ...

Если таких нет, значит по другому

Там практически везде вызовы интерфейсов. ...

В ту сторону и копать тогда


В текстах фирменных триггеров попадаются selectы, например в

IBS.USR_Z#RECONT_DEL_CASH

select Ft.ID into Fintool from Z#FT_MONEY Ft where Ft.C_JOUR_RECONT = CollId;

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



Ошибка мутирования таблицы ORA-04091


Если в триггере уровня строки попытаться получить или изменить данные в целевой таблицы, то Oracle не позволит это сделать и выкинет ошибку ORA-04091 Таблица TABLE_TEST изменяется, триггер/функция может не заметить это.
Для обхода данной проблемы используются следующие приемы:
использовать триггеры уровня операции
автономная транзакция в триггере
использовать сторонние структуры (коллекции уровня пакета)
использовать COMPOUND TRIGGER
изменение самого алгоритма с выносом функционала из триггера


Вот тут посмотри... по делу написано
http://www.sql.ru/forum/141863/ora-04091-tablica-izmenyaetsya-trigger-funkciya-mozhet-ne-zametit-eto

...гугл сказал проблема не критичная, много информации, много путей решения
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеЧт Ноя 12, 2015 05:39   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:
Задача была в том, чтобы триггером не позволить удалять группу доступа, если она привязана хотя бы к одному субъекту.

А то в администраторе пользователей такой интересный интерфейс, что рука так и тянется удалить привязки групп доступа к субъекту прав, но вместо удаления привязок удаляются сами группы. Уже несколько раз удаляли важнейшие группы, хотя они были привязаны к сотням субъектов. Потом несколько часов восстанавливали.


Извините за глупый вопрос. Может, вам и не нужны триггеры?

Стандартный механизм Oracle, который действует, если таблицы соединены по нормальным констрейнтам, с действием при удалении nothing? Тогда при удалении объекта с PK, на который есть ссылки по FK, Oracle не даёт этого сделать. Почему этот механизм не работает?

Как называются таблички с группами доступа и привязками?
ulge
Участник со стажем


Вступление в Клуб: 02.11.2015
СообщениеЧт Ноя 12, 2015 10:16   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
Эмиралька пишет:
Извините за глупый вопрос. Может, вам и не нужны триггеры?

Стандартный механизм Oracle, который действует, если таблицы соединены по нормальным констрейнтам, с действием при удалении nothing? Тогда при удалении объекта с PK, на который есть ссылки по FK, Oracle не даёт этого сделать. Почему этот механизм не работает?

Как называются таблички с группами доступа и привязками?


Таблицы USERS и SUBJ_EQUAL.

Эти таблицы соединены по нормальным констрейнтам, с действием при удалении CASCADE а не NOTHING. Вот и не работает. А изменять свойства констрейнов у дистрибутивных объектов как-то не хочется. Не известно где это выплывет.
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеЧт Ноя 12, 2015 10:32   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:
Эмиралька пишет:
Извините за глупый вопрос. Может, вам и не нужны триггеры?

Стандартный механизм Oracle, который действует, если таблицы соединены по нормальным констрейнтам, с действием при удалении nothing? Тогда при удалении объекта с PK, на который есть ссылки по FK, Oracle не даёт этого сделать. Почему этот механизм не работает?

Как называются таблички с группами доступа и привязками?


Таблицы USERS и SUBJ_EQUAL.

Эти таблицы соединены по нормальным констрейнтам, с действием при удалении CASCADE а не NOTHING. Вот и не работает. А изменять свойства констрейнов у дистрибутивных объектов как-то не хочется. Не известно где это выплывет.


Речь я так понял о FK_SUBJ_EQUAL_SUBJ_ID
Под Sys, так же и под IBS получилось перевести в No action из Cascade

Получилось вчера ORA-04091 победить?
ulge
Участник со стажем


Вступление в Клуб: 02.11.2015
СообщениеЧт Ноя 12, 2015 10:47   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:

Для обхода данной проблемы используются следующие приемы:
использовать триггеры уровня операции
автономная транзакция в триггере
использовать сторонние структуры (коллекции уровня пакета)
использовать COMPOUND TRIGGER
изменение самого алгоритма с выносом функционала из триггера


Вот тут посмотри... по делу написано
http://www.sql.ru/forum/141863/ora-04091-tablica-izmenyaetsya-trigger-funkciya-mozhet-ne-zametit-eto

...гугл сказал проблема не критичная, много информации, много путей решения


Смешно. Воспользовался советом, вставил в триггер автономную транзакцию. Ошибка 04091 исчезла. Но запрос дает всегда количество привязок = 0 - и когда привязки есть и когда их нет. Похоже к моменту начала автономной транзакции привязки уже удалены оператором удаления. Мне то нужен запрос на момент начала исходной транзакции, а не автономной, когда привязки еще существовали.
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеЧт Ноя 12, 2015 10:51   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:
Матвеев Евгений пишет:

Для обхода данной проблемы используются следующие приемы:
использовать триггеры уровня операции
автономная транзакция в триггере
использовать сторонние структуры (коллекции уровня пакета)
использовать COMPOUND TRIGGER
изменение самого алгоритма с выносом функционала из триггера


Вот тут посмотри... по делу написано
http://www.sql.ru/forum/141863/ora-04091-tablica-izmenyaetsya-trigger-funkciya-mozhet-ne-zametit-eto

...гугл сказал проблема не критичная, много информации, много путей решения


Смешно. Воспользовался советом, вставил в триггер автономную транзакцию. Ошибка 04091 исчезла. Но запрос дает всегда количество привязок = 0 - и когда привязки есть и когда их нет. Похоже к моменту начала автономной транзакции привязки уже удалены оператором удаления. Мне то нужен запрос на момент начала исходной транзакции, а не автономной, когда привязки еще существовали.


Что за before delete тогда за такой? )))
Ерунда какая то

Может вынос функционала иза триггера поможет?
ulge
Участник со стажем


Вступление в Клуб: 02.11.2015
СообщениеЧт Ноя 12, 2015 10:54   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:
Речь я так понял о FK_SUBJ_EQUAL_SUBJ_ID
Под Sys, так же и под IBS получилось перевести в No action из Cascade

Получилось вчера ORA-04091 победить?


Нет Sad она непобедима. А свойства ограничений мне начальник запретил изменять на дистрибутивных таблицах
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеЧт Ноя 12, 2015 10:55   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:
Матвеев Евгений пишет:
Речь я так понял о FK_SUBJ_EQUAL_SUBJ_ID
Под Sys, так же и под IBS получилось перевести в No action из Cascade

Получилось вчера ORA-04091 победить?


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


Вот и я в прошлый раз не смог )...думал может у тебя получится. ..
ulge
Участник со стажем


Вступление в Клуб: 02.11.2015
СообщениеЧт Ноя 12, 2015 11:19   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:


Что за before delete тогда за такой? )))
Ерунда какая то

Может вынос функционала иза триггера поможет?


Вынес запрос из тела триггера в функцию пакета. Та же ошибка 04091 выдается.
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеЧт Ноя 12, 2015 11:28    Ответить с цитатой
Полезность: Нет оценки
Думаю стоит погуглить еще. ...должен же быть выход...не самый сложный вопрос решается. ..пока на работе завал, посмотрю триггер как с делами чуть разгребу
ulge
Участник со стажем


Вступление в Клуб: 02.11.2015
СообщениеПт Ноя 13, 2015 05:30   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:
ulge пишет:
Таблицы USERS и SUBJ_EQUAL.

Эти таблицы соединены по нормальным констрейнтам, с действием при удалении CASCADE а не NOTHING. Вот и не работает. А изменять свойства констрейнов у дистрибутивных объектов как-то не хочется. Не известно где это выплывет.


Речь я так понял о FK_SUBJ_EQUAL_SUBJ_ID
Под Sys, так же и под IBS получилось перевести в No action из Cascade


Оказывается и изменение действия при удалении не помогает. Если ограничение перевести из CASCADE в NO ACTION, то при удалении записи из USERS при помощи оператора delete from ограничение ругается. Но если удалять группу из администратора доступа, то группа все равно удаляется даже при наличии ограничения. Видимо администратор предварительно сам чистит привязки перед удалением группы.
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеПт Ноя 13, 2015 08:00   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:
Матвеев Евгений пишет:
ulge пишет:
Таблицы USERS и SUBJ_EQUAL.

Эти таблицы соединены по нормальным констрейнтам, с действием при удалении CASCADE а не NOTHING. Вот и не работает. А изменять свойства констрейнов у дистрибутивных объектов как-то не хочется. Не известно где это выплывет.


Речь я так понял о FK_SUBJ_EQUAL_SUBJ_ID
Под Sys, так же и под IBS получилось перевести в No action из Cascade


Оказывается и изменение действия при удалении не помогает. Если ограничение перевести из CASCADE в NO ACTION, то при удалении записи из USERS при помощи оператора delete from ограничение ругается. Но если удалять группу из администратора доступа, то группа все равно удаляется даже при наличии ограничения. Видимо администратор предварительно сам чистит привязки перед удалением группы.


Если рассмотреть вопрос со сторонней таблицей со ссылкой на группы доступа, тоже не получится?
Ещё вариант. Периодически сваливать данные в бэкап. Может быть, в задании по расписанию или в том же before-триггере. По крайней мере часы восстановления сократятся до минут.

Кстати, триггер вы используете строковый (for each row) или операторный ?
ulge
Участник со стажем


Вступление в Клуб: 02.11.2015
СообщениеПт Ноя 13, 2015 10:46   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
Эмиралька пишет:

Кстати, триггер вы используете строковый (for each row) или операторный ?


Выше я приводил текст триггера. for each row.
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеПт Ноя 13, 2015 11:02   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:

Оказывается и изменение действия при удалении не помогает. Если ограничение перевести из CASCADE в NO ACTION, то при удалении записи из USERS при помощи оператора delete from ограничение ругается. Но если удалять группу из администратора доступа, то группа все равно удаляется даже при наличии ограничения. Видимо администратор предварительно сам чистит привязки перед удалением группы.


Если так, то остаются только триггеры... и то не факт уже
Кстати можно проверить будут ли они вообще срабатывать при удалении в админе доступа, какой нибудь сделать, без select, чтобы либо выводил куда нибудь что нибудь, либо писал...
Можно будет убедиться что он отрабатывает
ulge
Участник со стажем


Вступление в Клуб: 02.11.2015
СообщениеПт Ноя 13, 2015 11:17   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:


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


Проверил. Без селекта срабатывает. Что ж это за триггер на удаление, который не срабатывал бы.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
На страницу Пред.  1, 2, 3  След.
Страница 2 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru