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

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


Вступление в Клуб: 02.11.2015
СообщениеВт Ноя 10, 2015 13:31   Триггеры Ответить с цитатой
Полезность: Нет оценки
Скажите, можно ли создать триггер в ИБСО, в словаре данных?

1.Триггер на странице Триггеры фирменного типа данных не могу создать - кнопка Создать недоступна. На локальном типе создал - работает нормально. При удалении записи триггер нужным образом ругает пользователя. У меня есть роли Администратор, Оператор

2.Прикладной триггер не работает даже на локальном типе. Создал операцию типа Триггер. На странице Свойства локального типа в группе Прикладные триггеры привязал с помощью птички Удаление свою операцию. Не запускается вообще. В тексте стоит pragma error('Текст') но никакой ругани при удалении не происходит. Удаляет объект из типа за милую душу. На фирменном типе опять же не доступны эти птички в группе Прикладные триггеры.

Что не так?
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеВт Ноя 10, 2015 15:23   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:
Скажите, можно ли создать триггер в ИБСО, в словаре данных?

1.Триггер на странице Триггеры фирменного типа данных не могу создать - кнопка Создать недоступна. На локальном типе создал - работает нормально. При удалении записи триггер нужным образом ругает пользователя. У меня есть роли Администратор, Оператор
...
Что не так?


Для редактирования дистрибутивных объектов нужна лицензия разработчика.
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Ноя 10, 2015 17:38   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:
Скажите, можно ли создать триггер в ИБСО, в словаре данных?

1.Триггер на странице Триггеры фирменного типа данных не могу создать - кнопка Создать недоступна. На локальном типе создал - работает нормально. При удалении записи триггер нужным образом ругает пользователя. У меня есть роли Администратор, Оператор

2.Прикладной триггер не работает даже на локальном типе. Создал операцию типа Триггер. На странице Свойства локального типа в группе Прикладные триггеры привязал с помощью птички Удаление свою операцию. Не запускается вообще. В тексте стоит pragma error('Текст') но никакой ругани при удалении не происходит. Удаляет объект из типа за милую душу. На фирменном типе опять же не доступны эти птички в группе Прикладные триггеры.

Что не так?


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

Хотя если у Вас получится подключить триггер для базовых ТБП от ЦФТ, прим. платежные документы, респект и уважуха, возьму на вооружение
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеСр Ноя 11, 2015 03:03   Re: Триггеры Ответить с цитатой
Полезность: Нет оценки
ulge пишет:
Скажите, можно ли создать триггер в ИБСО, в словаре данных?

2.Прикладной триггер не работает даже на локальном типе. Создал операцию типа Триггер. На странице Свойства локального типа в группе Прикладные триггеры привязал с помощью птички Удаление свою операцию. Не запускается вообще. В тексте стоит pragma error('Текст') но никакой ругани при удалении не происходит. Удаляет объект из типа за милую душу. На фирменном типе опять же не доступны эти птички в группе Прикладные триггеры.
Что не так?


на локальном типе
Попробуй на типе галочку у реквизита "контролируемый реквизит".
Также делали не через операцию Триггер. А на закладке Триггеры описывали нужный и вызывали функцию из библиотеки.
На дистрибутивном делали не из админа словаря, а из ТОАД или sqlnav
ulge
Участник со стажем


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

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



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


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

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



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


Интересная задачка, попробую спросить у коллег...
Теоретически на уровне Oracle как то наверное можно подвязать триггер...к базовым ТБП ЦФТ, они многотабличные, вязаться к корневой таблице

Цитата:

на локальном типе
Попробуй на типе галочку у реквизита "контролируемый реквизит".
Также делали не через операцию Триггер. А на закладке Триггеры описывали нужный и вызывали функцию из библиотеки.
На дистрибутивном делали не из админа словаря, а из ТОАД или sqlnav


Это действительно только для локальных ТБП?
ulge
Участник со стажем


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

Интересная задачка, попробую спросить у коллег...
Теоретически на уровне Oracle как то наверное можно подвязать триггер...к базовым ТБП ЦФТ, они многотабличные, вязаться к корневой таблице

...

Это действительно только для локальных ТБП?


На дистрибутивных никаких птичек на странице Триггеры у типа не доступно.

С триггером в Oracle тоже получился полный облом.
Удаление из таблицы USERS приводит к каскадному удалению из таблицы SUBJ_EQUAL, в результате триггер на удаление на таблице USERS не может прочитать из таблицы SUBJ_EQUAL информацию о привязках удаляемой группы к субъектам, так как эта таблица мутирует и триггер валится по ошибке ORA-04091
Матвеев Евгений
Профи


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

Интересная задачка, попробую спросить у коллег...
Теоретически на уровне Oracle как то наверное можно подвязать триггер...к базовым ТБП ЦФТ, они многотабличные, вязаться к корневой таблице

...

Это действительно только для локальных ТБП?


На дистрибутивных никаких птичек на странице Триггеры у типа не доступно.

С триггером в Oracle тоже получился полный облом.
Удаление из таблицы USERS приводит к каскадному удалению из таблицы SUBJ_EQUAL, в результате триггер на удаление на таблице USERS не может прочитать из таблицы SUBJ_EQUAL информацию о привязках удаляемой группы к субъектам, так как эта таблица мутирует и триггер валится по ошибке ORA-04091


Что значит мутирует?
И тогда на какое событие триггер вешаешь? Before delete?
ulge
Участник со стажем


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


С триггером в Oracle тоже получился полный облом.
Удаление из таблицы USERS приводит к каскадному удалению из таблицы SUBJ_EQUAL, в результате триггер на удаление на таблице USERS не может прочитать из таблицы SUBJ_EQUAL информацию о привязках удаляемой группы к субъектам, так как эта таблица мутирует и триггер валится по ошибке ORA-04091


Что значит мутирует?
И тогда на какое событие триггер вешаешь? Before delete?


Вешаю на Before delete
Мутирует - значит изменяется тем событием, на которое навешан триггер:

ORA-04091
table string.string is MUTATING, trigger/function may not see it
Cause
A trigger (or a user defined plsql function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.
Action
Rewrite the trigger (or function) so it does not read that table.
Матвеев Евгений
Профи


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


С триггером в Oracle тоже получился полный облом.
Удаление из таблицы USERS приводит к каскадному удалению из таблицы SUBJ_EQUAL, в результате триггер на удаление на таблице USERS не может прочитать из таблицы SUBJ_EQUAL информацию о привязках удаляемой группы к субъектам, так как эта таблица мутирует и триггер валится по ошибке ORA-04091


Что значит мутирует?
И тогда на какое событие триггер вешаешь? Before delete?


Вешаю на Before delete
Мутирует - значит изменяется тем событием, на которое навешан триггер:

ORA-04091
table string.string is MUTATING, trigger/function may not see it
Cause
A trigger (or a user defined plsql function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.
Action
Rewrite the trigger (or function) so it does not read that table.


Исходники триггера можешь привести?
ulge
Участник со стажем


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


Исходники триггера можешь привести?


Код:

CREATE OR REPLACE TRIGGER IBS.KDR_USERS_DEL
before delete on IBS.users
for each row
DISABLE
declare
  nRez number(7);
begin
  select count(*)
   into nRez
    from subj_equal ss
   where ss.equal_id = :old.username
     and ss.subj_id <> ss.equal_id
     and ss.owner_id <> ss.subj_id;
         
  if nRez > 0 then
    raise_application_error(-20000,'К группе привязано '||nRez||' субъектов доступа! Сначала удалите привязки.');
  end if;   
end;

Матвеев Евгений
Профи


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


Исходники триггера можешь привести?


Код:

CREATE OR REPLACE TRIGGER IBS.KDR_USERS_DEL
before delete on IBS.users
for each row
DISABLE
declare
  nRez number(7);
begin
  select count(*)
   into nRez
    from subj_equal ss
   where ss.equal_id = :old.username
     and ss.subj_id <> ss.equal_id
     and ss.owner_id <> ss.subj_id;
         
  if nRez > 0 then
    raise_application_error(-20000,'К группе привязано '||nRez||' субъектов доступа! Сначала удалите привязки.');
  end if;   
end;



Просмотрел на схеме триггеров 100 наверное на delete, нигде реализации с select внутри не нашел
Как то значит нужно по другому делать
ulge
Участник со стажем


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

Просмотрел на схеме триггеров 100 наверное на delete, нигде реализации с select внутри не нашел
Как то значит нужно по другому делать


Может перенести select в отдельную функцию пакета? Хотя вряд ли это спасет дело
Матвеев Евгений
Профи


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

Просмотрел на схеме триггеров 100 наверное на delete, нигде реализации с select внутри не нашел
Как то значит нужно по другому делать


Может перенести select в отдельную функцию пакета? Хотя вряд ли это спасет дело


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

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

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

В ту сторону и копать тогда
ulge
Участник со стажем


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

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

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

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

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


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

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