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