Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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, которые изменяются оператором, который запускает триггер |
|
 |
|